@rubytech/create-maxy-code 0.1.398 → 0.1.400

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.
Files changed (186) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -0
  3. package/payload/platform/plugins/admin/skills/platform-architecture/SKILL.md +17 -1
  4. package/payload/platform/plugins/docs/references/graph.md +15 -0
  5. package/payload/platform/plugins/docs/references/plugins-guide.md +1 -0
  6. package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.d.ts +2 -0
  7. package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.d.ts.map +1 -0
  8. package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.js +123 -0
  9. package/payload/platform/plugins/email/mcp/dist/__tests__/connect-timeout-observability.test.js.map +1 -0
  10. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts +9 -0
  11. package/payload/platform/plugins/email/mcp/dist/lib/imap.d.ts.map +1 -1
  12. package/payload/platform/plugins/email/mcp/dist/lib/imap.js +36 -12
  13. package/payload/platform/plugins/email/mcp/dist/lib/imap.js.map +1 -1
  14. package/payload/platform/plugins/email/mcp/dist/lib/smtp.d.ts.map +1 -1
  15. package/payload/platform/plugins/email/mcp/dist/lib/smtp.js +18 -1
  16. package/payload/platform/plugins/email/mcp/dist/lib/smtp.js.map +1 -1
  17. package/payload/platform/plugins/memory/references/schema-estate-agent.md +2 -0
  18. package/payload/platform/plugins/web-designer/.claude-plugin/plugin.json +8 -0
  19. package/payload/platform/plugins/web-designer/PLUGIN.md +46 -0
  20. package/payload/platform/plugins/web-designer/bin/resolve-cf.sh +56 -0
  21. package/payload/platform/plugins/web-designer/skills/brand-extract/SKILL.md +86 -0
  22. package/payload/platform/plugins/web-designer/skills/socials/SKILL.md +139 -0
  23. package/payload/platform/plugins/web-designer/skills/socials/references/pii-strip.md +64 -0
  24. package/payload/platform/plugins/web-designer/skills/socials/references/sources.md +66 -0
  25. package/payload/platform/plugins/web-designer/skills/socials/templates/og.html +92 -0
  26. package/payload/platform/plugins/web-designer/skills/socials/templates/social-posts.md +46 -0
  27. package/payload/platform/plugins/web-designer/skills/socials/templates/socials.html +87 -0
  28. package/payload/platform/plugins/web-designer/skills/web-design/SKILL.md +98 -0
  29. package/payload/platform/plugins/web-designer/skills/web-design/references/deploy.md +59 -0
  30. package/payload/platform/plugins/web-designer/skills/web-design/references/e-sign.md +39 -0
  31. package/payload/platform/plugins/web-designer/skills/web-design/references/gating.md +55 -0
  32. package/payload/platform/plugins/web-designer/skills/web-design/references/placeholders.md +110 -0
  33. package/payload/platform/plugins/web-designer/skills/web-design/references/sections.md +52 -0
  34. package/payload/platform/plugins/web-designer/skills/web-design/templates/index.html +1004 -0
  35. package/payload/platform/plugins/web-designer/skills/web-design/templates/llms.txt +32 -0
  36. package/payload/platform/plugins/web-designer/skills/web-intake/SKILL.md +107 -0
  37. package/payload/platform/plugins/web-designer/skills/web-intake/references/intake.md +103 -0
  38. package/payload/platform/plugins/whatsapp/PLUGIN.md +7 -1
  39. package/payload/platform/scripts/merge-whatsapp-split-conversations.mjs +264 -0
  40. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  41. package/payload/platform/services/claude-session-manager/dist/http-server.js +22 -6
  42. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  43. package/payload/server/public/assets/{AdminLoginScreens-Bex48co9.js → AdminLoginScreens-rlk263u9.js} +1 -1
  44. package/payload/server/public/assets/{AdminShell-BOmS1NPG.js → AdminShell-C5vWTy2n.js} +1 -1
  45. package/payload/server/public/assets/{Checkbox-DDlXC5tq.js → Checkbox-Chz6bfy-.js} +1 -1
  46. package/payload/server/public/assets/{Transcript-CwItbNkx.js → Transcript-Bsx-bGgY.js} +2 -2
  47. package/payload/server/public/assets/{admin-n9zWE158.js → admin-BnZH758N.js} +1 -1
  48. package/payload/server/public/assets/{arc-C6-nr5UV.js → arc-DyzjCWmw.js} +1 -1
  49. package/payload/server/public/assets/architecture-YZFGNWBL-XiVs-N7Z.js +1 -0
  50. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-DIdho_T6.js → architectureDiagram-Q4EWVU46-qWfElD16.js} +1 -1
  51. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-D5rTTBSy.js → blockDiagram-DXYQGD6D-DO2fFHC3.js} +1 -1
  52. package/payload/server/public/assets/{browser-CI8DR1YG.js → browser-CIrfyZWe.js} +1 -1
  53. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-pfUVHdmy.js → c4Diagram-AHTNJAMY-Ca-q5gDe.js} +1 -1
  54. package/payload/server/public/assets/{calendar-WuIAN47H.js → calendar-D6Z8Kmrn.js} +1 -1
  55. package/payload/server/public/assets/channel-CYBkRz7E.js +1 -0
  56. package/payload/server/public/assets/chat-h7SytZHx.js +1 -0
  57. package/payload/server/public/assets/chevron-left-DSTeS1_g.js +1 -0
  58. package/payload/server/public/assets/{chunk-2KRD3SAO-EF6cdj8U.js → chunk-2KRD3SAO-CX2PxuDw.js} +1 -1
  59. package/payload/server/public/assets/{chunk-336JU56O-DE-lcZAc.js → chunk-336JU56O-D8l6U4Ne.js} +2 -2
  60. package/payload/server/public/assets/chunk-426QAEUC-CPhOHriU.js +1 -0
  61. package/payload/server/public/assets/{chunk-4BX2VUAB--ANCzzyn.js → chunk-4BX2VUAB-CG32Lkbh.js} +1 -1
  62. package/payload/server/public/assets/{chunk-4TB4RGXK-DTO_X80J.js → chunk-4TB4RGXK-BnAQbO-v.js} +1 -1
  63. package/payload/server/public/assets/{chunk-55IACEB6-4J3nrz44.js → chunk-55IACEB6-ejqRH2M5.js} +1 -1
  64. package/payload/server/public/assets/{chunk-5FUZZQ4R-jH_eqAHL.js → chunk-5FUZZQ4R-ClkicQ-T.js} +1 -1
  65. package/payload/server/public/assets/{chunk-5PVQY5BW-C-qU6p6k.js → chunk-5PVQY5BW-Be-mE_rx.js} +1 -1
  66. package/payload/server/public/assets/{chunk-67CJDMHE-DXxH9Snb.js → chunk-67CJDMHE-DPsemed2.js} +1 -1
  67. package/payload/server/public/assets/{chunk-7N4EOEYR-CCkxuP7A.js → chunk-7N4EOEYR-BQRQJETl.js} +1 -1
  68. package/payload/server/public/assets/{chunk-AA7GKIK3-CyItuM8d.js → chunk-AA7GKIK3-B1wcAVCK.js} +1 -1
  69. package/payload/server/public/assets/{chunk-BSJP7CBP-Bg7gxYNf.js → chunk-BSJP7CBP-DIua053h.js} +1 -1
  70. package/payload/server/public/assets/{chunk-CIAEETIT-BAXbOqv5.js → chunk-CIAEETIT-C9GHSCS9.js} +1 -1
  71. package/payload/server/public/assets/{chunk-EDXVE4YY-vdoErQoc.js → chunk-EDXVE4YY-C1T3l1xj.js} +1 -1
  72. package/payload/server/public/assets/{chunk-ENJZ2VHE-Cz_z_6GK.js → chunk-ENJZ2VHE-8kPcXEQC.js} +1 -1
  73. package/payload/server/public/assets/{chunk-FMBD7UC4-Ck2jvOgW.js → chunk-FMBD7UC4-Bhoeq9sD.js} +1 -1
  74. package/payload/server/public/assets/{chunk-FOC6F5B3-DucR0Qo8.js → chunk-FOC6F5B3-BIBpJi8I.js} +1 -1
  75. package/payload/server/public/assets/{chunk-ICPOFSXX-DolYDD7g.js → chunk-ICPOFSXX-DELXp6fj.js} +2 -2
  76. package/payload/server/public/assets/{chunk-K5T4RW27-FRzx7E5I.js → chunk-K5T4RW27-DdckXldP.js} +1 -1
  77. package/payload/server/public/assets/{chunk-KGLVRYIC-Bb5S4Bmc.js → chunk-KGLVRYIC-BJhXejKT.js} +1 -1
  78. package/payload/server/public/assets/{chunk-LIHQZDEY-c8VZJ-lU.js → chunk-LIHQZDEY-BSd8nyM2.js} +1 -1
  79. package/payload/server/public/assets/{chunk-ORNJ4GCN-BAeh-LZ1.js → chunk-ORNJ4GCN-CBi55uxq.js} +1 -1
  80. package/payload/server/public/assets/{chunk-OYMX7WX6-BUg7Kysh.js → chunk-OYMX7WX6-Dfbzl8xh.js} +1 -1
  81. package/payload/server/public/assets/chunk-QZHKN3VN-CDnAAZVJ.js +1 -0
  82. package/payload/server/public/assets/{chunk-U2HBQHQK-K4r17UTk.js → chunk-U2HBQHQK-BN1w8_Cq.js} +1 -1
  83. package/payload/server/public/assets/{chunk-X2U36JSP-Byh-CyxC.js → chunk-X2U36JSP-CrRay1NJ.js} +1 -1
  84. package/payload/server/public/assets/{chunk-XPW4576I-DC7lhr93.js → chunk-XPW4576I-C_ZE776O.js} +1 -1
  85. package/payload/server/public/assets/{chunk-YZCP3GAM-B2cu7AEP.js → chunk-YZCP3GAM-CUSlqWBY.js} +1 -1
  86. package/payload/server/public/assets/{chunk-ZZ45TVLE-DH_p8sFX.js → chunk-ZZ45TVLE-BdPUfSiD.js} +1 -1
  87. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BdXUKVrS.js +1 -0
  88. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-DAq-uJr_.js +1 -0
  89. package/payload/server/public/assets/clone-DQl28-jK.js +1 -0
  90. package/payload/server/public/assets/{cose-bilkent-S5V4N54A-DeM6JI00.js → cose-bilkent-S5V4N54A-D4E9htTz.js} +1 -1
  91. package/payload/server/public/assets/{dagre-3drs3e4F.js → dagre-D1B5TQL1.js} +1 -1
  92. package/payload/server/public/assets/{dagre-KV5264BT-C6S-VUtN.js → dagre-KV5264BT-ByuvYV7N.js} +1 -1
  93. package/payload/server/public/assets/data-CL7CyX1C.js +1 -0
  94. package/payload/server/public/assets/{diagram-5BDNPKRD-BkvA32I3.js → diagram-5BDNPKRD-B-0KduTa.js} +1 -1
  95. package/payload/server/public/assets/{diagram-G4DWMVQ6-CVwtRMPB.js → diagram-G4DWMVQ6-CSQmo3eB.js} +1 -1
  96. package/payload/server/public/assets/{diagram-MMDJMWI5-DJ1JVMbd.js → diagram-MMDJMWI5-DK0kWiB3.js} +1 -1
  97. package/payload/server/public/assets/{diagram-TYMM5635-rfj-crtX.js → diagram-TYMM5635-CYbK2reZ.js} +1 -1
  98. package/payload/server/public/assets/{erDiagram-SMLLAGMA-TJPuweS5.js → erDiagram-SMLLAGMA-C-JQHvJF.js} +1 -1
  99. package/payload/server/public/assets/{flatten-BZkoyJ4e.js → flatten-ROVzlo1u.js} +1 -1
  100. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-LQWEUjbV.js → flowDiagram-DWJPFMVM-OTOd2czg.js} +1 -1
  101. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-DdYsxKRw.js → ganttDiagram-T4ZO3ILL-BWJ778ou.js} +1 -1
  102. package/payload/server/public/assets/gitGraph-7Q5UKJZL-BM-KaDZy.js +1 -0
  103. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-sx8-fokM.js → gitGraphDiagram-UUTBAWPF-CkNcyISe.js} +1 -1
  104. package/payload/server/public/assets/graph-XZJZHzvv.js +51 -0
  105. package/payload/server/public/assets/{graph-labels-DigwgCWY.js → graph-labels-Cabqmf35.js} +1 -1
  106. package/payload/server/public/assets/{graphlib-DixeJdCf.js → graphlib-8z59Ng6C.js} +1 -1
  107. package/payload/server/public/assets/info-OMHHGYJF-CtZajyAB.js +1 -0
  108. package/payload/server/public/assets/infoDiagram-42DDH7IO-C-_WYlmI.js +2 -0
  109. package/payload/server/public/assets/{isEmpty-VRKFml5R.js → isEmpty-DXf_sApt.js} +1 -1
  110. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-BKUCuKhZ.js → ishikawaDiagram-UXIWVN3A-Cg7pRRGp.js} +1 -1
  111. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-BafZP6pM.js → journeyDiagram-VCZTEJTY-CZT_4r_Z.js} +1 -1
  112. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DQ4c6wRv.js → kanban-definition-6JOO6SKY-Dp1Vd5YM.js} +1 -1
  113. package/payload/server/public/assets/{line-0_x1Wivu.js → line-UPAcwY66.js} +1 -1
  114. package/payload/server/public/assets/{linear-CZrU-J2V.js → linear-BeeahLKw.js} +1 -1
  115. package/payload/server/public/assets/maximize-2-DPe-Noig.js +1 -0
  116. package/payload/server/public/assets/{mermaid-parser.core-DwJ1cyfO.js → mermaid-parser.core-CLKle8df.js} +2 -2
  117. package/payload/server/public/assets/{mermaid.core-DnUst0He.js → mermaid.core-CwRj5rL5.js} +3 -3
  118. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-oc-GwerE.js → mindmap-definition-QFDTVHPH-CNQUY9UJ.js} +1 -1
  119. package/payload/server/public/assets/{operator-D-Ad9OQ5.js → operator-BM_CDyCb.js} +1 -1
  120. package/payload/server/public/assets/{ordinal-v4prQcuq.js → ordinal-B2r5L1v4.js} +1 -1
  121. package/payload/server/public/assets/packet-4T2RLAQJ-T-SYedp7.js +1 -0
  122. package/payload/server/public/assets/{page-BjAKwjlS.js → page-CMIbXzSg.js} +3 -3
  123. package/payload/server/public/assets/{page-CpSVszGe.js → page-E7I5sEVt.js} +1 -1
  124. package/payload/server/public/assets/{pdf-render-NQmflZ7K.js → pdf-render-m08Xm2Nm.js} +1 -1
  125. package/payload/server/public/assets/pie-ZZUOXDRM-BWECFVVd.js +1 -0
  126. package/payload/server/public/assets/{pieDiagram-DEJITSTG-BnBtQNHM.js → pieDiagram-DEJITSTG-Scnq58FX.js} +1 -1
  127. package/payload/server/public/assets/{public-CbkiISZZ.js → public-CrdWCSk2.js} +1 -1
  128. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-CkNqtzHI.js → quadrantDiagram-34T5L4WZ-wPfZo_vs.js} +1 -1
  129. package/payload/server/public/assets/radar-PYXPWWZC-Dx0YUklX.js +1 -0
  130. package/payload/server/public/assets/{reduce-0Mm1v1Rr.js → reduce-CFlDlJf5.js} +1 -1
  131. package/payload/server/public/assets/{requirementDiagram-MS252O5E-D7qc27KT.js → requirementDiagram-MS252O5E-yYkH12K2.js} +1 -1
  132. package/payload/server/public/assets/{rotate-ccw-BYmlylsD.js → rotate-ccw-Dwtj0NJ7.js} +1 -1
  133. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-2Y4sqRY7.js → sankeyDiagram-XADWPNL6-fVWRBzzV.js} +1 -1
  134. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-hXOiSHuT.js → sequenceDiagram-FGHM5R23-Dbap3X6h.js} +1 -1
  135. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-Dq4hhkLA.js → stateDiagram-FHFEXIEX-DkPLAqIh.js} +1 -1
  136. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DceWO1u6.js +1 -0
  137. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-Dn9wBUEw.js → timeline-definition-GMOUNBTQ-DabKBJyd.js} +1 -1
  138. package/payload/server/public/assets/treeView-SZITEDCU-C3197Rac.js +1 -0
  139. package/payload/server/public/assets/treemap-W4RFUUIX-BPrpx29h.js +1 -0
  140. package/payload/server/public/assets/{useSubAccountSwitcher-DxHQSOzT.css → useSubAccountSwitcher-BH-YjP0H.css} +1 -1
  141. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-BKVHJiIt.js → vennDiagram-DHZGUBPP-CaKT7c-c.js} +1 -1
  142. package/payload/server/public/assets/wardley-RL74JXVD-DW4Jlbhw.js +1 -0
  143. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Bn9vvpdK.js → wardleyDiagram-NUSXRM2D-BZ5TTSOL.js} +1 -1
  144. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-FIoMdPB3.js → xychartDiagram-5P7HB3ND-CLfeklJ9.js} +1 -1
  145. package/payload/server/public/browser.html +4 -4
  146. package/payload/server/public/calendar.html +5 -5
  147. package/payload/server/public/chat.html +10 -9
  148. package/payload/server/public/data.html +9 -8
  149. package/payload/server/public/graph.html +9 -8
  150. package/payload/server/public/index.html +12 -11
  151. package/payload/server/public/operator.html +12 -11
  152. package/payload/server/public/public.html +10 -9
  153. package/payload/server/server.js +41 -6
  154. package/payload/server/public/assets/architecture-YZFGNWBL-DdgmZ93B.js +0 -1
  155. package/payload/server/public/assets/channel-Da-UUyqx.js +0 -1
  156. package/payload/server/public/assets/chat-L6IVvC9k.js +0 -1
  157. package/payload/server/public/assets/chevron-left-uJSGyCGe.js +0 -1
  158. package/payload/server/public/assets/chunk-426QAEUC-B1kFAxo1.js +0 -1
  159. package/payload/server/public/assets/chunk-QZHKN3VN-BjE-Glwf.js +0 -1
  160. package/payload/server/public/assets/classDiagram-6PBFFD2Q-Dol3Ogeh.js +0 -1
  161. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-VUMj7gWH.js +0 -1
  162. package/payload/server/public/assets/clone-m7oGrdBC.js +0 -1
  163. package/payload/server/public/assets/data-4K_negqE.js +0 -1
  164. package/payload/server/public/assets/gitGraph-7Q5UKJZL-cJEaiQq4.js +0 -1
  165. package/payload/server/public/assets/graph-UHR4Ez-V.js +0 -51
  166. package/payload/server/public/assets/info-OMHHGYJF-BUxfOTKa.js +0 -1
  167. package/payload/server/public/assets/infoDiagram-42DDH7IO-CD-d3Rgf.js +0 -2
  168. package/payload/server/public/assets/packet-4T2RLAQJ-B9U_2639.js +0 -1
  169. package/payload/server/public/assets/pie-ZZUOXDRM-Glh-lJOT.js +0 -1
  170. package/payload/server/public/assets/radar-PYXPWWZC-CTSgob8w.js +0 -1
  171. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-DTj9o2vZ.js +0 -1
  172. package/payload/server/public/assets/treeView-SZITEDCU-CXApkW1l.js +0 -1
  173. package/payload/server/public/assets/treemap-W4RFUUIX-DzvTXAcT.js +0 -1
  174. package/payload/server/public/assets/wardley-RL74JXVD-BExXV4oI.js +0 -1
  175. /package/payload/server/public/assets/{_baseFor-C0Y1mc3g.js → _baseFor-BVuIxZJh.js} +0 -0
  176. /package/payload/server/public/assets/{array-DqLCdDFv.js → array-B9UHiPd-.js} +0 -0
  177. /package/payload/server/public/assets/{cytoscape.esm-Cn5b4Cdu.js → cytoscape.esm-D5_TRwB-.js} +0 -0
  178. /package/payload/server/public/assets/{defaultLocale-CrJzLgRD.js → defaultLocale-5eAKkKJC.js} +0 -0
  179. /package/payload/server/public/assets/{dist-Dlks0Bfw.js → dist-CADCHk0t.js} +0 -0
  180. /package/payload/server/public/assets/{init-C0r9Gk5G.js → init-DlZdxViB.js} +0 -0
  181. /package/payload/server/public/assets/{katex-BFwFoEts.js → katex-Xo0SyWvP.js} +0 -0
  182. /package/payload/server/public/assets/{path-DIKpVbHL.js → path-6uRLdFF7.js} +0 -0
  183. /package/payload/server/public/assets/{preload-helper-C5gCWwwF.js → preload-helper-CvXuAEud.js} +0 -0
  184. /package/payload/server/public/assets/{rough.esm-DsHEmXUZ.js → rough.esm-Djo4Abte.js} +0 -0
  185. /package/payload/server/public/assets/{src-Bv7ZWAzF.js → src-Bi0fLV9t.js} +0 -0
  186. /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.