@runcofactor/cli 0.54.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/README.md +2 -1
- package/dist/{account-6YJAU53I.js → account-CZYZD2JS.js} +5 -5
- package/dist/{alert-Z7V2ZUEW.js → alert-JQ4SDEB7.js} +8 -8
- package/dist/{api-catalog-UEDTRM6E.js → api-catalog-IWQC35P2.js} +5 -5
- package/dist/{api-key-V5GEPRRG.js → api-key-GUDXIIEA.js} +5 -5
- package/dist/{attachment-M7VZ6GSE.js → attachment-CPZYOBUB.js} +5 -5
- package/dist/{auth-DVTMWJKF.js → auth-DS6MBVEI.js} +3 -3
- package/dist/{benchmark-KZJZYUTQ.js → benchmark-6HPCIQHD.js} +5 -5
- package/dist/{blackcat-QJXYDE66.js → blackcat-V3L63WFE.js} +3 -3
- package/dist/{chunk-FLDIN6VX.js → chunk-2E3STBHS.js} +2 -2
- package/dist/{chunk-KNWKOKM7.js → chunk-2OHYMT3A.js} +20 -11
- package/dist/chunk-2OHYMT3A.js.map +1 -0
- package/dist/{chunk-L4Y5PZUE.js → chunk-3LGCHNBC.js} +2 -2
- package/dist/{chunk-ZFN5FWN2.js → chunk-4MFMPC5P.js} +46 -2
- package/dist/chunk-4MFMPC5P.js.map +1 -0
- package/dist/{chunk-2M4PZK6Q.js → chunk-56HFZHQM.js} +8 -8
- package/dist/{chunk-AQOHNAEN.js → chunk-5OYWNS6D.js} +20 -9
- package/dist/chunk-5OYWNS6D.js.map +1 -0
- package/dist/{chunk-RA2NRAWU.js → chunk-62EXS76C.js} +6 -6
- package/dist/{chunk-HGEJHS45.js → chunk-6ILWJFKY.js} +368 -6
- package/dist/chunk-6ILWJFKY.js.map +1 -0
- package/dist/{chunk-4EWSONHO.js → chunk-BDOL622T.js} +4 -4
- package/dist/{chunk-T6EQFICG.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-MQQCUU5S.js → chunk-DEVD2WD2.js} +2 -2
- package/dist/{chunk-TRC63RSK.js → chunk-EWK44F6V.js} +3 -3
- package/dist/chunk-EWK44F6V.js.map +1 -0
- package/dist/{chunk-Q7UAEFW5.js → chunk-FNHPTTRF.js} +7 -5
- package/dist/chunk-FNHPTTRF.js.map +1 -0
- package/dist/{chunk-JAIMLQOU.js → chunk-GCD4EHCD.js} +6 -6
- package/dist/{chunk-7MRZWPVC.js → chunk-H6ZMKNP7.js} +3 -3
- package/dist/{chunk-ZOPVBINJ.js → chunk-IEWAH7W3.js} +5 -5
- package/dist/{chunk-74TU6PGO.js → chunk-IV4HRGKX.js} +77 -12
- package/dist/chunk-IV4HRGKX.js.map +1 -0
- package/dist/{chunk-ZO5MSM4Q.js → chunk-J2ZQULU3.js} +2 -2
- package/dist/{chunk-IVWWYKAM.js → chunk-K2IDR6FR.js} +3 -3
- package/dist/{chunk-QGP67JOK.js → chunk-KTZRI27M.js} +4 -4
- package/dist/{chunk-HESV3F6U.js → chunk-L644NMDI.js} +3 -3
- package/dist/{chunk-HESV3F6U.js.map → chunk-L644NMDI.js.map} +1 -1
- package/dist/{chunk-LPQTXBJF.js → chunk-LFT7GUWS.js} +63 -17
- package/dist/chunk-LFT7GUWS.js.map +1 -0
- package/dist/{chunk-O7MBDOMO.js → chunk-O7B2IYCZ.js} +30 -14
- package/dist/chunk-O7B2IYCZ.js.map +1 -0
- package/dist/{chunk-R2CVV7QT.js → chunk-RHWPZKRV.js} +28 -1
- package/dist/chunk-RHWPZKRV.js.map +1 -0
- package/dist/{chunk-3YNR6U6Q.js → chunk-UJSW72LG.js} +3 -3
- package/dist/{chunk-G2SCV2CY.js → chunk-VACACCD6.js} +3 -3
- package/dist/{chunk-CV22445U.js → chunk-VMAR67FF.js} +2 -2
- package/dist/{chunk-QYHJUHL7.js → chunk-VMJ7TBVM.js} +2 -2
- package/dist/chunk-WRRA4ATV.js +332 -0
- package/dist/chunk-WRRA4ATV.js.map +1 -0
- package/dist/{chunk-YACDH6MJ.js → chunk-XHEVDABB.js} +2 -2
- package/dist/{chunk-7VBX2M4F.js → chunk-XHGF6VC6.js} +4 -4
- package/dist/{credential-546ER7WQ.js → credential-GJW7LGYP.js} +5 -5
- package/dist/{credential-template-BWMEBGBN.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-NIVBDDI2.js → digest-XEHGCJM4.js} +8 -8
- package/dist/{docs-AK4MDP6K.js → docs-KH4BCEQF.js} +5 -5
- package/dist/{doctor-NCLA47EL.js → doctor-FOXXE5SK.js} +3 -3
- package/dist/{environment-X3PV5IN2.js → environment-EBDPQTIS.js} +7 -7
- package/dist/{eval-5FZKYZ6O.js → eval-QZSSEICV.js} +67 -27
- package/dist/eval-QZSSEICV.js.map +1 -0
- package/dist/{exploration-2RVGIUKT.js → exploration-LCGKRGOQ.js} +5 -5
- package/dist/{exploratory-test-SJ5HFI3L.js → exploratory-test-SGECQGIX.js} +13 -5
- package/dist/exploratory-test-SGECQGIX.js.map +1 -0
- package/dist/{external-run-4NDVAHQB.js → external-run-2AJAI5O7.js} +9 -9
- package/dist/{feature-flag-C4IRE724.js → feature-flag-P7N4WQIH.js} +5 -5
- package/dist/{feedback-337OZCKC.js → feedback-LAT7TQ2T.js} +6 -6
- package/dist/{flow-D7ZLBKCH.js → flow-NH2DC6AP.js} +5 -5
- package/dist/{github-LKXYIALH.js → github-FCEKBLXI.js} +6 -6
- package/dist/index.js +106 -408
- package/dist/index.js.map +1 -1
- package/dist/{init-GKEC6LPH.js → init-5U5EZOAW.js} +5 -5
- package/dist/{install-K45SAT2V.js → install-X3UNVXKY.js} +5 -5
- package/dist/{issues-2HMTQYWR.js → issues-4P6I3YQW.js} +8 -8
- package/dist/{knobs-KUCGLO5Z.js → knobs-JKTWJ6ZG.js} +5 -5
- package/dist/{landing-KAET2I73.js → landing-6AGLKI66.js} +7 -7
- package/dist/{list-GDV4UYWV.js → list-TWP2RP33.js} +5 -5
- package/dist/{local-NFOSJLLV.js → local-D75QE5TB.js} +7 -7
- package/dist/{login-Y77HWROY.js → login-RBET4TIP.js} +5 -5
- package/dist/{mcp-CPCFMU6B.js → mcp-562SUUMK.js} +11 -11
- package/dist/{metrics-Y245ST63.js → metrics-4WF2GEPA.js} +5 -5
- package/dist/{monitor-BUDWSC3S.js → monitor-WJXH54H2.js} +5 -5
- package/dist/{perf-3JOAXPHP.js → perf-C6N6P7YG.js} +12 -361
- package/dist/perf-C6N6P7YG.js.map +1 -0
- package/dist/{product-CXL3YTMD.js → product-CYEQ7HOB.js} +5 -5
- package/dist/{product-map-656BTU74.js → product-map-MSDLIFZY.js} +7 -7
- package/dist/{prompts-3SZ7O5E6.js → prompts-ME53WPN4.js} +5 -5
- package/dist/{proofs-4CSCCSNL.js → proofs-D3G6ZUFP.js} +11 -9
- package/dist/{property-IEKBXRVY.js → property-5GLJNAVB.js} +29 -10
- package/dist/property-5GLJNAVB.js.map +1 -0
- package/dist/{psql-M4CM6TSI.js → psql-EXAUDU3W.js} +5 -5
- package/dist/{record-QP4TYZBS.js → record-EE7NGNKY.js} +6 -6
- package/dist/{redis-KG47IGJV.js → redis-M4EYWKOJ.js} +5 -5
- package/dist/{release-QHPSQULK.js → release-4KUWVWWC.js} +5 -5
- package/dist/{runbook-YVBG2QK3.js → runbook-AHU77ANQ.js} +5 -5
- package/dist/{sandbox-ZXDZTCCN.js → sandbox-FBLJEYA2.js} +1917 -1633
- package/dist/sandbox-FBLJEYA2.js.map +1 -0
- package/dist/{scenarios-2SX2NUCD.js → scenarios-TU656T2B.js} +5 -5
- package/dist/{schedule-P6F7MLXX.js → schedule-DXJI6SYO.js} +8 -8
- package/dist/{session-SZMCZTPE.js → session-RUFTJHF4.js} +10 -10
- package/dist/{skill-D4XFW6QI.js → skill-ZK76GQ47.js} +111 -13
- package/dist/skill-ZK76GQ47.js.map +1 -0
- package/dist/skills/cofactor-debug-run/SKILL.md +6 -1
- package/dist/skills/cofactor-debug-run/history/2.0.10.md +320 -0
- package/dist/skills/cofactor-debug-run/history/2.0.9.md +319 -0
- package/dist/skills/cofactor-debug-run/version.json +1 -1
- package/dist/{slack-UDXTPOSW.js → slack-M3OKDVMY.js} +6 -6
- package/dist/{spec-YCBBIV27.js → spec-5MXEBLYR.js} +5 -5
- package/dist/{src-DY7GLRO2.js → src-2X5OQRPJ.js} +4 -4
- package/dist/{src-NG7DRE5A.js → src-72EFBA2R.js} +3 -3
- package/dist/{src-DEGBASCD.js → src-KH6WSBJV.js} +5 -5
- package/dist/{src-ZKVNVLXY.js → src-VLV36QYH.js} +127 -20
- package/dist/src-VLV36QYH.js.map +1 -0
- package/dist/{start-ZYZSORPY.js → start-PDYBRB5T.js} +5 -5
- package/dist/{status-ESIG6A7W.js → status-VMVPVCDA.js} +5 -5
- package/dist/{tag-3K5Y25AR.js → tag-7KTDLPVU.js} +6 -6
- package/dist/{task-JLNX7O3M.js → task-QLFYZNKR.js} +6 -6
- package/dist/{teams-F4IU3EXE.js → teams-Y7BXCY6P.js} +7 -7
- package/dist/{test-suite-QHDUW5W5.js → test-suite-6U22AYFG.js} +15 -14
- package/dist/test-suite-6U22AYFG.js.map +1 -0
- package/dist/{tickets-NBL5WACL.js → tickets-CQDJDNPY.js} +5 -5
- package/dist/{trace-ZKYAI5JF.js → trace-QDORWXYX.js} +8 -8
- package/dist/{triage-5NWCREUM.js → triage-GY7M3UGG.js} +6 -6
- package/dist/{trigger-KXYYY5IR.js → trigger-DLFAORX4.js} +9 -9
- package/dist/{update-check-Q2URVJLC.js → update-check-ES6XQ7OF.js} +4 -4
- package/dist/{upgrade-4XSASC7U.js → upgrade-WKEOW5GS.js} +5 -5
- package/dist/{usage-UY7VZYVY.js → usage-E6FDTR3W.js} +7 -7
- package/dist/{utilities-53NXNLA7.js → utilities-4Z6YX3L5.js} +6 -6
- package/dist/{visual-IJAT7X7D.js → visual-TA6LPVDJ.js} +5 -5
- package/dist/{workflow-OQNH2FIS.js → workflow-B5FXS2CJ.js} +92 -36
- package/dist/workflow-B5FXS2CJ.js.map +1 -0
- package/dist/{workflow-cache-FP6MKLVR.js → workflow-cache-MNLEMRMM.js} +16 -16
- package/dist/{workflow-cache-convergence-resolve-HS5KO7US.js → workflow-cache-convergence-resolve-G5HJM6MF.js} +5 -5
- package/dist/{workflow-debug-EM55H2QE.js → workflow-debug-TNBUGSBK.js} +11 -11
- package/dist/{workflow-feedback-GNWNWVHH.js → workflow-feedback-G2ZXAUGI.js} +5 -5
- package/dist/{workflow-fork-M5AQWST7.js → workflow-fork-6HHOMC2D.js} +5 -5
- package/dist/{workflow-promotion-HYULZDYL.js → workflow-promotion-RG7L6JZT.js} +5 -5
- package/dist/{workflow-proposals-EN327FSE.js → workflow-proposals-ZNF2F3UE.js} +5 -5
- package/dist/{workflow-revisions-ZMTVNWRW.js → workflow-revisions-TP64Z6FO.js} +5 -5
- package/dist/{workflow-status-FNAJG34W.js → workflow-status-5RG3JX56.js} +5 -5
- package/package.json +3 -2
- package/dist/chunk-74TU6PGO.js.map +0 -1
- package/dist/chunk-AQOHNAEN.js.map +0 -1
- package/dist/chunk-HGEJHS45.js.map +0 -1
- package/dist/chunk-KNWKOKM7.js.map +0 -1
- package/dist/chunk-LPQTXBJF.js.map +0 -1
- package/dist/chunk-O7MBDOMO.js.map +0 -1
- package/dist/chunk-Q7UAEFW5.js.map +0 -1
- package/dist/chunk-R2CVV7QT.js.map +0 -1
- package/dist/chunk-TRC63RSK.js.map +0 -1
- package/dist/chunk-ZFN5FWN2.js.map +0 -1
- package/dist/eval-5FZKYZ6O.js.map +0 -1
- package/dist/exploratory-test-SJ5HFI3L.js.map +0 -1
- package/dist/perf-3JOAXPHP.js.map +0 -1
- package/dist/property-IEKBXRVY.js.map +0 -1
- package/dist/sandbox-ZXDZTCCN.js.map +0 -1
- package/dist/skill-D4XFW6QI.js.map +0 -1
- package/dist/src-ZKVNVLXY.js.map +0 -1
- package/dist/test-suite-QHDUW5W5.js.map +0 -1
- package/dist/workflow-OQNH2FIS.js.map +0 -1
- /package/dist/{account-6YJAU53I.js.map → account-CZYZD2JS.js.map} +0 -0
- /package/dist/{alert-Z7V2ZUEW.js.map → alert-JQ4SDEB7.js.map} +0 -0
- /package/dist/{api-catalog-UEDTRM6E.js.map → api-catalog-IWQC35P2.js.map} +0 -0
- /package/dist/{api-key-V5GEPRRG.js.map → api-key-GUDXIIEA.js.map} +0 -0
- /package/dist/{attachment-M7VZ6GSE.js.map → attachment-CPZYOBUB.js.map} +0 -0
- /package/dist/{auth-DVTMWJKF.js.map → auth-DS6MBVEI.js.map} +0 -0
- /package/dist/{benchmark-KZJZYUTQ.js.map → benchmark-6HPCIQHD.js.map} +0 -0
- /package/dist/{blackcat-QJXYDE66.js.map → blackcat-V3L63WFE.js.map} +0 -0
- /package/dist/{chunk-FLDIN6VX.js.map → chunk-2E3STBHS.js.map} +0 -0
- /package/dist/{chunk-L4Y5PZUE.js.map → chunk-3LGCHNBC.js.map} +0 -0
- /package/dist/{chunk-2M4PZK6Q.js.map → chunk-56HFZHQM.js.map} +0 -0
- /package/dist/{chunk-RA2NRAWU.js.map → chunk-62EXS76C.js.map} +0 -0
- /package/dist/{chunk-4EWSONHO.js.map → chunk-BDOL622T.js.map} +0 -0
- /package/dist/{chunk-T6EQFICG.js.map → chunk-C3CXVX2B.js.map} +0 -0
- /package/dist/{chunk-MQQCUU5S.js.map → chunk-DEVD2WD2.js.map} +0 -0
- /package/dist/{chunk-JAIMLQOU.js.map → chunk-GCD4EHCD.js.map} +0 -0
- /package/dist/{chunk-7MRZWPVC.js.map → chunk-H6ZMKNP7.js.map} +0 -0
- /package/dist/{chunk-ZOPVBINJ.js.map → chunk-IEWAH7W3.js.map} +0 -0
- /package/dist/{chunk-ZO5MSM4Q.js.map → chunk-J2ZQULU3.js.map} +0 -0
- /package/dist/{chunk-IVWWYKAM.js.map → chunk-K2IDR6FR.js.map} +0 -0
- /package/dist/{chunk-QGP67JOK.js.map → chunk-KTZRI27M.js.map} +0 -0
- /package/dist/{chunk-3YNR6U6Q.js.map → chunk-UJSW72LG.js.map} +0 -0
- /package/dist/{chunk-G2SCV2CY.js.map → chunk-VACACCD6.js.map} +0 -0
- /package/dist/{chunk-CV22445U.js.map → chunk-VMAR67FF.js.map} +0 -0
- /package/dist/{chunk-QYHJUHL7.js.map → chunk-VMJ7TBVM.js.map} +0 -0
- /package/dist/{chunk-YACDH6MJ.js.map → chunk-XHEVDABB.js.map} +0 -0
- /package/dist/{chunk-7VBX2M4F.js.map → chunk-XHGF6VC6.js.map} +0 -0
- /package/dist/{credential-546ER7WQ.js.map → credential-GJW7LGYP.js.map} +0 -0
- /package/dist/{credential-template-BWMEBGBN.js.map → credential-template-UWBYKKWD.js.map} +0 -0
- /package/dist/{digest-NIVBDDI2.js.map → digest-XEHGCJM4.js.map} +0 -0
- /package/dist/{docs-AK4MDP6K.js.map → docs-KH4BCEQF.js.map} +0 -0
- /package/dist/{doctor-NCLA47EL.js.map → doctor-FOXXE5SK.js.map} +0 -0
- /package/dist/{environment-X3PV5IN2.js.map → environment-EBDPQTIS.js.map} +0 -0
- /package/dist/{exploration-2RVGIUKT.js.map → exploration-LCGKRGOQ.js.map} +0 -0
- /package/dist/{external-run-4NDVAHQB.js.map → external-run-2AJAI5O7.js.map} +0 -0
- /package/dist/{feature-flag-C4IRE724.js.map → feature-flag-P7N4WQIH.js.map} +0 -0
- /package/dist/{feedback-337OZCKC.js.map → feedback-LAT7TQ2T.js.map} +0 -0
- /package/dist/{flow-D7ZLBKCH.js.map → flow-NH2DC6AP.js.map} +0 -0
- /package/dist/{github-LKXYIALH.js.map → github-FCEKBLXI.js.map} +0 -0
- /package/dist/{init-GKEC6LPH.js.map → init-5U5EZOAW.js.map} +0 -0
- /package/dist/{install-K45SAT2V.js.map → install-X3UNVXKY.js.map} +0 -0
- /package/dist/{issues-2HMTQYWR.js.map → issues-4P6I3YQW.js.map} +0 -0
- /package/dist/{knobs-KUCGLO5Z.js.map → knobs-JKTWJ6ZG.js.map} +0 -0
- /package/dist/{landing-KAET2I73.js.map → landing-6AGLKI66.js.map} +0 -0
- /package/dist/{list-GDV4UYWV.js.map → list-TWP2RP33.js.map} +0 -0
- /package/dist/{local-NFOSJLLV.js.map → local-D75QE5TB.js.map} +0 -0
- /package/dist/{login-Y77HWROY.js.map → login-RBET4TIP.js.map} +0 -0
- /package/dist/{mcp-CPCFMU6B.js.map → mcp-562SUUMK.js.map} +0 -0
- /package/dist/{metrics-Y245ST63.js.map → metrics-4WF2GEPA.js.map} +0 -0
- /package/dist/{monitor-BUDWSC3S.js.map → monitor-WJXH54H2.js.map} +0 -0
- /package/dist/{product-CXL3YTMD.js.map → product-CYEQ7HOB.js.map} +0 -0
- /package/dist/{product-map-656BTU74.js.map → product-map-MSDLIFZY.js.map} +0 -0
- /package/dist/{prompts-3SZ7O5E6.js.map → prompts-ME53WPN4.js.map} +0 -0
- /package/dist/{proofs-4CSCCSNL.js.map → proofs-D3G6ZUFP.js.map} +0 -0
- /package/dist/{psql-M4CM6TSI.js.map → psql-EXAUDU3W.js.map} +0 -0
- /package/dist/{record-QP4TYZBS.js.map → record-EE7NGNKY.js.map} +0 -0
- /package/dist/{redis-KG47IGJV.js.map → redis-M4EYWKOJ.js.map} +0 -0
- /package/dist/{release-QHPSQULK.js.map → release-4KUWVWWC.js.map} +0 -0
- /package/dist/{runbook-YVBG2QK3.js.map → runbook-AHU77ANQ.js.map} +0 -0
- /package/dist/{scenarios-2SX2NUCD.js.map → scenarios-TU656T2B.js.map} +0 -0
- /package/dist/{schedule-P6F7MLXX.js.map → schedule-DXJI6SYO.js.map} +0 -0
- /package/dist/{session-SZMCZTPE.js.map → session-RUFTJHF4.js.map} +0 -0
- /package/dist/{slack-UDXTPOSW.js.map → slack-M3OKDVMY.js.map} +0 -0
- /package/dist/{spec-YCBBIV27.js.map → spec-5MXEBLYR.js.map} +0 -0
- /package/dist/{src-DEGBASCD.js.map → src-2X5OQRPJ.js.map} +0 -0
- /package/dist/{src-DY7GLRO2.js.map → src-72EFBA2R.js.map} +0 -0
- /package/dist/{src-NG7DRE5A.js.map → src-KH6WSBJV.js.map} +0 -0
- /package/dist/{start-ZYZSORPY.js.map → start-PDYBRB5T.js.map} +0 -0
- /package/dist/{status-ESIG6A7W.js.map → status-VMVPVCDA.js.map} +0 -0
- /package/dist/{tag-3K5Y25AR.js.map → tag-7KTDLPVU.js.map} +0 -0
- /package/dist/{task-JLNX7O3M.js.map → task-QLFYZNKR.js.map} +0 -0
- /package/dist/{teams-F4IU3EXE.js.map → teams-Y7BXCY6P.js.map} +0 -0
- /package/dist/{tickets-NBL5WACL.js.map → tickets-CQDJDNPY.js.map} +0 -0
- /package/dist/{trace-ZKYAI5JF.js.map → trace-QDORWXYX.js.map} +0 -0
- /package/dist/{triage-5NWCREUM.js.map → triage-GY7M3UGG.js.map} +0 -0
- /package/dist/{trigger-KXYYY5IR.js.map → trigger-DLFAORX4.js.map} +0 -0
- /package/dist/{update-check-Q2URVJLC.js.map → update-check-ES6XQ7OF.js.map} +0 -0
- /package/dist/{upgrade-4XSASC7U.js.map → upgrade-WKEOW5GS.js.map} +0 -0
- /package/dist/{usage-UY7VZYVY.js.map → usage-E6FDTR3W.js.map} +0 -0
- /package/dist/{utilities-53NXNLA7.js.map → utilities-4Z6YX3L5.js.map} +0 -0
- /package/dist/{visual-IJAT7X7D.js.map → visual-TA6LPVDJ.js.map} +0 -0
- /package/dist/{workflow-cache-FP6MKLVR.js.map → workflow-cache-MNLEMRMM.js.map} +0 -0
- /package/dist/{workflow-cache-convergence-resolve-HS5KO7US.js.map → workflow-cache-convergence-resolve-G5HJM6MF.js.map} +0 -0
- /package/dist/{workflow-debug-EM55H2QE.js.map → workflow-debug-TNBUGSBK.js.map} +0 -0
- /package/dist/{workflow-feedback-GNWNWVHH.js.map → workflow-feedback-G2ZXAUGI.js.map} +0 -0
- /package/dist/{workflow-fork-M5AQWST7.js.map → workflow-fork-6HHOMC2D.js.map} +0 -0
- /package/dist/{workflow-promotion-HYULZDYL.js.map → workflow-promotion-RG7L6JZT.js.map} +0 -0
- /package/dist/{workflow-proposals-EN327FSE.js.map → workflow-proposals-ZNF2F3UE.js.map} +0 -0
- /package/dist/{workflow-revisions-ZMTVNWRW.js.map → workflow-revisions-TP64Z6FO.js.map} +0 -0
- /package/dist/{workflow-status-FNAJG34W.js.map → workflow-status-5RG3JX56.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/skill.ts","../src/skill-identity.ts","../src/skill-templates/cofactor-browser-testing.ts","../src/skill-templates/cofactor-debug-run.ts","../src/skill-templates/cofactor-onboarding.ts","../src/skill-templates/cofactor-prove-with-tests.ts","../src/skill-templates/cofactor-triage-issues.ts","../src/skill-templates/cofactor-triage-tests.ts","../src/skill-templates/cofactor-write-test.ts","../src/skill-templates/index.ts","../src/skill-version-commands.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { brandSkillContentFor, brandTextFor, command } from \"./brand.js\";\nimport { applyInstallIdentity, installedSourceKey } from \"./skill-identity.js\";\nimport {\n detectAgent,\n formatInstallWriteFailure,\n isAgentType,\n isValidInstallName,\n resolveInstallDir,\n SUPPORTED_AGENTS,\n} from \"./skill-install-helpers.js\";\nimport { SKILL_TEMPLATES } from \"./skill-templates/index.js\";\nimport { knownVersions, runDiff, runVersions } from \"./skill-version-commands.js\";\nimport type { AgentType } from \"./skill-install-helpers.js\";\n\nexport { applyInstallIdentity, installedSourceKey, SKILL_SOURCE_KEY } from \"./skill-identity.js\";\nexport {\n detectAgent,\n formatInstallWriteFailure,\n isInstallPermissionError,\n isValidInstallName,\n resolveInstallDir,\n} from \"./skill-install-helpers.js\";\nexport type { AgentType, InstallWriteFailureContext } from \"./skill-install-helpers.js\";\n\n/**\n * Render a skill template for the active brand. Install/output go through here\n * so a `cofactor` binary writes cofactor-branded skill files while `canary`\n * stays byte-for-byte identical. Authored-content tooling (`diff`, `versions`)\n * stays raw so it compares the source, not the per-brand presentation.\n */\nfunction renderForActiveBrand(template: { render: () => string }): string {\n return brandSkillContentFor(template.render(), command);\n}\n\nfunction printSkillHelp() {\n const lines = [\n \"Usage:\",\n \" canary skill <name> Output skill template to stdout\",\n \" canary skill install <name> Install skill (auto-detects agent)\",\n \" canary skill install <name> --agent codex Install for a specific agent\",\n \" canary skill install <name> --personal Install to ~/.<agent>/skills/\",\n \" canary skill install <name> --name <as> Install under a custom skill name\",\n \" canary skill install <name> --force Overwrite a name held by another skill\",\n \" canary skill list List available skill templates\",\n \" canary skill sync Print manifest + instructions for the\",\n \" agent to version-compare and update\",\n \" installed skills\",\n \" canary skill diff <name> [--from V] [--to V] Unified diff between two versions of\",\n \" a skill (defaults: previous → current)\",\n \" canary skill versions <name> List all known versions of a skill\",\n \"\",\n \"Agent auto-detection:\",\n \" The install command detects which AI agent is running and writes the\",\n \" SKILL.md to the correct location:\",\n \"\",\n \" Agent Project path Personal path\",\n \" ───── ──────────── ─────────────\",\n \" claude .claude/skills/<name>/ ~/.claude/skills/<name>/\",\n \" codex .codex/skills/<name>/ ~/.codex/skills/<name>/\",\n \" copilot .github/skills/<name>/ ~/.copilot/skills/<name>/\",\n \"\",\n \" Detection checks (in order):\",\n \" 1. CLAUDE env var → claude\",\n \" 2. CODEX_* env vars → codex\",\n \" 3. GITHUB_COPILOT env var → copilot\",\n \" 4. .claude/.codex/.github dirs → whichever single one exists\",\n \" 5. If ambiguous, use --agent to specify explicitly\",\n \"\",\n \"Custom skill names (--name):\",\n \" By default a skill installs under its template name. Pass --name to install\",\n \" it under a name of your choosing — useful when you want every Canary-provided\",\n \" skill namespaced (e.g. my-browser-testing) to avoid colliding with your\",\n \" own skills. --name sets both the install directory and the SKILL.md\",\n \" frontmatter name: (agents require those to match), and records the source\",\n \" template in a skill-source: field so `sync` and `diff` keep tracking updates\",\n \" even under the renamed install.\",\n \"\",\n \" canary skill install cofactor-browser-testing --name my-browser-testing\",\n \"\",\n \" Installing a different skill onto an existing custom name is refused unless\",\n \" you pass --force. When an agent installs skills on your behalf, it should\",\n \" follow your naming convention.\",\n \"\",\n \"Available templates:\",\n ];\n\n for (const [key, template] of Object.entries(SKILL_TEMPLATES)) {\n lines.push(` ${key.padEnd(24)} v${template.version.padEnd(7)} ${template.description}`);\n }\n\n console.log(lines.join(\"\\n\"));\n}\n\n/**\n * Skill names retired by the 2.0.0 trim, mapped to the skills that replace them.\n * Without this, installs under the old names would be orphaned (sync only\n * resolves names that are still in SKILL_TEMPLATES). Delete this map one major\n * version after 2.0.0.\n */\nconst RETIRED_SKILLS: Record<string, string[]> = {\n \"canary-basic\": [\"cofactor-triage-issues\", \"cofactor-triage-tests\"],\n \"agent-tasks\": [\"cofactor-triage-issues\"],\n \"issue-log-xref\": [\"cofactor-triage-issues\"],\n sandbox: [],\n \"optimize-cache\": [],\n \"test-cases\": [\"cofactor-write-test\"],\n \"browser-testing\": [\"cofactor-browser-testing\"],\n \"debug-run\": [\"cofactor-debug-run\"],\n};\n\nfunction retiredSkillHint(name: string): string | undefined {\n const replacements = RETIRED_SKILLS[name];\n if (!replacements) return undefined;\n return replacements.length > 0\n ? `\"${name}\" was retired in 2.0.0. Install ${replacements.join(\" and \")} instead.`\n : `\"${name}\" was retired in 2.0.0 and has no replacement.`;\n}\n\nfunction runSync() {\n const manifest = Object.entries(SKILL_TEMPLATES).map(([key, t]) => ({\n name: key,\n version: t.version,\n description: t.description,\n knownVersions: knownVersions(key),\n installedPaths: {\n claudeProject: `.claude/skills/${key}/SKILL.md`,\n claudePersonal: join(homedir(), \".claude\", \"skills\", key, \"SKILL.md\"),\n codexProject: `.codex/skills/${key}/SKILL.md`,\n codexPersonal: join(homedir(), \".codex\", \"skills\", key, \"SKILL.md\"),\n copilotProject: `.github/skills/${key}/SKILL.md`,\n copilotPersonal: join(homedir(), \".copilot\", \"skills\", key, \"SKILL.md\"),\n },\n }));\n\n const instructions = `# Canary Skill Sync — Instructions for the Agent\n\nYou are an AI coding agent (Claude, Codex, Copilot, etc.). The user ran \\`canary skill sync\\`\nto bring their installed Canary skill templates up to date. Follow these steps:\n\n## Step 1 — Discover installed skills (including renamed ones)\n\nSkills can be installed under a **custom name** (\\`canary skill install <name> --name <as>\\`),\nso do not rely only on the canonical \\`installedPaths\\` below. List every \\`SKILL.md\\`\nunder your agent's skills directory — both project and personal:\n\n .claude/skills/*/SKILL.md and ~/.claude/skills/*/SKILL.md (claude)\n .codex/skills/*/SKILL.md and ~/.codex/skills/*/SKILL.md (codex)\n .github/skills/*/SKILL.md and ~/.copilot/skills/*/SKILL.md (copilot)\n\nFor each file, read its frontmatter and resolve which manifest skill it came from:\n- If a \\`skill-source: <key>\\` line is present, that \\`<key>\\` is the template name\n (the skill was installed under a custom \\`--name\\`). The install directory is the\n custom name; remember it for Step 5.\n- Otherwise the \\`name:\\` value is the template name (a default install, where the\n install name equals the template key).\n\nMatch that resolved key against the manifest \\`name\\` field (current skills) and the\n\\`retiredSkills\\` keys. Ignore any \\`SKILL.md\\` whose resolved key is in neither (it isn't\na Canary skill).\n\n## Step 2 — Read the version of each installed skill\n\nSkills whose resolved key is in \\`retiredSkills\\` skip Steps 2–5; handle them in Step 6.\n\n\nThe \\`SKILL.md\\` frontmatter contains a \\`version: X.Y.Z\\` line. Parse that value.\nIf the frontmatter has no \\`version:\\` field, treat the installed version as \\`0.0.0\\`.\n\n## Step 3 — Compare semver\n\nFor each installed skill, compare \\`installedVersion\\` to the \\`version\\` in the manifest:\n- If \\`installedVersion < manifestVersion\\` → the skill is **outdated**, update it.\n- If equal or greater → leave it alone.\n\n## Step 4 — For each outdated skill, inspect what changed\n\nBefore overwriting, read the diff so you know what's new. Diff by the **template\nkey** you resolved in Step 1 (not the custom install name) — the diff compares\nsource renders and is independent of how the skill was named on disk:\n\n canary skill diff <templateKey> --from <installedVersion>\n\nThe CLI retains past renders of each skill in \\`previousVersions\\`, so this prints a\nunified diff from the user's installed version → the current version. Only versions\nlisted in \\`knownVersions\\` in the manifest can be diffed; if \\`installedVersion\\` is\nolder than the oldest known version, diff against the oldest known version instead\nand warn the user that the older content is no longer reproducible.\n\nUse the diff to:\n- Summarize what changed for the user (new sections, removed guidance, renamed commands).\n- Decide whether any user-local edits to the installed SKILL.md would be clobbered —\n if the user appears to have edited their local copy, surface that and ask before\n overwriting.\n\n## Step 5 — Update outdated skills\n\nRe-install with the template key, preserving both the location AND the custom name\nit was installed under (the install directory name from Step 1):\n\n canary skill install <templateKey> # default-named project install\n canary skill install <templateKey> --personal # default-named personal install\n canary skill install <templateKey> --name <installDir> # custom-named project install\n canary skill install <templateKey> --name <installDir> --personal\n\nPreserve whichever location and name it was already installed in — if it lived in\n\\`my-browser-testing/\\`, re-install with \\`--name my-browser-testing\\` so the\nupdate lands in place rather than creating a second default-named copy. Do NOT install\nskills that weren't already installed — sync only updates existing installs. When the\nuser has a naming convention, keep installing under their chosen names on their behalf.\n\n## Step 6 — Retire renamed skills\n\nAn installed skill whose resolved key (Step 1) is listed under \\`retiredSkills\\` no longer\nexists. Tell the user to remove its install directory and install each replacement in its\nvalue list with \\`canary skill install <replacement>\\` (same location; if it was installed\nunder a custom directory name and has a single replacement, pass \\`--name <installDir>\\`;\notherwise install under the default names).\nAn empty list means the skill was dropped with no replacement.\n\n## Step 7 — Report\n\nPrint a concise summary: which skills were updated (old → new version), which were\nalready current, which were retired (and what replaced them), and which were not\ninstalled (skipped).\n\n## Manifest\n\n\\`\\`\\`json\n${JSON.stringify({ skills: manifest, retiredSkills: RETIRED_SKILLS }, null, 2)}\n\\`\\`\\`\n`;\n\n // process.stdout bypasses the console branding patch, so brand explicitly.\n process.stdout.write(brandTextFor(instructions, command));\n}\n\nfunction parseInstallArgs(argv: string[]): {\n /** The registry/template key (positional argument). */\n templateName: string | undefined;\n /** Directory + frontmatter name to install under (defaults to templateName). */\n installName: string | undefined;\n agent: AgentType | undefined;\n personal: boolean;\n force: boolean;\n} {\n let templateName: string | undefined;\n let installName: string | undefined;\n let agent: AgentType | undefined;\n let personal = false;\n let force = false;\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--agent\" && i + 1 < argv.length) {\n const val = argv[++i];\n if (!isAgentType(val)) {\n console.error(`Unknown agent \"${val}\". Supported agents: ${SUPPORTED_AGENTS.join(\", \")}`);\n process.exit(1);\n }\n agent = val;\n } else if (arg === \"--name\" && i + 1 < argv.length) {\n const val = argv[++i];\n if (!isValidInstallName(val)) {\n console.error(\n `Invalid skill name \"${val}\". Use letters, digits, hyphens, or underscores (e.g. my-browser-testing).`\n );\n process.exit(1);\n }\n installName = val;\n } else if (arg === \"--personal\") {\n personal = true;\n } else if (arg === \"--force\" || arg === \"-f\") {\n force = true;\n } else if (!arg.startsWith(\"-\") && !templateName) {\n templateName = arg;\n }\n }\n\n return { templateName, installName: installName ?? templateName, agent, personal, force };\n}\n\nasync function runInstall(argv: string[]) {\n const {\n templateName,\n installName,\n agent: explicitAgent,\n personal,\n force,\n } = parseInstallArgs(argv);\n\n if (!templateName || !installName) {\n console.error(\"Missing skill name.\\n\");\n console.error(\n `Usage: canary skill install <name> [--name <install-name>] [--agent ${SUPPORTED_AGENTS.join(\"|\")}] [--personal] [--force]`\n );\n process.exit(1);\n }\n\n const template = SKILL_TEMPLATES[templateName];\n if (!template) {\n console.error(`Unknown skill template \"${templateName}\".\\n`);\n const hint = retiredSkillHint(templateName);\n if (hint) console.error(`${hint}\\n`);\n console.error(\"Available templates:\");\n for (const [key, t] of Object.entries(SKILL_TEMPLATES)) {\n console.error(` ${key.padEnd(24)} ${t.description}`);\n }\n process.exit(1);\n }\n\n // Resolve agent type\n const agent = explicitAgent ?? detectAgent();\n if (!agent) {\n console.error(\"Could not auto-detect the AI agent. Use --agent to specify:\\n\");\n console.error(\" canary skill install <name> --agent claude # Claude Code\");\n console.error(\" canary skill install <name> --agent codex # OpenAI Codex\");\n console.error(\" canary skill install <name> --agent copilot # GitHub Copilot\");\n process.exit(1);\n }\n\n const dir = resolveInstallDir(installName, agent, personal);\n const filePath = join(dir, \"SKILL.md\");\n\n // Collision guard: refuse to clobber a SKILL.md installed under this name from\n // a DIFFERENT template (e.g. collapsing multiple skills onto one name) unless\n // --force is passed. Updating the same skill in place is always allowed.\n if (existsSync(filePath) && !force) {\n const existingSource = installedSourceKey(readFileSync(filePath, \"utf-8\"));\n if (existingSource && existingSource !== templateName) {\n console.error(\n `✗ ${installName} already holds '${existingSource}'. Pass --force to overwrite.`\n );\n process.exit(1);\n }\n }\n\n // Write the file (brand-aware: cofactor binary writes cofactor-branded text),\n // rewriting the frontmatter identity when installing under a custom name.\n const content = applyInstallIdentity(renderForActiveBrand(template), installName, templateName);\n try {\n mkdirSync(dir, { recursive: true });\n writeFileSync(filePath, content, \"utf-8\");\n } catch (error) {\n console.error(\n formatInstallWriteFailure({\n cwd: process.cwd(),\n templateName,\n installName,\n agent,\n personal,\n dir,\n filePath,\n error,\n })\n );\n process.exit(1);\n }\n\n const relPath = personal ? filePath : filePath.replace(process.cwd() + \"/\", \"\");\n const named = installName === templateName ? \"\" : ` as ${installName}`;\n console.log(`Installed ${templateName} skill for ${agent}${named} → ${relPath}`);\n}\n\nfunction runList() {\n for (const [key, template] of Object.entries(SKILL_TEMPLATES)) {\n console.log(`${key.padEnd(30)} ${brandTextFor(template.description, command)}`);\n }\n}\n\nexport async function runSkill(argv: string[]) {\n const [sub] = argv;\n\n // Anywhere in argv: `skill install <name> --help` must not install.\n if (sub === \"list\" && !argv.includes(\"--help\") && !argv.includes(\"-h\")) {\n runList();\n return;\n }\n\n if (!sub || sub === \"help\" || argv.includes(\"--help\") || argv.includes(\"-h\")) {\n printSkillHelp();\n return;\n }\n\n // canary skill install <name> [--agent ...]\n if (sub === \"install\") {\n await runInstall(argv.slice(1));\n return;\n }\n\n // canary skill sync — print instructions for the agent\n if (sub === \"sync\") {\n runSync();\n return;\n }\n\n if (sub === \"diff\") {\n runDiff(argv.slice(1));\n return;\n }\n\n if (sub === \"versions\") {\n runVersions(argv.slice(1));\n return;\n }\n\n // canary skill <name> — output to stdout (backward compatible)\n const template = SKILL_TEMPLATES[sub];\n if (!template) {\n console.error(`Unknown skill template \"${sub}\".\\n`);\n const hint = retiredSkillHint(sub);\n if (hint) console.error(`${hint}\\n`);\n printSkillHelp();\n process.exit(1);\n }\n\n process.stdout.write(renderForActiveBrand(template));\n}\n","/**\n * Skill frontmatter identity helpers.\n *\n * These helpers keep custom-named installs traceable to their source template\n * without coupling that parsing/writing logic to the skill command runner.\n */\n\n/**\n * Brand-neutral frontmatter key that records which template a SKILL.md was\n * rendered from. Stamped only when a skill is installed under a custom name\n * (`--name`), so `sync`/`diff` can map a renamed install back to its template\n * for version-compare and update.\n */\nexport const SKILL_SOURCE_KEY = \"skill-source\";\n\n/**\n * Split a SKILL.md into its leading YAML frontmatter block and the body. The\n * frontmatter is the block between the first `---` line and the next `---`\n * line. Returns `null` when the content has no recognizable frontmatter, so\n * callers can skip identity rewriting rather than corrupt the file.\n */\nfunction splitFrontmatter(\n content: string\n): { frontmatter: string; body: string } | null {\n const lines = content.split(\"\\n\");\n if (lines[0] !== \"---\") return null;\n for (let i = 1; i < lines.length; i++) {\n if (lines[i] === \"---\") {\n return {\n frontmatter: lines.slice(1, i).join(\"\\n\"),\n // Keep the closing `---` and everything after it in the body so a\n // round-trip with `applyInstallIdentity` reproduces the file exactly.\n body: lines.slice(i).join(\"\\n\"),\n };\n }\n }\n return null;\n}\n\n/**\n * Read a single `key: value` field out of a frontmatter block. Returns `null`\n * when the key is absent. Used to recover an installed skill's `name:` /\n * `skill-source:` for the collision guard.\n */\nfunction readFrontmatterField(frontmatter: string, key: string): string | null {\n for (const line of frontmatter.split(\"\\n\")) {\n const match = line.match(/^([A-Za-z0-9_-]+):\\s*(.*)$/);\n if (match && match[1] === key) return match[2].trim();\n }\n return null;\n}\n\n/**\n * Derive the template key an already-installed SKILL.md was rendered from:\n * the `skill-source:` stamp when present (custom-named install), otherwise the\n * `name:` field (a default install, where name === template key). `null` when\n * neither is present.\n */\nexport function installedSourceKey(content: string): string | null {\n const parts = splitFrontmatter(content);\n if (!parts) return null;\n return (\n readFrontmatterField(parts.frontmatter, SKILL_SOURCE_KEY) ??\n readFrontmatterField(parts.frontmatter, \"name\")\n );\n}\n\n/**\n * Rewrite a rendered SKILL.md so it installs cleanly under `installName`:\n * the frontmatter `name:` is set to `installName` (agents require `name:` to\n * match the install directory), and — only when the name differs from the\n * template key — a `skill-source: <templateKey>` line is stamped so\n * `sync`/`diff` can still track the install.\n */\nexport function applyInstallIdentity(\n content: string,\n installName: string,\n templateKey: string\n): string {\n if (installName === templateKey) return content;\n\n const parts = splitFrontmatter(content);\n if (!parts) return content;\n\n const out: string[] = [];\n let wroteName = false;\n let wroteSource = false;\n for (const line of parts.frontmatter.split(\"\\n\")) {\n const match = line.match(/^([A-Za-z0-9_-]+):\\s*(.*)$/);\n const key = match?.[1];\n if (key === \"name\") {\n out.push(`name: ${installName}`);\n out.push(`${SKILL_SOURCE_KEY}: ${templateKey}`);\n wroteName = true;\n wroteSource = true;\n } else if (key === SKILL_SOURCE_KEY) {\n // Re-stamp from the template key rather than trusting a stale value.\n if (!wroteSource) {\n out.push(`${SKILL_SOURCE_KEY}: ${templateKey}`);\n wroteSource = true;\n }\n } else {\n out.push(line);\n }\n }\n // Defensive: frontmatter missing `name:` / `skill-source:` still gets them.\n if (!wroteName) out.unshift(`name: ${installName}`);\n if (!wroteSource) {\n const nameIdx = out.findIndex((l) => l.startsWith(\"name:\"));\n out.splice(nameIdx >= 0 ? nameIdx + 1 : 0, 0, `${SKILL_SOURCE_KEY}: ${templateKey}`);\n }\n\n // Reassemble: leading `---`, rewritten frontmatter, then the original body\n // (which already starts with its own closing `---` fence).\n return `---\\n${out.join(\"\\n\")}\\n${parts.body}`;\n}\n","import type { SkillTemplate } from './types.js';\n\nexport const cofactorBrowserTestingTemplate: SkillTemplate = {\n name: 'cofactor-browser-testing',\n description:\n 'Drive a real browser with the Cofactor CLI to explore, test or verify a web application. Use when the user asks to browse, click through, screenshot or check a page.',\n version: '2.1.1',\n render: () => `---\nname: cofactor-browser-testing\nversion: 2.1.1\ndescription: Drive a real browser with the Cofactor CLI to explore, test or verify a web application. Use when the user asks to browse, click through, screenshot or check a page.\nallowed-tools: Bash(cofactor session:*), Bash(cofactor login:*), Bash(cofactor exploratory-test:*), Read\n---\n\n# Browser Testing\n\nUse this to open a page, interact with it and report what you see.\n\nRun \\`cofactor session guide\\` first. It covers element discovery, waiting, credentials and what to do when the page is logged out.\n\nKey commands:\n\n\\`\\`\\`bash\ncofactor session start # open a browser session\ncofactor session navigate --url <url>\ncofactor session snapshot # list elements you can act on\ncofactor session click --ref <ref> # also: type, fill, press, scroll\ncofactor session screenshot\ncofactor session stop # always clean up\n\\`\\`\\`\n\n## Hand the exploring to an agent\n\nTo have a Cofactor agent explore an application from a prompt and report what it finds (an exploratory test), start one instead of driving the browser yourself:\n\n\\`\\`\\`bash\ncofactor exploratory-test run --application <name|id> --prompt \"Try the checkout flow as a new customer\" --wait\ncofactor exploratory-test run --application <name|id> --prompt @charter.md --sandbox-env <name> --wait # a Sandboxes v2 environment\ncofactor exploratory-test get <id> # status, summary, issues, video/trace availability, URL\ncofactor exploratory-test list --application <name|id>\n\\`\\`\\`\n\nRun \\`cofactor exploratory-test --help\\` for the options that pick a named live environment, a credential and a flavor. The sandbox environment option supports the functional flavor only. This is not \\`cofactor exploration\\`, which runs product-map cycles.\n\nRule: sign in with a \\`$CREDENTIAL\\` placeholder or \\`cofactor session load-credential\\` (see \\`cofactor session guide sign-in\\`), and never print or type a real password or token into the page or the transcript.\n\nFeedback: if this skill confused you or a tool was missing, run \\`cofactor feedback \"<what happened, what would have helped>\" --topic skill --skill cofactor-browser-testing\\`. No secrets, customer data, real names or URLs; use neutral examples (Acme, example.com).\n`,\n};\n","/**\n * `cofactor-debug-run` skill template.\n *\n * Unlike the other entries in SKILL_TEMPLATES (which inline their content as\n * JS strings), the cofactor-debug-run skill is rendered from the Handlebars partials in\n * `@chatsdet/diagnostic-playbook`. Source of truth = the playbook partials.\n *\n * Versioning: each released version is a frozen snapshot file under\n * `packages/canary-cli/skills/cofactor-debug-run/history/<version>.md`. The current\n * version is stamped in `version.json` next to the history dir. To mint a new\n * version after editing partials, run:\n *\n * bun run --filter=@canaryai/cli bump-skill cofactor-debug-run [patch|minor|major]\n *\n * The drift test in `packages/canary-cli/src/skill-rendered.test.ts`\n * fails if the live `renderSkill()` output diverges from\n * `history/<currentVersion>.md`, forcing a bump rather than silent edits to a\n * previously-released version. `previousVersions` is auto-populated from the\n * history dir so `canary skill diff cofactor-debug-run` can replay any released version.\n */\n\nimport { readFileSync, readdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { SkillTemplate } from './types.js';\n\nconst HERE = dirname(fileURLToPath(import.meta.url));\n\n/**\n * Resolve the on-disk location of the cofactor-debug-run skill assets.\n *\n * At runtime the assets live in one of two places depending on whether we\n * are running from the source tree (tests, dev), the bundled dist (npm\n * install), or from a published @canaryai/cli inside node_modules:\n *\n * - source: packages/canary-cli/src/skill-templates/cofactor-debug-run.ts\n * → ../../skills/cofactor-debug-run/\n * - dist: packages/canary-cli/dist/<chunk>.js\n * → ./skills/cofactor-debug-run/ (copied by `cp -r skills dist/`)\n *\n * The first candidate that has a readable `version.json` wins.\n */\nfunction resolveSkillDir(): string {\n const candidates = [\n join(HERE, '..', '..', 'skills', 'cofactor-debug-run'), // source tree\n join(HERE, 'skills', 'cofactor-debug-run'), // dist\n join(HERE, '..', 'skills', 'cofactor-debug-run'), // dist split-chunk variant\n ];\n for (const c of candidates) {\n try {\n readFileSync(join(c, 'version.json'), 'utf-8');\n return c;\n } catch {\n // try next\n }\n }\n throw new Error(\n `Could not locate cofactor-debug-run skill assets relative to ${HERE}. Tried: ${candidates.join(', ')}`,\n );\n}\n\nconst SKILL_DIR = resolveSkillDir();\nconst HISTORY_DIR = join(SKILL_DIR, 'history');\n\nconst versionMeta = JSON.parse(\n readFileSync(join(SKILL_DIR, 'version.json'), 'utf-8'),\n) as { current: string };\n\nfunction readVersion(version: string): string {\n return readFileSync(join(HISTORY_DIR, `${version}.md`), 'utf-8');\n}\n\nfunction listVersionsOnDisk(): string[] {\n return readdirSync(HISTORY_DIR)\n .filter((f) => f.endsWith('.md'))\n .map((f) => f.slice(0, -3));\n}\n\nconst previousVersions: Record<string, () => string> = {};\nfor (const v of listVersionsOnDisk()) {\n if (v !== versionMeta.current) {\n previousVersions[v] = () => readVersion(v);\n }\n}\n\nexport const cofactorDebugRunTemplate: SkillTemplate = {\n name: 'cofactor-debug-run',\n description:\n 'Diagnose why a workflow test failed — root-cause an end-to-end run from its materialised artifacts',\n version: versionMeta.current,\n render: () => readVersion(versionMeta.current),\n previousVersions,\n};\n","import type { SkillTemplate } from './types.js';\n\nexport const cofactorOnboardingTemplate: SkillTemplate = {\n name: 'cofactor-onboarding',\n description:\n \"Take a new Cofactor user from signup to their tests running nightly on Sandboxes v2 and a first report. Use when the user is new to Cofactor, asks to set it up or onboard, or has no sandbox or suite yet.\",\n version: '1.2.0',\n render: () => `---\nname: cofactor-onboarding\nversion: 1.2.0\ndescription: Take a new Cofactor user from signup to their tests running nightly on Sandboxes v2 and a first report. Use when the user is new to Cofactor, asks to set it up or onboard, or has no sandbox or suite yet.\nallowed-tools: Bash(cofactor:*), Read, Grep, Glob, Write, Edit\n---\n\n# Cofactor Onboarding\n\nGoal: within an hour, the user's tests run on Cofactor Sandboxes v2 every night and they have read a first report. You do the work through the CLI. **Each step asks the user exactly one thing** (in bold below); propose every other answer from their code and say what you assumed. Note the time when step 1 starts. Learn the platform from \\`cofactor sandbox guide\\` and its topics, never from memory.\n\n## 0. Sign in\n\\`cofactor --version\\` (missing: \\`npm install -g @runcofactor/cli\\`), then \\`cofactor orgs\\`. Ask, only if not signed in: **\"Approve the sign-in in your browser\"** while \\`cofactor login\\` runs.\nThen pick the application's name: an existing one from \\`cofactor application list\\`, or a new name from their code (the product's name). Don't create it: step 1's \\`connect\\` or \\`push\\` creates it, with its sandbox as its default environment.\n\n## 1. Connect the app to Sandboxes v2\nAsk: **\"Should Cofactor build from your GitHub repository, or will you push a built image?\"**\n- Before writing the definition, the feasibility check (\\`cofactor sandbox guide feasibility\\`): list the app's dependencies (databases, queues, functions, outside services, sign-in, platform) with their verdicts, and note now which \\`real\\` ones need a test key, so 2a has every secret name. Build a hermetic sandbox unless it isn't feasible (the app can't start or users can't sign in without something unsupported) or the user says otherwise. If it isn't feasible, or the user asked for frontend-only, ask a second question, only in those cases: when infeasible, explain why with that topic's table and your recommendation, and write nothing until the user decides. For frontend-only, the same question names the backend you would point at and gets their confirmation that it is not production and holds no real customer data; never take a backend URL from the code unconfirmed. Every other unsupported or unknown item waits for 2b's question (this skill's one-question rule replaces the topic's stop-and-ask).\n- Read \\`cofactor sandbox guide\\`, then \\`definition\\`, \\`personas\\`, \\`seeds-and-actions\\`, \\`environments\\`, \\`secrets\\` (and \\`upload\\` for images). Read the app: how it starts, its database, sign-in, roles, outside services. Write \\`cofactor.sandbox.yaml\\` in the guide's \"WHAT TO BUILD FIRST\" order: a service with a health check, one persona per role, one seed through the app's own API.\n- GitHub: \\`cofactor github connect\\`, \\`cofactor sandbox validate\\`, merge the definition to the default branch (\\`connect\\` reads it from there; \\`--dir\\` if it isn't at the root), then \\`cofactor sandbox connect --application <app> --repo <owner/name>\\`.\n- Image: \\`cofactor sandbox validate --upload\\`, build for \\`linux/amd64\\`, then \\`cofactor sandbox push --application <app> <image> --definition cofactor.sandbox.yaml --tag nightly --wait\\`; it prints one \\`Sync:\\` line. \\`Sync: syncable\\` means \\`cofactor sandbox sync\\` will work on the image; \\`Sync: not syncable\\` names what to fix (the definition file must sit at the image's WORKDIR, as \\`COPY . .\\` gives you), and the push still succeeds; \\`Sync: not checked (...)\\` (for example when the definition is not in a git repository) is only advice skipped, so go on. Then give the user the CI job for nightly pushes: the complete workflow file is \"NIGHTLY PUSH FROM GITHUB ACTIONS\" in \\`cofactor sandbox guide upload\\` (its last step, the suite run, needs two more key scopes: \\`test-run:run\\` and \\`test-run:read\\`). (\\`api-key scopes\\` hides the sandbox scopes unless Sandboxes v2 is on; \\`create\\` accepts them regardless). CI signs in with an API key in \\`COFACTOR_API_TOKEN\\`; its secret is printed once, so never create it yourself. In the same handoff, give the user this to run in their own shell from the repository (an organization admin, with \\`jq\\` and \\`gh\\`; for other CI, store the secret in its secret store instead): \\`TOKEN=$(cofactor api-key create --name \"CI image push\" --scope sandbox:read --scope sandbox:publish --scope property:read --json | jq -er .secret) && printf %s \"$TOKEN\" | gh secret set COFACTOR_API_TOKEN\\`. If the key was created but not stored, revoke it (\\`cofactor api-key list\\`, then \\`cofactor api-key revoke <id>\\`) and run the command again.\nDone when \\`cofactor sandbox envs --application <app>\\` shows a current version.\n\n## 2a. Secrets (skip if the app needs none; frontend-only always does)\nAsk: **\"Run this in your own shell\"**, with the exact command and the provider's test key in an environment variable: \\`printf %s \"$KEY\" | cofactor sandbox secret set NAME --application <app>\\`. Never take a key in chat. Frontend-only: also one \\`<PERSONA>_PASSWORD\\` secret per persona (the topic's naming rule), the account's own password on that backend. Done when \\`cofactor sandbox secret list --application <app>\\` shows every name. Secrets are baked into the snapshot that the first claim builds; step 1 claims nothing, so 2b's claim builds it after these secrets (prove \\`native\\` services in that claim, not earlier). If anything was claimed before these were set, replace that snapshot with a new image push, or a new default-branch commit and \\`cofactor sandbox refresh --application <app> --wait\\` (refresh on an unchanged head finds the old snapshot ready and rebuilds nothing).\n\n## 2b. Preview and blockers\n- Blockers are step 1's unsupported and unknown items and every \\`real\\` item with neither a test mode nor a stand-in named for it in the matrix (its call leaves the sandbox; a named stand-in, such as ElasticMQ for SQS, is installed as a service instead): give options for each (install it as a service, emulate, stub in the app, skip the journey), and never give the sandbox real credentials for one.\n- \\`cofactor sandbox claim --application <app> --wait\\`: the app serves over https, the seed data is there, and each persona from \\`cofactor sandbox show <id>\\` signs in through the app's real login in a browser session (the \\`cofactor-browser-testing\\` skill); with several environments, also \\`cofactor sandbox verify-env --application <app>\\`. Frontend-only: check with \\`cofactor sandbox verify-env --application <app>\\` instead, since the printed passwords are not the backend's; tell the user to sign in with the account's own password; and count as blockers only the frontend's own items, since the backend's dependencies run outside the sandbox.\nAsk: **\"Here is your app at <url> (sign in as <persona>). Which option for each blocker?\"** (no blockers: \"Does this look like your app?\"). Done when every persona signs in and each blocker has a decision; then \\`cofactor sandbox destroy <id>\\`.\n\n## 3. Existing tests or a new suite\nAsk: **\"Run your existing tests, or start a suite from scratch?\"** Find the sandbox environment's name in \\`cofactor environment list --application <app>\\` (type sandbox); it may differ from the definition's.\n\n**3a. Existing Playwright tests.** External test suites on Sandboxes v2 are not on by default for new organizations (each run holds sandbox capacity). Tell the user: **\"Contact Cofactor to enable external test suites on Sandboxes v2 for <your organization>, and tell me when it is done\"**. A run refused as not enabled means it is still off; until then, offer 3b. Copy how they run today: read their CI job and Playwright config for the base URL, env vars, global setup and sign-in. List what the sandbox can't give them (blockers from step 2b, fixed hosts, real third-party accounts, data from outside the app) and fix the config before scaling up. The tests must be in a GitHub repository. The runner sets \\`BASE_URL\\`, \\`APP_BASE_URL\\` and \\`PLAYWRIGHT_BASE_URL\\` to the copy's URL and passes each persona's login as \\`COFACTOR_PERSONAS\\` JSON: change their global setup to sign in from it (\\`cofactor sandbox guide personas\\` and \\`authentication\\`). Frontend-only: take only each persona's email from it, never its \\`password\\` (the snapshot's generated one, which the backend doesn't know); the user stores each backend password as a sensitive env var as below (\\`<PERSONA>_PASSWORD\\`), mapped as \\`'$var.ENV.<PERSONA>_PASSWORD'\\`. Requirements: the Cofactor GitHub App on that repository (\\`cofactor github connect\\`, already done if step 1 used GitHub); \\`@playwright/test\\` and \\`playwright\\` are exactly 1.62.1; one npm, pnpm or yarn lockfile; Node 22.16 on Linux amd64.\n\\`\\`\\`bash\ncofactor application repo link --application <app> --repo <owner/name>\ncofactor test-suite create --name \"<App> Playwright\" --kind external --provider playwright --repo <owner/name> --environment <sandbox environment>\ncofactor test-suite update <suite> --env-map <VAR>=<value> # only if the tests read variables: their CI's vars, never the base URLs; replaces the whole map\ncofactor test-suite run --suite <suite> --external-spec <one spec path> # one spec first, then the whole suite\n\\`\\`\\`\nA spec that needs a secret itself: ask the user to run, in their own shell with the value in an environment variable as in step 2a, \\`printf %s \"$VALUE\" | cofactor env set-var --application <app> --environment <sandbox environment> --sensitive --stdin NAME\\`, and map \\`NAME='$var.ENV.NAME'\\`, never the literal.\nDone when one spec passes on the sandbox, then the whole suite has run once.\n\n**3b. A new suite.** \\`cofactor skill install cofactor-write-test\\` and write 3 to 5 tests for the core journeys (sign-in, the main thing a user creates, the main thing they pay for). Before a test's first run, point it at the sandbox: \\`cofactor workflow patch <wf_...> --default-environment <sandbox environment>\\`; then \\`cofactor workflow run <wf_...>\\` runs it on a fresh copy. New map items default to in_dev; use \\`--stage <in_dev|alpha|beta|ga|deprecated>\\` on area/capability create|update and rule add|update only when instructed. Never set a child above its parent; promote parents first and deprecate children first. Record what each proves in the product map (\\`cofactor product-map guide\\`, \\`product-map area create <title>\\`, \\`product-map capability create <title> --area <CODE>\\`, \\`product-map link <CAP> <wf_...>\\`).\nDone when every test has passed once on the sandbox and is linked to a capability.\n\n## 4. Nightly schedule and alerts\nRecommend a nightly run with failure alerts. First run \\`cofactor teams status\\`: leave Teams out of the ask unless it shows Teams enabled. Ask: **\"Which Slack channel, Teams channel or email should failures go to? For Slack, approve the connection in the browser page I open; for Teams, run \\`cofactor teams install\\` in your own terminal and approve it.\"** Connecting is for organization admins:\n- Slack: run \\`cofactor slack connect\\` in the background: it opens Settings → Slack and waits up to 10 minutes for the user's approval. If it connected the wrong workspace, with the user's go-ahead run \\`cofactor slack disconnect --yes\\`, then connect again. A private channel must add the Cofactor app first (\\`/invite\\` in that channel).\n- Teams: the user's \\`cofactor teams install\\` opens Settings → Microsoft Teams in their browser (signing in first if needed), which sends them to the Microsoft consent page and waits for it; they then add the Cofactor app to the channel, and \\`cofactor teams channels\\` lists the name to pass to \\`--teams\\`.\n\\`\\`\\`bash\ncofactor test-suite create --name \"<App> Nightly\" # 3b only\ncofactor test-suite set-members <suite> --layer <wf_...,wf_...> # 3b only\ncofactor test-suite suites # 3a: the suite's id (3b: printed by create)\ncofactor schedule suite create --name \"<App> Nightly\" --suite-id <id> --at 02:00 --timezone <their IANA zone>\ncofactor alert create --on-schedule <scheduleId> --slack \"#<channel>\" --when failure # or --teams \"<channel>\", or --email <addr>\n\\`\\`\\`\nDone when \\`cofactor schedule suite get <scheduleId>\\` shows the next run and the alert.\nOptional recurring summary of results: \\`cofactor digest config set daily --at 08:00 --timezone <their IANA zone> --slack \"#<channel>\"\\` (admins; Slack channels only), then \\`cofactor digest email daily on\\` for their own inbox.\n\n## 5. First report\n- \\`cofactor test-suite run --suite <suite>\\` now (don't wait for tonight); it streams results and prints the run URL. Read it with \\`cofactor test-suite get <executionId>\\` (3b) or \\`cofactor external-run get <run-id>\\` (3a). For failures: \\`cofactor skill install cofactor-triage-tests\\` (and \\`cofactor-debug-run\\` for 3b).\n- Something to share: the run's web URL, plus a short summary (what ran, passed, failed and why) published with \\`cofactor utilities gist create summary.md --title \"<App> first Cofactor run\"\\`.\n- Tell them the total time since step 1 started, and how to poke around: \\`cofactor sandbox claim --application <app> --wait\\` prints the URL and each persona's login (frontend-only: sign in with the account's own password); \\`cofactor sandbox destroy <id>\\` when done.\nAsk: **\"Who on your team should see this?\"** Invite each with \\`cofactor org invite <email>\\` (organization admins; \\`--role admin\\` for another admin); they get an email to join. The \\`link:\\` it prints lets anyone join: never repeat it; if the email did not send, the user shares it with the invitee themselves.\n\n## How cost works\nUse this when choosing what tests to write.\n- The base plan is $99/month and includes 10,000 test executions. One execution is any flow run (in design or draft mode, or in a suite) or any single Playwright test run: one test paired with one environment. Fully cached, deterministic executions (Playwright tests included) are plentiful and count within those.\n- Agent time is metered separately as **agent hours**: live healing, failure diagnosis and agent-only testing (MCP tests, exploratory tests). Plans include a free allotment; never quote a number.\n- Prefer deterministic tests for anything that runs every night. Before setting up an MCP or exploratory test, tell the user it spends agent hours on every run and weigh that against what it covers that a deterministic test cannot.\n\nRules: neutral example names (Acme, example.com) in tests; never real credentials in steps or chat. If something fails on Cofactor's side, stop and give the user the exact command, the error and the time.\n\nFeedback: if this skill confused you or a tool was missing, run \\`cofactor feedback \"<what happened, what would have helped>\" --topic skill --skill cofactor-onboarding\\`. No secrets, customer data, real names or URLs; use neutral examples (Acme, example.com).\n`,\n};\n","import type { SkillTemplate } from './types.js';\n\nexport const cofactorProveWithTestsTemplate: SkillTemplate = {\n name: 'cofactor-prove-with-tests',\n description:\n 'Connect pull request acceptance criteria to passing Cofactor Workflow evidence and configure promotion. Use with every user-visible change.',\n version: '2.3.1',\n render: () => `---\nname: cofactor-prove-with-tests\nversion: 2.3.1\ndescription: Connect pull request acceptance criteria to passing Cofactor Workflow evidence and configure promotion. Use with every user-visible change.\nallowed-tools: Bash(cofactor workflow:*), Bash(cofactor sandbox:*), Bash(cofactor proofs:*), Bash(cofactor perf guide:*), Bash(cofactor eval guide:*), Read\n---\n\n# Prove a Change with Tests\n\nRun \\`cofactor proofs guide\\` for the full procedure. Use with every user-visible change; pass \\`--org <org>\\` on every write. Performance: \\`cofactor perf guide\\`. Agent evals: \\`cofactor eval guide\\`.\n\n1. **Find coverage first.** Search with \\`cofactor workflow list --search \"<words>\"\\`, inspect with \\`cofactor workflow get <wf_...> --format markdown\\`, and read assertions. Extend the existing journey; never add near-duplicates for a changed filter, column or field.\n2. **Choose the Workflow.** If an approved test already proves the criterion unchanged (the journey must still work, e.g. after a query change), run it as is and attach its run: it is cited as an existing test, proves it still works, and is never promoted. To change a test, fork approved coverage with \\`cofactor workflow fork fork <wf_...> --org <org>\\`; never edit the original. Create a draft only when no journey fits or separate data/role is needed (\\`cofactor workflow guide write-a-test\\`).\n3. **Configure promotion** on a fork/draft (not an existing test) before attaching evidence: \\`cofactor workflow set-promotion <workflowId> --promote-on merge|never|deploy:<stage> [--target-suite <suite>]... --org <org>\\`; \\`never\\` archives it at merge, for a proof about the change itself (one-time migration or backfill, flag rollout step, behaviour being removed). Do not choose a layer; curation and suite behavior are in the guide.\n4. **Prove the exact pushed commit.** Commit and push, leave a clean checkout, and use \\`git rev-parse HEAD\\` as \\`<sha>\\`. Claim, sync, and run the Workflow (fork, draft or existing test):\n \\`cofactor sandbox claim --application <app> --at <sha> --wait --org <org>\\`\n \\`cofactor sandbox sync <sandboxId> [--build] --org <org>\\`\n \\`cofactor workflow run <workflowId> --sandbox <sandboxId> --stream --org <org>\\`\n Iterate to passing; the run uses the claimed sandbox's own environment, so do not pass --environment. Keep the sandbox id; if you lose it, \\`cofactor sandbox claims --org <org>\\` lists your live claims, and \\`cofactor sandbox destroy <sandboxId>\\` tears one down when you are done. After every application or Workflow test change, commit/push application edits, sync, and rerun. Use the final passing run ID; keep the checkout clean. Exact tree/SHA requirements are in the guide.\n5. **Push and open a DRAFT PR.** Commit/push remaining changes; if application or Workflow tests changed, repeat step 4 first. Note PR number \\`<n>\\` for attach.\n6. **Number observable acceptance criteria.** Supply both \\`--text\\` and \\`--detail\\` for each new number; reuse them for additional evidence. Use the most specific node/assertion ID via optional \\`--node <id>\\` and \\`--asserted \"Asserted that …\"\\`. A performance run can prove a criterion: run it at the pushed head SHA, then attach it with \\`--perf-run <prun_...>\\`. One criterion can mix kinds and carry several items (a query change: a workflow run for behavior and a perf run for speed). An agent eval run proves a criterion the same way: a full, passing run at the pushed head SHA, attached with \\`--eval-run <aerun_...>\\` (any number per criterion). Every item must pass.\n7. **Attach after the draft PR exists.** Use exactly one subject flag set per command. For E2E evidence, omit optional \\`--node\\` only if no specific ID exists:\n \\`cofactor proofs attach --pr <n> --application <app> --criterion <n> --text \"<criterion>\" --detail \"<why this matters>\" --test <wf_...> --run <wrun_...> [--node <most-specific-id>] --asserted \"Asserted that …\" --org <org>\\`\n For performance evidence:\n \\`cofactor proofs attach --pr <n> --application <app> --criterion <n> --perf-run <prun_...> --asserted \"Asserted that …\" --org <org>\\`\n A test containing any \\`visual_checkpoint\\` node is a UI test, even when it also has other steps. Attaching it runs the same test at the PR base commit and the proof page shows each checkpoint's base, head and diff. Put checkpoints before steps that depend on the new behavior so the base run can reach them.\n Only for a criterion Cofactor cannot exercise at all (desktop client, hardware, third-party console; never a failing or flaky test), attach manual evidence: \\`cofactor proofs attach --pr <n> --application <app> --criterion <n> [--text \"<criterion>\" --detail \"<why>\"] --manual --notes <text|@file> [--artifact <https-url>]... --org <org>\\`. Say what you did and why Cofactor could not prove it; notes and links are shown to every reader, so redact secrets and customer data and never link signed URLs. It passes, is marked manual, and never promotes; re-attaching replaces it, so repeat every \\`--artifact\\`.\n8. **Render, check and update.** Replace the PR proof block with all of \\`cofactor proofs render --pr <n> --org <org>\\`; paste it verbatim and never hand-format or add a prose \"Proof notes\" section that restates it. It leads with a stoplight per criterion (🟢 passed, 🟡 stale, 🔴 failed, ⚪ manual) and names each test, how it ran and what it asserted, with links; it is a snapshot as of the commit in its header, so render and replace it again after every push, attach or detach. Reviewer context goes in \\`--detail\\`. Check with \\`cofactor proofs status --repo <owner/repo> --pr <n> --org <org>\\`. Detach a whole criterion with \\`cofactor proofs detach --pr <n> --criterion <n> --org <org>\\`, or one item with \\`--test <wf_...>\\` / \\`--perf-run <prun_...>\\` / \\`--eval-run <aerun_...>\\` / \\`--manual\\`; render again after every attach or detach.\n\nDiagnose with \\`cofactor proofs check --pr <n> --sha <head> --body-file <file> --org <org>\\` or \\`--body -\\` for stdin; see the guide for checks/stale evidence. Re-run refreshes stale E2E evidence; performance evidence needs a new run at the current head, an attach, and a detach of the old item; manual evidence is refreshed by attaching it again at the new head. Server and CI own promotion triggers; \\`cofactor trigger\\` is not your job. No observable acceptance criterion at all (dependency bump, docs-only change)? Print this neutral block with \\`cofactor proofs render --none \"<why>\"\\` and paste it, replacing the PR proof block; never hand-type it.\n\nUse neutral example names; never include customer names, domains, or credentials. A human approves by merging; the agent does not approve Workflows.\\n\\nFeedback: if this skill confused you or a tool was missing, run \\`cofactor feedback \"<what happened, what would have helped>\" --topic skill --skill cofactor-prove-with-tests\\`. No secrets, customer data, real names or URLs; use neutral examples (Acme, example.com).\\n`,\n};\n","import type { SkillTemplate } from './types.js';\n\nexport const cofactorTriageIssuesTemplate: SkillTemplate = {\n name: 'cofactor-triage-issues',\n description:\n 'Triage Cofactor issues by listing, inspecting, deduping, tagging, closing and handing them off. Use when the user asks about open issues, what broke, or which issues to fix first.',\n version: '2.0.2',\n render: () => `---\nname: cofactor-triage-issues\nversion: 2.0.2\ndescription: Triage Cofactor issues by listing, inspecting, deduping, tagging, closing and handing them off. Use when the user asks about open issues, what broke, or which issues to fix first.\nallowed-tools: Bash(cofactor issues:*), Bash(cofactor login:*), Read, Grep\n---\n\n# Triage Issues\n\nUse this when the user wants to review, dedupe, prioritise or close issues Cofactor found.\n\nRun \\`cofactor issues guide\\` first. It explains triage order, dedupe, tagging and handing an issue to an engineer.\n\nKey commands:\n\n\\`\\`\\`bash\ncofactor issues list # open issues, newest first\ncofactor issues get <issueId> # evidence, steps, linked runs, comments\ncofactor issues comment <issueId> --body <text|@file> # leave a note for the team\ncofactor issues tag <issueId> --add <names> # label for routing\ncofactor issues merge <dupId> --into <canonicalId> # fold a duplicate\ncofactor issues close <issueId> [--not-a-bug --reason <text>]\n\\`\\`\\`\n\nRule: read an issue with \\`issues get\\` before closing or merging it, and never paste credentials or tokens from its evidence into tickets or chat.\n\nFeedback: if this skill confused you or a tool was missing, run \\`cofactor feedback \"<what happened, what would have helped>\" --topic skill --skill cofactor-triage-issues\\`. No secrets, customer data, real names or URLs; use neutral examples (Acme, example.com).\n`,\n};\n","import type { SkillTemplate } from './types.js';\n\nexport const cofactorTriageTestsTemplate: SkillTemplate = {\n name: 'cofactor-triage-tests',\n description:\n 'Triage Cofactor test results by finding failing runs and suites, telling real failures from flakes, and deciding the next step. Use when the user asks what failed, whether a suite is healthy, or how to read test results.',\n version: '2.0.2',\n render: () => `---\nname: cofactor-triage-tests\nversion: 2.0.2\ndescription: Triage Cofactor test results by finding failing runs and suites, telling real failures from flakes, and deciding the next step. Use when the user asks what failed, whether a suite is healthy, or how to read test results.\nallowed-tools: Bash(cofactor test-suite:*), Bash(cofactor workflow list:*), Bash(cofactor workflow runs:*), Bash(cofactor workflow guide:*), Bash(cofactor external-run:*), Bash(cofactor login:*), Read\n---\n\n# Triage Tests\n\nUse this when the user wants to know what failed, whether a suite is healthy, or what to do about a red run.\n\nRun \\`cofactor external-run guide\\` first (and \\`cofactor workflow guide\\` for how tests are structured).\n\nKey commands:\n\n\\`\\`\\`bash\ncofactor test-suite executions # recent suite runs\ncofactor test-suite get <executionId> --failures-only\ncofactor test-suite diagnostics <workflowId> <runId>\ncofactor workflow runs list <workflowId> # run history for one test\ncofactor external-run guide # CI-triggered runs and artifacts\n\\`\\`\\`\n\nRule: a failure is real only when it reproduces with the same evidence; hand a single unexplained failure to \\`cofactor-debug-run\\` instead of guessing.\n\nFeedback: if this skill confused you or a tool was missing, run \\`cofactor feedback \"<what happened, what would have helped>\" --topic skill --skill cofactor-triage-tests\\`. No secrets, customer data, real names or URLs; use neutral examples (Acme, example.com).\n`,\n};\n","import type { SkillTemplate } from './types.js';\n\nexport const cofactorWriteTestTemplate: SkillTemplate = {\n name: 'cofactor-write-test',\n description:\n 'Author a Cofactor end-to-end test directly through the CLI by picking the journey, creating or patching the workflow, running it and returning its URL. Use when the user asks to write, add, extend or fix a test.',\n version: '2.1.2',\n render: () => `---\nname: cofactor-write-test\nversion: 2.1.2\ndescription: Author a Cofactor end-to-end test directly through the CLI by picking the journey, creating or patching the workflow, running it and returning its URL. Use when the user asks to write, add, extend or fix a test.\nallowed-tools: Bash(cofactor workflow:*), Bash(cofactor persona:*), Bash(cofactor session guide:*), Bash(cofactor perf guide:*), Bash(cofactor eval guide:*), Bash(cofactor login:*), Read\n---\n\n# Write a Test\n\nUse this when the user wants a new end-to-end test, or a change to an existing one.\n\nRun \\`cofactor workflow guide write-a-test\\` first. It covers journey altitude (one user goal per test), assertions that prove an outcome, and seed data.\n\nFor visual regression coverage, read \\`cofactor workflow guide visual-checkpoints\\` for checkpoint placement, severity, and Playwright attachments. Performance: \\`cofactor perf guide\\`. Agent evals: \\`cofactor eval guide\\`.\n\nAuthor directly in the CLI:\n\n\\`\\`\\`bash\ncofactor workflow list --search \"<topic>\" # never create a duplicate\ncofactor persona list --application \"<app>\" # pick who the test acts as\ncofactor workflow create --from-file test.json # new test\ncofactor workflow patch <workflowId> ... # edit settings\ncofactor workflow node ... # edit a single step\ncofactor workflow sync <workflowId> --from-file test.json # replace all steps\ncofactor workflow run <workflowId> # prove it passes\n\\`\\`\\`\n\nTo act as a persona, make the first node a \\`login\\` node:\n\n\\`\\`\\`json\n{ \"nodeType\": \"login\", \"configJson\": { \"credentialSource\": \"from_template\", \"credentialTemplateName\": \"<persona name>\", \"performLogin\": true } }\n\\`\\`\\`\n\nThe name must match one from \\`persona list\\`. If it exists on more than one application, set \\`credentialTemplateId\\` (the persona id) instead. Without \\`credentialSource: \"from_template\"\\` a login node expects a stored \\`credentialId\\`.\n\nFinish by giving the user the workflow URL and the run result.\n\nRule: never put real passwords or tokens in steps; use the credential placeholders the guide describes.\n\nFeedback: if this skill confused you or a tool was missing, run \\`cofactor feedback \"<what happened, what would have helped>\" --topic skill --skill cofactor-write-test\\`. No secrets, customer data, real names or URLs; use neutral examples (Acme, example.com).\n`,\n previousVersions: {\n '2.1.1': () => `---\nname: cofactor-write-test\nversion: 2.1.1\ndescription: Author a Cofactor end-to-end test directly through the CLI by picking the journey, creating or patching the workflow, running it and returning its URL. Use when the user asks to write, add, extend or fix a test.\nallowed-tools: Bash(cofactor workflow:*), Bash(cofactor persona:*), Bash(cofactor session guide:*), Bash(cofactor perf guide:*), Bash(cofactor login:*), Read\n---\n\n# Write a Test\n\nUse this when the user wants a new end-to-end test, or a change to an existing one.\n\nRun \\`cofactor workflow guide write-a-test\\` first. It covers journey altitude (one user goal per test), assertions that prove an outcome, and seed data.\n\nFor visual regression coverage, read \\`cofactor workflow guide visual-checkpoints\\` for checkpoint placement, severity, and Playwright attachments. Performance: \\`cofactor perf guide\\`\n\nAuthor directly in the CLI:\n\n\\`\\`\\`bash\ncofactor workflow list --search \"<topic>\" # never create a duplicate\ncofactor persona list --application \"<app>\" # pick who the test acts as\ncofactor workflow create --from-file test.json # new test\ncofactor workflow patch <workflowId> ... # edit settings\ncofactor workflow node ... # edit a single step\ncofactor workflow sync <workflowId> --from-file test.json # replace all steps\ncofactor workflow run <workflowId> # prove it passes\n\\`\\`\\`\n\nTo act as a persona, make the first node a \\`login\\` node:\n\n\\`\\`\\`json\n{ \"nodeType\": \"login\", \"configJson\": { \"credentialSource\": \"from_template\", \"credentialTemplateName\": \"<persona name>\", \"performLogin\": true } }\n\\`\\`\\`\n\nThe name must match one from \\`persona list\\`. If it exists on more than one application, set \\`credentialTemplateId\\` (the persona id) instead. Without \\`credentialSource: \"from_template\"\\` a login node expects a stored \\`credentialId\\`.\n\nFinish by giving the user the workflow URL and the run result.\n\nRule: never put real passwords or tokens in steps; use the credential placeholders the guide describes.\n\nFeedback: if this skill confused you or a tool was missing, run \\`cofactor feedback \"<what happened, what would have helped>\" --topic skill --skill cofactor-write-test\\`. No secrets, customer data, real names or URLs; use neutral examples (Acme, example.com).\n`,\n '2.1.0': () => `---\nname: cofactor-write-test\nversion: 2.1.0\ndescription: Author a Cofactor end-to-end test directly through the CLI by picking the journey, creating or patching the workflow, running it and returning its URL. Use when the user asks to write, add, extend or fix a test.\nallowed-tools: Bash(cofactor workflow:*), Bash(cofactor persona:*), Bash(cofactor session guide:*), Bash(cofactor perf guide:*), Bash(cofactor login:*), Read\n---\n\n# Write a Test\n\nUse this when the user wants a new end-to-end test, or a change to an existing one.\n\nRun \\`cofactor workflow guide write-a-test\\` first. It covers journey altitude (one user goal per test), assertions that prove an outcome, and seed data.\n\nFor visual regression coverage, read \\`cofactor workflow guide visual-checkpoints\\` for checkpoint placement, severity, and Playwright attachments. Performance: \\`cofactor perf guide\\`\n\nAuthor directly in the CLI:\n\n\\`\\`\\`bash\ncofactor workflow list --search \"<topic>\" # never create a duplicate\ncofactor persona list --application \"<app>\" # pick who the test acts as\ncofactor workflow create --from-file test.json # new test\ncofactor workflow patch <workflowId> ... # edit settings\ncofactor workflow node ... # edit a single step\ncofactor workflow sync <workflowId> --from-file test.json # replace all steps\ncofactor workflow run <workflowId> # prove it passes\n\\`\\`\\`\n\nTo act as a persona, make the first node a \\`login\\` node:\n\n\\`\\`\\`json\n{ \"nodeType\": \"login\", \"configJson\": { \"credentialSource\": \"from_template\", \"credentialTemplateName\": \"<persona name>\", \"performLogin\": true } }\n\\`\\`\\`\n\nThe name must match one from \\`persona list\\`. If it exists on more than one application, set \\`credentialTemplateId\\` (the persona id) instead. Without \\`credentialSource: \"from_template\"\\` a login node expects a stored \\`credentialId\\`.\n\nFinish by giving the user the workflow URL and the run result.\n\nRule: never put real passwords or tokens in steps; use the credential placeholders the guide describes.\n`,\n '2.0.5': () => `---\nname: cofactor-write-test\nversion: 2.0.5\ndescription: Author a Cofactor end-to-end test directly through the CLI by picking the journey, creating or patching the workflow, running it and returning its URL. Use when the user asks to write, add, extend or fix a test.\nallowed-tools: Bash(cofactor workflow:*), Bash(cofactor session guide:*), Bash(cofactor perf guide:*), Bash(cofactor login:*), Read\n---\n\n# Write a Test\n\nUse this when the user wants a new end-to-end test, or a change to an existing one.\n\nRun \\`cofactor workflow guide write-a-test\\` first. It covers journey altitude (one user goal per test), assertions that prove an outcome, and seed data.\n\nFor visual regression coverage, read \\`cofactor workflow guide visual-checkpoints\\` for checkpoint placement, severity, and Playwright attachments.\n\nPerformance: \\`cofactor perf guide\\`\n\nAuthor directly in the CLI, with no spec files:\n\n\\`\\`\\`bash\ncofactor workflow list --search \"<topic>\" # never create a duplicate\ncofactor workflow create ... # new test (see the guide for the format)\ncofactor workflow patch <workflowId> ... # edit settings\ncofactor workflow node ... # edit a single step\ncofactor workflow sync <workflowId> --from-file state.json # replace all steps\ncofactor workflow run <workflowId> # prove it passes\n\\`\\`\\`\n\nFinish by giving the user the workflow URL and the run result.\n\nRule: never put real passwords or tokens in steps; use the credential placeholders the guide describes.\n`,\n '2.0.2': () => `---\nname: cofactor-write-test\nversion: 2.0.2\ndescription: Author a Cofactor end-to-end test directly through the CLI by picking the journey, creating or patching the workflow, running it and returning its URL. Use when the user asks to write, add, extend or fix a test.\nallowed-tools: Bash(cofactor workflow:*), Bash(cofactor session guide:*), Bash(cofactor login:*), Read\n---\n\n# Write a Test\n\nUse this when the user wants a new end-to-end test, or a change to an existing one.\n\nRun \\`cofactor workflow guide write-a-test\\` first. It covers journey altitude (one user goal per test), assertions that prove an outcome, and seed data.\n\nFor visual regression coverage, read \\`cofactor workflow guide visual-checkpoints\\` for checkpoint placement, severity, and Playwright attachments.\n\nAuthor directly in the CLI, with no spec files:\n\n\\`\\`\\`bash\ncofactor workflow list --search \"<topic>\" # never create a duplicate\ncofactor workflow create ... # new test (see the guide for the format)\ncofactor workflow patch <workflowId> ... # edit settings\ncofactor workflow node ... # edit a single step\ncofactor workflow sync <workflowId> --from-file state.json # replace all steps\ncofactor workflow run <workflowId> # prove it passes\n\\`\\`\\`\n\nFinish by giving the user the workflow URL and the run result.\n\nRule: never put real passwords or tokens in steps; use the credential placeholders the guide describes.\n`,\n '2.0.1': () => `---\nname: cofactor-write-test\nversion: 2.0.1\ndescription: Author a Cofactor end-to-end test directly through the CLI by picking the journey, creating or patching the workflow, running it and returning its URL. Use when the user asks to write, add, extend or fix a test.\nallowed-tools: Bash(cofactor workflow:*), Bash(cofactor session guide:*), Bash(cofactor login:*), Read\n---\n\n# Write a Test\n\nUse this when the user wants a new end-to-end test, or a change to an existing one.\n\nRun \\`cofactor workflow guide write-a-test\\` first. It covers journey altitude (one user goal per test), assertions that prove an outcome, and seed data.\n\nAuthor directly in the CLI, with no spec files:\n\n\\`\\`\\`bash\ncofactor workflow list --search \"<topic>\" # never create a duplicate\ncofactor workflow create ... # new test (see the guide for the format)\ncofactor workflow patch <workflowId> ... # edit settings\ncofactor workflow node ... # edit a single step\ncofactor workflow sync <workflowId> --from-file state.json # replace all steps\ncofactor workflow run <workflowId> # prove it passes\n\\`\\`\\`\n\nFinish by giving the user the workflow URL and the run result.\n\nRule: never put real passwords or tokens in steps; use the credential placeholders the guide describes.\n`,\n },\n};\n","import type { SkillTemplate } from './types.js';\nimport { cofactorBrowserTestingTemplate } from './cofactor-browser-testing.js';\nimport { cofactorDebugRunTemplate } from './cofactor-debug-run.js';\nimport { cofactorOnboardingTemplate } from './cofactor-onboarding.js';\nimport { cofactorProveWithTestsTemplate } from './cofactor-prove-with-tests.js';\nimport { cofactorTriageIssuesTemplate } from './cofactor-triage-issues.js';\nimport { cofactorTriageTestsTemplate } from './cofactor-triage-tests.js';\nimport { cofactorWriteTestTemplate } from './cofactor-write-test.js';\n\nexport type { SkillTemplate };\n\nexport const SKILL_TEMPLATES: Record<string, SkillTemplate> = {\n 'cofactor-triage-issues': cofactorTriageIssuesTemplate,\n 'cofactor-triage-tests': cofactorTriageTestsTemplate,\n 'cofactor-write-test': cofactorWriteTestTemplate,\n 'cofactor-browser-testing': cofactorBrowserTestingTemplate,\n 'cofactor-debug-run': cofactorDebugRunTemplate,\n 'cofactor-prove-with-tests': cofactorProveWithTestsTemplate,\n 'cofactor-onboarding': cofactorOnboardingTemplate,\n};\n","import { SKILL_TEMPLATES } from \"./skill-templates/index.js\";\n\nfunction compareSemver(a: string, b: string): number {\n const pa = a.split(\".\").map((n) => parseInt(n, 10) || 0);\n const pb = b.split(\".\").map((n) => parseInt(n, 10) || 0);\n for (let i = 0; i < 3; i++) {\n const d = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (d !== 0) return d < 0 ? -1 : 1;\n }\n return 0;\n}\n\nexport function knownVersions(name: string): string[] {\n const t = SKILL_TEMPLATES[name];\n if (!t) return [];\n const all = new Set<string>([t.version, ...Object.keys(t.previousVersions ?? {})]);\n return [...all].sort(compareSemver);\n}\n\nfunction renderAtVersion(name: string, version: string): string | null {\n const t = SKILL_TEMPLATES[name];\n if (!t) return null;\n if (version === t.version) return t.render();\n const prev = t.previousVersions?.[version];\n return prev ? prev() : null;\n}\n\nfunction parseFlagArgs(argv: string[]): {\n positional: string[];\n flags: Record<string, string | true>;\n} {\n const positional: string[] = [];\n const flags: Record<string, string | true> = {};\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n if (a.startsWith(\"--\")) {\n const key = a.slice(2);\n const next = argv[i + 1];\n if (next !== undefined && !next.startsWith(\"--\")) {\n flags[key] = next;\n i++;\n } else {\n flags[key] = true;\n }\n } else {\n positional.push(a);\n }\n }\n return { positional, flags };\n}\n\nexport function runVersions(argv: string[]) {\n const [name] = argv;\n if (!name || !SKILL_TEMPLATES[name]) {\n console.error(`Usage: canary skill versions <name>`);\n process.exit(1);\n }\n const versions = knownVersions(name);\n const current = SKILL_TEMPLATES[name].version;\n for (const v of versions) {\n console.log(v === current ? `${v} (current)` : v);\n }\n}\n\nfunction jsUnifiedDiff(a: string, b: string, labelA: string, labelB: string): string {\n const aLines = a.split(\"\\n\");\n const bLines = b.split(\"\\n\");\n const n = aLines.length;\n const m = bLines.length;\n const dp: number[][] = Array.from({ length: n + 1 }, () =>\n Array.from<number>({ length: m + 1 }).fill(0)\n );\n for (let i = n - 1; i >= 0; i--) {\n for (let j = m - 1; j >= 0; j--) {\n dp[i][j] =\n aLines[i] === bLines[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);\n }\n }\n const out: string[] = [`--- ${labelA}`, `+++ ${labelB}`];\n let i = 0;\n let j = 0;\n while (i < n && j < m) {\n if (aLines[i] === bLines[j]) {\n out.push(` ${aLines[i]}`);\n i++;\n j++;\n } else if (dp[i + 1][j] >= dp[i][j + 1]) {\n out.push(`-${aLines[i++]}`);\n } else {\n out.push(`+${bLines[j++]}`);\n }\n }\n while (i < n) out.push(`-${aLines[i++]}`);\n while (j < m) out.push(`+${bLines[j++]}`);\n return out.join(\"\\n\") + \"\\n\";\n}\n\nexport function runDiff(argv: string[]) {\n const { positional, flags } = parseFlagArgs(argv);\n const [name] = positional;\n\n if (!name) {\n console.error(\"Usage: canary skill diff <name> [--from <version>] [--to <version>]\");\n process.exit(1);\n }\n\n const template = SKILL_TEMPLATES[name];\n if (!template) {\n console.error(`Unknown skill \"${name}\".`);\n process.exit(1);\n }\n\n const versions = knownVersions(name);\n const to = typeof flags.to === \"string\" ? flags.to : template.version;\n const from =\n typeof flags.from === \"string\" ? flags.from : versions.filter((v) => v !== to).slice(-1)[0];\n\n if (!from) {\n console.error(\n `No prior version of \"${name}\" to diff against. Only known version: ${template.version}.`\n );\n process.exit(1);\n }\n\n const fromContent = renderAtVersion(name, from);\n const toContent = renderAtVersion(name, to);\n\n if (fromContent === null) {\n console.error(\n `Version \"${from}\" of skill \"${name}\" is not in the CLI. Known: ${versions.join(\", \")}.`\n );\n process.exit(1);\n }\n if (toContent === null) {\n console.error(\n `Version \"${to}\" of skill \"${name}\" is not in the CLI. Known: ${versions.join(\", \")}.`\n );\n process.exit(1);\n }\n\n if (from === to) {\n console.log(`(no diff — both sides are v${from})`);\n return;\n }\n\n process.stdout.write(jsUnifiedDiff(fromContent, toContent, `${name}@${from}`, `${name}@${to}`));\n}\n"],"mappings":"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","names":["readFileSync","join","i","j","join","readFileSync"]}
|