@runcofactor/cli 0.55.0 → 0.56.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/dist/{account-RHHS7HT4.js → account-CZYZD2JS.js} +5 -5
- package/dist/{alert-B5WEOKHP.js → alert-JQ4SDEB7.js} +8 -8
- package/dist/{api-catalog-UXONX3BR.js → api-catalog-IWQC35P2.js} +5 -5
- package/dist/{api-key-J3A4TJKN.js → api-key-GUDXIIEA.js} +5 -5
- package/dist/{attachment-ZQW7DR4G.js → attachment-CPZYOBUB.js} +5 -5
- package/dist/{auth-HQGKUZBS.js → auth-DS6MBVEI.js} +3 -3
- package/dist/{benchmark-TIKJA32J.js → benchmark-6HPCIQHD.js} +5 -5
- package/dist/{blackcat-Z5LNV2GS.js → blackcat-V3L63WFE.js} +3 -3
- package/dist/{chunk-JQG3V5E3.js → chunk-2E3STBHS.js} +2 -2
- package/dist/{chunk-KL2ARGH6.js → chunk-2OHYMT3A.js} +3 -3
- package/dist/{chunk-KL2ARGH6.js.map → chunk-2OHYMT3A.js.map} +1 -1
- package/dist/{chunk-W6DL4IP6.js → chunk-3LGCHNBC.js} +2 -2
- package/dist/{chunk-BJHAVM7Z.js → chunk-4MFMPC5P.js} +46 -2
- package/dist/chunk-4MFMPC5P.js.map +1 -0
- package/dist/{chunk-MB4FS35J.js → chunk-56HFZHQM.js} +8 -8
- package/dist/{chunk-CZDQVQ57.js → chunk-5OYWNS6D.js} +20 -9
- package/dist/chunk-5OYWNS6D.js.map +1 -0
- package/dist/{chunk-YTXZUWMN.js → chunk-62EXS76C.js} +6 -6
- package/dist/{chunk-QVMGXMP5.js → chunk-6ILWJFKY.js} +368 -6
- package/dist/chunk-6ILWJFKY.js.map +1 -0
- package/dist/{chunk-6X6ZTDXP.js → chunk-BDOL622T.js} +4 -4
- package/dist/{chunk-L4JQ236V.js → chunk-C3CXVX2B.js} +4 -4
- package/dist/{chunk-33U56YGD.js → chunk-CWICLBLU.js} +2 -1
- package/dist/{chunk-33U56YGD.js.map → chunk-CWICLBLU.js.map} +1 -1
- package/dist/{chunk-XM3WTJ7Y.js → chunk-DEVD2WD2.js} +2 -2
- package/dist/{chunk-WWUEKQLR.js → chunk-EWK44F6V.js} +3 -3
- package/dist/chunk-EWK44F6V.js.map +1 -0
- package/dist/{chunk-CQSQNDMV.js → chunk-FNHPTTRF.js} +7 -5
- package/dist/chunk-FNHPTTRF.js.map +1 -0
- package/dist/{chunk-Z72GWGH2.js → chunk-GCD4EHCD.js} +6 -6
- package/dist/{chunk-3KBYI6RR.js → chunk-H6ZMKNP7.js} +3 -3
- package/dist/{chunk-5OKCT6LF.js → chunk-IEWAH7W3.js} +5 -5
- package/dist/{chunk-TGI2AAOZ.js → chunk-IV4HRGKX.js} +77 -12
- package/dist/chunk-IV4HRGKX.js.map +1 -0
- package/dist/{chunk-635IQV6B.js → chunk-J2ZQULU3.js} +2 -2
- package/dist/{chunk-ZZZ33KTO.js → chunk-K2IDR6FR.js} +3 -3
- package/dist/{chunk-YEH7UIUY.js → chunk-KTZRI27M.js} +4 -4
- package/dist/{chunk-RV7FZ4ID.js → chunk-L644NMDI.js} +3 -3
- package/dist/{chunk-RV7FZ4ID.js.map → chunk-L644NMDI.js.map} +1 -1
- package/dist/{chunk-3TZABC7D.js → chunk-LFT7GUWS.js} +63 -17
- package/dist/chunk-LFT7GUWS.js.map +1 -0
- package/dist/{chunk-QHRWXCON.js → chunk-O7B2IYCZ.js} +11 -11
- package/dist/chunk-O7B2IYCZ.js.map +1 -0
- package/dist/{chunk-U3MRXQZS.js → chunk-RHWPZKRV.js} +24 -1
- package/dist/chunk-RHWPZKRV.js.map +1 -0
- package/dist/{chunk-OU4I3MEH.js → chunk-UJSW72LG.js} +3 -3
- package/dist/{chunk-R2CRH6JQ.js → chunk-VACACCD6.js} +3 -3
- package/dist/{chunk-EGWVL5XA.js → chunk-VMAR67FF.js} +2 -2
- package/dist/{chunk-ZH7HWVEE.js → chunk-VMJ7TBVM.js} +2 -2
- package/dist/chunk-WRRA4ATV.js +332 -0
- package/dist/chunk-WRRA4ATV.js.map +1 -0
- package/dist/{chunk-XWJJYZQC.js → chunk-XHEVDABB.js} +2 -2
- package/dist/{chunk-SCQVBLNR.js → chunk-XHGF6VC6.js} +4 -4
- package/dist/{credential-2IEZDTH3.js → credential-GJW7LGYP.js} +5 -5
- package/dist/{credential-template-S5WSOI3P.js → credential-template-UWBYKKWD.js} +5 -5
- package/dist/dev-PBW7BSOD.js +605 -0
- package/dist/dev-PBW7BSOD.js.map +1 -0
- package/dist/{digest-HQGL7H6E.js → digest-XEHGCJM4.js} +8 -8
- package/dist/{docs-CJQZVERZ.js → docs-KH4BCEQF.js} +5 -5
- package/dist/{doctor-EGK5AB77.js → doctor-FOXXE5SK.js} +3 -3
- package/dist/{environment-MWVXYEDU.js → environment-EBDPQTIS.js} +7 -7
- package/dist/{eval-F4NORBQI.js → eval-QZSSEICV.js} +67 -27
- package/dist/eval-QZSSEICV.js.map +1 -0
- package/dist/{exploration-JC7R7KTJ.js → exploration-LCGKRGOQ.js} +5 -5
- package/dist/{exploratory-test-BHK5FTMJ.js → exploratory-test-SGECQGIX.js} +6 -6
- package/dist/{external-run-UL5CKG54.js → external-run-2AJAI5O7.js} +9 -9
- package/dist/{feature-flag-NMO25TZN.js → feature-flag-P7N4WQIH.js} +5 -5
- package/dist/{feedback-3JNPSUXS.js → feedback-LAT7TQ2T.js} +6 -6
- package/dist/{flow-AYE4RTZN.js → flow-NH2DC6AP.js} +5 -5
- package/dist/{github-DM2DCXRY.js → github-FCEKBLXI.js} +6 -6
- package/dist/index.js +106 -408
- package/dist/index.js.map +1 -1
- package/dist/{init-CPDT5XAU.js → init-5U5EZOAW.js} +5 -5
- package/dist/{install-JZRNCHMO.js → install-X3UNVXKY.js} +5 -5
- package/dist/{issues-GRFJB52C.js → issues-4P6I3YQW.js} +8 -8
- package/dist/{knobs-3Y4QXWAD.js → knobs-JKTWJ6ZG.js} +5 -5
- package/dist/{landing-ABYL5WVG.js → landing-6AGLKI66.js} +7 -7
- package/dist/{list-WG5QB4NK.js → list-TWP2RP33.js} +5 -5
- package/dist/{local-KX24OR5Z.js → local-D75QE5TB.js} +7 -7
- package/dist/{login-MLJQAIFK.js → login-RBET4TIP.js} +5 -5
- package/dist/{mcp-DDTO54XD.js → mcp-562SUUMK.js} +11 -11
- package/dist/{metrics-BJLLOSPQ.js → metrics-4WF2GEPA.js} +5 -5
- package/dist/{monitor-E2CKGHPM.js → monitor-WJXH54H2.js} +5 -5
- package/dist/{perf-IX7JOMUE.js → perf-C6N6P7YG.js} +12 -361
- package/dist/perf-C6N6P7YG.js.map +1 -0
- package/dist/{product-2ECWM2JN.js → product-CYEQ7HOB.js} +5 -5
- package/dist/{product-map-O542LZQL.js → product-map-MSDLIFZY.js} +7 -7
- package/dist/{prompts-Y7O4XJ5P.js → prompts-ME53WPN4.js} +5 -5
- package/dist/{proofs-TNOBLSRP.js → proofs-D3G6ZUFP.js} +11 -9
- package/dist/{property-TZCGOZQG.js → property-5GLJNAVB.js} +29 -10
- package/dist/property-5GLJNAVB.js.map +1 -0
- package/dist/{psql-M66YSUXW.js → psql-EXAUDU3W.js} +5 -5
- package/dist/{record-3JINBRAR.js → record-EE7NGNKY.js} +6 -6
- package/dist/{redis-FOIBINYA.js → redis-M4EYWKOJ.js} +5 -5
- package/dist/{release-B4VWMVEI.js → release-4KUWVWWC.js} +5 -5
- package/dist/{runbook-EYMSE37E.js → runbook-AHU77ANQ.js} +5 -5
- package/dist/{sandbox-R6EMGOKR.js → sandbox-FBLJEYA2.js} +1910 -1629
- package/dist/sandbox-FBLJEYA2.js.map +1 -0
- package/dist/{scenarios-W7YNLBVO.js → scenarios-TU656T2B.js} +5 -5
- package/dist/{schedule-EDHQJUUZ.js → schedule-DXJI6SYO.js} +8 -8
- package/dist/{session-4N62APNQ.js → session-RUFTJHF4.js} +10 -10
- package/dist/{skill-XFGMNOVM.js → skill-ZK76GQ47.js} +7 -7
- package/dist/{skill-XFGMNOVM.js.map → skill-ZK76GQ47.js.map} +1 -1
- package/dist/skills/cofactor-debug-run/SKILL.md +2 -1
- package/dist/skills/cofactor-debug-run/history/2.0.10.md +320 -0
- package/dist/skills/cofactor-debug-run/version.json +1 -1
- package/dist/{slack-RUAXG6TB.js → slack-M3OKDVMY.js} +6 -6
- package/dist/{spec-ZZKMW7ER.js → spec-5MXEBLYR.js} +5 -5
- package/dist/{src-OKSAEHQS.js → src-2X5OQRPJ.js} +4 -4
- package/dist/{src-DGIVA22K.js → src-72EFBA2R.js} +3 -3
- package/dist/{src-ECZWYNSV.js → src-KH6WSBJV.js} +5 -5
- package/dist/{src-CQ2YAW7F.js → src-VLV36QYH.js} +127 -20
- package/dist/src-VLV36QYH.js.map +1 -0
- package/dist/{start-OCZGILRL.js → start-PDYBRB5T.js} +5 -5
- package/dist/{status-YTJ6YITG.js → status-VMVPVCDA.js} +5 -5
- package/dist/{tag-KBG4SWRL.js → tag-7KTDLPVU.js} +6 -6
- package/dist/{task-O6XRMHYE.js → task-QLFYZNKR.js} +6 -6
- package/dist/{teams-NFUHS7XI.js → teams-Y7BXCY6P.js} +7 -7
- package/dist/{test-suite-6BH3DESN.js → test-suite-6U22AYFG.js} +15 -14
- package/dist/test-suite-6U22AYFG.js.map +1 -0
- package/dist/{tickets-JU2STK4B.js → tickets-CQDJDNPY.js} +5 -5
- package/dist/{trace-NMSGKASJ.js → trace-QDORWXYX.js} +8 -8
- package/dist/{triage-JGECJJU5.js → triage-GY7M3UGG.js} +6 -6
- package/dist/{trigger-OSPEVCCQ.js → trigger-DLFAORX4.js} +9 -9
- package/dist/{update-check-FNP6RFZO.js → update-check-ES6XQ7OF.js} +4 -4
- package/dist/{upgrade-3PPBXFAT.js → upgrade-WKEOW5GS.js} +5 -5
- package/dist/{usage-QMCU2JIO.js → usage-E6FDTR3W.js} +7 -7
- package/dist/{utilities-7VHWTSJT.js → utilities-4Z6YX3L5.js} +6 -6
- package/dist/{visual-WIZSPTVK.js → visual-TA6LPVDJ.js} +5 -5
- package/dist/{workflow-23HKTJLS.js → workflow-B5FXS2CJ.js} +58 -31
- package/dist/workflow-B5FXS2CJ.js.map +1 -0
- package/dist/{workflow-cache-ACGM3BOI.js → workflow-cache-MNLEMRMM.js} +16 -16
- package/dist/{workflow-cache-convergence-resolve-KEQDQMKL.js → workflow-cache-convergence-resolve-G5HJM6MF.js} +5 -5
- package/dist/{workflow-debug-TVLBNRCB.js → workflow-debug-TNBUGSBK.js} +11 -11
- package/dist/{workflow-feedback-GB5VPGE2.js → workflow-feedback-G2ZXAUGI.js} +5 -5
- package/dist/{workflow-fork-2IPJNR76.js → workflow-fork-6HHOMC2D.js} +5 -5
- package/dist/{workflow-promotion-QEQUXVUT.js → workflow-promotion-RG7L6JZT.js} +5 -5
- package/dist/{workflow-proposals-KHGTPMD4.js → workflow-proposals-ZNF2F3UE.js} +5 -5
- package/dist/{workflow-revisions-F5KQEEXB.js → workflow-revisions-TP64Z6FO.js} +5 -5
- package/dist/{workflow-status-66HC5MEA.js → workflow-status-5RG3JX56.js} +5 -5
- package/package.json +3 -2
- package/dist/chunk-3TZABC7D.js.map +0 -1
- package/dist/chunk-BJHAVM7Z.js.map +0 -1
- package/dist/chunk-CQSQNDMV.js.map +0 -1
- package/dist/chunk-CZDQVQ57.js.map +0 -1
- package/dist/chunk-QHRWXCON.js.map +0 -1
- package/dist/chunk-QVMGXMP5.js.map +0 -1
- package/dist/chunk-TGI2AAOZ.js.map +0 -1
- package/dist/chunk-U3MRXQZS.js.map +0 -1
- package/dist/chunk-WWUEKQLR.js.map +0 -1
- package/dist/eval-F4NORBQI.js.map +0 -1
- package/dist/perf-IX7JOMUE.js.map +0 -1
- package/dist/property-TZCGOZQG.js.map +0 -1
- package/dist/sandbox-R6EMGOKR.js.map +0 -1
- package/dist/src-CQ2YAW7F.js.map +0 -1
- package/dist/test-suite-6BH3DESN.js.map +0 -1
- package/dist/workflow-23HKTJLS.js.map +0 -1
- /package/dist/{account-RHHS7HT4.js.map → account-CZYZD2JS.js.map} +0 -0
- /package/dist/{alert-B5WEOKHP.js.map → alert-JQ4SDEB7.js.map} +0 -0
- /package/dist/{api-catalog-UXONX3BR.js.map → api-catalog-IWQC35P2.js.map} +0 -0
- /package/dist/{api-key-J3A4TJKN.js.map → api-key-GUDXIIEA.js.map} +0 -0
- /package/dist/{attachment-ZQW7DR4G.js.map → attachment-CPZYOBUB.js.map} +0 -0
- /package/dist/{auth-HQGKUZBS.js.map → auth-DS6MBVEI.js.map} +0 -0
- /package/dist/{benchmark-TIKJA32J.js.map → benchmark-6HPCIQHD.js.map} +0 -0
- /package/dist/{blackcat-Z5LNV2GS.js.map → blackcat-V3L63WFE.js.map} +0 -0
- /package/dist/{chunk-JQG3V5E3.js.map → chunk-2E3STBHS.js.map} +0 -0
- /package/dist/{chunk-W6DL4IP6.js.map → chunk-3LGCHNBC.js.map} +0 -0
- /package/dist/{chunk-MB4FS35J.js.map → chunk-56HFZHQM.js.map} +0 -0
- /package/dist/{chunk-YTXZUWMN.js.map → chunk-62EXS76C.js.map} +0 -0
- /package/dist/{chunk-6X6ZTDXP.js.map → chunk-BDOL622T.js.map} +0 -0
- /package/dist/{chunk-L4JQ236V.js.map → chunk-C3CXVX2B.js.map} +0 -0
- /package/dist/{chunk-XM3WTJ7Y.js.map → chunk-DEVD2WD2.js.map} +0 -0
- /package/dist/{chunk-Z72GWGH2.js.map → chunk-GCD4EHCD.js.map} +0 -0
- /package/dist/{chunk-3KBYI6RR.js.map → chunk-H6ZMKNP7.js.map} +0 -0
- /package/dist/{chunk-5OKCT6LF.js.map → chunk-IEWAH7W3.js.map} +0 -0
- /package/dist/{chunk-635IQV6B.js.map → chunk-J2ZQULU3.js.map} +0 -0
- /package/dist/{chunk-ZZZ33KTO.js.map → chunk-K2IDR6FR.js.map} +0 -0
- /package/dist/{chunk-YEH7UIUY.js.map → chunk-KTZRI27M.js.map} +0 -0
- /package/dist/{chunk-OU4I3MEH.js.map → chunk-UJSW72LG.js.map} +0 -0
- /package/dist/{chunk-R2CRH6JQ.js.map → chunk-VACACCD6.js.map} +0 -0
- /package/dist/{chunk-EGWVL5XA.js.map → chunk-VMAR67FF.js.map} +0 -0
- /package/dist/{chunk-ZH7HWVEE.js.map → chunk-VMJ7TBVM.js.map} +0 -0
- /package/dist/{chunk-XWJJYZQC.js.map → chunk-XHEVDABB.js.map} +0 -0
- /package/dist/{chunk-SCQVBLNR.js.map → chunk-XHGF6VC6.js.map} +0 -0
- /package/dist/{credential-2IEZDTH3.js.map → credential-GJW7LGYP.js.map} +0 -0
- /package/dist/{credential-template-S5WSOI3P.js.map → credential-template-UWBYKKWD.js.map} +0 -0
- /package/dist/{digest-HQGL7H6E.js.map → digest-XEHGCJM4.js.map} +0 -0
- /package/dist/{docs-CJQZVERZ.js.map → docs-KH4BCEQF.js.map} +0 -0
- /package/dist/{doctor-EGK5AB77.js.map → doctor-FOXXE5SK.js.map} +0 -0
- /package/dist/{environment-MWVXYEDU.js.map → environment-EBDPQTIS.js.map} +0 -0
- /package/dist/{exploration-JC7R7KTJ.js.map → exploration-LCGKRGOQ.js.map} +0 -0
- /package/dist/{exploratory-test-BHK5FTMJ.js.map → exploratory-test-SGECQGIX.js.map} +0 -0
- /package/dist/{external-run-UL5CKG54.js.map → external-run-2AJAI5O7.js.map} +0 -0
- /package/dist/{feature-flag-NMO25TZN.js.map → feature-flag-P7N4WQIH.js.map} +0 -0
- /package/dist/{feedback-3JNPSUXS.js.map → feedback-LAT7TQ2T.js.map} +0 -0
- /package/dist/{flow-AYE4RTZN.js.map → flow-NH2DC6AP.js.map} +0 -0
- /package/dist/{github-DM2DCXRY.js.map → github-FCEKBLXI.js.map} +0 -0
- /package/dist/{init-CPDT5XAU.js.map → init-5U5EZOAW.js.map} +0 -0
- /package/dist/{install-JZRNCHMO.js.map → install-X3UNVXKY.js.map} +0 -0
- /package/dist/{issues-GRFJB52C.js.map → issues-4P6I3YQW.js.map} +0 -0
- /package/dist/{knobs-3Y4QXWAD.js.map → knobs-JKTWJ6ZG.js.map} +0 -0
- /package/dist/{landing-ABYL5WVG.js.map → landing-6AGLKI66.js.map} +0 -0
- /package/dist/{list-WG5QB4NK.js.map → list-TWP2RP33.js.map} +0 -0
- /package/dist/{local-KX24OR5Z.js.map → local-D75QE5TB.js.map} +0 -0
- /package/dist/{login-MLJQAIFK.js.map → login-RBET4TIP.js.map} +0 -0
- /package/dist/{mcp-DDTO54XD.js.map → mcp-562SUUMK.js.map} +0 -0
- /package/dist/{metrics-BJLLOSPQ.js.map → metrics-4WF2GEPA.js.map} +0 -0
- /package/dist/{monitor-E2CKGHPM.js.map → monitor-WJXH54H2.js.map} +0 -0
- /package/dist/{product-2ECWM2JN.js.map → product-CYEQ7HOB.js.map} +0 -0
- /package/dist/{product-map-O542LZQL.js.map → product-map-MSDLIFZY.js.map} +0 -0
- /package/dist/{prompts-Y7O4XJ5P.js.map → prompts-ME53WPN4.js.map} +0 -0
- /package/dist/{proofs-TNOBLSRP.js.map → proofs-D3G6ZUFP.js.map} +0 -0
- /package/dist/{psql-M66YSUXW.js.map → psql-EXAUDU3W.js.map} +0 -0
- /package/dist/{record-3JINBRAR.js.map → record-EE7NGNKY.js.map} +0 -0
- /package/dist/{redis-FOIBINYA.js.map → redis-M4EYWKOJ.js.map} +0 -0
- /package/dist/{release-B4VWMVEI.js.map → release-4KUWVWWC.js.map} +0 -0
- /package/dist/{runbook-EYMSE37E.js.map → runbook-AHU77ANQ.js.map} +0 -0
- /package/dist/{scenarios-W7YNLBVO.js.map → scenarios-TU656T2B.js.map} +0 -0
- /package/dist/{schedule-EDHQJUUZ.js.map → schedule-DXJI6SYO.js.map} +0 -0
- /package/dist/{session-4N62APNQ.js.map → session-RUFTJHF4.js.map} +0 -0
- /package/dist/{slack-RUAXG6TB.js.map → slack-M3OKDVMY.js.map} +0 -0
- /package/dist/{spec-ZZKMW7ER.js.map → spec-5MXEBLYR.js.map} +0 -0
- /package/dist/{src-DGIVA22K.js.map → src-2X5OQRPJ.js.map} +0 -0
- /package/dist/{src-ECZWYNSV.js.map → src-72EFBA2R.js.map} +0 -0
- /package/dist/{src-OKSAEHQS.js.map → src-KH6WSBJV.js.map} +0 -0
- /package/dist/{start-OCZGILRL.js.map → start-PDYBRB5T.js.map} +0 -0
- /package/dist/{status-YTJ6YITG.js.map → status-VMVPVCDA.js.map} +0 -0
- /package/dist/{tag-KBG4SWRL.js.map → tag-7KTDLPVU.js.map} +0 -0
- /package/dist/{task-O6XRMHYE.js.map → task-QLFYZNKR.js.map} +0 -0
- /package/dist/{teams-NFUHS7XI.js.map → teams-Y7BXCY6P.js.map} +0 -0
- /package/dist/{tickets-JU2STK4B.js.map → tickets-CQDJDNPY.js.map} +0 -0
- /package/dist/{trace-NMSGKASJ.js.map → trace-QDORWXYX.js.map} +0 -0
- /package/dist/{triage-JGECJJU5.js.map → triage-GY7M3UGG.js.map} +0 -0
- /package/dist/{trigger-OSPEVCCQ.js.map → trigger-DLFAORX4.js.map} +0 -0
- /package/dist/{update-check-FNP6RFZO.js.map → update-check-ES6XQ7OF.js.map} +0 -0
- /package/dist/{upgrade-3PPBXFAT.js.map → upgrade-WKEOW5GS.js.map} +0 -0
- /package/dist/{usage-QMCU2JIO.js.map → usage-E6FDTR3W.js.map} +0 -0
- /package/dist/{utilities-7VHWTSJT.js.map → utilities-4Z6YX3L5.js.map} +0 -0
- /package/dist/{visual-WIZSPTVK.js.map → visual-TA6LPVDJ.js.map} +0 -0
- /package/dist/{workflow-cache-ACGM3BOI.js.map → workflow-cache-MNLEMRMM.js.map} +0 -0
- /package/dist/{workflow-cache-convergence-resolve-KEQDQMKL.js.map → workflow-cache-convergence-resolve-G5HJM6MF.js.map} +0 -0
- /package/dist/{workflow-debug-TVLBNRCB.js.map → workflow-debug-TNBUGSBK.js.map} +0 -0
- /package/dist/{workflow-feedback-GB5VPGE2.js.map → workflow-feedback-G2ZXAUGI.js.map} +0 -0
- /package/dist/{workflow-fork-2IPJNR76.js.map → workflow-fork-6HHOMC2D.js.map} +0 -0
- /package/dist/{workflow-promotion-QEQUXVUT.js.map → workflow-promotion-RG7L6JZT.js.map} +0 -0
- /package/dist/{workflow-proposals-KHGTPMD4.js.map → workflow-proposals-ZNF2F3UE.js.map} +0 -0
- /package/dist/{workflow-revisions-F5KQEEXB.js.map → workflow-revisions-TP64Z6FO.js.map} +0 -0
- /package/dist/{workflow-status-66HC5MEA.js.map → workflow-status-5RG3JX56.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/help.ts"],"sourcesContent":["import { AGENT_FEEDBACK_TOPICS } from '@chatsdet/types';\nimport { readAllStoredTokens, resolveOptionalConfig } from './auth';\nimport { version, readBrandEnv, specExtension } from './brand.js';\nimport { isSuperadminToken } from './jwt';\n\nexport function printVersion() {\n console.log(`canary v${version}`);\n}\n\n/** The first lines of `canary --help`: how an agent tells us where it got stuck. */\nexport const AGENT_FEEDBACK_HELP = [\n 'Agents: if a skill, guide or command confused you, or you needed a tool that doesn\\'t exist, tell us:',\n ` canary feedback \"<what happened and what would have helped>\" --topic <${AGENT_FEEDBACK_TOPICS.join('|')}>`,\n ' Don\\'t include secrets, credentials, customer data, real names or URLs; describe the problem with neutral examples (Acme, example.com).',\n];\n\nexport function printHelp({\n isSuperadmin,\n features = {},\n}: {\n isSuperadmin: boolean;\n features?: Record<string, boolean>;\n}) {\n const lines: string[] = [\n ...AGENT_FEEDBACK_HELP,\n '',\n `canary v${version}: Testing and QA CLI`,\n '',\n 'Usage:',\n ' canary test-suite <sub-command> Run and query test suite results',\n ' canary perf <sub-command> Compare commit performance and manage saved perf tests',\n ' canary eval <sub-command> Author, run and compare agent evals',\n ' canary visual <sub-command> Review visual checkpoints and mark regressions',\n ' canary external-run <sub-command> Diagnose external suite runs (no superadmin access)',\n ' canary mcp Start MCP server (stdio)',\n ' canary install [--target <id>] Install MCP server into Claude, Cursor, etc.',\n ' canary login [--org <name>] [--app-url https://app.runcofactor.com] [--no-open]',\n ' canary orgs [members] List organizations + your logged-in sessions',\n ' canary org invite <email> [--role] Invite a teammate (org invites: pending invitations)',\n ' canary api-key <sub-command> Create, list and revoke API keys (CI: COFACTOR_API_TOKEN)',\n ' canary org settings get|set ... Read or set organization-wide external-test concurrency',\n ' canary org use <name|id> Set the active org for bare commands',\n ' canary record [options] Record browser interactions',\n ' canary local <sub-command> Set up and manage local testing',\n ' canary session <sub-command> Manage local browser sessions',\n ' canary issues <sub-command> Search and view issues',\n ' canary tickets <sub-command> Search, file, update, link and close tickets in the connected tracker',\n ' canary credential <sub-command> List, create, update, and test credentials',\n ' canary persona <sub-command> Manage per-application personas',\n ' canary workflow <sub-command> Inspect workflow definitions',\n ` canary spec <sub-command> Author workflows from ${specExtension} spec files`,\n ' canary api-catalog <sub-command> Manage API catalog sources and endpoints',\n ' canary skill <name> Install an AI agent skill template (--name to rename)',\n ' canary prompts <list|get> Curated starter prompts for coding agents',\n ' canary digest <list|get> Read daily/weekly QA digests',\n ' canary feedback \"<text>\" [--topic] Tell the Cofactor team what confused you or what you needed',\n \" canary github connect Connect the organization's GitHub App installation from the terminal\",\n ' canary github bind Superadmin: bind an existing GitHub App installation to an org',\n \" canary slack <connect|disconnect> Connect or disconnect the organization's Slack workspace\",\n ' canary teams <sub-command> Manage the Microsoft Teams connection',\n ];\n\n lines.push(' canary release <sub-command> Release QA gate (CI/CD)');\n lines.push(' canary runbook <sub-command> Run repo-declared operational commands (deploy, rollback)');\n\n lines.push(\n ' canary application <sub-command> List and create applications, view linked repos (alias: property)',\n ' canary environment <sub-command> List, create, default environments; set variables (alias: env)',\n ' canary sandbox <sub-command> Sandboxes v2: push, claim, run app copies (+ legacy v1)',\n ' canary attachment <sub-command> List, upload, and manage attachments',\n ' canary tag <sub-command> List, create, and assign tags',\n ' canary triage <sub-command> Read AI triage results for a test suite execution',\n ' canary schedule <target> <sub-command> Schedule recurring suite runs or exploratory tests',\n ' canary alert <sub-command> Manage notify-only alerts (Slack/Teams/email)'\n );\n\n // Feature-gated agent commands — only listed when the signed-in org has the\n // backing feature flag (resolved from /me). Hidden otherwise so help never\n // advertises a command that returns 403.\n if (features.agentTasks) {\n lines.push(' canary task <sub-command> Manage agent tasks');\n }\n if (features.utilities) {\n lines.push(\n ' canary utilities <group> <sub> Object storage, gists, email/slack (agent toolkit)'\n );\n }\n lines.push(\n ' canary product-map <sub-command> Areas, capabilities, stages, flow links, coverage',\n ' canary proofs <sub-command> The tests a pull request lists as proof (block, status)',\n ' canary exploration <sub-command> Run exploration cycles now (--cycles N), inspect them',\n ' canary exploratory-test <sub-command> Start and inspect exploratory tests (run, get, list)'\n );\n\n if (isSuperadmin) {\n lines.push(\n ' canary org create --name <n> [--owner-email <e>] Create an org for someone and invite its owner',\n ' canary debug-session [--env dev|local] [--json] Create browser debug session',\n ' canary psql <query> [--json] Execute read-only SQL',\n ' canary redis <command> [--json] Execute read-only Redis commands',\n ' canary docs <sub-command> Manage documentation pages',\n ' canary landing <sub-command> Manage runcofactor.com/lp/<slug> landing pages',\n ' canary feature-flag <sub-command> Manage feature flags',\n ' canary knobs <sub-command> Manage knobs (global config)',\n ' canary product <sub-command> Manage the Product board (cards, fields, flag links)',\n ' canary metrics <sub-command> Manage product metrics (pull/review health metrics)',\n ' canary benchmark <sub-command> Run/inspect ad-hoc A/B experiments (models, knobs, flags)',\n ' canary account <sub-command> Manage the Accounts board (accounts, org links)',\n ' canary status <sub-command> Publish incidents to the status page',\n ' canary feedback list Read agent feedback from every org'\n );\n }\n\n lines.push(\n ' canary auth doctor [--env <env>] Diagnose auth / corporate-proxy issues',\n ' canary trigger <kind> Enqueue proof promotion on merge or deploy',\n ' canary upgrade Upgrade CLI to latest version',\n ' canary version Show version',\n ' canary help',\n '',\n 'Test suite sub-commands:',\n ' run [options] Trigger a test suite and stream results',\n ' list [options] List recent test suites',\n ' get <id> [options] Show suite detail with runs',\n ' diagnostics <workflowId> <runId> Get failure diagnostic',\n ' steps <workflowId> <runId> Get workflow run steps',\n '',\n 'Test suite run options:',\n ' --token <key> API key (or set CANARY_API_TOKEN)',\n ' --api-url <url> API URL (default: https://api.runcofactor.com)',\n ' --application <name|id> Target a specific application (alias: --property)',\n ' --environment <name|id> Target a specific environment',\n ' --tag <tag> Filter workflows by tag',\n ' --name-pattern <pat> Filter workflows by name pattern',\n ' --suite <name|id> Run a named suite (layered)',\n ' --at <sha|pushId|tag> With --suite: pin Sandboxes v2 to a commit SHA (GitHub) or push id/tag',\n ' (pushed applications; tags are case-sensitive). A pinned run never',\n ' feeds visual baselines.',\n ' Mixed GitHub and pushed suites cannot be pinned with one --at.',\n ' --verbose, -v Show all events',\n '',\n 'Login options:',\n ' --org <name> Select organization by name or ID (for multi-org users)',\n '',\n 'Working across orgs (act on behalf of customers):',\n ' Stay logged into several orgs at once and pick which one any command runs as.',\n ' (--org goes AFTER the command, like --env: `canary <command> ... --org <name>`.)',\n ' canary <command> --org <name|id> Run one command as one of your logged-in orgs',\n ' CANARY_ORG=<name|id> Persistent default org (like AWS_PROFILE)',\n ' canary login --org <name> Add / refresh a session (side by side per env)',\n ' canary org use <name> Set the active org for bare (no --org) commands',\n ' canary orgs See your logged-in orgs, their env, token expiry',\n ' (Superadmin cross-org commands target a different org with --target-org.)',\n '',\n 'Login environments:',\n ' Production: canary login',\n ' Dev: canary login --app-url https://app.dev.trycanary.ai --api-url https://api.dev.trycanary.ai',\n ' Local: canary login --app-url http://localhost:5173 --api-url http://localhost:3000',\n '',\n ' Or set CANARY_API_URL env var for non-production environments:',\n ' export CANARY_API_URL=http://localhost:3000'\n );\n\n lines.push(\n '',\n 'Debug options:',\n ' --to-step <N> Stop after step N (1-based, default: all)',\n ' --env <env> Environment (local, dev, prod)',\n ' --verbose, -v Show all SSE events',\n '',\n 'Issues sub-commands:',\n ' list [options] List and search issues',\n ' get <issueId> [options] Get issue detail with diagnostics',\n '',\n 'Issues options:',\n ' --search <query> Full-text search',\n ' --severity <level> Filter: low, medium, high, unknown',\n ' --status <statuses> Filter: open, closed, not_a_bug (comma-separated)',\n ' --application-id <uuid> Filter by application (alias: --property-id)',\n ' --page <n> Page number (default: 1)',\n ' --page-size <n> Page size (default: 25)',\n ' --json Output raw JSON',\n ' --format markdown Output as markdown',\n '',\n 'Release sub-commands:',\n ' trigger --application-id <uuid> Trigger a Release QA run (alias: --property-id)',\n ' status <run-id> [--json] Check run status',\n ' run --application-id <uuid> [--timeout N] Trigger and poll until complete',\n '',\n 'Record options:',\n ' --credential <id> Credential ID (skip interactive selection)',\n ' --url <startUrl> URL to navigate to after launch',\n ' --output <dir> Local output directory (default: temp dir)',\n ' --env <env> Environment (local, dev, prod)',\n ' --no-upload Save locally only, skip API upload',\n ''\n );\n\n if (isSuperadmin) {\n lines.push(\n '',\n 'PSQL options:',\n ' --json Output results as JSON',\n ' --query <sql> SQL query (alternative to positional)',\n '',\n 'Redis options:',\n ' --json Output results as JSON',\n '',\n 'Feature flag sub-commands:',\n ' list List all flags',\n ' create <name> [--description <text>] Create a flag',\n ' delete <name> Delete a flag and its gates',\n ' enable <name> --target-org <orgId> Enable for an org',\n ' disable <name> --target-org <orgId> Disable for an org',\n ' lifecycle <name> --stage <stage> [--final-value true|false]',\n ' Set lifecycle metadata',\n '',\n 'Knobs sub-commands:',\n ' list List all knobs',\n ' get <key> Get a knob value',\n ' set <key> <value> --type <type> Set a knob value',\n ' delete <key> Delete a knob',\n ' toggle <key> Toggle a boolean knob',\n ' lifecycle <key> --stage <stage> [--final-value <value>]',\n ' Set lifecycle metadata',\n '',\n 'Product board sub-commands (org you are logged into):',\n ' list [--search <t>] [--priority p0,p1] [--include-deprecated] List items',\n ' create <title> [--description <t>] [--stage <s>] [--priority <p0-p3>] Create item',\n ' set <id> [--title <t>] [--description <t>] [--priority <p0-p3|null>] Update fields',\n ' move <id> --stage <s> [--before <id>] [--after <id>] Move card to a column',\n ' delete <id> Delete item',\n ' customer add <id> (--account-card <id> | --target-org <orgId>) [--name <t>] Link customer',\n ' customer remove <id> <customerId> Unlink customer',\n ' link-flag <cardId> --flag <name> | --flag <name> --clear Link/unlink a feature flag',\n ' flags <cardId> List flags linked to a card',\n '',\n 'Account board sub-commands (org you are logged into):',\n ' list [--search <t>] [--stage <s>] List accounts',\n ' create <name> [--description <t>] [--stage <s>] Create account (default stage=prospect)',\n ' set <id> [--title <t>] [--description <t>] [--stage <s>] Update fields',\n ' delete <id> Delete account',\n ' link-org <id> --target-org <customerOrgId> Bind account to a customer org',\n ' unlink-org <id> Remove org link',\n ' linked-org <id> Show linked org'\n );\n }\n\n lines.push('', 'Flags:', ' -h, --help Show help', ' -V, --version Show version');\n\n console.log(lines.join('\\n'));\n}\n\nexport function printTestHelp() {\n console.log(\n [\n `canary v${version}: Test command`,\n '',\n '\\x1b[33m⚠ `canary test` is deprecated. Use `canary test-suite run` instead.\\x1b[0m',\n '',\n 'Usage:',\n ' canary test-suite run [options] Trigger a test suite and stream results',\n ' canary test-suite list List recent test suites',\n ' canary test-suite get <id> Show suite detail with runs',\n '',\n 'Run options:',\n ' --token <key> API key (or set CANARY_API_TOKEN)',\n ' --api-url <url> API URL (default: https://api.runcofactor.com)',\n ' --application <name|id> Target a specific application (alias: --property)',\n ' --environment <name|id> Target a specific environment',\n ' --tag <tag> Filter workflows by tag',\n ' --name-pattern <pat> Filter workflows by name pattern',\n ' --verbose, -v Show all events',\n '',\n 'Examples:',\n ' canary test-suite run Run all workflow tests',\n ' canary test-suite run --tag smoke Run smoke-tagged workflows',\n ' canary test-suite run --property \"My App\" --environment staging',\n ].join('\\n')\n );\n}\n\n/** Check if any stored profile (or env token) has superadmin privileges */\nexport async function resolveIsSuperadmin(): Promise<boolean> {\n const envToken = readBrandEnv('CANARY_API_TOKEN');\n if (envToken) return isSuperadminToken(envToken);\n\n const tokens = await readAllStoredTokens();\n return tokens.some((t) => isSuperadminToken(t));\n}\n\n/**\n * Best-effort fetch of the signed-in org's enabled feature flags (the same\n * `user.features` map the web app uses), so the global help can hide commands\n * for features the org doesn't have. Fail-closed: any error, timeout, or\n * missing auth yields `{}`, which hides feature-gated commands rather than\n * advertising something the org can't use. Never throws.\n */\nexport async function resolveOrgFeatures(): Promise<Record<string, boolean>> {\n try {\n const config = await resolveOptionalConfig([]);\n if (!config) return {};\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 3000);\n try {\n const res = await fetch(`${config.apiUrl}/me`, {\n headers: { Authorization: `Bearer ${config.token}` },\n signal: controller.signal,\n });\n if (!res.ok) return {};\n const body = (await res.json()) as { user?: { features?: Record<string, boolean> } };\n return body.user?.features ?? {};\n } finally {\n clearTimeout(timer);\n }\n } catch {\n return {};\n }\n}\n\n/** Resolve superadmin + org features in parallel, then print the global help. */\nexport async function showGlobalHelp(): Promise<void> {\n const [isSuperadmin, features] = await Promise.all([resolveIsSuperadmin(), resolveOrgFeatures()]);\n printHelp({ isSuperadmin, features });\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAKO,SAAS,eAAe;AAC7B,UAAQ,IAAI,WAAW,OAAO,EAAE;AAClC;AAGO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA,2EAA2E,sBAAsB,KAAK,GAAG,CAAC;AAAA,EAC1G;AACF;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,WAAW,CAAC;AACd,GAGG;AACD,QAAM,QAAkB;AAAA,IACtB,GAAG;AAAA,IACH;AAAA,IACA,WAAW,OAAO;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kEAAkE,aAAa;AAAA,IAC/E;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,KAAK,mEAAmE;AAC9E,QAAM,KAAK,qGAAqG;AAEhH,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAKA,MAAI,SAAS,YAAY;AACvB,UAAM,KAAK,8DAA8D;AAAA,EAC3E;AACA,MAAI,SAAS,WAAW;AACtB,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,cAAc;AAChB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,cAAc;AAChB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,IAAI,UAAU,8BAA8B,+BAA+B;AAEtF,UAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AAC9B;AAEO,SAAS,gBAAgB;AAC9B,UAAQ;AAAA,IACN;AAAA,MACE,WAAW,OAAO;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAGA,eAAsB,sBAAwC;AAC5D,QAAM,WAAW,aAAa,kBAAkB;AAChD,MAAI,SAAU,QAAO,kBAAkB,QAAQ;AAE/C,QAAM,SAAS,MAAM,oBAAoB;AACzC,SAAO,OAAO,KAAK,CAAC,MAAM,kBAAkB,CAAC,CAAC;AAChD;AASA,eAAsB,qBAAuD;AAC3E,MAAI;AACF,UAAM,SAAS,MAAM,sBAAsB,CAAC,CAAC;AAC7C,QAAI,CAAC,OAAQ,QAAO,CAAC;AACrB,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,GAAI;AACvD,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,OAAO;AAAA,QAC7C,SAAS,EAAE,eAAe,UAAU,OAAO,KAAK,GAAG;AAAA,QACnD,QAAQ,WAAW;AAAA,MACrB,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,QAAO,CAAC;AACrB,YAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,aAAO,KAAK,MAAM,YAAY,CAAC;AAAA,IACjC,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAGA,eAAsB,iBAAgC;AACpD,QAAM,CAAC,cAAc,QAAQ,IAAI,MAAM,QAAQ,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAC,CAAC;AAChG,YAAU,EAAE,cAAc,SAAS,CAAC;AACtC;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/remote-test.ts","../src/remote-test-config.ts","../src/remote-test-format.ts"],"sourcesContent":["/**\n * Remote Test Command\n *\n * Triggers workflow tests on the Canary platform and streams results via SSE.\n * Designed for CI/CD pipelines. Exit codes: 0 every runnable test settled with\n * no failures, 1 one or more hard failures, 2 no failures but at least one\n * workflow was inconclusive (the platform never produced a verdict).\n *\n * Usage:\n * canary test-suite run [options]\n *\n * Options:\n * --token <key> API key (or set CANARY_API_TOKEN env var)\n * --api-url <url> API URL (default: https://api.runcofactor.com)\n * --tag <tag> Filter workflows by tag\n * --name-pattern <pat> Filter workflows by name pattern\n * --external-host-shape <shape> Reserve one exact dedicated host for an external v2 suite\n * --verbose, -v Show all events (not just results)\n */\n\nimport process from 'node:process';\nimport { createParser, type EventSourceMessage } from 'eventsource-parser';\nimport type {\n WorkflowTestEvent,\n WorkflowTestStatus,\n WorkflowTestSuiteEvent,\n} from '@chatsdet/types';\nimport { resolveConfig } from './auth';\nimport { resolveTestConfig, type ResolvedConfig } from './remote-test-config';\nimport { resolveTestSuite, UUID_RE } from './cli-helpers.js';\nimport { writeRawOutput } from './brand.js';\nimport {\n buildQueryParams,\n extractWorkflowName,\n formatFailedTests,\n formatExternalRunSummary,\n formatStreamClosedBeforeCompletion,\n formatStreamReadFailure,\n formatSummary,\n formatTestResultLine,\n getArgValue,\n hasFlag,\n trackFailedTest,\n type FailedTestTracker,\n type SuiteSummaryStats,\n} from './remote-test-format';\n\n/** No suite event seen yet — `formatSummary` reads this as \"no workflows\". */\nconst EMPTY_SUITE_STATS: SuiteSummaryStats = {\n totalWorkflows: 0,\n completedWorkflows: 0,\n successfulWorkflows: 0,\n failedWorkflows: 0,\n inconclusiveWorkflows: 0,\n skippedWorkflows: 0,\n degradedWorkflows: 0,\n waitingWorkflows: 0,\n};\n\n\ntype TriggerResponse = {\n ok: boolean;\n jobId?: string;\n suiteId?: string;\n startedAt?: string;\n appUrl?: string;\n error?: string;\n};\n\n/**\n * The message for a refused trigger: a typed user error's own sentence (e.g. why\n * no workflows matched), otherwise the status and raw body.\n */\nfunction formatTriggerFailure(status: number, body: string): string {\n try {\n const parsed = JSON.parse(body) as { userError?: boolean; error?: unknown };\n if (parsed.userError === true && typeof parsed.error === 'string') {\n return `Error: ${parsed.error}`;\n }\n } catch {\n // Not JSON (a proxy error page, say) — fall through to the raw body.\n }\n return `Failed to start tests: ${status}\\n${body}`;\n}\n\n// Export internals for testing\nexport const __internals = {\n getArgValue,\n hasFlag,\n buildQueryParams,\n extractWorkflowName,\n formatSummary,\n formatTestResultLine,\n trackFailedTest,\n formatExternalRunSummary,\n formatFailedTests,\n formatStreamReadFailure,\n formatStreamClosedBeforeCompletion,\n resolveTestConfig,\n UUID_RE,\n triggerNamedSuiteRun,\n};\n\ntype NamedSuiteTrigger =\n | { kind: 'native'; executionId: string; jobId: string; pinnedCommit: string | null }\n | { kind: 'external'; runId: string; jobId: string; runUrl: string };\n\n/**\n * Resolve a `--suite <name|id>` argument to a suite id and trigger a layered\n * run via POST /test-suites/:id/run. Returns the execution id (used as the SSE\n * stream key) and the orchestrator job id.\n */\nasync function triggerNamedSuiteRun(\n apiUrl: string,\n token: string,\n suiteArg: string,\n environmentId: string | undefined,\n environmentMode: 'mixed' | 'force',\n verbose: boolean,\n externalSelection?: { specPath?: string; grep?: string },\n externalAreas?: string[],\n pinnedCommit?: string,\n externalHostShape?: string\n): Promise<NamedSuiteTrigger> {\n const authHeaders = {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n };\n\n // Resolve name → id (exact id is accepted as-is; otherwise match by name).\n const match = await resolveTestSuite(suiteArg, apiUrl, token);\n\n // The name came from the database, so it must bypass console branding — a\n // suite really named \"Canary Smoke\" would otherwise print as \"Cofactor\n // Smoke\". See writeRawOutput's contract in brand.ts.\n writeRawOutput(`Starting test suite: ${match.name}`);\n console.log(` Env mode: ${environmentMode}`);\n if (environmentMode === 'force' && environmentId) console.log(` Environment: ${environmentId}`);\n if (pinnedCommit) console.log(` Pinned at: ${pinnedCommit} (never feeds visual baselines)`);\n console.log('');\n\n const runBody: {\n environmentId?: string;\n environmentMode: 'mixed' | 'force';\n externalSelection?: { specPath?: string; grep?: string };\n externalAreas?: string[];\n externalHostShape?: string;\n at?: string;\n } = {\n environmentMode,\n };\n // `!== undefined`, not truthiness: an empty value must reach the server and be refused, never run unpinned.\n if (pinnedCommit !== undefined) runBody.at = pinnedCommit;\n if (environmentMode === 'force' && environmentId) runBody.environmentId = environmentId;\n if (externalSelection) runBody.externalSelection = externalSelection;\n if (externalAreas) runBody.externalAreas = externalAreas;\n if (externalHostShape !== undefined) runBody.externalHostShape = externalHostShape;\n const runRes = await fetch(`${apiUrl}/test-suites/${match.id}/run`, {\n method: 'POST',\n headers: authHeaders,\n body: JSON.stringify(runBody),\n });\n if (!runRes.ok) {\n const body = await runRes.text();\n // A refused pin says why in `reason`; show it rather than the raw body.\n try {\n const refused = JSON.parse(body) as { userError?: boolean; error?: string; reason?: string };\n if (refused.userError === true && refused.reason) {\n console.error(`Error: ${refused.error ?? 'The suite cannot run'}: ${refused.reason}`);\n process.exit(1);\n }\n } catch {\n // Not JSON (a proxy error page, say): fall through to the raw body.\n }\n console.error(`Failed to start suite: ${runRes.status}`);\n console.error(body);\n process.exit(1);\n }\n const runJson = (await runRes.json()) as {\n ok: boolean;\n data?: NamedSuiteTrigger;\n error?: string;\n };\n if (!runJson.ok || !runJson.data) {\n console.error(`Failed to start suite: ${runJson.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n if (verbose) {\n console.log(\n runJson.data.kind === 'external'\n ? `External run ID: ${runJson.data.runId}`\n : `Execution ID: ${runJson.data.executionId}`\n );\n console.log(`Job ID: ${runJson.data.jobId}`);\n console.log('');\n }\n return runJson.data;\n}\n\nexport async function streamExternalRun(\n apiUrl: string,\n token: string,\n run: Extract<NamedSuiteTrigger, { kind: 'external' }>,\n verbose: boolean\n): Promise<never> {\n const response = await fetch(`${apiUrl}/jobs/${run.runId}/stream`, {\n headers: { Authorization: `Bearer ${token}`, Accept: 'text/event-stream' },\n });\n if (!response.ok || !response.body) {\n console.error(`Failed to connect to external run stream: ${response.status}`);\n process.exit(1);\n }\n\n let sealed = false;\n let exitCode = 1;\n const parser = createParser({\n onEvent: (event: EventSourceMessage) => {\n if (!event.data || !event.event?.startsWith('external-run.')) return;\n try {\n const data = JSON.parse(event.data) as Record<string, unknown>;\n if (verbose) console.log(`[${event.event}] ${JSON.stringify(data)}`);\n if (event.event === 'external-run.shard' && !verbose) {\n console.log(\n ` shard ${String(data.shardIndex)}/${String(data.shardTotal)}: ${String(data.phase)} (attempt ${String(data.attempt)})`\n );\n }\n if (event.event === 'external-run.status' && data.status === 'canceled') {\n sealed = true;\n exitCode = 1;\n console.error('External test run was canceled.');\n }\n if (event.event === 'external-run.sealed') {\n sealed = true;\n const total = Number(data.total ?? 0);\n const passed = Number(data.passed ?? 0);\n const failed = Number(data.failed ?? 0);\n const flaky = Number(data.flaky ?? 0);\n const skipped = Number(data.skipped ?? 0);\n const summary = formatExternalRunSummary({\n total,\n passed,\n failed,\n flaky,\n skipped,\n resultsTruncated: data.resultsTruncated === true,\n });\n console.log('');\n console.log('─'.repeat(50));\n console.log(summary.message);\n console.log(`Run: ${apiUrl.replace(/\\/api\\/?$/, '')}${run.runUrl}`);\n exitCode = summary.exitCode;\n }\n } catch (error) {\n if (verbose) console.error(`Ignored malformed stream event: ${String(error)}`);\n }\n },\n });\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n try {\n while (!sealed) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.feed(decoder.decode(value, { stream: true }));\n }\n } catch (error) {\n console.error(formatStreamReadFailure(error));\n } finally {\n reader.releaseLock();\n }\n if (!sealed) console.error(formatStreamClosedBeforeCompletion());\n process.exit(exitCode);\n}\n\nexport async function runRemoteTest(argv: string[]): Promise<void> {\n if (argv.some((arg) => arg.startsWith('--external-host-shape='))) {\n console.error('Error: use --external-host-shape <shape> with a space; equals syntax is not supported.');\n process.exit(1);\n }\n const { apiUrl, token } = await resolveConfig(argv);\n\n const tag = getArgValue(argv, '--tag');\n const namePattern = getArgValue(argv, '--name-pattern');\n // \"--application\" is the user-facing flag; \"--property\" stays as a backwards-compat alias.\n const propertyArg = getArgValue(argv, '--application') ?? getArgValue(argv, '--property');\n const environmentArg = getArgValue(argv, '--environment');\n const suiteArg = getArgValue(argv, '--suite');\n const externalSpec = getArgValue(argv, '--external-spec');\n const externalGrep = getArgValue(argv, '--external-grep');\n const externalHostShape = getArgValue(argv, '--external-host-shape');\n if (hasFlag(argv, '--external-host-shape') && (!externalHostShape || externalHostShape.startsWith('--'))) {\n console.error('Error: --external-host-shape needs a provider shape.');\n process.exit(1);\n }\n const areaArg = getArgValue(argv, '--area');\n const verbose = hasFlag(argv, '--verbose', '-v');\n const pinnedCommitArg = getArgValue(argv, '--at');\n // A pin that fails open would run an unpinned suite the caller never asked for.\n if (hasFlag(argv, '--at') && !pinnedCommitArg) {\n console.error('Error: --at needs <sha|pushId|tag>.');\n process.exit(1);\n }\n if (pinnedCommitArg !== undefined && !suiteArg) {\n console.error('Error: --at requires --suite <name|id>.');\n process.exit(1);\n }\n if ((externalSpec || externalGrep || areaArg !== undefined || externalHostShape !== undefined) && !suiteArg) {\n console.error('Error: --area, --external-spec, --external-grep and --external-host-shape require --suite <name|id>.');\n process.exit(1);\n }\n // A spec path already names the tests to run, so it cannot also be narrowed\n // to areas. A title regex can: it is applied inside each area.\n if (areaArg !== undefined && externalSpec) {\n console.error(\n 'Error: --area cannot be combined with --external-spec (a spec path picks its own tests). ' +\n 'Use --external-grep to filter within an area.'\n );\n process.exit(1);\n }\n // One area or several: `--area a,b` fans out one sandbox per area, exactly as\n // a full run does, so the run page still groups by area.\n //\n // Tested for `undefined`, not truthiness: `--area \"\"` parses to the empty\n // string, and treating that as \"no selection\" would quietly run the whole\n // suite when the user plainly asked to narrow it.\n const externalAreas =\n areaArg === undefined\n ? undefined\n : areaArg\n .split(',')\n .map((area) => area.trim())\n .filter((area) => area.length > 0);\n if (externalAreas && externalAreas.length === 0) {\n console.error('Error: --area needs at least one area name.');\n process.exit(1);\n }\n\n // Env mode: 'mixed' (default) runs each flow on its own preferred env; 'force'\n // pins the whole suite to --environment (which then becomes required).\n const envModeArg = getArgValue(argv, '--env-mode');\n if (envModeArg !== undefined && envModeArg !== 'mixed' && envModeArg !== 'force') {\n console.error(`Error: --env-mode must be \"mixed\" or \"force\" (got \"${envModeArg}\").`);\n process.exit(1);\n }\n const environmentMode: 'mixed' | 'force' =\n (envModeArg as 'mixed' | 'force' | undefined) ?? (environmentArg ? 'force' : 'mixed');\n if (environmentMode === 'force' && !environmentArg) {\n console.error('Error: --env-mode force requires --environment <name|id>.');\n process.exit(1);\n }\n\n // 0. Resolve property/environment if specified\n let resolvedConfig: ResolvedConfig = {};\n if (propertyArg || environmentArg) {\n try {\n resolvedConfig = await resolveTestConfig(apiUrl, token, propertyArg, environmentArg);\n } catch (err) {\n console.error(`${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n }\n\n console.log('Starting remote workflow tests...');\n if (resolvedConfig.propertyId) console.log(` Application: ${propertyArg}`);\n if (resolvedConfig.environmentId) console.log(` Environment: ${environmentArg}`);\n if (tag) console.log(` Filtering by tag: ${tag}`);\n if (namePattern) console.log(` Filtering by name pattern: ${namePattern}`);\n console.log('');\n\n let suiteId: string;\n let jobId: string | undefined;\n let appUrl: string | undefined;\n let pinnedCommit: string | null = null;\n\n if (suiteArg) {\n // Named, layered suite run. Resolve name→id, then POST /test-suites/:id/run.\n const triggered = await triggerNamedSuiteRun(\n apiUrl,\n token,\n suiteArg,\n resolvedConfig.environmentId,\n environmentMode,\n verbose,\n externalSpec || externalGrep\n ? { ...(externalSpec ? { specPath: externalSpec } : {}), ...(externalGrep ? { grep: externalGrep } : {}) }\n : undefined,\n externalAreas,\n pinnedCommitArg,\n externalHostShape\n );\n if (triggered.kind === 'external') {\n return await streamExternalRun(apiUrl, token, triggered, verbose);\n }\n pinnedCommit = triggered.pinnedCommit;\n suiteId = triggered.executionId;\n jobId = triggered.jobId;\n } else {\n // 1. Trigger test run\n const queryParams = new URLSearchParams();\n if (tag) queryParams.set('tag', tag);\n if (namePattern) queryParams.set('namePattern', namePattern);\n\n const triggerUrl = `${apiUrl}/workflows/test-runs${queryParams.toString() ? `?${queryParams}` : ''}`;\n\n const body: Record<string, string> = { environmentMode };\n if (resolvedConfig.propertyId) body.propertyId = resolvedConfig.propertyId;\n if (environmentMode === 'force' && resolvedConfig.environmentId)\n body.environmentId = resolvedConfig.environmentId;\n\n let triggerRes: Response;\n try {\n triggerRes = await fetch(triggerUrl, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n } catch (err) {\n console.error(`Failed to connect to API: ${err}`);\n process.exit(1);\n }\n\n if (!triggerRes.ok) {\n console.error(formatTriggerFailure(triggerRes.status, await triggerRes.text()));\n process.exit(1);\n }\n\n const triggerData = (await triggerRes.json()) as TriggerResponse;\n if (!triggerData.ok || !triggerData.suiteId) {\n console.error(`Failed to start tests: ${triggerData.error ?? 'Unknown error'}`);\n process.exit(1);\n }\n suiteId = triggerData.suiteId;\n jobId = triggerData.jobId;\n appUrl = triggerData.appUrl;\n }\n\n if (verbose) {\n console.log(`Suite ID: ${suiteId}`);\n console.log(`Job ID: ${jobId}`);\n console.log('');\n }\n\n // 2. Subscribe to SSE stream\n const streamUrl = `${apiUrl}/workflows/test-runs/stream?suiteId=${suiteId}`;\n\n let streamRes: Response;\n try {\n streamRes = await fetch(streamUrl, {\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: 'text/event-stream',\n },\n });\n } catch (err) {\n console.error(`Failed to connect to event stream: ${err}`);\n process.exit(1);\n }\n\n if (!streamRes.ok || !streamRes.body) {\n console.error(`Failed to connect to event stream: ${streamRes.status}`);\n process.exit(1);\n }\n\n // Track state\n let hasCompleted = false;\n const workflowNames = new Map<string, string>();\n const failedTests: FailedTestTracker = new Map();\n // The last suite event wins: its counters are recomputed server-side from the\n // deduplicated latest attempt per test, so they are authoritative over\n // anything this process could tally from the individual test events.\n let suiteStats: SuiteSummaryStats = EMPTY_SUITE_STATS;\n let streamInterrupted = false;\n\n // 3. Parse SSE events\n const parser = createParser({\n onEvent: (event: EventSourceMessage) => {\n if (!event.data) return;\n\n try {\n const data = JSON.parse(event.data) as\n | WorkflowTestEvent\n | WorkflowTestSuiteEvent\n | { error?: string };\n\n if (verbose) {\n console.log(`[${event.event}] ${JSON.stringify(data)}`);\n }\n\n if (event.event === 'workflow-test') {\n const testEvent = data as WorkflowTestEvent;\n const { status, workflowId, message } = testEvent;\n const name =\n workflowNames.get(workflowId) ||\n message?.replace(/^Flow \"(.+)\" .*$/, '$1') ||\n workflowId;\n\n if (message?.startsWith('Flow \"')) {\n const match = message.match(/^Flow \"(.+?)\" /);\n if (match) workflowNames.set(workflowId, match[1]);\n }\n\n // Tracked regardless of verbosity: the \"Failed tests\" section at the\n // end is built from this, and a later attempt's pass retracts an\n // earlier failure here.\n trackFailedTest(failedTests, {\n status,\n workflowId,\n name,\n testRunId: testEvent.testRunId,\n });\n\n if (!verbose) {\n const line = formatTestResultLine({\n status,\n name,\n errorMessage: testEvent.errorMessage,\n skipReason: testEvent.skipReason,\n });\n if (line) console.log(line);\n }\n }\n\n if (event.event === 'workflow-test-suite') {\n const suiteEvent = data as WorkflowTestSuiteEvent;\n suiteStats = suiteEvent;\n\n if (suiteEvent.status === 'completed') {\n hasCompleted = true;\n }\n }\n\n if (event.event === 'error') {\n const errorData = data as { error?: string };\n console.error(`Stream error: ${errorData.error ?? 'Unknown error'}`);\n streamInterrupted = true;\n }\n } catch {\n // Ignore parse errors for keepalive, etc.\n }\n },\n });\n\n const reader = streamRes.body.getReader();\n const decoder = new TextDecoder();\n\n try {\n while (!hasCompleted) {\n const { done, value } = await reader.read();\n if (done) {\n if (!hasCompleted) {\n streamInterrupted = true;\n console.error(formatStreamClosedBeforeCompletion());\n }\n break;\n }\n parser.feed(decoder.decode(value, { stream: true }));\n }\n } catch (err) {\n streamInterrupted = true;\n console.error(formatStreamReadFailure(err));\n } finally {\n reader.releaseLock();\n }\n\n // 4. Print summary\n console.log('');\n console.log('─'.repeat(50));\n\n // One rule for the verdict, shared with the unit tests, instead of a second\n // copy of it inline here — the no-workflows case included.\n const summary = formatSummary(suiteStats);\n console.log(summary.message);\n if (pinnedCommit) console.log(`Pinned at: ${pinnedCommit}`);\n\n // A truncated stream makes every counter above a partial read: a workflow\n // that would have failed may simply not have reported yet. Collapse to a\n // plain failure rather than keeping a verdict the partial read cannot\n // support, and say so, so the printed summary and the exit code agree\n // instead of pairing \"PASSED\" with a non-zero exit.\n let exitCode = summary.exitCode;\n if (streamInterrupted) {\n console.log('Result stream did not complete — the summary above is a partial read.');\n exitCode = 1;\n }\n\n const failedSection = formatFailedTests([...failedTests.values()], appUrl);\n if (failedSection) {\n console.log(failedSection);\n }\n\n if (suiteStats.failedWorkflows > 0) {\n console.log('');\n console.log(`Triage: canary triage wait ${suiteId}`);\n }\n\n process.exit(exitCode);\n}\n","import { UUID_RE } from './cli-helpers.js';\n\ntype TestConfigProperty = {\n id: string;\n name: string;\n baseUrl: string;\n environments: Array<{\n id: string;\n name: string;\n url: string;\n isDefault: boolean;\n environmentKindId?: string | null;\n environmentKindName?: string | null;\n }>;\n};\n\ntype TestConfigResponse = {\n ok: boolean;\n properties: TestConfigProperty[];\n error?: string;\n};\n\nexport type ResolvedConfig = {\n propertyId?: string;\n environmentId?: string;\n};\n\nexport async function resolveTestConfig(\n apiUrl: string,\n token: string,\n propertyArg?: string,\n environmentArg?: string\n): Promise<ResolvedConfig> {\n if (!propertyArg && !environmentArg) return {};\n\n const res = await fetch(`${apiUrl}/workflows/test-config`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Failed to fetch test config: ${res.status} ${text}`);\n }\n\n const data = (await res.json()) as TestConfigResponse;\n if (!data.ok || !data.properties) {\n throw new Error(`Failed to fetch test config: ${data.error ?? 'Unknown error'}`);\n }\n\n const { properties } = data;\n let property: TestConfigProperty | undefined;\n\n if (propertyArg) {\n if (UUID_RE.test(propertyArg)) {\n property = properties.find((p) => p.id === propertyArg);\n } else {\n property = properties.find((p) => p.name.toLowerCase() === propertyArg.toLowerCase());\n }\n if (!property) {\n const available = properties.map((p) => ` - ${p.name} (${p.id})`).join('\\n');\n throw new Error(\n `Application \"${propertyArg}\" not found.\\nAvailable applications:\\n${available}`\n );\n }\n } else if (environmentArg) {\n // --environment without --application: auto-resolve if single application\n if (properties.length === 0) {\n throw new Error('No applications found in your organization.');\n }\n if (properties.length > 1) {\n const available = properties.map((p) => ` - ${p.name} (${p.id})`).join('\\n');\n throw new Error(\n `--environment requires --application when multiple applications exist.\\nAvailable applications:\\n${available}`\n );\n }\n property = properties[0];\n }\n\n const result: ResolvedConfig = {};\n if (property) {\n result.propertyId = property.id;\n\n if (environmentArg) {\n let env: TestConfigProperty['environments'][number] | undefined;\n if (UUID_RE.test(environmentArg)) {\n env = property.environments.find((e) => e.id === environmentArg);\n } else {\n env = property.environments.find(\n (e) =>\n e.name.toLowerCase() === environmentArg.toLowerCase() ||\n e.environmentKindName?.toLowerCase() === environmentArg.toLowerCase()\n );\n }\n if (!env) {\n const available = property.environments\n .map((e) => ` - ${e.name}${e.isDefault ? ' (default)' : ''} (${e.id})`)\n .join('\\n');\n throw new Error(\n `Environment \"${environmentArg}\" not found for application \"${property.name}\".\\nAvailable environments:\\n${available}`\n );\n }\n result.environmentId = env.id;\n }\n }\n\n return result;\n}\n","import {\n WORKFLOW_TEST_FAILED_STATUSES,\n WORKFLOW_TEST_SUCCESS_STATUSES,\n type WorkflowTestStatus,\n type WorkflowTestSuiteEvent,\n} from '@chatsdet/types';\n\nexport function getArgValue(argv: string[], key: string): string | undefined {\n const index = argv.indexOf(key);\n if (index === -1 || index >= argv.length - 1) return undefined;\n return argv[index + 1];\n}\n\nexport function hasFlag(argv: string[], ...flags: string[]): boolean {\n return flags.some((flag) => argv.includes(flag));\n}\n\nexport function buildQueryParams(tag?: string, namePattern?: string): string {\n const params = new URLSearchParams();\n if (tag) params.set('tag', tag);\n if (namePattern) params.set('namePattern', namePattern);\n return params.toString();\n}\n\nexport function extractWorkflowName(message: string | undefined, workflowId: string): string {\n if (!message) return workflowId;\n const match = message.match(/^Flow \"(.+?)\" /);\n return match ? match[1] : workflowId;\n}\n\nexport type FailedTest = { name: string; testRunId: string };\n\n/**\n * Failed tests keyed by `workflowId` rather than accumulated in a list.\n *\n * A retried test arrives as a `failed` event followed by a `flaky_success`\n * event for the SAME workflow. Keying by workflow is what lets the later pass\n * remove the earlier failure — an append-only list left the run listed under\n * \"Failed tests\" while the summary line directly above it counted the workflow\n * as a pass.\n *\n * KNOWN LIMITATION: suite scenario expansion fans one workflow out to several\n * test runs in the same execution, which share a `workflowId` and differ only\n * by `scenarioId`. A failing scenario followed by a passing one would therefore\n * retract the failure from this list. The CLI cannot key more precisely today —\n * `WorkflowTestEvent` carries no `scenarioId` over SSE — and keying by\n * `testRunId` instead would break the retry case above, which is the one that\n * actually occurs: of 7,847 production test runs in the 30 days to 2026-09-11,\n * zero had a `scenario_id`. Closing this properly means adding `scenarioId` to\n * the SSE payload, not guessing here. Note the summary COUNTS come from the\n * suite event and stay correct either way; only this list is affected.\n */\nexport type FailedTestTracker = Map<string, FailedTest>;\n\n/**\n * Record or clear one workflow's failure state from a single test event.\n *\n * Only hard failures are listed: `inconclusive`, `skipped` and `degraded` are\n * terminal without being failures (see `WORKFLOW_TEST_FAILED_STATUSES`), and\n * listing them under \"Failed tests\" would overstate what actually broke.\n */\nexport function trackFailedTest(\n tracker: FailedTestTracker,\n event: { status: WorkflowTestStatus; workflowId: string; name: string; testRunId: string }\n): void {\n if (WORKFLOW_TEST_SUCCESS_STATUSES.has(event.status)) {\n tracker.delete(event.workflowId);\n return;\n }\n if (WORKFLOW_TEST_FAILED_STATUSES.has(event.status)) {\n tracker.set(event.workflowId, { name: event.name, testRunId: event.testRunId });\n }\n}\n\n/** Keep a failure message from swamping the result line it annotates. */\nconst ERROR_EXCERPT_LIMIT = 200;\n\nconst excerpt = (text: string | null | undefined): string | null => {\n const trimmed = text?.trim();\n if (!trimmed) return null;\n return trimmed.length > ERROR_EXCERPT_LIMIT\n ? `${trimmed.slice(0, ERROR_EXCERPT_LIMIT)}\\u2026`\n : trimmed;\n};\n\n/**\n * Render one test's result line, or null while the test is still in flight.\n *\n * The `switch` is exhaustive over `WorkflowTestStatus` on purpose: the previous\n * if/else chain covered 4 of the 11 statuses and silently printed nothing for\n * the other 7, so a suite could finish having shown the operator fewer results\n * than it ran. The `never` assignment in the default makes adding a status to\n * the enum a typecheck failure here rather than another silent omission.\n */\nexport function formatTestResultLine(event: {\n status: WorkflowTestStatus;\n name: string;\n errorMessage?: string | null;\n skipReason?: string | null;\n}): string | null {\n const { status, name } = event;\n const detail = excerpt(event.errorMessage);\n const reason = excerpt(event.skipReason);\n\n switch (status) {\n case 'queued':\n case 'running':\n // In-flight: the terminal event for this test is still coming.\n return null;\n case 'waiting':\n return ` \\u23F3 ${name} (waiting for scheduled time)`;\n case 'success':\n return ` \\u2713 ${name}`;\n case 'flaky_success':\n return ` \\u2713 ${name} (flaky \\u2014 passed on retry)`;\n case 'failed':\n return detail ? ` \\u2717 ${name}\\n Error: ${detail}` : ` \\u2717 ${name}`;\n case 'timeout':\n return detail\n ? ` \\u2717 ${name} (timed out)\\n Error: ${detail}`\n : ` \\u2717 ${name} (timed out)`;\n case 'canceled':\n return ` \\u2717 ${name} (canceled)`;\n case 'inconclusive':\n return detail\n ? ` ? ${name} (inconclusive \\u2014 no verdict)\\n Reason: ${detail}`\n : ` ? ${name} (inconclusive \\u2014 no verdict)`;\n case 'skipped':\n return reason ? ` \\u2013 ${name} (skipped: ${reason})` : ` \\u2013 ${name} (skipped)`;\n case 'degraded':\n return ` \\u2013 ${name} (degraded \\u2014 not run)`;\n default: {\n // Compile-time exhaustiveness; at runtime a status from a server newer\n // than this CLI reaches here, and a bare status word is a worse line than\n // none. The suite counters still force exit 2 for it (see formatSummary).\n const exhaustive: never = status;\n void exhaustive;\n return null;\n }\n }\n}\n\nexport function formatFailedTests(\n failedTests: FailedTest[],\n appUrl: string | undefined\n): string | null {\n if (failedTests.length === 0 || !appUrl) return null;\n\n const lines = ['', 'Failed tests:'];\n for (const t of failedTests) {\n lines.push(` \\u2717 ${t.name}`);\n lines.push(` ${appUrl}/runs/tests/${t.testRunId}`);\n }\n return lines.join('\\n');\n}\n\n/** A suite ran, but at least one workflow produced no verdict. */\nexport const EXIT_INCONCLUSIVE = 2;\n\n/**\n * Counters the verdict is computed from — read straight off one\n * `workflow-test-suite` event, so this cannot drift from the wire shape.\n */\nexport type SuiteSummaryStats = Pick<\n WorkflowTestSuiteEvent,\n | 'totalWorkflows'\n | 'completedWorkflows'\n | 'successfulWorkflows'\n | 'failedWorkflows'\n | 'inconclusiveWorkflows'\n | 'skippedWorkflows'\n | 'degradedWorkflows'\n | 'waitingWorkflows'\n>;\n\n/**\n * Summarize a finished suite and decide the process exit code.\n *\n * Three outcomes, not two. A run that produced no verdict — the platform\n * errored before it could check the product — is neither a pass nor a failure;\n * calling it a pass is how production suites that ran 9/9, 10/10 and 12/12\n * inconclusive each reported a green CI build having verified nothing. A real\n * failure still outranks one: a suite with both exits 1, because a product bug\n * is the more actionable signal.\n *\n * The green test is deliberately an INVARIANT rather than a list of the\n * statuses we currently know about: a suite is clean only when every workflow\n * is accounted for as passed, skipped, degraded, or still scheduled. Asking\n * instead whether `inconclusiveWorkflows > 0` would reopen this very bug the\n * day a new no-verdict status gets its own counter column — it would land in\n * neither term and exit 0 silently. Stated this way, anything the CLI cannot\n * account for forces exit 2, including a counter an older server never sent.\n *\n * The explicit `inconclusiveWorkflows` check is kept ALONGSIDE the invariant\n * rather than replaced by it, because the two fail in opposite directions and\n * neither can produce a false green alone. 24 of 2,164 production executions\n * in the 60 days to 2026-09-11 report counters summing ABOVE `totalWorkflows`\n * (overlapping counters), which zeroes `noVerdict` — and would hide a known\n * inconclusive behind an arithmetic artifact if the invariant were the only\n * test. No such execution has a non-zero inconclusive count today; this keeps\n * that from being load-bearing.\n */\nexport function formatSummary(stats: SuiteSummaryStats): { message: string; exitCode: number } {\n const {\n totalWorkflows,\n successfulWorkflows,\n failedWorkflows,\n completedWorkflows,\n inconclusiveWorkflows,\n skippedWorkflows,\n degradedWorkflows,\n waitingWorkflows,\n } = stats;\n\n if (totalWorkflows === 0) {\n return { message: 'No workflows found matching the filter criteria.', exitCode: 0 };\n }\n\n // Clamped per counter, not just on the total: production emits a NEGATIVE\n // `waitingWorkflows` on some executions (six in the 60 days to 2026-09-11,\n // e.g. total 31 / successful 31 / waiting -2 — a server-side counter\n // decremented past zero). Summed raw, that corrupt counter drags the total\n // below `totalWorkflows` and fails an all-green suite, which is a far worse\n // outcome than the miscount it comes from.\n const accountedFor =\n Math.max(0, successfulWorkflows) +\n Math.max(0, failedWorkflows) +\n Math.max(0, skippedWorkflows) +\n Math.max(0, degradedWorkflows) +\n Math.max(0, waitingWorkflows);\n const noVerdict = Math.max(0, totalWorkflows - accountedFor);\n\n const passRate = Math.round((successfulWorkflows / totalWorkflows) * 100);\n const stillWaiting = totalWorkflows - completedWorkflows;\n\n let message: string;\n let exitCode: number;\n\n if (failedWorkflows > 0) {\n message = `FAILED: ${failedWorkflows} of ${totalWorkflows} workflows failed (${passRate}% pass rate)`;\n if (inconclusiveWorkflows > 0) {\n message += `, ${inconclusiveWorkflows} inconclusive`;\n }\n exitCode = 1;\n } else if (noVerdict > 0 || inconclusiveWorkflows > 0) {\n // Whichever term actually fired: when overlapping counters zero `noVerdict`,\n // the inconclusive count is the only honest number left to report.\n const withoutVerdict = Math.max(noVerdict, inconclusiveWorkflows);\n message =\n `INCONCLUSIVE: ${withoutVerdict} of ${totalWorkflows} workflows produced no verdict ` +\n `(${successfulWorkflows} passed)`;\n exitCode = EXIT_INCONCLUSIVE;\n } else {\n message = `PASSED: ${successfulWorkflows} of ${totalWorkflows} workflows passed`;\n exitCode = 0;\n }\n\n if (stillWaiting > 0) {\n message += `\\nNote: ${stillWaiting} workflow(s) are still waiting (scheduled for later)`;\n }\n\n // Counters that sum past the total are impossible, so the verdict above rests\n // on numbers that disagree with each other. Surfaced rather than acted on: all\n // 24 such executions in the 60 days to 2026-09-11 also had failures and so\n // exit 1 regardless, and promoting an overcount to a failure on its own would\n // redden builds over a server-side miscount with no evidence anything is\n // actually wrong with the run.\n if (accountedFor > totalWorkflows) {\n message += `\\nNote: the server reported ${accountedFor} outcomes for ${totalWorkflows} workflows — counters disagree.`;\n }\n\n return { message, exitCode };\n}\n\nexport function formatExternalRunSummary(stats: {\n total: number;\n passed: number;\n failed: number;\n flaky: number;\n skipped: number;\n resultsTruncated: boolean;\n}): { message: string; exitCode: number } {\n const { total, passed, failed, flaky, skipped, resultsTruncated } = stats;\n\n if (resultsTruncated) {\n return {\n message: `FAILED: external run ended with incomplete results (${total} collected)`,\n exitCode: 1,\n };\n }\n if (total === 0) {\n return { message: 'FAILED: external run produced no test results', exitCode: 1 };\n }\n if (failed > 0) {\n return { message: `FAILED: ${failed} of ${total} external tests failed`, exitCode: 1 };\n }\n return {\n message: `PASSED: ${passed} passed, ${flaky} flaky, ${skipped} skipped`,\n exitCode: 0,\n };\n}\n\nexport function formatStreamReadFailure(error: unknown): string {\n const detail = error instanceof Error && error.message.trim() ? ` (${error.message})` : '';\n return [\n `Test result stream ended unexpectedly${detail}.`,\n 'The test suite may still be running in Canary.',\n 'Re-run the command or check the test suite in the app for final status.',\n ].join(' ');\n}\n\nexport function formatStreamClosedBeforeCompletion(): string {\n return [\n 'Test result stream ended before the suite completed.',\n 'The test suite may still be running in Canary.',\n 'Re-run the command or check the test suite in the app for final status.',\n ].join(' ');\n}\n"],"mappings":"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","names":[]}
|