@poetic-ai/poetic 1.42.1-bootstrap.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-MXTSOSST.js +1597 -0
- package/dist/PromptStore-U6ZD3ZMQ.js +18 -0
- package/dist/actions-M3AESHFF.js +322 -0
- package/dist/agent-ingest-HO77TH26.js +53 -0
- package/dist/aggregator-DNCBINFO.js +12 -0
- package/dist/ai-judge-LDWHURKK.js +156 -0
- package/dist/allowlist-grounding-RO6HKUFI.js +16 -0
- package/dist/allowlist-utils-23V7TJ3G.js +28 -0
- package/dist/anchored-turn-service-GFYU6GCQ.js +489 -0
- package/dist/api-transport-FS3CQRMN.js +1087 -0
- package/dist/apply-completion-mode-JBT2CTQO.js +89 -0
- package/dist/artifact-migrator-23L45ISD.js +267 -0
- package/dist/ask-UYVZY7JH.js +135 -0
- package/dist/auth-CSQP5RHJ.js +67 -0
- package/dist/auth-E6XUNZ5M.js +68 -0
- package/dist/auth-KQLJPZ2E.js +134 -0
- package/dist/auth-OC4E6633.js +71 -0
- package/dist/auth-R3NQ2ZF5.js +78 -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-HA3T23SF.js +80 -0
- package/dist/autoloop-cleanup-JOGKTLWA.js +109 -0
- package/dist/autoloop-evidence-gates-ACB5YW5G.js +36 -0
- package/dist/autoloop-gate-policy-XZA5EQFN.js +175 -0
- package/dist/autoloop-helpers-EFJLBQUP.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-OPR74YEX.js +85 -0
- package/dist/autoloop-termination-summary-RN75F422.js +58 -0
- package/dist/autoloop-trajectory-K5I45UBR.js +282 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/autonomous-loop-controller-4QJMOIIN.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-WXZHUT42.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-YFASRB5Z.js +71 -0
- package/dist/change-summary-WY7J5TOX.js +33 -0
- package/dist/chunk-25QL3M3L.js +899 -0
- package/dist/chunk-2ABC6SEC.js +2626 -0
- package/dist/chunk-2AICM4P3.js +1763 -0
- package/dist/chunk-2AQUWJPW.js +225 -0
- package/dist/chunk-2DY5KNVM.js +276 -0
- package/dist/chunk-2QJ3H3L7.js +42 -0
- package/dist/chunk-2UH6VQRZ.js +328 -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-2YXZCZTX.js +1160 -0
- package/dist/chunk-32VLDFRT.js +797 -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-3733QTI7.js +6818 -0
- package/dist/chunk-3A5PDH5L.js +12513 -0
- package/dist/chunk-3AOKYKA7.js +22 -0
- package/dist/chunk-3BCUNHKF.js +475 -0
- package/dist/chunk-3C26DPFK.js +566 -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-3JWNRJSB.js +736 -0
- package/dist/chunk-3LUMR3D3.js +156 -0
- package/dist/chunk-3M57DADF.js +44 -0
- package/dist/chunk-3S62LLWJ.js +543 -0
- package/dist/chunk-3VABAKT2.js +1784 -0
- package/dist/chunk-44N5WZZH.js +45 -0
- package/dist/chunk-45FPSA3B.js +125 -0
- package/dist/chunk-4BIPZBT7.js +791 -0
- package/dist/chunk-4BJ3O4RQ.js +929 -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-4HN6DF7V.js +1027 -0
- package/dist/chunk-4HXKHDNH.js +1064 -0
- package/dist/chunk-4KKI477Q.js +44 -0
- package/dist/chunk-4NA7FSTV.js +595 -0
- package/dist/chunk-4NXPXE62.js +84 -0
- package/dist/chunk-4SALLK63.js +9831 -0
- package/dist/chunk-4SHKPCGK.js +110 -0
- package/dist/chunk-4VJITV4P.js +445 -0
- package/dist/chunk-4W2NRXQL.js +1205 -0
- package/dist/chunk-4XICK3HN.js +784 -0
- package/dist/chunk-55EJVV3C.js +385 -0
- package/dist/chunk-5DLKYTQX.js +4003 -0
- package/dist/chunk-5EERLVZB.js +139 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5LAMRH4X.js +969 -0
- package/dist/chunk-5REDMNLZ.js +310 -0
- package/dist/chunk-5UCJARII.js +1984 -0
- package/dist/chunk-5WCQRDRB.js +588 -0
- package/dist/chunk-5WRLK5KW.js +700 -0
- package/dist/chunk-66AGFTBQ.js +131 -0
- package/dist/chunk-66CIO2SV.js +48 -0
- package/dist/chunk-6BM72ZMG.js +31 -0
- package/dist/chunk-6BTFXYRO.js +276 -0
- package/dist/chunk-6EDAJH2I.js +68 -0
- package/dist/chunk-6EQKFDBH.js +457 -0
- package/dist/chunk-6KMJKHIQ.js +2193 -0
- package/dist/chunk-6MFRHTRI.js +115 -0
- package/dist/chunk-6QMUKUHH.js +632 -0
- package/dist/chunk-6TZJRKNW.js +321 -0
- package/dist/chunk-6V7HGQFZ.js +20 -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-73NCTWKL.js +188 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7D7QT3BE.js +688 -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-7IL4A2PP.js +948 -0
- package/dist/chunk-7NPSXSHO.js +975 -0
- package/dist/chunk-7PS6INZP.js +302 -0
- package/dist/chunk-7QCZSLBH.js +1 -0
- package/dist/chunk-7R2WLDOS.js +62 -0
- package/dist/chunk-7XV3QXLT.js +878 -0
- package/dist/chunk-A2WKSVX7.js +43 -0
- package/dist/chunk-A3YGID55.js +133 -0
- package/dist/chunk-A5MRWHMI.js +1604 -0
- package/dist/chunk-A722DEVA.js +14 -0
- package/dist/chunk-AG2Z2SUZ.js +554 -0
- package/dist/chunk-AHWAZ2MU.js +137 -0
- package/dist/chunk-AIAQ3HS3.js +119 -0
- package/dist/chunk-ALAB3PBR.js +2206 -0
- package/dist/chunk-APPNGGN7.js +365 -0
- package/dist/chunk-APV6MK5E.js +137 -0
- package/dist/chunk-AQNPGRWS.js +395 -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-AX6GWE7V.js +47 -0
- package/dist/chunk-AZQILSNQ.js +1376 -0
- package/dist/chunk-B76KHLX6.js +13 -0
- package/dist/chunk-BAV2HJXS.js +194 -0
- package/dist/chunk-BBHRN366.js +89 -0
- package/dist/chunk-BCZAENOH.js +448 -0
- package/dist/chunk-BIGSACCY.js +19527 -0
- package/dist/chunk-BPYMCIVD.js +9243 -0
- package/dist/chunk-BSE4R6XD.js +322 -0
- package/dist/chunk-BVPWRDCO.js +2321 -0
- package/dist/chunk-BXI4NXL3.js +507 -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-CHQV73H5.js +408 -0
- package/dist/chunk-CJC6GZ46.js +457 -0
- package/dist/chunk-CJHRFSNY.js +924 -0
- package/dist/chunk-CKP2Q3TP.js +1905 -0
- package/dist/chunk-CLKSETWE.js +10 -0
- package/dist/chunk-CQM3A35X.js +844 -0
- package/dist/chunk-CSLAS5GW.js +4007 -0
- package/dist/chunk-CTLUBNCW.js +622 -0
- package/dist/chunk-CVMVZWG4.js +3544 -0
- package/dist/chunk-CYB6QDCT.js +263 -0
- package/dist/chunk-D5EP5D2W.js +26 -0
- package/dist/chunk-DC4ZYMXJ.js +115 -0
- package/dist/chunk-DCAVAABI.js +348 -0
- package/dist/chunk-DCYF7EKG.js +26 -0
- package/dist/chunk-DF5SLDE4.js +966 -0
- package/dist/chunk-DN7UMLF7.js +5678 -0
- package/dist/chunk-DSFM56OA.js +1203 -0
- package/dist/chunk-DTY4APYV.js +218 -0
- package/dist/chunk-E3NTPHEO.js +194 -0
- package/dist/chunk-E74LUIID.js +302 -0
- package/dist/chunk-EJ42BNGY.js +2904 -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-EQGIDAUF.js +62 -0
- package/dist/chunk-EX3OM35G.js +20414 -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-FCNAS3W2.js +1033 -0
- package/dist/chunk-FD4ERYEG.js +22 -0
- package/dist/chunk-FDVZLG6Z.js +3104 -0
- package/dist/chunk-FEPIFY7D.js +511 -0
- package/dist/chunk-FEQ4HXL7.js +412 -0
- package/dist/chunk-FFH5HHJU.js +5351 -0
- package/dist/chunk-FH7WOJAE.js +79 -0
- package/dist/chunk-FKAUPHMR.js +96 -0
- package/dist/chunk-FRG57FPM.js +240 -0
- package/dist/chunk-FUVP64ER.js +31 -0
- package/dist/chunk-G2PTLLEL.js +284 -0
- package/dist/chunk-G35UYQ6Z.js +69 -0
- package/dist/chunk-G36W2T2S.js +1143 -0
- package/dist/chunk-G4THLFV3.js +148 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GCCAPO3S.js +118 -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-GJTWJNLV.js +1374 -0
- package/dist/chunk-GKN3HMN4.js +2809 -0
- package/dist/chunk-GNH3QGTL.js +1342 -0
- package/dist/chunk-GOAQ2I7Y.js +7000 -0
- package/dist/chunk-GSGD5E4C.js +30 -0
- package/dist/chunk-GXWAJQOJ.js +5011 -0
- package/dist/chunk-H2AYQIHW.js +224 -0
- package/dist/chunk-H6G7QRMQ.js +35 -0
- package/dist/chunk-H7JAGHZT.js +59 -0
- package/dist/chunk-HAC6EHZZ.js +79 -0
- package/dist/chunk-HE2KH6EQ.js +161 -0
- package/dist/chunk-HIHENQDX.js +66 -0
- package/dist/chunk-HIO33P3G.js +19 -0
- package/dist/chunk-HK4AQZSR.js +438 -0
- package/dist/chunk-HMVQIPH3.js +547 -0
- package/dist/chunk-HOYBYAOA.js +257 -0
- package/dist/chunk-HQLGXODD.js +123 -0
- package/dist/chunk-HQXYYUNY.js +1231 -0
- package/dist/chunk-HY3ESWCA.js +708 -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-I6BL3PDH.js +1024 -0
- package/dist/chunk-IATQ7NBI.js +679 -0
- package/dist/chunk-IC7I6YIJ.js +301 -0
- package/dist/chunk-IDCSOZVN.js +78 -0
- package/dist/chunk-IEXU4RR6.js +5742 -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-IP7BYVUV.js +338 -0
- package/dist/chunk-IRJ2I6KH.js +166 -0
- package/dist/chunk-IUXNGKA6.js +152 -0
- package/dist/chunk-IZYIQQ7X.js +53 -0
- package/dist/chunk-IZZK3H6I.js +2175 -0
- package/dist/chunk-J3J4P7RW.js +353 -0
- package/dist/chunk-J62KPGII.js +464 -0
- package/dist/chunk-J6P3FWWW.js +130 -0
- package/dist/chunk-JD6SIZED.js +712 -0
- package/dist/chunk-JEV6UI7H.js +537 -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-JQD5VYKR.js +483 -0
- package/dist/chunk-JSOWEFEQ.js +351 -0
- package/dist/chunk-JSWMRQYG.js +28 -0
- package/dist/chunk-K4XK7SGB.js +6783 -0
- package/dist/chunk-K54Y7MLK.js +160 -0
- package/dist/chunk-KAT4RXUT.js +521 -0
- package/dist/chunk-KDMKKIRK.js +103 -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-KQEBSK3T.js +274 -0
- package/dist/chunk-KT6VHSPF.js +84 -0
- package/dist/chunk-KTMW65UX.js +14 -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-LGHII5ET.js +23 -0
- package/dist/chunk-LH34OGSB.js +265 -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-LUVKFFWR.js +315 -0
- package/dist/chunk-LWCBNGH6.js +35 -0
- package/dist/chunk-LWTN3WRV.js +260 -0
- package/dist/chunk-LZBBXYWF.js +1004 -0
- package/dist/chunk-M34PS4NE.js +2213 -0
- package/dist/chunk-M3HQYKQX.js +308 -0
- package/dist/chunk-MCPQNJMK.js +482 -0
- package/dist/chunk-MF5HP6XV.js +221 -0
- package/dist/chunk-MFADRRTR.js +112 -0
- package/dist/chunk-MN6PL4AN.js +120 -0
- package/dist/chunk-MQ4WA34C.js +206 -0
- package/dist/chunk-MTVZITQ2.js +185 -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-N5DX4JAK.js +12 -0
- package/dist/chunk-NEDCMN7E.js +415 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NGK6PEOG.js +25 -0
- package/dist/chunk-NM6PMYY4.js +768 -0
- package/dist/chunk-NOZGR2QO.js +2373 -0
- package/dist/chunk-NP2V3L7K.js +226 -0
- package/dist/chunk-NPZJMUZ4.js +194 -0
- package/dist/chunk-NRLY536M.js +260 -0
- package/dist/chunk-NS33V3IM.js +51 -0
- package/dist/chunk-NWOYOA6H.js +378 -0
- package/dist/chunk-NWRUSEXG.js +322 -0
- package/dist/chunk-O6V4PNLO.js +63 -0
- package/dist/chunk-OGMSYL6J.js +227 -0
- package/dist/chunk-OIS7J26S.js +319 -0
- package/dist/chunk-OKBTRSZI.js +205 -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-OSDYVKHW.js +2440 -0
- package/dist/chunk-OUM5S64R.js +3429 -0
- package/dist/chunk-OWB7JXUS.js +751 -0
- package/dist/chunk-OYZYO7TV.js +47 -0
- package/dist/chunk-P47VN5F4.js +282 -0
- package/dist/chunk-P6VQROCO.js +594 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-PA6BCSOX.js +2872 -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-PTH5E5XO.js +195 -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-QGJDMEOV.js +34 -0
- package/dist/chunk-QJYIHVXT.js +100 -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-QU6JQJMH.js +3063 -0
- package/dist/chunk-QVFV5IP2.js +232 -0
- package/dist/chunk-QVZMFDYG.js +29 -0
- package/dist/chunk-R2ZYWNW3.js +1581 -0
- package/dist/chunk-R4UWBC35.js +200 -0
- package/dist/chunk-R6W23LKN.js +254 -0
- package/dist/chunk-RAK5HOIJ.js +459 -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-RIKFAWZF.js +71 -0
- package/dist/chunk-RJAAKDRX.js +17 -0
- package/dist/chunk-RSXSD4MH.js +1016 -0
- package/dist/chunk-RW7RVSDV.js +79 -0
- package/dist/chunk-RWREC3KJ.js +517 -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-S77XPALC.js +239 -0
- package/dist/chunk-SCW4ZF6R.js +150 -0
- package/dist/chunk-SKHGYQ7W.js +405 -0
- package/dist/chunk-SNLBO4BF.js +247 -0
- package/dist/chunk-SP3LFU6B.js +60 -0
- package/dist/chunk-SQZRPY23.js +5181 -0
- package/dist/chunk-SSB5UQHA.js +4128 -0
- package/dist/chunk-STJOHHSF.js +605 -0
- package/dist/chunk-STV6LYYE.js +45 -0
- package/dist/chunk-SUN4OFTW.js +740 -0
- package/dist/chunk-SURZ2WFE.js +326 -0
- package/dist/chunk-SUZ7UYZH.js +1972 -0
- package/dist/chunk-SZ7DL357.js +1047 -0
- package/dist/chunk-T2SZELJL.js +624 -0
- package/dist/chunk-T6VPI2XP.js +10338 -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-TIBZPAD2.js +9924 -0
- package/dist/chunk-TK644IOG.js +1813 -0
- package/dist/chunk-TRSVUPCX.js +25 -0
- package/dist/chunk-TSPQONRT.js +4533 -0
- package/dist/chunk-TSXGRLPR.js +107 -0
- package/dist/chunk-TWYLVAS2.js +152 -0
- package/dist/chunk-U2S3YEX3.js +224 -0
- package/dist/chunk-U32HWI76.js +437 -0
- package/dist/chunk-U45RTRGY.js +818 -0
- package/dist/chunk-U62VCQGR.js +49 -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-UKMAFG7A.js +189 -0
- package/dist/chunk-UUH2RVKS.js +585 -0
- package/dist/chunk-UVBBFDFQ.js +270 -0
- package/dist/chunk-UXZF3B7T.js +75 -0
- package/dist/chunk-V6YLL5WA.js +3746 -0
- package/dist/chunk-V72RMBM4.js +48 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VCAUV5XQ.js +3679 -0
- package/dist/chunk-VDSH7O4Y.js +152 -0
- package/dist/chunk-VNSYKC25.js +24 -0
- package/dist/chunk-VTLNJQ44.js +133 -0
- package/dist/chunk-VV6HOXRC.js +302 -0
- package/dist/chunk-VVGEPBPS.js +218 -0
- package/dist/chunk-VXF4Q3FW.js +20 -0
- package/dist/chunk-W3ZGW3C5.js +331 -0
- package/dist/chunk-W4OMESPG.js +271 -0
- package/dist/chunk-WDUORIHF.js +877 -0
- package/dist/chunk-WDVTY4U6.js +148 -0
- package/dist/chunk-WGXYDLMX.js +4386 -0
- package/dist/chunk-WMPU2UOV.js +82 -0
- package/dist/chunk-WOEVVPDP.js +1125 -0
- package/dist/chunk-WTLMSPBQ.js +256 -0
- package/dist/chunk-X43NMU4Z.js +1124 -0
- package/dist/chunk-X5NTI5U5.js +368 -0
- package/dist/chunk-X6UIEADS.js +949 -0
- package/dist/chunk-XAONGNST.js +57 -0
- package/dist/chunk-XB5YLCLB.js +13 -0
- package/dist/chunk-XGYF2QMZ.js +351 -0
- package/dist/chunk-XHEKQENB.js +255 -0
- package/dist/chunk-XPHKYHO4.js +878 -0
- package/dist/chunk-XQD2B6BB.js +507 -0
- package/dist/chunk-XT2ZQVTC.js +558 -0
- package/dist/chunk-XUSRFFA7.js +1859 -0
- package/dist/chunk-XUXVDPSZ.js +50 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XXCGJGSQ.js +121 -0
- package/dist/chunk-XYGDZCB5.js +659 -0
- package/dist/chunk-XZAMZUX5.js +992 -0
- package/dist/chunk-XZE4XARH.js +563 -0
- package/dist/chunk-Y34DUC4A.js +1356 -0
- package/dist/chunk-Y3J4JMTU.js +61 -0
- package/dist/chunk-Y4RC2YFX.js +1270 -0
- package/dist/chunk-Y55LZN5U.js +52 -0
- package/dist/chunk-Y5677NDO.js +183 -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-YQAAKTVH.js +712 -0
- package/dist/chunk-YVORHQ2S.js +579 -0
- package/dist/chunk-YWNAHW24.js +1552 -0
- package/dist/chunk-Z476RATD.js +1689 -0
- package/dist/chunk-ZDTGECTN.js +235 -0
- package/dist/chunk-ZDTMICNY.js +316 -0
- package/dist/chunk-ZIPWI2LY.js +151 -0
- package/dist/chunk-ZIVYXF7A.js +2344 -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-HUOTBRM3.js +40 -0
- package/dist/cli-validation-WLXWLUJL.js +111 -0
- package/dist/commit-utils-3QV2P6RA.js +202 -0
- package/dist/compete-config-resolver-SNH3TT2Q.js +76 -0
- package/dist/compete-request-XWNPOARL.js +364 -0
- package/dist/compete-results-PAP67LDR.js +208 -0
- package/dist/competition-outcome-tracker-GOZXNAQU.js +38 -0
- package/dist/config-HWHUNA72.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-L3VRNTSG.js +67 -0
- package/dist/config-validator-SIIQEOFQ.js +72 -0
- package/dist/cost-7CX37DU3.js +53 -0
- package/dist/coverage-orchestrator-MNKHD6YC.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-CGBCD7IQ.js +186 -0
- package/dist/domain-analyzer-DL6BDR2N.js +29 -0
- package/dist/ensure-initialized-4BY73HLE.js +52 -0
- package/dist/entry.js +940 -0
- package/dist/environment-IGVH5X53.js +81 -0
- package/dist/error-parser-core-PPZ36A4S.js +50 -0
- package/dist/escalation-ladder-NWY5BJ57.js +130 -0
- package/dist/evaluation-context-KMWDSDYD.js +35 -0
- package/dist/evidence-plan-resolver-YIVH76PU.js +85 -0
- package/dist/execution-data-writer-OHAQ7G5H.js +53 -0
- package/dist/execution-policy-applier-ZHD3DCF3.js +31 -0
- package/dist/execution-preflight-Z4Y64V3I.js +209 -0
- package/dist/execution-roles-KBH2MC3M.js +66 -0
- package/dist/exit-code-error-Z4SW2DVK.js +14 -0
- package/dist/external-temp-cleanup-N2RZH4QP.js +311 -0
- package/dist/factory-IYBMCZG7.js +149 -0
- package/dist/file-utils-XIVR2ZMA.js +47 -0
- package/dist/flywheel-autoloop-executor-R3KD2G4D.js +249 -0
- package/dist/flywheel-competition-executor-XCFGVJSK.js +259 -0
- package/dist/flywheel-executor-LTSIZN2L.js +369 -0
- package/dist/flywheel-git-isolation-CZ5YVVZY.js +48 -0
- package/dist/flywheel-manifest-5UC4VBMA.js +108 -0
- package/dist/flywheel-model-defaults-7CVKP53V.js +27 -0
- package/dist/flywheel-preflight-6E33DJDK.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-AZ46EPRP.js +73 -0
- package/dist/git-worktree-IY6V6DUO.js +18 -0
- package/dist/github-pr-manager-4XUO2YTM.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 +108644 -0
- package/dist/instructions-CM6THDV7.js +64 -0
- package/dist/invoke-provider-auth-V5TC5UDS.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-VA6VXNOV.js +23 -0
- package/dist/linux-host-class-UY4KVLFD.js +29 -0
- package/dist/llm-judge-executor-34YPIRJ7.js +133 -0
- package/dist/local-executor-LJJSCWZX.js +223 -0
- package/dist/logger-6PRYM56M.js +72 -0
- package/dist/loop-spec-XTLQAVZ7.js +191 -0
- package/dist/manager-2HJG5CLT.js +25 -0
- package/dist/matrix-prompt-builder-LHDTJ4TY.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-MCI3F4PX.js +72 -0
- package/dist/next-HQKDXIIR.js +90 -0
- package/dist/next-JC3V2UCS.js +69 -0
- package/dist/optimization-config-resolver-QPSFLCJU.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-DZK24LSZ.js +270 -0
- package/dist/plan-backlog-show-fast-63GBBH6Q.js +406 -0
- package/dist/plan-sprint-list-fast-TJ6ZUF5E.js +162 -0
- package/dist/plan-sprint-status-fast-YWE5X3NG.js +208 -0
- package/dist/plan-task-status-fast-K22BTTBW.js +349 -0
- package/dist/plan-to-flywheel-VFGCPINA.js +456 -0
- package/dist/planning-backlog-Y6TIJYWU.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-2XP3FWH2.js +149 -0
- package/dist/prompts-EPAAAMMF.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-KWTYA5QV.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-33SHK43X.js +70 -0
- package/dist/quickstart-E32SODTA.js +62 -0
- package/dist/readiness-REWW7OSV.js +96 -0
- package/dist/registry-N6L36RE2.js +153 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-2IGD4H7X.js +22 -0
- package/dist/resolution-engine-LXQYDSKS.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-VGQU35QM.js +160 -0
- package/dist/run-poetic-tui-ZZXFDOQ4.js +13517 -0
- package/dist/run-simulation.js +376 -0
- package/dist/runner-2YPKOJ6A.js +1092 -0
- package/dist/runner-HEJJ65AJ.js +1571 -0
- package/dist/safety-OCC4KJJR.js +64 -0
- package/dist/safety-stanza-BSVE6OJU.js +60 -0
- package/dist/sandbox-3AG2WJLM.js +94 -0
- package/dist/sandbox-5JOFBS75.js +81 -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-QGXLN3SO.js +338 -0
- package/dist/sprint-bridge-FNKQCJGL.js +68 -0
- package/dist/sprint-execution-service-4ELKNJDS.js +311 -0
- package/dist/sprint-manager-7TNCXCIX.js +91 -0
- package/dist/sqlite-wrapper-UDWCTNLJ.js +17 -0
- package/dist/stale-cleanup-orchestrator-H5XKGZP2.js +62 -0
- package/dist/storage-access-F6ALDN4S.js +22 -0
- package/dist/synthesis-TGQUVAW3.js +185 -0
- package/dist/task-classifier-DZIRBSS2.js +494 -0
- package/dist/task-list-fast-PJ2EXVZE.js +147 -0
- package/dist/task-manager-5742GMJK.js +93 -0
- package/dist/task-splitter-6MBXSWF6.js +79 -0
- package/dist/task-type-detector-OLVOMXZO.js +21 -0
- package/dist/task-type-resolver-4HG6TXFV.js +42 -0
- package/dist/telemetry-JX7EMNOZ.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-2MLJ4J6B.js +125 -0
- package/dist/token-estimator-PDU345YE.js +37 -0
- package/dist/transports-3UEO6C5Y.js +255 -0
- package/dist/unified-cost-tracker-F3W5NMPG.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-XCOYVCM4.js +33 -0
- package/dist/variant-state-cleanup-QIEKRULB.js +280 -0
- package/dist/variant-success-PJXWE3ZV.js +12 -0
- package/dist/variant-worker-HPTUA37Z.js +4196 -0
- package/dist/variant-worker.js +24 -0
- package/dist/variants-2HDYZOCG.js +233 -0
- package/dist/verification-toolchains-VVKT3GBF.js +28 -0
- package/dist/verify-commands-5F6CJV4B.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-AGWHD4D2.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 +7040 -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/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,1205 @@
|
|
|
1
|
+
import {
|
|
2
|
+
TaskTypeAliasMap,
|
|
3
|
+
TaskTypeRegistry
|
|
4
|
+
} from "./chunk-LO3X5NLS.js";
|
|
5
|
+
import {
|
|
6
|
+
createWorkItemFile
|
|
7
|
+
} from "./chunk-6MFRHTRI.js";
|
|
8
|
+
import {
|
|
9
|
+
appendActivity
|
|
10
|
+
} from "./chunk-RZY7RKM5.js";
|
|
11
|
+
import {
|
|
12
|
+
boundTypeFromIntent,
|
|
13
|
+
calculateGuidanceTier,
|
|
14
|
+
generatePromptInjection,
|
|
15
|
+
generateSpecQualitySignals,
|
|
16
|
+
getBoundType,
|
|
17
|
+
hasUnfilledMarkers,
|
|
18
|
+
validateTaskSpec
|
|
19
|
+
} from "./chunk-P6VQROCO.js";
|
|
20
|
+
import {
|
|
21
|
+
fromPersistedFormat,
|
|
22
|
+
generateEnhancements,
|
|
23
|
+
hintsFromEnhancements,
|
|
24
|
+
toEnhancementSet,
|
|
25
|
+
toPersistedFormat
|
|
26
|
+
} from "./chunk-HK4AQZSR.js";
|
|
27
|
+
import {
|
|
28
|
+
getArchivedFilePath
|
|
29
|
+
} from "./chunk-OYZYO7TV.js";
|
|
30
|
+
import {
|
|
31
|
+
isValidId
|
|
32
|
+
} from "./chunk-VNSYKC25.js";
|
|
33
|
+
import {
|
|
34
|
+
validateCompletionContracts
|
|
35
|
+
} from "./chunk-FEPIFY7D.js";
|
|
36
|
+
import {
|
|
37
|
+
withIndexRegeneration
|
|
38
|
+
} from "./chunk-OPYFYTWQ.js";
|
|
39
|
+
import {
|
|
40
|
+
getBucketByName
|
|
41
|
+
} from "./chunk-HOYBYAOA.js";
|
|
42
|
+
import {
|
|
43
|
+
isPersistedWorkEdge,
|
|
44
|
+
listMarkdownFiles,
|
|
45
|
+
listMarkdownFilesRecursive,
|
|
46
|
+
parseMarkdownFile,
|
|
47
|
+
writeMarkdownFile
|
|
48
|
+
} from "./chunk-OIS7J26S.js";
|
|
49
|
+
import {
|
|
50
|
+
detectProjectCapabilities
|
|
51
|
+
} from "./chunk-GNH3QGTL.js";
|
|
52
|
+
import {
|
|
53
|
+
findRepoRoot
|
|
54
|
+
} from "./chunk-L7JZLXQL.js";
|
|
55
|
+
import {
|
|
56
|
+
emitCustomWarning
|
|
57
|
+
} from "./chunk-EJGCZGUF.js";
|
|
58
|
+
|
|
59
|
+
// src/planning/backlog-manager.ts
|
|
60
|
+
import * as fs from "fs/promises";
|
|
61
|
+
import * as path from "path";
|
|
62
|
+
|
|
63
|
+
// src/planning/schema-validator.ts
|
|
64
|
+
var BACKLOG_STATUSES = ["inbox", "reviewed", "archived", "done"];
|
|
65
|
+
var PRIORITIES = ["P0", "P1", "P2", "P3"];
|
|
66
|
+
var DEBT_SEVERITIES = ["critical", "high", "medium", "low"];
|
|
67
|
+
var DEBT_EFFORTS = ["low", "medium", "high"];
|
|
68
|
+
var DEBT_STATUSES = ["pending", "in-progress", "completed", "blocked", "archived"];
|
|
69
|
+
var PARKING_STATUSES = ["current", "reconsidering", "re-prioritized", "archived"];
|
|
70
|
+
var SPRINT_STATUSES = ["planning", "active", "completed", "archived"];
|
|
71
|
+
var TASK_STATUSES = [
|
|
72
|
+
"todo",
|
|
73
|
+
"in_progress",
|
|
74
|
+
"review",
|
|
75
|
+
"done",
|
|
76
|
+
"pending",
|
|
77
|
+
"in-progress",
|
|
78
|
+
"completed",
|
|
79
|
+
"blocked",
|
|
80
|
+
"archived",
|
|
81
|
+
"cancelled",
|
|
82
|
+
"canceled"
|
|
83
|
+
];
|
|
84
|
+
function validateBaseFrontMatter(frontMatter, expectedKind, errors) {
|
|
85
|
+
if (typeof frontMatter.id !== "string" || frontMatter.id.length === 0) {
|
|
86
|
+
errors.push({
|
|
87
|
+
field: "id",
|
|
88
|
+
message: "Missing required field: id",
|
|
89
|
+
suggestion: "Use format: YYYYMMDDTHHMMSSZ-<uuidHex12> (UTC)"
|
|
90
|
+
});
|
|
91
|
+
} else if (!isValidId(frontMatter.id)) {
|
|
92
|
+
errors.push({
|
|
93
|
+
field: "id",
|
|
94
|
+
message: `Invalid id format: ${frontMatter.id}`,
|
|
95
|
+
suggestion: "Expected: YYYYMMDDTHHMMSSZ-<uuidHex12> (UTC)"
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
if (typeof frontMatter.kind !== "string" || frontMatter.kind.length === 0) {
|
|
99
|
+
errors.push({
|
|
100
|
+
field: "kind",
|
|
101
|
+
message: "Missing required field: kind",
|
|
102
|
+
suggestion: `Must be: ${expectedKind}`
|
|
103
|
+
});
|
|
104
|
+
} else if (frontMatter.kind !== expectedKind) {
|
|
105
|
+
errors.push({
|
|
106
|
+
field: "kind",
|
|
107
|
+
message: `Invalid kind: ${frontMatter.kind}`,
|
|
108
|
+
suggestion: `Must be: ${expectedKind}`
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (typeof frontMatter.title !== "string" || frontMatter.title.trim().length === 0) {
|
|
112
|
+
errors.push({
|
|
113
|
+
field: "title",
|
|
114
|
+
message: "Missing required field: title",
|
|
115
|
+
suggestion: "Provide a descriptive title"
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function validateExpectedRuntimeMinutes(value, errors) {
|
|
120
|
+
if (value === void 0) return;
|
|
121
|
+
const minutes = Number(value);
|
|
122
|
+
if (Number.isNaN(minutes) || !Number.isFinite(minutes) || minutes <= 0) {
|
|
123
|
+
errors.push({
|
|
124
|
+
field: "expectedRuntimeMinutes",
|
|
125
|
+
message: `Invalid expectedRuntimeMinutes: ${String(value)}`,
|
|
126
|
+
suggestion: "Must be a positive number of minutes"
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function validateBacklogItem(frontMatter) {
|
|
131
|
+
const errors = [];
|
|
132
|
+
validateBaseFrontMatter(frontMatter, "backlog", errors);
|
|
133
|
+
if (!frontMatter.status) {
|
|
134
|
+
errors.push({
|
|
135
|
+
field: "status",
|
|
136
|
+
message: "Missing required field: status",
|
|
137
|
+
suggestion: `Must be one of: ${BACKLOG_STATUSES.join(", ")}`
|
|
138
|
+
});
|
|
139
|
+
} else if (!BACKLOG_STATUSES.includes(frontMatter.status)) {
|
|
140
|
+
errors.push({
|
|
141
|
+
field: "status",
|
|
142
|
+
message: `Invalid status: ${frontMatter.status}`,
|
|
143
|
+
suggestion: `Must be one of: ${BACKLOG_STATUSES.join(", ")}`
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
if (frontMatter.priority && !PRIORITIES.includes(frontMatter.priority)) {
|
|
147
|
+
errors.push({
|
|
148
|
+
field: "priority",
|
|
149
|
+
message: `Invalid priority: ${frontMatter.priority}`,
|
|
150
|
+
suggestion: `Must be one of: ${PRIORITIES.join(", ")}`
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (frontMatter.estimatedComplexity !== void 0) {
|
|
154
|
+
const complexity = Number(frontMatter.estimatedComplexity);
|
|
155
|
+
if (Number.isNaN(complexity) || complexity < 0 || complexity > 1) {
|
|
156
|
+
errors.push({
|
|
157
|
+
field: "estimatedComplexity",
|
|
158
|
+
message: `Invalid estimatedComplexity: ${frontMatter.estimatedComplexity}`,
|
|
159
|
+
suggestion: "Must be a number between 0.0 and 1.0"
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
validateExpectedRuntimeMinutes(frontMatter.expectedRuntimeMinutes, errors);
|
|
164
|
+
if (frontMatter.workEdges !== void 0) {
|
|
165
|
+
if (!Array.isArray(frontMatter.workEdges)) {
|
|
166
|
+
errors.push({
|
|
167
|
+
field: "workEdges",
|
|
168
|
+
message: "workEdges must be an array of persisted canonical edges",
|
|
169
|
+
suggestion: "Run `poetic backlog graph migrate` to (re)generate workEdges"
|
|
170
|
+
});
|
|
171
|
+
} else {
|
|
172
|
+
frontMatter.workEdges.forEach((edge, index) => {
|
|
173
|
+
if (!isPersistedWorkEdge(edge)) {
|
|
174
|
+
errors.push({
|
|
175
|
+
field: `workEdges[${index}]`,
|
|
176
|
+
message: "Malformed persisted work edge",
|
|
177
|
+
suggestion: "Each edge needs non-empty from/to/declaredOn/declaredTarget, a valid type (depends_on|supersedes), known fromKind/toKind, and a known declaredBy (blocks|blocked-by|supersedes|superseded_by)"
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
valid: errors.length === 0,
|
|
185
|
+
errors
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function validateDebtItem(frontMatter) {
|
|
189
|
+
const errors = [];
|
|
190
|
+
validateBaseFrontMatter(frontMatter, "tech-debt", errors);
|
|
191
|
+
if (frontMatter.severity && !DEBT_SEVERITIES.includes(frontMatter.severity)) {
|
|
192
|
+
errors.push({
|
|
193
|
+
field: "severity",
|
|
194
|
+
message: `Invalid severity: ${frontMatter.severity}`,
|
|
195
|
+
suggestion: `Must be one of: ${DEBT_SEVERITIES.join(", ")}`
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (!frontMatter.status) {
|
|
199
|
+
errors.push({
|
|
200
|
+
field: "status",
|
|
201
|
+
message: "Missing required field: status",
|
|
202
|
+
suggestion: `Must be one of: ${DEBT_STATUSES.join(", ")}`
|
|
203
|
+
});
|
|
204
|
+
} else if (!DEBT_STATUSES.includes(frontMatter.status)) {
|
|
205
|
+
errors.push({
|
|
206
|
+
field: "status",
|
|
207
|
+
message: `Invalid status: ${frontMatter.status}`,
|
|
208
|
+
suggestion: `Must be one of: ${DEBT_STATUSES.join(", ")}`
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
if (frontMatter.effort && !DEBT_EFFORTS.includes(frontMatter.effort)) {
|
|
212
|
+
errors.push({
|
|
213
|
+
field: "effort",
|
|
214
|
+
message: `Invalid effort: ${frontMatter.effort}`,
|
|
215
|
+
suggestion: `Must be one of: ${DEBT_EFFORTS.join(", ")}`
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
if (frontMatter.estimatedComplexity !== void 0) {
|
|
219
|
+
const complexity = Number(frontMatter.estimatedComplexity);
|
|
220
|
+
if (Number.isNaN(complexity) || complexity < 0 || complexity > 1) {
|
|
221
|
+
errors.push({
|
|
222
|
+
field: "estimatedComplexity",
|
|
223
|
+
message: `Invalid estimatedComplexity: ${frontMatter.estimatedComplexity}`,
|
|
224
|
+
suggestion: "Must be a number between 0.0 and 1.0"
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
validateExpectedRuntimeMinutes(frontMatter.expectedRuntimeMinutes, errors);
|
|
229
|
+
return {
|
|
230
|
+
valid: errors.length === 0,
|
|
231
|
+
errors
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
function validateParkingItem(frontMatter) {
|
|
235
|
+
const errors = [];
|
|
236
|
+
validateBaseFrontMatter(frontMatter, "parking-lot", errors);
|
|
237
|
+
if (!frontMatter.status) {
|
|
238
|
+
errors.push({
|
|
239
|
+
field: "status",
|
|
240
|
+
message: "Missing required field: status",
|
|
241
|
+
suggestion: `Must be one of: ${PARKING_STATUSES.join(", ")}`
|
|
242
|
+
});
|
|
243
|
+
} else if (!PARKING_STATUSES.includes(frontMatter.status)) {
|
|
244
|
+
errors.push({
|
|
245
|
+
field: "status",
|
|
246
|
+
message: `Invalid status: ${frontMatter.status}`,
|
|
247
|
+
suggestion: `Must be one of: ${PARKING_STATUSES.join(", ")}`
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
if (frontMatter.estimatedComplexity !== void 0) {
|
|
251
|
+
const complexity = Number(frontMatter.estimatedComplexity);
|
|
252
|
+
if (Number.isNaN(complexity) || complexity < 0 || complexity > 1) {
|
|
253
|
+
errors.push({
|
|
254
|
+
field: "estimatedComplexity",
|
|
255
|
+
message: `Invalid estimatedComplexity: ${frontMatter.estimatedComplexity}`,
|
|
256
|
+
suggestion: "Must be a number between 0.0 and 1.0"
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
valid: errors.length === 0,
|
|
262
|
+
errors
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function validateSprintItem(frontMatter) {
|
|
266
|
+
const errors = [];
|
|
267
|
+
validateBaseFrontMatter(frontMatter, "sprint", errors);
|
|
268
|
+
if (!frontMatter.status) {
|
|
269
|
+
errors.push({
|
|
270
|
+
field: "status",
|
|
271
|
+
message: "Missing required field: status",
|
|
272
|
+
suggestion: `Must be one of: ${SPRINT_STATUSES.join(", ")}`
|
|
273
|
+
});
|
|
274
|
+
} else if (!SPRINT_STATUSES.includes(frontMatter.status)) {
|
|
275
|
+
errors.push({
|
|
276
|
+
field: "status",
|
|
277
|
+
message: `Invalid status: ${frontMatter.status}`,
|
|
278
|
+
suggestion: `Must be one of: ${SPRINT_STATUSES.join(", ")}`
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
if (frontMatter.capacity) {
|
|
282
|
+
const cap = frontMatter.capacity;
|
|
283
|
+
if (typeof cap !== "object") {
|
|
284
|
+
errors.push({
|
|
285
|
+
field: "capacity",
|
|
286
|
+
message: "capacity must be an object",
|
|
287
|
+
suggestion: "Use format: { totalHours, allocatedHours, remainingHours, utilizationPercent }"
|
|
288
|
+
});
|
|
289
|
+
} else {
|
|
290
|
+
if (cap.totalHours !== void 0 && typeof cap.totalHours !== "number") {
|
|
291
|
+
errors.push({
|
|
292
|
+
field: "capacity.totalHours",
|
|
293
|
+
message: "capacity.totalHours must be a number"
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
if (cap.allocatedHours !== void 0 && typeof cap.allocatedHours !== "number") {
|
|
297
|
+
errors.push({
|
|
298
|
+
field: "capacity.allocatedHours",
|
|
299
|
+
message: "capacity.allocatedHours must be a number"
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return {
|
|
305
|
+
valid: errors.length === 0,
|
|
306
|
+
errors
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
function validateTaskItem(frontMatter) {
|
|
310
|
+
const errors = [];
|
|
311
|
+
validateBaseFrontMatter(frontMatter, "task", errors);
|
|
312
|
+
if (!frontMatter.status) {
|
|
313
|
+
errors.push({
|
|
314
|
+
field: "status",
|
|
315
|
+
message: "Missing required field: status",
|
|
316
|
+
suggestion: `Must be one of: ${TASK_STATUSES.join(", ")}`
|
|
317
|
+
});
|
|
318
|
+
} else if (!TASK_STATUSES.includes(frontMatter.status)) {
|
|
319
|
+
errors.push({
|
|
320
|
+
field: "status",
|
|
321
|
+
message: `Invalid status: ${frontMatter.status}`,
|
|
322
|
+
suggestion: `Must be one of: ${TASK_STATUSES.join(", ")}`
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
if (frontMatter.priority && !PRIORITIES.includes(frontMatter.priority)) {
|
|
326
|
+
errors.push({
|
|
327
|
+
field: "priority",
|
|
328
|
+
message: `Invalid priority: ${frontMatter.priority}`,
|
|
329
|
+
suggestion: `Must be one of: ${PRIORITIES.join(", ")}`
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
if (frontMatter.complexity !== void 0) {
|
|
333
|
+
const complexity = Number(frontMatter.complexity);
|
|
334
|
+
if (Number.isNaN(complexity) || complexity < 0 || complexity > 1) {
|
|
335
|
+
errors.push({
|
|
336
|
+
field: "complexity",
|
|
337
|
+
message: `Invalid complexity: ${frontMatter.complexity}`,
|
|
338
|
+
suggestion: "Must be a number between 0.0 and 1.0"
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
if (frontMatter.estimatedHours !== void 0) {
|
|
343
|
+
const hours = Number(frontMatter.estimatedHours);
|
|
344
|
+
if (Number.isNaN(hours) || hours < 0) {
|
|
345
|
+
errors.push({
|
|
346
|
+
field: "estimatedHours",
|
|
347
|
+
message: `Invalid estimatedHours: ${frontMatter.estimatedHours}`,
|
|
348
|
+
suggestion: "Must be a positive number"
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
validateExpectedRuntimeMinutes(frontMatter.expectedRuntimeMinutes, errors);
|
|
353
|
+
if (frontMatter.dependencies !== void 0 && !Array.isArray(frontMatter.dependencies)) {
|
|
354
|
+
errors.push({
|
|
355
|
+
field: "dependencies",
|
|
356
|
+
message: "dependencies must be an array of task IDs",
|
|
357
|
+
suggestion: 'Use format: ["<id>", "<id>"]'
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
if (frontMatter.completionContract !== void 0) {
|
|
361
|
+
const contractValidation = validateCompletionContracts(frontMatter.completionContract);
|
|
362
|
+
for (const contractError of contractValidation.errors) {
|
|
363
|
+
errors.push({
|
|
364
|
+
field: contractError.field,
|
|
365
|
+
message: contractError.message,
|
|
366
|
+
suggestion: "Use typed completion contracts: path_exists, file_contains, glob_exists, command_passes, test_passes, llm_judge"
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
valid: errors.length === 0,
|
|
372
|
+
errors
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// src/planning/backlog-manager.ts
|
|
377
|
+
async function resolveDeclaredTypeAtCreation(rootDir, declaredType) {
|
|
378
|
+
if (typeof declaredType !== "string" || declaredType.length === 0) return void 0;
|
|
379
|
+
try {
|
|
380
|
+
const [registry, aliasMap] = await Promise.all([
|
|
381
|
+
TaskTypeRegistry.load({ cwd: rootDir }),
|
|
382
|
+
TaskTypeAliasMap.load({ cwd: rootDir })
|
|
383
|
+
]);
|
|
384
|
+
if (aliasMap.isEmpty()) return void 0;
|
|
385
|
+
const mappedId = aliasMap.resolve(declaredType);
|
|
386
|
+
if (typeof mappedId === "string" && mappedId.length > 0 && registry.get(mappedId)) {
|
|
387
|
+
return mappedId;
|
|
388
|
+
}
|
|
389
|
+
} catch {
|
|
390
|
+
}
|
|
391
|
+
return void 0;
|
|
392
|
+
}
|
|
393
|
+
function emitBacklogManagerWarning(message, metadata) {
|
|
394
|
+
emitCustomWarning(
|
|
395
|
+
"WARN" /* WARN */,
|
|
396
|
+
"configuration" /* CONFIGURATION */,
|
|
397
|
+
message,
|
|
398
|
+
{
|
|
399
|
+
subsystem: "planning/backlog-manager",
|
|
400
|
+
executionPhase: "execution"
|
|
401
|
+
},
|
|
402
|
+
{ metadata, skipConsole: true }
|
|
403
|
+
);
|
|
404
|
+
}
|
|
405
|
+
async function tryLoadPackageJsonScripts(repoRoot) {
|
|
406
|
+
try {
|
|
407
|
+
const raw = await fs.readFile(path.join(repoRoot, "package.json"), "utf-8");
|
|
408
|
+
const parsed = JSON.parse(raw);
|
|
409
|
+
const scripts = parsed.scripts && typeof parsed.scripts === "object" ? parsed.scripts : {};
|
|
410
|
+
return new Set(Object.keys(scripts));
|
|
411
|
+
} catch {
|
|
412
|
+
return void 0;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
function buildScaffoldingFromEnhancements(enhancements) {
|
|
416
|
+
if (enhancements.length === 0) return "";
|
|
417
|
+
const hasScope = enhancements.some((e) => e.kind === "scope");
|
|
418
|
+
const hasAcceptance = enhancements.some((e) => e.kind === "acceptance");
|
|
419
|
+
const hasTesting = enhancements.some((e) => e.kind === "testing");
|
|
420
|
+
const hasReproducibility = enhancements.some((e) => e.kind === "reproducibility");
|
|
421
|
+
const hasResearch = enhancements.some((e) => e.kind === "research");
|
|
422
|
+
const hasAdr = enhancements.some((e) => e.kind === "adr");
|
|
423
|
+
const sections = [];
|
|
424
|
+
if (hasAdr) {
|
|
425
|
+
sections.push(`## Context
|
|
426
|
+
|
|
427
|
+
<<<FILL: What is the background? What problem are we solving?>>>
|
|
428
|
+
Example: The current caching strategy causes stale data issues during deployments.
|
|
429
|
+
|
|
430
|
+
## Decision
|
|
431
|
+
|
|
432
|
+
<<<FILL: What did we decide?>>>
|
|
433
|
+
Example: Use cache invalidation via Redis pub/sub on deploy events.
|
|
434
|
+
|
|
435
|
+
## Alternatives Considered
|
|
436
|
+
|
|
437
|
+
<<<FILL: What other options were evaluated?>>>
|
|
438
|
+
Example:
|
|
439
|
+
- Time-based TTL (rejected: unpredictable staleness)
|
|
440
|
+
- Manual cache clear (rejected: error-prone)
|
|
441
|
+
|
|
442
|
+
## Consequences
|
|
443
|
+
|
|
444
|
+
<<<FILL: What are the implications of this decision?>>>
|
|
445
|
+
Example:
|
|
446
|
+
- (+) Fresh data immediately after deploys
|
|
447
|
+
- (-) Added Redis dependency`);
|
|
448
|
+
return sections.join("\n\n");
|
|
449
|
+
}
|
|
450
|
+
if (hasResearch) {
|
|
451
|
+
sections.push(`## Research Questions
|
|
452
|
+
|
|
453
|
+
- <<<FILL: Primary question to answer>>>
|
|
454
|
+
- <<<FILL: Secondary question>>>
|
|
455
|
+
Example:
|
|
456
|
+
- What caching libraries support TypeScript natively?
|
|
457
|
+
- What are the performance trade-offs?
|
|
458
|
+
|
|
459
|
+
## Deliverable
|
|
460
|
+
|
|
461
|
+
<<<FILL: What must the result help its reader understand, compare, or decide? Name any required evidence or constraints; prescribe a format only when the format itself is required.>>>
|
|
462
|
+
Example: A document that answers the research questions, shows the evidence and the
|
|
463
|
+
remaining uncertainty, and states what it means for the intended use or decision.`);
|
|
464
|
+
return sections.join("\n\n");
|
|
465
|
+
}
|
|
466
|
+
if (hasReproducibility) {
|
|
467
|
+
sections.push(`## Reproduction Steps
|
|
468
|
+
|
|
469
|
+
1. <<<FILL: First step>>>
|
|
470
|
+
2. <<<FILL: Next step>>>
|
|
471
|
+
Example:
|
|
472
|
+
1. Run poetic backlog add "Test"
|
|
473
|
+
2. Run poetic backlog list --json
|
|
474
|
+
|
|
475
|
+
**Expected:** <<<FILL: What should happen>>>
|
|
476
|
+
Example: JSON output with the new item
|
|
477
|
+
|
|
478
|
+
**Actual:** <<<FILL: What actually happens>>>
|
|
479
|
+
Example: Error: "Cannot read property 'id' of undefined"`);
|
|
480
|
+
}
|
|
481
|
+
if (hasScope) {
|
|
482
|
+
sections.push(`## Scope / Surfaces Affected (Optional)
|
|
483
|
+
|
|
484
|
+
Describe what areas of the codebase are involved:
|
|
485
|
+
<<<FILL: e.g., "CLI refine output", "enhancement templates", "backlog storage" >>>`);
|
|
486
|
+
}
|
|
487
|
+
sections.push(`## Non-goals
|
|
488
|
+
|
|
489
|
+
- <<<FILL: What is explicitly out of scope?>>>
|
|
490
|
+
Example:
|
|
491
|
+
- Not changing the database schema
|
|
492
|
+
- Not adding new CLI flags`);
|
|
493
|
+
if (hasAcceptance) {
|
|
494
|
+
sections.push(`## Acceptance Criteria
|
|
495
|
+
|
|
496
|
+
- [ ] <<<FILL: Specific criterion 1>>>
|
|
497
|
+
- [ ] <<<FILL: Specific criterion 2>>>
|
|
498
|
+
- [ ] Tests pass
|
|
499
|
+
- [ ] No regressions
|
|
500
|
+
Example:
|
|
501
|
+
- [ ] Command outputs JSON when --json flag is passed
|
|
502
|
+
- [ ] Error message shown when item not found`);
|
|
503
|
+
}
|
|
504
|
+
if (hasTesting) {
|
|
505
|
+
sections.push(`## How to Verify
|
|
506
|
+
|
|
507
|
+
\`\`\`bash
|
|
508
|
+
<<<FILL: Exact command to verify this works>>>
|
|
509
|
+
\`\`\`
|
|
510
|
+
Example:
|
|
511
|
+
- npm run test:planning
|
|
512
|
+
- poetic backlog list --status inbox
|
|
513
|
+
- npm run cli -- backlog add "Test" --desc "Test item"`);
|
|
514
|
+
}
|
|
515
|
+
return sections.join("\n\n");
|
|
516
|
+
}
|
|
517
|
+
function extractFilePathsFromBody(body, maxPaths = 3) {
|
|
518
|
+
const paths = [];
|
|
519
|
+
const fileRegex = /FILE:\s*([^\s\n]+)/g;
|
|
520
|
+
let match = fileRegex.exec(body);
|
|
521
|
+
while (match !== null && paths.length < maxPaths) {
|
|
522
|
+
const filePath = match[1]?.trim();
|
|
523
|
+
if (filePath && !filePath.startsWith("...") && !filePath.startsWith("<") && filePath.length > 3) {
|
|
524
|
+
paths.push(filePath);
|
|
525
|
+
}
|
|
526
|
+
match = fileRegex.exec(body);
|
|
527
|
+
}
|
|
528
|
+
return paths;
|
|
529
|
+
}
|
|
530
|
+
function buildSpawnedFollowupVerifySection(repoRoot) {
|
|
531
|
+
let testCommand;
|
|
532
|
+
try {
|
|
533
|
+
testCommand = detectProjectCapabilities(repoRoot).verification.test[0];
|
|
534
|
+
} catch {
|
|
535
|
+
testCommand = void 0;
|
|
536
|
+
}
|
|
537
|
+
if (testCommand) {
|
|
538
|
+
return `## How to Verify
|
|
539
|
+
|
|
540
|
+
\`\`\`bash
|
|
541
|
+
${testCommand}
|
|
542
|
+
\`\`\``;
|
|
543
|
+
}
|
|
544
|
+
return "## How to Verify\n\nRun the project's test suite.";
|
|
545
|
+
}
|
|
546
|
+
function buildSpawnedFollowupBody(parentTitle, parentBody, repoRoot) {
|
|
547
|
+
const filePaths = extractFilePathsFromBody(parentBody, 3);
|
|
548
|
+
const sections = [];
|
|
549
|
+
sections.push(
|
|
550
|
+
`Spawned follow-up from: ${parentTitle}
|
|
551
|
+
|
|
552
|
+
> This spec needs refinement. Run \`poetic backlog refine <id>\` to add detail before executing.`
|
|
553
|
+
);
|
|
554
|
+
if (filePaths.length > 0) {
|
|
555
|
+
const fileLines = filePaths.map((f) => `- FILE: ${f}`).join("\n");
|
|
556
|
+
sections.push(`## Files to Modify
|
|
557
|
+
|
|
558
|
+
${fileLines}`);
|
|
559
|
+
}
|
|
560
|
+
sections.push(
|
|
561
|
+
"## Acceptance Criteria\n\n- [ ] Implement changes as described in the title\n- [ ] Tests pass\n- [ ] No regressions"
|
|
562
|
+
);
|
|
563
|
+
sections.push(buildSpawnedFollowupVerifySection(repoRoot));
|
|
564
|
+
return sections.join("\n\n");
|
|
565
|
+
}
|
|
566
|
+
function mergeUniqueNumbers(values) {
|
|
567
|
+
const seen = /* @__PURE__ */ new Set();
|
|
568
|
+
const merged = [];
|
|
569
|
+
for (const value of values) {
|
|
570
|
+
if (typeof value !== "number" || Number.isNaN(value)) continue;
|
|
571
|
+
if (!seen.has(value)) {
|
|
572
|
+
seen.add(value);
|
|
573
|
+
merged.push(value);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
return merged;
|
|
577
|
+
}
|
|
578
|
+
function mergeUniqueStrings(values) {
|
|
579
|
+
const seen = /* @__PURE__ */ new Set();
|
|
580
|
+
const merged = [];
|
|
581
|
+
for (const value of values) {
|
|
582
|
+
if (typeof value !== "string" || value.trim().length === 0) continue;
|
|
583
|
+
if (!seen.has(value)) {
|
|
584
|
+
seen.add(value);
|
|
585
|
+
merged.push(value);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
return merged;
|
|
589
|
+
}
|
|
590
|
+
async function createBacklogItem(backlogDir, title, options = {}) {
|
|
591
|
+
const rootDir = findRepoRoot(backlogDir);
|
|
592
|
+
return withIndexRegeneration(rootDir, async () => {
|
|
593
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
594
|
+
const initialBody = options.body?.trim();
|
|
595
|
+
let effectiveDescription;
|
|
596
|
+
let effectiveEnhancements;
|
|
597
|
+
let effectiveEnhancementSet;
|
|
598
|
+
let effectiveHints;
|
|
599
|
+
let guidance;
|
|
600
|
+
if (initialBody) {
|
|
601
|
+
guidance = generateEnhancements({ title, description: initialBody, itemKind: "backlog" });
|
|
602
|
+
effectiveDescription = initialBody;
|
|
603
|
+
effectiveEnhancements = toPersistedFormat(guidance.enhancements);
|
|
604
|
+
effectiveEnhancementSet = toEnhancementSet(guidance);
|
|
605
|
+
effectiveHints = hintsFromEnhancements(guidance.enhancements);
|
|
606
|
+
} else {
|
|
607
|
+
const baseDescription = options.description?.trim() || "(Add description here)";
|
|
608
|
+
guidance = generateEnhancements({ title, description: baseDescription, itemKind: "backlog" });
|
|
609
|
+
const scaffolding = buildScaffoldingFromEnhancements(guidance.enhancements);
|
|
610
|
+
effectiveDescription = scaffolding ? `${baseDescription}
|
|
611
|
+
|
|
612
|
+
${scaffolding}` : baseDescription;
|
|
613
|
+
effectiveEnhancements = toPersistedFormat(guidance.enhancements);
|
|
614
|
+
effectiveEnhancementSet = toEnhancementSet(guidance);
|
|
615
|
+
effectiveHints = hintsFromEnhancements(guidance.enhancements);
|
|
616
|
+
}
|
|
617
|
+
const status = options.status || "inbox";
|
|
618
|
+
const priority = options.priority === void 0 ? null : options.priority;
|
|
619
|
+
const declaredTypeRaw = options.workType ?? options.type;
|
|
620
|
+
const declaredType = typeof declaredTypeRaw === "string" && declaredTypeRaw.trim().length > 0 ? declaredTypeRaw : void 0;
|
|
621
|
+
const declaredMethodology = typeof options.declaredMethodology === "string" && options.declaredMethodology.trim().length > 0 ? options.declaredMethodology : void 0;
|
|
622
|
+
const domain = declaredType ?? options.domain ?? "general";
|
|
623
|
+
const resolvedTaskTypeId = await resolveDeclaredTypeAtCreation(rootDir, declaredType);
|
|
624
|
+
const boundType = boundTypeFromIntent(guidance.intent);
|
|
625
|
+
const boundAt = now;
|
|
626
|
+
const result = await createWorkItemFile({
|
|
627
|
+
repoRoot: rootDir,
|
|
628
|
+
bucket: "backlog",
|
|
629
|
+
title,
|
|
630
|
+
description: effectiveDescription,
|
|
631
|
+
metadata: {
|
|
632
|
+
submittedDate: now,
|
|
633
|
+
submittedBy: options.submittedBy || "User",
|
|
634
|
+
status,
|
|
635
|
+
priority,
|
|
636
|
+
estimatedComplexity: options.complexity ?? 0.5,
|
|
637
|
+
// AI runtime estimate is optional and never defaulted (absence is honest).
|
|
638
|
+
...typeof options.expectedRuntimeMinutes === "number" && options.expectedRuntimeMinutes > 0 ? { expectedRuntimeMinutes: options.expectedRuntimeMinutes } : {},
|
|
639
|
+
domain,
|
|
640
|
+
rationale: "",
|
|
641
|
+
relatedTasks: [],
|
|
642
|
+
createdHeadSha: options.createdHeadSha,
|
|
643
|
+
// Persist the enhancementSet (carrying intent) ALWAYS, even when zero
|
|
644
|
+
// enhancements were generated, so binding intent is never silently lost
|
|
645
|
+
// for very complete specs (fixes the prior omission).
|
|
646
|
+
enhancementSet: effectiveEnhancementSet,
|
|
647
|
+
...effectiveEnhancements.length > 0 ? { enhancements: effectiveEnhancements } : {},
|
|
648
|
+
// Explicit top-level binding, set once at creation.
|
|
649
|
+
...boundType ? { boundType, boundAt } : {},
|
|
650
|
+
// Declared terminology (verbatim, opaque) + its resolved canonical id.
|
|
651
|
+
...declaredType ? { declaredType } : {},
|
|
652
|
+
...declaredMethodology ? { declaredMethodology } : {},
|
|
653
|
+
...resolvedTaskTypeId ? { resolvedTaskTypeId } : {},
|
|
654
|
+
...effectiveHints.length > 0 ? { hints: effectiveHints } : {},
|
|
655
|
+
...options.tags && options.tags.length > 0 ? { tags: options.tags } : {}
|
|
656
|
+
}
|
|
657
|
+
});
|
|
658
|
+
guidance.nextCommands = guidance.nextCommands.map((cmd) => cmd.replace("<item-id>", result.id));
|
|
659
|
+
const baseCompleteness = validateTaskSpec(effectiveDescription, guidance.enhancements);
|
|
660
|
+
const packageJsonScripts = await tryLoadPackageJsonScripts(rootDir);
|
|
661
|
+
const qualitySignals = generateSpecQualitySignals(
|
|
662
|
+
effectiveDescription,
|
|
663
|
+
rootDir,
|
|
664
|
+
packageJsonScripts
|
|
665
|
+
);
|
|
666
|
+
const completeness = qualitySignals.length > 0 ? { ...baseCompleteness, qualitySignals } : baseCompleteness;
|
|
667
|
+
const itemStatus = completeness.complete ? "created" : "draft";
|
|
668
|
+
const guidanceTier = calculateGuidanceTier(completeness);
|
|
669
|
+
const promptInjection = generatePromptInjection(completeness, guidanceTier);
|
|
670
|
+
return {
|
|
671
|
+
id: result.id,
|
|
672
|
+
filePath: result.path,
|
|
673
|
+
guidance,
|
|
674
|
+
completeness,
|
|
675
|
+
status: itemStatus,
|
|
676
|
+
guidanceTier,
|
|
677
|
+
encouragementLevel: guidanceTier,
|
|
678
|
+
// Backwards compat alias
|
|
679
|
+
promptInjection,
|
|
680
|
+
...declaredType ? { declaredType } : {},
|
|
681
|
+
...resolvedTaskTypeId ? { resolvedTaskTypeId } : {},
|
|
682
|
+
...effectiveHints.length > 0 ? { hints: effectiveHints } : {}
|
|
683
|
+
};
|
|
684
|
+
});
|
|
685
|
+
}
|
|
686
|
+
async function moveToReviewed(backlogDir, itemId, options = {}) {
|
|
687
|
+
const rootDir = findRepoRoot(backlogDir);
|
|
688
|
+
return withIndexRegeneration(rootDir, async () => {
|
|
689
|
+
const item = await findBacklogItem(backlogDir, itemId);
|
|
690
|
+
if (!item) {
|
|
691
|
+
throw new Error(`Backlog item not found: ${itemId}`);
|
|
692
|
+
}
|
|
693
|
+
if (item.filePath !== path.join(backlogDir, `${itemId}.md`)) {
|
|
694
|
+
throw new Error(`Cannot review archived backlog item: ${itemId}`);
|
|
695
|
+
}
|
|
696
|
+
if (item.yaml.status === "reviewed") {
|
|
697
|
+
return { filePath: item.filePath };
|
|
698
|
+
}
|
|
699
|
+
if (item.yaml.status && item.yaml.status !== "inbox") {
|
|
700
|
+
throw new Error(`Cannot review backlog item from status "${item.yaml.status}": ${itemId}`);
|
|
701
|
+
}
|
|
702
|
+
const { yaml: yamlData, body } = await parseMarkdownFile(item.filePath);
|
|
703
|
+
yamlData.status = "reviewed";
|
|
704
|
+
yamlData.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
705
|
+
if (options.reviewedAt) {
|
|
706
|
+
yamlData.reviewedAt = options.reviewedAt;
|
|
707
|
+
}
|
|
708
|
+
if (options.reviewedHeadSha) {
|
|
709
|
+
yamlData.reviewedHeadSha = options.reviewedHeadSha;
|
|
710
|
+
}
|
|
711
|
+
if (options.reviewedFiles && options.reviewedFiles.length > 0) {
|
|
712
|
+
yamlData.reviewedFiles = options.reviewedFiles;
|
|
713
|
+
}
|
|
714
|
+
await writeMarkdownFile(item.filePath, yamlData, body);
|
|
715
|
+
return { filePath: item.filePath };
|
|
716
|
+
});
|
|
717
|
+
}
|
|
718
|
+
function hasExistingSpecMetadata(yamlData) {
|
|
719
|
+
return Array.isArray(yamlData.enhancements) || Boolean(yamlData.enhancementSet) || Array.isArray(yamlData.hints);
|
|
720
|
+
}
|
|
721
|
+
function existingBoundEnhancements(yamlData) {
|
|
722
|
+
const setEnhancements = yamlData.enhancementSet?.enhancements;
|
|
723
|
+
if (Array.isArray(setEnhancements) && setEnhancements.some(isBoundEnhancementKind)) {
|
|
724
|
+
return setEnhancements;
|
|
725
|
+
}
|
|
726
|
+
if (Array.isArray(yamlData.enhancements) && yamlData.enhancements.some(isBoundEnhancementKind)) {
|
|
727
|
+
return yamlData.enhancements;
|
|
728
|
+
}
|
|
729
|
+
return void 0;
|
|
730
|
+
}
|
|
731
|
+
function isBoundEnhancementKind(e) {
|
|
732
|
+
return e.kind === "adr" || e.kind === "research" || e.kind === "reproducibility";
|
|
733
|
+
}
|
|
734
|
+
function enhancementKindForBoundType(bound) {
|
|
735
|
+
return bound === "bug" ? "reproducibility" : bound;
|
|
736
|
+
}
|
|
737
|
+
function activityForBoundType(bound) {
|
|
738
|
+
switch (bound) {
|
|
739
|
+
case "bug":
|
|
740
|
+
return "debugging";
|
|
741
|
+
case "adr":
|
|
742
|
+
return "architecture";
|
|
743
|
+
case "research":
|
|
744
|
+
return "research";
|
|
745
|
+
default:
|
|
746
|
+
return "development";
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
function bindingAlignedGuidance(guidance, rebound) {
|
|
750
|
+
const targetKind = rebound === void 0 ? void 0 : enhancementKindForBoundType(rebound);
|
|
751
|
+
const enhancements = guidance.enhancements.filter(
|
|
752
|
+
(e) => !isBoundEnhancementKind(e) || e.kind === targetKind
|
|
753
|
+
);
|
|
754
|
+
return {
|
|
755
|
+
...guidance,
|
|
756
|
+
enhancements,
|
|
757
|
+
intent: { ...guidance.intent, activity: activityForBoundType(rebound) }
|
|
758
|
+
};
|
|
759
|
+
}
|
|
760
|
+
function syncSpecMetadataFromBody(yamlData, body, options) {
|
|
761
|
+
if (options.explicitBoundType !== void 0) {
|
|
762
|
+
const rebound = options.explicitBoundType === "dev" ? void 0 : options.explicitBoundType;
|
|
763
|
+
const rawGuidance = generateEnhancements({
|
|
764
|
+
title: yamlData.title,
|
|
765
|
+
description: body,
|
|
766
|
+
itemKind: "backlog"
|
|
767
|
+
});
|
|
768
|
+
const rebindGuidance = bindingAlignedGuidance(rawGuidance, rebound);
|
|
769
|
+
const rebindSet = toEnhancementSet(rebindGuidance);
|
|
770
|
+
return {
|
|
771
|
+
enhancements: toPersistedFormat(rebindGuidance.enhancements),
|
|
772
|
+
enhancementSet: rebindSet,
|
|
773
|
+
hints: hintsFromEnhancements(rebindGuidance.enhancements),
|
|
774
|
+
boundType: rebound,
|
|
775
|
+
boundAt: rebound === void 0 ? void 0 : (/* @__PURE__ */ new Date()).toISOString()
|
|
776
|
+
};
|
|
777
|
+
}
|
|
778
|
+
if (options.mode === "preserve" && hasExistingSpecMetadata(yamlData)) {
|
|
779
|
+
return {
|
|
780
|
+
enhancements: yamlData.enhancements,
|
|
781
|
+
enhancementSet: yamlData.enhancementSet,
|
|
782
|
+
hints: yamlData.hints,
|
|
783
|
+
boundType: yamlData.boundType,
|
|
784
|
+
boundAt: yamlData.boundAt
|
|
785
|
+
};
|
|
786
|
+
}
|
|
787
|
+
const guidance = generateEnhancements({
|
|
788
|
+
title: yamlData.title,
|
|
789
|
+
description: body,
|
|
790
|
+
itemKind: "backlog"
|
|
791
|
+
});
|
|
792
|
+
const regeneratedEnhancements = toPersistedFormat(guidance.enhancements);
|
|
793
|
+
const regeneratedSet = toEnhancementSet(guidance);
|
|
794
|
+
const regeneratedHints = hintsFromEnhancements(guidance.enhancements);
|
|
795
|
+
const existingBoundType = getBoundType(yamlData);
|
|
796
|
+
if (options.mode === "regenerate" && existingBoundType !== void 0) {
|
|
797
|
+
const existingSet = yamlData.enhancementSet;
|
|
798
|
+
const boundEnhancements = existingBoundEnhancements(yamlData);
|
|
799
|
+
const enhancements = boundEnhancements ?? yamlData.enhancements;
|
|
800
|
+
const mergedSet = {
|
|
801
|
+
...regeneratedSet,
|
|
802
|
+
// Bound intent is part of the bound type; the existing bound intent wins.
|
|
803
|
+
// Fall back to the regenerated intent only when no intent was stored.
|
|
804
|
+
intent: existingSet?.intent ?? regeneratedSet.intent,
|
|
805
|
+
// Pin the bound enhancement kinds to the existing (authoritative) set when present.
|
|
806
|
+
...boundEnhancements ? { enhancements: boundEnhancements } : {}
|
|
807
|
+
};
|
|
808
|
+
if (existingSet?.acceptanceCriteria !== void 0) {
|
|
809
|
+
mergedSet.acceptanceCriteria = existingSet.acceptanceCriteria;
|
|
810
|
+
}
|
|
811
|
+
if (existingSet?.constraints !== void 0) {
|
|
812
|
+
mergedSet.constraints = existingSet.constraints;
|
|
813
|
+
}
|
|
814
|
+
if (existingSet?.artifactSources !== void 0) {
|
|
815
|
+
mergedSet.artifactSources = existingSet.artifactSources;
|
|
816
|
+
}
|
|
817
|
+
return {
|
|
818
|
+
enhancements,
|
|
819
|
+
// Hints describe the bound enhancement kinds; keep stored hints when present
|
|
820
|
+
// (they match the preserved bound type), else derive from the bound kinds.
|
|
821
|
+
enhancementSet: mergedSet,
|
|
822
|
+
hints: yamlData.hints ?? (enhancements ? hintsFromEnhancements(fromPersistedFormat(enhancements)) : regeneratedHints),
|
|
823
|
+
// Bound binding survives verbatim. Backfill boundType/boundAt for legacy
|
|
824
|
+
// bound items that predate the explicit fields, so the persisted authority
|
|
825
|
+
// becomes self-describing after this mutation (mutating path, not read).
|
|
826
|
+
boundType: yamlData.boundType ?? existingBoundType,
|
|
827
|
+
boundAt: yamlData.boundAt ?? (/* @__PURE__ */ new Date()).toISOString()
|
|
828
|
+
};
|
|
829
|
+
}
|
|
830
|
+
const regeneratedBoundType = boundTypeFromIntent(regeneratedSet.intent);
|
|
831
|
+
return {
|
|
832
|
+
enhancements: regeneratedEnhancements,
|
|
833
|
+
enhancementSet: regeneratedSet,
|
|
834
|
+
hints: regeneratedHints,
|
|
835
|
+
...regeneratedBoundType ? { boundType: regeneratedBoundType, boundAt: yamlData.boundAt ?? (/* @__PURE__ */ new Date()).toISOString() } : { boundType: void 0, boundAt: yamlData.boundAt }
|
|
836
|
+
};
|
|
837
|
+
}
|
|
838
|
+
function resolvePlanningRootFromBacklogFile(filePath) {
|
|
839
|
+
return findRepoRoot(path.dirname(filePath));
|
|
840
|
+
}
|
|
841
|
+
async function updateBacklogItem(filePath, updates, bodyOverride) {
|
|
842
|
+
const rootDir = resolvePlanningRootFromBacklogFile(filePath);
|
|
843
|
+
await withIndexRegeneration(rootDir, async () => {
|
|
844
|
+
const { yaml: yamlData, body } = await parseMarkdownFile(filePath);
|
|
845
|
+
const mergeArrayField = (key, target) => {
|
|
846
|
+
const next = updates[key];
|
|
847
|
+
const current = yamlData[key];
|
|
848
|
+
if (!Array.isArray(next) || !Array.isArray(current)) return;
|
|
849
|
+
if (next.length === 0) {
|
|
850
|
+
target[key] = current;
|
|
851
|
+
return;
|
|
852
|
+
}
|
|
853
|
+
target[key] = Array.from(/* @__PURE__ */ new Set([...current, ...next]));
|
|
854
|
+
};
|
|
855
|
+
const updated = {
|
|
856
|
+
...yamlData,
|
|
857
|
+
...updates,
|
|
858
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
859
|
+
};
|
|
860
|
+
mergeArrayField("linkedPrs", updated);
|
|
861
|
+
mergeArrayField("tags", updated);
|
|
862
|
+
mergeArrayField("linkedCommits", updated);
|
|
863
|
+
mergeArrayField("followups", updated);
|
|
864
|
+
const explicitBoundType = "boundType" in updates ? updates.boundType === void 0 ? "dev" : updates.boundType : void 0;
|
|
865
|
+
const hasBodyOverride = typeof bodyOverride === "string";
|
|
866
|
+
const nextBody = hasBodyOverride ? bodyOverride : body;
|
|
867
|
+
const needsMetadataSync = hasBodyOverride || "title" in updates || "domain" in updates || explicitBoundType !== void 0;
|
|
868
|
+
if (needsMetadataSync) {
|
|
869
|
+
Object.assign(
|
|
870
|
+
updated,
|
|
871
|
+
syncSpecMetadataFromBody(updated, nextBody, {
|
|
872
|
+
mode: hasBodyOverride ? "regenerate" : "preserve",
|
|
873
|
+
explicitBoundType
|
|
874
|
+
})
|
|
875
|
+
);
|
|
876
|
+
}
|
|
877
|
+
const validation = validateBacklogItem(updated);
|
|
878
|
+
if (!validation.valid) {
|
|
879
|
+
throw new Error(
|
|
880
|
+
`Backlog validation failed: ${validation.errors.map((error) => `${error.field}: ${error.message}`).join(", ")}`
|
|
881
|
+
);
|
|
882
|
+
}
|
|
883
|
+
await writeMarkdownFile(filePath, updated, nextBody);
|
|
884
|
+
});
|
|
885
|
+
}
|
|
886
|
+
async function listBacklogItems(dir, status, filters) {
|
|
887
|
+
try {
|
|
888
|
+
const isArchiveDir = dir.replace(/\\/g, "/").endsWith("/archive");
|
|
889
|
+
const items = [];
|
|
890
|
+
const files = isArchiveDir ? await listMarkdownFilesRecursive(dir) : await listMarkdownFiles(dir);
|
|
891
|
+
for (const filePath of files) {
|
|
892
|
+
let yamlData;
|
|
893
|
+
let body;
|
|
894
|
+
try {
|
|
895
|
+
({ yaml: yamlData, body } = await parseMarkdownFile(filePath));
|
|
896
|
+
} catch (parseError) {
|
|
897
|
+
const reason = parseError instanceof Error ? parseError.message : String(parseError);
|
|
898
|
+
emitBacklogManagerWarning(
|
|
899
|
+
`Skipping unparseable backlog file ${path.basename(filePath)}: ${reason}`,
|
|
900
|
+
{
|
|
901
|
+
filePath,
|
|
902
|
+
fileName: path.basename(filePath),
|
|
903
|
+
reason
|
|
904
|
+
}
|
|
905
|
+
);
|
|
906
|
+
continue;
|
|
907
|
+
}
|
|
908
|
+
const id = typeof yamlData.id === "string" && yamlData.id.length > 0 ? yamlData.id : path.basename(filePath).replace(/\.md$/, "");
|
|
909
|
+
const title = typeof yamlData.title === "string" ? yamlData.title : "(Untitled)";
|
|
910
|
+
const rawStatus = typeof yamlData.status === "string" ? yamlData.status : "inbox";
|
|
911
|
+
const normalizedStatus = rawStatus === "done" ? "archived" : rawStatus === "inbox" || rawStatus === "reviewed" || rawStatus === "archived" ? rawStatus : "inbox";
|
|
912
|
+
if (status && normalizedStatus !== status) continue;
|
|
913
|
+
const priority = typeof yamlData.priority === "string" ? yamlData.priority : null;
|
|
914
|
+
const complexity = typeof yamlData.estimatedComplexity === "number" ? yamlData.estimatedComplexity : typeof yamlData.estimated_complexity === "number" ? yamlData.estimated_complexity : null;
|
|
915
|
+
const domain = typeof yamlData.domain === "string" ? yamlData.domain : typeof yamlData.activity === "string" ? yamlData.activity : null;
|
|
916
|
+
const createdAt = typeof yamlData.createdAt === "string" ? yamlData.createdAt : null;
|
|
917
|
+
const updatedAt = typeof yamlData.updatedAt === "string" ? yamlData.updatedAt : null;
|
|
918
|
+
const createdHeadSha = typeof yamlData.createdHeadSha === "string" ? yamlData.createdHeadSha : null;
|
|
919
|
+
const reviewedAt = typeof yamlData.reviewedAt === "string" ? yamlData.reviewedAt : null;
|
|
920
|
+
const reviewedHeadSha = typeof yamlData.reviewedHeadSha === "string" ? yamlData.reviewedHeadSha : null;
|
|
921
|
+
const reviewedFiles = Array.isArray(yamlData.reviewedFiles) && yamlData.reviewedFiles.every((f) => typeof f === "string") ? yamlData.reviewedFiles : null;
|
|
922
|
+
const archivedReason = typeof yamlData.archivedReason === "string" ? yamlData.archivedReason : null;
|
|
923
|
+
const rawLinkedPrs = Array.isArray(yamlData.linkedPrs) ? yamlData.linkedPrs : null;
|
|
924
|
+
const linkedPrs = rawLinkedPrs && rawLinkedPrs.length > 0 ? mergeUniqueNumbers(
|
|
925
|
+
rawLinkedPrs.map(
|
|
926
|
+
(value) => typeof value === "string" ? Number.parseInt(value, 10) : value
|
|
927
|
+
)
|
|
928
|
+
) : null;
|
|
929
|
+
const rawLinkedCommits = Array.isArray(yamlData.linkedCommits) ? yamlData.linkedCommits : null;
|
|
930
|
+
const linkedCommits = rawLinkedCommits && rawLinkedCommits.length > 0 ? mergeUniqueStrings(rawLinkedCommits) : null;
|
|
931
|
+
const spawnedFrom = typeof yamlData.spawnedFrom === "string" ? yamlData.spawnedFrom : null;
|
|
932
|
+
const followups = Array.isArray(yamlData.followups) && yamlData.followups.every((f) => typeof f === "string") ? yamlData.followups : null;
|
|
933
|
+
const declaredType = typeof yamlData.declaredType === "string" ? yamlData.declaredType : null;
|
|
934
|
+
const resolvedTaskTypeId = typeof yamlData.resolvedTaskTypeId === "string" ? yamlData.resolvedTaskTypeId : null;
|
|
935
|
+
if (filters?.linkedPr !== void 0) {
|
|
936
|
+
if (!linkedPrs || !linkedPrs.includes(filters.linkedPr)) continue;
|
|
937
|
+
}
|
|
938
|
+
if (filters?.linkedCommit) {
|
|
939
|
+
if (!linkedCommits || !linkedCommits.includes(filters.linkedCommit)) continue;
|
|
940
|
+
}
|
|
941
|
+
if (filters?.spawnedFrom) {
|
|
942
|
+
if (spawnedFrom !== filters.spawnedFrom) continue;
|
|
943
|
+
}
|
|
944
|
+
if (filters?.hasFollowups) {
|
|
945
|
+
if (!followups || followups.length === 0) continue;
|
|
946
|
+
}
|
|
947
|
+
items.push({
|
|
948
|
+
id,
|
|
949
|
+
title,
|
|
950
|
+
complexity,
|
|
951
|
+
domain,
|
|
952
|
+
priority,
|
|
953
|
+
status: normalizedStatus,
|
|
954
|
+
createdAt,
|
|
955
|
+
updatedAt,
|
|
956
|
+
createdHeadSha,
|
|
957
|
+
reviewedAt,
|
|
958
|
+
reviewedHeadSha,
|
|
959
|
+
reviewedFiles,
|
|
960
|
+
archivedReason,
|
|
961
|
+
linkedPrs,
|
|
962
|
+
linkedCommits,
|
|
963
|
+
spawnedFrom,
|
|
964
|
+
followups,
|
|
965
|
+
needsRefinement: hasUnfilledMarkers(body),
|
|
966
|
+
declaredType,
|
|
967
|
+
resolvedTaskTypeId
|
|
968
|
+
});
|
|
969
|
+
}
|
|
970
|
+
return items;
|
|
971
|
+
} catch (error) {
|
|
972
|
+
if (error.code === "ENOENT") {
|
|
973
|
+
return [];
|
|
974
|
+
}
|
|
975
|
+
throw error;
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
function applyBacklogListFilters(items, filters) {
|
|
979
|
+
if (!filters) return items;
|
|
980
|
+
return items.filter((item) => {
|
|
981
|
+
if (filters.linkedPr !== void 0) {
|
|
982
|
+
if (!item.linkedPrs || !item.linkedPrs.includes(filters.linkedPr)) return false;
|
|
983
|
+
}
|
|
984
|
+
if (filters.linkedCommit) {
|
|
985
|
+
if (!item.linkedCommits || !item.linkedCommits.includes(filters.linkedCommit)) return false;
|
|
986
|
+
}
|
|
987
|
+
if (filters.spawnedFrom) {
|
|
988
|
+
if (item.spawnedFrom !== filters.spawnedFrom) return false;
|
|
989
|
+
}
|
|
990
|
+
if (filters.hasFollowups) {
|
|
991
|
+
if (!item.followups || item.followups.length === 0) return false;
|
|
992
|
+
}
|
|
993
|
+
return true;
|
|
994
|
+
});
|
|
995
|
+
}
|
|
996
|
+
async function queryArchivedMerged(backlogDir, filters) {
|
|
997
|
+
const archiveDir = path.join(backlogDir, "archive");
|
|
998
|
+
const [liveItems, archivedItems] = await Promise.all([
|
|
999
|
+
listBacklogItems(backlogDir, "archived"),
|
|
1000
|
+
listBacklogItems(archiveDir, "archived").catch(() => [])
|
|
1001
|
+
]);
|
|
1002
|
+
const seen = new Set(archivedItems.map((i) => i.id));
|
|
1003
|
+
const merged = [...archivedItems, ...liveItems.filter((i) => !seen.has(i.id))];
|
|
1004
|
+
return applyBacklogListFilters(merged, filters);
|
|
1005
|
+
}
|
|
1006
|
+
async function queryBacklogList(backlogDir, status, filters) {
|
|
1007
|
+
if (status !== "archived") {
|
|
1008
|
+
return listBacklogItems(backlogDir, status, filters);
|
|
1009
|
+
}
|
|
1010
|
+
return queryArchivedMerged(backlogDir, filters);
|
|
1011
|
+
}
|
|
1012
|
+
async function queryBacklogListScoped(backlogDir, scope, filters) {
|
|
1013
|
+
const [inbox, reviewed, archived] = await Promise.all([
|
|
1014
|
+
listBacklogItems(backlogDir, "inbox", filters),
|
|
1015
|
+
listBacklogItems(backlogDir, "reviewed", filters),
|
|
1016
|
+
queryArchivedMerged(backlogDir, filters)
|
|
1017
|
+
]);
|
|
1018
|
+
const active = [...inbox, ...reviewed];
|
|
1019
|
+
const items = scope === "with-archived" ? [...active, ...archived] : active;
|
|
1020
|
+
return { items, archivedCount: archived.length };
|
|
1021
|
+
}
|
|
1022
|
+
async function archiveBacklogItem(backlogBaseDir, itemId, options = {}) {
|
|
1023
|
+
const rootDir = findRepoRoot(backlogBaseDir);
|
|
1024
|
+
return withIndexRegeneration(rootDir, async () => {
|
|
1025
|
+
const item = await findBacklogItem(backlogBaseDir, itemId);
|
|
1026
|
+
if (!item) {
|
|
1027
|
+
throw new Error(`Backlog item not found: ${itemId}`);
|
|
1028
|
+
}
|
|
1029
|
+
if (item.filePath.replace(/\\/g, "/").includes("/archive/")) {
|
|
1030
|
+
return { id: itemId, archivedPath: item.filePath };
|
|
1031
|
+
}
|
|
1032
|
+
const { yaml: yamlData, body } = await parseMarkdownFile(item.filePath);
|
|
1033
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
1034
|
+
const followupIds = [];
|
|
1035
|
+
const spawnTitles = options.spawnFollowups?.filter((title) => title.trim().length > 0) || [];
|
|
1036
|
+
if (spawnTitles.length > 0) {
|
|
1037
|
+
for (const followupTitle of spawnTitles) {
|
|
1038
|
+
const followupBody = buildSpawnedFollowupBody(yamlData.title, body, rootDir);
|
|
1039
|
+
const followup = await createBacklogItem(backlogBaseDir, followupTitle, {
|
|
1040
|
+
domain: yamlData.domain,
|
|
1041
|
+
complexity: yamlData.estimatedComplexity,
|
|
1042
|
+
submittedBy: yamlData.submittedBy,
|
|
1043
|
+
body: followupBody
|
|
1044
|
+
});
|
|
1045
|
+
followupIds.push(followup.id);
|
|
1046
|
+
await updateBacklogItem(followup.filePath, {
|
|
1047
|
+
spawnedFrom: itemId,
|
|
1048
|
+
...yamlData.priority ? { priority: yamlData.priority } : {}
|
|
1049
|
+
});
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
const updated = {
|
|
1053
|
+
...yamlData,
|
|
1054
|
+
status: "archived",
|
|
1055
|
+
updatedAt: now,
|
|
1056
|
+
archivedAt: now,
|
|
1057
|
+
restoredStatus: yamlData.status === "inbox" || yamlData.status === "reviewed" ? yamlData.status : void 0,
|
|
1058
|
+
...options.reason ? { archivedReason: options.reason } : {},
|
|
1059
|
+
...followupIds.length > 0 ? {
|
|
1060
|
+
followups: mergeUniqueStrings([
|
|
1061
|
+
...Array.isArray(yamlData.followups) ? yamlData.followups : [],
|
|
1062
|
+
...followupIds
|
|
1063
|
+
])
|
|
1064
|
+
} : {}
|
|
1065
|
+
};
|
|
1066
|
+
const bucketConfig = getBucketByName("backlog", rootDir);
|
|
1067
|
+
if (!bucketConfig) {
|
|
1068
|
+
throw new Error("Bucket not configured: backlog");
|
|
1069
|
+
}
|
|
1070
|
+
const archivedPath = getArchivedFilePath(bucketConfig, itemId, now, rootDir);
|
|
1071
|
+
await fs.mkdir(path.dirname(archivedPath), { recursive: true });
|
|
1072
|
+
await writeMarkdownFile(archivedPath, updated, body);
|
|
1073
|
+
await fs.unlink(item.filePath);
|
|
1074
|
+
await appendActivity(archivedPath, {
|
|
1075
|
+
timestamp: now,
|
|
1076
|
+
type: "completed",
|
|
1077
|
+
description: `Archived (reason: ${options.reason ?? "Not specified"}, by: ${options.actor ?? "unknown"})`
|
|
1078
|
+
});
|
|
1079
|
+
return followupIds.length > 0 ? { id: itemId, archivedPath, followupIds } : { id: itemId, archivedPath };
|
|
1080
|
+
});
|
|
1081
|
+
}
|
|
1082
|
+
async function restoreBacklogItem(backlogBaseDir, itemId, options = {}) {
|
|
1083
|
+
const rootDir = findRepoRoot(backlogBaseDir);
|
|
1084
|
+
return withIndexRegeneration(rootDir, async () => {
|
|
1085
|
+
const item = await findBacklogItem(backlogBaseDir, itemId);
|
|
1086
|
+
if (!item) {
|
|
1087
|
+
throw new Error(`Backlog item not found: ${itemId}`);
|
|
1088
|
+
}
|
|
1089
|
+
const targetPath = path.join(backlogBaseDir, `${itemId}.md`);
|
|
1090
|
+
if (!item.filePath.replace(/\\/g, "/").includes("/archive/")) {
|
|
1091
|
+
const { yaml: yamlData2, body: body2 } = await parseMarkdownFile(item.filePath);
|
|
1092
|
+
const updated2 = {
|
|
1093
|
+
...yamlData2,
|
|
1094
|
+
status: yamlData2.restoredStatus === "inbox" || yamlData2.restoredStatus === "reviewed" ? yamlData2.restoredStatus : "reviewed",
|
|
1095
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1096
|
+
};
|
|
1097
|
+
delete updated2.archivedAt;
|
|
1098
|
+
delete updated2.archivedReason;
|
|
1099
|
+
delete updated2.restoredStatus;
|
|
1100
|
+
await writeMarkdownFile(item.filePath, updated2, body2);
|
|
1101
|
+
return { id: itemId, restoredPath: item.filePath };
|
|
1102
|
+
}
|
|
1103
|
+
const { yaml: yamlData, body } = await parseMarkdownFile(item.filePath);
|
|
1104
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
1105
|
+
const updated = {
|
|
1106
|
+
...yamlData,
|
|
1107
|
+
status: yamlData.restoredStatus === "inbox" || yamlData.restoredStatus === "reviewed" ? yamlData.restoredStatus : "reviewed",
|
|
1108
|
+
updatedAt: now
|
|
1109
|
+
};
|
|
1110
|
+
delete updated.archivedAt;
|
|
1111
|
+
delete updated.archivedReason;
|
|
1112
|
+
delete updated.restoredStatus;
|
|
1113
|
+
await writeMarkdownFile(targetPath, updated, body);
|
|
1114
|
+
await fs.unlink(item.filePath);
|
|
1115
|
+
await appendActivity(targetPath, {
|
|
1116
|
+
timestamp: now,
|
|
1117
|
+
type: "progress",
|
|
1118
|
+
description: `Restored (reason: ${options.reason ?? "Lifecycle undo"}, by: ${options.actor ?? "unknown"})`
|
|
1119
|
+
});
|
|
1120
|
+
return { id: itemId, restoredPath: targetPath };
|
|
1121
|
+
});
|
|
1122
|
+
}
|
|
1123
|
+
async function findBacklogItem(backlogBaseDir, itemId) {
|
|
1124
|
+
const currentPath = path.join(backlogBaseDir, `${itemId}.md`);
|
|
1125
|
+
try {
|
|
1126
|
+
const { yaml: yamlData2, body: body2 } = await parseMarkdownFile(currentPath);
|
|
1127
|
+
if (yamlData2.id === itemId) return { filePath: currentPath, yaml: yamlData2, body: body2 };
|
|
1128
|
+
} catch {
|
|
1129
|
+
}
|
|
1130
|
+
const archiveRoot = path.join(backlogBaseDir, "archive");
|
|
1131
|
+
const archivedFiles = await listMarkdownFilesRecursive(archiveRoot);
|
|
1132
|
+
const match = archivedFiles.find((f) => path.basename(f) === `${itemId}.md`);
|
|
1133
|
+
if (!match) return null;
|
|
1134
|
+
const { yaml: yamlData, body } = await parseMarkdownFile(match);
|
|
1135
|
+
if (yamlData.id === itemId) return { filePath: match, yaml: yamlData, body };
|
|
1136
|
+
return null;
|
|
1137
|
+
}
|
|
1138
|
+
async function linkBacklogItem(backlogBaseDir, itemId, options) {
|
|
1139
|
+
const rootDir = findRepoRoot(backlogBaseDir);
|
|
1140
|
+
if (!options.pr && !options.commit) {
|
|
1141
|
+
throw new Error("At least one link (--pr or --commit) is required");
|
|
1142
|
+
}
|
|
1143
|
+
return withIndexRegeneration(rootDir, async () => {
|
|
1144
|
+
const item = await findBacklogItem(backlogBaseDir, itemId);
|
|
1145
|
+
if (!item) {
|
|
1146
|
+
throw new Error(`Backlog item not found: ${itemId}`);
|
|
1147
|
+
}
|
|
1148
|
+
const existingLinkedPrs = Array.isArray(item.yaml.linkedPrs) ? mergeUniqueNumbers(
|
|
1149
|
+
item.yaml.linkedPrs.map(
|
|
1150
|
+
(value) => typeof value === "string" ? Number.parseInt(value, 10) : value
|
|
1151
|
+
)
|
|
1152
|
+
) : [];
|
|
1153
|
+
const existingLinkedCommits = Array.isArray(item.yaml.linkedCommits) && item.yaml.linkedCommits.every((value) => typeof value === "string") ? item.yaml.linkedCommits : [];
|
|
1154
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
1155
|
+
const updated = {
|
|
1156
|
+
...item.yaml,
|
|
1157
|
+
updatedAt: now
|
|
1158
|
+
};
|
|
1159
|
+
if (options.pr !== void 0) {
|
|
1160
|
+
updated.linkedPrs = mergeUniqueNumbers([...existingLinkedPrs, options.pr]);
|
|
1161
|
+
}
|
|
1162
|
+
if (options.commit) {
|
|
1163
|
+
updated.linkedCommits = mergeUniqueStrings([...existingLinkedCommits, options.commit]);
|
|
1164
|
+
}
|
|
1165
|
+
await writeMarkdownFile(item.filePath, updated, item.body);
|
|
1166
|
+
const linkParts = [];
|
|
1167
|
+
if (options.pr !== void 0) {
|
|
1168
|
+
linkParts.push(`PR #${options.pr}`);
|
|
1169
|
+
}
|
|
1170
|
+
if (options.commit) {
|
|
1171
|
+
linkParts.push(`commit ${options.commit}`);
|
|
1172
|
+
}
|
|
1173
|
+
const description = `Linked to ${linkParts.join(" and ")} (by: ${options.actor ?? "unknown"})`;
|
|
1174
|
+
await appendActivity(item.filePath, {
|
|
1175
|
+
timestamp: now,
|
|
1176
|
+
type: "progress",
|
|
1177
|
+
description,
|
|
1178
|
+
metadata: options.pr !== void 0 ? { prNumber: options.pr } : void 0
|
|
1179
|
+
});
|
|
1180
|
+
return {
|
|
1181
|
+
filePath: item.filePath,
|
|
1182
|
+
linkedPrs: updated.linkedPrs ?? [],
|
|
1183
|
+
linkedCommits: updated.linkedCommits ?? []
|
|
1184
|
+
};
|
|
1185
|
+
});
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
export {
|
|
1189
|
+
validateBacklogItem,
|
|
1190
|
+
validateDebtItem,
|
|
1191
|
+
validateParkingItem,
|
|
1192
|
+
validateSprintItem,
|
|
1193
|
+
validateTaskItem,
|
|
1194
|
+
createBacklogItem,
|
|
1195
|
+
moveToReviewed,
|
|
1196
|
+
updateBacklogItem,
|
|
1197
|
+
listBacklogItems,
|
|
1198
|
+
queryBacklogList,
|
|
1199
|
+
queryBacklogListScoped,
|
|
1200
|
+
archiveBacklogItem,
|
|
1201
|
+
restoreBacklogItem,
|
|
1202
|
+
findBacklogItem,
|
|
1203
|
+
linkBacklogItem
|
|
1204
|
+
};
|
|
1205
|
+
//# sourceMappingURL=chunk-4W2NRXQL.js.map
|