@reddoorla/maintenance 0.96.0 → 0.98.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 +5 -6
- package/dist/{announce-45HVP4J4.js → announce-2FH2KBQQ.js} +39 -31
- package/dist/announce-2FH2KBQQ.js.map +1 -0
- package/dist/attachments-JFGFQRXQ.js +10 -0
- package/dist/{blux-RUFMNOUJ.js → blux-NXQLMS4W.js} +5 -5
- package/dist/{bump-deps-EL3TKMIL.js → bump-deps-54K4ECP3.js} +6 -6
- package/dist/{chunk-IMYL67JV.js → chunk-3RLDX3Q2.js} +5 -5
- package/dist/{chunk-EQQ4H6L3.js → chunk-3YALLSBF.js} +2 -2
- package/dist/{chunk-LAJ3FF54.js → chunk-5UI4FERC.js} +16 -5
- package/dist/chunk-5UI4FERC.js.map +1 -0
- package/dist/{chunk-CA6ADGOC.js → chunk-6PGXKN6F.js} +2 -2
- package/dist/{chunk-Y5BVR4HW.js → chunk-6THEZQLA.js} +3 -3
- package/dist/chunk-ASLDCWBF.js +41 -0
- package/dist/chunk-ASLDCWBF.js.map +1 -0
- package/dist/{chunk-DVJNYPFR.js → chunk-AYDQQBNG.js} +2 -2
- package/dist/{chunk-OTEVKRAH.js → chunk-B2BRFWJY.js} +7 -16
- package/dist/chunk-B2BRFWJY.js.map +1 -0
- package/dist/{chunk-GEUC5VGM.js → chunk-BINFZQ2T.js} +49 -4
- package/dist/chunk-BINFZQ2T.js.map +1 -0
- package/dist/{chunk-T76MA2FH.js → chunk-CP6MVZ5X.js} +27 -1
- package/dist/{chunk-T76MA2FH.js.map → chunk-CP6MVZ5X.js.map} +1 -1
- package/dist/{chunk-72FJZ6LO.js → chunk-DRNZVORX.js} +26 -22
- package/dist/chunk-DRNZVORX.js.map +1 -0
- package/dist/{chunk-XY7YV2YQ.js → chunk-DXZRWW2F.js} +65 -10
- package/dist/chunk-DXZRWW2F.js.map +1 -0
- package/dist/{chunk-SHGIDTYF.js → chunk-DYTYPKFN.js} +2 -2
- package/dist/chunk-DZZ5KRTB.js +23 -0
- package/dist/chunk-DZZ5KRTB.js.map +1 -0
- package/dist/{chunk-NVLREB5R.js → chunk-EN6CTBUN.js} +7 -7
- package/dist/{chunk-ZH5LOQET.js → chunk-FHFXJ3EM.js} +7 -5
- package/dist/chunk-FHFXJ3EM.js.map +1 -0
- package/dist/{chunk-3EA43S3R.js → chunk-GRF2RYEO.js} +12 -12
- package/dist/{chunk-RRE74VWI.js → chunk-HSMN35LU.js} +2 -2
- package/dist/chunk-ICSRWW5Q.js +148 -0
- package/dist/chunk-ICSRWW5Q.js.map +1 -0
- package/dist/{chunk-XG2A6GIG.js → chunk-IDBPII6G.js} +4 -4
- package/dist/{chunk-XG2A6GIG.js.map → chunk-IDBPII6G.js.map} +1 -1
- package/dist/{chunk-ECDJDHKT.js → chunk-JHJNNJLG.js} +2 -2
- package/dist/{chunk-QFSL2L2B.js → chunk-L5F3WYIY.js} +81 -31
- package/dist/chunk-L5F3WYIY.js.map +1 -0
- package/dist/{chunk-XED2DNAI.js → chunk-LAG6IP7Y.js} +7 -7
- package/dist/{chunk-UIITN37J.js → chunk-LF2TJN4X.js} +2 -2
- package/dist/chunk-LF2TJN4X.js.map +1 -0
- package/dist/{chunk-SQ4FSNYL.js → chunk-LUF52EIY.js} +2 -2
- package/dist/{chunk-MZZDMBDT.js → chunk-LZMAG73U.js} +19 -19
- package/dist/chunk-LZMAG73U.js.map +1 -0
- package/dist/{chunk-6INOBNRO.js → chunk-MNRWHSFS.js} +2 -2
- package/dist/{chunk-CGQZFQAY.js → chunk-MVKNU4QD.js} +2 -3
- package/dist/chunk-MVKNU4QD.js.map +1 -0
- package/dist/{chunk-62YWOFVN.js → chunk-ORTOMEYR.js} +3 -3
- package/dist/{chunk-62YWOFVN.js.map → chunk-ORTOMEYR.js.map} +1 -1
- package/dist/{chunk-44SDGPGQ.js → chunk-PZZ6HM5T.js} +3 -3
- package/dist/chunk-RQJFGK3A.js +51 -0
- package/dist/chunk-RQJFGK3A.js.map +1 -0
- package/dist/{chunk-H445EH33.js → chunk-S2PLX4XK.js} +10 -7
- package/dist/chunk-S2PLX4XK.js.map +1 -0
- package/dist/{chunk-KN52PM63.js → chunk-TC4GANMX.js} +47 -149
- package/dist/chunk-TC4GANMX.js.map +1 -0
- package/dist/{chunk-F3JWOPTG.js → chunk-TEMQPSCM.js} +45 -105
- package/dist/chunk-TEMQPSCM.js.map +1 -0
- package/dist/{chunk-4UTJ4G6P.js → chunk-TJLKWQOX.js} +2 -2
- package/dist/{chunk-A5QKNOXW.js → chunk-TTT6HYPW.js} +47 -10
- package/dist/chunk-TTT6HYPW.js.map +1 -0
- package/dist/{chunk-VEIIUCYL.js → chunk-TV76A6GN.js} +2 -2
- package/dist/{chunk-D3CTOCUR.js → chunk-TVZ6QCOE.js} +3 -3
- package/dist/chunk-UPE6D4AT.js +69 -0
- package/dist/chunk-UPE6D4AT.js.map +1 -0
- package/dist/{chunk-BIYQN7FH.js → chunk-VCPTOZ56.js} +31 -1
- package/dist/{chunk-BIYQN7FH.js.map → chunk-VCPTOZ56.js.map} +1 -1
- package/dist/chunk-VQMAAQ5M.js +53 -0
- package/dist/chunk-VQMAAQ5M.js.map +1 -0
- package/dist/{chunk-EASYCD6F.js → chunk-WMF5S2MB.js} +1 -1
- package/dist/{chunk-EASYCD6F.js.map → chunk-WMF5S2MB.js.map} +1 -1
- package/dist/{chunk-37B4LVB3.js → chunk-X56LAKPR.js} +3 -3
- package/dist/chunk-X56LAKPR.js.map +1 -0
- package/dist/{chunk-IY6256GK.js → chunk-YJBSB4LP.js} +6 -1
- package/dist/chunk-YJBSB4LP.js.map +1 -0
- package/dist/{chunk-P4A6D6HO.js → chunk-ZEE5WQYU.js} +32 -18
- package/dist/chunk-ZEE5WQYU.js.map +1 -0
- package/dist/cli/bin.js +92 -50
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/commands/audit.d.ts +33 -3
- package/dist/cli/commands/audit.js +26 -23
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/client-3XGSZMLU.js +11 -0
- package/dist/{convert-to-pnpm-4DON7IFS.js → convert-to-pnpm-U2CRNKNY.js} +6 -6
- package/dist/{db-5K4CDEGJ.js → db-7XYTBIPH.js} +25 -18
- package/dist/db-7XYTBIPH.js.map +1 -0
- package/dist/{deadletter-G4M3HSVM.js → deadletter-A7RQVNG3.js} +8 -4
- package/dist/{digest-5AJGWS33.js → digest-AMXRGWZA.js} +34 -33
- package/dist/digest-AMXRGWZA.js.map +1 -0
- package/dist/{digest-collectors-MC5NWEUA.js → digest-collectors-CX2NCGS7.js} +15 -12
- package/dist/ensure-site-F2WFCWWA.js +70 -0
- package/dist/ensure-site-F2WFCWWA.js.map +1 -0
- package/dist/ensure-site-JEKV2ODE.js +105 -0
- package/dist/ensure-site-JEKV2ODE.js.map +1 -0
- package/dist/{ensure-site-XESZHZEB.js → ensure-site-OO4UPWNQ.js} +19 -42
- package/dist/ensure-site-OO4UPWNQ.js.map +1 -0
- package/dist/fleet-events-CkOZpMVC.d.ts +435 -0
- package/dist/{fleet-state-GJWGKTLD.js → fleet-state-RJROYXKO.js} +17 -7
- package/dist/{forms-notify-target-4NPLX2UG.js → forms-notify-target-DK5R326N.js} +17 -13
- package/dist/forms-notify-target-DK5R326N.js.map +1 -0
- package/dist/{github-signals-DMU74SAX.js → github-signals-RGRPYTUB.js} +20 -15
- package/dist/github-signals-RGRPYTUB.js.map +1 -0
- package/dist/{header-image-BRTOLHJF.js → header-image-43ZIEJKP.js} +13 -17
- package/dist/header-image-43ZIEJKP.js.map +1 -0
- package/dist/{health-endpoint-UCLMSSCN.js → health-endpoint-K5LXDPGE.js} +7 -7
- package/dist/{health-mirror-ONRT4DQ5.js → health-mirror-WZUHWCCV.js} +10 -10
- package/dist/{import-airtable-IIK2QUUF.js → import-airtable-UBF5GYAL.js} +3 -3
- package/dist/index.d.ts +102 -494
- package/dist/index.js +62 -52
- package/dist/index.js.map +1 -1
- package/dist/{init-3LMZTCVD.js → init-OFITGMOP.js} +16 -16
- package/dist/{launch-XTDMC6LD.js → launch-AJY3TGTQ.js} +37 -35
- package/dist/launch-AJY3TGTQ.js.map +1 -0
- package/dist/{lighthouse-52WSPZ5D.js → lighthouse-RFMFREEX.js} +2 -2
- package/dist/lighthouse-airtable-M45OPVRV.js +14 -0
- package/dist/{chunk-IHHAYXKY.js → match-harness-CFELJA57.js} +70 -4
- package/dist/match-harness-CFELJA57.js.map +1 -0
- package/dist/migrate-EZL55AWA.js +7 -0
- package/dist/notify-K3WVH3DM.js +1 -1
- package/dist/{onboard-CZYBWVWH.js → onboard-F7RTLMDZ.js} +6 -6
- package/dist/{orchestrate-TGDFGY52.js → orchestrate-SAIFXZIW.js} +13 -10
- package/dist/parity-2JGVUCZD.js +14 -0
- package/dist/{pipeline-UUPXOS2J.js → pipeline-TCSNVDQZ.js} +3 -3
- package/dist/{preflight-POZZI3GN.js → preflight-6XGVVO2U.js} +35 -11
- package/dist/preflight-6XGVVO2U.js.map +1 -0
- package/dist/{prismic-ci-AHY5ULJR.js → prismic-ci-XMX7A5E4.js} +11 -11
- package/dist/prismic-ci-XMX7A5E4.js.map +1 -0
- package/dist/{prismic-models-URYGODNY.js → prismic-models-7GKFAAFA.js} +19 -16
- package/dist/prismic-models-7GKFAAFA.js.map +1 -0
- package/dist/prospect/types.d.ts +44 -2
- package/dist/prospect/types.js +1 -1
- package/dist/{prospect-audit-AJEE3Z4L.js → prospect-audit-KWP5P5U2.js} +37 -5
- package/dist/prospect-audit-KWP5P5U2.js.map +1 -0
- package/dist/{protection-audit-3J3UEOVT.js → protection-audit-YXJKFU6O.js} +3 -3
- package/dist/{protection-audit-3J3UEOVT.js.map → protection-audit-YXJKFU6O.js.map} +1 -1
- package/dist/recipes/sync-configs.js +3 -3
- package/dist/{render-MHUUHPLN.js → render-NWUAX6RN.js} +3 -3
- package/dist/{render-from-row-65DC6ZP3.js → render-from-row-75JTED2Z.js} +6 -4
- package/dist/{renovate-dispatch-ONJMBUHJ.js → renovate-dispatch-ZZQXT7DA.js} +13 -8
- package/dist/{renovate-dispatch-ONJMBUHJ.js.map → renovate-dispatch-ZZQXT7DA.js.map} +1 -1
- package/dist/replay-HB44TAII.js +77 -0
- package/dist/replay-HB44TAII.js.map +1 -0
- package/dist/{report-RC5LGPU3.js → report-MVPWS7WP.js} +102 -58
- package/dist/report-MVPWS7WP.js.map +1 -0
- package/dist/{report-mirror-KKZZ6RMZ.js → report-mirror-O6IDFDWU.js} +28 -10
- package/dist/report-mirror-O6IDFDWU.js.map +1 -0
- package/dist/roster-EJ3ILR52.js +19 -0
- package/dist/roster-EJ3ILR52.js.map +1 -0
- package/dist/{screenouts-7P5GOZMV.js → screenouts-7NQUWHOJ.js} +14 -1
- package/dist/screenouts-7NQUWHOJ.js.map +1 -0
- package/dist/{self-updating-RKKIYNV4.js → self-updating-KX5FMGEO.js} +7 -7
- package/dist/{selftest-AFLR7YV7.js → selftest-KABY2CYJ.js} +21 -17
- package/dist/{selftest-AFLR7YV7.js.map → selftest-KABY2CYJ.js.map} +1 -1
- package/dist/site-create-ZU3ACBTO.js +45 -0
- package/dist/site-create-ZU3ACBTO.js.map +1 -0
- package/dist/{site-mirror-H2FYMN55.js → site-mirror-TKTDWYP3.js} +10 -10
- package/dist/site-mirror-TKTDWYP3.js.map +1 -0
- package/dist/{smoke-suite-BWHR3XX5.js → smoke-suite-QQMV7TNA.js} +7 -7
- package/dist/{submissions-JDZP35JM.js → submissions-4I66W6QK.js} +11 -1
- package/dist/{submissions-JDZP35JM.js.map → submissions-4I66W6QK.js.map} +1 -1
- package/dist/{submissions-II5J35QM.js → submissions-K5UXGZUN.js} +12 -7
- package/dist/submissions-K5UXGZUN.js.map +1 -0
- package/dist/{svelte-codemods-QWGIRNN6.js → svelte-codemods-YFN4TEGV.js} +6 -6
- package/dist/{sync-NKPDCMYW.js → sync-F4USL4K5.js} +6 -6
- package/dist/{sync-configs-HGLQV55H.js → sync-configs-HBXS3D7C.js} +6 -6
- package/dist/turso-KQKBBQCK.js +24 -0
- package/dist/turso-KQKBBQCK.js.map +1 -0
- package/dist/{upgrade-WZ44IARG.js → upgrade-XOJMDIT4.js} +6 -6
- package/dist/util/git.d.ts +1 -1
- package/dist/util/git.js +1 -1
- package/dist/{websites-6DHIHJ2D.js → websites-Y6FN2XFD.js} +26 -21
- package/dist/{write-audits-to-airtable-BIK6LNVC.js → write-audits-to-airtable-TI3JMWSY.js} +6 -4
- package/package.json +1 -1
- package/dist/airtable-SJV4ZSMS.js +0 -9
- package/dist/announce-45HVP4J4.js.map +0 -1
- package/dist/attachments-NLZIJ5NU.js +0 -9
- package/dist/chunk-37B4LVB3.js.map +0 -1
- package/dist/chunk-72FJZ6LO.js.map +0 -1
- package/dist/chunk-74QRWE6G.js +0 -53
- package/dist/chunk-74QRWE6G.js.map +0 -1
- package/dist/chunk-A5QKNOXW.js.map +0 -1
- package/dist/chunk-CGQZFQAY.js.map +0 -1
- package/dist/chunk-F3JWOPTG.js.map +0 -1
- package/dist/chunk-GEUC5VGM.js.map +0 -1
- package/dist/chunk-H445EH33.js.map +0 -1
- package/dist/chunk-IHHAYXKY.js.map +0 -1
- package/dist/chunk-IY6256GK.js.map +0 -1
- package/dist/chunk-KN52PM63.js.map +0 -1
- package/dist/chunk-LAJ3FF54.js.map +0 -1
- package/dist/chunk-MZZDMBDT.js.map +0 -1
- package/dist/chunk-OTEVKRAH.js.map +0 -1
- package/dist/chunk-P4A6D6HO.js.map +0 -1
- package/dist/chunk-QFSL2L2B.js.map +0 -1
- package/dist/chunk-UIITN37J.js.map +0 -1
- package/dist/chunk-XY7YV2YQ.js.map +0 -1
- package/dist/chunk-YFAXOD7Z.js +0 -42
- package/dist/chunk-YFAXOD7Z.js.map +0 -1
- package/dist/chunk-ZH5LOQET.js.map +0 -1
- package/dist/client-L7NAUG6J.js +0 -11
- package/dist/db-5K4CDEGJ.js.map +0 -1
- package/dist/digest-5AJGWS33.js.map +0 -1
- package/dist/ensure-site-XESZHZEB.js.map +0 -1
- package/dist/fleet-events-cF2Om88w.d.ts +0 -24
- package/dist/forms-notify-target-4NPLX2UG.js.map +0 -1
- package/dist/github-signals-DMU74SAX.js.map +0 -1
- package/dist/header-image-BRTOLHJF.js.map +0 -1
- package/dist/launch-XTDMC6LD.js.map +0 -1
- package/dist/lighthouse-airtable-3NOFB42B.js +0 -12
- package/dist/match-harness-OW45CB5H.js +0 -77
- package/dist/match-harness-OW45CB5H.js.map +0 -1
- package/dist/migrate-NE3DUMTM.js +0 -7
- package/dist/parity-AEKYSLN6.js +0 -14
- package/dist/preflight-POZZI3GN.js.map +0 -1
- package/dist/prismic-ci-AHY5ULJR.js.map +0 -1
- package/dist/prismic-models-URYGODNY.js.map +0 -1
- package/dist/prospect-audit-AJEE3Z4L.js.map +0 -1
- package/dist/replay-4FVFOMHH.js +0 -54
- package/dist/replay-4FVFOMHH.js.map +0 -1
- package/dist/report-RC5LGPU3.js.map +0 -1
- package/dist/report-mirror-KKZZ6RMZ.js.map +0 -1
- package/dist/screenouts-7P5GOZMV.js.map +0 -1
- package/dist/site-mirror-H2FYMN55.js.map +0 -1
- package/dist/submissions-II5J35QM.js.map +0 -1
- package/dist/write-audits-to-airtable-BIK6LNVC.js.map +0 -1
- /package/dist/{airtable-SJV4ZSMS.js.map → attachments-JFGFQRXQ.js.map} +0 -0
- /package/dist/{blux-RUFMNOUJ.js.map → blux-NXQLMS4W.js.map} +0 -0
- /package/dist/{bump-deps-EL3TKMIL.js.map → bump-deps-54K4ECP3.js.map} +0 -0
- /package/dist/{chunk-IMYL67JV.js.map → chunk-3RLDX3Q2.js.map} +0 -0
- /package/dist/{chunk-EQQ4H6L3.js.map → chunk-3YALLSBF.js.map} +0 -0
- /package/dist/{chunk-CA6ADGOC.js.map → chunk-6PGXKN6F.js.map} +0 -0
- /package/dist/{chunk-Y5BVR4HW.js.map → chunk-6THEZQLA.js.map} +0 -0
- /package/dist/{chunk-DVJNYPFR.js.map → chunk-AYDQQBNG.js.map} +0 -0
- /package/dist/{chunk-SHGIDTYF.js.map → chunk-DYTYPKFN.js.map} +0 -0
- /package/dist/{chunk-NVLREB5R.js.map → chunk-EN6CTBUN.js.map} +0 -0
- /package/dist/{chunk-3EA43S3R.js.map → chunk-GRF2RYEO.js.map} +0 -0
- /package/dist/{chunk-RRE74VWI.js.map → chunk-HSMN35LU.js.map} +0 -0
- /package/dist/{chunk-ECDJDHKT.js.map → chunk-JHJNNJLG.js.map} +0 -0
- /package/dist/{chunk-XED2DNAI.js.map → chunk-LAG6IP7Y.js.map} +0 -0
- /package/dist/{chunk-SQ4FSNYL.js.map → chunk-LUF52EIY.js.map} +0 -0
- /package/dist/{chunk-6INOBNRO.js.map → chunk-MNRWHSFS.js.map} +0 -0
- /package/dist/{chunk-44SDGPGQ.js.map → chunk-PZZ6HM5T.js.map} +0 -0
- /package/dist/{chunk-4UTJ4G6P.js.map → chunk-TJLKWQOX.js.map} +0 -0
- /package/dist/{chunk-VEIIUCYL.js.map → chunk-TV76A6GN.js.map} +0 -0
- /package/dist/{chunk-D3CTOCUR.js.map → chunk-TVZ6QCOE.js.map} +0 -0
- /package/dist/{attachments-NLZIJ5NU.js.map → client-3XGSZMLU.js.map} +0 -0
- /package/dist/{convert-to-pnpm-4DON7IFS.js.map → convert-to-pnpm-U2CRNKNY.js.map} +0 -0
- /package/dist/{client-L7NAUG6J.js.map → deadletter-A7RQVNG3.js.map} +0 -0
- /package/dist/{deadletter-G4M3HSVM.js.map → digest-collectors-CX2NCGS7.js.map} +0 -0
- /package/dist/{digest-collectors-MC5NWEUA.js.map → fleet-state-RJROYXKO.js.map} +0 -0
- /package/dist/{health-endpoint-UCLMSSCN.js.map → health-endpoint-K5LXDPGE.js.map} +0 -0
- /package/dist/{health-mirror-ONRT4DQ5.js.map → health-mirror-WZUHWCCV.js.map} +0 -0
- /package/dist/{fleet-state-GJWGKTLD.js.map → import-airtable-UBF5GYAL.js.map} +0 -0
- /package/dist/{init-3LMZTCVD.js.map → init-OFITGMOP.js.map} +0 -0
- /package/dist/{import-airtable-IIK2QUUF.js.map → lighthouse-RFMFREEX.js.map} +0 -0
- /package/dist/{lighthouse-52WSPZ5D.js.map → lighthouse-airtable-M45OPVRV.js.map} +0 -0
- /package/dist/{lighthouse-airtable-3NOFB42B.js.map → migrate-EZL55AWA.js.map} +0 -0
- /package/dist/{onboard-CZYBWVWH.js.map → onboard-F7RTLMDZ.js.map} +0 -0
- /package/dist/{migrate-NE3DUMTM.js.map → orchestrate-SAIFXZIW.js.map} +0 -0
- /package/dist/{orchestrate-TGDFGY52.js.map → parity-2JGVUCZD.js.map} +0 -0
- /package/dist/{parity-AEKYSLN6.js.map → pipeline-TCSNVDQZ.js.map} +0 -0
- /package/dist/{render-MHUUHPLN.js.map → render-NWUAX6RN.js.map} +0 -0
- /package/dist/{pipeline-UUPXOS2J.js.map → render-from-row-75JTED2Z.js.map} +0 -0
- /package/dist/{self-updating-RKKIYNV4.js.map → self-updating-KX5FMGEO.js.map} +0 -0
- /package/dist/{smoke-suite-BWHR3XX5.js.map → smoke-suite-QQMV7TNA.js.map} +0 -0
- /package/dist/{svelte-codemods-QWGIRNN6.js.map → svelte-codemods-YFN4TEGV.js.map} +0 -0
- /package/dist/{sync-NKPDCMYW.js.map → sync-F4USL4K5.js.map} +0 -0
- /package/dist/{sync-configs-HGLQV55H.js.map → sync-configs-HBXS3D7C.js.map} +0 -0
- /package/dist/{upgrade-WZ44IARG.js.map → upgrade-XOJMDIT4.js.map} +0 -0
- /package/dist/{render-from-row-65DC6ZP3.js.map → websites-Y6FN2XFD.js.map} +0 -0
- /package/dist/{websites-6DHIHJ2D.js.map → write-audits-to-airtable-TI3JMWSY.js.map} +0 -0
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { a as AuditResult, S as Site, A as AuditName, b as RecipeResult, R as RecipeName, I as InventoryProvider } from './types-D_bpy89i.js';
|
|
2
2
|
export { C as ConfigName } from './types-D_bpy89i.js';
|
|
3
|
-
import { A as AirtableBase, a as FleetEventType } from './fleet-events-
|
|
3
|
+
import { A as AirtableBase, W as WebsiteRow, a as FleetEventType } from './fleet-events-CkOZpMVC.js';
|
|
4
4
|
import { F as FormType } from './types-RXY-vY-5.js';
|
|
5
5
|
export { SyncConfigsOptions, syncConfigs } from './recipes/sync-configs.js';
|
|
6
6
|
import 'airtable/lib/airtable_base.js';
|
|
@@ -431,84 +431,6 @@ declare function onboard(site: Site, opts?: OnboardOptions): Promise<RecipeResul
|
|
|
431
431
|
*/
|
|
432
432
|
declare function a11yFixturesPage(site: Site): Promise<RecipeResult>;
|
|
433
433
|
|
|
434
|
-
type HealthEndpointDeps = {
|
|
435
|
-
spawn: SpawnFn;
|
|
436
|
-
/** Resolve the TARGET repo's own prettier. Injected so a test can assert the
|
|
437
|
-
* absolute-path spawn without a populated `node_modules`. */
|
|
438
|
-
resolvePrettier?: (repoRoot: string) => Promise<string | null>;
|
|
439
|
-
};
|
|
440
|
-
/**
|
|
441
|
-
* Writes a resilient `src/routes/health/+server.ts` if the route doesn't already
|
|
442
|
-
* exist. The function-health audit fetches this endpoint; existing sites need it
|
|
443
|
-
* or the Report Health Gate blocks their Maintenance reports on "unknown". Operator
|
|
444
|
-
* edits to an existing endpoint are never clobbered (noop on existing file).
|
|
445
|
-
*
|
|
446
|
-
* Two heterogeneity fixes the fleet rollout exposed: (1) it detects whether the
|
|
447
|
-
* site has a `$lib/prismicio` module and writes the Prismic-free variant when it
|
|
448
|
-
* doesn't (a static import of a missing module fails the build); (2) it runs the
|
|
449
|
-
* SITE's own prettier on the written file before committing, so the file matches
|
|
450
|
-
* that site's formatting config (tabs/spaces, quote style vary fleet-wide) and
|
|
451
|
-
* doesn't red the CI format check. Prettier is best-effort — a site without it
|
|
452
|
-
* installed commits unformatted with a flag note rather than failing the recipe.
|
|
453
|
-
*/
|
|
454
|
-
declare function healthEndpoint(site: Site, deps?: HealthEndpointDeps): Promise<RecipeResult>;
|
|
455
|
-
|
|
456
|
-
type SmokeSuiteDeps = {
|
|
457
|
-
spawn: SpawnFn;
|
|
458
|
-
/** Resolve the TARGET repo's own prettier. Injected so a test can assert the
|
|
459
|
-
* absolute-path spawn without a populated `node_modules`. */
|
|
460
|
-
resolvePrettier?: (repoRoot: string) => Promise<string | null>;
|
|
461
|
-
};
|
|
462
|
-
/**
|
|
463
|
-
* Adds the smoke suite to a site: the `tests/smoke/*` specs, a `test:smoke` /
|
|
464
|
-
* `test:unit` script split, `@playwright/test`, and a `playwright.config.ts`
|
|
465
|
-
* that honors `REDDOOR_SMOKE_PORT` (R1.1). Conservative + partial-apply — every
|
|
466
|
-
* file is noop-if-exists, every `package.json` script/dep is add-if-absent, and
|
|
467
|
-
* an existing config that isn't a recognizable shared-base shape is left
|
|
468
|
-
* untouched and flagged for a manual R1.1 patch (never a destructive write).
|
|
469
|
-
* A site with no `package.json` noops (not a node project). Branch+commit per site.
|
|
470
|
-
*/
|
|
471
|
-
declare function smokeSuite(site: Site, deps?: SmokeSuiteDeps): Promise<RecipeResult>;
|
|
472
|
-
|
|
473
|
-
type MatchHarnessOptions = {
|
|
474
|
-
/** The live reference URL the harness gates against. Required — a harness
|
|
475
|
-
* with no reference cannot produce evidence, only an absence of errors. */
|
|
476
|
-
ref: string;
|
|
477
|
-
/** Candidate origin. Defaults to the SvelteKit dev server. */
|
|
478
|
-
cand?: string;
|
|
479
|
-
/** Breakpoint matrix. Defaults to the fleet's 1440 / 834 / 390. */
|
|
480
|
-
matrix?: number[];
|
|
481
|
-
};
|
|
482
|
-
type MatchHarnessDeps = {
|
|
483
|
-
spawn: SpawnFn;
|
|
484
|
-
/** Previously shipped renders per relative path; injectable so the
|
|
485
|
-
* safe-replace path is testable before a second version exists. */
|
|
486
|
-
previous?: Readonly<Record<string, readonly string[]>>;
|
|
487
|
-
/** Previously shipped BLOCK bodies per target file; injectable for the same
|
|
488
|
-
* reason, and empty in the shipped table until a body is superseded. */
|
|
489
|
-
blockPrevious?: Readonly<Record<string, readonly string[]>>;
|
|
490
|
-
/** Resolve the TARGET repo's own prettier. Injected so a test can assert the
|
|
491
|
-
* absolute-path spawn without a populated `node_modules`. */
|
|
492
|
-
resolvePrettier?: (repoRoot: string) => Promise<string | null>;
|
|
493
|
-
};
|
|
494
|
-
/**
|
|
495
|
-
* Installs the matching harness into a site: the dev-guarded `/dev/match/[uid]`
|
|
496
|
-
* route, a `site-pages.js` scaffold and its fixture-vs-model test,
|
|
497
|
-
* `matching/harness.json` + the read layer, the round scripts, the site records,
|
|
498
|
-
* and the `.gitignore` / `.prettierignore` / `CLAUDE.md` blocks.
|
|
499
|
-
*
|
|
500
|
-
* Install-if-absent throughout. Files a site edits are never rewritten. A
|
|
501
|
-
* recipe-owned script that matches a previously shipped render is safe-replaced;
|
|
502
|
-
* one that has been hand-edited is FLAGGED in the notes and left alone.
|
|
503
|
-
*
|
|
504
|
-
* ONE EXCEPTION TO PER-FILE INDEPENDENCE: the scripts in MATCH_HARNESS_COUPLED
|
|
505
|
-
* upgrade as a SET. If any one of them is hand-edited, none of them is written,
|
|
506
|
-
* because gate.sh calls `harness.mjs --check-run` and next.mjs imports from
|
|
507
|
-
* harness.mjs — upgrading the others around a pinned one leaves a harness that
|
|
508
|
-
* cannot run at all. See the measurement on MATCH_HARNESS_COUPLED.
|
|
509
|
-
*/
|
|
510
|
-
declare function matchHarness(site: Site, opts: MatchHarnessOptions, deps?: MatchHarnessDeps): Promise<RecipeResult>;
|
|
511
|
-
|
|
512
434
|
type InitStepResult = {
|
|
513
435
|
kind: "recipe";
|
|
514
436
|
result: RecipeResult;
|
|
@@ -578,407 +500,18 @@ type AirtableInventoryOptions = {
|
|
|
578
500
|
};
|
|
579
501
|
/**
|
|
580
502
|
* Read sites from the Airtable Websites table as an InventoryProvider.
|
|
581
|
-
* Each row becomes one Site; `path` is computed as `{workdir}/{slug}`.
|
|
582
|
-
* Only LIVE `maintenance` sites that have a `url` are included — pre-launch
|
|
583
|
-
* stages ("launching" / "building", via isPreLaunch) are excluded so a
|
|
584
|
-
* not-yet-live site is never audited as production (its deploy/domain/uptime/CMS
|
|
585
|
-
* audits would fail against nothing and red its Airtable row) nor swept by other
|
|
586
|
-
* `--fleet airtable` ops; it re-enters the fleet when a Launch report flips its
|
|
587
|
-
* Status to "maintained". The production URL is exposed as `Site.deployedUrl` so
|
|
588
|
-
* the lighthouse audit can run against it with no checkout. `repoUrl` is
|
|
589
|
-
* intentionally NOT set from `url` — a clone source must come from `gitRepo`
|
|
590
|
-
* (`owner/repo`), never the production URL.
|
|
591
|
-
*/
|
|
592
|
-
declare function fromAirtableBase(base: AirtableBase, opts?: AirtableInventoryOptions): InventoryProvider;
|
|
593
|
-
|
|
594
|
-
/**
|
|
595
|
-
* The site-status vocabulary — ONE module owns it (#539 Phase 4).
|
|
596
503
|
*
|
|
597
|
-
*
|
|
598
|
-
*
|
|
599
|
-
*
|
|
600
|
-
*
|
|
601
|
-
*
|
|
504
|
+
* No longer what `--fleet` resolves through: since #646 step 4 the fleet roster
|
|
505
|
+
* is read from Turso (`fromTursoDb`, `src/inventory/turso.ts`), because a site
|
|
506
|
+
* created by the Turso-native `ensure-site` has no Airtable record at all. This
|
|
507
|
+
* stays as the Airtable half of the selection-parity instrument and a public
|
|
508
|
+
* export until the operator approves deleting the Airtable layer (steps 6–8).
|
|
602
509
|
*
|
|
603
|
-
* The
|
|
604
|
-
*
|
|
605
|
-
*
|
|
606
|
-
* ───────────────────────── ───────────────
|
|
607
|
-
* in development building
|
|
608
|
-
* launch period launching
|
|
609
|
-
* maintenance maintained
|
|
610
|
-
* hosting hosted-only
|
|
611
|
-
* probably not our problem external
|
|
612
|
-
* legacy ┐
|
|
613
|
-
* deprecated ┴ archived ← approved MERGE, many-to-one
|
|
614
|
-
*
|
|
615
|
-
* `legacy` and `deprecated` were already treated identically by every PREDICATE
|
|
616
|
-
* (ARCHIVED_STATUSES held both), so collapsing them changes no *selection* — no
|
|
617
|
-
* fleet op gains or loses a site. It is NOT true that collapsing them changes
|
|
618
|
-
* nothing at all, and one surface proved it: the cockpit's Archived lane LABELS
|
|
619
|
-
* each row with its Status cell, and canonicalizing there rendered all 12 live
|
|
620
|
-
* archived rows as "archived". That lane now labels from `statusRaw`, which is
|
|
621
|
-
* exactly why `WebsiteRow.statusRaw` exists. The rule this leaves behind:
|
|
622
|
-
* canonical values decide BEHAVIOUR; anything DISPLAYING a Status cell, or
|
|
623
|
-
* writing one back, uses the raw cell.
|
|
624
|
-
*
|
|
625
|
-
* The merge had NO clean reverse map while both vocabularies coexisted, which
|
|
626
|
-
* is why `toAirtableStatus` had to pick one archived name deliberately. With the
|
|
627
|
-
* old names retired there is nothing left to pick between, and no code path
|
|
628
|
-
* feeds operator-supplied text through it anyway (see
|
|
629
|
-
* `src/recipes/forms-notify-target.ts`, which writes `--restore` verbatim).
|
|
630
|
-
*
|
|
631
|
-
* THE SHAPE OF THE TRANSITION (three stages):
|
|
632
|
-
*
|
|
633
|
-
* stage 1 (DONE) code speaks the NEW vocabulary internally; reads canonicalize
|
|
634
|
-
* at the two Airtable/Turso seams; writes still emit the OLD
|
|
635
|
-
* Airtable option names. Airtable untouched. No SELECTION
|
|
636
|
-
* change — every predicate picks exactly the sites it picked
|
|
637
|
-
* before (pinned row-by-row in tests/reports/airtable/
|
|
638
|
-
* site-status.test.ts). Displayed labels come from `statusRaw`.
|
|
639
|
-
* stage 2 (DONE) the Airtable "Status" single-select gained the 6 new options
|
|
640
|
-
* and all 44 cells were migrated (verified live: maintained=13,
|
|
641
|
-
* archived=12, external=9, building=6, hosted-only=2,
|
|
642
|
-
* launching=2 — zero old values, zero unrecognized), `db sync`
|
|
643
|
-
* ran clean (mismatches=0), and AIRTABLE_USES_NEW_VOCABULARY
|
|
644
|
-
* flipped to true. Writers now emit canonical names verbatim.
|
|
645
|
-
* The alias map STAYS: the 7 old options still exist in the
|
|
646
|
-
* field, so a human can still pick one in the Airtable UI.
|
|
647
|
-
* stage 3 (DONE) the operator deleted the 7 old options from the Airtable
|
|
648
|
-
* "Status" field on 2026-08-25, which is what made this safe:
|
|
649
|
-
* the gate was always "no old value CAN BE ENTERED", not
|
|
650
|
-
* merely "none is stored". Verified against the live base
|
|
651
|
-
* before any code changed — the field carries exactly the six
|
|
652
|
-
* canonical choices, byte-exact, and all 44 cells still hold a
|
|
653
|
-
* canonical value with ZERO blanks (deleting a single-select
|
|
654
|
-
* option CLEARS the cells using it, so "no cell was blanked"
|
|
655
|
-
* was checked, not assumed). AIRTABLE_STATUS_ALIASES,
|
|
656
|
-
* AIRTABLE_OLD_NAMES and AIRTABLE_USES_NEW_VOCABULARY are
|
|
657
|
-
* gone; both functions reduce to the identity.
|
|
658
|
-
*
|
|
659
|
-
* WHAT CHANGED IN BEHAVIOUR AT STAGE 3, and it is the only thing that did: an
|
|
660
|
-
* old name is no longer translated. `canonicalizeStatus("maintenance")` used to
|
|
661
|
-
* yield `maintained`; it now yields `"maintenance"` verbatim, which
|
|
662
|
-
* `isUnrecognizedStatus` flags and the cockpit surfaces as a watch row. That is
|
|
663
|
-
* intended. The option cannot be selected any more, so a stored old value would
|
|
664
|
-
* mean something went wrong — a restored backup, a scripted write, an API
|
|
665
|
-
* caller with a stale constant — and the fleet should say so rather than absorb
|
|
666
|
-
* it into a status nobody chose.
|
|
667
|
-
*
|
|
668
|
-
* Canonicalization happens on READ, never at rest: `src/db/import-airtable.ts`
|
|
669
|
-
* still stores the raw Airtable cell verbatim in `sites.status`, so the hourly
|
|
670
|
-
* parity check keeps comparing raw-to-raw and the importer stays honest to its
|
|
671
|
-
* source. Both readers — `mapRow` (Airtable) and `rowFromJoined` (Turso) — run
|
|
672
|
-
* the raw value through `canonicalizeStatus`, which is what keeps the #558
|
|
673
|
-
* reader-equivalence instrument green.
|
|
510
|
+
* The selection rule itself is `selectFleetSites` — shared, so the two providers
|
|
511
|
+
* cannot drift. `meta.airtableRowId` is kept alongside `meta.siteId` for any
|
|
512
|
+
* consumer that still reads the old key.
|
|
674
513
|
*/
|
|
675
|
-
|
|
676
|
-
type Status = "building" | "launching" | "maintained" | "hosted-only" | "external" | "archived";
|
|
677
|
-
|
|
678
|
-
type Frequency = "None" | "Monthly" | "Quarterly" | "Yearly";
|
|
679
|
-
|
|
680
|
-
/**
|
|
681
|
-
* Per-site notification routing. When present on a `maintained` site, the form
|
|
682
|
-
* notification is addressed by the value of a submission field (`field`, read from
|
|
683
|
-
* `extraFields`) — e.g. route a contact form's `interest` to a different recipient
|
|
684
|
-
* per option, always CC-ing a shared address. Absent (`null`) → the site keeps the
|
|
685
|
-
* default single-POC behavior. Recipients live HERE (server-side Airtable config),
|
|
686
|
-
* never supplied by the submitting site, so the ingest can't be turned into an open
|
|
687
|
-
* relay.
|
|
688
|
-
*/
|
|
689
|
-
type NotifyRouting = {
|
|
690
|
-
/** The `extraFields` key whose value selects a route, e.g. "interest". */
|
|
691
|
-
field: string;
|
|
692
|
-
/** Field-value → recipient address(es). */
|
|
693
|
-
routes: Record<string, string | string[]>;
|
|
694
|
-
/** Recipient(s) when the value matches no route. */
|
|
695
|
-
default?: string | string[];
|
|
696
|
-
/** Address(es) CC'd on every routed (maintenance) send. */
|
|
697
|
-
cc?: string[];
|
|
698
|
-
};
|
|
699
|
-
type WebsiteRow = {
|
|
700
|
-
id: string;
|
|
701
|
-
name: string;
|
|
702
|
-
url: string;
|
|
703
|
-
/** Canonical lifecycle status (see ./site-status.ts). Canonicalized at the read
|
|
704
|
-
* boundary, so an old-vocabulary Airtable cell and a new one read identically.
|
|
705
|
-
* A present-but-unrecognized cell survives VERBATIM (blind-cast) rather than
|
|
706
|
-
* becoming null — `isUnrecognizedStatus` flags it, and null would make
|
|
707
|
-
* due.ts/preflight.ts treat the row as eligible-by-default. */
|
|
708
|
-
status: Status | null;
|
|
709
|
-
/** The literal Airtable Status cell behind `status` — same pattern as
|
|
710
|
-
* `maintenanceFreqRaw`. The dashboard status editor round-trips THIS, so its
|
|
711
|
-
* dropdown offers and preselects the values Airtable actually holds while the
|
|
712
|
-
* two vocabularies coexist. Null = blank cell. */
|
|
713
|
-
statusRaw: string | null;
|
|
714
|
-
pointOfContact: string | null;
|
|
715
|
-
maintenanceFreq: Frequency;
|
|
716
|
-
testingFreq: Frequency;
|
|
717
|
-
/** The literal Airtable cell values behind the coerced frequencies. `toFrequency`
|
|
718
|
-
* trims whitespace ("Monthly " reads as Monthly), then maps any still-unrecognized
|
|
719
|
-
* value ("Quaterly") to "None" with a LOUD console.warn so nothing bogus reaches a
|
|
720
|
-
* client email and the drop is never invisible. Preflight validates THESE to surface
|
|
721
|
-
* the same failure as a structured finding. Null = blank cell. */
|
|
722
|
-
maintenanceFreqRaw: string | null;
|
|
723
|
-
testingFreqRaw: string | null;
|
|
724
|
-
/** Last manually-recorded maintenance day (used as fallback when no Reports row exists). */
|
|
725
|
-
maintenanceDay: string | null;
|
|
726
|
-
testingDay: string | null;
|
|
727
|
-
ga4PropertyId: string | null;
|
|
728
|
-
/** Operator-supplied query for the Google search-presence check (e.g. the business name).
|
|
729
|
-
* Null = no query set → the check is skipped for this site. */
|
|
730
|
-
searchQuery: string | null;
|
|
731
|
-
/** Explicit Search Console property for this site (`sc-domain:...` or `https://.../`).
|
|
732
|
-
* Null = auto-resolve from the SA's visible properties by host. */
|
|
733
|
-
searchConsoleProperty: string | null;
|
|
734
|
-
/** ISO timestamp of the last draft run where THIS site's GA/Search enrichment
|
|
735
|
-
* ERRORED (vs a legitimate "not configured" skip). Set by drafting on a soft-fail,
|
|
736
|
-
* cleared (null) on a clean enrichment, so the per-site analytics-failure signal
|
|
737
|
-
* self-heals. Null when the operator-added `Analytics soft-fail at` column is absent. */
|
|
738
|
-
analyticsSoftFailAt: string | null;
|
|
739
|
-
/** GitHub repo identity as `owner/repo`. Null = no git wiring → self-update ops skip
|
|
740
|
-
* (or, for local runs, fall back to the checkout's origin remote). */
|
|
741
|
-
gitRepo: string | null;
|
|
742
|
-
reportRecipientsTo: string | null;
|
|
743
|
-
reportRecipientsCc: string | null;
|
|
744
|
-
acceptedWatchConditions: string[];
|
|
745
|
-
/** First attachment in the Header image field (Airtable's signed URL — fetch before expiry). */
|
|
746
|
-
headerImage: {
|
|
747
|
-
url: string;
|
|
748
|
-
filename: string;
|
|
749
|
-
type: string;
|
|
750
|
-
} | null;
|
|
751
|
-
/** Lighthouse "current state" snapshot, kept fresh by `audit lighthouse --write-airtable`. */
|
|
752
|
-
pScore: number | null;
|
|
753
|
-
rScore: number | null;
|
|
754
|
-
bpScore: number | null;
|
|
755
|
-
seoScore: number | null;
|
|
756
|
-
/** ISO timestamp set by `audit lighthouse --write-airtable` when scores were last refreshed. */
|
|
757
|
-
lastLighthouseAuditAt: string | null;
|
|
758
|
-
/** Last-known counts from non-lighthouse audits, written by
|
|
759
|
-
* `audit --write-airtable`. `null` = never audited (or this audit
|
|
760
|
-
* type was skipped on the last run). 0 = audited, clean. */
|
|
761
|
-
a11yViolations: number | null;
|
|
762
|
-
/** Declared-range drift vs the Reddoor baseline (what package.json asks for). */
|
|
763
|
-
depsDrifted: number | null;
|
|
764
|
-
depsMajorBehind: number | null;
|
|
765
|
-
/** Real installed-version drift: deps behind the registry's latest, from the
|
|
766
|
-
* committed lockfile (`pnpm outdated`). Null = not determined this run. */
|
|
767
|
-
depsOutdated: number | null;
|
|
768
|
-
/** Of {@link depsOutdated}, how many are a *major* version behind the
|
|
769
|
-
* registry's latest — the "majors available on npm" signal, distinct from the
|
|
770
|
-
* baseline-drift {@link depsMajorBehind}. Null = not determined this run. */
|
|
771
|
-
depsMajorOutdated: number | null;
|
|
772
|
-
securityVulnsCritical: number | null;
|
|
773
|
-
securityVulnsHigh: number | null;
|
|
774
|
-
securityVulnsModerate: number | null;
|
|
775
|
-
securityVulnsLow: number | null;
|
|
776
|
-
/** Count of consecutive nightly Renovate auto-fix dispatches for the CURRENT
|
|
777
|
-
* critical/high vuln episode that have NOT yet cleared it. Owned by
|
|
778
|
-
* `renovate-dispatch`: +1 per real dispatch, reset to 0 when vulns clear.
|
|
779
|
-
* Null = field absent / never dispatched → reads as 0. At/above
|
|
780
|
-
* AUTO_FIX_EXHAUSTED_CYCLES the vuln renders as "auto-fix failed". */
|
|
781
|
-
securityAutoFixAttempts: number | null;
|
|
782
|
-
/** ISO timestamp the security audit last ran — gates freshness of the Security Updates auto-tick
|
|
783
|
-
* (clean counts only auto-tick when recent). */
|
|
784
|
-
lastSecurityAuditAt: string | null;
|
|
785
|
-
/** The known advisories behind the counts (severity-sorted, capped), so the dashboard can show
|
|
786
|
-
* WHICH packages are vulnerable, not just the totals. null = never audited / unparseable;
|
|
787
|
-
* empty array = audited clean. Written alongside the counts by the security audit. */
|
|
788
|
-
securityAdvisories: SecurityAdvisory[] | null;
|
|
789
|
-
/** Domain/DNS/SSL probe (the `domain` audit). `certDaysRemaining` is days until the TLS cert
|
|
790
|
-
* expires (null = unresolved or no usable cert); `domainCheckedAt` is when it last ran. */
|
|
791
|
-
certDaysRemaining: number | null;
|
|
792
|
-
domainCheckedAt: string | null;
|
|
793
|
-
/** Netlify site id — the IDENTITY the `netlify-deploy` audit needs to query the
|
|
794
|
-
* Netlify API. Read-only input (operator-set in Airtable); null = not on Netlify
|
|
795
|
-
* (or not wired) → that audit skips. Never derived from the URL. */
|
|
796
|
-
netlifyId: string | null;
|
|
797
|
-
/** Latest PRODUCTION deploy health (the `netlify-deploy` audit). `deployStatus` is
|
|
798
|
-
* Netlify's deploy state lower-cased (`ready`/`error`/`building`/…), null = none / not
|
|
799
|
-
* checked; `lastDeployAt` is when it deployed; `deployLogUrl` links to the deploy/log. */
|
|
800
|
-
deployStatus: string | null;
|
|
801
|
-
lastDeployAt: string | null;
|
|
802
|
-
deployLogUrl: string | null;
|
|
803
|
-
/** When the `netlify-deploy` audit last RAN (freshness stamp for `deployStatus`). The audit
|
|
804
|
-
* already writes "Deploy checked at"; this read-back is the Plan-2 fix so `deployEvidence`
|
|
805
|
-
* (Plan 4) can gate on check time — NOT on `lastDeployAt`, which is deploy time, not check time. */
|
|
806
|
-
deployCheckedAt: string | null;
|
|
807
|
-
/** Function-health verdict (the `function-health` audit): the deployed `/health` function
|
|
808
|
-
* answered `ok:true` (pass) or `ok:false` (fail). Single-select `pass`/`fail`; null = never ran
|
|
809
|
-
* / unreachable (→ Plan 4 maps to unknown/amber). Kept SEPARATE from `deployStatus` so
|
|
810
|
-
* `isFailedDeployStatus` keeps meaning "the build failed". */
|
|
811
|
-
functionHealth: "pass" | "fail" | null;
|
|
812
|
-
/** CMS reachability (server-side), derived from the same `/health` body's `details.prismic ===
|
|
813
|
-
* "ok"`. Single-select `pass`/`fail`; null = never ran. No per-site Prismic token or identity
|
|
814
|
-
* column is ever built — this rides `/health`. */
|
|
815
|
-
cmsReachable: "pass" | "fail" | null;
|
|
816
|
-
/** Does the deployed site's Turnstile widget actually work? Single-select `pass`/`fail`;
|
|
817
|
-
* null = **unverified**, which is the normal state — see below. Freshness gated by
|
|
818
|
-
* `formE2eCheckedAt`, the clock of the audit that writes it. Powers the cockpit Require-Turnstile guardrail: a site with
|
|
819
|
-
* `requireTurnstile` ON but no working widget silently buckets 100% of its real leads.
|
|
820
|
-
*
|
|
821
|
-
* One of the two `"fail"` arms is derived from `/health` (the other is a browser seeing
|
|
822
|
-
* 110200 on the live hostname), whose `forms.turnstile` is a truthiness check
|
|
823
|
-
* on `PUBLIC_TURNSTILE_SITE_KEY` that never contacts Cloudflare (see
|
|
824
|
-
* audits/function-health-airtable.ts for the incident). No key IS proof the widget can't
|
|
825
|
-
* work; a key is NOT proof that it can — a sitekey whose widget is full at Cloudflare's
|
|
826
|
-
* 10-hostname cap sets the var and still mints no token. So a `"pass"` here has to be
|
|
827
|
-
* earned by a real browser rendering the real widget (form-e2e), and until it is, null
|
|
828
|
-
* keeps the site in the cockpit's amber "can't verify" watch rather than claiming health
|
|
829
|
-
* nobody measured. */
|
|
830
|
-
turnstileWidget: "pass" | "fail" | null;
|
|
831
|
-
/** When the `function-health` audit last ran — the freshness gate for `functionHealth`,
|
|
832
|
-
* `cmsReachable`, and `turnstileWidget`. Null = never ran. */
|
|
833
|
-
functionHealthCheckedAt: string | null;
|
|
834
|
-
/** Deployed-URL browser probe (the `browser` audit): cross-engine render OK, mobile render OK,
|
|
835
|
-
* internal-links OK + broken count, and when it last ran (one timestamp gates all three). */
|
|
836
|
-
crossbrowserOk: boolean | null;
|
|
837
|
-
mobileOk: boolean | null;
|
|
838
|
-
linksOk: boolean | null;
|
|
839
|
-
brokenLinks: number | null;
|
|
840
|
-
browserCheckedAt: string | null;
|
|
841
|
-
/** Uptime-reachable verdict (browser audit): every sampled route returned 2xx/3xx. Single-select
|
|
842
|
-
* `pass`/`fail`; null = never ran. Point-in-time. Freshness-gated by `browserCheckedAt`. */
|
|
843
|
-
reachableOk: "pass" | "fail" | null;
|
|
844
|
-
/** Titles & meta verdict (browser audit, chromium): every sampled route has a non-empty `<title>`
|
|
845
|
-
* ≤ 70 chars + a non-empty meta description, and no duplicate titles across the sample.
|
|
846
|
-
* Single-select `pass`/`fail`; null = never ran. Freshness-gated by `browserCheckedAt`. */
|
|
847
|
-
titleMetaOk: "pass" | "fail" | null;
|
|
848
|
-
/** Per-site copy overrides (M6a). Blank → null → the DEFAULT_COPY value. */
|
|
849
|
-
copyIntro: string | null;
|
|
850
|
-
copyContact: string | null;
|
|
851
|
-
copyFooter: string | null;
|
|
852
|
-
/** Go-live timestamp, stamped when a Launch report sends (M6b). Null = not yet launched. */
|
|
853
|
-
launchedAt: string | null;
|
|
854
|
-
/** Optional per-site webhook (e.g. Zapier Catch Hook). When set, the ingest
|
|
855
|
-
* POSTs newsletter-formType submissions here (best-effort). Blank → null. */
|
|
856
|
-
newsletterWebhook: string | null;
|
|
857
|
-
/** Per-site Mailchimp (newsletter). Both must be set for the direct add;
|
|
858
|
-
* blank → skipped. The API key is `key-dc` format; dc is derived from it. */
|
|
859
|
-
mailchimpApiKey: string | null;
|
|
860
|
-
mailchimpAudienceId: string | null;
|
|
861
|
-
/** Per-site Cloudflare Turnstile gate (Airtable checkbox). When true, a submission
|
|
862
|
-
* whose Turnstile token verifies as "fail" (forged) OR "absent" (secret configured
|
|
863
|
-
* centrally but NO token forwarded — the direct-POST-bot signature) is escalated to
|
|
864
|
-
* auto-spam regardless of content score. A present-but-expired token stays
|
|
865
|
-
* "unverifiable" and neutral (a real browser DID render the widget — fail-open).
|
|
866
|
-
* ROLLOUT PRECONDITION: only enable on a site whose DEPLOYED package forwards
|
|
867
|
-
* `_meta.turnstileToken` from EVERY form (widget rendered + `cf-turnstile-response`
|
|
868
|
-
* posted; check the site's `/health` → forms.turnstile:true). A site that never
|
|
869
|
-
* forwards tokens would silently bucket 100% of its real leads — and the form-e2e
|
|
870
|
-
* probe cannot catch that state (testMode bypasses the gate). */
|
|
871
|
-
requireTurnstile: boolean;
|
|
872
|
-
/** GitHub-signals sweep (slice 2a), written nightly by `github-signals --fleet`. */
|
|
873
|
-
renovateFailingCis: number | null;
|
|
874
|
-
defaultBranchCi: string | null;
|
|
875
|
-
lastCommitAt: string | null;
|
|
876
|
-
githubSignalsAt: string | null;
|
|
877
|
-
/** Per-site smoke-suite verdict (the `smoke` audit runs `pnpm test:smoke`).
|
|
878
|
-
* Single-select pass/fail; null = never ran. `lastSmokeAt` gates freshness. */
|
|
879
|
-
smokeOk: "pass" | "fail" | null;
|
|
880
|
-
lastSmokeAt: string | null;
|
|
881
|
-
/** Synthetic form end-to-end verdict (the `form-e2e` audit submits the real prod
|
|
882
|
-
* contact form in test-mode). Single-select pass/fail; null = never ran OR (with
|
|
883
|
-
* a fresh `formE2eCheckedAt`) no contact form → n/a. `formE2eCheckedAt` gates
|
|
884
|
-
* freshness AND encodes the n/a-vs-never-ran distinction. */
|
|
885
|
-
formE2eOk: "pass" | "fail" | null;
|
|
886
|
-
formE2eCheckedAt: string | null;
|
|
887
|
-
/**
|
|
888
|
-
* Nightly Prismic model drift sweep (`prismic-models --fleet --write-airtable`).
|
|
889
|
-
*
|
|
890
|
-
* FOUR-VALUED, unlike every other verdict column in this table, and the extra
|
|
891
|
-
* state is the point:
|
|
892
|
-
*
|
|
893
|
-
* - `pass` — the repo and its Prismic repository were compared and agree.
|
|
894
|
-
* - `fail` — they were compared and DIVERGE (a model to create/update, or
|
|
895
|
-
* one that exists only in Prismic). A finding for a human.
|
|
896
|
-
* - `unknown` — THE CHECK ITSELF FAILED. Unreadable checkout, broken config,
|
|
897
|
-
* missing/expired token, unreadable remote. Nothing at all was
|
|
898
|
-
* established about this site's models.
|
|
899
|
-
* - `null` — no verdict to hold: the sweep has never run for this site, or
|
|
900
|
-
* it ran and found no Prismic config at all (a repo that simply
|
|
901
|
-
* is not a Prismic site). `prismicModelsCheckedAt` separates
|
|
902
|
-
* those two — fresh timestamp, blank verdict = "checked, and
|
|
903
|
-
* there is nothing here to check".
|
|
904
|
-
*
|
|
905
|
-
* `unknown` exists because the alternatives are both wrong in the dangerous
|
|
906
|
-
* direction. Writing `pass` for a site nobody could read is a green tick over
|
|
907
|
-
* an outage; writing NOTHING (the obvious "leave the last known value alone")
|
|
908
|
-
* leaves yesterday's `pass` standing for a site that has been failing every
|
|
909
|
-
* night since — and nothing ages a stale `pass` out, because the digest's
|
|
910
|
-
* freshness gate only ever examines failures. Both make "I could not read this
|
|
911
|
-
* site" indistinguishable from "this site is fine", in the record the cockpit
|
|
912
|
-
* and the digest read.
|
|
913
|
-
*
|
|
914
|
-
* OPERATOR PRECONDITION: `Prismic Models` is a single select whose options are
|
|
915
|
-
* `pass`, `fail`, `unknown`. Until the three columns exist the sweep's writes
|
|
916
|
-
* fail with UNKNOWN_FIELD_NAME and are collected as soft failures — the feature
|
|
917
|
-
* ships dark rather than reddening the nightly.
|
|
918
|
-
*/
|
|
919
|
-
prismicModels: PrismicModelsVerdict | null;
|
|
920
|
-
/** When the sweep last ran for this site — written on EVERY outcome, including
|
|
921
|
-
* `unknown` and blank, so the age of the row is the age of the answer. */
|
|
922
|
-
prismicModelsCheckedAt: string | null;
|
|
923
|
-
/** What the sweep found, verbatim: the drift report for a `fail`, the reason
|
|
924
|
-
* nothing could be established for an `unknown`, the skip reason for a blank,
|
|
925
|
-
* and null for a `pass` (which clears yesterday's finding). */
|
|
926
|
-
prismicModelsDrift: string | null;
|
|
927
|
-
/**
|
|
928
|
-
* An expiry the operator sets to accept a KNOWN, EXPECTED `fail` — most often
|
|
929
|
-
* "I am modelling in Prismic on a branch that has not landed, so Prismic is
|
|
930
|
-
* legitimately ahead of `main`". While this timestamp is in the future the
|
|
931
|
-
* drift item is not raised.
|
|
932
|
-
*
|
|
933
|
-
* It expires on purpose, and nothing renews it automatically. A permanent ack
|
|
934
|
-
* would reproduce this column's own failure mode one step later: once the
|
|
935
|
-
* branch lands, the same acked cell would swallow real drift and "nobody is
|
|
936
|
-
* looking at this" would render as "this is fine". An expiry means the worst
|
|
937
|
-
* case is a silence that ends by itself.
|
|
938
|
-
*
|
|
939
|
-
* Narrow by construction — it mutes only `fail`, the finding the operator
|
|
940
|
-
* actually reviewed. `unknown` (the check could not run) and a verdict too old
|
|
941
|
-
* to be current are never muted by it; see `collectPrismicDriftAlerts`.
|
|
942
|
-
*
|
|
943
|
-
* OPERATOR PRECONDITION: `Prismic Ack Until` is a dateTime column. Until it
|
|
944
|
-
* exists this reads null and nothing is acked, which is the safe direction.
|
|
945
|
-
*/
|
|
946
|
-
prismicAckUntil: string | null;
|
|
947
|
-
notifyRouting: NotifyRouting | null;
|
|
948
|
-
/** The RAW `Notify Routing` cell, verbatim. Same reason `statusRaw` exists: the
|
|
949
|
-
* dashboard editor round-trips this JSON, and re-serializing the PARSED object
|
|
950
|
-
* would drop any key the parser ignores and reformat what the operator typed —
|
|
951
|
-
* a silent rewrite of a cell they only opened to look at. */
|
|
952
|
-
notifyRoutingRaw: string | null;
|
|
953
|
-
/** Read-back of the code-owned next-due dates (date-only, written by the
|
|
954
|
-
* nightly `writeNextDueDates`). These exist so the writer can DIFF the
|
|
955
|
-
* freshly-computed dates against what the row already holds and skip the
|
|
956
|
-
* ~31 no-op writes a night the fleet was paying for (#539 Phase 3). Null =
|
|
957
|
-
* cell blank or the operator-added `Next … at` column absent. */
|
|
958
|
-
nextMaintenanceAt: string | null;
|
|
959
|
-
nextTestingAt: string | null;
|
|
960
|
-
};
|
|
961
|
-
/** The `Prismic Models` cell — see {@link WebsiteRow.prismicModels} for why it
|
|
962
|
-
* carries a third state that no other verdict column in this table has. */
|
|
963
|
-
type PrismicModelsVerdict = "pass" | "fail" | "unknown";
|
|
964
|
-
type Severity = "low" | "moderate" | "high" | "critical";
|
|
965
|
-
/** One known vulnerability behind the security counts, as persisted/rendered. */
|
|
966
|
-
type SecurityAdvisory = {
|
|
967
|
-
module: string;
|
|
968
|
-
severity: Severity;
|
|
969
|
-
title: string;
|
|
970
|
-
cves: string[];
|
|
971
|
-
url: string | null;
|
|
972
|
-
/** GitHub Dependabot dependency scope ("runtime" | "development"), when known. Lets the
|
|
973
|
-
* dashboard flag build-time-only ("development") vulns. Omitted for advisories from the
|
|
974
|
-
* lockfile `pnpm audit` fallback, which carries no per-package graph scope. */
|
|
975
|
-
scope?: "runtime" | "development";
|
|
976
|
-
/** GitHub Dependabot dependency-graph relationship, when known. "transitive" means no
|
|
977
|
-
* direct-dep bump can fix it — Renovate's vuln alerts have no fix vehicle until the weekly
|
|
978
|
-
* lockfile-maintenance window. Omitted when GitHub reports "unknown" or for the
|
|
979
|
-
* `pnpm audit` fallback. Drives {@link allActionableVulnsTransitive}. */
|
|
980
|
-
relationship?: "direct" | "transitive";
|
|
981
|
-
};
|
|
514
|
+
declare function fromAirtableBase(base: AirtableBase, opts?: AirtableInventoryOptions): InventoryProvider;
|
|
982
515
|
|
|
983
516
|
type ResolvedCopy = {
|
|
984
517
|
maintenanceIntro: string;
|
|
@@ -1083,6 +616,16 @@ type EvidenceRecord = {
|
|
|
1083
616
|
note: string;
|
|
1084
617
|
};
|
|
1085
618
|
|
|
619
|
+
/**
|
|
620
|
+
* The report-row model and its pure, vendor-neutral coercers.
|
|
621
|
+
*
|
|
622
|
+
* `ReportRow` is what BOTH readers return — `mapRow` over an Airtable record
|
|
623
|
+
* (`src/reports/airtable/reports.ts`) and the Turso report reader in
|
|
624
|
+
* `src/db/fleet-state.ts`. Moved out of the Airtable module in #539 Phase 6
|
|
625
|
+
* step 1 (#646) so the Turso read path does not depend on the directory Phase 6
|
|
626
|
+
* deletes. `src/reports/airtable/reports.ts` re-exports every name.
|
|
627
|
+
*/
|
|
628
|
+
|
|
1086
629
|
type DeliveryStatus = "pending" | "delivered" | "bounced" | "complained";
|
|
1087
630
|
type ReportRow = {
|
|
1088
631
|
id: string;
|
|
@@ -1131,13 +674,6 @@ type ReportRow = {
|
|
|
1131
674
|
overrideBy: string | null;
|
|
1132
675
|
overrideAt: string | null;
|
|
1133
676
|
};
|
|
1134
|
-
/** Called with the record Airtable echoed back from the create, before it is
|
|
1135
|
-
* mapped (#539 Phase 5). Structurally typed rather than importing the db
|
|
1136
|
-
* layer's `RawRecord`, so this module stays the leaf it has always been. */
|
|
1137
|
-
type CreatedDraftMirror = (rec: {
|
|
1138
|
-
id: string;
|
|
1139
|
-
fields: Record<string, unknown>;
|
|
1140
|
-
}) => Promise<void>;
|
|
1141
677
|
|
|
1142
678
|
/** Report rows (migration 0007). PK = Airtable rec id. `checklist` is JSON
|
|
1143
679
|
* keyed by the STABLE checklist key (src/reports/checklist.ts), not the
|
|
@@ -1188,7 +724,10 @@ interface ReportsTable {
|
|
|
1188
724
|
* holding a patch cannot accidentally write megabytes of HTML. */
|
|
1189
725
|
type ReportMirrorPatch = Partial<Pick<ReportsTable, "approved_to_send" | "approved_at" | "approved_by" | "send_override" | "override_reason" | "override_by" | "override_at" | "delivery_status" | "commentary" | "draft_ready" | "lighthouse_performance" | "lighthouse_accessibility" | "lighthouse_best_practices" | "lighthouse_seo" | "ga_users_current" | "ga_users_previous" | "search_found_page1" | "search_position" | "completed_on" | "sent_at" | "resend_message_id">>;
|
|
1190
726
|
|
|
1191
|
-
/** #539 Phase 5: the Turso write-through for the Reports write surface
|
|
727
|
+
/** #539 Phase 5: the Turso write-through for the Reports write surface — and,
|
|
728
|
+
* since #646 step 4, the surface itself: `create` MINTS nothing (the creator
|
|
729
|
+
* does) but it is the only place a report row comes into existence, and
|
|
730
|
+
* `forSite` is the drafting path's read.
|
|
1192
731
|
*
|
|
1193
732
|
* Before this, the only report mirrors were UPDATEs on the request path
|
|
1194
733
|
* (approve, override, delivery status, commentary). Everything the DRAFTING
|
|
@@ -1207,13 +746,38 @@ type ReportMirrorPatch = Partial<Pick<ReportsTable, "approved_to_send" | "approv
|
|
|
1207
746
|
* line means the wiring is gone, not that conditions were quiet.
|
|
1208
747
|
*/
|
|
1209
748
|
|
|
1210
|
-
/** The
|
|
1211
|
-
*
|
|
1212
|
-
* a caller holding `
|
|
1213
|
-
* state (row present, preview 404) this module exists to prevent.
|
|
749
|
+
/** The drafting path's whole report surface. Injected as ONE object rather than
|
|
750
|
+
* as separate parameters because they share a db handle and always travel
|
|
751
|
+
* together: a caller holding `create` but not `body` produces exactly the
|
|
752
|
+
* half-written state (row present, preview 404) this module exists to prevent.
|
|
753
|
+
*
|
|
754
|
+
* Since #646 step 4 this is no longer only a mirror. `create` is the PRIMARY
|
|
755
|
+
* write — Turso mints the report id and owns the row, and there is no Airtable
|
|
756
|
+
* record for it to shadow (see `src/reports/create-report.ts`) — and `forSite`
|
|
757
|
+
* is a READ the drafting path used to make against Airtable, which cannot see a
|
|
758
|
+
* report for a `site_<ULID>` site. `body` and `patch` keep their older meaning:
|
|
759
|
+
* write-throughs for state whose `rec…` rows Airtable may still shadow. The name
|
|
760
|
+
* is kept because every composition root and every injection site already uses
|
|
761
|
+
* it, and a rename would churn ten files to say what this comment says. */
|
|
1214
762
|
type ReportMirror = {
|
|
1215
|
-
/**
|
|
1216
|
-
|
|
763
|
+
/** Insert a brand-new report row and return what Turso stored. Not a mirror:
|
|
764
|
+
* the row exists nowhere else. */
|
|
765
|
+
create: (rec: {
|
|
766
|
+
id: string;
|
|
767
|
+
fields: Record<string, unknown>;
|
|
768
|
+
}) => Promise<ReportRow>;
|
|
769
|
+
/** A row AIRTABLE created, as Airtable echoed it back — the pre-step-4 shape.
|
|
770
|
+
* NO production path calls it any more: it pairs with the legacy Airtable
|
|
771
|
+
* `createDraft`, which nothing calls either. Both are kept rather than
|
|
772
|
+
* deleted because deleting from the Airtable layer is step 6, and both go
|
|
773
|
+
* together when it comes. */
|
|
774
|
+
created: (rec: {
|
|
775
|
+
id: string;
|
|
776
|
+
fields: Record<string, unknown>;
|
|
777
|
+
}) => Promise<void>;
|
|
778
|
+
/** Every report for one site — the single-queue rule's and the period
|
|
779
|
+
* derivation's read. */
|
|
780
|
+
forSite: (siteId: string) => Promise<ReportRow[]>;
|
|
1217
781
|
/** A freshly rendered body for an existing row. */
|
|
1218
782
|
body: (reportId: string, html: string) => Promise<void>;
|
|
1219
783
|
/** Columns just written to an existing row. */
|
|
@@ -1245,7 +809,10 @@ type ReportMirror = {
|
|
|
1245
809
|
* pass the EXACT FieldSet the Airtable writer returned, so the mirror can never
|
|
1246
810
|
* carry a different payload than the write it shadows. */
|
|
1247
811
|
type SiteMirror = {
|
|
1248
|
-
/** A row Airtable just CREATED, as Airtable echoed it back
|
|
812
|
+
/** A row Airtable just CREATED, as Airtable echoed it back. `ensure-site` used
|
|
813
|
+
* this until #646 step 3; it now creates sites in Turso directly
|
|
814
|
+
* (`src/fleet/ensure-site.ts`), and neither this nor `hasRow` has a caller left
|
|
815
|
+
* outside tests — both go with the Airtable layer in step 6.
|
|
1249
816
|
* Every other op is an UPDATE, which does nothing for a row that does not
|
|
1250
817
|
* exist yet — so without this a bootstrapped site is invisible to Turso and
|
|
1251
818
|
* every mirror the rest of the bootstrap fires reports `mirrored=missed`. */
|
|
@@ -1441,6 +1008,25 @@ type ResendClient = {
|
|
|
1441
1008
|
|
|
1442
1009
|
type OrchestrateOptions = {
|
|
1443
1010
|
resend?: ResendClient;
|
|
1011
|
+
/**
|
|
1012
|
+
* #646 step 4: the send queue and the fleet roster, read from TURSO.
|
|
1013
|
+
*
|
|
1014
|
+
* Required rather than defaulted, for the reason the mirrors below are: this
|
|
1015
|
+
* function is called directly by tests, and a default would let one reach a
|
|
1016
|
+
* live store. The CLI wires `listSendableReports`/`listSites` over one
|
|
1017
|
+
* connection.
|
|
1018
|
+
*/
|
|
1019
|
+
sendable: () => Promise<ReportRow[]>;
|
|
1020
|
+
roster: () => Promise<WebsiteRow[]>;
|
|
1021
|
+
/**
|
|
1022
|
+
* The site's header plate, from `sites.header_image*` (design D5 made Turso its
|
|
1023
|
+
* source; the re-render path has read it from there since #643). `null` means
|
|
1024
|
+
* Turso holds no bytes for that site, and the send falls back to the site's
|
|
1025
|
+
* Airtable attachment — which is the ONLY reason this path still reads
|
|
1026
|
+
* Airtable, and why the fallback fetches ONE site's record rather than the
|
|
1027
|
+
* roster it used to get the signed url from.
|
|
1028
|
+
*/
|
|
1029
|
+
loadHeaderPlate: (siteId: string) => Promise<Uint8Array | null>;
|
|
1444
1030
|
/** #539 Phase 5: Turso write-through for the Websites row a Launch send
|
|
1445
1031
|
* updates. Injected rather than defaulted — this function is called directly
|
|
1446
1032
|
* by tests, and a default would open a real libSQL handle inside the suite. */
|
|
@@ -1453,7 +1039,7 @@ type OrchestrateOptions = {
|
|
|
1453
1039
|
* through `mirrorWrite` so the freeze switch owns the error semantics. */
|
|
1454
1040
|
reportSentMirror?: (reportId: string, sentAt: Date, messageId: string | null) => Promise<void>;
|
|
1455
1041
|
};
|
|
1456
|
-
declare function sendApprovedReports(options
|
|
1042
|
+
declare function sendApprovedReports(options: OrchestrateOptions): Promise<{
|
|
1457
1043
|
output: string;
|
|
1458
1044
|
code: number;
|
|
1459
1045
|
}>;
|
|
@@ -1833,4 +1419,26 @@ declare function loadPlate(): Promise<Uint8Array>;
|
|
|
1833
1419
|
/** Read a headline overlay (transparent PNG, ink-box cropped). */
|
|
1834
1420
|
declare function loadHeadline(kind: HeadlineKind): Promise<Uint8Array>;
|
|
1835
1421
|
|
|
1836
|
-
|
|
1422
|
+
/** The plate's pixel dimensions — Figma frame 600x800 exported at 4x. */
|
|
1423
|
+
declare const CANVAS: {
|
|
1424
|
+
readonly width: 2400;
|
|
1425
|
+
readonly height: 3200;
|
|
1426
|
+
};
|
|
1427
|
+
/** The MacBook Pro screen the site screenshot is pasted into — the area inside
|
|
1428
|
+
* the bezel, so the bezel stays visible around the content exactly as it does
|
|
1429
|
+
* in the hand-made headers. Aspect 1.6017 (16:10 to within 0.11%).
|
|
1430
|
+
*
|
|
1431
|
+
* Measured on plate-clean.png: content spans x 310..1655, y 1888..2727, with a
|
|
1432
|
+
* single anti-aliased blend pixel on the outside of the left, top and bottom
|
|
1433
|
+
* edges (x=309 rgb(5,10,8); y=1887 rgb(14,29,24); y=2727 rgb(27,50,74)). The
|
|
1434
|
+
* rect INCLUDES those blend pixels deliberately: each one is part baked
|
|
1435
|
+
* screenshot, so leaving it uncovered leaves a faint tinted line of the other
|
|
1436
|
+
* site, while covering it repaints one pixel of bezel edge and is invisible. */
|
|
1437
|
+
declare const SCREEN: {
|
|
1438
|
+
readonly x: 309;
|
|
1439
|
+
readonly y: 1887;
|
|
1440
|
+
readonly w: 1347;
|
|
1441
|
+
readonly h: 841;
|
|
1442
|
+
};
|
|
1443
|
+
|
|
1444
|
+
export { ALL_AUDIT_NAMES, ALL_RECIPE_NAMES, type AirtableInventoryOptions, AuditName, AuditResult, BLURRED_CID, type BumpDepsOptions, type BundledImage, CANVAS, CHECK_CID, type ConvertToPnpmOptions, DEFAULT_INIT_STEPS, type DraftOptions, type DraftResult, type DueItem, type GenerateInput, type GeneratedHeaderImage, type HeaderImage, type InitOptions, type InitResult, type InitStep, type InitStepResult, InventoryProvider, type LighthouseScores, type LocalPathOptions, type OnboardAudit, type OnboardOptions, type OrchestrateOptions, RecipeName, RecipeResult, type RefreshHeaderDeps, type RenderResult, type ReportData, type ReportType, SCREEN, Site, type UpgradeSvelte4to5Options, a11yAudit, a11yFixturesPage, bumpDeps, convertToPnpm, depsAudit, domainFromUrl, draftReportForSite, findDueReports, fromAirtableBase, fromJsonFile, generateHeaderImage, init, isRecipeName, lighthouseAudit, lintAudit, loadBundledImages, loadHeadline, loadPlate, localPath, onboard, renderCockpitHtml, renderReportHtml, renderSiteDashboardHtml, runAudits, runAuditsAcross, securityAudit, selfCaretRange, selfPackageVersion, sendApprovedReports, svelteCodemods, upgradeSvelte4to5, verifyBasicAuth };
|