@rubytech/create-maxy-code 0.1.398 → 0.1.401
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/package.json +1 -1
- package/payload/platform/config/brand.json +1 -1
- package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
- package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +17 -1
- package/payload/platform/plugins/docs/references/graph.md +15 -0
- package/payload/platform/plugins/docs/references/plugins-guide.md +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.d.ts +2 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.d.ts.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.js +123 -0
- package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.js.map +1 -0
- package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +9 -0
- package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/imap.js +36 -12
- package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts.map +1 -1
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.js +18 -1
- package/payload/platform/plugins/email/mcp/dist/lib/smtp.js.map +1 -1
- package/payload/platform/plugins/memory/references/schema-estate-agent.md +2 -0
- package/payload/platform/plugins/web-designer/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/web-designer/PLUGIN.md +55 -0
- package/payload/platform/plugins/web-designer/bin/resolve-cf.sh +56 -0
- package/payload/platform/plugins/web-designer/commands/website.md +61 -0
- package/payload/platform/plugins/web-designer/skills/brand-extract/SKILL.md +86 -0
- package/payload/platform/plugins/web-designer/skills/socials/SKILL.md +139 -0
- package/payload/platform/plugins/web-designer/skills/socials/references/pii-strip.md +64 -0
- package/payload/platform/plugins/web-designer/skills/socials/references/sources.md +66 -0
- package/payload/platform/plugins/web-designer/skills/socials/templates/og.html +92 -0
- package/payload/platform/plugins/web-designer/skills/socials/templates/social-posts.md +46 -0
- package/payload/platform/plugins/web-designer/skills/socials/templates/socials.html +87 -0
- package/payload/platform/plugins/web-designer/skills/web-design/SKILL.md +98 -0
- package/payload/platform/plugins/web-designer/skills/web-design/references/deploy.md +59 -0
- package/payload/platform/plugins/web-designer/skills/web-design/references/e-sign.md +39 -0
- package/payload/platform/plugins/web-designer/skills/web-design/references/gating.md +55 -0
- package/payload/platform/plugins/web-designer/skills/web-design/references/placeholders.md +110 -0
- package/payload/platform/plugins/web-designer/skills/web-design/references/sections.md +52 -0
- package/payload/platform/plugins/web-designer/skills/web-design/templates/index.html +1004 -0
- package/payload/platform/plugins/web-designer/skills/web-design/templates/llms.txt +32 -0
- package/payload/platform/plugins/web-designer/skills/web-intake/SKILL.md +107 -0
- package/payload/platform/plugins/web-designer/skills/web-intake/references/intake.md +103 -0
- package/payload/platform/plugins/whatsapp/PLUGIN.md +7 -1
- package/payload/platform/scripts/merge-whatsapp-split-conversations.mjs +264 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +22 -6
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/server/public/assets/{AdminLoginScreens-Bex48co9.js → AdminLoginScreens-rlk263u9.js} +1 -1
- package/payload/server/public/assets/{AdminShell-BOmS1NPG.js → AdminShell-C5vWTy2n.js} +1 -1
- package/payload/server/public/assets/{Checkbox-DDlXC5tq.js → Checkbox-Chz6bfy-.js} +1 -1
- package/payload/server/public/assets/{Transcript-CwItbNkx.js → Transcript-Bsx-bGgY.js} +2 -2
- package/payload/server/public/assets/{admin-n9zWE158.js → admin-BnZH758N.js} +1 -1
- package/payload/server/public/assets/{arc-C6-nr5UV.js → arc-DyzjCWmw.js} +1 -1
- package/payload/server/public/assets/architecture-YZFGNWBL-XiVs-N7Z.js +1 -0
- package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-DIdho_T6.js → architectureDiagram-Q4EWVU46-qWfElD16.js} +1 -1
- package/payload/server/public/assets/{blockDiagram-DXYQGD6D-D5rTTBSy.js → blockDiagram-DXYQGD6D-DO2fFHC3.js} +1 -1
- package/payload/server/public/assets/{browser-CI8DR1YG.js → browser-CIrfyZWe.js} +1 -1
- package/payload/server/public/assets/{c4Diagram-AHTNJAMY-pfUVHdmy.js → c4Diagram-AHTNJAMY-Ca-q5gDe.js} +1 -1
- package/payload/server/public/assets/{calendar-WuIAN47H.js → calendar-D6Z8Kmrn.js} +1 -1
- package/payload/server/public/assets/channel-CYBkRz7E.js +1 -0
- package/payload/server/public/assets/chat-h7SytZHx.js +1 -0
- package/payload/server/public/assets/chevron-left-DSTeS1_g.js +1 -0
- package/payload/server/public/assets/{chunk-2KRD3SAO-EF6cdj8U.js → chunk-2KRD3SAO-CX2PxuDw.js} +1 -1
- package/payload/server/public/assets/{chunk-336JU56O-DE-lcZAc.js → chunk-336JU56O-D8l6U4Ne.js} +2 -2
- package/payload/server/public/assets/chunk-426QAEUC-CPhOHriU.js +1 -0
- package/payload/server/public/assets/{chunk-4BX2VUAB--ANCzzyn.js → chunk-4BX2VUAB-CG32Lkbh.js} +1 -1
- package/payload/server/public/assets/{chunk-4TB4RGXK-DTO_X80J.js → chunk-4TB4RGXK-BnAQbO-v.js} +1 -1
- package/payload/server/public/assets/{chunk-55IACEB6-4J3nrz44.js → chunk-55IACEB6-ejqRH2M5.js} +1 -1
- package/payload/server/public/assets/{chunk-5FUZZQ4R-jH_eqAHL.js → chunk-5FUZZQ4R-ClkicQ-T.js} +1 -1
- package/payload/server/public/assets/{chunk-5PVQY5BW-C-qU6p6k.js → chunk-5PVQY5BW-Be-mE_rx.js} +1 -1
- package/payload/server/public/assets/{chunk-67CJDMHE-DXxH9Snb.js → chunk-67CJDMHE-DPsemed2.js} +1 -1
- package/payload/server/public/assets/{chunk-7N4EOEYR-CCkxuP7A.js → chunk-7N4EOEYR-BQRQJETl.js} +1 -1
- package/payload/server/public/assets/{chunk-AA7GKIK3-CyItuM8d.js → chunk-AA7GKIK3-B1wcAVCK.js} +1 -1
- package/payload/server/public/assets/{chunk-BSJP7CBP-Bg7gxYNf.js → chunk-BSJP7CBP-DIua053h.js} +1 -1
- package/payload/server/public/assets/{chunk-CIAEETIT-BAXbOqv5.js → chunk-CIAEETIT-C9GHSCS9.js} +1 -1
- package/payload/server/public/assets/{chunk-EDXVE4YY-vdoErQoc.js → chunk-EDXVE4YY-C1T3l1xj.js} +1 -1
- package/payload/server/public/assets/{chunk-ENJZ2VHE-Cz_z_6GK.js → chunk-ENJZ2VHE-8kPcXEQC.js} +1 -1
- package/payload/server/public/assets/{chunk-FMBD7UC4-Ck2jvOgW.js → chunk-FMBD7UC4-Bhoeq9sD.js} +1 -1
- package/payload/server/public/assets/{chunk-FOC6F5B3-DucR0Qo8.js → chunk-FOC6F5B3-BIBpJi8I.js} +1 -1
- package/payload/server/public/assets/{chunk-ICPOFSXX-DolYDD7g.js → chunk-ICPOFSXX-DELXp6fj.js} +2 -2
- package/payload/server/public/assets/{chunk-K5T4RW27-FRzx7E5I.js → chunk-K5T4RW27-DdckXldP.js} +1 -1
- package/payload/server/public/assets/{chunk-KGLVRYIC-Bb5S4Bmc.js → chunk-KGLVRYIC-BJhXejKT.js} +1 -1
- package/payload/server/public/assets/{chunk-LIHQZDEY-c8VZJ-lU.js → chunk-LIHQZDEY-BSd8nyM2.js} +1 -1
- package/payload/server/public/assets/{chunk-ORNJ4GCN-BAeh-LZ1.js → chunk-ORNJ4GCN-CBi55uxq.js} +1 -1
- package/payload/server/public/assets/{chunk-OYMX7WX6-BUg7Kysh.js → chunk-OYMX7WX6-Dfbzl8xh.js} +1 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-CDnAAZVJ.js +1 -0
- package/payload/server/public/assets/{chunk-U2HBQHQK-K4r17UTk.js → chunk-U2HBQHQK-BN1w8_Cq.js} +1 -1
- package/payload/server/public/assets/{chunk-X2U36JSP-Byh-CyxC.js → chunk-X2U36JSP-CrRay1NJ.js} +1 -1
- package/payload/server/public/assets/{chunk-XPW4576I-DC7lhr93.js → chunk-XPW4576I-C_ZE776O.js} +1 -1
- package/payload/server/public/assets/{chunk-YZCP3GAM-B2cu7AEP.js → chunk-YZCP3GAM-CUSlqWBY.js} +1 -1
- package/payload/server/public/assets/{chunk-ZZ45TVLE-DH_p8sFX.js → chunk-ZZ45TVLE-BdPUfSiD.js} +1 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-BdXUKVrS.js +1 -0
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DAq-uJr_.js +1 -0
- package/payload/server/public/assets/clone-DQl28-jK.js +1 -0
- package/payload/server/public/assets/{cose-bilkent-S5V4N54A-DeM6JI00.js → cose-bilkent-S5V4N54A-D4E9htTz.js} +1 -1
- package/payload/server/public/assets/{dagre-3drs3e4F.js → dagre-D1B5TQL1.js} +1 -1
- package/payload/server/public/assets/{dagre-KV5264BT-C6S-VUtN.js → dagre-KV5264BT-ByuvYV7N.js} +1 -1
- package/payload/server/public/assets/data-CL7CyX1C.js +1 -0
- package/payload/server/public/assets/{diagram-5BDNPKRD-BkvA32I3.js → diagram-5BDNPKRD-B-0KduTa.js} +1 -1
- package/payload/server/public/assets/{diagram-G4DWMVQ6-CVwtRMPB.js → diagram-G4DWMVQ6-CSQmo3eB.js} +1 -1
- package/payload/server/public/assets/{diagram-MMDJMWI5-DJ1JVMbd.js → diagram-MMDJMWI5-DK0kWiB3.js} +1 -1
- package/payload/server/public/assets/{diagram-TYMM5635-rfj-crtX.js → diagram-TYMM5635-CYbK2reZ.js} +1 -1
- package/payload/server/public/assets/{erDiagram-SMLLAGMA-TJPuweS5.js → erDiagram-SMLLAGMA-C-JQHvJF.js} +1 -1
- package/payload/server/public/assets/{flatten-BZkoyJ4e.js → flatten-ROVzlo1u.js} +1 -1
- package/payload/server/public/assets/{flowDiagram-DWJPFMVM-LQWEUjbV.js → flowDiagram-DWJPFMVM-OTOd2czg.js} +1 -1
- package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-DdYsxKRw.js → ganttDiagram-T4ZO3ILL-BWJ778ou.js} +1 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-BM-KaDZy.js +1 -0
- package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-sx8-fokM.js → gitGraphDiagram-UUTBAWPF-CkNcyISe.js} +1 -1
- package/payload/server/public/assets/graph-XZJZHzvv.js +51 -0
- package/payload/server/public/assets/{graph-labels-DigwgCWY.js → graph-labels-Cabqmf35.js} +1 -1
- package/payload/server/public/assets/{graphlib-DixeJdCf.js → graphlib-8z59Ng6C.js} +1 -1
- package/payload/server/public/assets/info-OMHHGYJF-CtZajyAB.js +1 -0
- package/payload/server/public/assets/infoDiagram-42DDH7IO-C-_WYlmI.js +2 -0
- package/payload/server/public/assets/{isEmpty-VRKFml5R.js → isEmpty-DXf_sApt.js} +1 -1
- package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-BKUCuKhZ.js → ishikawaDiagram-UXIWVN3A-Cg7pRRGp.js} +1 -1
- package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-BafZP6pM.js → journeyDiagram-VCZTEJTY-CZT_4r_Z.js} +1 -1
- package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DQ4c6wRv.js → kanban-definition-6JOO6SKY-Dp1Vd5YM.js} +1 -1
- package/payload/server/public/assets/{line-0_x1Wivu.js → line-UPAcwY66.js} +1 -1
- package/payload/server/public/assets/{linear-CZrU-J2V.js → linear-BeeahLKw.js} +1 -1
- package/payload/server/public/assets/maximize-2-DPe-Noig.js +1 -0
- package/payload/server/public/assets/{mermaid-parser.core-DwJ1cyfO.js → mermaid-parser.core-CLKle8df.js} +2 -2
- package/payload/server/public/assets/{mermaid.core-DnUst0He.js → mermaid.core-CwRj5rL5.js} +3 -3
- package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-oc-GwerE.js → mindmap-definition-QFDTVHPH-CNQUY9UJ.js} +1 -1
- package/payload/server/public/assets/{operator-D-Ad9OQ5.js → operator-BM_CDyCb.js} +1 -1
- package/payload/server/public/assets/{ordinal-v4prQcuq.js → ordinal-B2r5L1v4.js} +1 -1
- package/payload/server/public/assets/packet-4T2RLAQJ-T-SYedp7.js +1 -0
- package/payload/server/public/assets/{page-BjAKwjlS.js → page-CMIbXzSg.js} +3 -3
- package/payload/server/public/assets/{page-CpSVszGe.js → page-E7I5sEVt.js} +1 -1
- package/payload/server/public/assets/{pdf-render-NQmflZ7K.js → pdf-render-m08Xm2Nm.js} +1 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-BWECFVVd.js +1 -0
- package/payload/server/public/assets/{pieDiagram-DEJITSTG-BnBtQNHM.js → pieDiagram-DEJITSTG-Scnq58FX.js} +1 -1
- package/payload/server/public/assets/{public-CbkiISZZ.js → public-CrdWCSk2.js} +1 -1
- package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CkNqtzHI.js → quadrantDiagram-34T5L4WZ-wPfZo_vs.js} +1 -1
- package/payload/server/public/assets/radar-PYXPWWZC-Dx0YUklX.js +1 -0
- package/payload/server/public/assets/{reduce-0Mm1v1Rr.js → reduce-CFlDlJf5.js} +1 -1
- package/payload/server/public/assets/{requirementDiagram-MS252O5E-D7qc27KT.js → requirementDiagram-MS252O5E-yYkH12K2.js} +1 -1
- package/payload/server/public/assets/{rotate-ccw-BYmlylsD.js → rotate-ccw-Dwtj0NJ7.js} +1 -1
- package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-2Y4sqRY7.js → sankeyDiagram-XADWPNL6-fVWRBzzV.js} +1 -1
- package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-hXOiSHuT.js → sequenceDiagram-FGHM5R23-Dbap3X6h.js} +1 -1
- package/payload/server/public/assets/{stateDiagram-FHFEXIEX-Dq4hhkLA.js → stateDiagram-FHFEXIEX-DkPLAqIh.js} +1 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DceWO1u6.js +1 -0
- package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-Dn9wBUEw.js → timeline-definition-GMOUNBTQ-DabKBJyd.js} +1 -1
- package/payload/server/public/assets/treeView-SZITEDCU-C3197Rac.js +1 -0
- package/payload/server/public/assets/treemap-W4RFUUIX-BPrpx29h.js +1 -0
- package/payload/server/public/assets/{useSubAccountSwitcher-DxHQSOzT.css → useSubAccountSwitcher-BH-YjP0H.css} +1 -1
- package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BKVHJiIt.js → vennDiagram-DHZGUBPP-CaKT7c-c.js} +1 -1
- package/payload/server/public/assets/wardley-RL74JXVD-DW4Jlbhw.js +1 -0
- package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Bn9vvpdK.js → wardleyDiagram-NUSXRM2D-BZ5TTSOL.js} +1 -1
- package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-FIoMdPB3.js → xychartDiagram-5P7HB3ND-CLfeklJ9.js} +1 -1
- package/payload/server/public/browser.html +4 -4
- package/payload/server/public/calendar.html +5 -5
- package/payload/server/public/chat.html +10 -9
- package/payload/server/public/data.html +9 -8
- package/payload/server/public/graph.html +9 -8
- package/payload/server/public/index.html +12 -11
- package/payload/server/public/operator.html +12 -11
- package/payload/server/public/public.html +10 -9
- package/payload/server/server.js +41 -6
- package/payload/server/public/assets/architecture-YZFGNWBL-DdgmZ93B.js +0 -1
- package/payload/server/public/assets/channel-Da-UUyqx.js +0 -1
- package/payload/server/public/assets/chat-L6IVvC9k.js +0 -1
- package/payload/server/public/assets/chevron-left-uJSGyCGe.js +0 -1
- package/payload/server/public/assets/chunk-426QAEUC-B1kFAxo1.js +0 -1
- package/payload/server/public/assets/chunk-QZHKN3VN-BjE-Glwf.js +0 -1
- package/payload/server/public/assets/classDiagram-6PBFFD2Q-Dol3Ogeh.js +0 -1
- package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-VUMj7gWH.js +0 -1
- package/payload/server/public/assets/clone-m7oGrdBC.js +0 -1
- package/payload/server/public/assets/data-4K_negqE.js +0 -1
- package/payload/server/public/assets/gitGraph-7Q5UKJZL-cJEaiQq4.js +0 -1
- package/payload/server/public/assets/graph-UHR4Ez-V.js +0 -51
- package/payload/server/public/assets/info-OMHHGYJF-BUxfOTKa.js +0 -1
- package/payload/server/public/assets/infoDiagram-42DDH7IO-CD-d3Rgf.js +0 -2
- package/payload/server/public/assets/packet-4T2RLAQJ-B9U_2639.js +0 -1
- package/payload/server/public/assets/pie-ZZUOXDRM-Glh-lJOT.js +0 -1
- package/payload/server/public/assets/radar-PYXPWWZC-CTSgob8w.js +0 -1
- package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DTj9o2vZ.js +0 -1
- package/payload/server/public/assets/treeView-SZITEDCU-CXApkW1l.js +0 -1
- package/payload/server/public/assets/treemap-W4RFUUIX-DzvTXAcT.js +0 -1
- package/payload/server/public/assets/wardley-RL74JXVD-BExXV4oI.js +0 -1
- /package/payload/server/public/assets/{_baseFor-C0Y1mc3g.js → _baseFor-BVuIxZJh.js} +0 -0
- /package/payload/server/public/assets/{array-DqLCdDFv.js → array-B9UHiPd-.js} +0 -0
- /package/payload/server/public/assets/{cytoscape.esm-Cn5b4Cdu.js → cytoscape.esm-D5_TRwB-.js} +0 -0
- /package/payload/server/public/assets/{defaultLocale-CrJzLgRD.js → defaultLocale-5eAKkKJC.js} +0 -0
- /package/payload/server/public/assets/{dist-Dlks0Bfw.js → dist-CADCHk0t.js} +0 -0
- /package/payload/server/public/assets/{init-C0r9Gk5G.js → init-DlZdxViB.js} +0 -0
- /package/payload/server/public/assets/{katex-BFwFoEts.js → katex-Xo0SyWvP.js} +0 -0
- /package/payload/server/public/assets/{path-DIKpVbHL.js → path-6uRLdFF7.js} +0 -0
- /package/payload/server/public/assets/{preload-helper-C5gCWwwF.js → preload-helper-CvXuAEud.js} +0 -0
- /package/payload/server/public/assets/{rough.esm-DsHEmXUZ.js → rough.esm-Djo4Abte.js} +0 -0
- /package/payload/server/public/assets/{src-Bv7ZWAzF.js → src-Bi0fLV9t.js} +0 -0
- /package/payload/server/public/assets/{useSubAccountSwitcher-BRWAIbzr.js → useSubAccountSwitcher-BVCMAnWK.js} +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# E-signing
|
|
2
|
+
|
|
3
|
+
When a deployed page carries a document that must be signed — a quote, a proposal,
|
|
4
|
+
terms, a contract — the signing is owned end to end by the `business-assistant:e-sign`
|
|
5
|
+
skill. This plugin routes to it; it does not re-implement any signing, recording,
|
|
6
|
+
stamping, or dispatch mechanics, because those carry a legal and compliance basis
|
|
7
|
+
that must not be forked.
|
|
8
|
+
|
|
9
|
+
## What e-sign owns
|
|
10
|
+
|
|
11
|
+
`business-assistant:e-sign` deploys the document to Cloudflare Pages keyed by a
|
|
12
|
+
`DOC_REF`, captures a signer's name, email, and an intent-and-consent tick through
|
|
13
|
+
a Pages Function into a shared D1 `acceptances` table (with a one-acceptance-per-
|
|
14
|
+
document database lock), renders a base PDF once and stamps an Electronic
|
|
15
|
+
Acceptance Certificate onto it at dispatch, and emails the stamped PDF to owner and
|
|
16
|
+
signer — inside a live operator session only. Its legal basis is a simple
|
|
17
|
+
electronic signature admissible under UK ECA 2000 s.7 and the simple-signature tier
|
|
18
|
+
of UK eIDAS. Its full outcome contract and failure signals are in that skill.
|
|
19
|
+
|
|
20
|
+
## The hand-off
|
|
21
|
+
|
|
22
|
+
1. Build and deploy the document page as its own site (this plugin's `web-design`
|
|
23
|
+
plus `references/deploy.md`), so it has a stable URL.
|
|
24
|
+
2. Load `business-assistant:e-sign` and let it take over capture, D1 recording,
|
|
25
|
+
PDF stamping, and dispatch for that `DOC_REF`.
|
|
26
|
+
3. If the document must also sit behind a login, apply `references/gating.md`
|
|
27
|
+
first — gate the document path **and** the `/api/*` signing endpoints on the
|
|
28
|
+
same origin, and confirm the gate-probe.
|
|
29
|
+
|
|
30
|
+
Immutability holds: once a `DOC_REF` has an acceptance recorded, the deployed
|
|
31
|
+
document is never edited. Changed terms are a new `DOC_REF` and a fresh deploy.
|
|
32
|
+
|
|
33
|
+
## Editions
|
|
34
|
+
|
|
35
|
+
E-signing is the one feature that is **not** self-contained in the marketplace
|
|
36
|
+
edition. It depends on the `business-assistant:e-sign` skill being present on the
|
|
37
|
+
host. A standalone install that needs signing must carry that skill; without it,
|
|
38
|
+
this plugin builds and deploys the document but does not sign it. This is a stated
|
|
39
|
+
host dependency, not a silent gap.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Gated access (Cloudflare Access)
|
|
2
|
+
|
|
3
|
+
Put a deployed page — or one document path on it — behind a login. This composes
|
|
4
|
+
the proven Cloudflare Access pattern; it authors no new gating mechanics. The
|
|
5
|
+
complete, operationally-validated steps live in the host references:
|
|
6
|
+
|
|
7
|
+
- `cloudflare/references/api.md` § Access — token minting and the Access app +
|
|
8
|
+
policy endpoints (`POST /accounts/${ACC}/access/apps`,
|
|
9
|
+
`.../apps/{app_id}/policies`), with the Access token resolved by
|
|
10
|
+
`cf-token.sh access`.
|
|
11
|
+
- `business-assistant/skills/e-sign/SKILL.md` § 1a — the full gating design,
|
|
12
|
+
proven on real deployments.
|
|
13
|
+
|
|
14
|
+
Follow those. This note names the load-bearing invariants so a gating run does not
|
|
15
|
+
skip one.
|
|
16
|
+
|
|
17
|
+
## The invariants that make or break a gate
|
|
18
|
+
|
|
19
|
+
- **Identity provider first.** An Access app and policy do not enable a login
|
|
20
|
+
method. If zero identity providers exist when the gate goes live, the login page
|
|
21
|
+
offers nothing and locks everyone out, including the operator. List providers
|
|
22
|
+
(`GET /accounts/${ACC}/access/identity_providers`) and confirm the set is
|
|
23
|
+
non-empty before creating the app. For external visitors who belong to no
|
|
24
|
+
organisation, **One-Time PIN** is the correct provider — it emails a code to any
|
|
25
|
+
allowlisted address.
|
|
26
|
+
- **Gate the document path and `/api/*` together, same origin.** Gate the document
|
|
27
|
+
path(s) and the form/signing endpoints (`/api/*`), and leave `/` and static
|
|
28
|
+
assets public so the neutral root portal loads without a PIN. Gating only the
|
|
29
|
+
document path is a bypass: anyone can POST to an ungated `/api/*` and forge a
|
|
30
|
+
submission. The `/api/*` handlers must be Pages Functions of the **same** Pages
|
|
31
|
+
project as the gated document — a second origin escapes the gate.
|
|
32
|
+
- **Verify with a gate-probe.** Unauthenticated (no Access session, no cookies),
|
|
33
|
+
POST and GET each `/api/*` endpoint against the live origin. Each must return
|
|
34
|
+
**302** (Access login) or **403** — never 200/400/409/500 (those are
|
|
35
|
+
function-originated and prove the API is ungated). This is the only check that
|
|
36
|
+
catches a split-origin escape.
|
|
37
|
+
- **Ship a neutral root portal.** A gated host must serve a `/` page: Cloudflare
|
|
38
|
+
lands visitors on the bare root after logout and sometimes after login, so no `/`
|
|
39
|
+
page is a 404 on a client-facing site. The root names no document, branches on no
|
|
40
|
+
auth state, and needs zero change when a second gated document is added. Build
|
|
41
|
+
logout links as `/cdn-cgi/access/logout?returnTo=https://<host>/` (camelCase
|
|
42
|
+
`returnTo`, pointing at the public root).
|
|
43
|
+
- **Token caveats.** "Access: Apps and Policies Write" can resolve to more than one
|
|
44
|
+
permission-group id; the wrong one poisons the token (a persistent `10000` on
|
|
45
|
+
every call). Verify a freshly-minted Access token with a read
|
|
46
|
+
(`GET /accounts/${ACC}/access/apps`) before relying on it. Update apps with
|
|
47
|
+
`PUT` and the full body, not `PATCH` (`PATCH` returns `10405` under API-token
|
|
48
|
+
auth). `cf-token.sh access` already handles the poison-id retry.
|
|
49
|
+
|
|
50
|
+
## Editions
|
|
51
|
+
|
|
52
|
+
The token is resolved through the same seam as deploy (`bin/resolve-cf.sh
|
|
53
|
+
token-key`), so gating works in both editions once an Access-scoped token is
|
|
54
|
+
available. Inside maxy-code that token is minted and persisted by
|
|
55
|
+
`cf-token.sh access`; standalone it is an Access-scoped `CLOUDFLARE_API_TOKEN`.
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Placeholder reference
|
|
2
|
+
|
|
3
|
+
Every `{{ TOKEN }}` in the templates and what fills it. After substitution,
|
|
4
|
+
`grep "{{"` across the output must return nothing. Never invent a value — if a
|
|
5
|
+
token has no source, go back to the operator and ask.
|
|
6
|
+
|
|
7
|
+
## Brand tokens (palette) — from `brand-extract`
|
|
8
|
+
|
|
9
|
+
`INK_900` `INK_700` `INK_400` (text: primary / secondary / muted) ·
|
|
10
|
+
`PAPER_100` `PAPER_200` (white surface / page-bg tint) · `RULE_100` (dividers) ·
|
|
11
|
+
`ACCENT` (brand accent) · `ACCENT_TEXT` (accent **deepened** for legible small
|
|
12
|
+
text) · `ACCENT_SOFT` (pale accent wash) · `BRAND_GREY` (logo grey).
|
|
13
|
+
|
|
14
|
+
## Identity
|
|
15
|
+
|
|
16
|
+
`COMPANY_NAME` (trading name) · `COMPANY_LEGAL_NAME` · `COMPANY_SHORT` (monogram /
|
|
17
|
+
initials) · `TAGLINE` · `SECTOR_LABEL` (what the business is, e.g. "Chartered
|
|
18
|
+
accountants", "Dental practice", "Design studio" — operator-supplied, no default
|
|
19
|
+
category) · `ESTABLISHED_YEAR` · `YEARS_TRADING` (e.g. "over 15 years") ·
|
|
20
|
+
`OWNERSHIP` (e.g. "Independently owned") · `COMPANY_NUMBER` ·
|
|
21
|
+
`COMPANY_NUMBER_LABEL` (what to call that number in structured data — e.g.
|
|
22
|
+
"Company number" in the UK, "EIN" in the US; jurisdiction-driven, no country
|
|
23
|
+
baked in) · `COMPANY_JURISDICTION` · `COPYRIGHT_YEAR`.
|
|
24
|
+
|
|
25
|
+
## Contact & place
|
|
26
|
+
|
|
27
|
+
`PHONE_DISPLAY` `PHONE_TEL` `PHONE_INTL` · `MOBILE_DISPLAY` `MOBILE_TEL` ·
|
|
28
|
+
`EMAIL` · `WEBSITE_URL` (note the trailing slash; `og:image` and JSON-LD build on
|
|
29
|
+
it) · `STREET_ADDRESS` `POST_TOWN` `LOCALITY` `COUNTY` `POSTCODE` · `COUNTRY_CODE` (the ISO 3166-1 alpha-2 country for the
|
|
30
|
+
JSON-LD `addressCountry`, e.g. `GB`, `US`, `IE` — operator-supplied, no country
|
|
31
|
+
baked in) · `REGION` (service-area phrase) `REGION_2` (secondary area) ·
|
|
32
|
+
`FACEBOOK_URL` `INSTAGRAM_URL` `TIKTOK_URL`.
|
|
33
|
+
|
|
34
|
+
## Hero info-card
|
|
35
|
+
|
|
36
|
+
`HERO_STRAPLINE` · `HERO_META` (the one-line summary of what the business offers) ·
|
|
37
|
+
`HERO_SPEC_1..4` (four short credential cells). `HERO_1_ALT..HERO_10_ALT` are the
|
|
38
|
+
ten hero-slide alts — rewrite each to describe the real photo.
|
|
39
|
+
|
|
40
|
+
## Body blocks (Story / What we do / How we work)
|
|
41
|
+
|
|
42
|
+
`STORY_HEADLINE` `STORY_PARA_1` `STORY_PARA_2` ·
|
|
43
|
+
`BUILD_HEADLINE` `BUILD_PARA_1..3` (the "What we do" block; each paragraph may open
|
|
44
|
+
with a `<strong>lead-in.</strong>`) ·
|
|
45
|
+
`CRAFT_HEADLINE` `CRAFT_PARA_1..3` (the "How we work" block).
|
|
46
|
+
|
|
47
|
+
The `BUILD_*` / `CRAFT_*` token names are historical; the visible sections read
|
|
48
|
+
**What we do** and **How we work**. Fill them with the business's real offer and
|
|
49
|
+
way of working, in plain language.
|
|
50
|
+
|
|
51
|
+
## Photo alts (grids and full-bleed)
|
|
52
|
+
|
|
53
|
+
`GRID_1_ALT..GRID_12_ALT` (the photo-grid cells, in document order) ·
|
|
54
|
+
`FULLBLEED_1_ALT` (the one full-width intermission image). Rewrite every alt to
|
|
55
|
+
the real photo; the template ships none baked in.
|
|
56
|
+
|
|
57
|
+
## Founder / team-lead section
|
|
58
|
+
|
|
59
|
+
`FOUNDER_SECTION_LABEL` (eyebrow) · `FOUNDER_NAME` · `FOUNDER_PORTRAIT_ALT` ·
|
|
60
|
+
`FOUNDER_HEADLINE` `FOUNDER_INTRO` `FOUNDER_QUOTE` `FOUNDER_ETHOS` ·
|
|
61
|
+
`FEATURE_PROJECT_ALT` `FEATURE_PROJECT_CAPTION` · `GIFT_ALT` `GIFT_CAPTION` ·
|
|
62
|
+
`UPDATES_LABEL` (defaults to "Latest updates") · `UPDATE_1..3_LOC`
|
|
63
|
+
`UPDATE_1..3_TEXT` (short "latest update" cards). This whole section is optional —
|
|
64
|
+
drop it when the business has no single figurehead.
|
|
65
|
+
|
|
66
|
+
## Testimonial
|
|
67
|
+
|
|
68
|
+
`TESTIMONIAL_ALT` (the image beside the quote) · `TESTIMONIAL_QUOTE` (verbatim;
|
|
69
|
+
wrap the highlight clause in `<span class="hl">…</span>`) · `TESTIMONIAL_ATTRIB` ·
|
|
70
|
+
`TESTIMONIAL_CONTEXT` · `FOUNDER_AVATAR_ALT` (the small round avatar).
|
|
71
|
+
|
|
72
|
+
## Services
|
|
73
|
+
|
|
74
|
+
`SERVICES_HEADLINE` `SERVICES_LEDE` · `SERVICE_1..6_NAME` `SERVICE_1..6_DESC` ·
|
|
75
|
+
`OFFER_CATALOG_NAME` (JSON-LD). Use fewer than six by deleting surplus service
|
|
76
|
+
cells rather than padding.
|
|
77
|
+
|
|
78
|
+
## Why-us / key facts
|
|
79
|
+
|
|
80
|
+
`WHY_HEADLINE` · `FACT_1..6_KEY` `FACT_1..6_VALUE` · `FACTS_FOOTNOTE`. (The first
|
|
81
|
+
fact row, "Established", uses `ESTABLISHED_YEAR`; Coverage uses `REGION`; Based
|
|
82
|
+
uses `LOCALITY`/`COUNTY`.)
|
|
83
|
+
|
|
84
|
+
## FAQ (visible + JSON-LD use the same tokens)
|
|
85
|
+
|
|
86
|
+
`FAQ_1..5_Q` `FAQ_1..5_A`. Answer-first: the first sentence of each answer is the
|
|
87
|
+
answer-engine lift target.
|
|
88
|
+
|
|
89
|
+
## CTA / footer / meta / schema
|
|
90
|
+
|
|
91
|
+
`CTA_HEADLINE` · `FOOTER_LABEL` `FOOTER_LEGAL` · `META_DESCRIPTION`
|
|
92
|
+
`META_DESCRIPTION_SHORT` · `SCHEMA_TYPE` `SCHEMA_DESCRIPTION` · `PAGE_LANG` (the
|
|
93
|
+
`<html lang>` BCP-47 tag, e.g. `en-GB`, `en-US`, `fr` — operator-supplied, no
|
|
94
|
+
locale baked in).
|
|
95
|
+
|
|
96
|
+
`SCHEMA_TYPE` is the schema.org type for the business and is **operator-supplied**.
|
|
97
|
+
Its default is `LocalBusiness` (use `Organization` for a business with no physical
|
|
98
|
+
premises, or a more specific schema.org subtype when one fits — `Dentist`,
|
|
99
|
+
`AccountingService`, `ProfessionalService`, and so on). No trade or industry type
|
|
100
|
+
is baked in as a default.
|
|
101
|
+
|
|
102
|
+
## llms.txt
|
|
103
|
+
|
|
104
|
+
`LLMS_SUMMARY` (the one-paragraph elevator summary) · `RECENT_PROJECTS`.
|
|
105
|
+
|
|
106
|
+
## Social tiles
|
|
107
|
+
|
|
108
|
+
The `socials` skill owns its own tokens and template set. It reads the built
|
|
109
|
+
`site/` (brand tokens, logo, hero photos) as its source; it does not add tokens to
|
|
110
|
+
these templates. See [`../../socials/SKILL.md`](../../socials/SKILL.md).
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Section catalogue & image map
|
|
2
|
+
|
|
3
|
+
The single page runs top to bottom in this order. Each section is in the canonical
|
|
4
|
+
`templates/index.html`; this is the map, not a rebuild instruction.
|
|
5
|
+
|
|
6
|
+
| # | Section | What it is | Images |
|
|
7
|
+
|---|---|---|---|
|
|
8
|
+
| 1 | Top nav | Centred logo, deep links left, utility links right; collapses to a hamburger drawer ≤ 1240px | `logo.png` |
|
|
9
|
+
| 2 | Hero | Up to 10-slide JS rotator with a slow Ken-Burns push-in (reduced-motion holds slide 1); floating info-card with tag, name, strapline, tagline, four credential cells, links, CTA | `hero-01..10.webp` |
|
|
10
|
+
| 3 | Sticky sub-nav | Reveals after the hero scrolls past | — |
|
|
11
|
+
| 4 | About (Story) | Eyebrow + headline + two drop-capped paragraphs | grid after: `grid-01..04` |
|
|
12
|
+
| 5 | What we do | Headline + three paragraphs (each a `<strong>` lead-in) | grids: `grid-05..08` |
|
|
13
|
+
| 6 | How we work | Headline + three paragraphs | full-bleed `fullbleed-01`; grid `grid-09..12` |
|
|
14
|
+
| 7 | Founder / team-lead | Portrait + intro + quote + ethos; a feature image and a second figure, bottom-aligned; three "latest update" cards. Optional — drop when there is no single figurehead | `founder-portrait`, `feature-project`, `gift` |
|
|
15
|
+
| 8 | Testimonial | Dark band: an image + verbatim client quote (highlight clause) + small avatar | `testimonial`, `founder-avatar` |
|
|
16
|
+
| 9 | Services | 3×2 grid of up to six services (name + one-line description) | — |
|
|
17
|
+
| 10 | Why-us / key facts | 3-column grid of six key/value facts + footnote | — |
|
|
18
|
+
| 11 | FAQ | Answer-first Q/A (matched by `FAQPage` JSON-LD) — answer-engine lift targets | — |
|
|
19
|
+
| 12 | CTA strip | Accent band: tagline eyebrow, headline, phone / mobile / enquiry | — |
|
|
20
|
+
| 13 | Footer | Contact column + legal paragraph (bottom-aligned) + colophon with the icon | `icon.png` |
|
|
21
|
+
| — | Back-to-top | Fixed button, fades in past the hero | — |
|
|
22
|
+
|
|
23
|
+
The section anchors are `#story` (About), `#offer` (What we do), `#how` (How we
|
|
24
|
+
work), `#founder`, `#words` (Testimonial), `#services`, `#facts`, `#faq`.
|
|
25
|
+
|
|
26
|
+
## Image-naming convention
|
|
27
|
+
|
|
28
|
+
Curate the operator's photos into these names under `site/images/` (webp):
|
|
29
|
+
|
|
30
|
+
- `hero-01..hero-10` — rotator. Pick varied, strong shots; lead with the best
|
|
31
|
+
"arrive here" image. The rotator cycles however many `.hero-slide` elements
|
|
32
|
+
exist, so fewer than 10 is fine — just delete the surplus slides.
|
|
33
|
+
- `grid-01..grid-12` — photo grids, in document order.
|
|
34
|
+
- `fullbleed-01` — the one full-width intermission image (a wide, strong shot).
|
|
35
|
+
- `founder-portrait` (tall) and `founder-avatar` (square crop) — the person, if
|
|
36
|
+
the business has a figurehead.
|
|
37
|
+
- `feature-project`, `gift` — the founder-section feature image and second figure.
|
|
38
|
+
- `testimonial` — the image beside the client quote.
|
|
39
|
+
- `logo.png`, `icon.png` — from `brand-extract`.
|
|
40
|
+
|
|
41
|
+
A photo of a **person** belongs only in the founder/testimonial slots and the
|
|
42
|
+
portrait social tile. It is never a hero-rotator landscape crop (the head gets cut).
|
|
43
|
+
|
|
44
|
+
## Honesty notes
|
|
45
|
+
|
|
46
|
+
- The 10-slide hero and the full grid set assume a reasonably deep photo library.
|
|
47
|
+
With fewer photos, reduce slides and drop grids rather than repeating images.
|
|
48
|
+
- Alts must describe the actual photo. The template ships alt **tokens**, not
|
|
49
|
+
sentences — every `{{ *_ALT }}` is filled from the real image, verified by eye,
|
|
50
|
+
never trusted from a filename.
|
|
51
|
+
- The founder section, the testimonial, and any service cell can be dropped when
|
|
52
|
+
the business does not have that thing. A shorter honest page beats a padded one.
|