@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,2321 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AutomaticPromptOptimizer,
|
|
3
|
+
PromptEvaluator,
|
|
4
|
+
PromptOptimizer
|
|
5
|
+
} from "./chunk-7MMLMXO6.js";
|
|
6
|
+
import {
|
|
7
|
+
PromptManager
|
|
8
|
+
} from "./chunk-Q3WIC6GQ.js";
|
|
9
|
+
import {
|
|
10
|
+
PromptStore
|
|
11
|
+
} from "./chunk-OQ6K46CK.js";
|
|
12
|
+
import {
|
|
13
|
+
registry
|
|
14
|
+
} from "./chunk-Z2KYOFHS.js";
|
|
15
|
+
import {
|
|
16
|
+
BUILT_IN_VARIANT_STRATEGIES
|
|
17
|
+
} from "./chunk-VXF4Q3FW.js";
|
|
18
|
+
import {
|
|
19
|
+
getTelemetryLogger
|
|
20
|
+
} from "./chunk-U6C3VVWS.js";
|
|
21
|
+
import {
|
|
22
|
+
GEMINI_MODELS
|
|
23
|
+
} from "./chunk-V53UG2OT.js";
|
|
24
|
+
import {
|
|
25
|
+
resolveDefaultProvider
|
|
26
|
+
} from "./chunk-XPU2XADL.js";
|
|
27
|
+
import {
|
|
28
|
+
CODEX_MODELS
|
|
29
|
+
} from "./chunk-4NXPXE62.js";
|
|
30
|
+
import {
|
|
31
|
+
CLAUDE_MODELS
|
|
32
|
+
} from "./chunk-MWHLBPNU.js";
|
|
33
|
+
import {
|
|
34
|
+
BooleanFlagSchema,
|
|
35
|
+
ExistingFilePathSchema,
|
|
36
|
+
PromptCategorySchema,
|
|
37
|
+
PromptContentSchema,
|
|
38
|
+
PromptIdSchema,
|
|
39
|
+
PromptNameSchema,
|
|
40
|
+
validateCommandOptions
|
|
41
|
+
} from "./chunk-QOCOVLUH.js";
|
|
42
|
+
import {
|
|
43
|
+
ProviderRegistry
|
|
44
|
+
} from "./chunk-AT4TNPWW.js";
|
|
45
|
+
|
|
46
|
+
// src/cli/commands/prompts.ts
|
|
47
|
+
import * as fs from "fs";
|
|
48
|
+
import chalk from "chalk";
|
|
49
|
+
import { Command } from "commander";
|
|
50
|
+
import { z } from "zod";
|
|
51
|
+
|
|
52
|
+
// src/core/providers/copilot/config.ts
|
|
53
|
+
var COPILOT_MODELS = {
|
|
54
|
+
// Current models
|
|
55
|
+
CLAUDE_SONNET_4_6: "claude-sonnet-4.6",
|
|
56
|
+
CLAUDE_SONNET_4_5: "claude-sonnet-4.5",
|
|
57
|
+
CLAUDE_SONNET_4: "claude-sonnet-4",
|
|
58
|
+
CLAUDE_HAIKU_4_5: "claude-haiku-4.5",
|
|
59
|
+
CLAUDE_OPUS_4_6: "claude-opus-4.6",
|
|
60
|
+
CLAUDE_OPUS_4_5: "claude-opus-4.5",
|
|
61
|
+
CLAUDE_OPUS_4_1: "claude-opus-4.1",
|
|
62
|
+
GPT_5: "gpt-5",
|
|
63
|
+
GPT_5_MINI: "gpt-5-mini",
|
|
64
|
+
GPT_5_1_CODEX_MINI: "gpt-5.1-codex-mini",
|
|
65
|
+
GPT_5_2: "gpt-5.2",
|
|
66
|
+
GEMINI_2_5_PRO: "gemini-2.5-pro",
|
|
67
|
+
GEMINI_3_FLASH: "gemini-3-flash",
|
|
68
|
+
GEMINI_3_PRO: "gemini-3-pro",
|
|
69
|
+
// Legacy models
|
|
70
|
+
GPT_4_1: "gpt-4.1"
|
|
71
|
+
};
|
|
72
|
+
var DEFAULT_TIMEOUT = ProviderRegistry.getTimeout("copilot");
|
|
73
|
+
|
|
74
|
+
// src/orchestrator/model-tier-config.ts
|
|
75
|
+
var TIER_PREFERENCE_AVAILABILITY_KEYS = ["anthropic", "openai", "google", "opencode"];
|
|
76
|
+
function resolveTierPreferenceOrder() {
|
|
77
|
+
const eligible = new Set(TIER_PREFERENCE_AVAILABILITY_KEYS);
|
|
78
|
+
try {
|
|
79
|
+
const ordered = [];
|
|
80
|
+
const seen = /* @__PURE__ */ new Set();
|
|
81
|
+
for (const provider of ProviderRegistry.getEnabledProviders()) {
|
|
82
|
+
const availabilityKey = normalizeProviderForModelAvailability(provider.id);
|
|
83
|
+
if (!eligible.has(availabilityKey) || seen.has(availabilityKey)) continue;
|
|
84
|
+
seen.add(availabilityKey);
|
|
85
|
+
ordered.push(availabilityKey);
|
|
86
|
+
}
|
|
87
|
+
for (const key of TIER_PREFERENCE_AVAILABILITY_KEYS) {
|
|
88
|
+
if (!seen.has(key)) {
|
|
89
|
+
seen.add(key);
|
|
90
|
+
ordered.push(key);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return ordered;
|
|
94
|
+
} catch {
|
|
95
|
+
return [...TIER_PREFERENCE_AVAILABILITY_KEYS];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
var MODEL_AVAILABILITY_PROVIDER_BY_ALIAS = {
|
|
99
|
+
anthropic: "anthropic",
|
|
100
|
+
claude: "anthropic",
|
|
101
|
+
openai: "openai",
|
|
102
|
+
codex: "openai",
|
|
103
|
+
google: "google",
|
|
104
|
+
gemini: "google",
|
|
105
|
+
opencode: "opencode"
|
|
106
|
+
};
|
|
107
|
+
var REGISTRY_PROVIDER_BY_MODEL_AVAILABILITY_PROVIDER = {
|
|
108
|
+
anthropic: "claude",
|
|
109
|
+
openai: "codex",
|
|
110
|
+
google: "gemini",
|
|
111
|
+
cursor: "cursor",
|
|
112
|
+
copilot: "copilot",
|
|
113
|
+
opencode: "opencode"
|
|
114
|
+
};
|
|
115
|
+
var FALLBACK_PROVIDER_BY_ALIAS = {
|
|
116
|
+
anthropic: "claude",
|
|
117
|
+
claude: "claude",
|
|
118
|
+
openai: "codex",
|
|
119
|
+
codex: "codex",
|
|
120
|
+
google: "gemini",
|
|
121
|
+
gemini: "gemini"
|
|
122
|
+
};
|
|
123
|
+
var STATIC_MODEL_AVAILABILITY_FALLBACK = {
|
|
124
|
+
basicModels: {
|
|
125
|
+
openai: [CODEX_MODELS.GPT_5_4_MINI],
|
|
126
|
+
codex: [CODEX_MODELS.GPT_5_4_MINI],
|
|
127
|
+
anthropic: [CLAUDE_MODELS.CLAUDE_HAIKU_4_5],
|
|
128
|
+
claude: [CLAUDE_MODELS.CLAUDE_HAIKU_4_5],
|
|
129
|
+
google: [GEMINI_MODELS.FLASH_2_5_LITE],
|
|
130
|
+
gemini: [GEMINI_MODELS.FLASH_2_5_LITE],
|
|
131
|
+
cursor: ["auto"],
|
|
132
|
+
copilot: [COPILOT_MODELS.GPT_5_MINI],
|
|
133
|
+
opencode: ["auto"]
|
|
134
|
+
},
|
|
135
|
+
standardModels: {
|
|
136
|
+
openai: [CODEX_MODELS.GPT_5_5],
|
|
137
|
+
codex: [CODEX_MODELS.GPT_5_5],
|
|
138
|
+
anthropic: [CLAUDE_MODELS.CLAUDE_SONNET_4_6],
|
|
139
|
+
claude: [CLAUDE_MODELS.CLAUDE_SONNET_4_6],
|
|
140
|
+
google: [GEMINI_MODELS.FLASH_2_5],
|
|
141
|
+
gemini: [GEMINI_MODELS.FLASH_2_5],
|
|
142
|
+
cursor: ["auto"],
|
|
143
|
+
copilot: [COPILOT_MODELS.GPT_5_MINI],
|
|
144
|
+
opencode: ["auto"]
|
|
145
|
+
},
|
|
146
|
+
advancedModels: {
|
|
147
|
+
openai: [CODEX_MODELS.GPT_5_5],
|
|
148
|
+
codex: [CODEX_MODELS.GPT_5_5],
|
|
149
|
+
anthropic: [CLAUDE_MODELS.CLAUDE_OPUS_4_6],
|
|
150
|
+
claude: [CLAUDE_MODELS.CLAUDE_OPUS_4_6],
|
|
151
|
+
google: [GEMINI_MODELS.PRO_3_PREVIEW],
|
|
152
|
+
gemini: [GEMINI_MODELS.PRO_3_PREVIEW],
|
|
153
|
+
cursor: ["auto"],
|
|
154
|
+
copilot: [COPILOT_MODELS.GPT_5_MINI],
|
|
155
|
+
opencode: ["auto"]
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
var ROLE_PRIORITY_BY_TIER = {
|
|
159
|
+
basic: ["fast", "default"],
|
|
160
|
+
standard: ["default"],
|
|
161
|
+
advanced: ["quality", "reasoning", "default"]
|
|
162
|
+
};
|
|
163
|
+
function normalizeProviderForModelAvailability(provider) {
|
|
164
|
+
const normalized = (provider || "").toLowerCase().trim();
|
|
165
|
+
if (!normalized) return normalized;
|
|
166
|
+
return MODEL_AVAILABILITY_PROVIDER_BY_ALIAS[normalized] ?? normalized;
|
|
167
|
+
}
|
|
168
|
+
function getRegistryProviderForModelAvailability(provider) {
|
|
169
|
+
const normalized = normalizeProviderForModelAvailability(provider);
|
|
170
|
+
return REGISTRY_PROVIDER_BY_MODEL_AVAILABILITY_PROVIDER[normalized];
|
|
171
|
+
}
|
|
172
|
+
function cloneModelAvailability(availability) {
|
|
173
|
+
return {
|
|
174
|
+
basicModels: Object.fromEntries(
|
|
175
|
+
Object.entries(availability.basicModels).map(([provider, models]) => [provider, [...models]])
|
|
176
|
+
),
|
|
177
|
+
standardModels: Object.fromEntries(
|
|
178
|
+
Object.entries(availability.standardModels).map(([provider, models]) => [
|
|
179
|
+
provider,
|
|
180
|
+
[...models]
|
|
181
|
+
])
|
|
182
|
+
),
|
|
183
|
+
advancedModels: Object.fromEntries(
|
|
184
|
+
Object.entries(availability.advancedModels).map(([provider, models]) => [
|
|
185
|
+
provider,
|
|
186
|
+
[...models]
|
|
187
|
+
])
|
|
188
|
+
)
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function uniqueModels(models) {
|
|
192
|
+
return Array.from(new Set(models.filter((model) => Boolean(model?.trim()))));
|
|
193
|
+
}
|
|
194
|
+
function resolveRegistryModel(providerId, role) {
|
|
195
|
+
try {
|
|
196
|
+
if (role === "default") {
|
|
197
|
+
return ProviderRegistry.getDefaultModel(providerId);
|
|
198
|
+
}
|
|
199
|
+
return ProviderRegistry.getModelForRole(providerId, role);
|
|
200
|
+
} catch (_error) {
|
|
201
|
+
return void 0;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function buildRegistryBackedAvailability() {
|
|
205
|
+
const availability = cloneModelAvailability(STATIC_MODEL_AVAILABILITY_FALLBACK);
|
|
206
|
+
const providerKeys = /* @__PURE__ */ new Set([
|
|
207
|
+
...Object.keys(STATIC_MODEL_AVAILABILITY_FALLBACK.basicModels),
|
|
208
|
+
...Object.keys(STATIC_MODEL_AVAILABILITY_FALLBACK.standardModels),
|
|
209
|
+
...Object.keys(STATIC_MODEL_AVAILABILITY_FALLBACK.advancedModels)
|
|
210
|
+
]);
|
|
211
|
+
for (const availabilityProvider of providerKeys) {
|
|
212
|
+
const registryProvider = getRegistryProviderForModelAvailability(availabilityProvider);
|
|
213
|
+
if (!registryProvider) continue;
|
|
214
|
+
for (const tier of ["basic", "standard", "advanced"]) {
|
|
215
|
+
const roles = ROLE_PRIORITY_BY_TIER[tier];
|
|
216
|
+
let resolved;
|
|
217
|
+
for (const role of roles) {
|
|
218
|
+
resolved = resolveRegistryModel(registryProvider, role);
|
|
219
|
+
if (resolved) break;
|
|
220
|
+
}
|
|
221
|
+
if (!resolved) continue;
|
|
222
|
+
getAvailabilityForTier(tier, availability)[availabilityProvider] = [resolved];
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return availability;
|
|
226
|
+
}
|
|
227
|
+
var DEFAULT_MODEL_AVAILABILITY = buildRegistryBackedAvailability();
|
|
228
|
+
function getAvailabilityForTier(tier, availability = DEFAULT_MODEL_AVAILABILITY) {
|
|
229
|
+
if (tier === "basic") return availability.basicModels;
|
|
230
|
+
if (tier === "standard") return availability.standardModels;
|
|
231
|
+
return availability.advancedModels;
|
|
232
|
+
}
|
|
233
|
+
function hasRawModelAvailabilityForProvider(provider, availability = DEFAULT_MODEL_AVAILABILITY) {
|
|
234
|
+
const providerKey = normalizeProviderForModelAvailability(provider);
|
|
235
|
+
return (availability.basicModels[providerKey]?.length ?? 0) > 0 || (availability.standardModels[providerKey]?.length ?? 0) > 0 || (availability.advancedModels[providerKey]?.length ?? 0) > 0;
|
|
236
|
+
}
|
|
237
|
+
function getProvidersWithRouteModelAvailability(availability = DEFAULT_MODEL_AVAILABILITY) {
|
|
238
|
+
const providers = [];
|
|
239
|
+
const seen = /* @__PURE__ */ new Set();
|
|
240
|
+
const addIfRoutable = (providerId) => {
|
|
241
|
+
if (!hasRawModelAvailabilityForProvider(providerId, availability)) return;
|
|
242
|
+
const providerKey = normalizeProviderForModelAvailability(providerId);
|
|
243
|
+
const userFacingProvider = getRegistryProviderForModelAvailability(providerKey) ?? providerKey;
|
|
244
|
+
if (seen.has(userFacingProvider)) return;
|
|
245
|
+
seen.add(userFacingProvider);
|
|
246
|
+
providers.push(userFacingProvider);
|
|
247
|
+
};
|
|
248
|
+
try {
|
|
249
|
+
for (const provider of ProviderRegistry.getEnabledProviders()) {
|
|
250
|
+
addIfRoutable(provider.id);
|
|
251
|
+
}
|
|
252
|
+
} catch {
|
|
253
|
+
for (const providerId of /* @__PURE__ */ new Set([
|
|
254
|
+
...Object.keys(availability.basicModels),
|
|
255
|
+
...Object.keys(availability.standardModels),
|
|
256
|
+
...Object.keys(availability.advancedModels)
|
|
257
|
+
])) {
|
|
258
|
+
addIfRoutable(providerId);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return providers;
|
|
262
|
+
}
|
|
263
|
+
function hasProviderRouteModelAvailability(provider, availability = DEFAULT_MODEL_AVAILABILITY) {
|
|
264
|
+
return getProvidersWithRouteModelAvailability(availability).includes(
|
|
265
|
+
getRegistryProviderForModelAvailability(normalizeProviderForModelAvailability(provider)) ?? normalizeProviderForModelAvailability(provider)
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
function buildTierPreference(tier) {
|
|
269
|
+
const availability = getAvailabilityForTier(tier);
|
|
270
|
+
const entries = [];
|
|
271
|
+
for (const provider of resolveTierPreferenceOrder()) {
|
|
272
|
+
const models = availability[provider] || [];
|
|
273
|
+
entries.push(...models);
|
|
274
|
+
}
|
|
275
|
+
return uniqueModels(entries);
|
|
276
|
+
}
|
|
277
|
+
var TIER_MODEL_PREFERENCE = {
|
|
278
|
+
basic: buildTierPreference("basic"),
|
|
279
|
+
standard: buildTierPreference("standard"),
|
|
280
|
+
advanced: buildTierPreference("advanced")
|
|
281
|
+
};
|
|
282
|
+
function getModelsForTierByProvider(tier, provider) {
|
|
283
|
+
const availability = getAvailabilityForTier(tier);
|
|
284
|
+
const providerKey = normalizeProviderForModelAvailability(provider);
|
|
285
|
+
const scoped = availability[providerKey] || [];
|
|
286
|
+
if (scoped.length > 0) {
|
|
287
|
+
return [...scoped];
|
|
288
|
+
}
|
|
289
|
+
return [];
|
|
290
|
+
}
|
|
291
|
+
var MERGED_PROVIDER_MODEL_FALLBACK = {
|
|
292
|
+
claude: {
|
|
293
|
+
fast: CLAUDE_MODELS.CLAUDE_HAIKU_4_5,
|
|
294
|
+
default: CLAUDE_MODELS.CLAUDE_SONNET_4_6,
|
|
295
|
+
advanced: CLAUDE_MODELS.CLAUDE_OPUS_4_6
|
|
296
|
+
},
|
|
297
|
+
codex: {
|
|
298
|
+
fast: CODEX_MODELS.GPT_5_4_MINI,
|
|
299
|
+
default: CODEX_MODELS.GPT_5_5,
|
|
300
|
+
advanced: CODEX_MODELS.GPT_5_5
|
|
301
|
+
},
|
|
302
|
+
gemini: {
|
|
303
|
+
fast: GEMINI_MODELS.FLASH_2_5_LITE,
|
|
304
|
+
default: GEMINI_MODELS.FLASH_2_5,
|
|
305
|
+
advanced: GEMINI_MODELS.PRO_3_PREVIEW
|
|
306
|
+
},
|
|
307
|
+
cursor: {
|
|
308
|
+
// Cursor's model should come from repo config (typically `auto`).
|
|
309
|
+
},
|
|
310
|
+
copilot: {
|
|
311
|
+
// Dot notation required by the GitHub Copilot CLI — do not normalize.
|
|
312
|
+
fast: COPILOT_MODELS.GPT_5_MINI,
|
|
313
|
+
default: COPILOT_MODELS.CLAUDE_SONNET_4_6,
|
|
314
|
+
advanced: COPILOT_MODELS.CLAUDE_OPUS_4_6
|
|
315
|
+
},
|
|
316
|
+
opencode: {
|
|
317
|
+
fast: "auto",
|
|
318
|
+
default: "auto",
|
|
319
|
+
advanced: "auto"
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
function getModelFromFallback(provider, tier) {
|
|
323
|
+
const normalized = (provider || "").toLowerCase().trim();
|
|
324
|
+
const fallbackProvider = FALLBACK_PROVIDER_BY_ALIAS[normalized] ?? normalized;
|
|
325
|
+
return MERGED_PROVIDER_MODEL_FALLBACK[fallbackProvider]?.[tier];
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// src/prompts/generator.ts
|
|
329
|
+
function resolveDefaultGeneratorProvider() {
|
|
330
|
+
try {
|
|
331
|
+
return resolveDefaultProvider().value;
|
|
332
|
+
} catch {
|
|
333
|
+
return "";
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
var DEFAULT_PROMPT_GENERATOR_MODEL = (() => {
|
|
337
|
+
const defaultProvider = resolveDefaultGeneratorProvider();
|
|
338
|
+
if (!defaultProvider) {
|
|
339
|
+
return "";
|
|
340
|
+
}
|
|
341
|
+
return ProviderRegistry.getDefaultModel(defaultProvider) ?? getModelFromFallback(defaultProvider, "default") ?? "";
|
|
342
|
+
})();
|
|
343
|
+
var BUILT_IN_TEMPLATES = {
|
|
344
|
+
"strategy-conservative": {
|
|
345
|
+
id: "strategy-conservative",
|
|
346
|
+
name: "Conservative Strategy Template",
|
|
347
|
+
description: "Template for conservative approach prompts",
|
|
348
|
+
category: "strategy",
|
|
349
|
+
template: `CONSERVATIVE APPROACH
|
|
350
|
+
{{goal}}
|
|
351
|
+
|
|
352
|
+
You are a coding agent (conservative style).
|
|
353
|
+
|
|
354
|
+
FILE TARGETS:
|
|
355
|
+
{{context}}
|
|
356
|
+
|
|
357
|
+
Guidance:
|
|
358
|
+
- Follow existing patterns in the codebase.
|
|
359
|
+
- Keep changes small, focused, and backwards-compatible.
|
|
360
|
+
- Write defensive code with error handling at boundaries.
|
|
361
|
+
- Avoid unrelated refactors.
|
|
362
|
+
- Write the code now; no plan-only output.
|
|
363
|
+
|
|
364
|
+
{{constraints}}
|
|
365
|
+
|
|
366
|
+
Requirements:
|
|
367
|
+
{{requirements}}
|
|
368
|
+
|
|
369
|
+
Expected Outcomes:
|
|
370
|
+
{{outcomes}}
|
|
371
|
+
|
|
372
|
+
FILE TARGET RULES:
|
|
373
|
+
- (create) = permission to create; do not ask
|
|
374
|
+
- (modify) = must exist; do not create; if missing, find correct file and note substitution; ask only if blocked
|
|
375
|
+
- No marker = treat as (modify) if exists, else ask
|
|
376
|
+
|
|
377
|
+
Edit the listed files. Done.`,
|
|
378
|
+
placeholders: [
|
|
379
|
+
{
|
|
380
|
+
key: "goal",
|
|
381
|
+
description: "The main goal or task description",
|
|
382
|
+
required: true
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
key: "context",
|
|
386
|
+
description: "Additional context about the task",
|
|
387
|
+
required: false,
|
|
388
|
+
defaultValue: ""
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
key: "constraints",
|
|
392
|
+
description: "Any constraints or limitations",
|
|
393
|
+
required: false,
|
|
394
|
+
defaultValue: ""
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
key: "requirements",
|
|
398
|
+
description: "Specific requirements (bullet points)",
|
|
399
|
+
required: true
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
key: "outcomes",
|
|
403
|
+
description: "Expected outcomes or deliverables",
|
|
404
|
+
required: true
|
|
405
|
+
}
|
|
406
|
+
]
|
|
407
|
+
},
|
|
408
|
+
"strategy-innovative": {
|
|
409
|
+
id: "strategy-innovative",
|
|
410
|
+
name: "Innovative Strategy Template",
|
|
411
|
+
description: "Template for innovative approach prompts",
|
|
412
|
+
category: "strategy",
|
|
413
|
+
template: `INNOVATIVE APPROACH
|
|
414
|
+
{{goal}}
|
|
415
|
+
|
|
416
|
+
You are a coding agent (innovative style).
|
|
417
|
+
|
|
418
|
+
FILE TARGETS:
|
|
419
|
+
{{context}}
|
|
420
|
+
|
|
421
|
+
Guidance:
|
|
422
|
+
- Explore modern patterns that improve performance, UX, or developer experience.
|
|
423
|
+
- Be bold and creative; implement novel solutions directly.
|
|
424
|
+
- Prioritize code elegance and efficiency over strict convention.
|
|
425
|
+
- Keep changes coherent and testable; avoid gratuitous complexity.
|
|
426
|
+
- Write the code now; no plan-only output.
|
|
427
|
+
|
|
428
|
+
{{constraints}}
|
|
429
|
+
|
|
430
|
+
Requirements:
|
|
431
|
+
{{requirements}}
|
|
432
|
+
|
|
433
|
+
Expected Outcomes:
|
|
434
|
+
{{outcomes}}
|
|
435
|
+
|
|
436
|
+
FILE TARGET RULES:
|
|
437
|
+
- (create) = permission to create; do not ask
|
|
438
|
+
- (modify) = must exist; do not create; if missing, find correct file and note substitution; ask only if blocked
|
|
439
|
+
- No marker = treat as (modify) if exists, else ask
|
|
440
|
+
|
|
441
|
+
Edit the listed files. Done.`,
|
|
442
|
+
placeholders: [
|
|
443
|
+
{
|
|
444
|
+
key: "goal",
|
|
445
|
+
description: "The main goal or task description",
|
|
446
|
+
required: true
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
key: "context",
|
|
450
|
+
description: "Additional context about the task",
|
|
451
|
+
required: false,
|
|
452
|
+
defaultValue: ""
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
key: "constraints",
|
|
456
|
+
description: "Any constraints or limitations",
|
|
457
|
+
required: false,
|
|
458
|
+
defaultValue: ""
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
key: "requirements",
|
|
462
|
+
description: "Specific requirements (bullet points)",
|
|
463
|
+
required: true
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
key: "outcomes",
|
|
467
|
+
description: "Expected outcomes or deliverables",
|
|
468
|
+
required: true
|
|
469
|
+
}
|
|
470
|
+
]
|
|
471
|
+
},
|
|
472
|
+
"strategy-hybrid": {
|
|
473
|
+
id: "strategy-hybrid",
|
|
474
|
+
name: "Hybrid Strategy Template",
|
|
475
|
+
description: "Template for hybrid approach prompts",
|
|
476
|
+
category: "strategy",
|
|
477
|
+
template: `HYBRID APPROACH
|
|
478
|
+
{{goal}}
|
|
479
|
+
|
|
480
|
+
You are a coding agent (hybrid style).
|
|
481
|
+
|
|
482
|
+
FILE TARGETS:
|
|
483
|
+
{{context}}
|
|
484
|
+
|
|
485
|
+
Guidance:
|
|
486
|
+
- Blend proven patterns with targeted innovations where they clearly reduce risk.
|
|
487
|
+
- Stabilize existing behavior first; add safety nets at modified surfaces.
|
|
488
|
+
- Apply modern patterns only where they clearly reduce risk or complexity.
|
|
489
|
+
- Preserve backwards compatibility unless explicitly allowed to break it.
|
|
490
|
+
- Keep diffs tight and focused; avoid unrelated refactors.
|
|
491
|
+
- Write the code now; no plan-only output.
|
|
492
|
+
|
|
493
|
+
{{constraints}}
|
|
494
|
+
|
|
495
|
+
Requirements:
|
|
496
|
+
{{requirements}}
|
|
497
|
+
|
|
498
|
+
Expected Outcomes:
|
|
499
|
+
{{outcomes}}
|
|
500
|
+
|
|
501
|
+
FILE TARGET RULES:
|
|
502
|
+
- (create) = permission to create; do not ask
|
|
503
|
+
- (modify) = must exist; do not create; if missing, find correct file and note substitution; ask only if blocked
|
|
504
|
+
- No marker = treat as (modify) if exists, else ask
|
|
505
|
+
|
|
506
|
+
Edit the listed files. Done.`,
|
|
507
|
+
placeholders: [
|
|
508
|
+
{
|
|
509
|
+
key: "goal",
|
|
510
|
+
description: "The main goal or task description",
|
|
511
|
+
required: true
|
|
512
|
+
},
|
|
513
|
+
{
|
|
514
|
+
key: "context",
|
|
515
|
+
description: "Additional context about the task",
|
|
516
|
+
required: false,
|
|
517
|
+
defaultValue: ""
|
|
518
|
+
},
|
|
519
|
+
{
|
|
520
|
+
key: "constraints",
|
|
521
|
+
description: "Any constraints or limitations",
|
|
522
|
+
required: false,
|
|
523
|
+
defaultValue: ""
|
|
524
|
+
},
|
|
525
|
+
{
|
|
526
|
+
key: "requirements",
|
|
527
|
+
description: "Specific requirements (bullet points)",
|
|
528
|
+
required: true
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
key: "outcomes",
|
|
532
|
+
description: "Expected outcomes or deliverables",
|
|
533
|
+
required: true
|
|
534
|
+
}
|
|
535
|
+
]
|
|
536
|
+
},
|
|
537
|
+
"domain-feature": {
|
|
538
|
+
id: "domain-feature",
|
|
539
|
+
name: "Feature Implementation Template",
|
|
540
|
+
description: "Template for implementing new features",
|
|
541
|
+
category: "domain",
|
|
542
|
+
template: `Implement {{feature_name}} feature for {{project_context}}.
|
|
543
|
+
|
|
544
|
+
Description:
|
|
545
|
+
{{description}}
|
|
546
|
+
|
|
547
|
+
Technical Requirements:
|
|
548
|
+
{{tech_requirements}}
|
|
549
|
+
|
|
550
|
+
Acceptance Criteria:
|
|
551
|
+
{{acceptance_criteria}}
|
|
552
|
+
|
|
553
|
+
Implementation Notes:
|
|
554
|
+
- Follow existing patterns in {{codebase_pattern}}
|
|
555
|
+
- Ensure backwards compatibility
|
|
556
|
+
- Add comprehensive tests (unit + integration)
|
|
557
|
+
- Update documentation
|
|
558
|
+
- Consider edge cases and error handling
|
|
559
|
+
|
|
560
|
+
{{additional_notes}}`,
|
|
561
|
+
placeholders: [
|
|
562
|
+
{
|
|
563
|
+
key: "feature_name",
|
|
564
|
+
description: "Name of the feature",
|
|
565
|
+
required: true
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
key: "project_context",
|
|
569
|
+
description: "Project or module context",
|
|
570
|
+
required: true
|
|
571
|
+
},
|
|
572
|
+
{
|
|
573
|
+
key: "description",
|
|
574
|
+
description: "Detailed feature description",
|
|
575
|
+
required: true
|
|
576
|
+
},
|
|
577
|
+
{
|
|
578
|
+
key: "tech_requirements",
|
|
579
|
+
description: "Technical requirements",
|
|
580
|
+
required: true
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
key: "acceptance_criteria",
|
|
584
|
+
description: "Acceptance criteria",
|
|
585
|
+
required: true
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
key: "codebase_pattern",
|
|
589
|
+
description: "Existing codebase pattern to follow",
|
|
590
|
+
required: false,
|
|
591
|
+
defaultValue: "the existing codebase"
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
key: "additional_notes",
|
|
595
|
+
description: "Any additional notes or considerations",
|
|
596
|
+
required: false,
|
|
597
|
+
defaultValue: ""
|
|
598
|
+
}
|
|
599
|
+
]
|
|
600
|
+
},
|
|
601
|
+
"workflow-refactor": {
|
|
602
|
+
id: "workflow-refactor",
|
|
603
|
+
name: "Refactoring Template",
|
|
604
|
+
description: "Template for code refactoring tasks",
|
|
605
|
+
category: "workflow",
|
|
606
|
+
template: `Refactor {{target}} in {{module}}.
|
|
607
|
+
|
|
608
|
+
Current State:
|
|
609
|
+
{{current_state}}
|
|
610
|
+
|
|
611
|
+
Issues:
|
|
612
|
+
{{issues}}
|
|
613
|
+
|
|
614
|
+
Desired State:
|
|
615
|
+
{{desired_state}}
|
|
616
|
+
|
|
617
|
+
Refactoring Strategy:
|
|
618
|
+
- Identify and extract common patterns
|
|
619
|
+
- Improve code organization and readability
|
|
620
|
+
- Reduce duplication and complexity
|
|
621
|
+
- Maintain existing functionality (no behavior changes)
|
|
622
|
+
- Ensure all tests pass after refactoring
|
|
623
|
+
- Update documentation if needed
|
|
624
|
+
|
|
625
|
+
Constraints:
|
|
626
|
+
{{constraints}}
|
|
627
|
+
|
|
628
|
+
Success Criteria:
|
|
629
|
+
{{success_criteria}}`,
|
|
630
|
+
placeholders: [
|
|
631
|
+
{
|
|
632
|
+
key: "target",
|
|
633
|
+
description: "What to refactor (function, class, module)",
|
|
634
|
+
required: true
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
key: "module",
|
|
638
|
+
description: "Module or file location",
|
|
639
|
+
required: true
|
|
640
|
+
},
|
|
641
|
+
{
|
|
642
|
+
key: "current_state",
|
|
643
|
+
description: "Description of current state",
|
|
644
|
+
required: true
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
key: "issues",
|
|
648
|
+
description: "Problems or issues to address",
|
|
649
|
+
required: true
|
|
650
|
+
},
|
|
651
|
+
{
|
|
652
|
+
key: "desired_state",
|
|
653
|
+
description: "Desired outcome after refactoring",
|
|
654
|
+
required: true
|
|
655
|
+
},
|
|
656
|
+
{
|
|
657
|
+
key: "constraints",
|
|
658
|
+
description: "Any constraints (e.g., no API changes)",
|
|
659
|
+
required: false,
|
|
660
|
+
defaultValue: "No breaking changes to public APIs"
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
key: "success_criteria",
|
|
664
|
+
description: "How to measure success",
|
|
665
|
+
required: false,
|
|
666
|
+
defaultValue: "All tests pass, code is more maintainable"
|
|
667
|
+
}
|
|
668
|
+
]
|
|
669
|
+
}
|
|
670
|
+
};
|
|
671
|
+
var PromptGenerator = class {
|
|
672
|
+
store;
|
|
673
|
+
manager;
|
|
674
|
+
templates;
|
|
675
|
+
engine;
|
|
676
|
+
defaultModel;
|
|
677
|
+
profile;
|
|
678
|
+
workingDir;
|
|
679
|
+
constructor(options = {}) {
|
|
680
|
+
this.store = new PromptStore(options);
|
|
681
|
+
this.manager = new PromptManager(options);
|
|
682
|
+
this.templates = /* @__PURE__ */ new Map();
|
|
683
|
+
this.engine = options.engine;
|
|
684
|
+
this.defaultModel = options.defaultModel || DEFAULT_PROMPT_GENERATOR_MODEL;
|
|
685
|
+
this.profile = options.profile || "default";
|
|
686
|
+
this.workingDir = options.workingDir || process.cwd();
|
|
687
|
+
Object.entries(BUILT_IN_TEMPLATES).forEach(([id, template]) => {
|
|
688
|
+
this.templates.set(id, template);
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* Generate a prompt from a request using AI engine or templates
|
|
693
|
+
*/
|
|
694
|
+
async generate(request) {
|
|
695
|
+
try {
|
|
696
|
+
if (this.engine) {
|
|
697
|
+
return await this.generateWithAI(request);
|
|
698
|
+
}
|
|
699
|
+
return await this.generateFromTemplates(request);
|
|
700
|
+
} catch (error) {
|
|
701
|
+
return {
|
|
702
|
+
success: false,
|
|
703
|
+
error: error.message,
|
|
704
|
+
model: this.engine ? request.model || this.defaultModel : "template-based",
|
|
705
|
+
duration: 0,
|
|
706
|
+
confidence: 0,
|
|
707
|
+
suggestedReview: []
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
/**
|
|
712
|
+
* Generate using AI engine
|
|
713
|
+
*/
|
|
714
|
+
async generateWithAI(request) {
|
|
715
|
+
if (!this.engine) {
|
|
716
|
+
return {
|
|
717
|
+
success: false,
|
|
718
|
+
error: "No AI engine configured",
|
|
719
|
+
model: "none",
|
|
720
|
+
duration: 0,
|
|
721
|
+
confidence: 0,
|
|
722
|
+
suggestedReview: []
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
const startTime = Date.now();
|
|
726
|
+
const model = request.model || this.defaultModel;
|
|
727
|
+
try {
|
|
728
|
+
const generationPrompt = this.buildGenerationPrompt(request);
|
|
729
|
+
const result = await this.engine.run({
|
|
730
|
+
profile: this.profile,
|
|
731
|
+
prompt: generationPrompt,
|
|
732
|
+
workingDir: this.workingDir,
|
|
733
|
+
model,
|
|
734
|
+
// Prompt generation only parses stdout. engine.run is called directly
|
|
735
|
+
// here, so it does not inherit runProviderNative's read-only derivation.
|
|
736
|
+
executionIntent: "analysis",
|
|
737
|
+
readOnlyWorkingDir: true
|
|
738
|
+
});
|
|
739
|
+
if (result.exitCode !== 0) {
|
|
740
|
+
return {
|
|
741
|
+
success: false,
|
|
742
|
+
error: "AI generation failed",
|
|
743
|
+
model,
|
|
744
|
+
duration: Date.now() - startTime,
|
|
745
|
+
confidence: 0,
|
|
746
|
+
suggestedReview: []
|
|
747
|
+
};
|
|
748
|
+
}
|
|
749
|
+
const content = this.parseGeneratedContent(result.stdout);
|
|
750
|
+
if (!content || content.trim().length === 0) {
|
|
751
|
+
return {
|
|
752
|
+
success: false,
|
|
753
|
+
error: "Failed to parse generated content",
|
|
754
|
+
model,
|
|
755
|
+
duration: Date.now() - startTime,
|
|
756
|
+
confidence: 0,
|
|
757
|
+
suggestedReview: []
|
|
758
|
+
};
|
|
759
|
+
}
|
|
760
|
+
const confidence = this.calculateAIConfidence(content);
|
|
761
|
+
const suggestedReview = this.generateReviewChecklist(request, content);
|
|
762
|
+
const promptId = this.createPromptId(request.name);
|
|
763
|
+
return {
|
|
764
|
+
success: true,
|
|
765
|
+
prompt: {
|
|
766
|
+
id: promptId,
|
|
767
|
+
name: request.name,
|
|
768
|
+
description: request.description,
|
|
769
|
+
category: request.category,
|
|
770
|
+
status: "active",
|
|
771
|
+
variant: request.variant,
|
|
772
|
+
tags: request.tags || [],
|
|
773
|
+
autoOptimize: request.autoOptimize ?? false,
|
|
774
|
+
currentVersion: "v1.0.0",
|
|
775
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
776
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
777
|
+
usageCount: 0
|
|
778
|
+
},
|
|
779
|
+
version: {
|
|
780
|
+
id: "v1.0.0",
|
|
781
|
+
promptId,
|
|
782
|
+
content,
|
|
783
|
+
contentHash: "",
|
|
784
|
+
isActive: true,
|
|
785
|
+
isGenerated: true,
|
|
786
|
+
generationModel: model,
|
|
787
|
+
generationPrompt,
|
|
788
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
789
|
+
},
|
|
790
|
+
model,
|
|
791
|
+
duration: Date.now() - startTime,
|
|
792
|
+
confidence,
|
|
793
|
+
suggestedReview
|
|
794
|
+
};
|
|
795
|
+
} catch (error) {
|
|
796
|
+
return {
|
|
797
|
+
success: false,
|
|
798
|
+
error: error.message,
|
|
799
|
+
model,
|
|
800
|
+
duration: Date.now() - startTime,
|
|
801
|
+
confidence: 0,
|
|
802
|
+
suggestedReview: []
|
|
803
|
+
};
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
/**
|
|
807
|
+
* Generate using templates (fallback)
|
|
808
|
+
*/
|
|
809
|
+
async generateFromTemplates(request) {
|
|
810
|
+
try {
|
|
811
|
+
const template = this.selectTemplate(request);
|
|
812
|
+
if (!template) {
|
|
813
|
+
return {
|
|
814
|
+
success: false,
|
|
815
|
+
error: "No suitable template found for request",
|
|
816
|
+
model: "template-based",
|
|
817
|
+
duration: 0,
|
|
818
|
+
confidence: 0,
|
|
819
|
+
suggestedReview: []
|
|
820
|
+
};
|
|
821
|
+
}
|
|
822
|
+
const startTime = Date.now();
|
|
823
|
+
const content = this.buildFromTemplate(template, request);
|
|
824
|
+
const confidence = this.calculateTemplateConfidence(template, request);
|
|
825
|
+
const suggestedReview = this.generateReviewChecklist(request, content);
|
|
826
|
+
const promptId = this.createPromptId(request.name);
|
|
827
|
+
const duration = Date.now() - startTime;
|
|
828
|
+
return {
|
|
829
|
+
success: true,
|
|
830
|
+
prompt: {
|
|
831
|
+
id: promptId,
|
|
832
|
+
name: request.name,
|
|
833
|
+
description: request.description,
|
|
834
|
+
category: request.category,
|
|
835
|
+
status: "active",
|
|
836
|
+
variant: request.variant,
|
|
837
|
+
tags: request.tags || [],
|
|
838
|
+
autoOptimize: request.autoOptimize ?? false,
|
|
839
|
+
currentVersion: "v1.0.0",
|
|
840
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
841
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
842
|
+
usageCount: 0
|
|
843
|
+
},
|
|
844
|
+
version: {
|
|
845
|
+
id: "v1.0.0",
|
|
846
|
+
promptId,
|
|
847
|
+
content,
|
|
848
|
+
contentHash: "",
|
|
849
|
+
isActive: true,
|
|
850
|
+
isGenerated: true,
|
|
851
|
+
generationModel: "template-based",
|
|
852
|
+
generationPrompt: JSON.stringify(request),
|
|
853
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
854
|
+
},
|
|
855
|
+
model: "template-based",
|
|
856
|
+
duration,
|
|
857
|
+
confidence,
|
|
858
|
+
suggestedReview
|
|
859
|
+
};
|
|
860
|
+
} catch (error) {
|
|
861
|
+
return {
|
|
862
|
+
success: false,
|
|
863
|
+
error: error.message,
|
|
864
|
+
model: "template-based",
|
|
865
|
+
duration: 0,
|
|
866
|
+
confidence: 0,
|
|
867
|
+
suggestedReview: []
|
|
868
|
+
};
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
/**
|
|
872
|
+
* Generate prompt from a template with provided values
|
|
873
|
+
*/
|
|
874
|
+
generateFromTemplate(templateId, values) {
|
|
875
|
+
const template = this.templates.get(templateId);
|
|
876
|
+
if (!template) {
|
|
877
|
+
throw new Error(`Template "${templateId}" not found`);
|
|
878
|
+
}
|
|
879
|
+
return this.buildFromTemplate(template, values);
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* Get all available templates
|
|
883
|
+
*/
|
|
884
|
+
getTemplates(category) {
|
|
885
|
+
const templates = Array.from(this.templates.values());
|
|
886
|
+
if (category) {
|
|
887
|
+
return templates.filter((t) => t.category === category);
|
|
888
|
+
}
|
|
889
|
+
return templates;
|
|
890
|
+
}
|
|
891
|
+
/**
|
|
892
|
+
* Get a specific template
|
|
893
|
+
*/
|
|
894
|
+
getTemplate(id) {
|
|
895
|
+
return this.templates.get(id) || null;
|
|
896
|
+
}
|
|
897
|
+
/**
|
|
898
|
+
* Register a custom template
|
|
899
|
+
*/
|
|
900
|
+
registerTemplate(template) {
|
|
901
|
+
this.templates.set(template.id, template);
|
|
902
|
+
}
|
|
903
|
+
/**
|
|
904
|
+
* Generate multiple variants with different strategies
|
|
905
|
+
*/
|
|
906
|
+
async generateVariants(baseRequest, strategies) {
|
|
907
|
+
const results = [];
|
|
908
|
+
for (const strategy of strategies) {
|
|
909
|
+
const variantRequest = {
|
|
910
|
+
...baseRequest,
|
|
911
|
+
name: `${baseRequest.name} (${strategy})`,
|
|
912
|
+
variant: strategy,
|
|
913
|
+
goal: `${baseRequest.goal} (${strategy} approach)`
|
|
914
|
+
};
|
|
915
|
+
const result = await this.generate(variantRequest);
|
|
916
|
+
results.push(result);
|
|
917
|
+
}
|
|
918
|
+
return results;
|
|
919
|
+
}
|
|
920
|
+
/**
|
|
921
|
+
* Refine an existing prompt with improvements
|
|
922
|
+
*/
|
|
923
|
+
async refine(promptId, refinementGoals) {
|
|
924
|
+
try {
|
|
925
|
+
const existingPrompt = this.manager.get(promptId);
|
|
926
|
+
if (!existingPrompt) {
|
|
927
|
+
return {
|
|
928
|
+
success: false,
|
|
929
|
+
error: `Prompt "${promptId}" not found`,
|
|
930
|
+
model: this.defaultModel,
|
|
931
|
+
duration: 0,
|
|
932
|
+
confidence: 0,
|
|
933
|
+
suggestedReview: []
|
|
934
|
+
};
|
|
935
|
+
}
|
|
936
|
+
const currentVersion = this.manager.getVersion(promptId, existingPrompt.currentVersion);
|
|
937
|
+
if (!currentVersion) {
|
|
938
|
+
return {
|
|
939
|
+
success: false,
|
|
940
|
+
error: `Current version not found for prompt "${promptId}"`,
|
|
941
|
+
model: this.defaultModel,
|
|
942
|
+
duration: 0,
|
|
943
|
+
confidence: 0,
|
|
944
|
+
suggestedReview: []
|
|
945
|
+
};
|
|
946
|
+
}
|
|
947
|
+
if (!this.engine) {
|
|
948
|
+
return {
|
|
949
|
+
success: false,
|
|
950
|
+
error: "No AI engine configured for refinement",
|
|
951
|
+
model: "none",
|
|
952
|
+
duration: 0,
|
|
953
|
+
confidence: 0,
|
|
954
|
+
suggestedReview: []
|
|
955
|
+
};
|
|
956
|
+
}
|
|
957
|
+
const startTime = Date.now();
|
|
958
|
+
const refinementPrompt = `You are an expert prompt engineer. Refine the following prompt based on these goals:
|
|
959
|
+
|
|
960
|
+
Current Prompt:
|
|
961
|
+
${currentVersion.content}
|
|
962
|
+
|
|
963
|
+
Refinement Goals:
|
|
964
|
+
${refinementGoals.map((goal, i) => `${i + 1}. ${goal}`).join("\n")}
|
|
965
|
+
|
|
966
|
+
Generate an improved version of the prompt that addresses these refinement goals while maintaining its core purpose.
|
|
967
|
+
|
|
968
|
+
Output the refined prompt after the marker "GENERATED PROMPT:" on a new line.`;
|
|
969
|
+
const result = await this.engine.run({
|
|
970
|
+
profile: this.profile,
|
|
971
|
+
prompt: refinementPrompt,
|
|
972
|
+
workingDir: this.workingDir,
|
|
973
|
+
model: this.defaultModel,
|
|
974
|
+
// Refinement only parses stdout; same direct-engine.run caveat as above.
|
|
975
|
+
executionIntent: "analysis",
|
|
976
|
+
readOnlyWorkingDir: true
|
|
977
|
+
});
|
|
978
|
+
if (result.exitCode !== 0) {
|
|
979
|
+
return {
|
|
980
|
+
success: false,
|
|
981
|
+
error: "Refinement generation failed",
|
|
982
|
+
model: this.defaultModel,
|
|
983
|
+
duration: Date.now() - startTime,
|
|
984
|
+
confidence: 0,
|
|
985
|
+
suggestedReview: []
|
|
986
|
+
};
|
|
987
|
+
}
|
|
988
|
+
const content = this.parseGeneratedContent(result.stdout);
|
|
989
|
+
if (!content || content.trim().length === 0) {
|
|
990
|
+
return {
|
|
991
|
+
success: false,
|
|
992
|
+
error: "Failed to parse refined content",
|
|
993
|
+
model: this.defaultModel,
|
|
994
|
+
duration: Date.now() - startTime,
|
|
995
|
+
confidence: 0,
|
|
996
|
+
suggestedReview: []
|
|
997
|
+
};
|
|
998
|
+
}
|
|
999
|
+
const confidence = this.calculateAIConfidence(content);
|
|
1000
|
+
const versionId = `v${Date.now()}`;
|
|
1001
|
+
await this.manager.createVersion({
|
|
1002
|
+
promptId,
|
|
1003
|
+
content,
|
|
1004
|
+
version: versionId,
|
|
1005
|
+
changelog: `Refined: ${refinementGoals.join(", ")}`,
|
|
1006
|
+
isGenerated: true,
|
|
1007
|
+
generationModel: this.defaultModel,
|
|
1008
|
+
generationPrompt: refinementPrompt
|
|
1009
|
+
});
|
|
1010
|
+
return {
|
|
1011
|
+
success: true,
|
|
1012
|
+
prompt: existingPrompt,
|
|
1013
|
+
version: {
|
|
1014
|
+
id: versionId,
|
|
1015
|
+
promptId,
|
|
1016
|
+
content,
|
|
1017
|
+
contentHash: "",
|
|
1018
|
+
isActive: true,
|
|
1019
|
+
isGenerated: true,
|
|
1020
|
+
generationModel: this.defaultModel,
|
|
1021
|
+
generationPrompt: refinementPrompt,
|
|
1022
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1023
|
+
},
|
|
1024
|
+
model: this.defaultModel,
|
|
1025
|
+
duration: Date.now() - startTime,
|
|
1026
|
+
confidence,
|
|
1027
|
+
suggestedReview: this.generateReviewChecklist(
|
|
1028
|
+
{
|
|
1029
|
+
name: existingPrompt.name,
|
|
1030
|
+
description: existingPrompt.description,
|
|
1031
|
+
category: existingPrompt.category,
|
|
1032
|
+
goal: refinementGoals.join(", ")
|
|
1033
|
+
},
|
|
1034
|
+
content
|
|
1035
|
+
)
|
|
1036
|
+
};
|
|
1037
|
+
} catch (error) {
|
|
1038
|
+
return {
|
|
1039
|
+
success: false,
|
|
1040
|
+
error: error.message,
|
|
1041
|
+
model: this.defaultModel,
|
|
1042
|
+
duration: 0,
|
|
1043
|
+
confidence: 0,
|
|
1044
|
+
suggestedReview: []
|
|
1045
|
+
};
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
/**
|
|
1049
|
+
* Close store and manager connections
|
|
1050
|
+
*/
|
|
1051
|
+
close() {
|
|
1052
|
+
this.store.close();
|
|
1053
|
+
this.manager.close();
|
|
1054
|
+
}
|
|
1055
|
+
// Private helper methods
|
|
1056
|
+
/**
|
|
1057
|
+
* Build generation prompt for AI
|
|
1058
|
+
*/
|
|
1059
|
+
buildGenerationPrompt(request) {
|
|
1060
|
+
const parts = [
|
|
1061
|
+
"You are an expert prompt engineer. Generate a high-quality prompt based on these requirements:",
|
|
1062
|
+
"",
|
|
1063
|
+
`Name: ${request.name}`,
|
|
1064
|
+
`Description: ${request.description}`,
|
|
1065
|
+
`Category: ${request.category}`
|
|
1066
|
+
];
|
|
1067
|
+
if (request.variant) {
|
|
1068
|
+
parts.push(`Strategy: ${request.variant}`);
|
|
1069
|
+
}
|
|
1070
|
+
if (request.goal) {
|
|
1071
|
+
parts.push(`Goal: ${request.goal}`);
|
|
1072
|
+
}
|
|
1073
|
+
if (request.context) {
|
|
1074
|
+
parts.push(`Context: ${request.context}`);
|
|
1075
|
+
}
|
|
1076
|
+
if (request.constraints && request.constraints.length > 0) {
|
|
1077
|
+
parts.push(`Constraints: ${request.constraints.join(", ")}`);
|
|
1078
|
+
}
|
|
1079
|
+
if (request.examples && request.examples.length > 0) {
|
|
1080
|
+
parts.push(`Examples: ${request.examples.join(", ")}`);
|
|
1081
|
+
}
|
|
1082
|
+
if (request.tags && request.tags.length > 0) {
|
|
1083
|
+
parts.push(`Tags: ${request.tags.join(", ")}`);
|
|
1084
|
+
}
|
|
1085
|
+
if (request.basedOn && request.basedOn.length > 0) {
|
|
1086
|
+
parts.push(`Based on templates: ${request.basedOn.join(", ")}`);
|
|
1087
|
+
}
|
|
1088
|
+
parts.push(
|
|
1089
|
+
"",
|
|
1090
|
+
"Requirements:",
|
|
1091
|
+
"1. Create a clear, specific, and actionable prompt",
|
|
1092
|
+
"2. Include explicit instructions and expectations",
|
|
1093
|
+
"3. Specify measurable success criteria",
|
|
1094
|
+
"4. Consider edge cases and error scenarios",
|
|
1095
|
+
"5. Make the prompt self-contained and complete",
|
|
1096
|
+
"",
|
|
1097
|
+
'Output the generated prompt after the marker "GENERATED PROMPT:" on a new line.'
|
|
1098
|
+
);
|
|
1099
|
+
return parts.join("\n");
|
|
1100
|
+
}
|
|
1101
|
+
/**
|
|
1102
|
+
* Parse generated content from AI output
|
|
1103
|
+
*/
|
|
1104
|
+
parseGeneratedContent(output) {
|
|
1105
|
+
const markerIndex = output.indexOf("GENERATED PROMPT:");
|
|
1106
|
+
if (markerIndex !== -1) {
|
|
1107
|
+
const afterMarker = output.substring(markerIndex + "GENERATED PROMPT:".length).trim();
|
|
1108
|
+
return afterMarker;
|
|
1109
|
+
}
|
|
1110
|
+
return output.trim();
|
|
1111
|
+
}
|
|
1112
|
+
/**
|
|
1113
|
+
* Calculate confidence for AI-generated content
|
|
1114
|
+
*/
|
|
1115
|
+
calculateAIConfidence(content) {
|
|
1116
|
+
let confidence = 0.5;
|
|
1117
|
+
const wordCount = content.split(/\s+/).length;
|
|
1118
|
+
if (wordCount > 200) {
|
|
1119
|
+
confidence += 0.2;
|
|
1120
|
+
} else if (wordCount > 100) {
|
|
1121
|
+
confidence += 0.1;
|
|
1122
|
+
} else if (wordCount < 50) {
|
|
1123
|
+
confidence -= 0.1;
|
|
1124
|
+
}
|
|
1125
|
+
const vagueWords = ["maybe", "perhaps", "possibly", "might", "could", "any", "some"];
|
|
1126
|
+
const vagueCount = vagueWords.filter((word) => content.toLowerCase().includes(word)).length;
|
|
1127
|
+
confidence -= vagueCount * 0.05;
|
|
1128
|
+
const actionableVerbs = [
|
|
1129
|
+
"create",
|
|
1130
|
+
"build",
|
|
1131
|
+
"implement",
|
|
1132
|
+
"generate",
|
|
1133
|
+
"test",
|
|
1134
|
+
"validate",
|
|
1135
|
+
"optimize",
|
|
1136
|
+
"refactor",
|
|
1137
|
+
"design",
|
|
1138
|
+
"analyze"
|
|
1139
|
+
];
|
|
1140
|
+
const actionCount = actionableVerbs.filter(
|
|
1141
|
+
(verb) => content.toLowerCase().includes(verb)
|
|
1142
|
+
).length;
|
|
1143
|
+
confidence += Math.min(actionCount * 0.05, 0.2);
|
|
1144
|
+
if (content.includes("-") || content.includes("*")) {
|
|
1145
|
+
confidence += 0.05;
|
|
1146
|
+
}
|
|
1147
|
+
if (/\d+\./.test(content)) {
|
|
1148
|
+
confidence += 0.05;
|
|
1149
|
+
}
|
|
1150
|
+
return Math.max(0, Math.min(1, confidence));
|
|
1151
|
+
}
|
|
1152
|
+
/**
|
|
1153
|
+
* Create prompt ID from name
|
|
1154
|
+
*/
|
|
1155
|
+
createPromptId(name) {
|
|
1156
|
+
return name.toLowerCase().trim().replace(/[^a-z0-9\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
|
|
1157
|
+
}
|
|
1158
|
+
/**
|
|
1159
|
+
* Select the most appropriate template for a request
|
|
1160
|
+
*/
|
|
1161
|
+
selectTemplate(request) {
|
|
1162
|
+
if (request.variant) {
|
|
1163
|
+
const templateId = `strategy-${request.variant}`;
|
|
1164
|
+
const template = this.templates.get(templateId);
|
|
1165
|
+
if (template) {
|
|
1166
|
+
return template;
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
const categoryTemplates = Array.from(this.templates.values()).filter(
|
|
1170
|
+
(t) => t.category === request.category
|
|
1171
|
+
);
|
|
1172
|
+
if (categoryTemplates.length > 0) {
|
|
1173
|
+
return categoryTemplates[0] ?? null;
|
|
1174
|
+
}
|
|
1175
|
+
return this.templates.get("strategy-conservative") ?? null;
|
|
1176
|
+
}
|
|
1177
|
+
/**
|
|
1178
|
+
* Build prompt content from template and request
|
|
1179
|
+
*/
|
|
1180
|
+
buildFromTemplate(template, request) {
|
|
1181
|
+
let content = template.template;
|
|
1182
|
+
for (const placeholder of template.placeholders) {
|
|
1183
|
+
const requestValue = request[placeholder.key];
|
|
1184
|
+
const value = (typeof requestValue === "string" ? requestValue : void 0) || placeholder.defaultValue || (placeholder.required ? `[${placeholder.key.toUpperCase()}]` : "");
|
|
1185
|
+
const pattern = new RegExp(`{{${placeholder.key}}}`, "g");
|
|
1186
|
+
content = content.replace(pattern, () => value);
|
|
1187
|
+
}
|
|
1188
|
+
if (request.goal && !template.placeholders.find((p) => p.key === "goal")) {
|
|
1189
|
+
content = `${request.goal}
|
|
1190
|
+
|
|
1191
|
+
${content}`;
|
|
1192
|
+
}
|
|
1193
|
+
if (request.context && content.includes("{{context}}")) {
|
|
1194
|
+
const ctx = `Context:
|
|
1195
|
+
${request.context}`;
|
|
1196
|
+
content = content.replace(/{{context}}/g, () => ctx);
|
|
1197
|
+
}
|
|
1198
|
+
if (request.constraints && Array.isArray(request.constraints) && request.constraints.length > 0) {
|
|
1199
|
+
const constraintsText = `Constraints:
|
|
1200
|
+
${request.constraints.map((c) => `- ${c}`).join("\n")}`;
|
|
1201
|
+
if (content.includes("{{constraints}}")) {
|
|
1202
|
+
content = content.replace(/{{constraints}}/g, constraintsText);
|
|
1203
|
+
} else {
|
|
1204
|
+
content += `
|
|
1205
|
+
|
|
1206
|
+
${constraintsText}`;
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
if (request.examples && Array.isArray(request.examples) && request.examples.length > 0) {
|
|
1210
|
+
const examplesText = `
|
|
1211
|
+
|
|
1212
|
+
Examples:
|
|
1213
|
+
${request.examples.map((ex, i) => `${i + 1}. ${ex}`).join("\n")}`;
|
|
1214
|
+
content += examplesText;
|
|
1215
|
+
}
|
|
1216
|
+
content = content.replace(/{{[^}]+}}/g, "");
|
|
1217
|
+
content = content.replace(/\n\n\n+/g, "\n\n").trim();
|
|
1218
|
+
return content;
|
|
1219
|
+
}
|
|
1220
|
+
/**
|
|
1221
|
+
* Calculate confidence score for template-based generation
|
|
1222
|
+
*/
|
|
1223
|
+
calculateTemplateConfidence(template, request) {
|
|
1224
|
+
let confidence = 0.7;
|
|
1225
|
+
const requiredPlaceholders = template.placeholders.filter((p) => p.required);
|
|
1226
|
+
const providedValues = requiredPlaceholders.filter(
|
|
1227
|
+
(p) => request[p.key]
|
|
1228
|
+
);
|
|
1229
|
+
const completenessScore = providedValues.length / requiredPlaceholders.length * 0.2;
|
|
1230
|
+
confidence += completenessScore;
|
|
1231
|
+
if (request.context && request.context.length > 50) {
|
|
1232
|
+
confidence += 0.03;
|
|
1233
|
+
}
|
|
1234
|
+
if (request.constraints && request.constraints.length > 0) {
|
|
1235
|
+
confidence += 0.03;
|
|
1236
|
+
}
|
|
1237
|
+
if (request.examples && request.examples.length > 0) {
|
|
1238
|
+
confidence += 0.04;
|
|
1239
|
+
}
|
|
1240
|
+
return Math.min(1, confidence);
|
|
1241
|
+
}
|
|
1242
|
+
/**
|
|
1243
|
+
* Generate review checklist for prompt
|
|
1244
|
+
*/
|
|
1245
|
+
generateReviewChecklist(request, content) {
|
|
1246
|
+
const checklist = [
|
|
1247
|
+
"Verify that the goal is clearly stated",
|
|
1248
|
+
"Check that all requirements are specific and measurable",
|
|
1249
|
+
"Ensure acceptance criteria are well-defined",
|
|
1250
|
+
"Review for potential ambiguities or unclear terms",
|
|
1251
|
+
"Confirm that constraints are reasonable"
|
|
1252
|
+
];
|
|
1253
|
+
if (request.variant) {
|
|
1254
|
+
checklist.push(`Verify that the prompt follows ${request.variant} strategy principles`);
|
|
1255
|
+
}
|
|
1256
|
+
if (!request.examples || request.examples.length === 0) {
|
|
1257
|
+
checklist.push("Consider adding examples for clarity");
|
|
1258
|
+
}
|
|
1259
|
+
if (!request.context) {
|
|
1260
|
+
checklist.push("Consider adding more context if available");
|
|
1261
|
+
}
|
|
1262
|
+
if (content) {
|
|
1263
|
+
const wordCount = content.split(/\s+/).length;
|
|
1264
|
+
if (wordCount < 50) {
|
|
1265
|
+
checklist.push("Content seems short - consider adding more detail");
|
|
1266
|
+
}
|
|
1267
|
+
if (wordCount > 500) {
|
|
1268
|
+
checklist.push("Content is long - consider if it could be more concise");
|
|
1269
|
+
}
|
|
1270
|
+
const vagueWords = ["maybe", "perhaps", "possibly", "might", "could"];
|
|
1271
|
+
const hasVague = vagueWords.some((word) => content.toLowerCase().includes(word));
|
|
1272
|
+
if (hasVague) {
|
|
1273
|
+
checklist.push("Content contains vague language - consider making it more specific");
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
return checklist;
|
|
1277
|
+
}
|
|
1278
|
+
};
|
|
1279
|
+
|
|
1280
|
+
// src/cli/commands/prompts.ts
|
|
1281
|
+
var manager = null;
|
|
1282
|
+
var telemetry = null;
|
|
1283
|
+
var evaluator = null;
|
|
1284
|
+
var optimizer = null;
|
|
1285
|
+
function getManager() {
|
|
1286
|
+
if (!manager) {
|
|
1287
|
+
manager = new PromptManager();
|
|
1288
|
+
}
|
|
1289
|
+
return manager;
|
|
1290
|
+
}
|
|
1291
|
+
function getTelemetry() {
|
|
1292
|
+
if (!telemetry) {
|
|
1293
|
+
telemetry = getTelemetryLogger();
|
|
1294
|
+
}
|
|
1295
|
+
return telemetry;
|
|
1296
|
+
}
|
|
1297
|
+
function getEvaluator() {
|
|
1298
|
+
if (!evaluator) {
|
|
1299
|
+
evaluator = new PromptEvaluator({ telemetryLogger: getTelemetry() });
|
|
1300
|
+
}
|
|
1301
|
+
return evaluator;
|
|
1302
|
+
}
|
|
1303
|
+
function getOptimizer() {
|
|
1304
|
+
if (!optimizer) {
|
|
1305
|
+
optimizer = new PromptOptimizer({ telemetryLogger: getTelemetry() });
|
|
1306
|
+
}
|
|
1307
|
+
return optimizer;
|
|
1308
|
+
}
|
|
1309
|
+
var createAutoOptimizer = (options = {}) => new AutomaticPromptOptimizer({
|
|
1310
|
+
telemetryLogger: getTelemetry(),
|
|
1311
|
+
promptManager: getManager(),
|
|
1312
|
+
...options
|
|
1313
|
+
});
|
|
1314
|
+
async function analyzeSinglePrompt(promptId, versionId) {
|
|
1315
|
+
const prompt = getManager().getOrThrow(promptId);
|
|
1316
|
+
let version;
|
|
1317
|
+
if (versionId) {
|
|
1318
|
+
version = getManager().getVersion(versionId);
|
|
1319
|
+
if (!version) {
|
|
1320
|
+
throw new Error(`Version not found: ${versionId}`);
|
|
1321
|
+
}
|
|
1322
|
+
if (version.promptId !== promptId) {
|
|
1323
|
+
throw new Error(`Version ${versionId} does not belong to prompt ${promptId}`);
|
|
1324
|
+
}
|
|
1325
|
+
} else {
|
|
1326
|
+
version = getManager().getActiveVersion(promptId);
|
|
1327
|
+
if (!version) {
|
|
1328
|
+
throw new Error(`No active version found for prompt "${promptId}"`);
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
const analysis = await getOptimizer().analyze(version.id);
|
|
1332
|
+
return { prompt, version, analysis };
|
|
1333
|
+
}
|
|
1334
|
+
async function collectActiveAnalyses(promptIds) {
|
|
1335
|
+
const entries = [];
|
|
1336
|
+
const promptsToAnalyze = promptIds ? promptIds.map((id) => getManager().getOrThrow(id)) : getManager().list({ status: "active" });
|
|
1337
|
+
for (const prompt of promptsToAnalyze) {
|
|
1338
|
+
try {
|
|
1339
|
+
const version = getManager().getActiveVersion(prompt.id);
|
|
1340
|
+
if (!version) {
|
|
1341
|
+
console.log(chalk.yellow(` Warning: No active version for ${prompt.name}`));
|
|
1342
|
+
continue;
|
|
1343
|
+
}
|
|
1344
|
+
const analysis = await getOptimizer().analyze(version.id);
|
|
1345
|
+
entries.push({ prompt, version, analysis });
|
|
1346
|
+
} catch (error) {
|
|
1347
|
+
console.log(
|
|
1348
|
+
chalk.yellow(` Warning: Could not analyze ${prompt.name}: ${error.message}`)
|
|
1349
|
+
);
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
return entries;
|
|
1353
|
+
}
|
|
1354
|
+
async function runCreatePromptAction(options) {
|
|
1355
|
+
try {
|
|
1356
|
+
const CreateOptionsSchema = z.object({
|
|
1357
|
+
name: PromptNameSchema,
|
|
1358
|
+
description: z.string().min(1).max(500),
|
|
1359
|
+
category: z.enum(["system", "strategy", "domain", "workflow", "custom"]),
|
|
1360
|
+
file: ExistingFilePathSchema.optional(),
|
|
1361
|
+
text: PromptContentSchema.optional(),
|
|
1362
|
+
variant: z.enum(BUILT_IN_VARIANT_STRATEGIES).optional(),
|
|
1363
|
+
tags: z.string().optional(),
|
|
1364
|
+
author: z.string().min(1).max(100).optional()
|
|
1365
|
+
});
|
|
1366
|
+
const validatedOptions = validateCommandOptions(CreateOptionsSchema, options);
|
|
1367
|
+
let content = validatedOptions.text;
|
|
1368
|
+
if (validatedOptions.file) {
|
|
1369
|
+
content = fs.readFileSync(validatedOptions.file, "utf8");
|
|
1370
|
+
}
|
|
1371
|
+
if (!content) {
|
|
1372
|
+
console.error(chalk.red("Error: Must provide either --file or --text flag"));
|
|
1373
|
+
console.error(
|
|
1374
|
+
chalk.yellow(
|
|
1375
|
+
'Tip: Use --file <path> to read from a file, or --text "content" to provide content directly'
|
|
1376
|
+
)
|
|
1377
|
+
);
|
|
1378
|
+
process.exit(1);
|
|
1379
|
+
}
|
|
1380
|
+
const id = validatedOptions.name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
1381
|
+
const { prompt, version } = await getManager().create({
|
|
1382
|
+
id,
|
|
1383
|
+
name: validatedOptions.name,
|
|
1384
|
+
description: validatedOptions.description,
|
|
1385
|
+
category: validatedOptions.category,
|
|
1386
|
+
initialContent: content,
|
|
1387
|
+
variant: validatedOptions.variant,
|
|
1388
|
+
tags: validatedOptions.tags ? validatedOptions.tags.split(",").map((t) => t.trim()) : [],
|
|
1389
|
+
author: validatedOptions.author
|
|
1390
|
+
});
|
|
1391
|
+
console.log(chalk.green(`OK Created prompt: ${prompt.name}`));
|
|
1392
|
+
console.log(chalk.gray(` ID: ${prompt.id}`));
|
|
1393
|
+
console.log(chalk.gray(` Version: ${version?.id || "unknown"}`));
|
|
1394
|
+
console.log(chalk.gray(` Category: ${prompt.category}`));
|
|
1395
|
+
} catch (error) {
|
|
1396
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
1397
|
+
process.exit(1);
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
async function runEditPromptAction(idOrName, options) {
|
|
1401
|
+
try {
|
|
1402
|
+
const EditOptionsSchema = z.object({
|
|
1403
|
+
file: ExistingFilePathSchema.optional(),
|
|
1404
|
+
text: PromptContentSchema.optional(),
|
|
1405
|
+
changelog: z.string().max(500).optional(),
|
|
1406
|
+
author: z.string().min(1).max(100).optional(),
|
|
1407
|
+
activate: BooleanFlagSchema.optional()
|
|
1408
|
+
});
|
|
1409
|
+
const validatedOptions = validateCommandOptions(EditOptionsSchema, options);
|
|
1410
|
+
let content = validatedOptions.text;
|
|
1411
|
+
if (validatedOptions.file) {
|
|
1412
|
+
content = fs.readFileSync(validatedOptions.file, "utf8");
|
|
1413
|
+
}
|
|
1414
|
+
if (!content) {
|
|
1415
|
+
console.error(chalk.red("Error: Must provide either --file or --text flag"));
|
|
1416
|
+
console.error(
|
|
1417
|
+
chalk.yellow(
|
|
1418
|
+
'Tip: Use --file <path> to read from a file, or --text "content" to provide content directly'
|
|
1419
|
+
)
|
|
1420
|
+
);
|
|
1421
|
+
process.exit(1);
|
|
1422
|
+
}
|
|
1423
|
+
const resolved = resolvePromptIdOrName(idOrName);
|
|
1424
|
+
if (!resolved) {
|
|
1425
|
+
console.error(chalk.red(`Error: Prompt not found: ${idOrName}`));
|
|
1426
|
+
process.exit(1);
|
|
1427
|
+
}
|
|
1428
|
+
const version = await getManager().createVersion({
|
|
1429
|
+
promptId: resolved.id,
|
|
1430
|
+
content,
|
|
1431
|
+
changelog: validatedOptions.changelog,
|
|
1432
|
+
author: validatedOptions.author,
|
|
1433
|
+
activate: validatedOptions.activate
|
|
1434
|
+
});
|
|
1435
|
+
console.log(chalk.green(`OK Created new version: ${version.id}`));
|
|
1436
|
+
if (validatedOptions.activate) {
|
|
1437
|
+
console.log(chalk.green(" Activated as current version"));
|
|
1438
|
+
}
|
|
1439
|
+
} catch (error) {
|
|
1440
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
1441
|
+
process.exit(1);
|
|
1442
|
+
}
|
|
1443
|
+
}
|
|
1444
|
+
async function runArchivePromptAction(idOrName) {
|
|
1445
|
+
try {
|
|
1446
|
+
const resolved = resolvePromptIdOrName(idOrName);
|
|
1447
|
+
if (!resolved) {
|
|
1448
|
+
console.error(chalk.red(`Error: Prompt not found: ${idOrName}`));
|
|
1449
|
+
process.exit(1);
|
|
1450
|
+
}
|
|
1451
|
+
const updated = await getManager().archive(resolved.id);
|
|
1452
|
+
console.log(chalk.green(`OK Archived prompt: ${updated.name}`));
|
|
1453
|
+
} catch (error) {
|
|
1454
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
1455
|
+
process.exit(1);
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
async function runRestorePromptAction(idOrName) {
|
|
1459
|
+
try {
|
|
1460
|
+
const resolved = resolvePromptIdOrName(idOrName);
|
|
1461
|
+
if (!resolved) {
|
|
1462
|
+
console.error(chalk.red(`Error: Prompt not found: ${idOrName}`));
|
|
1463
|
+
process.exit(1);
|
|
1464
|
+
}
|
|
1465
|
+
const updated = await getManager().restore(resolved.id);
|
|
1466
|
+
console.log(chalk.green(`OK Restored prompt: ${updated.name}`));
|
|
1467
|
+
} catch (error) {
|
|
1468
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
1469
|
+
process.exit(1);
|
|
1470
|
+
}
|
|
1471
|
+
}
|
|
1472
|
+
async function runEvaluatePromptAction(idOrName, options) {
|
|
1473
|
+
try {
|
|
1474
|
+
if (idOrName) {
|
|
1475
|
+
const resolved = resolvePromptIdOrName(idOrName);
|
|
1476
|
+
if (!resolved) {
|
|
1477
|
+
console.error(chalk.red(`Prompt not found: ${idOrName}`));
|
|
1478
|
+
process.exit(1);
|
|
1479
|
+
}
|
|
1480
|
+
const version = getManager().getActiveVersion(resolved.id);
|
|
1481
|
+
if (!version) {
|
|
1482
|
+
console.error(chalk.red("No active version found"));
|
|
1483
|
+
process.exit(1);
|
|
1484
|
+
}
|
|
1485
|
+
const result = await getEvaluator().evaluate(version.id, {}, resolved.variant);
|
|
1486
|
+
console.log(chalk.bold.cyan(`
|
|
1487
|
+
Performance: ${resolved.name}
|
|
1488
|
+
`));
|
|
1489
|
+
console.log(
|
|
1490
|
+
chalk.gray(
|
|
1491
|
+
`Success Rate: ${(result.performance.successRate * 100).toFixed(1)}% (${result.performance.successfulExecutions}/${result.performance.totalExecutions})`
|
|
1492
|
+
)
|
|
1493
|
+
);
|
|
1494
|
+
console.log(chalk.gray(`Avg Completeness: ${result.performance.avgCompleteness.toFixed(1)}`));
|
|
1495
|
+
console.log(chalk.gray(`Avg Duration: ${result.performance.avgDuration.toFixed(1)}s`));
|
|
1496
|
+
console.log(chalk.gray(`Sample Size: ${result.performance.sampleSize}`));
|
|
1497
|
+
console.log(chalk.gray(`
|
|
1498
|
+
Recommendation: ${result.recommendation}`));
|
|
1499
|
+
console.log(chalk.gray(`Rationale: ${result.rationale}`));
|
|
1500
|
+
return;
|
|
1501
|
+
}
|
|
1502
|
+
if (options.all) {
|
|
1503
|
+
console.log(chalk.cyan("Evaluating all prompts...\n"));
|
|
1504
|
+
const promptList = getManager().list({ status: "active" });
|
|
1505
|
+
let evaluated = 0;
|
|
1506
|
+
for (const p of promptList) {
|
|
1507
|
+
const version = getManager().getActiveVersion(p.id);
|
|
1508
|
+
if (!version) continue;
|
|
1509
|
+
try {
|
|
1510
|
+
const result = await getEvaluator().evaluate(version.id, {}, p.variant);
|
|
1511
|
+
console.log(chalk.bold(p.name) + chalk.gray(` (${version.id})`));
|
|
1512
|
+
console.log(
|
|
1513
|
+
chalk.gray(
|
|
1514
|
+
` Success: ${(result.performance.successRate * 100).toFixed(1)}% | Completeness: ${result.performance.avgCompleteness.toFixed(1)} | Recommendation: ${result.recommendation}`
|
|
1515
|
+
)
|
|
1516
|
+
);
|
|
1517
|
+
evaluated++;
|
|
1518
|
+
} catch (error) {
|
|
1519
|
+
console.log(
|
|
1520
|
+
chalk.yellow(` Warning: Could not evaluate ${p.name}: ${error.message}`)
|
|
1521
|
+
);
|
|
1522
|
+
}
|
|
1523
|
+
}
|
|
1524
|
+
console.log(chalk.green(`
|
|
1525
|
+
OK Evaluated ${evaluated} prompts`));
|
|
1526
|
+
return;
|
|
1527
|
+
}
|
|
1528
|
+
console.error(chalk.red("Error: Must provide --id or --all flag"));
|
|
1529
|
+
console.error(
|
|
1530
|
+
chalk.yellow(
|
|
1531
|
+
"Tip: Use --id <prompt-id> to evaluate a specific prompt, or --all to evaluate all prompts"
|
|
1532
|
+
)
|
|
1533
|
+
);
|
|
1534
|
+
process.exit(1);
|
|
1535
|
+
} catch (error) {
|
|
1536
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
1537
|
+
process.exit(1);
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
function resolvePromptIdOrName(idOrName) {
|
|
1541
|
+
const direct = getManager().get(idOrName);
|
|
1542
|
+
if (direct) return direct;
|
|
1543
|
+
return getManager().list().find((p) => p.name === idOrName) ?? null;
|
|
1544
|
+
}
|
|
1545
|
+
function getUnderperformanceIssues(entry) {
|
|
1546
|
+
const issues = [];
|
|
1547
|
+
const performance = entry.analysis.performance;
|
|
1548
|
+
if (performance.sampleSize < 5) {
|
|
1549
|
+
issues.push(`Insufficient data (sample size ${performance.sampleSize}/5)`);
|
|
1550
|
+
}
|
|
1551
|
+
if (performance.successRate < 0.7) {
|
|
1552
|
+
issues.push(`Success rate ${(performance.successRate * 100).toFixed(1)}% below 70% target`);
|
|
1553
|
+
}
|
|
1554
|
+
if (performance.avgCompleteness < 70) {
|
|
1555
|
+
issues.push(`Completeness ${performance.avgCompleteness.toFixed(1)} below 70 target`);
|
|
1556
|
+
}
|
|
1557
|
+
if (performance.avgDuration > 300) {
|
|
1558
|
+
issues.push(`Average duration ${performance.avgDuration.toFixed(0)}s exceeds 300s budget`);
|
|
1559
|
+
}
|
|
1560
|
+
if (entry.analysis.overallScore < 70) {
|
|
1561
|
+
issues.push(`Overall score ${entry.analysis.overallScore.toFixed(1)} below 70`);
|
|
1562
|
+
}
|
|
1563
|
+
return issues;
|
|
1564
|
+
}
|
|
1565
|
+
function formatPerformanceSummary(analysis) {
|
|
1566
|
+
const performance = analysis.performance;
|
|
1567
|
+
return `Success ${(performance.successRate * 100).toFixed(1)}% | Completeness ${performance.avgCompleteness.toFixed(1)} | Duration ${performance.avgDuration.toFixed(1)}s | Sample ${performance.sampleSize}`;
|
|
1568
|
+
}
|
|
1569
|
+
function createPromptsCommand() {
|
|
1570
|
+
const prompts = new Command("prompts").description(
|
|
1571
|
+
'Manage prompts, versions, and optimization\n\nExamples:\n poetic prompts list\n poetic prompts create --name "My Prompt" --description "..." --category system\n poetic prompts analyze-suggestions --id prompt-123'
|
|
1572
|
+
).alias("p");
|
|
1573
|
+
prompts.command("list").alias("ls").description(
|
|
1574
|
+
"List all prompts\n\nExamples:\n poetic prompts list\n poetic prompts list --category system --status active\n poetic prompts list --limit 100"
|
|
1575
|
+
).option(
|
|
1576
|
+
"-c, --category <category>",
|
|
1577
|
+
"(OPTIONAL) Filter by category\n Example: --category system"
|
|
1578
|
+
).option(
|
|
1579
|
+
"-s, --status <status>",
|
|
1580
|
+
"(OPTIONAL) Filter by status (active|archived|template)\n Example: --status active",
|
|
1581
|
+
"active"
|
|
1582
|
+
).option(
|
|
1583
|
+
"-v, --variant <variant>",
|
|
1584
|
+
"(OPTIONAL) Filter by variant\n Example: --variant conservative"
|
|
1585
|
+
).option("--limit <number>", "(OPTIONAL) Limit results\n Example: --limit 100", "50").action(async (options) => {
|
|
1586
|
+
try {
|
|
1587
|
+
const ListOptionsSchema = z.object({
|
|
1588
|
+
category: PromptCategorySchema.optional(),
|
|
1589
|
+
status: z.enum(["active", "archived", "template"]).default("active"),
|
|
1590
|
+
variant: z.string().optional(),
|
|
1591
|
+
limit: z.coerce.number().int().positive().max(1e3).default(50)
|
|
1592
|
+
});
|
|
1593
|
+
const validatedOptions = validateCommandOptions(ListOptionsSchema, options);
|
|
1594
|
+
const prompts2 = getManager().list({
|
|
1595
|
+
category: validatedOptions.category,
|
|
1596
|
+
status: validatedOptions.status,
|
|
1597
|
+
variant: validatedOptions.variant,
|
|
1598
|
+
limit: validatedOptions.limit
|
|
1599
|
+
});
|
|
1600
|
+
if (prompts2.length === 0) {
|
|
1601
|
+
console.log(chalk.yellow("No prompts found"));
|
|
1602
|
+
return;
|
|
1603
|
+
}
|
|
1604
|
+
console.log(chalk.bold.cyan(`
|
|
1605
|
+
Prompts (${prompts2.length})
|
|
1606
|
+
`));
|
|
1607
|
+
for (const prompt of prompts2) {
|
|
1608
|
+
const statusIcon = prompt.status === "active" ? "OK" : "";
|
|
1609
|
+
console.log(chalk.bold(`${statusIcon} ${prompt.name}`) + chalk.gray(` (${prompt.id})`));
|
|
1610
|
+
console.log(chalk.gray(` ${prompt.description}`));
|
|
1611
|
+
console.log(
|
|
1612
|
+
chalk.gray(
|
|
1613
|
+
` Category: ${prompt.category} | Status: ${prompt.status} | Version: ${prompt.currentVersion}`
|
|
1614
|
+
)
|
|
1615
|
+
);
|
|
1616
|
+
if (prompt.variant) {
|
|
1617
|
+
console.log(chalk.gray(` Variant: ${prompt.variant}`));
|
|
1618
|
+
}
|
|
1619
|
+
if (prompt.tags.length > 0) {
|
|
1620
|
+
console.log(chalk.gray(` Tags: ${prompt.tags.join(", ")}`));
|
|
1621
|
+
}
|
|
1622
|
+
console.log(chalk.gray(` Used: ${prompt.usageCount} times`));
|
|
1623
|
+
console.log("");
|
|
1624
|
+
}
|
|
1625
|
+
} catch (error) {
|
|
1626
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
1627
|
+
process.exit(1);
|
|
1628
|
+
}
|
|
1629
|
+
});
|
|
1630
|
+
prompts.command("create").description(
|
|
1631
|
+
'Create a new prompt\n\nExamples:\n poetic prompts create --name "My Prompt" --description "..." --category system --text "Prompt content"\n poetic prompts create --name "My Prompt" --description "..." --category system --file prompt.txt'
|
|
1632
|
+
).requiredOption("-n, --name <name>", '(REQUIRED) Prompt name\n Example: --name "My Prompt"').requiredOption(
|
|
1633
|
+
"-d, --description <description>",
|
|
1634
|
+
'(REQUIRED) Prompt description\n Example: --description "Description text"'
|
|
1635
|
+
).requiredOption(
|
|
1636
|
+
"-c, --category <category>",
|
|
1637
|
+
"(REQUIRED) Category (system|strategy|domain|workflow|custom)\n Example: --category system"
|
|
1638
|
+
).option(
|
|
1639
|
+
"-f, --file <file>",
|
|
1640
|
+
"(OPTIONAL) Read prompt content from file\n Example: --file prompt.txt"
|
|
1641
|
+
).option(
|
|
1642
|
+
"-t, --text <text>",
|
|
1643
|
+
'(OPTIONAL) Prompt content as text\n Example: --text "Prompt content here"'
|
|
1644
|
+
).option(
|
|
1645
|
+
"-v, --variant <variant>",
|
|
1646
|
+
"(OPTIONAL) Variant strategy (conservative|innovative|hybrid|fast)\n Example: --variant conservative"
|
|
1647
|
+
).option("--tags <tags>", "(OPTIONAL) Comma-separated tags\n Example: --tags auth,security").option("-a, --author <author>", '(OPTIONAL) Author name\n Example: --author "John Doe"').action(async (options) => {
|
|
1648
|
+
try {
|
|
1649
|
+
const CreateOptionsSchema = z.object({
|
|
1650
|
+
name: PromptNameSchema,
|
|
1651
|
+
description: z.string().min(1).max(500),
|
|
1652
|
+
category: z.enum(["system", "strategy", "domain", "workflow", "custom"]),
|
|
1653
|
+
file: ExistingFilePathSchema.optional(),
|
|
1654
|
+
text: PromptContentSchema.optional(),
|
|
1655
|
+
variant: z.enum(BUILT_IN_VARIANT_STRATEGIES).optional(),
|
|
1656
|
+
tags: z.string().optional(),
|
|
1657
|
+
author: z.string().min(1).max(100).optional()
|
|
1658
|
+
});
|
|
1659
|
+
const validatedOptions = validateCommandOptions(CreateOptionsSchema, options);
|
|
1660
|
+
let content = validatedOptions.text;
|
|
1661
|
+
if (validatedOptions.file) {
|
|
1662
|
+
content = fs.readFileSync(validatedOptions.file, "utf8");
|
|
1663
|
+
}
|
|
1664
|
+
if (!content) {
|
|
1665
|
+
console.error(chalk.red("Error: Must provide either --file or --text flag"));
|
|
1666
|
+
console.error(
|
|
1667
|
+
chalk.yellow(
|
|
1668
|
+
'Tip: Use --file <path> to read from a file, or --text "content" to provide content directly'
|
|
1669
|
+
)
|
|
1670
|
+
);
|
|
1671
|
+
process.exit(1);
|
|
1672
|
+
}
|
|
1673
|
+
const id = validatedOptions.name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
1674
|
+
const { prompt, version } = await getManager().create({
|
|
1675
|
+
id,
|
|
1676
|
+
name: validatedOptions.name,
|
|
1677
|
+
description: validatedOptions.description,
|
|
1678
|
+
category: validatedOptions.category,
|
|
1679
|
+
initialContent: content,
|
|
1680
|
+
variant: validatedOptions.variant,
|
|
1681
|
+
tags: validatedOptions.tags ? validatedOptions.tags.split(",").map((t) => t.trim()) : [],
|
|
1682
|
+
author: validatedOptions.author
|
|
1683
|
+
});
|
|
1684
|
+
console.log(chalk.green(`OK Created prompt: ${prompt.name}`));
|
|
1685
|
+
console.log(chalk.gray(` ID: ${prompt.id}`));
|
|
1686
|
+
console.log(chalk.gray(` Version: ${version?.id || "unknown"}`));
|
|
1687
|
+
console.log(chalk.gray(` Category: ${prompt.category}`));
|
|
1688
|
+
} catch (error) {
|
|
1689
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
1690
|
+
process.exit(1);
|
|
1691
|
+
}
|
|
1692
|
+
});
|
|
1693
|
+
prompts.command("show <id>").description(
|
|
1694
|
+
"Show prompt details and content\n\nExamples:\n poetic prompts show prompt-123\n poetic prompts show prompt-123 --version version-456 --metrics"
|
|
1695
|
+
).option(
|
|
1696
|
+
"-v, --version <version>",
|
|
1697
|
+
"(OPTIONAL) Show specific version\n Example: --version version-456"
|
|
1698
|
+
).option("--metrics", "(OPTIONAL) Show performance metrics").action(async (id, options) => {
|
|
1699
|
+
try {
|
|
1700
|
+
const validatedId = validateCommandOptions(PromptIdSchema, id);
|
|
1701
|
+
const ShowOptionsSchema = z.object({
|
|
1702
|
+
version: z.string().optional(),
|
|
1703
|
+
metrics: BooleanFlagSchema.optional()
|
|
1704
|
+
});
|
|
1705
|
+
const validatedOptions = validateCommandOptions(ShowOptionsSchema, options);
|
|
1706
|
+
const prompt = getManager().get(validatedId);
|
|
1707
|
+
if (!prompt) {
|
|
1708
|
+
console.error(chalk.red(`Prompt not found: ${id}`));
|
|
1709
|
+
process.exit(1);
|
|
1710
|
+
}
|
|
1711
|
+
const version = validatedOptions.version ? getManager().getVersion(validatedOptions.version) : getManager().getActiveVersion(validatedId);
|
|
1712
|
+
if (!version) {
|
|
1713
|
+
console.error(chalk.red("Version not found"));
|
|
1714
|
+
process.exit(1);
|
|
1715
|
+
}
|
|
1716
|
+
console.log(chalk.bold.cyan(`
|
|
1717
|
+
${prompt.name}
|
|
1718
|
+
`));
|
|
1719
|
+
console.log(chalk.gray(`ID: ${prompt.id}`));
|
|
1720
|
+
console.log(chalk.gray(`Description: ${prompt.description}`));
|
|
1721
|
+
console.log(chalk.gray(`Category: ${prompt.category}`));
|
|
1722
|
+
console.log(chalk.gray(`Status: ${prompt.status}`));
|
|
1723
|
+
if (prompt.variant) {
|
|
1724
|
+
console.log(chalk.gray(`Variant: ${prompt.variant}`));
|
|
1725
|
+
}
|
|
1726
|
+
if (prompt.tags.length > 0) {
|
|
1727
|
+
console.log(chalk.gray(`Tags: ${prompt.tags.join(", ")}`));
|
|
1728
|
+
}
|
|
1729
|
+
console.log(chalk.gray(`Current Version: ${prompt.currentVersion}`));
|
|
1730
|
+
console.log(chalk.gray(`Usage Count: ${prompt.usageCount}`));
|
|
1731
|
+
console.log("");
|
|
1732
|
+
console.log(chalk.bold("Content:"));
|
|
1733
|
+
console.log(chalk.white(version.content));
|
|
1734
|
+
console.log("");
|
|
1735
|
+
if (options.metrics) {
|
|
1736
|
+
const result = await getEvaluator().evaluate(version.id, {}, prompt.variant);
|
|
1737
|
+
if (result.performance.sampleSize > 0) {
|
|
1738
|
+
console.log(chalk.bold.cyan("Performance Metrics:\n"));
|
|
1739
|
+
console.log(
|
|
1740
|
+
chalk.gray(
|
|
1741
|
+
`Success Rate: ${(result.performance.successRate * 100).toFixed(1)}% (${result.performance.successfulExecutions}/${result.performance.totalExecutions})`
|
|
1742
|
+
)
|
|
1743
|
+
);
|
|
1744
|
+
console.log(
|
|
1745
|
+
chalk.gray(`Avg Completeness: ${result.performance.avgCompleteness.toFixed(1)}`)
|
|
1746
|
+
);
|
|
1747
|
+
console.log(chalk.gray(`Avg Duration: ${result.performance.avgDuration.toFixed(1)}s`));
|
|
1748
|
+
console.log(chalk.gray(`Sample Size: ${result.performance.sampleSize}`));
|
|
1749
|
+
console.log(chalk.gray(`
|
|
1750
|
+
Recommendation: ${result.recommendation}`));
|
|
1751
|
+
console.log(chalk.gray(`Rationale: ${result.rationale}`));
|
|
1752
|
+
} else {
|
|
1753
|
+
console.log(chalk.yellow("No performance data available"));
|
|
1754
|
+
}
|
|
1755
|
+
}
|
|
1756
|
+
} catch (error) {
|
|
1757
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
1758
|
+
process.exit(1);
|
|
1759
|
+
}
|
|
1760
|
+
});
|
|
1761
|
+
prompts.command("edit <id>").description(
|
|
1762
|
+
'Create a new version of a prompt\n\nExamples:\n poetic prompts edit prompt-123 --text "New content"\n poetic prompts edit prompt-123 --file new-content.txt --activate'
|
|
1763
|
+
).option(
|
|
1764
|
+
"-f, --file <file>",
|
|
1765
|
+
"(OPTIONAL) Read new content from file\n Example: --file new-content.txt"
|
|
1766
|
+
).option(
|
|
1767
|
+
"-t, --text <text>",
|
|
1768
|
+
'(OPTIONAL) New content as text\n Example: --text "New content here"'
|
|
1769
|
+
).option(
|
|
1770
|
+
"--changelog <changelog>",
|
|
1771
|
+
'(OPTIONAL) Changelog message\n Example: --changelog "Improved clarity"'
|
|
1772
|
+
).option("-a, --author <author>", '(OPTIONAL) Author name\n Example: --author "John Doe"').option("--activate", "(OPTIONAL) Activate this version immediately").action(async (id, options) => {
|
|
1773
|
+
try {
|
|
1774
|
+
const validatedId = validateCommandOptions(PromptIdSchema, id);
|
|
1775
|
+
const EditOptionsSchema = z.object({
|
|
1776
|
+
file: ExistingFilePathSchema.optional(),
|
|
1777
|
+
text: PromptContentSchema.optional(),
|
|
1778
|
+
changelog: z.string().max(500).optional(),
|
|
1779
|
+
author: z.string().min(1).max(100).optional(),
|
|
1780
|
+
activate: BooleanFlagSchema.optional()
|
|
1781
|
+
});
|
|
1782
|
+
const validatedOptions = validateCommandOptions(EditOptionsSchema, options);
|
|
1783
|
+
let content = validatedOptions.text;
|
|
1784
|
+
if (validatedOptions.file) {
|
|
1785
|
+
content = fs.readFileSync(validatedOptions.file, "utf8");
|
|
1786
|
+
}
|
|
1787
|
+
if (!content) {
|
|
1788
|
+
console.error(chalk.red("Error: Must provide either --file or --text flag"));
|
|
1789
|
+
console.error(
|
|
1790
|
+
chalk.yellow(
|
|
1791
|
+
'Tip: Use --file <path> to read from a file, or --text "content" to provide content directly'
|
|
1792
|
+
)
|
|
1793
|
+
);
|
|
1794
|
+
process.exit(1);
|
|
1795
|
+
}
|
|
1796
|
+
const version = await getManager().createVersion({
|
|
1797
|
+
promptId: validatedId,
|
|
1798
|
+
content,
|
|
1799
|
+
changelog: validatedOptions.changelog,
|
|
1800
|
+
author: validatedOptions.author,
|
|
1801
|
+
activate: validatedOptions.activate
|
|
1802
|
+
});
|
|
1803
|
+
console.log(chalk.green(`OK Created new version: ${version.id}`));
|
|
1804
|
+
if (validatedOptions.activate) {
|
|
1805
|
+
console.log(chalk.green(" Activated as current version"));
|
|
1806
|
+
}
|
|
1807
|
+
} catch (error) {
|
|
1808
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
1809
|
+
process.exit(1);
|
|
1810
|
+
}
|
|
1811
|
+
});
|
|
1812
|
+
prompts.command("archive <id>").description("Archive a prompt\n\nExamples:\n poetic prompts archive prompt-123").action(async (id) => {
|
|
1813
|
+
try {
|
|
1814
|
+
const validatedId = validateCommandOptions(PromptIdSchema, id);
|
|
1815
|
+
const updated = await getManager().archive(validatedId);
|
|
1816
|
+
console.log(chalk.green(`OK Archived prompt: ${updated.name}`));
|
|
1817
|
+
} catch (error) {
|
|
1818
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
1819
|
+
process.exit(1);
|
|
1820
|
+
}
|
|
1821
|
+
});
|
|
1822
|
+
prompts.command("restore <id>").description("Restore an archived prompt\n\nExamples:\n poetic prompts restore prompt-123").action(async (id) => {
|
|
1823
|
+
try {
|
|
1824
|
+
const validatedId = validateCommandOptions(PromptIdSchema, id);
|
|
1825
|
+
const updated = await getManager().restore(validatedId);
|
|
1826
|
+
console.log(chalk.green(`OK Restored prompt: ${updated.name}`));
|
|
1827
|
+
} catch (error) {
|
|
1828
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
1829
|
+
process.exit(1);
|
|
1830
|
+
}
|
|
1831
|
+
});
|
|
1832
|
+
prompts.command("evaluate").alias("eval").description(
|
|
1833
|
+
"Evaluate prompt performance from telemetry\n\nExamples:\n poetic prompts evaluate --id prompt-123\n poetic prompts evaluate --all"
|
|
1834
|
+
).option("-i, --id <id>", "(OPTIONAL) Evaluate specific prompt\n Example: --id prompt-123").option("--all", "(OPTIONAL) Evaluate all prompts").action(async (options) => {
|
|
1835
|
+
try {
|
|
1836
|
+
if (options.id) {
|
|
1837
|
+
const prompt = getManager().get(options.id);
|
|
1838
|
+
if (!prompt) {
|
|
1839
|
+
console.error(chalk.red(`Prompt not found: ${options.id}`));
|
|
1840
|
+
process.exit(1);
|
|
1841
|
+
}
|
|
1842
|
+
const version = getManager().getActiveVersion(options.id);
|
|
1843
|
+
if (!version) {
|
|
1844
|
+
console.error(chalk.red("No active version found"));
|
|
1845
|
+
process.exit(1);
|
|
1846
|
+
}
|
|
1847
|
+
const result = await getEvaluator().evaluate(version.id, {}, prompt.variant);
|
|
1848
|
+
console.log(chalk.bold.cyan(`
|
|
1849
|
+
Performance: ${prompt.name}
|
|
1850
|
+
`));
|
|
1851
|
+
console.log(
|
|
1852
|
+
chalk.gray(
|
|
1853
|
+
`Success Rate: ${(result.performance.successRate * 100).toFixed(1)}% (${result.performance.successfulExecutions}/${result.performance.totalExecutions})`
|
|
1854
|
+
)
|
|
1855
|
+
);
|
|
1856
|
+
console.log(
|
|
1857
|
+
chalk.gray(`Avg Completeness: ${result.performance.avgCompleteness.toFixed(1)}`)
|
|
1858
|
+
);
|
|
1859
|
+
console.log(chalk.gray(`Avg Duration: ${result.performance.avgDuration.toFixed(1)}s`));
|
|
1860
|
+
console.log(chalk.gray(`Sample Size: ${result.performance.sampleSize}`));
|
|
1861
|
+
console.log(chalk.gray(`
|
|
1862
|
+
Recommendation: ${result.recommendation}`));
|
|
1863
|
+
console.log(chalk.gray(`Rationale: ${result.rationale}`));
|
|
1864
|
+
} else if (options.all) {
|
|
1865
|
+
console.log(chalk.cyan("Evaluating all prompts...\n"));
|
|
1866
|
+
const prompts2 = getManager().list({ status: "active" });
|
|
1867
|
+
let evaluated = 0;
|
|
1868
|
+
for (const prompt of prompts2) {
|
|
1869
|
+
const version = getManager().getActiveVersion(prompt.id);
|
|
1870
|
+
if (version) {
|
|
1871
|
+
try {
|
|
1872
|
+
const result = await getEvaluator().evaluate(version.id, {}, prompt.variant);
|
|
1873
|
+
console.log(chalk.bold(prompt.name) + chalk.gray(` (${version.id})`));
|
|
1874
|
+
console.log(
|
|
1875
|
+
chalk.gray(
|
|
1876
|
+
` Success: ${(result.performance.successRate * 100).toFixed(1)}% | Completeness: ${result.performance.avgCompleteness.toFixed(1)} | Recommendation: ${result.recommendation}`
|
|
1877
|
+
)
|
|
1878
|
+
);
|
|
1879
|
+
evaluated++;
|
|
1880
|
+
} catch (error) {
|
|
1881
|
+
console.log(
|
|
1882
|
+
chalk.yellow(
|
|
1883
|
+
` Warning: Could not evaluate ${prompt.name}: ${error.message}`
|
|
1884
|
+
)
|
|
1885
|
+
);
|
|
1886
|
+
}
|
|
1887
|
+
}
|
|
1888
|
+
}
|
|
1889
|
+
console.log(chalk.green(`
|
|
1890
|
+
OK Evaluated ${evaluated} prompts`));
|
|
1891
|
+
} else {
|
|
1892
|
+
console.error(chalk.red("Error: Must provide --id or --all flag"));
|
|
1893
|
+
console.error(
|
|
1894
|
+
chalk.yellow(
|
|
1895
|
+
"Tip: Use --id <prompt-id> to evaluate a specific prompt, or --all to evaluate all prompts"
|
|
1896
|
+
)
|
|
1897
|
+
);
|
|
1898
|
+
process.exit(1);
|
|
1899
|
+
}
|
|
1900
|
+
} catch (error) {
|
|
1901
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
1902
|
+
process.exit(1);
|
|
1903
|
+
}
|
|
1904
|
+
});
|
|
1905
|
+
const analyzeSuggestionsAction = async (options) => {
|
|
1906
|
+
try {
|
|
1907
|
+
const topN = parseInt(options.top ?? "10", 10);
|
|
1908
|
+
if (Number.isNaN(topN) || topN <= 0) {
|
|
1909
|
+
console.error(chalk.red("Error: --top flag must be a positive integer"));
|
|
1910
|
+
console.error(chalk.yellow("Tip: Use --top 5 to show the top 5 performers"));
|
|
1911
|
+
process.exit(1);
|
|
1912
|
+
}
|
|
1913
|
+
if (options.id) {
|
|
1914
|
+
if (options.all || options.underperforming) {
|
|
1915
|
+
console.error(
|
|
1916
|
+
chalk.red("Error: --id flag cannot be combined with --all or --underperforming flags")
|
|
1917
|
+
);
|
|
1918
|
+
console.error(
|
|
1919
|
+
chalk.yellow("Tip: Use --id alone, or use --all/--underperforming without --id")
|
|
1920
|
+
);
|
|
1921
|
+
process.exit(1);
|
|
1922
|
+
}
|
|
1923
|
+
const entry = await analyzeSinglePrompt(options.id, options.version);
|
|
1924
|
+
console.log(
|
|
1925
|
+
chalk.bold.cyan(`
|
|
1926
|
+
Optimization Analysis: ${entry.prompt.name} (${entry.version.id})
|
|
1927
|
+
`)
|
|
1928
|
+
);
|
|
1929
|
+
console.log(chalk.gray(`Performance: ${formatPerformanceSummary(entry.analysis)}`));
|
|
1930
|
+
console.log(chalk.gray(`Overall Score: ${entry.analysis.overallScore.toFixed(1)}`));
|
|
1931
|
+
console.log("");
|
|
1932
|
+
if (entry.analysis.suggestions.length === 0) {
|
|
1933
|
+
console.log(chalk.green("No optimization suggestions - prompt looks good!"));
|
|
1934
|
+
return;
|
|
1935
|
+
}
|
|
1936
|
+
for (const suggestion of entry.analysis.suggestions) {
|
|
1937
|
+
const priorityColor = suggestion.priority === "critical" || suggestion.priority === "high" ? chalk.red : suggestion.priority === "medium" ? chalk.yellow : chalk.gray;
|
|
1938
|
+
console.log(
|
|
1939
|
+
priorityColor(`[${suggestion.priority.toUpperCase()}] ${suggestion.description}`)
|
|
1940
|
+
);
|
|
1941
|
+
console.log(chalk.gray(` Rationale: ${suggestion.rationale}`));
|
|
1942
|
+
console.log(chalk.gray(` Expected: ${suggestion.expectedImprovement}`));
|
|
1943
|
+
console.log(chalk.gray(` Effort: ${suggestion.estimatedEffort}`));
|
|
1944
|
+
console.log("");
|
|
1945
|
+
}
|
|
1946
|
+
return;
|
|
1947
|
+
}
|
|
1948
|
+
const analyses = await collectActiveAnalyses();
|
|
1949
|
+
if (options.all) {
|
|
1950
|
+
if (analyses.length === 0) {
|
|
1951
|
+
console.log(chalk.yellow("No active prompts available for analysis."));
|
|
1952
|
+
return;
|
|
1953
|
+
}
|
|
1954
|
+
console.log(chalk.bold.cyan("\nOptimization Report\n"));
|
|
1955
|
+
for (const entry of analyses) {
|
|
1956
|
+
const highPriority = entry.analysis.suggestions.filter(
|
|
1957
|
+
(s) => s.priority === "critical" || s.priority === "high"
|
|
1958
|
+
);
|
|
1959
|
+
console.log(
|
|
1960
|
+
chalk.bold(entry.prompt.name) + chalk.gray(` (${entry.prompt.id}) - ${entry.version.id}`)
|
|
1961
|
+
);
|
|
1962
|
+
console.log(chalk.gray(` ${formatPerformanceSummary(entry.analysis)}`));
|
|
1963
|
+
console.log(chalk.gray(` Suggestions: ${entry.analysis.suggestions.length}`));
|
|
1964
|
+
if (highPriority.length > 0) {
|
|
1965
|
+
console.log(chalk.red(` Warning: ${highPriority.length} high-priority issues`));
|
|
1966
|
+
}
|
|
1967
|
+
console.log("");
|
|
1968
|
+
}
|
|
1969
|
+
console.log(chalk.green(`OK Analyzed ${analyses.length} prompts`));
|
|
1970
|
+
return;
|
|
1971
|
+
}
|
|
1972
|
+
if (options.underperforming) {
|
|
1973
|
+
if (analyses.length === 0) {
|
|
1974
|
+
console.log(chalk.yellow("No active prompts available for analysis."));
|
|
1975
|
+
return;
|
|
1976
|
+
}
|
|
1977
|
+
const underperforming = analyses.map((entry) => ({
|
|
1978
|
+
entry,
|
|
1979
|
+
issues: getUnderperformanceIssues(entry)
|
|
1980
|
+
})).filter((item) => item.issues.length > 0);
|
|
1981
|
+
if (underperforming.length === 0) {
|
|
1982
|
+
console.log(chalk.green("No underperforming prompts detected."));
|
|
1983
|
+
return;
|
|
1984
|
+
}
|
|
1985
|
+
console.log(chalk.bold.cyan("\nWarning: Underperforming Prompts\n"));
|
|
1986
|
+
for (const { entry, issues } of underperforming) {
|
|
1987
|
+
console.log(
|
|
1988
|
+
chalk.bold(entry.prompt.name) + chalk.gray(` (${entry.prompt.id}) - ${entry.version.id}`)
|
|
1989
|
+
);
|
|
1990
|
+
console.log(chalk.gray(` ${formatPerformanceSummary(entry.analysis)}`));
|
|
1991
|
+
issues.forEach((issue) => {
|
|
1992
|
+
console.log(chalk.yellow(` - ${issue}`));
|
|
1993
|
+
});
|
|
1994
|
+
console.log("");
|
|
1995
|
+
}
|
|
1996
|
+
console.log(chalk.yellow(`Found ${underperforming.length} prompts needing attention`));
|
|
1997
|
+
return;
|
|
1998
|
+
}
|
|
1999
|
+
if (analyses.length === 0) {
|
|
2000
|
+
console.log(chalk.yellow("No active prompts available for analysis."));
|
|
2001
|
+
return;
|
|
2002
|
+
}
|
|
2003
|
+
const eligible = analyses.filter((entry) => entry.analysis.performance.sampleSize >= 5);
|
|
2004
|
+
if (eligible.length === 0) {
|
|
2005
|
+
console.log(
|
|
2006
|
+
chalk.yellow("No prompts have sufficient data (sample size >= 5) for ranking.")
|
|
2007
|
+
);
|
|
2008
|
+
return;
|
|
2009
|
+
}
|
|
2010
|
+
eligible.sort((a, b) => b.analysis.overallScore - a.analysis.overallScore);
|
|
2011
|
+
const topPerformers = eligible.slice(0, topN);
|
|
2012
|
+
console.log(chalk.bold.cyan(`
|
|
2013
|
+
Top ${topPerformers.length} Performing Prompts
|
|
2014
|
+
`));
|
|
2015
|
+
topPerformers.forEach((entry, index) => {
|
|
2016
|
+
console.log(
|
|
2017
|
+
chalk.bold(`${index + 1}. ${entry.prompt.name}`) + chalk.gray(
|
|
2018
|
+
` (${entry.prompt.id}) - ${entry.version.id} | Score ${entry.analysis.overallScore.toFixed(1)}`
|
|
2019
|
+
)
|
|
2020
|
+
);
|
|
2021
|
+
console.log(chalk.gray(` ${formatPerformanceSummary(entry.analysis)}`));
|
|
2022
|
+
});
|
|
2023
|
+
} catch (error) {
|
|
2024
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
2025
|
+
process.exit(1);
|
|
2026
|
+
}
|
|
2027
|
+
};
|
|
2028
|
+
const attachAnalyzeSuggestionsOptions = (cmd) => cmd.option("-i, --id <id>", "(OPTIONAL) Analyze specific prompt\n Example: --id prompt-123").option(
|
|
2029
|
+
"--version <version>",
|
|
2030
|
+
"(OPTIONAL) Analyze specific prompt version (defaults to active)\n Example: --version version-456"
|
|
2031
|
+
).option("--all", "(OPTIONAL) Analyze all prompts").option("--underperforming", "(OPTIONAL) Find underperforming prompts").option("--top <n>", "(OPTIONAL) Show top N performers\n Example: --top 5", "10");
|
|
2032
|
+
attachAnalyzeSuggestionsOptions(
|
|
2033
|
+
prompts.command("analyze-suggestions").description(
|
|
2034
|
+
"Analyze active prompts and emit heuristic suggestions (no provider calls)\n\nExamples:\n poetic prompts analyze-suggestions --id prompt-123\n poetic prompts analyze-suggestions --all\n poetic prompts analyze-suggestions --underperforming --top 5"
|
|
2035
|
+
)
|
|
2036
|
+
).action(analyzeSuggestionsAction);
|
|
2037
|
+
prompts.command("auto-optimize").description(
|
|
2038
|
+
"Run automatic prompt optimization using telemetry insights\n\nExamples:\n poetic prompts auto-optimize --id prompt-123\n poetic prompts auto-optimize --all --auto-activate\n poetic prompts auto-optimize --id prompt-123 --dry-run"
|
|
2039
|
+
).option("-i, --id <id>", "(OPTIONAL) Optimize a specific prompt\n Example: --id prompt-123").option("--all", "(OPTIONAL) Optimize all prompts that need attention").option(
|
|
2040
|
+
"--min-sample-size <n>",
|
|
2041
|
+
"(OPTIONAL) Minimum executions before considering optimization\n Example: --min-sample-size 20",
|
|
2042
|
+
"10"
|
|
2043
|
+
).option(
|
|
2044
|
+
"--improvement-threshold <percent>",
|
|
2045
|
+
"(OPTIONAL) Minimum improvement percentage required for activation\n Example: --improvement-threshold 10",
|
|
2046
|
+
"5"
|
|
2047
|
+
).option(
|
|
2048
|
+
"--max-variants <n>",
|
|
2049
|
+
"(OPTIONAL) Maximum variants to generate per prompt\n Example: --max-variants 5",
|
|
2050
|
+
"3"
|
|
2051
|
+
).option("--auto-activate", "(OPTIONAL) Automatically activate the best variant when safe").option("--enable-auto-tuning", "(OPTIONAL) Enable auto-tuning safety checks before activation").option("--dry-run", "(OPTIONAL) Analyze only without generating new versions").action(async (options) => {
|
|
2052
|
+
try {
|
|
2053
|
+
if (!options.id && !options.all) {
|
|
2054
|
+
console.error(chalk.red("Error: Provide --id or --all flag for auto-optimize"));
|
|
2055
|
+
console.error(
|
|
2056
|
+
chalk.yellow(
|
|
2057
|
+
"Tip: Use --id <prompt-id> to optimize a specific prompt, or --all to optimize all prompts"
|
|
2058
|
+
)
|
|
2059
|
+
);
|
|
2060
|
+
process.exit(1);
|
|
2061
|
+
}
|
|
2062
|
+
const minSampleSize = parseInt(options.minSampleSize, 10);
|
|
2063
|
+
const improvementThreshold = parseFloat(options.improvementThreshold);
|
|
2064
|
+
const maxVariants = parseInt(options.maxVariants, 10);
|
|
2065
|
+
if (Number.isNaN(minSampleSize) || minSampleSize <= 0) {
|
|
2066
|
+
console.error(chalk.red("Error: --min-sample-size flag must be a positive integer"));
|
|
2067
|
+
console.error(
|
|
2068
|
+
chalk.yellow("Tip: Use --min-sample-size 20 to require at least 20 executions")
|
|
2069
|
+
);
|
|
2070
|
+
process.exit(1);
|
|
2071
|
+
}
|
|
2072
|
+
if (Number.isNaN(improvementThreshold)) {
|
|
2073
|
+
console.error(chalk.red("Error: --improvement-threshold flag must be a number"));
|
|
2074
|
+
console.error(
|
|
2075
|
+
chalk.yellow("Tip: Use --improvement-threshold 10 to require 10% improvement")
|
|
2076
|
+
);
|
|
2077
|
+
process.exit(1);
|
|
2078
|
+
}
|
|
2079
|
+
if (Number.isNaN(maxVariants) || maxVariants <= 0) {
|
|
2080
|
+
console.error(chalk.red("Error: --max-variants flag must be a positive integer"));
|
|
2081
|
+
console.error(chalk.yellow("Tip: Use --max-variants 5 to generate up to 5 variants"));
|
|
2082
|
+
process.exit(1);
|
|
2083
|
+
}
|
|
2084
|
+
const autoOptimizer = createAutoOptimizer({
|
|
2085
|
+
minSampleSize,
|
|
2086
|
+
improvementThreshold,
|
|
2087
|
+
maxVariantsPerOptimization: maxVariants,
|
|
2088
|
+
autoActivateBestVariant: Boolean(options.autoActivate),
|
|
2089
|
+
enableAutoTuning: Boolean(options.enableAutoTuning),
|
|
2090
|
+
requireManualReview: !options.autoActivate
|
|
2091
|
+
});
|
|
2092
|
+
if (options.id) {
|
|
2093
|
+
if (options.all) {
|
|
2094
|
+
console.error(chalk.red("Error: --id and --all flags cannot be combined"));
|
|
2095
|
+
console.error(chalk.yellow("Tip: Use either --id <prompt-id> or --all, but not both"));
|
|
2096
|
+
process.exit(1);
|
|
2097
|
+
}
|
|
2098
|
+
if (options.dryRun) {
|
|
2099
|
+
const recommendation = await autoOptimizer.analyzePrompt(options.id);
|
|
2100
|
+
console.log(
|
|
2101
|
+
chalk.bold.cyan(
|
|
2102
|
+
`
|
|
2103
|
+
Auto-Optimizer Analysis: ${recommendation.promptId} (${recommendation.currentVersionId})
|
|
2104
|
+
`
|
|
2105
|
+
)
|
|
2106
|
+
);
|
|
2107
|
+
console.log(
|
|
2108
|
+
chalk.gray(
|
|
2109
|
+
`Action: ${recommendation.action.replace("_", " ")} | Confidence ${(recommendation.confidence * 100).toFixed(1)}%`
|
|
2110
|
+
)
|
|
2111
|
+
);
|
|
2112
|
+
console.log(chalk.gray(`Rationale: ${recommendation.rationale}`));
|
|
2113
|
+
console.log(
|
|
2114
|
+
chalk.gray(
|
|
2115
|
+
`Performance: Success ${(recommendation.currentPerformance.successRate * 100).toFixed(1)}% | Completeness ${recommendation.currentPerformance.avgCompleteness.toFixed(1)} | Sample ${recommendation.currentPerformance.sampleSize}`
|
|
2116
|
+
)
|
|
2117
|
+
);
|
|
2118
|
+
if (recommendation.suggestions.length > 0) {
|
|
2119
|
+
console.log(chalk.bold("\nSuggestions:"));
|
|
2120
|
+
recommendation.suggestions.slice(0, 5).forEach((suggestion) => {
|
|
2121
|
+
console.log(
|
|
2122
|
+
`- [${suggestion.priority.toUpperCase()}] ${suggestion.description} (${suggestion.expectedImprovement})`
|
|
2123
|
+
);
|
|
2124
|
+
});
|
|
2125
|
+
}
|
|
2126
|
+
if (recommendation.proposedVariants.length > 0) {
|
|
2127
|
+
console.log(chalk.bold("\nSuggested Prompt Revisions:"));
|
|
2128
|
+
recommendation.proposedVariants.forEach((variant) => {
|
|
2129
|
+
console.log(
|
|
2130
|
+
`- ${variant.variantId}: ${variant.description} (${variant.expectedImprovement})`
|
|
2131
|
+
);
|
|
2132
|
+
});
|
|
2133
|
+
}
|
|
2134
|
+
return;
|
|
2135
|
+
}
|
|
2136
|
+
const result = await autoOptimizer.optimizePrompt(options.id);
|
|
2137
|
+
console.log(
|
|
2138
|
+
chalk.bold.cyan(`
|
|
2139
|
+
Auto-Optimizer Result: ${result.promptId} (${result.executedAt})
|
|
2140
|
+
`)
|
|
2141
|
+
);
|
|
2142
|
+
console.log(chalk.gray(`Success: ${result.success ? "yes" : "no"}`));
|
|
2143
|
+
console.log(
|
|
2144
|
+
chalk.gray(
|
|
2145
|
+
`Suggested prompt revisions: ${result.suggestedPromptRevisions.length} | Activated: ${result.variantsActivated}`
|
|
2146
|
+
)
|
|
2147
|
+
);
|
|
2148
|
+
if (result.improvements.length > 0) {
|
|
2149
|
+
console.log(chalk.green("\nImprovements:"));
|
|
2150
|
+
result.improvements.forEach((item) => {
|
|
2151
|
+
console.log(` \u2022 ${item}`);
|
|
2152
|
+
});
|
|
2153
|
+
}
|
|
2154
|
+
if (result.warnings.length > 0) {
|
|
2155
|
+
console.log(chalk.yellow("\nWarnings:"));
|
|
2156
|
+
result.warnings.forEach((item) => {
|
|
2157
|
+
console.log(` \u2022 ${item}`);
|
|
2158
|
+
});
|
|
2159
|
+
}
|
|
2160
|
+
if (result.errors.length > 0) {
|
|
2161
|
+
console.log(chalk.red("\nErrors:"));
|
|
2162
|
+
result.errors.forEach((item) => {
|
|
2163
|
+
console.log(` \u2022 ${item}`);
|
|
2164
|
+
});
|
|
2165
|
+
}
|
|
2166
|
+
return;
|
|
2167
|
+
}
|
|
2168
|
+
const promptsToProcess = getManager().list({ status: "active" });
|
|
2169
|
+
if (promptsToProcess.length === 0) {
|
|
2170
|
+
console.log(chalk.yellow("No active prompts available for optimization."));
|
|
2171
|
+
return;
|
|
2172
|
+
}
|
|
2173
|
+
if (options.dryRun) {
|
|
2174
|
+
console.log(chalk.bold.cyan("\nAuto-Optimizer Dry Run\n"));
|
|
2175
|
+
for (const prompt of promptsToProcess) {
|
|
2176
|
+
const recommendation = await autoOptimizer.analyzePrompt(prompt.id);
|
|
2177
|
+
console.log(
|
|
2178
|
+
chalk.bold(prompt.name) + chalk.gray(
|
|
2179
|
+
` (${prompt.id}) \u2014 ${recommendation.currentVersionId} | Action: ${recommendation.action.replace("_", " ")}`
|
|
2180
|
+
)
|
|
2181
|
+
);
|
|
2182
|
+
console.log(chalk.gray(` Rationale: ${recommendation.rationale}`));
|
|
2183
|
+
console.log(
|
|
2184
|
+
chalk.gray(
|
|
2185
|
+
` Performance: Success ${(recommendation.currentPerformance.successRate * 100).toFixed(1)}% | Completeness ${recommendation.currentPerformance.avgCompleteness.toFixed(1)} | Sample ${recommendation.currentPerformance.sampleSize}`
|
|
2186
|
+
)
|
|
2187
|
+
);
|
|
2188
|
+
}
|
|
2189
|
+
return;
|
|
2190
|
+
}
|
|
2191
|
+
const batchResult = await autoOptimizer.optimizeAllPrompts();
|
|
2192
|
+
console.log(chalk.bold.cyan("\nAuto-Optimizer Batch Report\n"));
|
|
2193
|
+
console.log(
|
|
2194
|
+
chalk.gray(
|
|
2195
|
+
`Analyzed ${batchResult.analyzed} prompt(s) | Optimized ${batchResult.optimized} prompt(s)`
|
|
2196
|
+
)
|
|
2197
|
+
);
|
|
2198
|
+
for (const result of batchResult.results) {
|
|
2199
|
+
console.log(
|
|
2200
|
+
chalk.bold(result.promptId) + chalk.gray(
|
|
2201
|
+
` \u2014 Success: ${result.success ? "yes" : "no"} | Suggested prompt revisions: ${result.suggestedPromptRevisions.length} | Activated: ${result.variantsActivated}`
|
|
2202
|
+
)
|
|
2203
|
+
);
|
|
2204
|
+
if (result.improvements.length > 0) {
|
|
2205
|
+
result.improvements.forEach((item) => {
|
|
2206
|
+
console.log(chalk.green(` \u2022 ${item}`));
|
|
2207
|
+
});
|
|
2208
|
+
}
|
|
2209
|
+
if (result.warnings.length > 0) {
|
|
2210
|
+
result.warnings.forEach((item) => {
|
|
2211
|
+
console.log(chalk.yellow(` \u2022 ${item}`));
|
|
2212
|
+
});
|
|
2213
|
+
}
|
|
2214
|
+
if (result.errors.length > 0) {
|
|
2215
|
+
result.errors.forEach((item) => {
|
|
2216
|
+
console.log(chalk.red(` \u2022 ${item}`));
|
|
2217
|
+
});
|
|
2218
|
+
}
|
|
2219
|
+
}
|
|
2220
|
+
if (batchResult.errors.length > 0) {
|
|
2221
|
+
console.log(chalk.red("\nErrors:"));
|
|
2222
|
+
batchResult.errors.forEach((error) => {
|
|
2223
|
+
console.log(` \u2022 ${error.promptId}: ${error._error}`);
|
|
2224
|
+
});
|
|
2225
|
+
}
|
|
2226
|
+
} catch (error) {
|
|
2227
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
2228
|
+
process.exit(1);
|
|
2229
|
+
}
|
|
2230
|
+
});
|
|
2231
|
+
const attachAuthorOptions = (cmd) => cmd.requiredOption(
|
|
2232
|
+
"-n, --name <name>",
|
|
2233
|
+
'(REQUIRED) Prompt name\n Example: --name "My Prompt"'
|
|
2234
|
+
).requiredOption(
|
|
2235
|
+
"-g, --goal <goal>",
|
|
2236
|
+
'(REQUIRED) What should this prompt achieve?\n Example: --goal "Generate authentication code"'
|
|
2237
|
+
).requiredOption(
|
|
2238
|
+
"-c, --category <category>",
|
|
2239
|
+
"(REQUIRED) Category (system|strategy|domain|workflow|custom)\n Example: --category system"
|
|
2240
|
+
).option(
|
|
2241
|
+
"-d, --description <description>",
|
|
2242
|
+
'(OPTIONAL) Prompt description\n Example: --description "Description text"'
|
|
2243
|
+
).option(
|
|
2244
|
+
"--context <context>",
|
|
2245
|
+
'(OPTIONAL) Additional context\n Example: --context "Additional context here"'
|
|
2246
|
+
).option("--engine <engine>", "(OPTIONAL) AI engine to use\n Example: --engine claude").option("--model <model>", "(OPTIONAL) Model to use\n Example: --model auto").option(
|
|
2247
|
+
"-v, --variant <variant>",
|
|
2248
|
+
"(OPTIONAL) Variant strategy\n Example: --variant conservative"
|
|
2249
|
+
).option(
|
|
2250
|
+
"--tags <tags>",
|
|
2251
|
+
"(OPTIONAL) Comma-separated tags\n Example: --tags auth,security"
|
|
2252
|
+
);
|
|
2253
|
+
attachAuthorOptions(
|
|
2254
|
+
prompts.command("author").description(
|
|
2255
|
+
'Author a new prompt with AI (canonical authoring entry).\n\nExamples:\n poetic prompts author --name "My Prompt" --goal "..." --category system'
|
|
2256
|
+
)
|
|
2257
|
+
).action(async (options) => {
|
|
2258
|
+
await runAuthorPromptAction(options);
|
|
2259
|
+
});
|
|
2260
|
+
return prompts;
|
|
2261
|
+
}
|
|
2262
|
+
async function runAuthorPromptAction(options) {
|
|
2263
|
+
try {
|
|
2264
|
+
const engineId = options.engine ?? resolveDefaultProvider(void 0, process.cwd()).value;
|
|
2265
|
+
const engine = registry.get(engineId);
|
|
2266
|
+
if (!engine) {
|
|
2267
|
+
console.error(chalk.red(`Engine not found: ${engineId}`));
|
|
2268
|
+
process.exit(1);
|
|
2269
|
+
}
|
|
2270
|
+
const generator = new PromptGenerator({});
|
|
2271
|
+
const request = {
|
|
2272
|
+
name: options.name,
|
|
2273
|
+
description: options.description || options.goal,
|
|
2274
|
+
category: options.category,
|
|
2275
|
+
goal: options.goal,
|
|
2276
|
+
context: options.context,
|
|
2277
|
+
variant: options.variant,
|
|
2278
|
+
tags: options.tags ? options.tags.split(",").map((t) => t.trim()) : [],
|
|
2279
|
+
model: options.model
|
|
2280
|
+
};
|
|
2281
|
+
console.log(chalk.cyan("Generating prompt with AI...\n"));
|
|
2282
|
+
const result = await generator.generate(request);
|
|
2283
|
+
if (!result.success) {
|
|
2284
|
+
console.error(chalk.red(`Generation failed: ${result.error}`));
|
|
2285
|
+
process.exit(1);
|
|
2286
|
+
}
|
|
2287
|
+
console.log(chalk.green(`OK Generated prompt: ${result.prompt?.name || "Unknown"}`));
|
|
2288
|
+
console.log(chalk.gray(` ID: ${result.prompt?.id || "Unknown"}`));
|
|
2289
|
+
console.log(chalk.gray(` Version: ${result.version?.id || "Unknown"}`));
|
|
2290
|
+
console.log(chalk.gray(` Confidence: ${(result.confidence * 100).toFixed(1)}%`));
|
|
2291
|
+
console.log("");
|
|
2292
|
+
console.log(chalk.bold("Review Checklist:"));
|
|
2293
|
+
result.suggestedReview.forEach((item) => {
|
|
2294
|
+
console.log(chalk.gray(` ${item}`));
|
|
2295
|
+
});
|
|
2296
|
+
console.log("");
|
|
2297
|
+
console.log(chalk.bold("Generated Content:"));
|
|
2298
|
+
console.log(chalk.white(result.version?.content || "No content generated"));
|
|
2299
|
+
} catch (error) {
|
|
2300
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
2301
|
+
process.exit(1);
|
|
2302
|
+
}
|
|
2303
|
+
}
|
|
2304
|
+
|
|
2305
|
+
export {
|
|
2306
|
+
normalizeProviderForModelAvailability,
|
|
2307
|
+
getRegistryProviderForModelAvailability,
|
|
2308
|
+
DEFAULT_MODEL_AVAILABILITY,
|
|
2309
|
+
getProvidersWithRouteModelAvailability,
|
|
2310
|
+
hasProviderRouteModelAvailability,
|
|
2311
|
+
getModelsForTierByProvider,
|
|
2312
|
+
getModelFromFallback,
|
|
2313
|
+
runCreatePromptAction,
|
|
2314
|
+
runEditPromptAction,
|
|
2315
|
+
runArchivePromptAction,
|
|
2316
|
+
runRestorePromptAction,
|
|
2317
|
+
runEvaluatePromptAction,
|
|
2318
|
+
createPromptsCommand,
|
|
2319
|
+
runAuthorPromptAction
|
|
2320
|
+
};
|
|
2321
|
+
//# sourceMappingURL=chunk-4BOP7T6L.js.map
|