@poetic-ai/poetic 1.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/SECURITY.md +47 -0
- package/.nvmrc +1 -0
- package/.poetic/README.md +37 -0
- package/.poetic/providers/catalog.json +12051 -0
- package/.poetic/providers/pricing.json +1272 -0
- package/.poetic/providers/registry.json +3369 -0
- package/CHANGELOG.md +552 -0
- package/CODE_OF_CONDUCT.md +40 -0
- package/CONTRIBUTING.md +23 -0
- package/INSTALL.md +454 -0
- package/LICENSE +21 -0
- package/README.md +474 -0
- package/dist/BasicOptimizationCompetitionRunner-5H5TBYO4.js +153 -0
- package/dist/ExecutionTracker-UVONC4C6.js +16 -0
- package/dist/OptimizationConfig-7DFY2TST.js +17 -0
- package/dist/OptimizationEngine-JIMGP3LY.js +1597 -0
- package/dist/PromptStore-U6ZD3ZMQ.js +18 -0
- package/dist/actions-LUJPINLJ.js +322 -0
- package/dist/agent-ingest-3DJUJ7FU.js +53 -0
- package/dist/aggregator-DNCBINFO.js +12 -0
- package/dist/ai-judge-5QT5QJVU.js +156 -0
- package/dist/allowlist-grounding-RO6HKUFI.js +16 -0
- package/dist/allowlist-utils-23V7TJ3G.js +28 -0
- package/dist/anchored-turn-service-JULUCUIK.js +489 -0
- package/dist/api-transport-4TYTNLTJ.js +1087 -0
- package/dist/apply-completion-mode-AW2MOS3R.js +89 -0
- package/dist/artifact-migrator-23L45ISD.js +267 -0
- package/dist/ask-HWVV6QFR.js +135 -0
- package/dist/auth-5KEDKAPP.js +67 -0
- package/dist/auth-7TT3JINV.js +78 -0
- package/dist/auth-E6XUNZ5M.js +68 -0
- package/dist/auth-H3XDZE22.js +134 -0
- package/dist/auth-OC4E6633.js +71 -0
- package/dist/auth-S4CTX4GQ.js +44 -0
- package/dist/auth-YLH3S7EY.js +69 -0
- package/dist/auth-liveness-TDDEZY3T.js +46 -0
- package/dist/auto-optimizer-VPRWOWGU.js +80 -0
- package/dist/autoloop-cleanup-JOGKTLWA.js +109 -0
- package/dist/autoloop-evidence-gates-PCDALGVJ.js +38 -0
- package/dist/autoloop-gate-policy-Z7FVJVXV.js +175 -0
- package/dist/autoloop-helpers-2KTK43GL.js +22 -0
- package/dist/autoloop-ledger-W7QO62PX.js +96 -0
- package/dist/autoloop-ledger-subscriber-Z5RW5EIE.js +162 -0
- package/dist/autoloop-run-defaults-FERGRZGP.js +19 -0
- package/dist/autoloop-run-lock-CT2NWSV3.js +197 -0
- package/dist/autoloop-success-J2VKKBXQ.js +85 -0
- package/dist/autoloop-termination-summary-RN75F422.js +58 -0
- package/dist/autoloop-trajectory-XFIEXP5Z.js +282 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/autonomous-loop-controller-PW4XVFGQ.js +4120 -0
- package/dist/backend-P3DAYRP7.js +29 -0
- package/dist/background-executor-CBN552V4.js +257 -0
- package/dist/backlog-execution-intent-U4XYPTV6.js +15 -0
- package/dist/backup-active-store-5WXG6SXT.js +17 -0
- package/dist/backup-telemetry-db-XGLXAA3N.js +254 -0
- package/dist/basic-competition-master-VCSBJVRN.js +344 -0
- package/dist/branch-archive-manager-RP6FP3ZC.js +254 -0
- package/dist/branch-cleanup-manager-RSHAI7YR.js +20 -0
- package/dist/build-gate-YHGRB4QB.js +71 -0
- package/dist/change-summary-WY7J5TOX.js +33 -0
- package/dist/chunk-23A26CSN.js +123 -0
- package/dist/chunk-27UTJD3M.js +265 -0
- package/dist/chunk-2A5CILN3.js +310 -0
- package/dist/chunk-2AQUWJPW.js +225 -0
- package/dist/chunk-2BZ53J6J.js +2344 -0
- package/dist/chunk-2DY5KNVM.js +276 -0
- package/dist/chunk-2EIA4RBE.js +659 -0
- package/dist/chunk-2IUXIGQD.js +1064 -0
- package/dist/chunk-2N42MS2Z.js +2193 -0
- package/dist/chunk-2QJ3H3L7.js +42 -0
- package/dist/chunk-2QLYTVYX.js +791 -0
- package/dist/chunk-2VSQMRCB.js +18 -0
- package/dist/chunk-2XQXYBM2.js +130 -0
- package/dist/chunk-2YFUIER7.js +426 -0
- package/dist/chunk-34CNP2HB.js +148 -0
- package/dist/chunk-35P3W3JX.js +456 -0
- package/dist/chunk-36PEBZAF.js +18 -0
- package/dist/chunk-3AOKYKA7.js +22 -0
- package/dist/chunk-3BCUNHKF.js +475 -0
- package/dist/chunk-3FLXLLB7.js +26 -0
- package/dist/chunk-3FOZ2VHV.js +100 -0
- package/dist/chunk-3G6FZCRF.js +106 -0
- package/dist/chunk-3M57DADF.js +44 -0
- package/dist/chunk-3S62LLWJ.js +543 -0
- package/dist/chunk-3ZPQLGV7.js +2904 -0
- package/dist/chunk-44N5WZZH.js +45 -0
- package/dist/chunk-45FPSA3B.js +125 -0
- package/dist/chunk-4BJ3O4RQ.js +929 -0
- package/dist/chunk-4BOP7T6L.js +2321 -0
- package/dist/chunk-4BTDUT2S.js +42 -0
- package/dist/chunk-4CSS7WVI.js +143 -0
- package/dist/chunk-4CUY7AFY.js +247 -0
- package/dist/chunk-4GSN5O5J.js +62 -0
- package/dist/chunk-4HN6DF7V.js +1027 -0
- package/dist/chunk-4IAPOG5V.js +415 -0
- package/dist/chunk-4IYIZQWV.js +48 -0
- package/dist/chunk-4NXPXE62.js +84 -0
- package/dist/chunk-4RCCF5BR.js +712 -0
- package/dist/chunk-4V7NAQ4R.js +19527 -0
- package/dist/chunk-4VJITV4P.js +445 -0
- package/dist/chunk-4YX7J6QL.js +1859 -0
- package/dist/chunk-527OBWQB.js +338 -0
- package/dist/chunk-5D4A7E3D.js +448 -0
- package/dist/chunk-5DLKYTQX.js +4003 -0
- package/dist/chunk-5EERLVZB.js +139 -0
- package/dist/chunk-5H72XE4H.js +256 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5LAMRH4X.js +969 -0
- package/dist/chunk-5LTN43AS.js +1972 -0
- package/dist/chunk-5RBHQYDB.js +2206 -0
- package/dist/chunk-5WCQRDRB.js +588 -0
- package/dist/chunk-5WRLK5KW.js +700 -0
- package/dist/chunk-5ZCXC23G.js +595 -0
- package/dist/chunk-6BM72ZMG.js +31 -0
- package/dist/chunk-6EDAJH2I.js +68 -0
- package/dist/chunk-6EQKFDBH.js +457 -0
- package/dist/chunk-6MFRHTRI.js +115 -0
- package/dist/chunk-6TZJRKNW.js +321 -0
- package/dist/chunk-6V7HGQFZ.js +20 -0
- package/dist/chunk-6VWVO2TU.js +3746 -0
- package/dist/chunk-6Y5TWI7H.js +146 -0
- package/dist/chunk-6Y5U7UFY.js +91 -0
- package/dist/chunk-6ZLAK3XG.js +14 -0
- package/dist/chunk-72XCRQED.js +34 -0
- package/dist/chunk-72YTZMAM.js +589 -0
- package/dist/chunk-73BBJOKA.js +263 -0
- package/dist/chunk-73NCTWKL.js +188 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7DHRDWFS.js +3104 -0
- package/dist/chunk-7DNSNKJV.js +78 -0
- package/dist/chunk-7FMJVYBS.js +307 -0
- package/dist/chunk-7GDRQBQC.js +419 -0
- package/dist/chunk-7GPCEFUV.js +270 -0
- package/dist/chunk-7IL4A2PP.js +948 -0
- package/dist/chunk-7MMLMXO6.js +3679 -0
- package/dist/chunk-7QCZSLBH.js +1 -0
- package/dist/chunk-7R2WLDOS.js +62 -0
- package/dist/chunk-7T7RUJI7.js +949 -0
- package/dist/chunk-A2WKSVX7.js +43 -0
- package/dist/chunk-A3YGID55.js +133 -0
- package/dist/chunk-A722DEVA.js +14 -0
- package/dist/chunk-ACDIT7OP.js +1376 -0
- package/dist/chunk-ACKIPAOJ.js +302 -0
- package/dist/chunk-APPNGGN7.js +365 -0
- package/dist/chunk-APV6MK5E.js +137 -0
- package/dist/chunk-ASEP3M2W.js +968 -0
- package/dist/chunk-AT4TNPWW.js +2931 -0
- package/dist/chunk-ATVKCSGT.js +250 -0
- package/dist/chunk-AURFMVCD.js +899 -0
- package/dist/chunk-AX6GWE7V.js +47 -0
- package/dist/chunk-AY5EWJPF.js +385 -0
- package/dist/chunk-BAV2HJXS.js +194 -0
- package/dist/chunk-BBHRN366.js +89 -0
- package/dist/chunk-BBPSTTPA.js +1004 -0
- package/dist/chunk-BDATUDDJ.js +992 -0
- package/dist/chunk-BKE5PG5L.js +20414 -0
- package/dist/chunk-BLPHWMDK.js +797 -0
- package/dist/chunk-BSE4R6XD.js +322 -0
- package/dist/chunk-BXGMAU4A.js +396 -0
- package/dist/chunk-BXI4NXL3.js +507 -0
- package/dist/chunk-BZU2O43F.js +1125 -0
- package/dist/chunk-C3L6YQ7P.js +147 -0
- package/dist/chunk-C57KJOUQ.js +121 -0
- package/dist/chunk-CCV7BPSY.js +118 -0
- package/dist/chunk-CD7ISXA4.js +826 -0
- package/dist/chunk-CE5OZBYY.js +21 -0
- package/dist/chunk-CFBIG37O.js +154 -0
- package/dist/chunk-CJC6GZ46.js +457 -0
- package/dist/chunk-CKCDGXIV.js +408 -0
- package/dist/chunk-CKNX3TTP.js +10338 -0
- package/dist/chunk-CLKSETWE.js +10 -0
- package/dist/chunk-CP7H3HSP.js +1552 -0
- package/dist/chunk-CPLEWXNZ.js +66 -0
- package/dist/chunk-CQM3A35X.js +844 -0
- package/dist/chunk-CS6P76D3.js +103 -0
- package/dist/chunk-CTLUBNCW.js +622 -0
- package/dist/chunk-CUSRN6RJ.js +632 -0
- package/dist/chunk-D5EP5D2W.js +26 -0
- package/dist/chunk-D5RYINO7.js +412 -0
- package/dist/chunk-DBFS4HMH.js +751 -0
- package/dist/chunk-DC4ZYMXJ.js +115 -0
- package/dist/chunk-DCBZP442.js +9243 -0
- package/dist/chunk-DCYF7EKG.js +26 -0
- package/dist/chunk-DDMAFNUK.js +5351 -0
- package/dist/chunk-DF5SLDE4.js +966 -0
- package/dist/chunk-DJFW7SMX.js +348 -0
- package/dist/chunk-DQFLLBJW.js +121 -0
- package/dist/chunk-DSFM56OA.js +1203 -0
- package/dist/chunk-DTY4APYV.js +218 -0
- package/dist/chunk-DXH5JBRS.js +437 -0
- package/dist/chunk-E3NTPHEO.js +194 -0
- package/dist/chunk-E74LUIID.js +302 -0
- package/dist/chunk-EI57M5BI.js +194 -0
- package/dist/chunk-EJ4ZAWLV.js +305 -0
- package/dist/chunk-EJGCZGUF.js +1483 -0
- package/dist/chunk-EK2U3YEG.js +486 -0
- package/dist/chunk-ELMFYNV7.js +109 -0
- package/dist/chunk-ENRGKNR5.js +25 -0
- package/dist/chunk-ETYDXCK7.js +679 -0
- package/dist/chunk-EYRH3W74.js +239 -0
- package/dist/chunk-F23DIWNN.js +1024 -0
- package/dist/chunk-F5JO7HAS.js +94 -0
- package/dist/chunk-F7ER6ANO.js +174 -0
- package/dist/chunk-FATUVIIN.js +374 -0
- package/dist/chunk-FC23CTXV.js +322 -0
- package/dist/chunk-FD4ERYEG.js +22 -0
- package/dist/chunk-FH7WOJAE.js +79 -0
- package/dist/chunk-FHOWVDF5.js +1342 -0
- package/dist/chunk-FKAUPHMR.js +96 -0
- package/dist/chunk-FONNFJXA.js +137 -0
- package/dist/chunk-FQ7FSZRW.js +75 -0
- package/dist/chunk-FRG57FPM.js +240 -0
- package/dist/chunk-FUVP64ER.js +31 -0
- package/dist/chunk-FYOILAN5.js +6818 -0
- package/dist/chunk-G35UYQ6Z.js +69 -0
- package/dist/chunk-G36W2T2S.js +1143 -0
- package/dist/chunk-G3L2L5XZ.js +49 -0
- package/dist/chunk-G4THLFV3.js +148 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GFGYB2ZU.js +1689 -0
- package/dist/chunk-GG6KJYW6.js +85 -0
- package/dist/chunk-GHHFDU2U.js +55 -0
- package/dist/chunk-GHTZSQB7.js +57 -0
- package/dist/chunk-GK37ILCX.js +1231 -0
- package/dist/chunk-GKN3HMN4.js +2809 -0
- package/dist/chunk-GNVDBVJP.js +156 -0
- package/dist/chunk-GPEL3FBM.js +924 -0
- package/dist/chunk-GPSNGPZS.js +1604 -0
- package/dist/chunk-GSGD5E4C.js +30 -0
- package/dist/chunk-GSUQJJXQ.js +331 -0
- package/dist/chunk-GSV226X6.js +110 -0
- package/dist/chunk-H2AYQIHW.js +224 -0
- package/dist/chunk-H66DXFS5.js +1374 -0
- package/dist/chunk-H6G7QRMQ.js +35 -0
- package/dist/chunk-H7JAGHZT.js +59 -0
- package/dist/chunk-H7ZEFECA.js +316 -0
- package/dist/chunk-HAC6EHZZ.js +79 -0
- package/dist/chunk-HIO33P3G.js +19 -0
- package/dist/chunk-HMVQIPH3.js +547 -0
- package/dist/chunk-HOYBYAOA.js +257 -0
- package/dist/chunk-HX5P3CSP.js +1784 -0
- package/dist/chunk-I46EG2XQ.js +65 -0
- package/dist/chunk-I4NPDSCB.js +279 -0
- package/dist/chunk-I5WRT7ZR.js +514 -0
- package/dist/chunk-IC7I6YIJ.js +301 -0
- package/dist/chunk-IDCSOZVN.js +78 -0
- package/dist/chunk-IFCBYECK.js +112 -0
- package/dist/chunk-IFZCPEY2.js +66 -0
- package/dist/chunk-IKFP2KUR.js +48 -0
- package/dist/chunk-IRFBN336.js +878 -0
- package/dist/chunk-IUXNGKA6.js +152 -0
- package/dist/chunk-IV2RVAN7.js +1356 -0
- package/dist/chunk-IZYIQQ7X.js +53 -0
- package/dist/chunk-J3UUR7DE.js +210 -0
- package/dist/chunk-J54VUAY2.js +566 -0
- package/dist/chunk-J62KPGII.js +464 -0
- package/dist/chunk-J6P3FWWW.js +130 -0
- package/dist/chunk-JKBHJQMT.js +434 -0
- package/dist/chunk-JLS65NUQ.js +14 -0
- package/dist/chunk-JOSYEJKY.js +141 -0
- package/dist/chunk-JPKSXKNB.js +94 -0
- package/dist/chunk-JQNJB2BB.js +2440 -0
- package/dist/chunk-JRVNSWSQ.js +2626 -0
- package/dist/chunk-JSWMRQYG.js +28 -0
- package/dist/chunk-JZKNBBIB.js +152 -0
- package/dist/chunk-K54Y7MLK.js +160 -0
- package/dist/chunk-K65546RE.js +183 -0
- package/dist/chunk-KM3F7SYE.js +702 -0
- package/dist/chunk-KNDYMVWN.js +102 -0
- package/dist/chunk-KNT72VR6.js +132 -0
- package/dist/chunk-KP6YILMU.js +482 -0
- package/dist/chunk-KQEBSK3T.js +274 -0
- package/dist/chunk-KT6VHSPF.js +84 -0
- package/dist/chunk-KTMW65UX.js +14 -0
- package/dist/chunk-KZ5CJVBP.js +1813 -0
- package/dist/chunk-L4427KOE.js +26 -0
- package/dist/chunk-L6OM4A22.js +189 -0
- package/dist/chunk-L7E6XCRA.js +1042 -0
- package/dist/chunk-L7JZLXQL.js +173 -0
- package/dist/chunk-LAMKBTXX.js +40 -0
- package/dist/chunk-LDCF2MKN.js +132 -0
- package/dist/chunk-LEIIWPWQ.js +78 -0
- package/dist/chunk-LFTQVYBB.js +31 -0
- package/dist/chunk-LG3PDRTR.js +2872 -0
- package/dist/chunk-LGHII5ET.js +23 -0
- package/dist/chunk-LH5QY22X.js +1205 -0
- package/dist/chunk-LIVJ6266.js +438 -0
- package/dist/chunk-LKRAR3IH.js +276 -0
- package/dist/chunk-LO23NABI.js +3063 -0
- package/dist/chunk-LO3X5NLS.js +326 -0
- package/dist/chunk-LPITVM7M.js +339 -0
- package/dist/chunk-LR5IJIGV.js +810 -0
- package/dist/chunk-LRGMHROI.js +79 -0
- package/dist/chunk-LUVKFFWR.js +315 -0
- package/dist/chunk-LWCBNGH6.js +35 -0
- package/dist/chunk-LWTN3WRV.js +260 -0
- package/dist/chunk-M3HQYKQX.js +308 -0
- package/dist/chunk-M6GVSPEH.js +1016 -0
- package/dist/chunk-MF5HP6XV.js +221 -0
- package/dist/chunk-MHLCBZJB.js +328 -0
- package/dist/chunk-MN6PL4AN.js +120 -0
- package/dist/chunk-MOEY65Z6.js +5678 -0
- package/dist/chunk-MQ4WA34C.js +206 -0
- package/dist/chunk-MWHF5V7U.js +223 -0
- package/dist/chunk-MWHLBPNU.js +211 -0
- package/dist/chunk-MWK5UZQ3.js +1068 -0
- package/dist/chunk-MYLH2S4G.js +64 -0
- package/dist/chunk-MZ5WYKNA.js +28 -0
- package/dist/chunk-N4VTRA7K.js +131 -0
- package/dist/chunk-N5DX4JAK.js +12 -0
- package/dist/chunk-N65O4XTH.js +5011 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NGK6PEOG.js +25 -0
- package/dist/chunk-NJVD4PWE.js +1033 -0
- package/dist/chunk-NM6PMYY4.js +768 -0
- package/dist/chunk-NN4PJDHP.js +708 -0
- package/dist/chunk-NP2V3L7K.js +226 -0
- package/dist/chunk-NRLY536M.js +260 -0
- package/dist/chunk-NRNE225N.js +1270 -0
- package/dist/chunk-NS2K2GTP.js +605 -0
- package/dist/chunk-NS33V3IM.js +51 -0
- package/dist/chunk-NSHASMZZ.js +71 -0
- package/dist/chunk-NWOYOA6H.js +378 -0
- package/dist/chunk-NWRUSEXG.js +322 -0
- package/dist/chunk-NZGDAWIP.js +1905 -0
- package/dist/chunk-O47UOKU3.js +395 -0
- package/dist/chunk-O4G2W3ST.js +9831 -0
- package/dist/chunk-O6V4PNLO.js +63 -0
- package/dist/chunk-OA4GPILI.js +624 -0
- package/dist/chunk-OGMSYL6J.js +227 -0
- package/dist/chunk-OIS7J26S.js +319 -0
- package/dist/chunk-OMX5VL43.js +79 -0
- package/dist/chunk-ON3G73BU.js +264 -0
- package/dist/chunk-OPYFYTWQ.js +220 -0
- package/dist/chunk-OQ6K46CK.js +1734 -0
- package/dist/chunk-OYZYO7TV.js +47 -0
- package/dist/chunk-OZ4REHIN.js +4386 -0
- package/dist/chunk-P47VN5F4.js +282 -0
- package/dist/chunk-P5I4X7A7.js +353 -0
- package/dist/chunk-P6VQROCO.js +594 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-PCAGC5MR.js +1763 -0
- package/dist/chunk-PFTQBXS6.js +5181 -0
- package/dist/chunk-PGSPX4SU.js +15 -0
- package/dist/chunk-PIKLF7BM.js +432 -0
- package/dist/chunk-PJWJ3SAV.js +22 -0
- package/dist/chunk-PKIFMV72.js +100 -0
- package/dist/chunk-PL37JDNA.js +189 -0
- package/dist/chunk-PTH5E5XO.js +195 -0
- package/dist/chunk-PW6AXLQC.js +4128 -0
- package/dist/chunk-PYITM4N2.js +79 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-Q3RO7N35.js +45 -0
- package/dist/chunk-Q3WIC6GQ.js +2670 -0
- package/dist/chunk-Q5XIXSHX.js +271 -0
- package/dist/chunk-QGJDMEOV.js +34 -0
- package/dist/chunk-QNOB37UH.js +58 -0
- package/dist/chunk-QOCOVLUH.js +462 -0
- package/dist/chunk-QTCJ5CC5.js +172 -0
- package/dist/chunk-QVFV5IP2.js +232 -0
- package/dist/chunk-QVZMFDYG.js +29 -0
- package/dist/chunk-R35PEUKH.js +511 -0
- package/dist/chunk-R4UWBC35.js +200 -0
- package/dist/chunk-R6MLCREW.js +44 -0
- package/dist/chunk-R6W23LKN.js +254 -0
- package/dist/chunk-R7XDDX2A.js +4007 -0
- package/dist/chunk-RDFRCT64.js +168 -0
- package/dist/chunk-RE5VZDFQ.js +58 -0
- package/dist/chunk-RGROYC2G.js +638 -0
- package/dist/chunk-RGWHUI5E.js +68 -0
- package/dist/chunk-RHVG6UNL.js +205 -0
- package/dist/chunk-RI4EX2QE.js +18 -0
- package/dist/chunk-RJAAKDRX.js +17 -0
- package/dist/chunk-ROMHOSMQ.js +185 -0
- package/dist/chunk-RWREC3KJ.js +517 -0
- package/dist/chunk-RYNETRDJ.js +118 -0
- package/dist/chunk-RZY7RKM5.js +500 -0
- package/dist/chunk-S2MNWFAG.js +52 -0
- package/dist/chunk-S2VQCZO4.js +22 -0
- package/dist/chunk-S54MKU6V.js +117 -0
- package/dist/chunk-S5OIDFRM.js +302 -0
- package/dist/chunk-SCW4ZF6R.js +150 -0
- package/dist/chunk-SLS2N4PH.js +2213 -0
- package/dist/chunk-SNLBO4BF.js +247 -0
- package/dist/chunk-SP3LFU6B.js +60 -0
- package/dist/chunk-SQQTDDQA.js +537 -0
- package/dist/chunk-STV6LYYE.js +45 -0
- package/dist/chunk-SURZ2WFE.js +326 -0
- package/dist/chunk-SZ7DL357.js +1047 -0
- package/dist/chunk-T5E4NQCM.js +5742 -0
- package/dist/chunk-TAJPCXSB.js +13 -0
- package/dist/chunk-TAOOYK3P.js +358 -0
- package/dist/chunk-TDSEX5CF.js +24 -0
- package/dist/chunk-TFTGP7Z7.js +174 -0
- package/dist/chunk-TGON4N4O.js +197 -0
- package/dist/chunk-TGQZHDY2.js +2373 -0
- package/dist/chunk-TJJZ2OKV.js +6783 -0
- package/dist/chunk-TRSVUPCX.js +25 -0
- package/dist/chunk-TSXGRLPR.js +107 -0
- package/dist/chunk-U2S3YEX3.js +224 -0
- package/dist/chunk-U45RTRGY.js +818 -0
- package/dist/chunk-U6C3VVWS.js +13 -0
- package/dist/chunk-UDMS5AD3.js +307 -0
- package/dist/chunk-UGX7GI37.js +94 -0
- package/dist/chunk-UH3JJSHK.js +1 -0
- package/dist/chunk-UHRBTZYY.js +208 -0
- package/dist/chunk-UHT2KRG5.js +193 -0
- package/dist/chunk-UI2F6DJ5.js +118 -0
- package/dist/chunk-UMAKSB4Z.js +284 -0
- package/dist/chunk-UR2IBGIM.js +521 -0
- package/dist/chunk-UUH2RVKS.js +585 -0
- package/dist/chunk-UVJ4PJDK.js +4533 -0
- package/dist/chunk-V53UG2OT.js +9924 -0
- package/dist/chunk-V72RMBM4.js +48 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VNSYKC25.js +24 -0
- package/dist/chunk-VPHVFK4A.js +1984 -0
- package/dist/chunk-VTLNJQ44.js +133 -0
- package/dist/chunk-VTW7HP3R.js +100 -0
- package/dist/chunk-VVGEPBPS.js +218 -0
- package/dist/chunk-VVLLL7I4.js +166 -0
- package/dist/chunk-VX3UMWB7.js +483 -0
- package/dist/chunk-VXF4Q3FW.js +20 -0
- package/dist/chunk-W3JMT2YY.js +712 -0
- package/dist/chunk-WDUORIHF.js +877 -0
- package/dist/chunk-WDVTY4U6.js +148 -0
- package/dist/chunk-WIFZCHEG.js +12566 -0
- package/dist/chunk-WIRN3F75.js +736 -0
- package/dist/chunk-WMPU2UOV.js +82 -0
- package/dist/chunk-WTOKKE2V.js +784 -0
- package/dist/chunk-WX5IRLF6.js +740 -0
- package/dist/chunk-WZ6U3O7I.js +1581 -0
- package/dist/chunk-XAONGNST.js +57 -0
- package/dist/chunk-XB5YLCLB.js +13 -0
- package/dist/chunk-XEP5NQ5Y.js +688 -0
- package/dist/chunk-XGYF2QMZ.js +351 -0
- package/dist/chunk-XHEKQENB.js +255 -0
- package/dist/chunk-XNO4FM6X.js +1124 -0
- package/dist/chunk-XPHKYHO4.js +878 -0
- package/dist/chunk-XPK2I4NC.js +405 -0
- package/dist/chunk-XPU2XADL.js +2175 -0
- package/dist/chunk-XQD2B6BB.js +507 -0
- package/dist/chunk-XT2ZQVTC.js +558 -0
- package/dist/chunk-XTXJGGUV.js +351 -0
- package/dist/chunk-XUXVDPSZ.js +50 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XZE4XARH.js +563 -0
- package/dist/chunk-XZYR5EDO.js +152 -0
- package/dist/chunk-Y3J4JMTU.js +61 -0
- package/dist/chunk-Y55LZN5U.js +52 -0
- package/dist/chunk-Y5VN7DMP.js +112 -0
- package/dist/chunk-Y67VAHN4.js +459 -0
- package/dist/chunk-YAXSKEUH.js +3544 -0
- package/dist/chunk-YB3JD4E6.js +975 -0
- package/dist/chunk-YESZJFK6.js +220 -0
- package/dist/chunk-YGXKOBQQ.js +292 -0
- package/dist/chunk-YMX76IOS.js +31 -0
- package/dist/chunk-YOTXESEH.js +257 -0
- package/dist/chunk-YTYIEZQY.js +119 -0
- package/dist/chunk-YVORHQ2S.js +579 -0
- package/dist/chunk-Z2CUQDAR.js +3429 -0
- package/dist/chunk-Z2KYOFHS.js +7000 -0
- package/dist/chunk-Z6PC7QX6.js +161 -0
- package/dist/chunk-ZDTGECTN.js +235 -0
- package/dist/chunk-ZIPWI2LY.js +151 -0
- package/dist/chunk-ZSKKMTQJ.js +554 -0
- package/dist/chunk-ZTT5IVPY.js +1160 -0
- package/dist/chunk-ZX65UI5W.js +78 -0
- package/dist/chunk-ZYG7GGKO.js +218 -0
- package/dist/chunk-ZZZUL4OF.js +38 -0
- package/dist/cli-utils-IXL26KJT.js +40 -0
- package/dist/cli-validation-WLXWLUJL.js +111 -0
- package/dist/commit-utils-P7CRJF5N.js +202 -0
- package/dist/compete-config-resolver-R5ULXMYH.js +76 -0
- package/dist/compete-request-62JESVET.js +364 -0
- package/dist/compete-results-QEPG6FZX.js +208 -0
- package/dist/competition-outcome-tracker-R32OOZ43.js +38 -0
- package/dist/config-JCOKXOQT.js +166 -0
- package/dist/config-audit-EL3GHXS7.js +360 -0
- package/dist/config-explain-TNILDEVJ.js +12 -0
- package/dist/config-loader-VPFPFO4B.js +38 -0
- package/dist/config-manager-7T4E2BQO.js +67 -0
- package/dist/config-validator-KKOHOW7O.js +72 -0
- package/dist/cost-YC42XUF3.js +53 -0
- package/dist/coverage-orchestrator-CISNKJC2.js +772 -0
- package/dist/coverage-scanner-YVD62MLH.js +12 -0
- package/dist/createCompetitionRunner-LJG6ZQSO.js +46 -0
- package/dist/data-migration-state-VJK64DLT.js +31 -0
- package/dist/db-migrator-XSEIOGWY.js +34 -0
- package/dist/discovery-JGYGDD25.js +25 -0
- package/dist/doctor-GJOYE7AE.js +186 -0
- package/dist/domain-analyzer-AWF3RP6E.js +29 -0
- package/dist/ensure-initialized-744DIZEZ.js +52 -0
- package/dist/entry.js +940 -0
- package/dist/environment-YS45U5ZI.js +81 -0
- package/dist/error-parser-core-PPZ36A4S.js +50 -0
- package/dist/escalation-ladder-MKTCEGSA.js +130 -0
- package/dist/evaluation-context-KV4GZNN7.js +35 -0
- package/dist/evidence-plan-resolver-GBSYSAPX.js +85 -0
- package/dist/execution-data-writer-3ODTBDLH.js +53 -0
- package/dist/execution-policy-applier-ZHD3DCF3.js +31 -0
- package/dist/execution-preflight-Z4Y64V3I.js +209 -0
- package/dist/execution-roles-R3DPPMD3.js +66 -0
- package/dist/exit-code-error-Z4SW2DVK.js +14 -0
- package/dist/external-temp-cleanup-N2RZH4QP.js +311 -0
- package/dist/factory-XBN7DFIM.js +149 -0
- package/dist/file-utils-XIVR2ZMA.js +47 -0
- package/dist/flywheel-autoloop-executor-UILGOFFK.js +249 -0
- package/dist/flywheel-competition-executor-JOBEXTRB.js +259 -0
- package/dist/flywheel-executor-6JFLA6J5.js +369 -0
- package/dist/flywheel-git-isolation-UC5NIEVU.js +48 -0
- package/dist/flywheel-manifest-5UC4VBMA.js +108 -0
- package/dist/flywheel-model-defaults-7CVKP53V.js +27 -0
- package/dist/flywheel-preflight-XEY5SHM6.js +104 -0
- package/dist/flywheel-resume-7HELH7QS.js +23 -0
- package/dist/flywheel-safety-7U7DPOAP.js +28 -0
- package/dist/flywheel-scope-decision-ZHKF6ZIN.js +11 -0
- package/dist/get-telemetry-logger-DPVWWIYY.js +73 -0
- package/dist/git-worktree-IY6V6DUO.js +18 -0
- package/dist/github-pr-manager-4LXEKJTA.js +211 -0
- package/dist/guidance-profile-config-E7XJL2VP.js +117 -0
- package/dist/guidance-profile-renderer-QK2YMAAP.js +21 -0
- package/dist/index-query-4JEUKA44.js +31 -0
- package/dist/index.js +108661 -0
- package/dist/instructions-6BURLQJC.js +64 -0
- package/dist/invoke-provider-auth-GRUYP44M.js +223 -0
- package/dist/judge-scoring.json +80 -0
- package/dist/judge-test.js +555 -0
- package/dist/lab-mode-OTWVHN63.js +39 -0
- package/dist/lab-utils-BJRFLGK4.js +23 -0
- package/dist/linux-host-class-UY4KVLFD.js +29 -0
- package/dist/llm-judge-executor-F7Z3HO77.js +133 -0
- package/dist/local-executor-CEHWE2PL.js +223 -0
- package/dist/logger-33TR6EE5.js +72 -0
- package/dist/loop-spec-XTLQAVZ7.js +191 -0
- package/dist/manager-2HJG5CLT.js +25 -0
- package/dist/matrix-prompt-builder-6UDN5X3F.js +497 -0
- package/dist/matrix-result-parser-7W35EUOV.js +15 -0
- package/dist/metadata-HQ43NDEK.js +22 -0
- package/dist/model-invocations-db-QBO4Y7WZ.js +38 -0
- package/dist/monitor-XGYBG2DW.js +72 -0
- package/dist/next-PB5ZXZKB.js +90 -0
- package/dist/next-ZBDK725T.js +69 -0
- package/dist/optimization-config-resolver-O6WKR47U.js +75 -0
- package/dist/package-3YCWIQQ5.js +10 -0
- package/dist/parallel-orchestrator-NL7YJJU2.js +297 -0
- package/dist/parallel-worker.js +279 -0
- package/dist/parse-git-status-PIAF3OTP.js +10 -0
- package/dist/path-security-ETTH6TZL.js +39 -0
- package/dist/pattern-bank-UNJR5ADV.js +15 -0
- package/dist/plan-backlog-list-fast-VAGYBV3J.js +270 -0
- package/dist/plan-backlog-show-fast-SG2CZPW3.js +406 -0
- package/dist/plan-sprint-list-fast-LURAX47V.js +162 -0
- package/dist/plan-sprint-status-fast-FJAODCHD.js +208 -0
- package/dist/plan-task-status-fast-HNYBMQI4.js +349 -0
- package/dist/plan-to-flywheel-Z4U3GWPN.js +456 -0
- package/dist/planning-backlog-3CQ5QQBQ.js +319 -0
- package/dist/poetic-root-V5DNXEAE.js +17 -0
- package/dist/preflight-OPANWMME.js +12 -0
- package/dist/process-registry-PDZJPTAS.js +27 -0
- package/dist/process-scanner-C22SYXYD.js +22 -0
- package/dist/processes-KMQUD7HY.js +29 -0
- package/dist/processes-json-fast-IBDXZ6WW.js +135 -0
- package/dist/profile-SE5EVXAP.js +149 -0
- package/dist/prompts-WZZPGWBX.js +168 -0
- package/dist/protected-branches-RNTEX7ET.js +57 -0
- package/dist/provider-aware-resource-manager-QBTZJMNP.js +18 -0
- package/dist/provider-matrix-N5X57V3Y.js +154 -0
- package/dist/provider-matrix-renderer-MZDWKKID.js +139 -0
- package/dist/provider-output-forwarding-DERID3TP.js +30 -0
- package/dist/provider-registry-J5NRBJKI.js +128 -0
- package/dist/provider-temp-cleanup-KYGLF6YU.js +14 -0
- package/dist/prune-engine-Q6E2DXBN.js +451 -0
- package/dist/quality-gate-YRHMQAEI.js +70 -0
- package/dist/quickstart-FIRLKGJI.js +62 -0
- package/dist/readiness-VZTMSG6J.js +96 -0
- package/dist/registry-YODFY77A.js +153 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-2IGD4H7X.js +22 -0
- package/dist/resolution-engine-D6TX6FRG.js +127 -0
- package/dist/resolve-provider-cli-O2P6XZBZ.js +35 -0
- package/dist/restore-telemetry-db-BQL6DTQF.js +360 -0
- package/dist/result-streamer-WEHW476R.js +19 -0
- package/dist/routing-events-DHPUZDDF.js +27 -0
- package/dist/routing-history-store-UWCEXAP3.js +46 -0
- package/dist/routing-planner-F5WQEUOM.js +160 -0
- package/dist/run-poetic-tui-J6LWRJUP.js +13517 -0
- package/dist/run-simulation.js +376 -0
- package/dist/runner-CS2TNGHA.js +1092 -0
- package/dist/runner-HHH7ZN2Z.js +1571 -0
- package/dist/safety-OCC4KJJR.js +64 -0
- package/dist/safety-stanza-7SV3HGG3.js +60 -0
- package/dist/sandbox-32QXJEMV.js +81 -0
- package/dist/sandbox-RSO7VP6V.js +94 -0
- package/dist/schema-extensions.sql +234 -0
- package/dist/security-2KI5XNDG.js +17 -0
- package/dist/setup-bb-plugin-QAQWZCV5.js +738 -0
- package/dist/setup-claude-code-P7BTTSPO.js +317 -0
- package/dist/setup-temp-cleanup-GASCWZ2I.js +20 -0
- package/dist/shared-utils-D6U6UREP.js +37 -0
- package/dist/simple-artifact-goal-OTXNGZY6.js +25 -0
- package/dist/sprint-UIXPYOXQ.js +338 -0
- package/dist/sprint-bridge-4BHMSC3M.js +68 -0
- package/dist/sprint-execution-service-2B7WHL5L.js +311 -0
- package/dist/sprint-manager-IDQUDNQI.js +91 -0
- package/dist/sqlite-wrapper-UDWCTNLJ.js +17 -0
- package/dist/stale-cleanup-orchestrator-XWXV7KCZ.js +62 -0
- package/dist/storage-access-F6ALDN4S.js +22 -0
- package/dist/synthesis-XD6EDVHF.js +185 -0
- package/dist/task-classifier-LNLXSHOM.js +494 -0
- package/dist/task-list-fast-PTMA4LUC.js +147 -0
- package/dist/task-manager-XAT7GOWB.js +93 -0
- package/dist/task-splitter-U7DJ7W6A.js +79 -0
- package/dist/task-type-detector-OLVOMXZO.js +21 -0
- package/dist/task-type-resolver-KKNQYSB4.js +42 -0
- package/dist/telemetry-5HWBBXLX.js +131 -0
- package/dist/telemetry-health-tracker-DMSSGBZ2.js +11 -0
- package/dist/telemetry-path-resolver-7ICSG276.js +28 -0
- package/dist/telemetry-reliability-XUOZNZZ6.js +125 -0
- package/dist/token-estimator-MEQUL3EJ.js +37 -0
- package/dist/transports-KNSSV2V4.js +255 -0
- package/dist/unified-cost-tracker-4TFRBVPR.js +35 -0
- package/dist/unified-state-cleanup-LJPF2BOW.js +276 -0
- package/dist/universal-cost-calculator-BAJV35GA.js +42 -0
- package/dist/user-agents-GHUGCSKN.js +22 -0
- package/dist/variant-delivery-state-KLRNG6XA.js +33 -0
- package/dist/variant-state-cleanup-MZGGLQAJ.js +280 -0
- package/dist/variant-success-PJXWE3ZV.js +12 -0
- package/dist/variant-worker-KUWKBLAH.js +4196 -0
- package/dist/variant-worker.js +24 -0
- package/dist/variants-JE2FSAQS.js +233 -0
- package/dist/verification-toolchains-V24UHW6Q.js +28 -0
- package/dist/verify-commands-H3DTCSGI.js +37 -0
- package/dist/warning-EGQGUUIO.js +12 -0
- package/dist/work-edge-RWEDWJZF.js +49 -0
- package/dist/work-item-writer-WHAVZXAY.js +19 -0
- package/dist/worker-7SA2VS2Y.js +1435 -0
- package/dist/worker.js +19 -0
- package/dist/worktree-metrics-3DFUYVYE.js +26 -0
- package/dist/writeback-VZKHYHSN.js +44 -0
- package/docs/CLI_REFERENCE.md +7042 -0
- package/docs/PROVIDER_SETUP.md +1570 -0
- package/docs/README.md +96 -0
- package/docs/TROUBLESHOOTING.md +2232 -0
- package/docs/getting-started/QUICK_START.md +294 -0
- package/docs/getting-started/README.md +188 -0
- package/docs/getting-started/SETUP.md +52 -0
- package/docs/reference/AGENT_CONTEXT.md +38 -0
- package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
- package/docs/reference/README.md +381 -0
- package/docs/reference/SECURITY.md +262 -0
- package/integrations/bb-plugin-poetic/README.md +362 -0
- package/integrations/bb-plugin-poetic/app.css +341 -0
- package/integrations/bb-plugin-poetic/app.tsx +5059 -0
- package/integrations/bb-plugin-poetic/package.json +45 -0
- package/integrations/bb-plugin-poetic/server.ts +444 -0
- package/integrations/bb-plugin-poetic/src/adapter.ts +3312 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-model.ts +150 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-schema.ts +355 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-service.ts +419 -0
- package/integrations/bb-plugin-poetic/src/backlog-authoring-view.ts +1026 -0
- package/integrations/bb-plugin-poetic/src/competition-defaults-schema.ts +122 -0
- package/integrations/bb-plugin-poetic/src/competition-defaults-service.ts +105 -0
- package/integrations/bb-plugin-poetic/src/competition-defaults-view.ts +138 -0
- package/integrations/bb-plugin-poetic/src/contract.ts +615 -0
- package/integrations/bb-plugin-poetic/src/finalize-model.ts +205 -0
- package/integrations/bb-plugin-poetic/src/finalize-schema.ts +158 -0
- package/integrations/bb-plugin-poetic/src/finalize-service.ts +382 -0
- package/integrations/bb-plugin-poetic/src/finalize-view.ts +159 -0
- package/integrations/bb-plugin-poetic/src/judge-operations-readback.ts +303 -0
- package/integrations/bb-plugin-poetic/src/judge-operations-schema.ts +33 -0
- package/integrations/bb-plugin-poetic/src/judge-operations-view.ts +459 -0
- package/integrations/bb-plugin-poetic/src/model.ts +1302 -0
- package/integrations/bb-plugin-poetic/src/monitor-service.ts +233 -0
- package/integrations/bb-plugin-poetic/src/panel-read-ux.ts +97 -0
- package/integrations/bb-plugin-poetic/src/patch-preview-schema.ts +166 -0
- package/integrations/bb-plugin-poetic/src/patch-preview-service.ts +480 -0
- package/integrations/bb-plugin-poetic/src/patch-preview-view.ts +109 -0
- package/integrations/bb-plugin-poetic/src/planning-readback.ts +204 -0
- package/integrations/bb-plugin-poetic/src/planning-service.ts +594 -0
- package/integrations/bb-plugin-poetic/src/planning-workspace-schema.ts +95 -0
- package/integrations/bb-plugin-poetic/src/planning-workspace.ts +323 -0
- package/integrations/bb-plugin-poetic/src/poll-handoff.ts +136 -0
- package/integrations/bb-plugin-poetic/src/project-target-server.ts +21 -0
- package/integrations/bb-plugin-poetic/src/project-target.ts +45 -0
- package/integrations/bb-plugin-poetic/src/reference-index.ts +192 -0
- package/integrations/bb-plugin-poetic/src/repository-schema.ts +30 -0
- package/integrations/bb-plugin-poetic/src/result-explorer-view.ts +597 -0
- package/integrations/bb-plugin-poetic/src/result-readback-model.ts +163 -0
- package/integrations/bb-plugin-poetic/src/result-readback-schema.ts +319 -0
- package/integrations/bb-plugin-poetic/src/result-readback-service.ts +333 -0
- package/integrations/bb-plugin-poetic/src/run-page-view.ts +177 -0
- package/integrations/bb-plugin-poetic/src/setup-config-schema.ts +291 -0
- package/integrations/bb-plugin-poetic/src/setup-config-service.ts +590 -0
- package/integrations/bb-plugin-poetic/src/setup-config-view.ts +413 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-model.ts +150 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-schema.ts +136 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-service.ts +341 -0
- package/integrations/bb-plugin-poetic/src/sprint-close-view.ts +116 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-model.ts +714 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-readback.ts +231 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-schema.ts +601 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-service.ts +775 -0
- package/integrations/bb-plugin-poetic/src/sprint-composition-view.ts +1221 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-model.ts +567 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-schema.ts +635 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-service.ts +842 -0
- package/integrations/bb-plugin-poetic/src/task-authoring-view.ts +1227 -0
- package/integrations/bb-plugin-poetic/src/task-detail-readback.ts +56 -0
- package/integrations/bb-plugin-poetic/src/task-detail-schema.ts +144 -0
- package/integrations/bb-plugin-poetic/src/task-navigation.ts +446 -0
- package/integrations/bb-plugin-poetic/src/workbench-route.ts +74 -0
- package/integrations/bb-plugin-poetic/tests/host-contract.test.ts +773 -0
- package/integrations/bb-plugin-poetic/tsconfig.json +18 -0
- package/integrations/bb-plugin-poetic/types/PROVENANCE.json +52 -0
- package/integrations/bb-plugin-poetic/types/bb-plugin-sdk-app.d.ts +1444 -0
- package/integrations/bb-plugin-poetic/types/bb-plugin-sdk.d.ts +13030 -0
- package/integrations/bb-plugin-poetic/vitest.host.config.ts +71 -0
- package/npm-shrinkwrap.json +4950 -0
- package/package.json +331 -0
- package/schemas/README.md +80 -0
- package/schemas/config-v1.schema.json +136 -0
- package/schemas/execution-config.schema.json +47 -0
- package/schemas/judge-scoring.schema.json +370 -0
- package/schemas/poetic.config.schema.json +2214 -0
- package/schemas/provider-config.schema.json +203 -0
- package/schemas/telemetry-config.schema.json +79 -0
- package/schemas/user-preferences.schema.json +141 -0
- package/scripts/assert-node-runtime.mjs +140 -0
- package/scripts/preflight-native.mjs +49 -0
- package/scripts/preinstall-node-check.mjs +78 -0
- package/scripts/setup-git-hooks.mjs +24 -0
- package/scripts/sync.sh +2722 -0
- package/scripts/write-node-launcher.sh +108 -0
- package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
- package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
- package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
- package/templates/.poetic/README.md +37 -0
- package/templates/.poetic/agents/README.md +296 -0
- package/templates/.poetic/agents/api-documenter.md +147 -0
- package/templates/.poetic/agents/backend-architect.md +31 -0
- package/templates/.poetic/agents/code-reviewer.md +157 -0
- package/templates/.poetic/agents/data-scientist.md +179 -0
- package/templates/.poetic/agents/database-optimizer.md +145 -0
- package/templates/.poetic/agents/debugger.md +31 -0
- package/templates/.poetic/agents/deployment-engineer.md +164 -0
- package/templates/.poetic/agents/devops-troubleshooter.md +139 -0
- package/templates/.poetic/agents/frontend-developer.md +150 -0
- package/templates/.poetic/agents/javascript-pro.md +36 -0
- package/templates/.poetic/agents/performance-engineer.md +151 -0
- package/templates/.poetic/agents/python-pro.md +137 -0
- package/templates/.poetic/agents/test-automator.md +147 -0
- package/templates/.poetic/agents/typescript-pro.md +34 -0
- package/templates/.poetic/config/poetic.config.jsonc +69 -0
- package/templates/.poetic/config/project-context.template.json +6 -0
- package/templates/.poetic/config/task-type-aliases.presets/kanban.yaml +14 -0
- package/templates/.poetic/config/task-type-aliases.presets/scrum.yaml +17 -0
- package/templates/.poetic/config/task-type-aliases.presets/xp.yaml +12 -0
- package/templates/.poetic/config/task-type-aliases.yaml +28 -0
- package/templates/.poetic/gitignore.template +55 -0
- package/templates/.poetic/task-types/analysis.yaml +40 -0
- package/templates/.poetic/task-types/architecture.yaml +38 -0
- package/templates/.poetic/task-types/doc.yaml +35 -0
- package/templates/.poetic/task-types/feature.yaml +23 -0
- package/templates/.poetic/task-types/general.yaml +6 -0
- package/templates/.poetic/task-types/security.yaml +39 -0
- package/templates/AGENTS.template.md +99 -0
- package/templates/CLAUDE.template.md +1 -0
- package/templates/GEMINI.template.md +1 -0
- package/templates/builtin-workflows/code-review.yaml +73 -0
- package/templates/builtin-workflows/compete-streak.yaml +78 -0
- package/templates/builtin-workflows/hello-verify.yaml +10 -0
- package/templates/builtin-workflows/judge-regression.yaml +114 -0
- package/templates/builtin-workflows/skills/code-review/SKILL.md +60 -0
- package/templates/builtin-workflows/skills/hello-verify/SKILL.md +6 -0
- package/templates/guard-kit/GUARD_SETUP.md.template +255 -0
- package/templates/guard-kit/check.mjs.template +777 -0
- package/templates/guard-kit/config.json.template +6 -0
- package/templates/guard-kit/poetic-guard.yml.template +189 -0
- package/templates/profiles/README.md +56 -0
- package/templates/profiles/frontier-claude.json +27 -0
- package/templates/profiles/frontier-codex.json +26 -0
|
@@ -0,0 +1,1376 @@
|
|
|
1
|
+
import {
|
|
2
|
+
parsePromptSpec
|
|
3
|
+
} from "./chunk-7T7RUJI7.js";
|
|
4
|
+
import {
|
|
5
|
+
stripPoeticContextBlocks
|
|
6
|
+
} from "./chunk-VX3UMWB7.js";
|
|
7
|
+
import {
|
|
8
|
+
redactBlockerContext
|
|
9
|
+
} from "./chunk-XV7NZL4B.js";
|
|
10
|
+
|
|
11
|
+
// src/planning/blocker-types.ts
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
var BlockerCategorySchema = z.enum([
|
|
14
|
+
"credentials",
|
|
15
|
+
"design_decisions",
|
|
16
|
+
"external_dependencies",
|
|
17
|
+
"ambiguities"
|
|
18
|
+
]);
|
|
19
|
+
var BlockerSeveritySchema = z.enum(["must_have", "nice_to_have"]);
|
|
20
|
+
var EnvRefAnswerSchema = z.object({
|
|
21
|
+
answer_type: z.literal("env_ref"),
|
|
22
|
+
env_var: z.string().min(1)
|
|
23
|
+
});
|
|
24
|
+
var TextAnswerSchema = z.object({
|
|
25
|
+
answer_type: z.literal("text"),
|
|
26
|
+
value: z.string()
|
|
27
|
+
});
|
|
28
|
+
var BlockerAnswerSchema = z.discriminatedUnion("answer_type", [
|
|
29
|
+
EnvRefAnswerSchema,
|
|
30
|
+
TextAnswerSchema
|
|
31
|
+
]);
|
|
32
|
+
var BlockerSchema = z.object({
|
|
33
|
+
id: z.string().min(1),
|
|
34
|
+
category: BlockerCategorySchema,
|
|
35
|
+
severity: BlockerSeveritySchema,
|
|
36
|
+
question: z.string().min(1),
|
|
37
|
+
stageIds: z.array(z.string()),
|
|
38
|
+
default: z.preprocess((value) => value == null ? void 0 : value, z.string().optional())
|
|
39
|
+
});
|
|
40
|
+
var BlockerAnalysisPayloadSchema = z.object({
|
|
41
|
+
blockers: z.array(BlockerSchema)
|
|
42
|
+
}).passthrough();
|
|
43
|
+
var BlockerAnalysisConfidenceSchema = z.enum(["confirmed", "degraded", "failed"]);
|
|
44
|
+
var AnsweredBlockerSchema = z.object({
|
|
45
|
+
blockerId: z.string(),
|
|
46
|
+
category: BlockerCategorySchema,
|
|
47
|
+
severity: BlockerSeveritySchema.optional(),
|
|
48
|
+
answer: BlockerAnswerSchema,
|
|
49
|
+
answeredBy: z.enum(["human", "default_accepted"])
|
|
50
|
+
}).refine(
|
|
51
|
+
(data) => {
|
|
52
|
+
if (data.category === "credentials" && data.answer.answer_type !== "env_ref") {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
message: 'Credential blockers must use answer_type "env_ref", never "text"'
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
var BlockerAnswerFileSchema = z.object({
|
|
62
|
+
runId: z.string(),
|
|
63
|
+
timestamp: z.number(),
|
|
64
|
+
answers: z.array(AnsweredBlockerSchema),
|
|
65
|
+
unanswered: z.array(z.string())
|
|
66
|
+
});
|
|
67
|
+
var PendingBlockerManifestSchema = z.object({
|
|
68
|
+
runId: z.string(),
|
|
69
|
+
timestamp: z.number(),
|
|
70
|
+
intent: z.string().optional(),
|
|
71
|
+
blockers: z.array(BlockerSchema),
|
|
72
|
+
unanswered: z.array(z.string())
|
|
73
|
+
});
|
|
74
|
+
var BLOCKER_CONTEXT_START = "<!-- BLOCKER_CONTEXT:START provenance=blocker-injection -->";
|
|
75
|
+
var BLOCKER_CONTEXT_END = "<!-- BLOCKER_CONTEXT:END -->";
|
|
76
|
+
|
|
77
|
+
// src/planning/blocker-criteria.ts
|
|
78
|
+
function deriveBlockerCriteria(entries) {
|
|
79
|
+
const criteria = [];
|
|
80
|
+
const skippedBlockerIds = [];
|
|
81
|
+
const seen = /* @__PURE__ */ new Set();
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
if (seen.has(entry.blockerId)) {
|
|
84
|
+
skippedBlockerIds.push(entry.blockerId);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
seen.add(entry.blockerId);
|
|
88
|
+
if (entry.severity !== "must_have") {
|
|
89
|
+
skippedBlockerIds.push(entry.blockerId);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const text = entry.answerType === "env_ref" ? `Answered blocker ${entry.blockerId}: use environment variable ${entry.value}` : `Answered blocker ${entry.blockerId}: ${entry.value}`;
|
|
93
|
+
criteria.push({
|
|
94
|
+
id: `blocker:${entry.blockerId}`,
|
|
95
|
+
kind: "criterion",
|
|
96
|
+
text,
|
|
97
|
+
severity: "must",
|
|
98
|
+
type: "blocker-answer",
|
|
99
|
+
blockerCriterion: {
|
|
100
|
+
blockerId: entry.blockerId,
|
|
101
|
+
answerType: entry.answerType,
|
|
102
|
+
source: "blocker-answer"
|
|
103
|
+
},
|
|
104
|
+
checkHints: [
|
|
105
|
+
`Verify the implementation honors answered blocker ${entry.blockerId}`,
|
|
106
|
+
"Treat contradictions of this answered must-have blocker as criterion failures."
|
|
107
|
+
]
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
criteria,
|
|
112
|
+
skippedBlockerIds,
|
|
113
|
+
noCriteriaApplied: criteria.length === 0
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// src/core/judge/requirements-parser.ts
|
|
118
|
+
function parseRequirementsBlock(prompt) {
|
|
119
|
+
const errors = [];
|
|
120
|
+
const match = /REQUIREMENTS?:\s*\n?([\s\S]*?)(?:\n\n|$)/i.exec(prompt);
|
|
121
|
+
if (!match) {
|
|
122
|
+
return { requirements: null, errors: [], found: false };
|
|
123
|
+
}
|
|
124
|
+
const blockContent = match[1]?.trim() ?? "";
|
|
125
|
+
if (!blockContent) {
|
|
126
|
+
return { requirements: null, errors: ["Empty REQUIREMENTS block"], found: true };
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
if (blockContent.startsWith("{")) {
|
|
130
|
+
const parsed = JSON.parse(blockContent);
|
|
131
|
+
return {
|
|
132
|
+
requirements: normalizeRequirements(parsed),
|
|
133
|
+
errors: [],
|
|
134
|
+
found: true
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
const requirements = {};
|
|
138
|
+
const lines = blockContent.split("\n");
|
|
139
|
+
for (const line of lines) {
|
|
140
|
+
const trimmed = line.trim();
|
|
141
|
+
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
142
|
+
const listMatch = /^-\s*(\w+)\s*:\s*(.+)$/.exec(trimmed);
|
|
143
|
+
if (listMatch) {
|
|
144
|
+
const key = listMatch[1];
|
|
145
|
+
const value = listMatch[2];
|
|
146
|
+
if (!key || value === void 0) {
|
|
147
|
+
errors.push(`Could not parse requirement line: ${trimmed}`);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const parsedValue = parseValue(value);
|
|
151
|
+
switch (key) {
|
|
152
|
+
case "fileTargets":
|
|
153
|
+
requirements.fileTargets = ensureArray(parsedValue);
|
|
154
|
+
break;
|
|
155
|
+
case "FILE":
|
|
156
|
+
case "file":
|
|
157
|
+
requirements.fileTargets = [
|
|
158
|
+
...requirements.fileTargets ?? [],
|
|
159
|
+
...ensureArray(parsedValue)
|
|
160
|
+
];
|
|
161
|
+
break;
|
|
162
|
+
case "providersMustInclude":
|
|
163
|
+
requirements.providersMustInclude = ensureArray(parsedValue);
|
|
164
|
+
break;
|
|
165
|
+
case "constraints":
|
|
166
|
+
requirements.constraints = ensureArray(parsedValue);
|
|
167
|
+
break;
|
|
168
|
+
default:
|
|
169
|
+
errors.push(`Unknown requirement key: ${key}`);
|
|
170
|
+
}
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (trimmed.startsWith("-")) {
|
|
174
|
+
const item = trimmed.substring(1).trim();
|
|
175
|
+
if (item) {
|
|
176
|
+
if (isLikelyFileTarget(item)) {
|
|
177
|
+
requirements.fileTargets = [...requirements.fileTargets ?? [], item];
|
|
178
|
+
} else {
|
|
179
|
+
requirements.constraints = [...requirements.constraints ?? [], item];
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (trimmed.length > 0) {
|
|
185
|
+
errors.push(`Could not parse line: ${trimmed}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
requirements: normalizeRequirements(requirements),
|
|
190
|
+
errors,
|
|
191
|
+
found: true
|
|
192
|
+
};
|
|
193
|
+
} catch (error) {
|
|
194
|
+
errors.push(
|
|
195
|
+
`Failed to parse REQUIREMENTS block: ${error instanceof Error ? error.message : String(error)}`
|
|
196
|
+
);
|
|
197
|
+
return { requirements: null, errors, found: true };
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function isLikelyFileTarget(item) {
|
|
201
|
+
const normalized = item.trim();
|
|
202
|
+
if (!normalized) return false;
|
|
203
|
+
if (normalized.includes("/") || normalized.includes("\\") || normalized.includes("*"))
|
|
204
|
+
return true;
|
|
205
|
+
if (/\.[a-z0-9]{1,5}$/i.test(normalized)) return true;
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
function parseValue(value) {
|
|
209
|
+
const trimmed = value.trim();
|
|
210
|
+
if (trimmed.startsWith("[")) {
|
|
211
|
+
try {
|
|
212
|
+
const parsed = JSON.parse(trimmed);
|
|
213
|
+
if (Array.isArray(parsed)) {
|
|
214
|
+
return parsed.map((item) => String(item));
|
|
215
|
+
}
|
|
216
|
+
return String(parsed);
|
|
217
|
+
} catch {
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (trimmed.startsWith('"') && trimmed.endsWith('"') || trimmed.startsWith("'") && trimmed.endsWith("'")) {
|
|
221
|
+
return trimmed.substring(1, trimmed.length - 1);
|
|
222
|
+
}
|
|
223
|
+
return trimmed;
|
|
224
|
+
}
|
|
225
|
+
function ensureArray(value) {
|
|
226
|
+
if (Array.isArray(value)) {
|
|
227
|
+
return value;
|
|
228
|
+
}
|
|
229
|
+
if (value.includes(",")) {
|
|
230
|
+
return value.split(",").map((s) => s.trim()).filter(Boolean);
|
|
231
|
+
}
|
|
232
|
+
return [value];
|
|
233
|
+
}
|
|
234
|
+
function normalizeRequirements(raw) {
|
|
235
|
+
const normalized = {};
|
|
236
|
+
if (raw.fileTargets && raw.fileTargets.length > 0) {
|
|
237
|
+
normalized.fileTargets = raw.fileTargets;
|
|
238
|
+
}
|
|
239
|
+
if (raw.providersMustInclude && raw.providersMustInclude.length > 0) {
|
|
240
|
+
normalized.providersMustInclude = raw.providersMustInclude;
|
|
241
|
+
}
|
|
242
|
+
if (raw.constraints && raw.constraints.length > 0) {
|
|
243
|
+
normalized.constraints = raw.constraints;
|
|
244
|
+
}
|
|
245
|
+
return normalized;
|
|
246
|
+
}
|
|
247
|
+
function validateRequirementCompliance(requirements, changedFiles, output) {
|
|
248
|
+
if (!requirements || Object.keys(requirements).length === 0) {
|
|
249
|
+
return {
|
|
250
|
+
compliant: true,
|
|
251
|
+
satisfiedCount: 0,
|
|
252
|
+
totalCount: 0,
|
|
253
|
+
penalty: 0,
|
|
254
|
+
violations: []
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
let totalCount = 0;
|
|
258
|
+
let satisfiedCount = 0;
|
|
259
|
+
const violations = [];
|
|
260
|
+
const warnings = [];
|
|
261
|
+
const normalizedChangedFiles = changedFiles.map(
|
|
262
|
+
(f) => f.toLowerCase().replace(/^\.\//, "").replace(/\\/g, "/")
|
|
263
|
+
);
|
|
264
|
+
if (requirements.fileTargets && requirements.fileTargets.length > 0) {
|
|
265
|
+
for (const fileTarget of requirements.fileTargets) {
|
|
266
|
+
totalCount++;
|
|
267
|
+
const normalized = fileTarget.toLowerCase().replace(/^\.\//, "").replace(/\\/g, "/");
|
|
268
|
+
const isGlob = normalized.includes("*");
|
|
269
|
+
let matched = false;
|
|
270
|
+
if (isGlob) {
|
|
271
|
+
const pattern = normalized.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, "[^/]+");
|
|
272
|
+
const regex = new RegExp(`^${pattern}$`);
|
|
273
|
+
matched = normalizedChangedFiles.some((f) => regex.test(f));
|
|
274
|
+
} else {
|
|
275
|
+
matched = normalizedChangedFiles.includes(normalized);
|
|
276
|
+
}
|
|
277
|
+
if (matched) {
|
|
278
|
+
satisfiedCount++;
|
|
279
|
+
} else {
|
|
280
|
+
violations.push(`Missing FILE target: ${fileTarget}`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
if (requirements.providersMustInclude && requirements.providersMustInclude.length > 0) {
|
|
285
|
+
const outputLower = output.toLowerCase();
|
|
286
|
+
for (const provider of requirements.providersMustInclude) {
|
|
287
|
+
totalCount++;
|
|
288
|
+
const providerLower = provider.toLowerCase();
|
|
289
|
+
if (outputLower.includes(providerLower)) {
|
|
290
|
+
satisfiedCount++;
|
|
291
|
+
} else {
|
|
292
|
+
violations.push(`Missing required provider: ${provider}`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
if (requirements.constraints && requirements.constraints.length > 0) {
|
|
297
|
+
for (const constraint of requirements.constraints) {
|
|
298
|
+
warnings.push(`Constraint (not scored): ${constraint}`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
const compliant = satisfiedCount === totalCount;
|
|
302
|
+
const missedCount = totalCount - satisfiedCount;
|
|
303
|
+
const penalty = Math.min(30, missedCount * 10);
|
|
304
|
+
return {
|
|
305
|
+
compliant,
|
|
306
|
+
satisfiedCount,
|
|
307
|
+
totalCount,
|
|
308
|
+
penalty,
|
|
309
|
+
violations,
|
|
310
|
+
warnings: warnings.length > 0 ? warnings : void 0
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// src/core/judge/criteria-registry.ts
|
|
315
|
+
function parseImplicitCriteria(prompt) {
|
|
316
|
+
const items = [];
|
|
317
|
+
const text = (prompt ?? "").trim();
|
|
318
|
+
if (!text) return items;
|
|
319
|
+
const push = (item) => {
|
|
320
|
+
items.push({
|
|
321
|
+
...item,
|
|
322
|
+
id: generateCriteriaId(items.length, "criterion"),
|
|
323
|
+
kind: "criterion"
|
|
324
|
+
});
|
|
325
|
+
};
|
|
326
|
+
const wantsTestsAdded = /\b(add|write|create|include)\b[\s\S]{0,60}\b(unit\s+)?tests?\b/i.test(text) || /\b(unit\s+test|test\s+case)\b/i.test(text);
|
|
327
|
+
if (wantsTestsAdded) {
|
|
328
|
+
push({
|
|
329
|
+
text: "Add or update tests as requested",
|
|
330
|
+
severity: "must",
|
|
331
|
+
type: "implicit",
|
|
332
|
+
checkHints: [
|
|
333
|
+
"Look for test file changes (e.g. *.test.* / tests/ / __tests__/)",
|
|
334
|
+
"Prefer variants that add tests relevant to the change"
|
|
335
|
+
]
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
const wantsTestsToPass = /\b(all\s+tests?\s+pass|tests?\s+pass|ensure\s+tests?\s+pass|make\s+sure\s+tests?\s+pass|tests?\s+(?:must|should|need(?:s)?\s+to)\s+pass)\b/i.test(
|
|
339
|
+
text
|
|
340
|
+
);
|
|
341
|
+
if (wantsTestsToPass) {
|
|
342
|
+
push({
|
|
343
|
+
text: "Tests pass (when evidence is present)",
|
|
344
|
+
severity: "must",
|
|
345
|
+
type: "implicit",
|
|
346
|
+
checkHints: [
|
|
347
|
+
"Treat \u201Ctests pass\u201D as UNKNOWN without test output/provenance",
|
|
348
|
+
"Prefer variants with verified passing test runs when available"
|
|
349
|
+
]
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
const wantsDocs = /\b(update|add|write)\b[\s\S]{0,60}\b(documentation|docs?)\b/i.test(text) || /\bdoc\s+comments?\b/i.test(text);
|
|
353
|
+
if (wantsDocs) {
|
|
354
|
+
push({
|
|
355
|
+
text: "Documentation is updated as requested",
|
|
356
|
+
severity: "should",
|
|
357
|
+
type: "implicit",
|
|
358
|
+
checkHints: ["Look for doc file changes (docs/, *.md) or doc-only edits when requested"]
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
const looksTechnical = /\b(FILE:|src\/|lib\/|test\/|tests\/|__tests__\/)\b/i.test(text) || /\b\.(?:ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|kt|cs|rb|php)\b/i.test(text) || /\b(code|coding|implement|refactor|bug|fix|tests?|api|function|class|module|package|dependency|build|compile|typescript|javascript|python|node|npm|pnpm|yarn)\b/i.test(
|
|
362
|
+
text
|
|
363
|
+
);
|
|
364
|
+
const wantsMaintainableCode = /\b(maintainable|maintainability|readable|readability|clean(?:er)?|well-structured|easy\s+to\s+understand|production\s+code)\b/i.test(
|
|
365
|
+
text
|
|
366
|
+
);
|
|
367
|
+
if (looksTechnical && wantsMaintainableCode) {
|
|
368
|
+
push({
|
|
369
|
+
text: "Prefer maintainable, readable production code",
|
|
370
|
+
severity: "should",
|
|
371
|
+
type: "implicit",
|
|
372
|
+
checkHints: [
|
|
373
|
+
"Prefer simpler, clearer implementations over cleverness",
|
|
374
|
+
"Avoid unnecessary changes and keep the diff well-scoped",
|
|
375
|
+
"Prefer good naming, structure, and sensible abstractions when applicable"
|
|
376
|
+
]
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
return items;
|
|
380
|
+
}
|
|
381
|
+
var MUST_KEYWORDS = /\b(must|do not|does not|don't|doesn't|required|critical|mandatory)\b/i;
|
|
382
|
+
var MAY_KEYWORDS = /\b(optionally|preferably|if possible|could|nice to have|bonus)\b/i;
|
|
383
|
+
var AC_OPTIONAL_KEYWORDS = /\b(optional(?:ly)?|bonus|nice\s+to\s+have|if\s+possible)\b/i;
|
|
384
|
+
function classifySeverity(text) {
|
|
385
|
+
if (MUST_KEYWORDS.test(text)) {
|
|
386
|
+
return "must";
|
|
387
|
+
}
|
|
388
|
+
if (MAY_KEYWORDS.test(text)) {
|
|
389
|
+
return "may";
|
|
390
|
+
}
|
|
391
|
+
return "should";
|
|
392
|
+
}
|
|
393
|
+
function classifyAcceptanceCriterionSeverity(text) {
|
|
394
|
+
if (MUST_KEYWORDS.test(text)) {
|
|
395
|
+
return "must";
|
|
396
|
+
}
|
|
397
|
+
if (AC_OPTIONAL_KEYWORDS.test(text)) {
|
|
398
|
+
return "may";
|
|
399
|
+
}
|
|
400
|
+
return "must";
|
|
401
|
+
}
|
|
402
|
+
function extractNamedSectionBody(prompt, sectionNamePattern) {
|
|
403
|
+
const headingPattern = new RegExp(
|
|
404
|
+
`^(?:#{1,4}\\s+)?${sectionNamePattern}(?:\\s*\\(.*?\\))?[:\\s]*$`,
|
|
405
|
+
"im"
|
|
406
|
+
);
|
|
407
|
+
const headingMatch = headingPattern.exec(prompt);
|
|
408
|
+
if (!headingMatch) {
|
|
409
|
+
return null;
|
|
410
|
+
}
|
|
411
|
+
const bodyStart = (headingMatch.index ?? 0) + headingMatch[0].length;
|
|
412
|
+
const remaining = prompt.slice(bodyStart);
|
|
413
|
+
const bodyLines = remaining.split("\n");
|
|
414
|
+
const sectionLines = [];
|
|
415
|
+
let consecutiveBlankLines = 0;
|
|
416
|
+
for (const line of bodyLines) {
|
|
417
|
+
if (/^#{1,4}\s/.test(line)) break;
|
|
418
|
+
if (/^(?:SUCCESS\s+if|REQUIREMENTS|Deliverables|Constraints|Dependencies|Acceptance\s+Criteria|How\s+to\s+Verify)\s*:/im.test(
|
|
419
|
+
line
|
|
420
|
+
)) {
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
if (line.trim() === "") {
|
|
424
|
+
consecutiveBlankLines++;
|
|
425
|
+
if (consecutiveBlankLines >= 2) break;
|
|
426
|
+
} else {
|
|
427
|
+
consecutiveBlankLines = 0;
|
|
428
|
+
}
|
|
429
|
+
sectionLines.push(line);
|
|
430
|
+
}
|
|
431
|
+
return sectionLines.join("\n");
|
|
432
|
+
}
|
|
433
|
+
function parseSectionBulletItems(sectionBody) {
|
|
434
|
+
const texts = [];
|
|
435
|
+
for (const line of sectionBody.split("\n")) {
|
|
436
|
+
const trimmed = line.trim();
|
|
437
|
+
if (!trimmed) continue;
|
|
438
|
+
const checkboxMatch = /^[-*]\s+\[[ xX]\]\s+(.+)$/.exec(trimmed);
|
|
439
|
+
if (checkboxMatch) {
|
|
440
|
+
const text = checkboxMatch[1]?.trim() ?? "";
|
|
441
|
+
if (text) texts.push(text);
|
|
442
|
+
continue;
|
|
443
|
+
}
|
|
444
|
+
const bulletMatch = /^[-*]\s+(.+)$/.exec(trimmed);
|
|
445
|
+
if (bulletMatch) {
|
|
446
|
+
const text = bulletMatch[1]?.trim() ?? "";
|
|
447
|
+
if (text) texts.push(text);
|
|
448
|
+
continue;
|
|
449
|
+
}
|
|
450
|
+
const numberedMatch = /^\d+[.)]\s+(.+)$/.exec(trimmed);
|
|
451
|
+
if (numberedMatch) {
|
|
452
|
+
const text = numberedMatch[1]?.trim() ?? "";
|
|
453
|
+
if (text) texts.push(text);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return texts;
|
|
457
|
+
}
|
|
458
|
+
function generateCriteriaId(index, kind) {
|
|
459
|
+
const prefix = kind === "criterion" ? "CR" : "CN";
|
|
460
|
+
const n = index + 1;
|
|
461
|
+
return `${prefix}-${String(n).padStart(3, "0")}`;
|
|
462
|
+
}
|
|
463
|
+
function generateVerificationObligationId(index) {
|
|
464
|
+
return `VO-${String(index + 1).padStart(3, "0")}`;
|
|
465
|
+
}
|
|
466
|
+
function extractSignificantWords(text) {
|
|
467
|
+
const stopWords = /* @__PURE__ */ new Set([
|
|
468
|
+
"a",
|
|
469
|
+
"an",
|
|
470
|
+
"the",
|
|
471
|
+
"is",
|
|
472
|
+
"are",
|
|
473
|
+
"was",
|
|
474
|
+
"were",
|
|
475
|
+
"be",
|
|
476
|
+
"been",
|
|
477
|
+
"being",
|
|
478
|
+
"and",
|
|
479
|
+
"or",
|
|
480
|
+
"but",
|
|
481
|
+
"if",
|
|
482
|
+
"in",
|
|
483
|
+
"on",
|
|
484
|
+
"at",
|
|
485
|
+
"to",
|
|
486
|
+
"for",
|
|
487
|
+
"of",
|
|
488
|
+
"with",
|
|
489
|
+
"as",
|
|
490
|
+
"by",
|
|
491
|
+
"from",
|
|
492
|
+
"that",
|
|
493
|
+
"this",
|
|
494
|
+
"it",
|
|
495
|
+
"not",
|
|
496
|
+
"no",
|
|
497
|
+
"all",
|
|
498
|
+
"any",
|
|
499
|
+
"should",
|
|
500
|
+
"must",
|
|
501
|
+
"may",
|
|
502
|
+
"can",
|
|
503
|
+
"will"
|
|
504
|
+
]);
|
|
505
|
+
const tokens = text.toLowerCase().replace(/[^\w\s]/g, " ").split(/\s+/).filter((t) => (t.length > 2 || /^\d+$/.test(t)) && !stopWords.has(t));
|
|
506
|
+
return new Set(tokens);
|
|
507
|
+
}
|
|
508
|
+
function deduplicateCriteria(items) {
|
|
509
|
+
const kept = [];
|
|
510
|
+
const keptWords = [];
|
|
511
|
+
const severityRank = { must: 3, should: 2, may: 1 };
|
|
512
|
+
for (const item of items) {
|
|
513
|
+
const words = extractSignificantWords(item.text);
|
|
514
|
+
if (words.size === 0) {
|
|
515
|
+
kept.push(item);
|
|
516
|
+
keptWords.push(words);
|
|
517
|
+
continue;
|
|
518
|
+
}
|
|
519
|
+
let isDuplicate = false;
|
|
520
|
+
for (let existingIdx = 0; existingIdx < keptWords.length; existingIdx++) {
|
|
521
|
+
const existingWords = keptWords[existingIdx];
|
|
522
|
+
if (!existingWords || existingWords.size === 0) continue;
|
|
523
|
+
const intersection = new Set([...words].filter((w) => existingWords.has(w)));
|
|
524
|
+
const union = /* @__PURE__ */ new Set([...words, ...existingWords]);
|
|
525
|
+
const overlap = intersection.size / union.size;
|
|
526
|
+
if (overlap > 0.8) {
|
|
527
|
+
isDuplicate = true;
|
|
528
|
+
const existingRank = severityRank[kept[existingIdx]?.severity ?? ""] ?? 0;
|
|
529
|
+
const newRank = severityRank[item.severity] ?? 0;
|
|
530
|
+
if (newRank > existingRank) {
|
|
531
|
+
kept[existingIdx] = item;
|
|
532
|
+
keptWords[existingIdx] = words;
|
|
533
|
+
}
|
|
534
|
+
break;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
if (!isDuplicate) {
|
|
538
|
+
kept.push(item);
|
|
539
|
+
keptWords.push(words);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
return kept;
|
|
543
|
+
}
|
|
544
|
+
function parseSuccessIfSection(prompt) {
|
|
545
|
+
const items = [];
|
|
546
|
+
let criterionIndex = 0;
|
|
547
|
+
const successIfMatch = /SUCCESS\s+if:\s*\n((?:.*\n)*?)(?:\n\n|$)/im.exec(prompt);
|
|
548
|
+
if (successIfMatch) {
|
|
549
|
+
const blockContent = successIfMatch[1] ?? "";
|
|
550
|
+
const lines = blockContent.split("\n");
|
|
551
|
+
for (const line of lines) {
|
|
552
|
+
const trimmed = line.trim();
|
|
553
|
+
if (!trimmed) continue;
|
|
554
|
+
const bulletMatch = /^[-*]\s+(.+)$/.exec(trimmed);
|
|
555
|
+
if (!bulletMatch) continue;
|
|
556
|
+
const text = bulletMatch[1]?.trim() ?? "";
|
|
557
|
+
if (!text) continue;
|
|
558
|
+
items.push({
|
|
559
|
+
id: generateCriteriaId(criterionIndex++, "criterion"),
|
|
560
|
+
kind: "criterion",
|
|
561
|
+
text,
|
|
562
|
+
// SUCCESS if: is the strongest form of criteria definition. Treat as MUST by default.
|
|
563
|
+
severity: "must",
|
|
564
|
+
type: "explicit"
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
const inlineMatches = Array.from(prompt.matchAll(/^SUCCESS\s+if:[ \t]*(.+)$/gim));
|
|
569
|
+
for (const match of inlineMatches) {
|
|
570
|
+
const text = (match[1] ?? "").trim();
|
|
571
|
+
if (!text) continue;
|
|
572
|
+
items.push({
|
|
573
|
+
id: generateCriteriaId(criterionIndex++, "criterion"),
|
|
574
|
+
kind: "criterion",
|
|
575
|
+
text,
|
|
576
|
+
severity: "must",
|
|
577
|
+
type: "explicit"
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
return items;
|
|
581
|
+
}
|
|
582
|
+
function parseAcceptanceCriteria(prompt) {
|
|
583
|
+
const items = [];
|
|
584
|
+
const sectionBody = extractNamedSectionBody(prompt, "Acceptance\\s+Criteria");
|
|
585
|
+
if (sectionBody === null) {
|
|
586
|
+
return items;
|
|
587
|
+
}
|
|
588
|
+
let criterionIndex = 0;
|
|
589
|
+
for (const text of parseSectionBulletItems(sectionBody)) {
|
|
590
|
+
items.push({
|
|
591
|
+
id: generateCriteriaId(criterionIndex++, "criterion"),
|
|
592
|
+
kind: "criterion",
|
|
593
|
+
text,
|
|
594
|
+
severity: classifyAcceptanceCriterionSeverity(text),
|
|
595
|
+
type: "acceptance-criteria"
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
return items;
|
|
599
|
+
}
|
|
600
|
+
function parseHowToVerifyObligations(prompt) {
|
|
601
|
+
const items = [];
|
|
602
|
+
const sectionBody = extractNamedSectionBody(prompt, "How\\s+to\\s+Verify");
|
|
603
|
+
if (sectionBody === null) {
|
|
604
|
+
return items;
|
|
605
|
+
}
|
|
606
|
+
let index = 0;
|
|
607
|
+
for (const text of parseSectionBulletItems(sectionBody)) {
|
|
608
|
+
items.push({
|
|
609
|
+
id: generateVerificationObligationId(index++),
|
|
610
|
+
kind: "constraint",
|
|
611
|
+
text,
|
|
612
|
+
severity: "must",
|
|
613
|
+
type: "verification-obligation"
|
|
614
|
+
});
|
|
615
|
+
}
|
|
616
|
+
return items;
|
|
617
|
+
}
|
|
618
|
+
function parseDeliverablesSection(prompt) {
|
|
619
|
+
const items = [];
|
|
620
|
+
const delivMatch = /Deliverables:\s*\n((?:.*\n)*?)(?:\n\n|$)/im.exec(prompt);
|
|
621
|
+
if (!delivMatch) {
|
|
622
|
+
return items;
|
|
623
|
+
}
|
|
624
|
+
const blockContent = delivMatch[1] ?? "";
|
|
625
|
+
const lines = blockContent.split("\n");
|
|
626
|
+
let criterionIndex = 0;
|
|
627
|
+
for (const line of lines) {
|
|
628
|
+
const trimmed = line.trim();
|
|
629
|
+
if (!trimmed) continue;
|
|
630
|
+
const bulletMatch = /^[-*]\s+(.+)$/.exec(trimmed);
|
|
631
|
+
if (bulletMatch) {
|
|
632
|
+
const text = bulletMatch[1]?.trim() ?? "";
|
|
633
|
+
if (text) {
|
|
634
|
+
items.push({
|
|
635
|
+
id: generateCriteriaId(criterionIndex++, "criterion"),
|
|
636
|
+
kind: "criterion",
|
|
637
|
+
text,
|
|
638
|
+
severity: classifySeverity(text),
|
|
639
|
+
type: "explicit"
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
return items;
|
|
645
|
+
}
|
|
646
|
+
function parseRequirementsBlockToRegistry(prompt) {
|
|
647
|
+
const result = parseRequirementsBlock(prompt);
|
|
648
|
+
if (!result.requirements) {
|
|
649
|
+
return [];
|
|
650
|
+
}
|
|
651
|
+
const items = [];
|
|
652
|
+
const req = result.requirements;
|
|
653
|
+
if (req.fileTargets && req.fileTargets.length > 0) {
|
|
654
|
+
for (const target of req.fileTargets) {
|
|
655
|
+
items.push({
|
|
656
|
+
id: generateCriteriaId(items.length, "constraint"),
|
|
657
|
+
kind: "constraint",
|
|
658
|
+
text: `Modify file: ${target}`,
|
|
659
|
+
severity: "must",
|
|
660
|
+
type: "scope",
|
|
661
|
+
checkHints: ["Check if file appears in changedFiles"]
|
|
662
|
+
});
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
if (req.providersMustInclude && req.providersMustInclude.length > 0) {
|
|
666
|
+
for (const provider of req.providersMustInclude) {
|
|
667
|
+
items.push({
|
|
668
|
+
id: generateCriteriaId(items.length, "constraint"),
|
|
669
|
+
kind: "constraint",
|
|
670
|
+
text: `Must include provider: ${provider}`,
|
|
671
|
+
severity: "must",
|
|
672
|
+
type: "constraint",
|
|
673
|
+
checkHints: [`Check if "${provider}" appears in output`]
|
|
674
|
+
});
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
if (req.constraints && req.constraints.length > 0) {
|
|
678
|
+
for (const constraint of req.constraints) {
|
|
679
|
+
items.push({
|
|
680
|
+
id: generateCriteriaId(items.length, "constraint"),
|
|
681
|
+
kind: "constraint",
|
|
682
|
+
text: constraint,
|
|
683
|
+
severity: classifySeverity(constraint),
|
|
684
|
+
type: "generic"
|
|
685
|
+
});
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
return items;
|
|
689
|
+
}
|
|
690
|
+
function fileTargetsToConstraints(targets) {
|
|
691
|
+
return targets.map((target, index) => ({
|
|
692
|
+
id: generateCriteriaId(index, "constraint"),
|
|
693
|
+
kind: "constraint",
|
|
694
|
+
text: `Modify file: ${target}`,
|
|
695
|
+
severity: "must",
|
|
696
|
+
type: "scope",
|
|
697
|
+
checkHints: ["Check if file appears in changedFiles"]
|
|
698
|
+
}));
|
|
699
|
+
}
|
|
700
|
+
function deliverableTargetsToConstraints(targets) {
|
|
701
|
+
return targets.map((target, index) => ({
|
|
702
|
+
id: generateCriteriaId(index, "constraint"),
|
|
703
|
+
kind: "constraint",
|
|
704
|
+
text: `Produce deliverable: ${target}`,
|
|
705
|
+
severity: "must",
|
|
706
|
+
type: "scope",
|
|
707
|
+
checkHints: ["Check if file appears in changedFiles"]
|
|
708
|
+
}));
|
|
709
|
+
}
|
|
710
|
+
function extractCriteriaFromContract(contract) {
|
|
711
|
+
const items = [];
|
|
712
|
+
for (const mustHave of contract.mustHaves) {
|
|
713
|
+
items.push({
|
|
714
|
+
id: generateCriteriaId(items.length, "criterion"),
|
|
715
|
+
kind: "criterion",
|
|
716
|
+
text: mustHave.text,
|
|
717
|
+
severity: "must",
|
|
718
|
+
type: "explicit"
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
for (const ac of contract.acceptanceCriteria) {
|
|
722
|
+
items.push({
|
|
723
|
+
id: generateCriteriaId(items.length, "criterion"),
|
|
724
|
+
kind: "criterion",
|
|
725
|
+
text: ac.text,
|
|
726
|
+
severity: classifyAcceptanceCriterionSeverity(ac.text),
|
|
727
|
+
type: "explicit"
|
|
728
|
+
});
|
|
729
|
+
}
|
|
730
|
+
return items;
|
|
731
|
+
}
|
|
732
|
+
function extractConstraintsFromContract(contract) {
|
|
733
|
+
const items = [];
|
|
734
|
+
for (const constraint of contract.constraints) {
|
|
735
|
+
items.push({
|
|
736
|
+
id: generateCriteriaId(items.length, "constraint"),
|
|
737
|
+
kind: "constraint",
|
|
738
|
+
text: constraint.text,
|
|
739
|
+
severity: classifySeverity(constraint.text),
|
|
740
|
+
type: "constraint"
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
for (const target of contract.targets) {
|
|
744
|
+
items.push({
|
|
745
|
+
id: generateCriteriaId(items.length, "constraint"),
|
|
746
|
+
kind: "constraint",
|
|
747
|
+
text: `Modify file: ${target}`,
|
|
748
|
+
severity: "must",
|
|
749
|
+
type: "scope",
|
|
750
|
+
checkHints: ["Check if file appears in changedFiles"]
|
|
751
|
+
});
|
|
752
|
+
}
|
|
753
|
+
return items;
|
|
754
|
+
}
|
|
755
|
+
function buildCriteriaRegistry(prompt, options = {}) {
|
|
756
|
+
const {
|
|
757
|
+
taskContract,
|
|
758
|
+
fileTargets = [],
|
|
759
|
+
deliverableTargets = [],
|
|
760
|
+
hasNewFileTargets = false,
|
|
761
|
+
includeBlockerAnswers = true,
|
|
762
|
+
trustedBlockerAnswers = []
|
|
763
|
+
} = options;
|
|
764
|
+
const normalizedPrompt = stripPoeticContextBlocks(redactBlockerContext(prompt ?? ""));
|
|
765
|
+
const allCriteria = [];
|
|
766
|
+
const allConstraints = [];
|
|
767
|
+
const verificationObligations = [];
|
|
768
|
+
let sourceCount = 0;
|
|
769
|
+
let blockerCriteria = {
|
|
770
|
+
count: 0,
|
|
771
|
+
noCriteriaApplied: true,
|
|
772
|
+
skippedBlockerIds: []
|
|
773
|
+
};
|
|
774
|
+
const successIfItems = parseSuccessIfSection(normalizedPrompt);
|
|
775
|
+
if (successIfItems.length > 0) {
|
|
776
|
+
allCriteria.push(...successIfItems);
|
|
777
|
+
sourceCount++;
|
|
778
|
+
}
|
|
779
|
+
const acItems = parseAcceptanceCriteria(normalizedPrompt);
|
|
780
|
+
if (acItems.length > 0) {
|
|
781
|
+
allCriteria.push(...acItems);
|
|
782
|
+
sourceCount++;
|
|
783
|
+
}
|
|
784
|
+
const howToVerifyItems = parseHowToVerifyObligations(normalizedPrompt);
|
|
785
|
+
if (howToVerifyItems.length > 0) {
|
|
786
|
+
verificationObligations.push(...howToVerifyItems);
|
|
787
|
+
sourceCount++;
|
|
788
|
+
}
|
|
789
|
+
const delivItems = parseDeliverablesSection(normalizedPrompt);
|
|
790
|
+
if (delivItems.length > 0) {
|
|
791
|
+
allCriteria.push(...delivItems);
|
|
792
|
+
sourceCount++;
|
|
793
|
+
}
|
|
794
|
+
if (includeBlockerAnswers) {
|
|
795
|
+
const derived = deriveBlockerCriteria(trustedBlockerAnswers);
|
|
796
|
+
blockerCriteria = {
|
|
797
|
+
count: derived.criteria.length,
|
|
798
|
+
noCriteriaApplied: derived.noCriteriaApplied,
|
|
799
|
+
skippedBlockerIds: derived.skippedBlockerIds
|
|
800
|
+
};
|
|
801
|
+
if (derived.criteria.length > 0) {
|
|
802
|
+
allCriteria.push(...derived.criteria);
|
|
803
|
+
sourceCount++;
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
const reqItems = parseRequirementsBlockToRegistry(normalizedPrompt);
|
|
807
|
+
if (reqItems.length > 0) {
|
|
808
|
+
allConstraints.push(...reqItems);
|
|
809
|
+
sourceCount++;
|
|
810
|
+
}
|
|
811
|
+
if (taskContract) {
|
|
812
|
+
const contractCriteria = extractCriteriaFromContract(taskContract);
|
|
813
|
+
const contractConstraints = extractConstraintsFromContract(taskContract);
|
|
814
|
+
if (contractCriteria.length > 0 || contractConstraints.length > 0) {
|
|
815
|
+
allCriteria.push(...contractCriteria);
|
|
816
|
+
allConstraints.push(...contractConstraints);
|
|
817
|
+
sourceCount++;
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
if (fileTargets.length > 0) {
|
|
821
|
+
const fileConstraints = fileTargetsToConstraints(fileTargets);
|
|
822
|
+
allConstraints.push(...fileConstraints);
|
|
823
|
+
sourceCount++;
|
|
824
|
+
}
|
|
825
|
+
if (deliverableTargets.length > 0) {
|
|
826
|
+
const delivConstraints = deliverableTargetsToConstraints(deliverableTargets);
|
|
827
|
+
allConstraints.push(...delivConstraints);
|
|
828
|
+
sourceCount++;
|
|
829
|
+
}
|
|
830
|
+
if (allCriteria.length === 0) {
|
|
831
|
+
const implicitItems = parseImplicitCriteria(normalizedPrompt);
|
|
832
|
+
if (implicitItems.length > 0) {
|
|
833
|
+
allCriteria.push(...implicitItems);
|
|
834
|
+
sourceCount++;
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
if (allCriteria.length === 0) {
|
|
838
|
+
allCriteria.push(
|
|
839
|
+
{
|
|
840
|
+
id: generateCriteriaId(0, "criterion"),
|
|
841
|
+
kind: "criterion",
|
|
842
|
+
text: "Task requirements are met",
|
|
843
|
+
severity: "must",
|
|
844
|
+
type: "baseline"
|
|
845
|
+
},
|
|
846
|
+
{
|
|
847
|
+
id: generateCriteriaId(1, "criterion"),
|
|
848
|
+
kind: "criterion",
|
|
849
|
+
text: "Deliverable is correct and verifiable",
|
|
850
|
+
severity: "must",
|
|
851
|
+
type: "baseline"
|
|
852
|
+
},
|
|
853
|
+
{
|
|
854
|
+
id: generateCriteriaId(2, "criterion"),
|
|
855
|
+
kind: "criterion",
|
|
856
|
+
text: "Solution is clear and maintainable",
|
|
857
|
+
severity: "should",
|
|
858
|
+
type: "baseline"
|
|
859
|
+
}
|
|
860
|
+
);
|
|
861
|
+
sourceCount++;
|
|
862
|
+
}
|
|
863
|
+
if (hasNewFileTargets && fileTargets.length > 0) {
|
|
864
|
+
allCriteria.push({
|
|
865
|
+
id: generateCriteriaId(allCriteria.length, "criterion"),
|
|
866
|
+
kind: "criterion",
|
|
867
|
+
text: "New production modules should have corresponding test coverage",
|
|
868
|
+
severity: "should",
|
|
869
|
+
type: "implicit",
|
|
870
|
+
checkHints: [
|
|
871
|
+
"Look for test files (*.test.*, __tests__/*) corresponding to new production files",
|
|
872
|
+
"Variants creating new modules with tests demonstrate higher quality"
|
|
873
|
+
]
|
|
874
|
+
});
|
|
875
|
+
}
|
|
876
|
+
const deduped = deduplicateCriteria(allCriteria);
|
|
877
|
+
let criterionIndex = 0;
|
|
878
|
+
const criteria = deduped.map((item) => {
|
|
879
|
+
if (item.id.startsWith("blocker:")) {
|
|
880
|
+
return item;
|
|
881
|
+
}
|
|
882
|
+
return {
|
|
883
|
+
...item,
|
|
884
|
+
id: generateCriteriaId(criterionIndex++, "criterion")
|
|
885
|
+
};
|
|
886
|
+
});
|
|
887
|
+
const constraints = allConstraints.map((item, index) => ({
|
|
888
|
+
...item,
|
|
889
|
+
id: generateCriteriaId(index, "constraint")
|
|
890
|
+
}));
|
|
891
|
+
const hasMustItems = [...criteria, ...constraints].some((item) => item.severity === "must");
|
|
892
|
+
const renumberedVerificationObligations = verificationObligations.map((item, index) => ({
|
|
893
|
+
...item,
|
|
894
|
+
id: generateVerificationObligationId(index)
|
|
895
|
+
}));
|
|
896
|
+
return {
|
|
897
|
+
criteria,
|
|
898
|
+
constraints,
|
|
899
|
+
verificationObligations: renumberedVerificationObligations,
|
|
900
|
+
metadata: {
|
|
901
|
+
sourceCount,
|
|
902
|
+
hasMustItems,
|
|
903
|
+
hasTaskContract: !!taskContract,
|
|
904
|
+
blockerCriteria
|
|
905
|
+
}
|
|
906
|
+
};
|
|
907
|
+
}
|
|
908
|
+
function computeCompleteness(ledger) {
|
|
909
|
+
if (ledger.length === 0) {
|
|
910
|
+
return 1;
|
|
911
|
+
}
|
|
912
|
+
const passCount = ledger.filter((e) => e.st === "P").length;
|
|
913
|
+
const unknownCount = ledger.filter((e) => e.st === "U").length;
|
|
914
|
+
const total = ledger.length;
|
|
915
|
+
const unknownCredit = Math.min(unknownCount, passCount);
|
|
916
|
+
const completeness = (passCount + 0.5 * unknownCredit) / total;
|
|
917
|
+
return Math.max(0, Math.min(1, completeness));
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
// src/core/judge/task-contract.ts
|
|
921
|
+
function createEmptyContract() {
|
|
922
|
+
return {
|
|
923
|
+
goal: {
|
|
924
|
+
text: "Unknown goal - extraction failed",
|
|
925
|
+
source: "inferred",
|
|
926
|
+
justification: "Default empty contract created due to extraction failure"
|
|
927
|
+
},
|
|
928
|
+
deliverableType: "mixed",
|
|
929
|
+
mustHaves: [],
|
|
930
|
+
acceptanceCriteria: [],
|
|
931
|
+
constraints: [],
|
|
932
|
+
nonGoals: [],
|
|
933
|
+
targets: [],
|
|
934
|
+
extraction: {
|
|
935
|
+
method: "deterministic",
|
|
936
|
+
confidence: 0,
|
|
937
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
938
|
+
warnings: ["Empty contract created - extraction may have failed"]
|
|
939
|
+
}
|
|
940
|
+
};
|
|
941
|
+
}
|
|
942
|
+
function createExplicitItem(text, verbatimQuote) {
|
|
943
|
+
return {
|
|
944
|
+
text,
|
|
945
|
+
source: "explicit",
|
|
946
|
+
verbatimQuote
|
|
947
|
+
};
|
|
948
|
+
}
|
|
949
|
+
function createInferredItem(text, justification) {
|
|
950
|
+
return {
|
|
951
|
+
text,
|
|
952
|
+
source: "inferred",
|
|
953
|
+
justification
|
|
954
|
+
};
|
|
955
|
+
}
|
|
956
|
+
function createGateVerifiedInferredItem(text, justification) {
|
|
957
|
+
return {
|
|
958
|
+
text,
|
|
959
|
+
source: "inferred",
|
|
960
|
+
justification,
|
|
961
|
+
verification: "gate"
|
|
962
|
+
};
|
|
963
|
+
}
|
|
964
|
+
function expectsCodeEdits(type) {
|
|
965
|
+
switch (type) {
|
|
966
|
+
case "implementation":
|
|
967
|
+
case "test":
|
|
968
|
+
return true;
|
|
969
|
+
case "analysis":
|
|
970
|
+
case "design":
|
|
971
|
+
return false;
|
|
972
|
+
case "documentation":
|
|
973
|
+
case "mixed":
|
|
974
|
+
return false;
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
// src/core/judge/contract-extraction.ts
|
|
979
|
+
var DELIVERABLE_TYPE_PATTERNS = {
|
|
980
|
+
implementation: [
|
|
981
|
+
/\b(implement|add|create|build|develop|write\s+code)\b/i,
|
|
982
|
+
/\b(fix|repair|resolve|patch)\b.*\b(bug|issue|error)\b/i,
|
|
983
|
+
/\b(refactor|restructure|rewrite|improve)\b/i,
|
|
984
|
+
// FILE: pattern kept for type detection but not for constraint enforcement
|
|
985
|
+
// per A/B test results (2026-02-02)
|
|
986
|
+
/\bFILE:/i
|
|
987
|
+
],
|
|
988
|
+
analysis: [
|
|
989
|
+
/\b(analyze|analyse|investigate|examine|review)\b/i,
|
|
990
|
+
/\b(explain|describe|document\s+how)\b/i,
|
|
991
|
+
/\b(audit|assess|evaluate)\b/i,
|
|
992
|
+
/\b(find|identify|locate)\s+(where|what|which|all)/i
|
|
993
|
+
],
|
|
994
|
+
design: [
|
|
995
|
+
/\b(design|architect|plan)\b.*\b(system|architecture|api)\b/i,
|
|
996
|
+
/\b(propose|draft|outline)\b.*\b(design|approach|solution)\b/i,
|
|
997
|
+
/\b(technical\s+spec|RFC|ADR)\b/i
|
|
998
|
+
],
|
|
999
|
+
documentation: [
|
|
1000
|
+
/\b(document|write\s+docs?|update\s+readme)\b/i,
|
|
1001
|
+
/\b(README|CHANGELOG|CONTRIBUTING)\b/i,
|
|
1002
|
+
/\bdocs?\//i,
|
|
1003
|
+
/\.md\b/i
|
|
1004
|
+
],
|
|
1005
|
+
test: [
|
|
1006
|
+
/\b(write|add|create|implement)\s+(unit\s+)?tests?\b/i,
|
|
1007
|
+
/\b(test\s+coverage|increase\s+coverage)\b/i,
|
|
1008
|
+
/\bspec\.(ts|js)\b/i,
|
|
1009
|
+
/\.test\.(ts|js)\b/i
|
|
1010
|
+
],
|
|
1011
|
+
mixed: []
|
|
1012
|
+
// Fallback - no specific patterns
|
|
1013
|
+
};
|
|
1014
|
+
function detectDeliverableType(prompt) {
|
|
1015
|
+
const lower = prompt.toLowerCase();
|
|
1016
|
+
const typeChecks = [
|
|
1017
|
+
"test",
|
|
1018
|
+
"analysis",
|
|
1019
|
+
"documentation",
|
|
1020
|
+
"design",
|
|
1021
|
+
"implementation"
|
|
1022
|
+
];
|
|
1023
|
+
for (const type of typeChecks) {
|
|
1024
|
+
const patterns = DELIVERABLE_TYPE_PATTERNS[type];
|
|
1025
|
+
if (patterns.some((pattern) => pattern.test(lower))) {
|
|
1026
|
+
return type;
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1029
|
+
if (/\bFILE:/i.test(prompt)) {
|
|
1030
|
+
return "implementation";
|
|
1031
|
+
}
|
|
1032
|
+
return "mixed";
|
|
1033
|
+
}
|
|
1034
|
+
function extractExplicitRequirements(prompt) {
|
|
1035
|
+
const mustHaves = [];
|
|
1036
|
+
const acceptanceCriteria = [];
|
|
1037
|
+
const constraints = [];
|
|
1038
|
+
const warnings = [];
|
|
1039
|
+
const requirementSectionPattern = /(?:^|\n)\s*(?:requirements?|must|should):\s*\n((?:\s*(?:[-*]|\d+[.)]).+(?:\n|$))+)/gim;
|
|
1040
|
+
for (const match of prompt.matchAll(requirementSectionPattern)) {
|
|
1041
|
+
const sectionText = match[1] ?? "";
|
|
1042
|
+
const itemPattern = /^\s*(?:[-*]|\d+[.)])\s*(.+)$/gm;
|
|
1043
|
+
for (const itemMatch of sectionText.matchAll(itemPattern)) {
|
|
1044
|
+
const itemText = itemMatch[1]?.trim() ?? "";
|
|
1045
|
+
if (!itemText) continue;
|
|
1046
|
+
const verbatimQuote = findVerbatimQuote(prompt, itemText);
|
|
1047
|
+
if (verbatimQuote) {
|
|
1048
|
+
mustHaves.push(createExplicitItem(itemText, verbatimQuote));
|
|
1049
|
+
} else {
|
|
1050
|
+
warnings.push(
|
|
1051
|
+
`Explicit item dropped (no verbatim quote found): "${itemText.slice(0, 80)}"`
|
|
1052
|
+
);
|
|
1053
|
+
mustHaves.push(createExplicitItem(itemText, itemText));
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
const sharedAcItems = parseAcceptanceCriteria(prompt);
|
|
1058
|
+
for (const item of sharedAcItems) {
|
|
1059
|
+
const itemText = item.text;
|
|
1060
|
+
if (!itemText) continue;
|
|
1061
|
+
const verbatimQuote = findVerbatimQuote(prompt, itemText);
|
|
1062
|
+
if (verbatimQuote) {
|
|
1063
|
+
acceptanceCriteria.push(createExplicitItem(itemText, verbatimQuote));
|
|
1064
|
+
} else {
|
|
1065
|
+
acceptanceCriteria.push(
|
|
1066
|
+
createInferredItem(
|
|
1067
|
+
itemText,
|
|
1068
|
+
"Extracted from acceptance criteria section without an exact verbatim quote"
|
|
1069
|
+
)
|
|
1070
|
+
);
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
const legacyAcceptanceSectionPattern = /(?:^|\n)\s*(?:success\s+criteria|done\s+when):\s*\n((?:\s*(?:[-*]|\d+[.)]).+(?:\n|$))+)/gim;
|
|
1074
|
+
for (const match of prompt.matchAll(legacyAcceptanceSectionPattern)) {
|
|
1075
|
+
const sectionText = match[1] ?? "";
|
|
1076
|
+
const itemPattern = /^\s*(?:[-*]|\d+[.)])\s*(.+)$/gm;
|
|
1077
|
+
for (const itemMatch of sectionText.matchAll(itemPattern)) {
|
|
1078
|
+
const itemText = itemMatch[1]?.trim() ?? "";
|
|
1079
|
+
if (!itemText) continue;
|
|
1080
|
+
if (acceptanceCriteria.some((ac) => ac.text === itemText)) continue;
|
|
1081
|
+
const verbatimQuote = findVerbatimQuote(prompt, itemText);
|
|
1082
|
+
if (verbatimQuote) {
|
|
1083
|
+
acceptanceCriteria.push(createExplicitItem(itemText, verbatimQuote));
|
|
1084
|
+
} else {
|
|
1085
|
+
acceptanceCriteria.push(
|
|
1086
|
+
createInferredItem(
|
|
1087
|
+
itemText,
|
|
1088
|
+
"Extracted from acceptance criteria section without an exact verbatim quote"
|
|
1089
|
+
)
|
|
1090
|
+
);
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
const constraintPatterns = [
|
|
1095
|
+
/(?:^|\n)\s*(?:constraints?|limitations?):\s*\n((?:\s*(?:[-*]|\d+[.)]).+(?:\n|$))+)/gim,
|
|
1096
|
+
/(?:don'?t|do\s+not|avoid|without)\s+([^.!?\n]+[.!?]?)/gi
|
|
1097
|
+
];
|
|
1098
|
+
const sectionPattern = constraintPatterns[0];
|
|
1099
|
+
if (sectionPattern) {
|
|
1100
|
+
for (const match of prompt.matchAll(sectionPattern)) {
|
|
1101
|
+
const sectionText = match[1] ?? "";
|
|
1102
|
+
const itemPattern = /^\s*(?:[-*]|\d+[.)])\s*(.+)$/gm;
|
|
1103
|
+
for (const itemMatch of sectionText.matchAll(itemPattern)) {
|
|
1104
|
+
const itemText = itemMatch[1]?.trim() ?? "";
|
|
1105
|
+
if (!itemText) continue;
|
|
1106
|
+
const verbatimQuote = findVerbatimQuote(prompt, itemText);
|
|
1107
|
+
if (verbatimQuote) {
|
|
1108
|
+
constraints.push(createExplicitItem(itemText, verbatimQuote));
|
|
1109
|
+
} else {
|
|
1110
|
+
warnings.push(
|
|
1111
|
+
`Explicit item dropped (no verbatim quote found): "${itemText.slice(0, 80)}"`
|
|
1112
|
+
);
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
}
|
|
1117
|
+
const inlinePattern = constraintPatterns[1];
|
|
1118
|
+
if (inlinePattern) {
|
|
1119
|
+
for (const match of prompt.matchAll(inlinePattern)) {
|
|
1120
|
+
const fullMatch = match[0]?.trim() ?? "";
|
|
1121
|
+
if (!fullMatch || fullMatch.length < 10) continue;
|
|
1122
|
+
const verbatimQuote = findVerbatimQuote(prompt, fullMatch);
|
|
1123
|
+
if (verbatimQuote) {
|
|
1124
|
+
constraints.push(createExplicitItem(fullMatch, verbatimQuote));
|
|
1125
|
+
} else {
|
|
1126
|
+
warnings.push(
|
|
1127
|
+
`Explicit item dropped (no verbatim quote found): "${fullMatch.slice(0, 80)}"`
|
|
1128
|
+
);
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
return { mustHaves, acceptanceCriteria, constraints, warnings };
|
|
1133
|
+
}
|
|
1134
|
+
function extractGoal(prompt) {
|
|
1135
|
+
const taskMatch = prompt.match(/(?:^|\n)\s*(?:task|goal|objective):\s*(.+?)(?:\n|$)/i);
|
|
1136
|
+
if (taskMatch?.[1]) {
|
|
1137
|
+
const goalText = taskMatch[1].trim();
|
|
1138
|
+
const verbatimQuote = findVerbatimQuote(prompt, goalText);
|
|
1139
|
+
if (verbatimQuote) {
|
|
1140
|
+
return createExplicitItem(goalText, verbatimQuote);
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
const lines = prompt.split(/\r?\n/);
|
|
1144
|
+
let firstContentLine = "";
|
|
1145
|
+
for (const line of lines) {
|
|
1146
|
+
const trimmed = line.trim();
|
|
1147
|
+
if (!trimmed) continue;
|
|
1148
|
+
if (/^FILES?(_ONLY)?:/i.test(trimmed)) continue;
|
|
1149
|
+
if (/^[-*]\s+\S+$/.test(trimmed)) continue;
|
|
1150
|
+
firstContentLine = trimmed;
|
|
1151
|
+
break;
|
|
1152
|
+
}
|
|
1153
|
+
if (firstContentLine) {
|
|
1154
|
+
const sentenceMatch = firstContentLine.match(/^([^.!?\n]+[.!?]?)/);
|
|
1155
|
+
const goalText = sentenceMatch?.[1]?.trim() || firstContentLine.slice(0, 200);
|
|
1156
|
+
const verbatimQuote = findVerbatimQuote(prompt, goalText);
|
|
1157
|
+
if (verbatimQuote) {
|
|
1158
|
+
return createExplicitItem(goalText, verbatimQuote);
|
|
1159
|
+
}
|
|
1160
|
+
return createInferredItem(goalText, "Extracted from first content line of prompt");
|
|
1161
|
+
}
|
|
1162
|
+
return createInferredItem("Complete the requested task", "No clear goal found in prompt");
|
|
1163
|
+
}
|
|
1164
|
+
function inferRequirements(prompt, existingMustHaves) {
|
|
1165
|
+
const inferredMustHaves = [];
|
|
1166
|
+
const inferredAcceptanceCriteria = [];
|
|
1167
|
+
const lower = prompt.toLowerCase();
|
|
1168
|
+
if (/\b(test|spec)\b/i.test(lower) && !existingMustHaves.some((m) => /test/i.test(m.text))) {
|
|
1169
|
+
if (/\b(add|write|create|implement)\s+(unit\s+)?tests?\b/i.test(lower)) {
|
|
1170
|
+
inferredMustHaves.push(
|
|
1171
|
+
createInferredItem("Include tests for new functionality", "Prompt mentions writing tests")
|
|
1172
|
+
);
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
const promptWithoutUrls = prompt.replace(/https?:\/\/\S+/gi, " ").replace(/\bwww\.\S+/gi, " ");
|
|
1176
|
+
if (/\.tsx?\b/.test(promptWithoutUrls)) {
|
|
1177
|
+
inferredAcceptanceCriteria.push(
|
|
1178
|
+
createGateVerifiedInferredItem(
|
|
1179
|
+
"TypeScript compiles without errors",
|
|
1180
|
+
"Task involves TypeScript files - type safety expected"
|
|
1181
|
+
)
|
|
1182
|
+
);
|
|
1183
|
+
}
|
|
1184
|
+
if (/\.go\b/.test(promptWithoutUrls)) {
|
|
1185
|
+
inferredAcceptanceCriteria.push(
|
|
1186
|
+
createGateVerifiedInferredItem(
|
|
1187
|
+
"Go code compiles without errors",
|
|
1188
|
+
"Task involves Go files - compile safety expected"
|
|
1189
|
+
)
|
|
1190
|
+
);
|
|
1191
|
+
}
|
|
1192
|
+
if (/\.rs\b/.test(promptWithoutUrls)) {
|
|
1193
|
+
inferredAcceptanceCriteria.push(
|
|
1194
|
+
createGateVerifiedInferredItem(
|
|
1195
|
+
"Rust code compiles without errors",
|
|
1196
|
+
"Task involves Rust files - compile safety expected"
|
|
1197
|
+
)
|
|
1198
|
+
);
|
|
1199
|
+
}
|
|
1200
|
+
if (/\.java\b/.test(promptWithoutUrls)) {
|
|
1201
|
+
inferredAcceptanceCriteria.push(
|
|
1202
|
+
createGateVerifiedInferredItem(
|
|
1203
|
+
"Java code compiles without errors",
|
|
1204
|
+
"Task involves Java files - compile safety expected"
|
|
1205
|
+
)
|
|
1206
|
+
);
|
|
1207
|
+
}
|
|
1208
|
+
if (/\.py\b/.test(promptWithoutUrls) && (/\bmypy\b/i.test(lower) || /\btype\s+hints?\b/i.test(lower))) {
|
|
1209
|
+
inferredAcceptanceCriteria.push(
|
|
1210
|
+
createGateVerifiedInferredItem(
|
|
1211
|
+
"Python type checks pass without errors",
|
|
1212
|
+
"Task involves typed Python (mypy/type hints) - type safety expected"
|
|
1213
|
+
)
|
|
1214
|
+
);
|
|
1215
|
+
}
|
|
1216
|
+
const ensurePatterns = /(?:ensure|make\s+sure|verify\s+that)\s+([^.!?\n]+[.!?]?)/gi;
|
|
1217
|
+
for (const match of lower.matchAll(ensurePatterns)) {
|
|
1218
|
+
const requirement = match[1]?.trim() ?? "";
|
|
1219
|
+
if (requirement.length > 10 && requirement.length < 200) {
|
|
1220
|
+
inferredAcceptanceCriteria.push(
|
|
1221
|
+
createInferredItem(requirement, 'Extracted from "ensure/make sure" phrase')
|
|
1222
|
+
);
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
return {
|
|
1226
|
+
mustHaves: inferredMustHaves,
|
|
1227
|
+
acceptanceCriteria: inferredAcceptanceCriteria
|
|
1228
|
+
};
|
|
1229
|
+
}
|
|
1230
|
+
function extractNonGoals(prompt) {
|
|
1231
|
+
const nonGoals = [];
|
|
1232
|
+
const nonGoalPatterns = [
|
|
1233
|
+
/(?:out\s+of\s+scope|not\s+in\s+scope):\s*([^.\n]+)/gi,
|
|
1234
|
+
/(?:don'?t\s+worry\s+about|not\s+(?:in\s+)?this\s+(?:PR|task|issue)):\s*([^.\n]+)/gi,
|
|
1235
|
+
/\bnot\s+(?:needed|required|necessary):\s*([^.\n]+)/gi
|
|
1236
|
+
];
|
|
1237
|
+
for (const pattern of nonGoalPatterns) {
|
|
1238
|
+
for (const match of prompt.matchAll(pattern)) {
|
|
1239
|
+
const text = match[1]?.trim() ?? "";
|
|
1240
|
+
if (!text || text.length < 5) continue;
|
|
1241
|
+
const verbatimQuote = findVerbatimQuote(prompt, match[0]?.trim() ?? "");
|
|
1242
|
+
if (verbatimQuote) {
|
|
1243
|
+
nonGoals.push(createExplicitItem(text, verbatimQuote));
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
return nonGoals;
|
|
1248
|
+
}
|
|
1249
|
+
function findVerbatimQuote(prompt, text) {
|
|
1250
|
+
if (!text || !prompt) return null;
|
|
1251
|
+
const normalizedText = text.replace(/\s+/g, " ").trim();
|
|
1252
|
+
const normalizedPrompt = prompt.replace(/\s+/g, " ");
|
|
1253
|
+
if (normalizedPrompt.includes(normalizedText)) {
|
|
1254
|
+
return normalizedText;
|
|
1255
|
+
}
|
|
1256
|
+
if (prompt.includes(text)) {
|
|
1257
|
+
return text;
|
|
1258
|
+
}
|
|
1259
|
+
const lowerPrompt = normalizedPrompt.toLowerCase();
|
|
1260
|
+
const lowerText = normalizedText.toLowerCase();
|
|
1261
|
+
if (lowerPrompt.includes(lowerText)) {
|
|
1262
|
+
const startIndex = lowerPrompt.indexOf(lowerText);
|
|
1263
|
+
return normalizedPrompt.slice(startIndex, startIndex + normalizedText.length);
|
|
1264
|
+
}
|
|
1265
|
+
return null;
|
|
1266
|
+
}
|
|
1267
|
+
function validateContractFidelity(contract, prompt) {
|
|
1268
|
+
const allItems = [
|
|
1269
|
+
contract.goal,
|
|
1270
|
+
...contract.mustHaves,
|
|
1271
|
+
...contract.acceptanceCriteria,
|
|
1272
|
+
...contract.constraints,
|
|
1273
|
+
...contract.nonGoals
|
|
1274
|
+
];
|
|
1275
|
+
const explicitItems = allItems.filter((item) => item.source === "explicit");
|
|
1276
|
+
const invalidQuotes = [];
|
|
1277
|
+
for (const item of explicitItems) {
|
|
1278
|
+
if (item.verbatimQuote) {
|
|
1279
|
+
const found = findVerbatimQuote(prompt, item.verbatimQuote);
|
|
1280
|
+
if (!found) {
|
|
1281
|
+
invalidQuotes.push(item.verbatimQuote);
|
|
1282
|
+
}
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1285
|
+
const totalExplicit = explicitItems.length;
|
|
1286
|
+
const validExplicit = totalExplicit - invalidQuotes.length;
|
|
1287
|
+
const fidelityScore = totalExplicit > 0 ? validExplicit / totalExplicit : 1;
|
|
1288
|
+
return {
|
|
1289
|
+
isValid: invalidQuotes.length === 0,
|
|
1290
|
+
invalidQuotes,
|
|
1291
|
+
totalExplicit,
|
|
1292
|
+
validExplicit,
|
|
1293
|
+
fidelityScore
|
|
1294
|
+
};
|
|
1295
|
+
}
|
|
1296
|
+
function extractTaskContract(prompt, options = {}) {
|
|
1297
|
+
const {
|
|
1298
|
+
includeInferred = true,
|
|
1299
|
+
maxMustHaves = 10,
|
|
1300
|
+
maxAcceptanceCriteria = 6,
|
|
1301
|
+
validateQuotes = true
|
|
1302
|
+
} = options;
|
|
1303
|
+
if (!prompt || prompt.trim().length === 0) {
|
|
1304
|
+
return createEmptyContract();
|
|
1305
|
+
}
|
|
1306
|
+
const warnings = [];
|
|
1307
|
+
const promptSpec = parsePromptSpec(prompt);
|
|
1308
|
+
const targets = promptSpec.fileConstraint.targets;
|
|
1309
|
+
const deliverableType = detectDeliverableType(prompt);
|
|
1310
|
+
const goal = extractGoal(prompt);
|
|
1311
|
+
const explicit = extractExplicitRequirements(prompt);
|
|
1312
|
+
warnings.push(...explicit.warnings);
|
|
1313
|
+
let inferredMustHaves = [];
|
|
1314
|
+
let inferredAcceptanceCriteria = [];
|
|
1315
|
+
if (includeInferred) {
|
|
1316
|
+
const inferred = inferRequirements(prompt, explicit.mustHaves);
|
|
1317
|
+
inferredMustHaves = inferred.mustHaves;
|
|
1318
|
+
inferredAcceptanceCriteria = inferred.acceptanceCriteria;
|
|
1319
|
+
}
|
|
1320
|
+
const nonGoals = extractNonGoals(prompt);
|
|
1321
|
+
const mustHaves = [...explicit.mustHaves, ...inferredMustHaves].slice(0, maxMustHaves);
|
|
1322
|
+
const acceptanceCriteria = [...explicit.acceptanceCriteria, ...inferredAcceptanceCriteria].slice(
|
|
1323
|
+
0,
|
|
1324
|
+
maxAcceptanceCriteria
|
|
1325
|
+
);
|
|
1326
|
+
const constraints = explicit.constraints.slice(0, 5);
|
|
1327
|
+
const contract = {
|
|
1328
|
+
goal,
|
|
1329
|
+
deliverableType,
|
|
1330
|
+
mustHaves,
|
|
1331
|
+
acceptanceCriteria,
|
|
1332
|
+
constraints,
|
|
1333
|
+
nonGoals,
|
|
1334
|
+
targets,
|
|
1335
|
+
extraction: {
|
|
1336
|
+
method: "deterministic",
|
|
1337
|
+
confidence: 0.7,
|
|
1338
|
+
// Base confidence for deterministic extraction
|
|
1339
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
1340
|
+
warnings
|
|
1341
|
+
}
|
|
1342
|
+
};
|
|
1343
|
+
if (validateQuotes) {
|
|
1344
|
+
const validation = validateContractFidelity(contract, prompt);
|
|
1345
|
+
if (!validation.isValid) {
|
|
1346
|
+
warnings.push(
|
|
1347
|
+
`${validation.invalidQuotes.length} explicit quotes not found in prompt: ${validation.invalidQuotes.slice(0, 3).join(", ")}`
|
|
1348
|
+
);
|
|
1349
|
+
contract.extraction.confidence *= validation.fidelityScore;
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
if (mustHaves.length === 0 && acceptanceCriteria.length === 0) {
|
|
1353
|
+
contract.extraction.confidence *= 0.6;
|
|
1354
|
+
warnings.push("No explicit requirements extracted - using inference only");
|
|
1355
|
+
}
|
|
1356
|
+
if (goal.source === "inferred") {
|
|
1357
|
+
contract.extraction.confidence *= 0.9;
|
|
1358
|
+
}
|
|
1359
|
+
contract.extraction.warnings = warnings;
|
|
1360
|
+
return contract;
|
|
1361
|
+
}
|
|
1362
|
+
|
|
1363
|
+
export {
|
|
1364
|
+
BlockerAnalysisPayloadSchema,
|
|
1365
|
+
BLOCKER_CONTEXT_START,
|
|
1366
|
+
BLOCKER_CONTEXT_END,
|
|
1367
|
+
parseRequirementsBlock,
|
|
1368
|
+
validateRequirementCompliance,
|
|
1369
|
+
generateCriteriaId,
|
|
1370
|
+
parseAcceptanceCriteria,
|
|
1371
|
+
buildCriteriaRegistry,
|
|
1372
|
+
computeCompleteness,
|
|
1373
|
+
expectsCodeEdits,
|
|
1374
|
+
extractTaskContract
|
|
1375
|
+
};
|
|
1376
|
+
//# sourceMappingURL=chunk-ACDIT7OP.js.map
|