@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,1203 @@
|
|
|
1
|
+
import {
|
|
2
|
+
normalizeRef
|
|
3
|
+
} from "./chunk-UGX7GI37.js";
|
|
4
|
+
import {
|
|
5
|
+
getBucketArchivePathByKind,
|
|
6
|
+
getBucketPathByKind,
|
|
7
|
+
listEnabledBuckets
|
|
8
|
+
} from "./chunk-HOYBYAOA.js";
|
|
9
|
+
import {
|
|
10
|
+
ensureDirectoryExists,
|
|
11
|
+
listMarkdownFiles,
|
|
12
|
+
listMarkdownFilesRecursive,
|
|
13
|
+
readMarkdownFile
|
|
14
|
+
} from "./chunk-OIS7J26S.js";
|
|
15
|
+
import {
|
|
16
|
+
parseJsonWithContext
|
|
17
|
+
} from "./chunk-QVZMFDYG.js";
|
|
18
|
+
import {
|
|
19
|
+
emitCustomWarning,
|
|
20
|
+
emitWarning
|
|
21
|
+
} from "./chunk-EJGCZGUF.js";
|
|
22
|
+
|
|
23
|
+
// src/planning/index-query.ts
|
|
24
|
+
import * as fs2 from "fs";
|
|
25
|
+
import * as path2 from "path";
|
|
26
|
+
|
|
27
|
+
// src/planning/indexer.ts
|
|
28
|
+
import { execSync } from "child_process";
|
|
29
|
+
import { createHash } from "crypto";
|
|
30
|
+
import { readFileSync } from "fs";
|
|
31
|
+
import * as fs from "fs/promises";
|
|
32
|
+
import * as path from "path";
|
|
33
|
+
var GIT_TERMINAL_PROMPT_ENV = { ...process.env, GIT_TERMINAL_PROMPT: "0" };
|
|
34
|
+
var DEFAULT_GIT_TIMEOUT_MS = 5e3;
|
|
35
|
+
var warnedStaleIndexes = /* @__PURE__ */ new Set();
|
|
36
|
+
var SAFE_GIT_REMOTE_PATTERN = /^[A-Za-z0-9._-]+$/u;
|
|
37
|
+
var SAFE_GIT_REF_PATTERN = /^[A-Za-z0-9_.~^/@{}-]+$/u;
|
|
38
|
+
var CLEAN_PLANNING_TREE_SIGNATURE = "clean";
|
|
39
|
+
function coerceIndexNumber(value) {
|
|
40
|
+
if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
41
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
42
|
+
const parsed = Number(value);
|
|
43
|
+
if (Number.isFinite(parsed)) return parsed;
|
|
44
|
+
}
|
|
45
|
+
return void 0;
|
|
46
|
+
}
|
|
47
|
+
function staleIndexWarningKey(indexName, index) {
|
|
48
|
+
const metadata = index;
|
|
49
|
+
return `${indexName}:${index.lastGitSha ?? "unknown"}:${metadata.planningDirtySignature ?? "unknown"}`;
|
|
50
|
+
}
|
|
51
|
+
function isSafeGitRemote(remote) {
|
|
52
|
+
const trimmed = remote.trim();
|
|
53
|
+
return trimmed.length > 0 && !trimmed.startsWith("-") && SAFE_GIT_REMOTE_PATTERN.test(trimmed);
|
|
54
|
+
}
|
|
55
|
+
function isSafeGitRef(ref) {
|
|
56
|
+
const trimmed = ref.trim();
|
|
57
|
+
return trimmed.length > 0 && !trimmed.startsWith("-") && SAFE_GIT_REF_PATTERN.test(trimmed);
|
|
58
|
+
}
|
|
59
|
+
async function writeIndexJson(indexFile, data) {
|
|
60
|
+
const content = JSON.stringify(data, null, 2);
|
|
61
|
+
const tempFile = path.join(
|
|
62
|
+
path.dirname(indexFile),
|
|
63
|
+
`.${path.basename(indexFile)}.${process.pid}.${Date.now()}.tmp`
|
|
64
|
+
);
|
|
65
|
+
await fs.writeFile(tempFile, content, "utf8");
|
|
66
|
+
await fs.rename(tempFile, indexFile);
|
|
67
|
+
}
|
|
68
|
+
function shellQuote(value) {
|
|
69
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
70
|
+
}
|
|
71
|
+
function parseDirtyStatusPaths(normalizedStatus) {
|
|
72
|
+
const paths = /* @__PURE__ */ new Set();
|
|
73
|
+
for (const line of normalizedStatus.split("\n")) {
|
|
74
|
+
const pathSpec = line.slice(3).trim();
|
|
75
|
+
if (!pathSpec) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
for (const dirtyPath of pathSpec.split(" -> ")) {
|
|
79
|
+
const normalizedPath = dirtyPath.replace(/^"|"$/g, "");
|
|
80
|
+
if (normalizedPath.length > 0 && !path.isAbsolute(normalizedPath) && !normalizedPath.split("/").includes("..")) {
|
|
81
|
+
paths.add(normalizedPath);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return Array.from(paths).sort();
|
|
86
|
+
}
|
|
87
|
+
function hashDirtyPlanningFile(rootDir, dirtyPath) {
|
|
88
|
+
try {
|
|
89
|
+
const content = readFileSync(path.join(rootDir, dirtyPath));
|
|
90
|
+
return createHash("sha256").update(content).digest("hex");
|
|
91
|
+
} catch {
|
|
92
|
+
return "missing";
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function indexMetadata(gitSha, planningDirtySignature) {
|
|
96
|
+
return {
|
|
97
|
+
generated: (/* @__PURE__ */ new Date()).toISOString(),
|
|
98
|
+
lastGitSha: gitSha,
|
|
99
|
+
...planningDirtySignature !== null && planningDirtySignature !== void 0 ? { planningDirtySignature } : {}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
async function getGitHeadSha(rootDir) {
|
|
103
|
+
return getGitHeadShaSync(rootDir);
|
|
104
|
+
}
|
|
105
|
+
function getGitHeadShaSync(rootDir) {
|
|
106
|
+
try {
|
|
107
|
+
const sha = execSync("git rev-parse HEAD", {
|
|
108
|
+
cwd: rootDir,
|
|
109
|
+
encoding: "utf8",
|
|
110
|
+
timeout: DEFAULT_GIT_TIMEOUT_MS,
|
|
111
|
+
env: GIT_TERMINAL_PROMPT_ENV,
|
|
112
|
+
stdio: ["ignore", "pipe", "ignore"]
|
|
113
|
+
}).trim();
|
|
114
|
+
return sha || null;
|
|
115
|
+
} catch {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function getPlanningDirtySignature(rootDir) {
|
|
120
|
+
return getPlanningDirtySignatureSync(rootDir);
|
|
121
|
+
}
|
|
122
|
+
function getPlanningDirtySignatureSync(rootDir) {
|
|
123
|
+
let bucketPaths;
|
|
124
|
+
try {
|
|
125
|
+
bucketPaths = listEnabledBuckets(rootDir).flatMap((bucket) => [
|
|
126
|
+
getBucketPathByKind(bucket.name, rootDir),
|
|
127
|
+
getBucketArchivePathByKind(bucket.name, rootDir)
|
|
128
|
+
]);
|
|
129
|
+
} catch {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
const relativePaths = Array.from(
|
|
133
|
+
new Set(
|
|
134
|
+
bucketPaths.map((bucketPath) => path.relative(rootDir, bucketPath).replace(/\\/g, "/")).filter((bucketPath) => bucketPath.length > 0 && !bucketPath.startsWith("..")).sort()
|
|
135
|
+
)
|
|
136
|
+
);
|
|
137
|
+
if (relativePaths.length === 0) {
|
|
138
|
+
return CLEAN_PLANNING_TREE_SIGNATURE;
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
const status = execSync(
|
|
142
|
+
`git status --porcelain=v1 --untracked-files=all -- ${relativePaths.map(shellQuote).join(" ")}`,
|
|
143
|
+
{
|
|
144
|
+
cwd: rootDir,
|
|
145
|
+
encoding: "utf8",
|
|
146
|
+
timeout: DEFAULT_GIT_TIMEOUT_MS,
|
|
147
|
+
env: GIT_TERMINAL_PROMPT_ENV,
|
|
148
|
+
stdio: ["ignore", "pipe", "ignore"]
|
|
149
|
+
}
|
|
150
|
+
);
|
|
151
|
+
const normalizedStatus = status.split(/\r?\n/u).map((line) => line.trimEnd()).filter((line) => line.length > 0).sort().join("\n");
|
|
152
|
+
if (normalizedStatus.length === 0) {
|
|
153
|
+
return CLEAN_PLANNING_TREE_SIGNATURE;
|
|
154
|
+
}
|
|
155
|
+
const dirtyPaths = parseDirtyStatusPaths(normalizedStatus);
|
|
156
|
+
const dirtyFileHashes = dirtyPaths.map((dirtyPath) => {
|
|
157
|
+
const fileHash = hashDirtyPlanningFile(rootDir, dirtyPath);
|
|
158
|
+
return `${dirtyPath}:${fileHash}`;
|
|
159
|
+
});
|
|
160
|
+
return createHash("sha256").update([normalizedStatus, ...dirtyFileHashes].join("\n")).digest("hex");
|
|
161
|
+
} catch {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async function checkGitDrift(rootDir, options = {}) {
|
|
166
|
+
try {
|
|
167
|
+
const remote = options.remote ?? "origin";
|
|
168
|
+
const branch = options.branch ?? "main";
|
|
169
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_GIT_TIMEOUT_MS;
|
|
170
|
+
if (!isSafeGitRemote(remote) || !isSafeGitRef(branch)) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
if (options.fetch) {
|
|
174
|
+
try {
|
|
175
|
+
execSync(`git fetch --quiet --no-tags ${remote} ${branch}`, {
|
|
176
|
+
cwd: rootDir,
|
|
177
|
+
stdio: "ignore",
|
|
178
|
+
timeout: timeoutMs,
|
|
179
|
+
env: GIT_TERMINAL_PROMPT_ENV
|
|
180
|
+
});
|
|
181
|
+
} catch {
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const output = execSync(`git rev-list --left-right --count HEAD...${remote}/${branch}`, {
|
|
185
|
+
cwd: rootDir,
|
|
186
|
+
encoding: "utf8",
|
|
187
|
+
timeout: timeoutMs,
|
|
188
|
+
env: GIT_TERMINAL_PROMPT_ENV,
|
|
189
|
+
stdio: ["ignore", "pipe", "ignore"]
|
|
190
|
+
}).trim();
|
|
191
|
+
const [aheadStr, behindStr] = output.split(/\s+/);
|
|
192
|
+
const ahead = Number.parseInt(aheadStr || "0", 10);
|
|
193
|
+
const behind = Number.parseInt(behindStr || "0", 10);
|
|
194
|
+
return { ahead, behind };
|
|
195
|
+
} catch {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
async function generateIndexes(rootDir) {
|
|
200
|
+
const indexDir = path.join(rootDir, ".poetic", "planning", "indexes");
|
|
201
|
+
await ensureDirectoryExists(indexDir);
|
|
202
|
+
const gitSha = await getGitHeadSha(rootDir) ?? void 0;
|
|
203
|
+
const planningDirtySignature = await getPlanningDirtySignature(rootDir);
|
|
204
|
+
await generateRefAliasIndex(rootDir, indexDir, gitSha, planningDirtySignature);
|
|
205
|
+
await generateBacklogByStatusIndex(rootDir, indexDir, gitSha, planningDirtySignature);
|
|
206
|
+
await generateBacklogByPriorityIndex(rootDir, indexDir, gitSha, planningDirtySignature);
|
|
207
|
+
await generateDebtBySeverityIndex(rootDir, indexDir, gitSha, planningDirtySignature);
|
|
208
|
+
await generateTasksBySprintIndex(rootDir, indexDir, gitSha, planningDirtySignature);
|
|
209
|
+
await generateBlockersIndex(rootDir, indexDir, gitSha, planningDirtySignature);
|
|
210
|
+
await generateParkingOverdueIndex(rootDir, indexDir, gitSha, planningDirtySignature);
|
|
211
|
+
await generateFindingsByStatusIndex(rootDir, indexDir, gitSha, planningDirtySignature);
|
|
212
|
+
await generateFindingsByFingerprintIndex(rootDir, indexDir, gitSha, planningDirtySignature);
|
|
213
|
+
await generateIssuesByStatusIndex(rootDir, indexDir, gitSha, planningDirtySignature);
|
|
214
|
+
await generateIssuesBySeverityIndex(rootDir, indexDir, gitSha, planningDirtySignature);
|
|
215
|
+
}
|
|
216
|
+
async function generateRefAliasIndex(rootDir, indexDir, gitSha, planningDirtySignature) {
|
|
217
|
+
const refs = {};
|
|
218
|
+
const aliases = {};
|
|
219
|
+
const collisions = [];
|
|
220
|
+
for (const bucket of listEnabledBuckets(rootDir)) {
|
|
221
|
+
const dirs = [
|
|
222
|
+
getBucketPathByKind(bucket.name, rootDir),
|
|
223
|
+
getBucketArchivePathByKind(bucket.name, rootDir)
|
|
224
|
+
];
|
|
225
|
+
for (const dir of dirs) {
|
|
226
|
+
const isArchive = path.basename(dir.replace(/[/\\]+$/, "")) === "archive";
|
|
227
|
+
const files = isArchive ? await listMarkdownFilesRecursive(dir) : await listMarkdownFiles(dir);
|
|
228
|
+
for (const file of files) {
|
|
229
|
+
if (path.basename(file).toLowerCase() === "readme.md") {
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
234
|
+
const entry = {
|
|
235
|
+
id: frontMatter.id,
|
|
236
|
+
title: frontMatter.title,
|
|
237
|
+
status: frontMatter.status,
|
|
238
|
+
filePath: file,
|
|
239
|
+
priority: frontMatter.priority
|
|
240
|
+
};
|
|
241
|
+
if (entry.id) {
|
|
242
|
+
const normalizedId = normalizeRef(entry.id);
|
|
243
|
+
if (!refs[normalizedId]) {
|
|
244
|
+
refs[normalizedId] = entry;
|
|
245
|
+
}
|
|
246
|
+
if (!aliases[normalizedId]) {
|
|
247
|
+
aliases[normalizedId] = entry;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
const ref = frontMatter.ref;
|
|
251
|
+
if (ref) {
|
|
252
|
+
const normalized = normalizeRef(ref);
|
|
253
|
+
const existing = refs[normalized];
|
|
254
|
+
if (existing && existing.id !== entry.id) {
|
|
255
|
+
collisions.push({ key: ref, items: [existing.id, entry.id] });
|
|
256
|
+
} else {
|
|
257
|
+
refs[normalized] = entry;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const aliasArray = frontMatter.aliases;
|
|
261
|
+
if (Array.isArray(aliasArray)) {
|
|
262
|
+
for (const alias of aliasArray) {
|
|
263
|
+
if (!alias) continue;
|
|
264
|
+
const normalized = normalizeRef(alias);
|
|
265
|
+
const existing = aliases[normalized];
|
|
266
|
+
if (existing && existing.id !== entry.id) {
|
|
267
|
+
collisions.push({ key: alias, items: [existing.id, entry.id] });
|
|
268
|
+
} else {
|
|
269
|
+
aliases[normalized] = entry;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
} catch (error) {
|
|
274
|
+
emitWarning(
|
|
275
|
+
"CFG-002",
|
|
276
|
+
{
|
|
277
|
+
taskId: "indexer",
|
|
278
|
+
subsystem: "planning",
|
|
279
|
+
executionPhase: "execution"
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
severity: "INFO" /* INFO */,
|
|
283
|
+
metadata: {
|
|
284
|
+
error: error instanceof Error ? error.message : String(error),
|
|
285
|
+
file: path.relative(rootDir, file),
|
|
286
|
+
operation: "generate-ref-alias-index"
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (collisions.length > 0) {
|
|
295
|
+
for (const collision of collisions) {
|
|
296
|
+
emitWarning(
|
|
297
|
+
"CFG-002",
|
|
298
|
+
{
|
|
299
|
+
taskId: "indexer",
|
|
300
|
+
subsystem: "planning",
|
|
301
|
+
executionPhase: "execution"
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
severity: "WARN" /* WARN */,
|
|
305
|
+
metadata: {
|
|
306
|
+
message: `Ref/alias collision detected: "${collision.key}"`,
|
|
307
|
+
conflictingItems: collision.items,
|
|
308
|
+
operation: "generate-ref-alias-index"
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
const indexFile = path.join(indexDir, "ref-alias.json");
|
|
315
|
+
await writeIndexJson(indexFile, {
|
|
316
|
+
...indexMetadata(gitSha, planningDirtySignature),
|
|
317
|
+
refs,
|
|
318
|
+
aliases
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
async function generateBacklogByStatusIndex(rootDir, indexDir, gitSha, planningDirtySignature) {
|
|
322
|
+
const backlogDirs = [
|
|
323
|
+
getBucketPathByKind("backlog", rootDir),
|
|
324
|
+
getBucketArchivePathByKind("backlog", rootDir)
|
|
325
|
+
];
|
|
326
|
+
const index = {
|
|
327
|
+
inbox: [],
|
|
328
|
+
reviewed: [],
|
|
329
|
+
done: [],
|
|
330
|
+
archived: []
|
|
331
|
+
};
|
|
332
|
+
for (const dir of backlogDirs) {
|
|
333
|
+
const isArchive = path.basename(dir.replace(/[/\\]+$/, "")) === "archive";
|
|
334
|
+
const files = isArchive ? await listMarkdownFilesRecursive(dir) : await listMarkdownFiles(dir);
|
|
335
|
+
for (const file of files) {
|
|
336
|
+
if (path.basename(file).toLowerCase() === "readme.md") {
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
try {
|
|
340
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
341
|
+
const rawStatus = frontMatter.status || "unknown";
|
|
342
|
+
const status = rawStatus === "parked" ? "done" : rawStatus;
|
|
343
|
+
const entry = {
|
|
344
|
+
id: frontMatter.id,
|
|
345
|
+
title: frontMatter.title,
|
|
346
|
+
status,
|
|
347
|
+
priority: frontMatter.priority,
|
|
348
|
+
estimatedComplexity: frontMatter.estimatedComplexity,
|
|
349
|
+
domain: frontMatter.domain,
|
|
350
|
+
// Declared terminology is OPAQUE: indexed VERBATIM, never normalized.
|
|
351
|
+
declaredType: frontMatter.declaredType,
|
|
352
|
+
resolvedTaskTypeId: frontMatter.resolvedTaskTypeId,
|
|
353
|
+
filePath: path.relative(rootDir, file)
|
|
354
|
+
};
|
|
355
|
+
const statusKey = status;
|
|
356
|
+
const bucketEntries = index[statusKey];
|
|
357
|
+
if (bucketEntries) bucketEntries.push(entry);
|
|
358
|
+
} catch (error) {
|
|
359
|
+
emitWarning(
|
|
360
|
+
"WS-003",
|
|
361
|
+
{
|
|
362
|
+
taskId: "planning-indexer",
|
|
363
|
+
subsystem: "planning",
|
|
364
|
+
executionPhase: "execution"
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
severity: "ERROR" /* ERROR */,
|
|
368
|
+
metadata: {
|
|
369
|
+
error: error instanceof Error ? error.message : String(error),
|
|
370
|
+
file: path.relative(rootDir, file),
|
|
371
|
+
operation: "parse-backlog-by-status"
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
const indexFile = path.join(indexDir, "backlog-by-status.json");
|
|
379
|
+
await writeIndexJson(indexFile, {
|
|
380
|
+
...indexMetadata(gitSha, planningDirtySignature),
|
|
381
|
+
index
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
async function generateBacklogByPriorityIndex(rootDir, indexDir, gitSha, planningDirtySignature) {
|
|
385
|
+
const backlogDirs = [
|
|
386
|
+
getBucketPathByKind("backlog", rootDir),
|
|
387
|
+
getBucketArchivePathByKind("backlog", rootDir)
|
|
388
|
+
];
|
|
389
|
+
const files = (await Promise.all(
|
|
390
|
+
backlogDirs.map(async (dir) => {
|
|
391
|
+
const isArchive = path.basename(dir.replace(/[/\\]+$/, "")) === "archive";
|
|
392
|
+
return isArchive ? await listMarkdownFilesRecursive(dir) : await listMarkdownFiles(dir);
|
|
393
|
+
})
|
|
394
|
+
)).flat();
|
|
395
|
+
const index = {
|
|
396
|
+
P0: [],
|
|
397
|
+
P1: [],
|
|
398
|
+
P2: [],
|
|
399
|
+
P3: []
|
|
400
|
+
};
|
|
401
|
+
for (const file of files) {
|
|
402
|
+
if (path.basename(file).toLowerCase() === "readme.md") {
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
try {
|
|
406
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
407
|
+
const priority = frontMatter.priority || "P3";
|
|
408
|
+
const entry = {
|
|
409
|
+
id: frontMatter.id,
|
|
410
|
+
title: frontMatter.title,
|
|
411
|
+
status: frontMatter.status,
|
|
412
|
+
priority,
|
|
413
|
+
estimatedComplexity: coerceIndexNumber(frontMatter.estimatedComplexity),
|
|
414
|
+
estimatedHours: coerceIndexNumber(frontMatter.estimatedHours),
|
|
415
|
+
expectedRuntimeMinutes: coerceIndexNumber(frontMatter.expectedRuntimeMinutes),
|
|
416
|
+
filePath: path.relative(rootDir, file)
|
|
417
|
+
};
|
|
418
|
+
const priorityKey = priority;
|
|
419
|
+
const bucketEntries = index[priorityKey];
|
|
420
|
+
if (bucketEntries) bucketEntries.push(entry);
|
|
421
|
+
} catch (error) {
|
|
422
|
+
emitWarning(
|
|
423
|
+
"WS-003",
|
|
424
|
+
{
|
|
425
|
+
taskId: "planning-indexer",
|
|
426
|
+
subsystem: "planning",
|
|
427
|
+
executionPhase: "execution"
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
severity: "ERROR" /* ERROR */,
|
|
431
|
+
metadata: {
|
|
432
|
+
error: error instanceof Error ? error.message : String(error),
|
|
433
|
+
file: path.relative(rootDir, file),
|
|
434
|
+
operation: "parse-backlog-by-priority"
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
const indexFile = path.join(indexDir, "backlog-by-priority.json");
|
|
441
|
+
await writeIndexJson(indexFile, {
|
|
442
|
+
...indexMetadata(gitSha, planningDirtySignature),
|
|
443
|
+
index
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
async function generateDebtBySeverityIndex(rootDir, indexDir, gitSha, planningDirtySignature) {
|
|
447
|
+
const debtDir = getBucketPathByKind("tech-debt", rootDir);
|
|
448
|
+
const files = await listMarkdownFiles(debtDir);
|
|
449
|
+
const index = {
|
|
450
|
+
critical: [],
|
|
451
|
+
high: [],
|
|
452
|
+
medium: [],
|
|
453
|
+
low: []
|
|
454
|
+
};
|
|
455
|
+
for (const file of files) {
|
|
456
|
+
if (path.basename(file).toLowerCase() === "readme.md") {
|
|
457
|
+
continue;
|
|
458
|
+
}
|
|
459
|
+
try {
|
|
460
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
461
|
+
const severity = frontMatter.severity || "low";
|
|
462
|
+
const entry = {
|
|
463
|
+
id: frontMatter.id,
|
|
464
|
+
title: frontMatter.title,
|
|
465
|
+
status: frontMatter.status,
|
|
466
|
+
severity,
|
|
467
|
+
effort: frontMatter.effort,
|
|
468
|
+
blocking: frontMatter.blocking,
|
|
469
|
+
estimatedComplexity: coerceIndexNumber(frontMatter.estimatedComplexity),
|
|
470
|
+
estimatedHours: coerceIndexNumber(frontMatter.estimatedHours),
|
|
471
|
+
expectedRuntimeMinutes: coerceIndexNumber(frontMatter.expectedRuntimeMinutes),
|
|
472
|
+
filePath: path.relative(rootDir, file)
|
|
473
|
+
};
|
|
474
|
+
const severityKey = severity;
|
|
475
|
+
const bucketEntries = index[severityKey];
|
|
476
|
+
if (bucketEntries) bucketEntries.push(entry);
|
|
477
|
+
} catch (error) {
|
|
478
|
+
emitWarning(
|
|
479
|
+
"WS-003",
|
|
480
|
+
{
|
|
481
|
+
taskId: "planning-indexer",
|
|
482
|
+
subsystem: "planning",
|
|
483
|
+
executionPhase: "execution"
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
severity: "ERROR" /* ERROR */,
|
|
487
|
+
metadata: {
|
|
488
|
+
error: error instanceof Error ? error.message : String(error),
|
|
489
|
+
file: path.relative(rootDir, file),
|
|
490
|
+
operation: "parse-debt-by-severity"
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
const indexFile = path.join(indexDir, "debt-by-severity.json");
|
|
497
|
+
await writeIndexJson(indexFile, {
|
|
498
|
+
...indexMetadata(gitSha, planningDirtySignature),
|
|
499
|
+
index
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
async function generateTasksBySprintIndex(rootDir, indexDir, gitSha, planningDirtySignature) {
|
|
503
|
+
const tasksDir = getBucketPathByKind("task", rootDir);
|
|
504
|
+
const files = await listMarkdownFilesRecursive(tasksDir);
|
|
505
|
+
const index = {};
|
|
506
|
+
for (const file of files) {
|
|
507
|
+
if (path.basename(file).toLowerCase() === "readme.md") {
|
|
508
|
+
continue;
|
|
509
|
+
}
|
|
510
|
+
try {
|
|
511
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
512
|
+
const sprintId = frontMatter.sprintId || frontMatter.originalSprintId || "unassigned";
|
|
513
|
+
const entry = {
|
|
514
|
+
id: frontMatter.id,
|
|
515
|
+
title: frontMatter.title,
|
|
516
|
+
status: frontMatter.status,
|
|
517
|
+
priority: frontMatter.priority,
|
|
518
|
+
complexity: coerceIndexNumber(frontMatter.complexity),
|
|
519
|
+
estimatedHours: coerceIndexNumber(frontMatter.estimatedHours),
|
|
520
|
+
expectedRuntimeMinutes: coerceIndexNumber(frontMatter.expectedRuntimeMinutes),
|
|
521
|
+
dependencies: frontMatter.dependencies,
|
|
522
|
+
filePath: path.relative(rootDir, file)
|
|
523
|
+
};
|
|
524
|
+
let sprintEntries = index[sprintId];
|
|
525
|
+
if (!sprintEntries) {
|
|
526
|
+
sprintEntries = [];
|
|
527
|
+
index[sprintId] = sprintEntries;
|
|
528
|
+
}
|
|
529
|
+
sprintEntries.push(entry);
|
|
530
|
+
} catch (error) {
|
|
531
|
+
emitWarning(
|
|
532
|
+
"WS-003",
|
|
533
|
+
{
|
|
534
|
+
taskId: "planning-indexer",
|
|
535
|
+
subsystem: "planning",
|
|
536
|
+
executionPhase: "execution"
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
severity: "ERROR" /* ERROR */,
|
|
540
|
+
metadata: {
|
|
541
|
+
error: error instanceof Error ? error.message : String(error),
|
|
542
|
+
file: path.relative(rootDir, file),
|
|
543
|
+
operation: "parse-tasks-by-sprint"
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
const indexFile = path.join(indexDir, "tasks-by-sprint.json");
|
|
550
|
+
await writeIndexJson(indexFile, {
|
|
551
|
+
...indexMetadata(gitSha, planningDirtySignature),
|
|
552
|
+
index
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
async function generateBlockersIndex(rootDir, indexDir, gitSha, planningDirtySignature) {
|
|
556
|
+
const dirs = [getBucketPathByKind("task", rootDir), getBucketPathByKind("tech-debt", rootDir)];
|
|
557
|
+
const entries = [];
|
|
558
|
+
for (const dir of dirs) {
|
|
559
|
+
const files = await listMarkdownFiles(dir);
|
|
560
|
+
for (const file of files) {
|
|
561
|
+
if (path.basename(file).toLowerCase() === "readme.md") {
|
|
562
|
+
continue;
|
|
563
|
+
}
|
|
564
|
+
try {
|
|
565
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
566
|
+
const hasBlockers = frontMatter.blockers && Array.isArray(frontMatter.blockers) && frontMatter.blockers.length > 0 || frontMatter.status === "blocked";
|
|
567
|
+
if (hasBlockers) {
|
|
568
|
+
const entry = {
|
|
569
|
+
id: frontMatter.id,
|
|
570
|
+
title: frontMatter.title,
|
|
571
|
+
status: frontMatter.status,
|
|
572
|
+
blockers: frontMatter.blockers || [],
|
|
573
|
+
blockingReason: frontMatter.blockingReason,
|
|
574
|
+
filePath: path.relative(rootDir, file)
|
|
575
|
+
};
|
|
576
|
+
entries.push(entry);
|
|
577
|
+
}
|
|
578
|
+
} catch (error) {
|
|
579
|
+
emitWarning(
|
|
580
|
+
"WS-003",
|
|
581
|
+
{
|
|
582
|
+
taskId: "planning-indexer",
|
|
583
|
+
subsystem: "planning",
|
|
584
|
+
executionPhase: "execution"
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
severity: "ERROR" /* ERROR */,
|
|
588
|
+
metadata: {
|
|
589
|
+
error: error instanceof Error ? error.message : String(error),
|
|
590
|
+
file: path.relative(rootDir, file),
|
|
591
|
+
operation: "parse-blockers"
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
);
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
const indexFile = path.join(indexDir, "blockers.json");
|
|
599
|
+
await writeIndexJson(indexFile, {
|
|
600
|
+
...indexMetadata(gitSha, planningDirtySignature),
|
|
601
|
+
entries
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
async function generateParkingOverdueIndex(rootDir, indexDir, gitSha, planningDirtySignature) {
|
|
605
|
+
const parkingDir = getBucketPathByKind("parking-lot", rootDir);
|
|
606
|
+
const files = await listMarkdownFiles(parkingDir);
|
|
607
|
+
const entries = [];
|
|
608
|
+
const now = /* @__PURE__ */ new Date();
|
|
609
|
+
for (const file of files) {
|
|
610
|
+
if (path.basename(file).toLowerCase() === "readme.md") {
|
|
611
|
+
continue;
|
|
612
|
+
}
|
|
613
|
+
try {
|
|
614
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
615
|
+
if (frontMatter.reconsiderDate) {
|
|
616
|
+
const reconsiderDate = new Date(frontMatter.reconsiderDate);
|
|
617
|
+
if (reconsiderDate <= now) {
|
|
618
|
+
const entry = {
|
|
619
|
+
id: frontMatter.id,
|
|
620
|
+
title: frontMatter.title,
|
|
621
|
+
status: frontMatter.status,
|
|
622
|
+
reconsiderDate: frontMatter.reconsiderDate,
|
|
623
|
+
deferralReason: frontMatter.deferralReason,
|
|
624
|
+
daysOverdue: Math.floor(
|
|
625
|
+
(now.getTime() - reconsiderDate.getTime()) / (1e3 * 60 * 60 * 24)
|
|
626
|
+
),
|
|
627
|
+
filePath: path.relative(rootDir, file)
|
|
628
|
+
};
|
|
629
|
+
entries.push(entry);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
} catch (error) {
|
|
633
|
+
emitWarning(
|
|
634
|
+
"WS-003",
|
|
635
|
+
{
|
|
636
|
+
taskId: "planning-indexer",
|
|
637
|
+
subsystem: "planning",
|
|
638
|
+
executionPhase: "execution"
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
severity: "ERROR" /* ERROR */,
|
|
642
|
+
metadata: {
|
|
643
|
+
error: error instanceof Error ? error.message : String(error),
|
|
644
|
+
file: path.relative(rootDir, file),
|
|
645
|
+
operation: "parse-parking-overdue"
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
entries.sort((a, b) => (b.daysOverdue || 0) - (a.daysOverdue || 0));
|
|
652
|
+
const indexFile = path.join(indexDir, "parking-overdue.json");
|
|
653
|
+
await writeIndexJson(indexFile, {
|
|
654
|
+
...indexMetadata(gitSha, planningDirtySignature),
|
|
655
|
+
entries
|
|
656
|
+
});
|
|
657
|
+
}
|
|
658
|
+
async function readIndex(rootDir, indexName, allowRegeneration = true) {
|
|
659
|
+
const indexFile = path.join(rootDir, ".poetic", "planning", "indexes", `${indexName}.json`);
|
|
660
|
+
try {
|
|
661
|
+
const content = await fs.readFile(indexFile, "utf-8");
|
|
662
|
+
const index = parseJsonWithContext(content, `planning index: ${indexName}`);
|
|
663
|
+
const currentSha = await getGitHeadSha(rootDir);
|
|
664
|
+
const currentDirtySignature = await getPlanningDirtySignature(rootDir);
|
|
665
|
+
const needsRegeneration = await isIndexStale(rootDir, index, currentSha, currentDirtySignature);
|
|
666
|
+
if (needsRegeneration && allowRegeneration) {
|
|
667
|
+
await generateIndexes(rootDir);
|
|
668
|
+
const { clearIndexCache: clearIndexCache2 } = await import("./index-query-4JEUKA44.js");
|
|
669
|
+
clearIndexCache2();
|
|
670
|
+
warnedStaleIndexes.delete(staleIndexWarningKey(indexName, index));
|
|
671
|
+
return readIndex(rootDir, indexName, false);
|
|
672
|
+
}
|
|
673
|
+
if (needsRegeneration) {
|
|
674
|
+
await warnIfIndexStale(rootDir, indexName, index, currentSha, currentDirtySignature);
|
|
675
|
+
}
|
|
676
|
+
const prunedMissingEntries = await removeMissingEntriesFromIndex(index, rootDir);
|
|
677
|
+
if (prunedMissingEntries) {
|
|
678
|
+
await writeIndexJson(indexFile, index);
|
|
679
|
+
}
|
|
680
|
+
return index;
|
|
681
|
+
} catch {
|
|
682
|
+
return null;
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
async function findIndexDesyncEntries(rootDir) {
|
|
686
|
+
const indexDir = path.join(rootDir, ".poetic", "planning", "indexes");
|
|
687
|
+
const indexFiles = [
|
|
688
|
+
"ref-alias.json",
|
|
689
|
+
"backlog-by-status.json",
|
|
690
|
+
"backlog-by-priority.json",
|
|
691
|
+
"debt-by-severity.json",
|
|
692
|
+
"tasks-by-sprint.json",
|
|
693
|
+
"blockers.json",
|
|
694
|
+
"parking-overdue.json",
|
|
695
|
+
"findings-by-status.json",
|
|
696
|
+
"findings-by-fingerprint.json",
|
|
697
|
+
"issues-by-status.json",
|
|
698
|
+
"issues-by-severity.json"
|
|
699
|
+
];
|
|
700
|
+
const missing = [];
|
|
701
|
+
for (const indexFile of indexFiles) {
|
|
702
|
+
const indexPath = path.join(indexDir, indexFile);
|
|
703
|
+
try {
|
|
704
|
+
const content = await fs.readFile(indexPath, "utf-8");
|
|
705
|
+
const indexData = JSON.parse(content);
|
|
706
|
+
let entries = [];
|
|
707
|
+
if (indexFile === "ref-alias.json") {
|
|
708
|
+
const refs = indexData.refs;
|
|
709
|
+
const aliases = indexData.aliases;
|
|
710
|
+
entries = [...Object.values(refs ?? {}), ...Object.values(aliases ?? {})];
|
|
711
|
+
} else if ("index" in indexData && typeof indexData.index === "object" && indexData.index !== null) {
|
|
712
|
+
const grouped = indexData.index;
|
|
713
|
+
entries = Object.values(grouped).flat();
|
|
714
|
+
} else if ("entries" in indexData && Array.isArray(indexData.entries)) {
|
|
715
|
+
entries = indexData.entries;
|
|
716
|
+
}
|
|
717
|
+
for (const entry of entries) {
|
|
718
|
+
if (!entry.filePath) continue;
|
|
719
|
+
const fullPath = path.isAbsolute(entry.filePath) ? entry.filePath : path.join(rootDir, entry.filePath);
|
|
720
|
+
try {
|
|
721
|
+
await fs.access(fullPath);
|
|
722
|
+
} catch {
|
|
723
|
+
missing.push({
|
|
724
|
+
indexFile,
|
|
725
|
+
id: entry.id || "unknown",
|
|
726
|
+
title: entry.title || "Unknown",
|
|
727
|
+
filePath: entry.filePath
|
|
728
|
+
});
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
} catch {
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
return missing;
|
|
735
|
+
}
|
|
736
|
+
async function warnIfIndexStale(rootDir, indexName, index, currentSha, currentDirtySignature) {
|
|
737
|
+
if (!await isIndexStale(rootDir, index, currentSha, currentDirtySignature)) {
|
|
738
|
+
return;
|
|
739
|
+
}
|
|
740
|
+
const warnKey = staleIndexWarningKey(indexName, index);
|
|
741
|
+
if (warnedStaleIndexes.has(warnKey)) {
|
|
742
|
+
return;
|
|
743
|
+
}
|
|
744
|
+
warnedStaleIndexes.add(warnKey);
|
|
745
|
+
const resolvedCurrentSha = currentSha ?? await getGitHeadSha(rootDir);
|
|
746
|
+
const short = (sha) => sha ? `${sha.slice(0, 7)}\u2026` : "unknown";
|
|
747
|
+
if (currentDirtySignature === void 0) {
|
|
748
|
+
currentDirtySignature = await getPlanningDirtySignature(rootDir);
|
|
749
|
+
}
|
|
750
|
+
const dirtyMessage = currentDirtySignature && currentDirtySignature !== CLEAN_PLANNING_TREE_SIGNATURE ? "; planning bucket files have uncommitted changes" : "";
|
|
751
|
+
emitCustomWarning(
|
|
752
|
+
"WARN" /* WARN */,
|
|
753
|
+
"configuration" /* CONFIGURATION */,
|
|
754
|
+
`Planning index "${indexName}" is stale (generated ${index.generated} at ${short(index.lastGitSha)}; HEAD is ${short(resolvedCurrentSha)}${dirtyMessage}). Run 'poetic planning index' to regenerate.`,
|
|
755
|
+
{
|
|
756
|
+
subsystem: "planning",
|
|
757
|
+
executionPhase: "execution"
|
|
758
|
+
},
|
|
759
|
+
{
|
|
760
|
+
skipConsole: true,
|
|
761
|
+
metadata: {
|
|
762
|
+
taskId: "planning-indexer",
|
|
763
|
+
indexName,
|
|
764
|
+
generated: index.generated,
|
|
765
|
+
indexGitSha: index.lastGitSha ?? null,
|
|
766
|
+
currentGitSha: resolvedCurrentSha ?? null,
|
|
767
|
+
planningDirty: currentDirtySignature !== null && currentDirtySignature !== void 0 && currentDirtySignature !== CLEAN_PLANNING_TREE_SIGNATURE,
|
|
768
|
+
operation: "read-index-stale",
|
|
769
|
+
remediation: "poetic planning index"
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
);
|
|
773
|
+
}
|
|
774
|
+
async function isIndexStale(rootDir, index, currentSha, currentDirtySignature) {
|
|
775
|
+
const resolvedCurrentSha = currentSha ?? await getGitHeadSha(rootDir);
|
|
776
|
+
if (!resolvedCurrentSha) {
|
|
777
|
+
return false;
|
|
778
|
+
}
|
|
779
|
+
if (typeof index.lastGitSha !== "string" || index.lastGitSha.length === 0) {
|
|
780
|
+
return true;
|
|
781
|
+
}
|
|
782
|
+
if (resolvedCurrentSha !== index.lastGitSha) {
|
|
783
|
+
return true;
|
|
784
|
+
}
|
|
785
|
+
if (currentDirtySignature === void 0) {
|
|
786
|
+
currentDirtySignature = await getPlanningDirtySignature(rootDir);
|
|
787
|
+
}
|
|
788
|
+
if (currentDirtySignature === null) {
|
|
789
|
+
return false;
|
|
790
|
+
}
|
|
791
|
+
const metadata = index;
|
|
792
|
+
if (typeof metadata.planningDirtySignature !== "string") {
|
|
793
|
+
return currentDirtySignature !== CLEAN_PLANNING_TREE_SIGNATURE;
|
|
794
|
+
}
|
|
795
|
+
return currentDirtySignature !== metadata.planningDirtySignature;
|
|
796
|
+
}
|
|
797
|
+
async function removeMissingEntriesFromIndex(index, rootDir) {
|
|
798
|
+
let changed = false;
|
|
799
|
+
if ("entries" in index && Array.isArray(index.entries)) {
|
|
800
|
+
const filteredEntries = await filterEntriesByExistingPath(index.entries, rootDir);
|
|
801
|
+
changed = filteredEntries.length !== index.entries.length;
|
|
802
|
+
index.entries = filteredEntries;
|
|
803
|
+
return changed;
|
|
804
|
+
}
|
|
805
|
+
if ("index" in index && typeof index.index === "object" && index.index !== null) {
|
|
806
|
+
for (const group of Object.keys(index.index)) {
|
|
807
|
+
const entries = Array.isArray(index.index[group]) ? index.index[group] : [];
|
|
808
|
+
const filteredEntries = await filterEntriesByExistingPath(entries, rootDir);
|
|
809
|
+
if (filteredEntries.length !== entries.length) {
|
|
810
|
+
changed = true;
|
|
811
|
+
}
|
|
812
|
+
index.index[group] = filteredEntries;
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
return changed;
|
|
816
|
+
}
|
|
817
|
+
async function filterEntriesByExistingPath(entries, rootDir) {
|
|
818
|
+
const filtered = [];
|
|
819
|
+
for (const entry of entries) {
|
|
820
|
+
if (!entry.filePath) {
|
|
821
|
+
filtered.push(entry);
|
|
822
|
+
continue;
|
|
823
|
+
}
|
|
824
|
+
if (await doesFileExist(rootDir, entry.filePath)) {
|
|
825
|
+
filtered.push(entry);
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
return filtered;
|
|
829
|
+
}
|
|
830
|
+
async function doesFileExist(rootDir, entryFilePath) {
|
|
831
|
+
const resolvedPath = path.isAbsolute(entryFilePath) ? entryFilePath : path.resolve(rootDir, entryFilePath);
|
|
832
|
+
try {
|
|
833
|
+
await fs.stat(resolvedPath);
|
|
834
|
+
return true;
|
|
835
|
+
} catch {
|
|
836
|
+
return false;
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
async function generateFindingsByStatusIndex(rootDir, indexDir, gitSha, planningDirtySignature) {
|
|
840
|
+
let findingDir;
|
|
841
|
+
try {
|
|
842
|
+
findingDir = getBucketPathByKind("finding", rootDir);
|
|
843
|
+
} catch {
|
|
844
|
+
return;
|
|
845
|
+
}
|
|
846
|
+
const index = {
|
|
847
|
+
raw: [],
|
|
848
|
+
open: [],
|
|
849
|
+
closed: []
|
|
850
|
+
};
|
|
851
|
+
const files = await listMarkdownFiles(findingDir);
|
|
852
|
+
for (const file of files) {
|
|
853
|
+
try {
|
|
854
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
855
|
+
const status = frontMatter.status || "raw";
|
|
856
|
+
const entry = {
|
|
857
|
+
id: frontMatter.id,
|
|
858
|
+
title: frontMatter.title,
|
|
859
|
+
status,
|
|
860
|
+
severity: frontMatter.severity,
|
|
861
|
+
filePath: path.relative(rootDir, file)
|
|
862
|
+
};
|
|
863
|
+
const bucket = index[status];
|
|
864
|
+
if (bucket) bucket.push(entry);
|
|
865
|
+
} catch (error) {
|
|
866
|
+
emitWarning(
|
|
867
|
+
"IDX-007",
|
|
868
|
+
{ taskId: "indexer", subsystem: "planning", executionPhase: "setup" },
|
|
869
|
+
{
|
|
870
|
+
severity: "INFO" /* INFO */,
|
|
871
|
+
metadata: {
|
|
872
|
+
file,
|
|
873
|
+
error: error instanceof Error ? error.message : String(error)
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
);
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
const indexFile = path.join(indexDir, "findings-by-status.json");
|
|
880
|
+
await writeIndexJson(indexFile, {
|
|
881
|
+
...indexMetadata(gitSha, planningDirtySignature),
|
|
882
|
+
index
|
|
883
|
+
});
|
|
884
|
+
}
|
|
885
|
+
async function generateFindingsByFingerprintIndex(rootDir, indexDir, gitSha, planningDirtySignature) {
|
|
886
|
+
let findingDir;
|
|
887
|
+
try {
|
|
888
|
+
findingDir = getBucketPathByKind("finding", rootDir);
|
|
889
|
+
} catch {
|
|
890
|
+
return;
|
|
891
|
+
}
|
|
892
|
+
const index = {};
|
|
893
|
+
const files = await listMarkdownFiles(findingDir);
|
|
894
|
+
for (const file of files) {
|
|
895
|
+
try {
|
|
896
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
897
|
+
const fp = frontMatter.fingerprint;
|
|
898
|
+
const hash = fp?.compositeHash;
|
|
899
|
+
if (!hash) continue;
|
|
900
|
+
const entry = {
|
|
901
|
+
id: frontMatter.id,
|
|
902
|
+
title: frontMatter.title,
|
|
903
|
+
status: frontMatter.status || "raw",
|
|
904
|
+
filePath: path.relative(rootDir, file)
|
|
905
|
+
};
|
|
906
|
+
if (!index[hash]) index[hash] = [];
|
|
907
|
+
index[hash]?.push(entry);
|
|
908
|
+
} catch {
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
const indexFile = path.join(indexDir, "findings-by-fingerprint.json");
|
|
912
|
+
await writeIndexJson(indexFile, {
|
|
913
|
+
...indexMetadata(gitSha, planningDirtySignature),
|
|
914
|
+
index
|
|
915
|
+
});
|
|
916
|
+
}
|
|
917
|
+
async function generateIssuesByStatusIndex(rootDir, indexDir, gitSha, planningDirtySignature) {
|
|
918
|
+
let issueDir;
|
|
919
|
+
try {
|
|
920
|
+
issueDir = getBucketPathByKind("issue", rootDir);
|
|
921
|
+
} catch {
|
|
922
|
+
return;
|
|
923
|
+
}
|
|
924
|
+
const index = {
|
|
925
|
+
open: [],
|
|
926
|
+
claimed: [],
|
|
927
|
+
resolved: [],
|
|
928
|
+
wontfix: [],
|
|
929
|
+
duplicate: []
|
|
930
|
+
};
|
|
931
|
+
const files = await listMarkdownFiles(issueDir);
|
|
932
|
+
for (const file of files) {
|
|
933
|
+
try {
|
|
934
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
935
|
+
const status = frontMatter.status || "open";
|
|
936
|
+
const entry = {
|
|
937
|
+
id: frontMatter.id,
|
|
938
|
+
title: frontMatter.title,
|
|
939
|
+
status,
|
|
940
|
+
severity: frontMatter.severity,
|
|
941
|
+
filePath: path.relative(rootDir, file)
|
|
942
|
+
};
|
|
943
|
+
const bucket = index[status];
|
|
944
|
+
if (bucket) bucket.push(entry);
|
|
945
|
+
} catch (error) {
|
|
946
|
+
emitWarning(
|
|
947
|
+
"IDX-008",
|
|
948
|
+
{ taskId: "indexer", subsystem: "planning", executionPhase: "setup" },
|
|
949
|
+
{
|
|
950
|
+
severity: "INFO" /* INFO */,
|
|
951
|
+
metadata: {
|
|
952
|
+
file,
|
|
953
|
+
error: error instanceof Error ? error.message : String(error)
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
);
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
const indexFile = path.join(indexDir, "issues-by-status.json");
|
|
960
|
+
await writeIndexJson(indexFile, {
|
|
961
|
+
...indexMetadata(gitSha, planningDirtySignature),
|
|
962
|
+
index
|
|
963
|
+
});
|
|
964
|
+
}
|
|
965
|
+
async function generateIssuesBySeverityIndex(rootDir, indexDir, gitSha, planningDirtySignature) {
|
|
966
|
+
let issueDir;
|
|
967
|
+
try {
|
|
968
|
+
issueDir = getBucketPathByKind("issue", rootDir);
|
|
969
|
+
} catch {
|
|
970
|
+
return;
|
|
971
|
+
}
|
|
972
|
+
const index = {
|
|
973
|
+
critical: [],
|
|
974
|
+
high: [],
|
|
975
|
+
medium: [],
|
|
976
|
+
low: []
|
|
977
|
+
};
|
|
978
|
+
const files = await listMarkdownFiles(issueDir);
|
|
979
|
+
for (const file of files) {
|
|
980
|
+
try {
|
|
981
|
+
const { frontMatter } = await readMarkdownFile(file);
|
|
982
|
+
const severity = frontMatter.severity || "medium";
|
|
983
|
+
const entry = {
|
|
984
|
+
id: frontMatter.id,
|
|
985
|
+
title: frontMatter.title,
|
|
986
|
+
status: frontMatter.status || "open",
|
|
987
|
+
severity,
|
|
988
|
+
filePath: path.relative(rootDir, file)
|
|
989
|
+
};
|
|
990
|
+
const bucket = index[severity];
|
|
991
|
+
if (bucket) bucket.push(entry);
|
|
992
|
+
} catch {
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
const indexFile = path.join(indexDir, "issues-by-severity.json");
|
|
996
|
+
await writeIndexJson(indexFile, {
|
|
997
|
+
...indexMetadata(gitSha, planningDirtySignature),
|
|
998
|
+
index
|
|
999
|
+
});
|
|
1000
|
+
}
|
|
1001
|
+
|
|
1002
|
+
// src/planning/index-query.ts
|
|
1003
|
+
var indexCache = /* @__PURE__ */ new Map();
|
|
1004
|
+
var CACHE_TTL = 5 * 60 * 1e3;
|
|
1005
|
+
var FRESHNESS_SNAPSHOT_TTL = 250;
|
|
1006
|
+
var freshnessSnapshotCache = /* @__PURE__ */ new Map();
|
|
1007
|
+
function getRepoFreshnessSnapshot(repoRoot) {
|
|
1008
|
+
const now = Date.now();
|
|
1009
|
+
const cached = freshnessSnapshotCache.get(repoRoot);
|
|
1010
|
+
if (cached && now - cached.loadedAt < FRESHNESS_SNAPSHOT_TTL) {
|
|
1011
|
+
return cached.snapshot;
|
|
1012
|
+
}
|
|
1013
|
+
const gitSha = getGitHeadShaSync(repoRoot);
|
|
1014
|
+
const snapshot = {
|
|
1015
|
+
gitSha,
|
|
1016
|
+
planningDirtySignature: gitSha ? getPlanningDirtySignatureSync(repoRoot) : null
|
|
1017
|
+
};
|
|
1018
|
+
freshnessSnapshotCache.set(repoRoot, { snapshot, loadedAt: now });
|
|
1019
|
+
return snapshot;
|
|
1020
|
+
}
|
|
1021
|
+
function indexExists(indexName, repoRoot = process.cwd()) {
|
|
1022
|
+
const indexPath = path2.join(repoRoot, ".poetic", "planning", "indexes", `${indexName}.json`);
|
|
1023
|
+
return fs2.existsSync(indexPath);
|
|
1024
|
+
}
|
|
1025
|
+
function isIndexFresh(indexName, repoRoot = process.cwd()) {
|
|
1026
|
+
return isIndexFreshFromMetadata(indexName, repoRoot);
|
|
1027
|
+
}
|
|
1028
|
+
function isIndexFreshFromMetadata(indexName, repoRoot, cachedData, freshness = getRepoFreshnessSnapshot(repoRoot)) {
|
|
1029
|
+
if (!indexExists(indexName, repoRoot)) return false;
|
|
1030
|
+
try {
|
|
1031
|
+
const indexPath = path2.join(repoRoot, ".poetic", "planning", "indexes", `${indexName}.json`);
|
|
1032
|
+
const index = cachedData ?? JSON.parse(fs2.readFileSync(indexPath, "utf8"));
|
|
1033
|
+
const currentGitSha = freshness.gitSha;
|
|
1034
|
+
if (currentGitSha) {
|
|
1035
|
+
if (index.lastGitSha !== currentGitSha) return false;
|
|
1036
|
+
const currentDirtySignature = freshness.planningDirtySignature;
|
|
1037
|
+
if (currentDirtySignature !== null) {
|
|
1038
|
+
if (typeof index.planningDirtySignature !== "string") {
|
|
1039
|
+
return currentDirtySignature === CLEAN_PLANNING_TREE_SIGNATURE;
|
|
1040
|
+
}
|
|
1041
|
+
return index.planningDirtySignature === currentDirtySignature;
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
const indexStat = fs2.statSync(indexPath);
|
|
1045
|
+
const indexMtime = indexStat.mtime.getTime();
|
|
1046
|
+
for (const bucket of listEnabledBuckets(repoRoot)) {
|
|
1047
|
+
const bucketPaths = [
|
|
1048
|
+
getBucketPathByKind(bucket.name, repoRoot),
|
|
1049
|
+
getBucketArchivePathByKind(bucket.name, repoRoot)
|
|
1050
|
+
];
|
|
1051
|
+
for (const bucketPath of bucketPaths) {
|
|
1052
|
+
if (!fs2.existsSync(bucketPath)) continue;
|
|
1053
|
+
if (fs2.statSync(bucketPath).mtime.getTime() > indexMtime) {
|
|
1054
|
+
return false;
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
return true;
|
|
1059
|
+
} catch {
|
|
1060
|
+
return false;
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
function loadIndex(indexName, repoRoot = process.cwd()) {
|
|
1064
|
+
return loadIndexWithFreshness(indexName, repoRoot);
|
|
1065
|
+
}
|
|
1066
|
+
function loadIndexWithFreshness(indexName, repoRoot, freshness) {
|
|
1067
|
+
const cacheKey = `${repoRoot}:${indexName}`;
|
|
1068
|
+
const cached = indexCache.get(cacheKey);
|
|
1069
|
+
const indexPath = path2.join(repoRoot, ".poetic", "planning", "indexes", `${indexName}.json`);
|
|
1070
|
+
let stat2 = null;
|
|
1071
|
+
try {
|
|
1072
|
+
stat2 = fs2.statSync(indexPath);
|
|
1073
|
+
} catch {
|
|
1074
|
+
stat2 = null;
|
|
1075
|
+
}
|
|
1076
|
+
const cacheFileUnchanged = Boolean(
|
|
1077
|
+
cached && stat2 && stat2.mtimeMs === cached.mtimeMs && stat2.ctimeMs === cached.ctimeMs && stat2.size === cached.size
|
|
1078
|
+
);
|
|
1079
|
+
const indexFresh = isIndexFreshFromMetadata(
|
|
1080
|
+
indexName,
|
|
1081
|
+
repoRoot,
|
|
1082
|
+
cacheFileUnchanged ? cached?.data : void 0,
|
|
1083
|
+
freshness
|
|
1084
|
+
);
|
|
1085
|
+
if (!indexFresh) {
|
|
1086
|
+
indexCache.delete(cacheKey);
|
|
1087
|
+
return null;
|
|
1088
|
+
}
|
|
1089
|
+
if (cached && Date.now() - cached.loadedAt < CACHE_TTL && cacheFileUnchanged) {
|
|
1090
|
+
return cached.data;
|
|
1091
|
+
}
|
|
1092
|
+
indexCache.delete(cacheKey);
|
|
1093
|
+
if (!stat2) {
|
|
1094
|
+
return null;
|
|
1095
|
+
}
|
|
1096
|
+
try {
|
|
1097
|
+
const raw = fs2.readFileSync(indexPath, "utf-8");
|
|
1098
|
+
const data = JSON.parse(raw);
|
|
1099
|
+
const postStat = fs2.statSync(indexPath);
|
|
1100
|
+
indexCache.set(cacheKey, {
|
|
1101
|
+
data,
|
|
1102
|
+
loadedAt: Date.now(),
|
|
1103
|
+
mtimeMs: postStat.mtimeMs,
|
|
1104
|
+
ctimeMs: postStat.ctimeMs,
|
|
1105
|
+
size: postStat.size
|
|
1106
|
+
});
|
|
1107
|
+
return data;
|
|
1108
|
+
} catch {
|
|
1109
|
+
return null;
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
function queryById(id, repoRoot = process.cwd(), includeArchive = false) {
|
|
1113
|
+
const freshness = getRepoFreshnessSnapshot(repoRoot);
|
|
1114
|
+
const refAliasIndex = loadIndexWithFreshness("ref-alias", repoRoot, freshness);
|
|
1115
|
+
if (refAliasIndex) {
|
|
1116
|
+
const normalized = normalizeRef(id);
|
|
1117
|
+
const fromRef = refAliasIndex.refs[normalized];
|
|
1118
|
+
const fromAlias = refAliasIndex.aliases[normalized];
|
|
1119
|
+
const entry = fromRef || fromAlias;
|
|
1120
|
+
if (entry) {
|
|
1121
|
+
if (!includeArchive && entry.filePath.includes("/archive/")) {
|
|
1122
|
+
return null;
|
|
1123
|
+
}
|
|
1124
|
+
return entry;
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
const indexes = [
|
|
1128
|
+
"backlog-by-status",
|
|
1129
|
+
"backlog-by-priority",
|
|
1130
|
+
"debt-by-severity",
|
|
1131
|
+
"tasks-by-sprint",
|
|
1132
|
+
"blockers",
|
|
1133
|
+
"parking-overdue"
|
|
1134
|
+
];
|
|
1135
|
+
for (const indexName of indexes) {
|
|
1136
|
+
const index = loadIndexWithFreshness(
|
|
1137
|
+
indexName,
|
|
1138
|
+
repoRoot,
|
|
1139
|
+
freshness
|
|
1140
|
+
);
|
|
1141
|
+
if (!index || !index.index) continue;
|
|
1142
|
+
for (const entries of Object.values(index.index)) {
|
|
1143
|
+
for (const entry of entries) {
|
|
1144
|
+
if (entry.id === id) {
|
|
1145
|
+
if (!includeArchive && entry.filePath.includes("/archive/")) {
|
|
1146
|
+
continue;
|
|
1147
|
+
}
|
|
1148
|
+
return entry;
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
return null;
|
|
1154
|
+
}
|
|
1155
|
+
function queryByRef(ref, repoRoot = process.cwd(), includeArchive = false) {
|
|
1156
|
+
const refAliasIndex = loadIndex("ref-alias", repoRoot);
|
|
1157
|
+
if (!refAliasIndex) return null;
|
|
1158
|
+
const normalized = normalizeRef(ref);
|
|
1159
|
+
const entry = refAliasIndex.refs[normalized];
|
|
1160
|
+
if (!entry) return null;
|
|
1161
|
+
if (!includeArchive && entry.filePath.includes("/archive/")) {
|
|
1162
|
+
return null;
|
|
1163
|
+
}
|
|
1164
|
+
return entry;
|
|
1165
|
+
}
|
|
1166
|
+
function queryByAlias(alias, repoRoot = process.cwd(), includeArchive = false) {
|
|
1167
|
+
const refAliasIndex = loadIndex("ref-alias", repoRoot);
|
|
1168
|
+
if (!refAliasIndex) return null;
|
|
1169
|
+
const normalized = normalizeRef(alias);
|
|
1170
|
+
const entry = refAliasIndex.aliases[normalized];
|
|
1171
|
+
if (!entry) return null;
|
|
1172
|
+
if (!includeArchive && entry.filePath.includes("/archive/")) {
|
|
1173
|
+
return null;
|
|
1174
|
+
}
|
|
1175
|
+
return entry;
|
|
1176
|
+
}
|
|
1177
|
+
function getIndexStaleError(indexName) {
|
|
1178
|
+
const indexInfo = indexName ? ` (${indexName})` : "";
|
|
1179
|
+
return `Index is stale or missing${indexInfo}.
|
|
1180
|
+
|
|
1181
|
+
Run the following command to regenerate indexes:
|
|
1182
|
+
poetic planning index --regenerate`;
|
|
1183
|
+
}
|
|
1184
|
+
function clearIndexCache() {
|
|
1185
|
+
indexCache.clear();
|
|
1186
|
+
freshnessSnapshotCache.clear();
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
export {
|
|
1190
|
+
checkGitDrift,
|
|
1191
|
+
generateIndexes,
|
|
1192
|
+
readIndex,
|
|
1193
|
+
findIndexDesyncEntries,
|
|
1194
|
+
indexExists,
|
|
1195
|
+
isIndexFresh,
|
|
1196
|
+
loadIndex,
|
|
1197
|
+
queryById,
|
|
1198
|
+
queryByRef,
|
|
1199
|
+
queryByAlias,
|
|
1200
|
+
getIndexStaleError,
|
|
1201
|
+
clearIndexCache
|
|
1202
|
+
};
|
|
1203
|
+
//# sourceMappingURL=chunk-DSFM56OA.js.map
|