@rubytech/create-realagent-code 0.1.24 → 0.1.27

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 (577) hide show
  1. package/dist/index.js +81 -17
  2. package/package.json +1 -1
  3. package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -90
  4. package/payload/platform/plugins/admin/PLUGIN.md +46 -23
  5. package/payload/platform/plugins/admin/skills/onboarding/SKILL.md +111 -126
  6. package/payload/platform/plugins/brochures/.claude-plugin/plugin.json +8 -0
  7. package/payload/platform/plugins/brochures/PLUGIN.md +36 -0
  8. package/payload/platform/plugins/brochures/commands/make-brochure.md +11 -0
  9. package/payload/platform/plugins/brochures/skills/a4-print-documents/SKILL.md +478 -0
  10. package/payload/platform/plugins/brochures/skills/brand-design/SKILL.md +192 -0
  11. package/payload/platform/plugins/brochures/skills/make-brochure/SKILL.md +354 -0
  12. package/payload/platform/plugins/brochures/skills/make-brochure/references/seller-brief-template.md +115 -0
  13. package/payload/platform/plugins/brochures/skills/property-brochure/SKILL.md +119 -0
  14. package/payload/platform/plugins/brochures/skills/property-brochure/references/build.md +270 -0
  15. package/payload/platform/plugins/brochures/skills/property-brochure/references/copy.md +211 -0
  16. package/payload/platform/plugins/brochures/skills/property-brochure/references/images.md +166 -0
  17. package/payload/platform/plugins/brochures/skills/property-brochure/references/index-landing.md +376 -0
  18. package/payload/platform/plugins/brochures/skills/property-brochure/references/index.html +1288 -0
  19. package/payload/platform/plugins/brochures/skills/property-brochure/references/placeholders.md +250 -0
  20. package/payload/platform/plugins/brochures/skills/property-brochure/references/registers.md +47 -0
  21. package/payload/platform/plugins/brochures/skills/property-brochure/references/seller-brief.md +56 -0
  22. package/payload/platform/plugins/brochures/skills/property-brochure/references/structure.md +249 -0
  23. package/payload/platform/plugins/brochures/skills/property-brochure/references/template.html +2370 -0
  24. package/payload/platform/plugins/brochures/skills/property-extract/SKILL.md +372 -0
  25. package/payload/platform/plugins/buyers/.claude-plugin/plugin.json +8 -0
  26. package/payload/platform/plugins/buyers/PLUGIN.md +35 -0
  27. package/payload/platform/plugins/buyers/skills/buyer-feedback/SKILL.md +109 -0
  28. package/payload/platform/plugins/buyers/skills/buyer-management/SKILL.md +42 -0
  29. package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-qualification-questions.md +16 -0
  30. package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-qualification.md +59 -0
  31. package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-scripts.md +63 -0
  32. package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-working-scripts.md +54 -0
  33. package/payload/platform/plugins/buyers/skills/buyer-management/references/feedback-collection.md +42 -0
  34. package/payload/platform/plugins/buyers/skills/buyer-management/references/offer-capture.md +38 -0
  35. package/payload/platform/plugins/buyers/skills/buyer-management/references/viewing-booking.md +32 -0
  36. package/payload/platform/plugins/buyers/skills/buyer-management/references/viewing-management.md +52 -0
  37. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/SKILL.md +407 -0
  38. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/care-fees-guide.md +68 -0
  39. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/divorce-sales-guide.md +61 -0
  40. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/downsizing-guide.md +45 -0
  41. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/first-time-buyers.md +92 -0
  42. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/first-time-sellers.md +78 -0
  43. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/probate-guide.md +53 -0
  44. package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/upsizing-guide.md +41 -0
  45. package/payload/platform/plugins/buyers/skills/property-enquiry/SKILL.md +126 -0
  46. package/payload/platform/plugins/buyers/skills/viewing-management/SKILL.md +111 -0
  47. package/payload/platform/plugins/cloudflare/references/dashboard-guide.md +37 -0
  48. package/payload/platform/plugins/cloudflare/references/manual-setup.md +81 -1
  49. package/payload/platform/plugins/cloudflare/scripts/__tests__/tunnel-ingress.test.ts +241 -0
  50. package/payload/platform/plugins/cloudflare/scripts/setup-tunnel.sh +267 -28
  51. package/payload/platform/plugins/cloudflare/scripts/tunnel-ingress.ts +291 -0
  52. package/payload/platform/plugins/cloudflare/skills/setup-tunnel/SKILL.md +42 -0
  53. package/payload/platform/plugins/contacts/PLUGIN.md +18 -9
  54. package/payload/platform/plugins/docs/references/platform.md +2 -0
  55. package/payload/platform/plugins/docs/references/troubleshooting.md +12 -0
  56. package/payload/platform/plugins/email/PLUGIN.md +18 -9
  57. package/payload/platform/plugins/email/mcp/dist/lib/claude-bridge.d.ts +17 -0
  58. package/payload/platform/plugins/email/mcp/dist/lib/claude-bridge.d.ts.map +1 -0
  59. package/payload/platform/plugins/email/mcp/dist/lib/claude-bridge.js +185 -0
  60. package/payload/platform/plugins/email/mcp/dist/lib/claude-bridge.js.map +1 -0
  61. package/payload/platform/plugins/email/mcp/dist/scripts/email-auto-respond.js +34 -111
  62. package/payload/platform/plugins/email/mcp/dist/scripts/email-auto-respond.js.map +1 -1
  63. package/payload/platform/plugins/estate-business/.claude-plugin/plugin.json +8 -0
  64. package/payload/platform/plugins/estate-business/PLUGIN.md +65 -0
  65. package/payload/platform/plugins/estate-business/skills/business-growth/SKILL.md +133 -0
  66. package/payload/platform/plugins/estate-business/skills/business-growth/references/buy-back-your-time.md +37 -0
  67. package/payload/platform/plugins/estate-business/skills/business-growth/references/firewave-gost-scorecards.md +14 -0
  68. package/payload/platform/plugins/estate-business/skills/business-growth/references/keller-org-model.md +17 -0
  69. package/payload/platform/plugins/estate-business/skills/business-growth/references/lencioni-team-models.md +22 -0
  70. package/payload/platform/plugins/estate-business/skills/business-growth/references/listing-management-system.md +11 -0
  71. package/payload/platform/plugins/estate-business/skills/business-growth/references/net-figure-form.md +11 -0
  72. package/payload/platform/plugins/estate-business/skills/business-growth/references/serhant-bizinbox-notes.md +13 -0
  73. package/payload/platform/plugins/estate-business/skills/business-growth/references/team-roles-commission.md +14 -0
  74. package/payload/platform/plugins/estate-business/skills/business-growth/references/va-2026-ops.md +43 -0
  75. package/payload/platform/plugins/estate-business/skills/business-growth/references/wingman-structure.md +13 -0
  76. package/payload/platform/plugins/estate-business/skills/business-operations/SKILL.md +32 -0
  77. package/payload/platform/plugins/estate-business/skills/business-operations/references/crm-systems.md +57 -0
  78. package/payload/platform/plugins/estate-business/skills/business-operations/references/hiring-guide.md +59 -0
  79. package/payload/platform/plugins/estate-business/skills/business-operations/references/impact-framework.md +47 -0
  80. package/payload/platform/plugins/estate-business/skills/business-operations/references/minutes-equal-money.md +55 -0
  81. package/payload/platform/plugins/estate-business/skills/business-operations/references/team-management.md +48 -0
  82. package/payload/platform/plugins/estate-business/skills/commission-calculator/SKILL.md +40 -0
  83. package/payload/platform/plugins/estate-business/skills/exp-partnership/SKILL.md +52 -0
  84. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/12-reasons.md +39 -0
  85. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/95-5-system.md +66 -0
  86. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/agent-attraction-scripts.md +90 -0
  87. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/business-partnership.md +92 -0
  88. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/exp-model-overview.md +66 -0
  89. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/model-comparison.md +66 -0
  90. package/payload/platform/plugins/estate-business/skills/exp-partnership/references/revenue-share-explained.md +57 -0
  91. package/payload/platform/plugins/estate-business/skills/month-end-close/SKILL.md +69 -0
  92. package/payload/platform/plugins/estate-business/skills/payment-batch-stager/SKILL.md +42 -0
  93. package/payload/platform/plugins/estate-business/skills/period-reconciler/SKILL.md +42 -0
  94. package/payload/platform/plugins/estate-business/skills/personal-branding/SKILL.md +117 -0
  95. package/payload/platform/plugins/estate-business/skills/personal-branding/references/attraction-agent-notes.md +31 -0
  96. package/payload/platform/plugins/estate-business/skills/personal-branding/references/attraction-agent.md +58 -0
  97. package/payload/platform/plugins/estate-business/skills/personal-branding/references/authenticity-boundaries.md +28 -0
  98. package/payload/platform/plugins/estate-business/skills/personal-branding/references/become-a-brand-leader-notes.md +19 -0
  99. package/payload/platform/plugins/estate-business/skills/personal-branding/references/blast-formula.md +42 -0
  100. package/payload/platform/plugins/estate-business/skills/personal-branding/references/brand-leader.md +48 -0
  101. package/payload/platform/plugins/estate-business/skills/personal-branding/references/brand-strategy-system.md +59 -0
  102. package/payload/platform/plugins/estate-business/skills/personal-branding/references/content-engine.md +49 -0
  103. package/payload/platform/plugins/estate-business/skills/personal-branding/references/firewave-blast-and-blogging.md +23 -0
  104. package/payload/platform/plugins/estate-business/skills/personal-branding/references/gary-v-content.md +52 -0
  105. package/payload/platform/plugins/estate-business/skills/personal-branding/references/gary-v-principles.md +20 -0
  106. package/payload/platform/plugins/estate-business/skills/personal-branding/references/oversubscribed-positioning.md +18 -0
  107. package/payload/platform/plugins/estate-business/skills/personal-branding/references/platforms.md +41 -0
  108. package/payload/platform/plugins/estate-business/skills/personal-branding/references/priestley-oversubscribed.md +54 -0
  109. package/payload/platform/plugins/estate-business/skills/personal-branding/references/storeys-style-examples.md +25 -0
  110. package/payload/platform/plugins/estate-business/skills/personal-branding/references/visual-identity.md +27 -0
  111. package/payload/platform/plugins/estate-coaching/.claude-plugin/plugin.json +8 -0
  112. package/payload/platform/plugins/estate-coaching/PLUGIN.md +55 -0
  113. package/payload/platform/plugins/estate-coaching/skills/agent-performance/SKILL.md +371 -0
  114. package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/atomic-habits.md +52 -0
  115. package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/daily-routine-scorecard.md +104 -0
  116. package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/hp6-model.md +63 -0
  117. package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/twelve-week-year.md +71 -0
  118. package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/SKILL.md +36 -0
  119. package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/coaching-boundaries.md +56 -0
  120. package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/feedback-framework.md +61 -0
  121. package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/performance-framework.md +109 -0
  122. package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/SKILL.md +421 -0
  123. package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/coaching-exercises.md +86 -0
  124. package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/goal-setting.md +78 -0
  125. package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/one-to-one-framework.md +92 -0
  126. package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/soi-workbook.md +103 -0
  127. package/payload/platform/plugins/estate-coaching/skills/serhant-training/SKILL.md +410 -0
  128. package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/agent-training-guide.md +70 -0
  129. package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/business-in-a-box.md +72 -0
  130. package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/buyers-guide.md +53 -0
  131. package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/codo-method.md +72 -0
  132. package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/website-planning-guide.md +79 -0
  133. package/payload/platform/plugins/estate-onboarding/.claude-plugin/plugin.json +8 -0
  134. package/payload/platform/plugins/estate-onboarding/PLUGIN.md +31 -0
  135. package/payload/platform/plugins/estate-onboarding/skills/bootstrap/SKILL.md +26 -0
  136. package/payload/platform/plugins/estate-onboarding/skills/bootstrap/references/onboarding-flow.md +63 -0
  137. package/payload/platform/plugins/estate-sales/.claude-plugin/plugin.json +8 -0
  138. package/payload/platform/plugins/estate-sales/PLUGIN.md +53 -0
  139. package/payload/platform/plugins/estate-sales/skills/chase-progression/SKILL.md +107 -0
  140. package/payload/platform/plugins/estate-sales/skills/negotiation/SKILL.md +35 -0
  141. package/payload/platform/plugins/estate-sales/skills/negotiation/references/deal-saving.md +47 -0
  142. package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-deep-guide.md +64 -0
  143. package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-prep-principles.md +29 -0
  144. package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-techniques.md +42 -0
  145. package/payload/platform/plugins/estate-sales/skills/negotiation/references/offer-presentation.md +43 -0
  146. package/payload/platform/plugins/estate-sales/skills/risk-scorer/SKILL.md +42 -0
  147. package/payload/platform/plugins/estate-sales/skills/sales-closer/SKILL.md +24 -0
  148. package/payload/platform/plugins/estate-sales/skills/sales-closer/references/serhant-emotion-stages.md +36 -0
  149. package/payload/platform/plugins/estate-sales/skills/sales-discovery/SKILL.md +30 -0
  150. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/chris-voss-discovery.md +88 -0
  151. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/firewave-gost-journey.md +68 -0
  152. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/phil-jones-openers.md +78 -0
  153. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/pre-listing-checklist.md +77 -0
  154. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/serhant-improv.md +22 -0
  155. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/tom-ferry-discovery.md +103 -0
  156. package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/vendor-motivation-competitor.md +52 -0
  157. package/payload/platform/plugins/estate-sales/skills/sales-negotiation/SKILL.md +29 -0
  158. package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/chris-voss-negotiation.md +70 -0
  159. package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/phil-jones-price-words.md +40 -0
  160. package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/serhant-negotiation-plus.md +55 -0
  161. package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/tom-panos-commission-pricing.md +57 -0
  162. package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/tony-morris-questioning.md +54 -0
  163. package/payload/platform/plugins/estate-sales/skills/sales-progression/SKILL.md +27 -0
  164. package/payload/platform/plugins/estate-sales/skills/sales-progression/references/conveyancing-guide.md +54 -0
  165. package/payload/platform/plugins/estate-sales/skills/sales-progression/references/transaction-tracking.md +66 -0
  166. package/payload/platform/plugins/estate-teaching/.claude-plugin/plugin.json +8 -0
  167. package/payload/platform/plugins/estate-teaching/PLUGIN.md +31 -0
  168. package/payload/platform/plugins/estate-teaching/skills/content-directory/SKILL.md +39 -0
  169. package/payload/platform/plugins/estate-teaching/skills/content-directory/references/module-delivery.md +65 -0
  170. package/payload/platform/plugins/estate-teaching/skills/content-directory/references/progress-tracking.md +47 -0
  171. package/payload/platform/plugins/leads/.claude-plugin/plugin.json +8 -0
  172. package/payload/platform/plugins/leads/PLUGIN.md +62 -0
  173. package/payload/platform/plugins/leads/skills/chain-progression-tracker/SKILL.md +51 -0
  174. package/payload/platform/plugins/leads/skills/diary-builder/SKILL.md +38 -0
  175. package/payload/platform/plugins/leads/skills/enquiry-triage/SKILL.md +36 -0
  176. package/payload/platform/plugins/leads/skills/lead-nurturing/SKILL.md +137 -0
  177. package/payload/platform/plugins/leads/skills/lead-nurturing/references/buyer-search-letter.md +28 -0
  178. package/payload/platform/plugins/leads/skills/lead-nurturing/references/buyer-search-letters.md +37 -0
  179. package/payload/platform/plugins/leads/skills/lead-nurturing/references/database-reactivation.md +30 -0
  180. package/payload/platform/plugins/leads/skills/lead-nurturing/references/email-nurture-sequences.md +45 -0
  181. package/payload/platform/plugins/leads/skills/lead-nurturing/references/facebook-referrals.md +30 -0
  182. package/payload/platform/plugins/leads/skills/lead-nurturing/references/firewave-email-nurture-sequences.md +41 -0
  183. package/payload/platform/plugins/leads/skills/lead-nurturing/references/keller-33-touch.md +34 -0
  184. package/payload/platform/plugins/leads/skills/lead-nurturing/references/neighbour-letters.md +31 -0
  185. package/payload/platform/plugins/leads/skills/lead-nurturing/references/neighbour-notification-letter.md +20 -0
  186. package/payload/platform/plugins/leads/skills/lead-nurturing/references/ofi-follow-up-dialogue.md +22 -0
  187. package/payload/platform/plugins/leads/skills/lead-nurturing/references/ofi-follow-up.md +26 -0
  188. package/payload/platform/plugins/leads/skills/lead-nurturing/references/serhant-three-fs-plus.md +21 -0
  189. package/payload/platform/plugins/leads/skills/lead-nurturing/references/sharran-10x10x10.md +18 -0
  190. package/payload/platform/plugins/leads/skills/lead-nurturing/references/sms-templates.md +40 -0
  191. package/payload/platform/plugins/leads/skills/lead-nurturing/references/sphere-of-influence-notes.md +34 -0
  192. package/payload/platform/plugins/leads/skills/lead-nurturing/references/sphere-of-influence.md +60 -0
  193. package/payload/platform/plugins/leads/skills/lead-nurturing/references/tom-panos-sms-templates.md +59 -0
  194. package/payload/platform/plugins/leads/skills/morning-round/SKILL.md +72 -0
  195. package/payload/platform/plugins/leads/skills/prospecting/SKILL.md +33 -0
  196. package/payload/platform/plugins/leads/skills/prospecting/references/database-matching.md +30 -0
  197. package/payload/platform/plugins/leads/skills/prospecting/references/database-value.md +53 -0
  198. package/payload/platform/plugins/leads/skills/prospecting/references/prospecting-dialogues.md +24 -0
  199. package/payload/platform/plugins/leads/skills/prospecting/references/reactivation.md +34 -0
  200. package/payload/platform/plugins/listings/.claude-plugin/plugin.json +8 -0
  201. package/payload/platform/plugins/listings/PLUGIN.md +103 -0
  202. package/payload/platform/plugins/listings/skills/comparable-finder/SKILL.md +52 -0
  203. package/payload/platform/plugins/listings/skills/epc-checker/SKILL.md +38 -0
  204. package/payload/platform/plugins/listings/skills/home-preparation/SKILL.md +28 -0
  205. package/payload/platform/plugins/listings/skills/home-preparation/references/kerb-appeal.md +38 -0
  206. package/payload/platform/plugins/listings/skills/home-preparation/references/photo-day.md +59 -0
  207. package/payload/platform/plugins/listings/skills/home-preparation/references/situational-tips.md +50 -0
  208. package/payload/platform/plugins/listings/skills/home-preparation/references/staging-guide.md +52 -0
  209. package/payload/platform/plugins/listings/skills/listing-copy-writer/SKILL.md +55 -0
  210. package/payload/platform/plugins/listings/skills/listing-presentation/SKILL.md +286 -0
  211. package/payload/platform/plugins/listings/skills/listing-presentation/references/booking-script.md +51 -0
  212. package/payload/platform/plugins/listings/skills/listing-presentation/references/objection-scripts.md +193 -0
  213. package/payload/platform/plugins/listings/skills/listing-presentation/references/penhaul-presentation.md +123 -0
  214. package/payload/platform/plugins/listings/skills/listing-presentation/references/pre-listing-kit.md +139 -0
  215. package/payload/platform/plugins/listings/skills/listing-presentation/references/set-to-sell.md +55 -0
  216. package/payload/platform/plugins/listings/skills/listing-presentation/references/sharran-frameworks.md +107 -0
  217. package/payload/platform/plugins/listings/skills/local-market-stats/SKILL.md +33 -0
  218. package/payload/platform/plugins/listings/skills/new-instruction/SKILL.md +78 -0
  219. package/payload/platform/plugins/listings/skills/particulars-builder/SKILL.md +48 -0
  220. package/payload/platform/plugins/listings/skills/portal-launch-scheduler/SKILL.md +49 -0
  221. package/payload/platform/plugins/listings/skills/pricing-scenario-builder/SKILL.md +35 -0
  222. package/payload/platform/plugins/listings/skills/property-marketing/SKILL.md +337 -0
  223. package/payload/platform/plugins/listings/skills/property-marketing/references/auction-report-template.md +41 -0
  224. package/payload/platform/plugins/listings/skills/property-marketing/references/coming-soon-campaign.md +43 -0
  225. package/payload/platform/plugins/listings/skills/property-marketing/references/direct-mail-templates.md +121 -0
  226. package/payload/platform/plugins/listings/skills/property-marketing/references/eoi-form-template.md +62 -0
  227. package/payload/platform/plugins/listings/skills/property-marketing/references/monthly-scorecard.md +63 -0
  228. package/payload/platform/plugins/listings/skills/supplier-booker/SKILL.md +39 -0
  229. package/payload/platform/plugins/listings/skills/talk-track-composer/SKILL.md +36 -0
  230. package/payload/platform/plugins/listings/skills/terms-of-business-drafter/SKILL.md +54 -0
  231. package/payload/platform/plugins/listings/skills/valuation-prep/SKILL.md +69 -0
  232. package/payload/platform/plugins/loop/.claude-plugin/plugin.json +17 -0
  233. package/payload/platform/plugins/loop/PLUGIN.md +108 -0
  234. package/payload/platform/plugins/loop/mcp/dist/index.d.ts +2 -0
  235. package/payload/platform/plugins/loop/mcp/dist/index.d.ts.map +1 -0
  236. package/payload/platform/plugins/loop/mcp/dist/index.js +293 -0
  237. package/payload/platform/plugins/loop/mcp/dist/index.js.map +1 -0
  238. package/payload/platform/plugins/loop/mcp/dist/lib/crypto.d.ts +10 -0
  239. package/payload/platform/plugins/loop/mcp/dist/lib/crypto.d.ts.map +1 -0
  240. package/payload/platform/plugins/loop/mcp/dist/lib/crypto.js +88 -0
  241. package/payload/platform/plugins/loop/mcp/dist/lib/crypto.js.map +1 -0
  242. package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.d.ts +82 -0
  243. package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +1 -0
  244. package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.js +427 -0
  245. package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.js.map +1 -0
  246. package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.d.ts +5 -0
  247. package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +1 -0
  248. package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.js +40 -0
  249. package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.js.map +1 -0
  250. package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.d.ts +10 -0
  251. package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.d.ts.map +1 -0
  252. package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.js +24 -0
  253. package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.js.map +1 -0
  254. package/payload/platform/plugins/loop/mcp/dist/tools/feedback.d.ts +16 -0
  255. package/payload/platform/plugins/loop/mcp/dist/tools/feedback.d.ts.map +1 -0
  256. package/payload/platform/plugins/loop/mcp/dist/tools/feedback.js +35 -0
  257. package/payload/platform/plugins/loop/mcp/dist/tools/feedback.js.map +1 -0
  258. package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.d.ts +5 -0
  259. package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +1 -0
  260. package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.js +19 -0
  261. package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.js.map +1 -0
  262. package/payload/platform/plugins/loop/mcp/dist/tools/key-list.d.ts +4 -0
  263. package/payload/platform/plugins/loop/mcp/dist/tools/key-list.d.ts.map +1 -0
  264. package/payload/platform/plugins/loop/mcp/dist/tools/key-list.js +14 -0
  265. package/payload/platform/plugins/loop/mcp/dist/tools/key-list.js.map +1 -0
  266. package/payload/platform/plugins/loop/mcp/dist/tools/key-register.d.ts +9 -0
  267. package/payload/platform/plugins/loop/mcp/dist/tools/key-register.d.ts.map +1 -0
  268. package/payload/platform/plugins/loop/mcp/dist/tools/key-register.js +60 -0
  269. package/payload/platform/plugins/loop/mcp/dist/tools/key-register.js.map +1 -0
  270. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts +13 -0
  271. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts.map +1 -0
  272. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.js +41 -0
  273. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.js.map +1 -0
  274. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts +9 -0
  275. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts.map +1 -0
  276. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.js +16 -0
  277. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.js.map +1 -0
  278. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts +15 -0
  279. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts.map +1 -0
  280. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.js +11 -0
  281. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.js.map +1 -0
  282. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.d.ts +10 -0
  283. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.d.ts.map +1 -0
  284. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.js +39 -0
  285. package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.js.map +1 -0
  286. package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.d.ts +9 -0
  287. package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.d.ts.map +1 -0
  288. package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.js +125 -0
  289. package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.js.map +1 -0
  290. package/payload/platform/plugins/loop/mcp/dist/tools/people-search.d.ts +18 -0
  291. package/payload/platform/plugins/loop/mcp/dist/tools/people-search.d.ts.map +1 -0
  292. package/payload/platform/plugins/loop/mcp/dist/tools/people-search.js +87 -0
  293. package/payload/platform/plugins/loop/mcp/dist/tools/people-search.js.map +1 -0
  294. package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.d.ts +10 -0
  295. package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.d.ts.map +1 -0
  296. package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.js +82 -0
  297. package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.js.map +1 -0
  298. package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.d.ts +12 -0
  299. package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.d.ts.map +1 -0
  300. package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.js +32 -0
  301. package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.js.map +1 -0
  302. package/payload/platform/plugins/loop/mcp/dist/tools/property-request.d.ts +15 -0
  303. package/payload/platform/plugins/loop/mcp/dist/tools/property-request.d.ts.map +1 -0
  304. package/payload/platform/plugins/loop/mcp/dist/tools/property-request.js +11 -0
  305. package/payload/platform/plugins/loop/mcp/dist/tools/property-request.js.map +1 -0
  306. package/payload/platform/plugins/loop/mcp/dist/tools/property-search.d.ts +16 -0
  307. package/payload/platform/plugins/loop/mcp/dist/tools/property-search.d.ts.map +1 -0
  308. package/payload/platform/plugins/loop/mcp/dist/tools/property-search.js +41 -0
  309. package/payload/platform/plugins/loop/mcp/dist/tools/property-search.js.map +1 -0
  310. package/payload/platform/plugins/loop/mcp/dist/tools/supplier.d.ts +13 -0
  311. package/payload/platform/plugins/loop/mcp/dist/tools/supplier.d.ts.map +1 -0
  312. package/payload/platform/plugins/loop/mcp/dist/tools/supplier.js +49 -0
  313. package/payload/platform/plugins/loop/mcp/dist/tools/supplier.js.map +1 -0
  314. package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.d.ts +7 -0
  315. package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.d.ts.map +1 -0
  316. package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.js +19 -0
  317. package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.js.map +1 -0
  318. package/payload/platform/plugins/loop/mcp/dist/tools/team-info.d.ts +5 -0
  319. package/payload/platform/plugins/loop/mcp/dist/tools/team-info.d.ts.map +1 -0
  320. package/payload/platform/plugins/loop/mcp/dist/tools/team-info.js +32 -0
  321. package/payload/platform/plugins/loop/mcp/dist/tools/team-info.js.map +1 -0
  322. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.d.ts +14 -0
  323. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.d.ts.map +1 -0
  324. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.js +11 -0
  325. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.js.map +1 -0
  326. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.d.ts +9 -0
  327. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.d.ts.map +1 -0
  328. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.js +85 -0
  329. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.js.map +1 -0
  330. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.d.ts +13 -0
  331. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.d.ts.map +1 -0
  332. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.js +44 -0
  333. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.js.map +1 -0
  334. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.d.ts +14 -0
  335. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.d.ts.map +1 -0
  336. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.js +18 -0
  337. package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.js.map +1 -0
  338. package/payload/platform/plugins/loop/mcp/package-lock.json +2549 -0
  339. package/payload/platform/plugins/loop/mcp/package.json +21 -0
  340. package/payload/platform/plugins/loop/mcp/src/__tests__/loop-swagger.snapshot.json +26467 -0
  341. package/payload/platform/plugins/loop/mcp/src/__tests__/swagger-write-coverage.test.ts +153 -0
  342. package/payload/platform/plugins/loop/mcp/src/index.ts +444 -0
  343. package/payload/platform/plugins/loop/mcp/src/lib/crypto.ts +105 -0
  344. package/payload/platform/plugins/loop/mcp/src/lib/loop-api.ts +604 -0
  345. package/payload/platform/plugins/loop/mcp/src/lib/neo4j.ts +51 -0
  346. package/payload/platform/plugins/loop/mcp/src/tools/customer-preferences.ts +66 -0
  347. package/payload/platform/plugins/loop/mcp/src/tools/feedback.ts +86 -0
  348. package/payload/platform/plugins/loop/mcp/src/tools/key-deregister.ts +27 -0
  349. package/payload/platform/plugins/loop/mcp/src/tools/key-list.ts +19 -0
  350. package/payload/platform/plugins/loop/mcp/src/tools/key-register.ts +95 -0
  351. package/payload/platform/plugins/loop/mcp/src/tools/marketing-enquiry.ts +113 -0
  352. package/payload/platform/plugins/loop/mcp/src/tools/marketing-match-batch.ts +53 -0
  353. package/payload/platform/plugins/loop/mcp/src/tools/marketing-match-request.ts +42 -0
  354. package/payload/platform/plugins/loop/mcp/src/tools/marketing-match.ts +84 -0
  355. package/payload/platform/plugins/loop/mcp/src/tools/people-detail.ts +245 -0
  356. package/payload/platform/plugins/loop/mcp/src/tools/people-search.ts +180 -0
  357. package/payload/platform/plugins/loop/mcp/src/tools/property-detail.ts +145 -0
  358. package/payload/platform/plugins/loop/mcp/src/tools/property-listed.ts +88 -0
  359. package/payload/platform/plugins/loop/mcp/src/tools/property-request.ts +42 -0
  360. package/payload/platform/plugins/loop/mcp/src/tools/property-search.ts +92 -0
  361. package/payload/platform/plugins/loop/mcp/src/tools/supplier.ts +129 -0
  362. package/payload/platform/plugins/loop/mcp/src/tools/team-availability.ts +52 -0
  363. package/payload/platform/plugins/loop/mcp/src/tools/team-info.ts +95 -0
  364. package/payload/platform/plugins/loop/mcp/src/tools/viewing-create.ts +41 -0
  365. package/payload/platform/plugins/loop/mcp/src/tools/viewing-detail.ts +171 -0
  366. package/payload/platform/plugins/loop/mcp/src/tools/viewing-search.ts +92 -0
  367. package/payload/platform/plugins/loop/mcp/src/tools/viewing-update.ts +53 -0
  368. package/payload/platform/plugins/loop/mcp/tsconfig.json +20 -0
  369. package/payload/platform/plugins/loop/mcp/vitest.config.ts +9 -0
  370. package/payload/platform/plugins/loop/skills/compliance-flag-checker/SKILL.md +53 -0
  371. package/payload/platform/plugins/loop/skills/priority-ranker/SKILL.md +40 -0
  372. package/payload/platform/plugins/loop/skills/tone-matched-drafter/SKILL.md +53 -0
  373. package/payload/platform/plugins/loop/skills/variance-narrator/SKILL.md +50 -0
  374. package/payload/platform/plugins/loop/skills/vendor-research/SKILL.md +54 -0
  375. package/payload/platform/plugins/memory/PLUGIN.md +58 -29
  376. package/payload/platform/plugins/memory/mcp/dist/tools/profile-read.d.ts +3 -1
  377. package/payload/platform/plugins/memory/mcp/dist/tools/profile-read.d.ts.map +1 -1
  378. package/payload/platform/plugins/memory/mcp/dist/tools/profile-read.js +105 -4
  379. package/payload/platform/plugins/memory/mcp/dist/tools/profile-read.js.map +1 -1
  380. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.d.ts.map +1 -1
  381. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js +16 -3
  382. package/payload/platform/plugins/memory/mcp/dist/tools/profile-update.js.map +1 -1
  383. package/payload/platform/plugins/outlook/PLUGIN.md +14 -7
  384. package/payload/platform/plugins/replicate/PLUGIN.md +6 -3
  385. package/payload/platform/plugins/scheduling/PLUGIN.md +16 -8
  386. package/payload/platform/plugins/tasks/PLUGIN.md +28 -14
  387. package/payload/platform/plugins/teaching/.claude-plugin/plugin.json +8 -0
  388. package/payload/platform/plugins/teaching/PLUGIN.md +57 -0
  389. package/payload/platform/plugins/teaching/skills/interactive-tutor/SKILL.md +59 -0
  390. package/payload/platform/plugins/teaching/skills/interactive-tutor/references/assessment.md +70 -0
  391. package/payload/platform/plugins/teaching/skills/interactive-tutor/references/classroom-conduct.md +43 -0
  392. package/payload/platform/plugins/teaching/skills/interactive-tutor/references/teaching-modes.md +83 -0
  393. package/payload/platform/plugins/teaching/skills/lesson-planner/SKILL.md +48 -0
  394. package/payload/platform/plugins/teaching/skills/lesson-planner/references/context-gathering.md +41 -0
  395. package/payload/platform/plugins/teaching/skills/lesson-planner/references/plan-structure.md +94 -0
  396. package/payload/platform/plugins/teaching/skills/study-pack-builder/SKILL.md +52 -0
  397. package/payload/platform/plugins/teaching/skills/study-pack-builder/references/disaggregation.md +49 -0
  398. package/payload/platform/plugins/teaching/skills/study-pack-builder/references/materials.md +116 -0
  399. package/payload/platform/plugins/vendors/.claude-plugin/plugin.json +8 -0
  400. package/payload/platform/plugins/vendors/PLUGIN.md +34 -0
  401. package/payload/platform/plugins/vendors/skills/vendor-communication/SKILL.md +42 -0
  402. package/payload/platform/plugins/vendors/skills/vendor-communication/references/fee-protection-and-agenda.md +28 -0
  403. package/payload/platform/plugins/vendors/skills/vendor-communication/references/listing-scripts.md +44 -0
  404. package/payload/platform/plugins/vendors/skills/vendor-communication/references/negotiation-deep-guide.md +70 -0
  405. package/payload/platform/plugins/vendors/skills/vendor-communication/references/price-alignment-scripts.md +33 -0
  406. package/payload/platform/plugins/vendors/skills/vendor-communication/references/price-alignment.md +34 -0
  407. package/payload/platform/plugins/vendors/skills/vendor-communication/references/scenario-scripts.md +38 -0
  408. package/payload/platform/plugins/vendors/skills/vendor-communication/references/seller-engagement.md +51 -0
  409. package/payload/platform/plugins/vendors/skills/vendor-communication/references/valuation-booking.md +76 -0
  410. package/payload/platform/plugins/vendors/skills/vendor-communication/references/vendor-scripts.md +63 -0
  411. package/payload/platform/plugins/vendors/skills/vendor-communication/references/vendor-updates.md +41 -0
  412. package/payload/platform/plugins/vendors/skills/vendor-updates/SKILL.md +153 -0
  413. package/payload/platform/plugins/waitlist/PLUGIN.md +12 -6
  414. package/payload/platform/plugins/whatsapp/PLUGIN.md +25 -13
  415. package/payload/platform/plugins/workflows/PLUGIN.md +16 -8
  416. package/payload/platform/plugins/writer-craft/.claude-plugin/plugin.json +8 -0
  417. package/payload/platform/plugins/writer-craft/PLUGIN.md +87 -0
  418. package/payload/platform/plugins/writer-craft/agents/writer-craft--manuscript-reviewer.md +92 -0
  419. package/payload/platform/plugins/writer-craft/skills/citation-style/SKILL.md +94 -0
  420. package/payload/platform/plugins/writer-craft/skills/citation-style/references/book-and-chapter-models.md +77 -0
  421. package/payload/platform/plugins/writer-craft/skills/citation-style/references/citation-rules.md +103 -0
  422. package/payload/platform/plugins/writer-craft/skills/citation-style/references/journal-article-models.md +74 -0
  423. package/payload/platform/plugins/writer-craft/skills/citation-style/references/other-source-models.md +146 -0
  424. package/payload/platform/plugins/writer-craft/skills/citation-style/references/reference-list-rules.md +70 -0
  425. package/payload/platform/plugins/writer-craft/skills/editorial-practice/SKILL.md +108 -0
  426. package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/copyediting.md +73 -0
  427. package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/developmental-editing.md +85 -0
  428. package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/genre-specific-editing.md +78 -0
  429. package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/line-editing.md +55 -0
  430. package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/self-editing.md +89 -0
  431. package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/SKILL.md +114 -0
  432. package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/audience-analysis.md +73 -0
  433. package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/crafting-persuasive-story.md +76 -0
  434. package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/persuasion-case-studies.md +67 -0
  435. package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/transformation-framework.md +86 -0
  436. package/payload/platform/plugins/writer-craft/skills/point-of-view/SKILL.md +97 -0
  437. package/payload/platform/plugins/writer-craft/skills/point-of-view/references/indirect-narration.md +72 -0
  438. package/payload/platform/plugins/writer-craft/skills/point-of-view/references/pov-types-and-voice.md +91 -0
  439. package/payload/platform/plugins/writer-craft/skills/point-of-view/references/protagonist-filter.md +71 -0
  440. package/payload/platform/plugins/writer-craft/skills/point-of-view/references/tense-and-person.md +85 -0
  441. package/payload/platform/plugins/writer-craft/skills/prose-craft/SKILL.md +100 -0
  442. package/payload/platform/plugins/writer-craft/skills/prose-craft/references/punctuation-and-grammar.md +72 -0
  443. package/payload/platform/plugins/writer-craft/skills/prose-craft/references/repetition.md +71 -0
  444. package/payload/platform/plugins/writer-craft/skills/prose-craft/references/sound-and-rhythm.md +64 -0
  445. package/payload/platform/plugins/writer-craft/skills/prose-craft/references/word-economy.md +93 -0
  446. package/payload/platform/plugins/writer-craft/skills/reader-engagement/SKILL.md +100 -0
  447. package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/cause-effect-setup-payoff.md +79 -0
  448. package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/conflict-escalation.md +81 -0
  449. package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/hooking-readers.md +67 -0
  450. package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/neurochemistry-of-engagement.md +94 -0
  451. package/payload/platform/plugins/writer-craft/skills/review-manuscript/SKILL.md +111 -0
  452. package/payload/platform/plugins/writer-craft/skills/review-manuscript/references/review-manuscript-checklist.md +119 -0
  453. package/payload/platform/plugins/writer-craft/skills/review-prose/SKILL.md +99 -0
  454. package/payload/platform/plugins/writer-craft/skills/review-prose/references/prose-review-checklist.md +112 -0
  455. package/payload/platform/plugins/writer-craft/skills/review-scene/SKILL.md +99 -0
  456. package/payload/platform/plugins/writer-craft/skills/review-scene/references/scene-analysis-framework.md +95 -0
  457. package/payload/platform/plugins/writer-craft/skills/story-architecture/SKILL.md +106 -0
  458. package/payload/platform/plugins/writer-craft/skills/story-architecture/references/blueprinting-and-scene-cards.md +118 -0
  459. package/payload/platform/plugins/writer-craft/skills/story-architecture/references/inner-issue-and-protagonist-goal.md +66 -0
  460. package/payload/platform/plugins/writer-craft/skills/story-architecture/references/misbelief-desire-worldview.md +87 -0
  461. package/payload/platform/plugins/writer-craft/skills/story-architecture/references/origin-scenes-and-escalation.md +82 -0
  462. package/payload/platform/plugins/writer-craft/skills/story-blueprint/SKILL.md +133 -0
  463. package/payload/platform/plugins/writer-craft/skills/story-blueprint/references/blueprinting-exercises.md +118 -0
  464. package/payload/platform/plugins/writer-craft/skills/story-blueprint/references/blueprinting-process.md +128 -0
  465. package/payload/platform/scripts/conversation-id-allowlist.txt +0 -1
  466. package/payload/platform/services/claude-session-manager/dist/config.d.ts +6 -0
  467. package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
  468. package/payload/platform/services/claude-session-manager/dist/config.js +60 -1
  469. package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
  470. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +9 -0
  471. package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
  472. package/payload/platform/services/claude-session-manager/dist/http-server.js +48 -2
  473. package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
  474. package/payload/platform/services/claude-session-manager/dist/index.js +39 -0
  475. package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
  476. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +22 -0
  477. package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
  478. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +32 -1
  479. package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
  480. package/payload/platform/services/claude-session-manager/dist/public-tool-audit.d.ts +33 -0
  481. package/payload/platform/services/claude-session-manager/dist/public-tool-audit.d.ts.map +1 -0
  482. package/payload/platform/services/claude-session-manager/dist/public-tool-audit.js +149 -0
  483. package/payload/platform/services/claude-session-manager/dist/public-tool-audit.js.map +1 -0
  484. package/payload/platform/services/claude-session-manager/dist/spawn-rate-limiter.d.ts +28 -0
  485. package/payload/platform/services/claude-session-manager/dist/spawn-rate-limiter.d.ts.map +1 -0
  486. package/payload/platform/services/claude-session-manager/dist/spawn-rate-limiter.js +77 -0
  487. package/payload/platform/services/claude-session-manager/dist/spawn-rate-limiter.js.map +1 -0
  488. package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts +25 -0
  489. package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts.map +1 -0
  490. package/payload/platform/services/claude-session-manager/dist/tool-surface.js +149 -0
  491. package/payload/platform/services/claude-session-manager/dist/tool-surface.js.map +1 -0
  492. package/payload/premium-plugins/real-agency/plugins/estate-business/PLUGIN.md +15 -0
  493. package/payload/premium-plugins/real-agency/plugins/estate-sales/PLUGIN.md +5 -0
  494. package/payload/premium-plugins/real-agency/plugins/leads/PLUGIN.md +16 -0
  495. package/payload/premium-plugins/real-agency/plugins/listings/PLUGIN.md +39 -0
  496. package/payload/premium-plugins/real-agency/plugins/loop/PLUGIN.md +15 -0
  497. package/payload/server/{chunk-2ZNKHCQB.js → chunk-2MRZBQMH.js} +1 -1
  498. package/payload/server/{chunk-GPUCA2RQ.js → chunk-NL7QLVAD.js} +0 -192
  499. package/payload/server/{chunk-IDKWGLM5.js → chunk-YPZFYTYP.js} +1 -247
  500. package/payload/server/{cloudflare-task-tracker-LYI5BTYI.js → cloudflare-task-tracker-QVOGHKWV.js} +2 -2
  501. package/payload/server/maxy-edge.js +2 -2
  502. package/payload/server/package.json +0 -2
  503. package/payload/server/public/assets/{Checkbox-D1OQD43b.js → Checkbox-YIF0payo.js} +1 -1
  504. package/payload/server/public/assets/{admin-czNBxWor.js → admin-DW8IJcLc.js} +1 -1
  505. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-BcwgT80u.js → architectureDiagram-Q4EWVU46-Bz8mlxZZ.js} +1 -1
  506. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BMSyZUQA.js → blockDiagram-DXYQGD6D-DwV8Z8-i.js} +1 -1
  507. package/payload/server/public/assets/{brand-2cku8WFs.css → brand-DqiRNMlu.css} +1 -1
  508. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-DPRGY1jJ.js → c4Diagram-AHTNJAMY-DiUTejMp.js} +1 -1
  509. package/payload/server/public/assets/channel-PtVtoBEL.js +1 -0
  510. package/payload/server/public/assets/{chunk-336JU56O-B7oQ3g1c.js → chunk-336JU56O-4mHZpBXe.js} +2 -2
  511. package/payload/server/public/assets/{chunk-426QAEUC-C1P0yFXw.js → chunk-426QAEUC-Cbv0vrN9.js} +1 -1
  512. package/payload/server/public/assets/{chunk-4TB4RGXK-LI7kOJd0.js → chunk-4TB4RGXK-BvLhId_2.js} +1 -1
  513. package/payload/server/public/assets/{chunk-5FUZZQ4R-CXQRGTQE.js → chunk-5FUZZQ4R-bBafOTkw.js} +1 -1
  514. package/payload/server/public/assets/{chunk-5PVQY5BW-NSyzpXRy.js → chunk-5PVQY5BW-B0NqBKVy.js} +1 -1
  515. package/payload/server/public/assets/{chunk-EDXVE4YY-voNwxbDs.js → chunk-EDXVE4YY-CFd4SqI6.js} +1 -1
  516. package/payload/server/public/assets/{chunk-ENJZ2VHE-CMEMPzYY.js → chunk-ENJZ2VHE-ajf2sb6c.js} +1 -1
  517. package/payload/server/public/assets/{chunk-ICPOFSXX-hEbwu-pe.js → chunk-ICPOFSXX-pWg6bug7.js} +1 -1
  518. package/payload/server/public/assets/{chunk-OYMX7WX6-DxskDrLs.js → chunk-OYMX7WX6-OjEd-17c.js} +1 -1
  519. package/payload/server/public/assets/{chunk-U2HBQHQK-D7TKgUo0.js → chunk-U2HBQHQK-DbEFSPoh.js} +1 -1
  520. package/payload/server/public/assets/{chunk-X2U36JSP-BvPUQEPm.js → chunk-X2U36JSP-COdNwrBb.js} +1 -1
  521. package/payload/server/public/assets/{chunk-YZCP3GAM-BY-RWQUW.js → chunk-YZCP3GAM-CHMWuY9B.js} +1 -1
  522. package/payload/server/public/assets/{chunk-ZZ45TVLE-DZvOYDY6.js → chunk-ZZ45TVLE-B-uDLQOB.js} +1 -1
  523. package/payload/server/public/assets/classDiagram-6PBFFD2Q-RVH_SEhY.js +1 -0
  524. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-Cm3rAb93.js +1 -0
  525. package/payload/server/public/assets/clone-BjY0Wzht.js +1 -0
  526. package/payload/server/public/assets/{dagre-KV5264BT-Cnj0mUZl.js → dagre-KV5264BT-CMEzmhIL.js} +1 -1
  527. package/payload/server/public/assets/{dagre-Bt-fpckL.js → dagre-bhIG_KnW.js} +1 -1
  528. package/payload/server/public/assets/data-K_kS__sL.js +1 -0
  529. package/payload/server/public/assets/{device-url-actions-Bjz3Xzbm.js → device-url-actions-AcOyLSeF.js} +1 -1
  530. package/payload/server/public/assets/{diagram-5BDNPKRD-DjLzvOlx.js → diagram-5BDNPKRD-6RIoQhIL.js} +1 -1
  531. package/payload/server/public/assets/{diagram-G4DWMVQ6-DTfuRd-T.js → diagram-G4DWMVQ6-BSp36TVv.js} +1 -1
  532. package/payload/server/public/assets/{diagram-MMDJMWI5-BaL2mCnx.js → diagram-MMDJMWI5-D54fo52D.js} +1 -1
  533. package/payload/server/public/assets/{diagram-TYMM5635-C5InWY5R.js → diagram-TYMM5635-CWL8z-Pq.js} +1 -1
  534. package/payload/server/public/assets/{erDiagram-SMLLAGMA-DO7BXTpn.js → erDiagram-SMLLAGMA-AnnHBo3z.js} +1 -1
  535. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-DDdAKfLf.js → flowDiagram-DWJPFMVM-laWmBl5o.js} +1 -1
  536. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-arJD8Utm.js → ganttDiagram-T4ZO3ILL-B94ko8ie.js} +1 -1
  537. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-C55GH-OS.js → gitGraphDiagram-UUTBAWPF-DxzL1fxZ.js} +1 -1
  538. package/payload/server/public/assets/graph-DeEigyO_.js +1 -0
  539. package/payload/server/public/assets/graph-labels-C7I5QvNv.js +1 -0
  540. package/payload/server/public/assets/{graphlib-DL9PM7Ex.js → graphlib-CY-zIElM.js} +1 -1
  541. package/payload/server/public/assets/{infoDiagram-42DDH7IO-BMSGqUbG.js → infoDiagram-42DDH7IO-BMTajIIr.js} +1 -1
  542. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-Dw6BZ6BG.js → ishikawaDiagram-UXIWVN3A-B_QauE5O.js} +1 -1
  543. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-DrywUGXw.js → journeyDiagram-VCZTEJTY-DmlqSIih.js} +1 -1
  544. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-DuwtVBBc.js → kanban-definition-6JOO6SKY-ZGDQT7xB.js} +1 -1
  545. package/payload/server/public/assets/{line-JAksyKHj.js → line-D13opgep.js} +1 -1
  546. package/payload/server/public/assets/{mermaid-parser.core-BMq-ApBW.js → mermaid-parser.core-C650Sual.js} +1 -1
  547. package/payload/server/public/assets/{mermaid.core-tH4oX0Kh.js → mermaid.core-BqnQoXTp.js} +3 -3
  548. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-D1OiiJga.js → mindmap-definition-QFDTVHPH-BS_8y-tY.js} +1 -1
  549. package/payload/server/public/assets/{page-BZpoS7iR.js → page-B_rpjIRr.js} +1 -1
  550. package/payload/server/public/assets/{page-CkvBvezS.js → page-qSH972X0.js} +1 -1
  551. package/payload/server/public/assets/{pieDiagram-DEJITSTG-Ckwm69PW.js → pieDiagram-DEJITSTG-B5OmNvBO.js} +1 -1
  552. package/payload/server/public/assets/{public-C-dTMgXu.js → public-DDsYgotk.js} +3 -3
  553. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-COw3yZ1j.js → quadrantDiagram-34T5L4WZ-DTYITdNo.js} +1 -1
  554. package/payload/server/public/assets/{requirementDiagram-MS252O5E-DqGzM4K-.js → requirementDiagram-MS252O5E-CRZWxH06.js} +1 -1
  555. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-D-l1c_Pl.js → sankeyDiagram-XADWPNL6-DazRENhe.js} +1 -1
  556. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-BeIi0DtJ.js → sequenceDiagram-FGHM5R23-BcHTxmPy.js} +1 -1
  557. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-C-jgegLk.js → stateDiagram-FHFEXIEX-DYU7nbqg.js} +1 -1
  558. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BgljVtlp.js +1 -0
  559. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-BGFKkYmi.js → timeline-definition-GMOUNBTQ-BKGmqkST.js} +1 -1
  560. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-5NuIhJLS.js → vennDiagram-DHZGUBPP-BXvLPmX7.js} +1 -1
  561. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-Be9ytVut.js → wardleyDiagram-NUSXRM2D-BCclUa3Z.js} +1 -1
  562. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-DCyHg41R.js → xychartDiagram-5P7HB3ND-C-Xp-Eoc.js} +1 -1
  563. package/payload/server/public/data.html +5 -5
  564. package/payload/server/public/graph.html +6 -6
  565. package/payload/server/public/index.html +8 -8
  566. package/payload/server/public/public.html +5 -5
  567. package/payload/server/server.js +1024 -2347
  568. package/payload/platform/scripts/check-sdk-oauth.mjs +0 -185
  569. package/payload/server/public/assets/channel-fxEghWew.js +0 -1
  570. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BsWzGW0N.js +0 -1
  571. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-BGVa3h90.js +0 -1
  572. package/payload/server/public/assets/clone-Khvocke2.js +0 -1
  573. package/payload/server/public/assets/data-DBd-Buhp.js +0 -1
  574. package/payload/server/public/assets/graph-DUtVdnZ6.js +0 -1
  575. package/payload/server/public/assets/graph-labels-Dxfue-fP.js +0 -1
  576. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-BaMs8Znv.js +0 -1
  577. /package/payload/server/public/assets/{brand-CSQuxS9w.js → brand-Bm671owU.js} +0 -0
@@ -0,0 +1,250 @@
1
+ # Placeholders — the substitution contract
2
+
3
+ `template.html` and `index.html` are pure placeholder templates: every property-specific value is a `{{ token }}` token. There is no exemplar copy left to accidentally inherit. After rendering, `grep "{{" output/brochure.html` (and `output/web/index.html`) MUST return **zero matches**. Any remaining `{{ x }}` is a substitution bug.
4
+
5
+ This file is the substitution contract — the exhaustive list of every token used across both templates, what fills it, what format it takes, and what voice the copy tokens need. Style and composition guidance lives in `copy.md` (and is referenced inline from each `<!-- REPLACE: ... -->` comment in the templates). The two files are complementary: this one says **what** each token is; `copy.md` says **how** the copy should read.
6
+
7
+ Worked examples below quote the validated Sparrows Farm reference brochure at `/Users/neo/estate-agents/muvin/properties/henham-road-debden-green-hamperden-end-cb11-3lz-949931/output/brochure.html` — that brochure is the canonical "what good looks like." Read it whenever a placeholder's intent is unclear.
8
+
9
+ ## How to use this file
10
+
11
+ 1. Open the seller brief at `<property_dir>/seller-brief.md` and `<property_dir>/property.json` side-by-side.
12
+ 2. Walk the categories below top-to-bottom — common tokens first (identity, brand, agent, listing, specs), then chapter-by-chapter editorial copy.
13
+ 3. For each token, write the substitution into a single dict / map keyed by token name. The substitution step at the end of `property-brochure` reads the map and rewrites both files in one pass.
14
+ 4. Run the **completion check**: `grep -c "{{" output/brochure.html output/web/index.html`. Both files must return `0`. If any token is unsubstituted, it is a defect — the brochure is not shippable until every `{{ x }}` is gone.
15
+
16
+ ## Category 1 — Property identity
17
+
18
+ These tokens are used everywhere — cover, opener, folio strips, footer, alt text, image filenames.
19
+
20
+ | Token | Source | Format / length | Notes |
21
+ |---|---|---|---|
22
+ | `{{ property_name }}` | `property.json -> property_name`, or `address.line_1` if name is null | Title Case, ~10-30 chars | Distinct house name preferred ("Sparrows Farm", "Agincourt House"); falls back to the street ("12 Henham Road") when the property has no separate name. CSS renders it ALL-CAPS on the cover — source is Title Case. |
23
+ | `{{ property_slug }}` | `property.json -> source.url` (slug part) | lowercase-kebab | Used in every image filename pattern: `images/{{ property_slug }}-NN.webp`. Examples: `sparrows-farm`, `agincourt-house`. |
24
+ | `{{ address_line_1 }}` | `property.json -> address.line_1` | Title Case | Street or first address line ("Henham Road", "Llanddewi Rhydderch"). |
25
+ | `{{ locality }}` | `property.json -> address.locality` | Title Case | Village / town district. |
26
+ | `{{ town }}` | `property.json -> address.town` | Title Case | Nearest town. |
27
+ | `{{ county }}` | `property.json -> address.county` | Title Case | County. |
28
+ | `{{ postcode }}` | `property.json -> address.postcode` | UK format, with `&nbsp;` between out-code and in-code on the cover and in the brochure ("NP7&nbsp;9TS"). Plain in flat strings ("NP7 9TS"). | |
29
+ | `{{ address_subtitle }}` | Composed from the above | `<line_1> <em>·</em> <locality> <em>·</em> <county> <em>·</em> <postcode>`, single line | Cover subtitle. The `<em>·</em>` separators are gold-coloured via CSS. |
30
+ | `{{ folio_strip }}` | Composed | `{{ property_name }} · {{ locality }}` | Repeats on every interior page's left folio slot. |
31
+ | `{{ folio_mid_NN }}` | Per-page chapter title | "Contents" / "Of place & pedigree" / "A home at ease" / etc. | Used in `<em>` of folio-mid. Match the chapter the page belongs to (intermissions inherit their parent chapter's mid-label). |
32
+
33
+ Worked example (Sparrows Farm):
34
+ - `property_name` = "Sparrows Farm"
35
+ - `property_slug` = "sparrows-farm"
36
+ - `address_subtitle` = `Henham Road <em>·</em> Hamperden End <em>·</em> Essex <em>·</em> CB11&nbsp;3LZ`
37
+ - `folio_strip` = "Sparrows Farm · Hamperden End"
38
+
39
+ ## Category 2 — Brand pack
40
+
41
+ From the brand pack at `<brand_dir>/{description.md, DESIGN.md}` and `property.json -> agent`.
42
+
43
+ | Token | Source | Format | Notes |
44
+ |---|---|---|---|
45
+ | `{{ brand_slug }}` | `<brand_dir>` basename | lowercase-kebab | Used in logo filenames: `images/{{ brand_slug }}-logo-light.png` (dark surfaces) and `images/{{ brand_slug }}-logo-dark.png` (light surfaces). Naming convention is the **colour of the art**, not the surface — see `images.md` → "Brand logo". |
46
+ | `{{ brand_name }}` | `description.md` first line | Title Case | "Muvin", "Beacons Real Estate". |
47
+ | `{{ brand_town }}` | `description.md` officials block | Title Case | Branch town. |
48
+ | `{{ brand_county }}` | `description.md` officials block | Title Case | |
49
+ | `{{ brand_year }}` | Current year | YYYY | Used in the index.html footer copyright. |
50
+ | `{{ office_address_line_1 }}` | `description.md` registered office line | "25 Bell Street" | Street, first line of the postal address. |
51
+ | `{{ office_address_line_2 }}` | `description.md` registered office line | "Sawbridgeworth, Hertfordshire CM21 9AR" | Locality + county + postcode. |
52
+ | `{{ office_phone }}` | `property.json -> agent.phone` | Display format | "01873 377 575". |
53
+ | `{{ office_phone_tel }}` | Composed | `tel:` link format | "+441873377575" (no spaces, with country code). |
54
+ | `{{ office_email }}` | `property.json -> agent.email` | lowercase | "sales@beaconsrealestate.com". |
55
+ | `{{ email_subject_enquiry }}` | Composed | `{{ property_name }} — enquiry` | Used in mailto: subject param (URL-encode spaces if needed). |
56
+ | `{{ email_subject_viewing }}` | Composed | `{{ property_name }} — viewing request` | Same as above. |
57
+
58
+ ## Category 3 — Named agent
59
+
60
+ From `property.json -> agent`.
61
+
62
+ | Token | Source | Format | Notes |
63
+ |---|---|---|---|
64
+ | `{{ agent_first_name }}` | First name | Title Case | Goes in `<em>` on the back page contact cell. |
65
+ | `{{ agent_surname }}` | Last name (possibly hyphenated) | Title Case | Plain weight after the first name. |
66
+
67
+ Worked example (Sparrows Farm): `{{ agent_first_name }}` = "Adam", `{{ agent_surname }}` = "Mackay".
68
+
69
+ ## Category 4 — Listing references
70
+
71
+ From `property.json -> source` and `property.json -> media`.
72
+
73
+ | Token | Source | Format | Notes |
74
+ |---|---|---|---|
75
+ | `{{ listing_url }}` | `source.url` | full URL | Used in QR + listing CTAs. |
76
+ | `{{ listing_id }}` | `source.listing_id` | numeric | |
77
+ | `{{ listing_display }}` | Composed | "{{ brand domain }} &middot; listing {{ listing_id }}" | Short, scannable text for QR caption (e.g. "beaconsrealestate.co.uk · listing 1424919"). |
78
+ | `{{ video_url }}` | `media.video_tours[0]` | full URL | Empty string if no video; in that case drop the video QR per the back-page rules. |
79
+ | `{{ video_short_url }}` | derived | "youtu.be/<id>" or equivalent | Visible URL under the video QR. |
80
+
81
+ ## Category 5 — Price
82
+
83
+ From `property.json -> price`.
84
+
85
+ | Token | Source | Format | Notes |
86
+ |---|---|---|---|
87
+ | `{{ price_qualifier }}` | `price.qualifier` | "Offers Over" / "Guide Price" / "Asking Price" / "POA" | Use VERBATIM from property.json — don't paraphrase. |
88
+ | `{{ price_formatted }}` | `price.amount` | "£1,750,000" | UK-formatted with thousands separators. |
89
+ | `{{ price_line }}` | Composed | `{{ price_qualifier }} {{ price_formatted }}` | Used inline in the opener spec line. |
90
+
91
+ ## Category 6 — Specs (visible on opener, hero info-card, particulars)
92
+
93
+ From `property.json -> specifications`.
94
+
95
+ | Token | Source | Format | Notes |
96
+ |---|---|---|---|
97
+ | `{{ tenure }}` | `specifications.tenure` | "Freehold" / "Leasehold" / "Share of Freehold" | |
98
+ | `{{ year_built }}` | `specifications.year_built` | YYYY or descriptive | The hero info-card uses "c.&nbsp;YYYY". |
99
+ | `{{ epc_rating }}` | `specifications.epc_rating` | Single letter A-G or "TBC" | |
100
+ | `{{ spec_beds }}` | derived | "5 Bed" / "5 Bedrooms" | Page.html hero info-card uses short form ("5 Bed"). |
101
+ | `{{ spec_baths }}` | derived | "4 Bath" | |
102
+ | `{{ spec_area }}` | derived | "4,521 sq ft" | |
103
+ | `{{ spec_plot }}` | derived | "2.20 acres" or drop the cell if no plot | |
104
+ | `{{ opener_meta_N_label }}` / `{{ opener_meta_N_value }}` | derived | Five fixed cells | Typical labels: Bedrooms, Bathrooms, Receptions, Internal, Plot. Drop a cell (don't fill with TBC) if the value is genuinely unknown. The row MUST NOT wrap — see copy.md "Stats rows". |
105
+
106
+ ## Category 7 — TOC chapter list (page 2)
107
+
108
+ Eight chapters in the canonical folio. Each entry has three tokens.
109
+
110
+ | Token group | Format | Notes |
111
+ |---|---|---|
112
+ | `{{ toc_chapter_N_title }}` | Title Case, short | "Of place & pedigree", "A home at ease", "Hearth & hall", "Bedrooms & baths", "Terrace & outdoor kitchen", "Garden & ground", "Plan & particulars", "Material information". Adapt to the property — never use vague nouns ("garden complex"); name the actual features. |
113
+ | `{{ toc_chapter_N_sub }}` | sentence case, ~6-12 words | One-line "what's in this chapter" — appears under the title in tracked-caps small slate. |
114
+ | `{{ toc_chapter_N_page }}` | "03", "04", "06", "08", "10", "12", "14", "15" by default | MUST match the actual rendered pages. Intermissions (pages 5, 7, 11) and the site-plan page (13) are not numbered in the TOC. |
115
+ | `{{ toc_caption }}` | italic sentence, 15-30 words | Elevator pitch, sits over the TOC hero image. Distilled from seller brief Q5 ("the feeling on entry") + Q19 ("three words"). |
116
+ | `{{ toc_credit }}` | two-line block | Italic photography note + "Marketed by {{ brand_name }}, {{ brand_town }}, {{ brand_county }}." See template inline for exact format. |
117
+
118
+ ## Category 8 — Chapter editorial copy
119
+
120
+ Each chapter's narrative tokens. Length and voice rules below; the full register guidance is in `copy.md`.
121
+
122
+ ### Chapter I — Opener (page 3)
123
+
124
+ | Token | Length / voice | Source |
125
+ |---|---|---|
126
+ | `{{ chapter1_eyebrow }}` | "Chapter I · <chapter1 title>" | Match the TOC chapter-1 title. |
127
+ | `{{ opener_title_main }}` | The property name as h2 glyph | One word or compound noun. CSS renders italic. |
128
+ | `{{ opener_title_sub }}` | `<locality>, <county>` | Tracked caps via CSS. |
129
+ | `{{ opener_spec_line }}` | `<strong>{{ address_line_1 }}</strong> · {{ postcode }} &nbsp;·&nbsp; <em>{{ price_line }}</em>` | Single line. |
130
+ | `{{ opener_para_1 }}` | 4-6 sentences, dropcap. Place + age + tenure context. | Distil seller brief Q1 + Q3 + Q11. |
131
+ | `{{ opener_para_2 }}` | 3-4 sentences. Period + craft + modern comfort. End on an italic phrase. | Distil seller brief Q3 + Q10. |
132
+ | `{{ opener_image_alt }}` / `{{ opener_image_caption }}` | One factual + one italic sentence | The principal elevation or strong aerial. |
133
+
134
+ ### Chapter II — A home at ease (page 4) + intermission (page 5)
135
+
136
+ | Token | Length / voice |
137
+ |---|---|
138
+ | `{{ chapter2_eyebrow }}` | "Chapter II" |
139
+ | `{{ chapter2_heading }}` | h3, italic close — "A home <em>at ease</em>" |
140
+ | `{{ chapter2_deck }}` | one italic sentence, 12-25 words |
141
+ | `{{ chapter2_para_1 }}` | 4-6 sentences — entrance through reception to central living |
142
+ | `{{ chapter2_para_2 }}` | 3-5 sentences — kitchen specifics + utility/outdoor connection |
143
+ | `{{ chapter2_strip_N_caption_label }}` | bold lead-in (e.g. `"The kitchen."`) |
144
+ | `{{ chapter2_strip_N_caption_text }}` | one descriptive sentence |
145
+ | `{{ intermission_05_caption }}` | italic anchor sentence, 10-20 words, starts with `<em>The [room]</em>,` |
146
+
147
+ ### Chapter III — Hearth & hall / equivalent (page 6) + intermission (page 7)
148
+
149
+ Same shape as Chapter II — one eyebrow, one heading, one deck, one body paragraph (longer: 6-9 sentences walking through secondary reception rooms), one big-image alt, two stacked-image alts.
150
+
151
+ ### Chapter IV — Bedrooms & baths (page 8)
152
+
153
+ | Token | Length / voice |
154
+ |---|---|
155
+ | `{{ chapter4_eyebrow }}` | "Chapter IV" |
156
+ | `{{ chapter4_heading }}` | "Bedrooms<br>&amp; <em>baths</em>" |
157
+ | `{{ chapter4_deck }}` | italic, 15-25 words. Count + principal-suite signature. |
158
+ | `{{ chapter4_para_1 }}` | 3-5 sentences walking the sleeping floor |
159
+ | `{{ chapter4_stat_N_value }}` / `{{ chapter4_stat_N_label }}` | Big number (.v) + all-caps label (.l). Typical: 5 bedrooms / 3 bathrooms / first-floor sq ft. |
160
+ | `{{ chapter4_para_2 }}` | 2-3 sentence closer on the principal suite |
161
+ | 5 gallery cells | Mix principal-bedroom (tall feature cell) + secondary bedrooms + family bathroom. Verify pixel content matches the principal in the tall cell. |
162
+
163
+ ### Chapter V — Feature page (page 10) + intermission (page 11)
164
+
165
+ For properties with a true garden complex (pool, summerhouse, outdoor kitchen, paddocks) this is the leisure chapter. For others, repurpose to the property's most distinctive outdoor or auxiliary feature (annexe, studio, terrace, pavilion).
166
+
167
+ | Token | Length / voice |
168
+ |---|---|
169
+ | `{{ chapter5_eyebrow }}` | "Chapter V · <feature title>" |
170
+ | `{{ chapter5_heading }}` | italic editorial headline, two-line |
171
+ | `{{ chapter5_deck }}` | italic, 18-30 words |
172
+ | `{{ chapter5_para }}` | 5-7 sentences. **Name each feature exactly** — outdoor kitchen ≠ summerhouse ≠ orangery; see structure.md "Distinguishing features clearly". |
173
+ | `{{ chapter5_attr_N_label }}` / `{{ chapter5_attr_N_value }}` | Four crisp facts — plot, signature feature, count, material. |
174
+ | `{{ intermission_11_caption }}` | italic anchor sentence |
175
+
176
+ ### Chapter VI — Garden & ground (page 12) + site plan (page 13)
177
+
178
+ | Token | Length / voice |
179
+ |---|---|
180
+ | `{{ chapter6_eyebrow }}` | "Chapter VI" |
181
+ | `{{ chapter6_heading }}` | italic two-line |
182
+ | `{{ chapter6_panel_N_heading }}` / `{{ chapter6_panel_N_body }}` | Four panels each: italic h4 + 2-3 sentence body. Typical four: rear garden, paddocks/plot, front/approach, ancillary outbuildings. Re-title per property. |
183
+ | `{{ siteplan_eyebrow }}` | "Continued, Chapter VI · The plot" |
184
+ | `{{ siteplan_heading }}` | the plot's headline fact ("In excess of <em>2.20 acres</em>", "The <em>plot &amp; outlook</em>") |
185
+ | `{{ siteplan_panel_N_heading }}` / `{{ siteplan_panel_N_body }}` | Three panels: plot, boundary, garden complex / outbuildings. |
186
+
187
+ ### Chapter VII — Plan & particulars (page 14)
188
+
189
+ | Token | Length / voice |
190
+ |---|---|
191
+ | `{{ chapter7_eyebrow }}` | "Chapter VII · Plan &amp; particulars" |
192
+ | `{{ chapter7_heading }}` | "All floors <em>at a glance</em>" |
193
+ | `{{ floorplan_lead }}` | italic — "Total internal area · <em>X sq ft</em> · Y m&sup2;" |
194
+ | `{{ floorplan_sub }}` | Floor-by-floor breakdown + ancillary footprints, joined by &nbsp;·&nbsp;. **List outbuildings separately** — never silently roll detached gymnasium / garage / annexe sq ft into the principal home figure. See structure.md "Floor area". |
195
+ | `{{ particular_N }}` × 9 | Numbered particulars — each a single short sentence with `<strong>` on the named element. Sequence: architectural fact → character feature → kitchen specifics → heating/services → signature internal → signature outdoor → ancillary buildings → plot → outlook. Drop unused slots; never go over 9 (column overflows). |
196
+ | `{{ epc_current_a..g }}` | The matching band gets ` current` (leading space → CSS class). All others empty string. Exactly one is non-empty. |
197
+ | `{{ epc_caption }}` | 1-2 sentences on heating + what the band reflects. |
198
+
199
+ ### Chapter VIII — Material information (page 15)
200
+
201
+ Every `{{ mi_* }}` token corresponds to a Material Information row. Mark unknowns "TBC" verbatim — **never invent**. Drop a row only if the field is genuinely not applicable (e.g. Coastal Erosion for an inland home). `{{ mi_part_b_extra_label }}` / `{{ mi_part_b_extra_value }}` is a per-property slot for a distinctive fact (e.g. "Pool", "Annexe", "Outdoor"). See structure.md "Material Information".
202
+
203
+ ### Back page (page 16)
204
+
205
+ | Token | Length / voice |
206
+ |---|---|
207
+ | `{{ backpage_bg_src }}` / `{{ backpage_bg_alt }}` | Atmospheric exterior at golden hour (slot 26 or back-equivalent). |
208
+ | `{{ backpage_headline }}` | "Arrange a viewing of <em>{{ property_name }}</em>" — canonical phrasing. |
209
+ | `{{ backpage_tagline }}` | 25-45 words. Mirrors but does not duplicate the cover/opener. Close with "Best understood in person." or equivalent clincher. |
210
+
211
+ ## Category 9 — index.html (landing) editorial copy
212
+
213
+ The landing page mirrors the brochure's content but in a continuous-scroll form. Tokens are prefixed `landing_*` to avoid name collisions with the brochure tokens. Sections:
214
+
215
+ | Section | Tokens | Notes |
216
+ |---|---|---|
217
+ | Story | `{{ landing_story_eyebrow }}`, `{{ landing_story_headline }}`, `{{ landing_story_para_1 }}`, `{{ landing_story_para_2 }}` | Same source as Chapter I opener but scaled for screen — para 1 short (3-4 sentences) for dropcap legibility; para 2 longer (4-6). |
218
+ | Home | `{{ landing_home_eyebrow }}`, `{{ landing_home_headline }}`, `{{ landing_home_para_1..3 }}` | Three paragraphs: entrance/flow, kitchen-dining, reception/orangery. |
219
+ | Bedrooms | `{{ landing_bedrooms_eyebrow }}`, `{{ landing_bedrooms_headline }}`, `{{ landing_bedrooms_para_1..2 }}` | Two paragraphs. |
220
+ | Garden | `{{ landing_garden_eyebrow }}`, `{{ landing_garden_headline }}`, `{{ landing_garden_para_1..2 }}` | Two paragraphs. |
221
+ | Area | `{{ landing_area_eyebrow }}`, `{{ landing_area_headline }}`, `{{ landing_area_para_1..2 }}` | Two paragraphs — admin/transport + qualitative setting. |
222
+ | Photo grids 1-6 | `{{ landing_grid_N_src_a..d }}` / `{{ landing_grid_N_alt_a..d }}` | Four cells per grid; image filenames reference the same {{ property_slug }}-NN.webp slots used in the brochure. |
223
+ | Floor plan section | `{{ landing_floorplan_heading }}`, `{{ landing_floorplan_lead }}`, `{{ landing_floorplan_row_N_k }}` / `{{ landing_floorplan_row_N_v }}` × 5 | Up to 5 rows + an EPC row that reuses `{{ epc_rating }}`. Drop a row if the property doesn't have that footprint. |
224
+ | Key facts | reuses `{{ mi_* }}` tokens from the brochure + `{{ landing_flood_summary }}` | The landing-page "Key facts" compresses Part A into 15 rows. |
225
+ | CTA strip | `{{ landing_cta_headline }}` | "Interested? Let's talk." or property-specific. |
226
+ | Nav anchors | `{{ nav_section_1..4 }}` | Defaults: "Story", "The Home", "The Garden", "The Area". Rename only if the property's narrative arc differs. |
227
+ | `{{ hero_tag }}` | "For Sale · New" / "For Sale" | The small tracked-caps tag on the hero info-card. |
228
+ | `{{ hero_N_src }}` / `{{ hero_N_alt }}` × 3 | Three Ken-Burns hero slides. THREE DIFFERENT MOMENTS — not three angles. |
229
+ | `{{ page_title }}` | "<Property name> · <street>, <locality> · For Sale" | Browser tab. |
230
+ | `{{ meta_description }}` | Same single-sentence pitch as `{{ backpage_tagline }}`. |
231
+
232
+ ## Completion check
233
+
234
+ The substitution step that runs `property-brochure` should end with this verification gate:
235
+
236
+ ```bash
237
+ PROP=<property_dir>
238
+ remaining=$(grep -c '{{' "$PROP/output/brochure.html" "$PROP/output/web/index.html" 2>/dev/null | awk -F: '{s+=$2} END {print s}')
239
+ if [ "$remaining" -gt 0 ]; then
240
+ echo "DEFECT: $remaining unsubstituted {{ tokens }} remain — see grep '{{' output/"
241
+ exit 1
242
+ fi
243
+ echo "Substitution clean."
244
+ ```
245
+
246
+ A brochure with any `{{ x }}` remaining in the rendered output is shipped broken — the verification gate is mandatory.
247
+
248
+ ## Adding a new token
249
+
250
+ If a property has a feature the canonical placeholder set doesn't cover (e.g. an annexe with separate utility, a wine cellar, a moat — they exist), do not invent a new token in the templates without also adding the entry here. The substitution contract is what catches the bug; an unlisted token gets silently ignored by the substitution step and the brochure ships with `{{ wine_cellar }}` literal in the body. Either reuse an existing token, or add the new one to this file AND to template.html/index.html before rendering.
@@ -0,0 +1,47 @@
1
+ # Visual register — premium vs branded
2
+
3
+ The skill template ships with a default super-premium visual scheme. Two registers govern how that scheme interacts with the agent's brand pack.
4
+
5
+ ## Default scheme baked into `references/template.html`
6
+
7
+ - **Type**: Cormorant Garamond (display, italics for emphasis) + Lora (humanist serif body) + Inter (tabular numerics, particulars labels)
8
+ - **Palette**: ivory paper (`#F8F4ED`), ink (`#0E1418`), bronze (`#7A6235`), antique gold (`#A4884C`), champagne (`#C9B07A`)
9
+ - **Voice**: editorial, considered, country-house tone — chapters numbered in Roman, dropcaps, pull quotes
10
+ - **Layout**: A4 landscape, 16 pages, asymmetric photo grids, full-bleed feature spreads, intermission breaks between chapters, ornamental rules between sections
11
+
12
+ ## The two registers
13
+
14
+ | Register | What you change |
15
+ |---|---|
16
+ | **Premium** (template scheme retained) | Keep all super-premium tokens (palette, type, layout) verbatim. Swap **only** the agent's logo (back-page masthead + TOC credit) and the agent's contact details. Make subtle consistency adjustments — e.g. the accent dot in "Brand · Town" can pick up the brand's primary colour if doing so doesn't disrupt the ivory/ink/bronze relationship. **Do not apply the brand's palette or type tokens.** |
17
+ | **Branded** (full DESIGN.md re-skin) | Swap font names at the `--serif` / `--body-serif` / `--sans` custom properties; replace palette tokens (`--paper-25`, `--ink`, `--gold-500`, `--gold-700`, `--gold-300`, `--rule` etc.) with the DESIGN doc's values; adjust copy register to match the brand's voice; substitute the brand's logo PNGs at the back-page masthead and TOC credit. The chapter structure (sixteen pages, Roman-numeral chapters, italic headlines, editorial decks, intermissions, gallery, site plan) stays. |
18
+
19
+ ## Selecting the register — decide in this order
20
+
21
+ 1. **The user said "premium" or "super-premium"** in the request → **Premium**, regardless of whether a DESIGN.md exists.
22
+ 2. **A DESIGN.md is provided** and the user did *not* say "premium" → **Branded**.
23
+ 3. **Neither a DESIGN.md nor the word "premium"** → **Premium** (the template ships with super-premium defaults already in place).
24
+
25
+ The signal is the user's wording, not the property. Don't infer premium from a high guide price or a country-house name when the user has handed over a DESIGN.md without qualifying language — the agent may want their brand on every brochure regardless of property tier. Conversely, when the user says "premium" but the property is plainly mid-market (a £450k semi, a city flat), surface the mismatch in one line ("Going premium register — confirm you want the country-folio look on this listing?") before generating, so the user can correct the wording rather than discover the mismatch in the rendered output.
26
+
27
+ ## Forbidden template sources
28
+
29
+ **Do not** start from any of the following, even when they exist in the same brand workspace and look "more on-brand" than the skill template:
30
+
31
+ - `<brand>/properties/<other-listing>/output/brochure.html` — a sibling property's rendered brochure
32
+ - A previous brochure that was hand-edited after the last template release
33
+ - A "brand brochure" or "marketing PDF" supplied by the agency
34
+ - An older version of `template.html` cached anywhere outside `~/.claude/plugins/real-estate-brochure/skills/property-brochure/references/`
35
+
36
+ Sibling brochures contain property-specific copy edits, hand-tuned image positions, ad-hoc CSS overrides, and drift from the canonical layout. Starting from one bakes that drift into the new brochure and silently diverges every property's structure over time. The DESIGN doc supplies design **tokens** (fonts, palette, voice) — it does not authorise reaching for an existing brochure as a starting point.
37
+
38
+ If the canonical `references/template.html` looks wrong for the brand, the right action is to **patch the template** (open a discussion with the user about what to change), not to substitute a different starting point for one run.
39
+
40
+ ## What neither register authorises
41
+
42
+ - Replacing the skill template with a brand's existing brochure HTML
43
+ - Restructuring the page count, page order, or chapter grid because the brand's other materials look different
44
+ - Adding new pages, removing pages, or merging spreads to "look more like" the brand's website
45
+ - Importing CSS from the brand's website into the brochure to "match the live experience"
46
+
47
+ If a branded re-skin is genuinely incompatible with the sixteen-page editorial folio (rare — most brands sit happily in this structure with token swaps), surface that to the user before generating anything. Don't unilaterally substitute structure. Any alternative count must still be **even** — see `a4-print-documents` → Even-page count for duplex printing.
@@ -0,0 +1,56 @@
1
+ # Seller brief — the source of editorial voice
2
+
3
+ The seller brief at `<property_dir>/seller-brief.md` is the single most influential input to the brochure's copy. It is an interview document with 20 questions that the operator collected from the seller (the home's current owner). Read it once, in full, before writing any chapter copy. It does not get quoted verbatim unless an answer is explicitly marked `[VERBATIM]` — it is *distilled* into the editorial register.
4
+
5
+ A complete brief is a precondition for `property-brochure` (and the orchestrator gates on it — see `make-brochure → Brief routing`). If the brief is missing or incomplete, stop and report the gap; do not synthesise answers from the listing description.
6
+
7
+ ## Per-question mapping — what each answer informs
8
+
9
+ The 20 questions cluster into four uses: **voice setters** (Q5, Q19, Q20 — set tone of the cover and opener), **body content** (Q1–4, Q6, Q7, Q11–14 — body paragraphs across chapters), **list emphasis** (Q8–10, Q18 — particulars list and feature highlights), and **disclosure** (Q15–17 — buyer avatar and Material Information context).
10
+
11
+ | Question | What it informs in the brochure |
12
+ |---|---|
13
+ | **Q1.** Why did you first buy this home? | Opener body paragraph 1 (the home's "of place & pedigree" framing) |
14
+ | **Q2.** Length of ownership / why selling now | Not surfaced directly; informs the brochure's tense and time-frame voice |
15
+ | **Q3.** What you love most | Cover sub-line candidate; opener body paragraph 2 (the "what makes this house unusual" hook) |
16
+ | **Q4.** What you'll miss most | Back-page tagline candidate; orangery / sitting-room caption |
17
+ | **Q5.** Feeling on first walking through the door | **The opening chapter deck** — the single italic sentence at the top of page 3. This is the brochure's tone-of-voice contract. |
18
+ | **Q6.** Your favourite room | The room that gets *hero* treatment in its chapter (tall feature cell, full-bleed intermission, or strongest in-spread image). The brochure agent re-orders slot priority around this answer. |
19
+ | **Q7.** Lifestyle the home supports | Buyer-avatar tone of every body paragraph; choice of which chapter gets emphasis (e.g. an entertainer's home leans into pool/kitchen/dining; a quiet retreat leans into garden/orangery) |
20
+ | **Q8.** Renovations done? | Particulars list i–iii items; opener body paragraph 2 |
21
+ | **Q9.** What changed and why | Particulars list item phrasing — *what* the seller did becomes the headline; *why* becomes the qualifying clause |
22
+ | **Q10.** Design details others notice | Strip-cell captions (page 4); attr-grid features (page 7 feature page) |
23
+ | **Q11.** What you love about the local area | Garden & ground page text panels (rear garden, front & approach, ancillary) |
24
+ | **Q12.** Hidden gems nearby | Garden & ground secondary panel; possibly a footnote on the back page |
25
+ | **Q13.** Commute / transport | Opener spec line (e.g. "*Essex · CB11 3LZ · 50 minutes from Liverpool Street*") if commutable |
26
+ | **Q14.** Community vibe | Garden & ground tone; back-page tagline supporting line |
27
+ | **Q15.** Who this home suits best | Buyer-avatar tone (reinforces Q7) |
28
+ | **Q16.** Hoped-for next buyer | Tone of the back-page CTA ("Arrange a viewing of …") |
29
+ | **Q17.** Anything that needs context before viewings | Material Information page note (page 11) — the "context" line above the disclosure grid, or a footnote on a specific MI row |
30
+ | **Q18.** What buyers might overlook | Promotes a slot from strip-cell to hero, or surfaces a particular in the list that wouldn't otherwise be there |
31
+ | **Q19.** Three words to describe the home | **Cover sub-line OR opening chapter deck.** The seller's three words appear unrephrased — they are the home's tagline. If the cover already uses Q5 for the deck, Q19 lands on the cover sub-line in tracked-caps small. |
32
+ | **Q20.** Feeling, story, or phrase for buyers to connect with | **Cover tagline OR back-page tagline.** This is the single phrase the brochure carries. If marked `[VERBATIM]`, it is preserved word-for-word. Otherwise it is gently distilled into the editorial register. |
33
+
34
+ ## Distil, don't quote — except [VERBATIM]
35
+
36
+ Sellers' answers are conversational. The brochure's register is editorial. Most answers are *distilled* — the seller's "we love how the morning light comes through the chapel windows of the principal bedroom" becomes a deck like *"the morning light through chapel-style windows."* The seller's **information** survives; the seller's **conversational cadence** does not, except where they tag an answer `[VERBATIM]`.
37
+
38
+ `[VERBATIM]` is a contract: the answer is preserved exactly, in italic, as a pull-quote on a chapter page or as the back-page tagline. Use it sparingly — at most one or two per brochure. The Q20 answer is the most common candidate; Q4 and Q5 occasionally.
39
+
40
+ ## Worked example — Sparrows Farm
41
+
42
+ (Hypothetical — Sparrows Farm shipped without a brief; a real example would source from the seller.)
43
+
44
+ > **Q5.** A buyer should feel that the home is *settled*. Six hundred years of beam and stone with a kitchen that wants to be cooked in.
45
+ >
46
+ > **Q19.** *Settled. Restored. Loved.*
47
+ >
48
+ > **Q20.** [VERBATIM] *A timeless home, lived in well.*
49
+
50
+ Becomes:
51
+
52
+ - Opening chapter deck (page 3): "A home built to be settled in — six hundred years of beam and stone, with a kitchen that wants to be cooked in."
53
+ - Cover sub-line (page 1): "SETTLED · RESTORED · LOVED" (tracked caps, beneath the title)
54
+ - Back-page tagline (page 16): *"A timeless home, lived in well."* — preserved verbatim, in italic, beneath "Arrange a viewing of …"
55
+
56
+ The brochure agent records which question informed which copy element in a one-line internal log so a reviewer can check that every brief answer found a place in the brochure.
@@ -0,0 +1,249 @@
1
+ # Brochure structure — orientation, 16-page layout, cover, floorplan, features, MI, QR, map
2
+
3
+ ## Orientation
4
+
5
+ Brochures ship in either **landscape** (297×210mm A4, default — the editorial folio is designed for it) or portrait (210×297mm A4). The choice changes page geometry, render-slot dimensions, print snapshot pixel sizes, the PDF call, and which page layouts make visual sense — it is **not a cosmetic flag**. Every downstream measurement has a landscape value and a portrait value.
6
+
7
+ ### When to ask
8
+
9
+ Default to landscape unless the user says otherwise. The folio's editorial layouts (split heros, wide caption strips, full-bleed feature spreads, three-column plan + particulars + EPC pages) are tuned for landscape proportions; portrait works but compresses the spreads. If the user explicitly asks for portrait, fine — re-test every page's `scrollHeight` against the new fit budget before generating snapshots. If a prior brochure for this property exists at `<property_dir>/output/brochure.html`, inherit its orientation by reading the CSS (`@page { size: A4 landscape | portrait }`) rather than asking again.
10
+
11
+ ### Dimensional contract
12
+
13
+ | Quantity | Landscape (default) | Portrait |
14
+ |---|---|---|
15
+ | `.page` width × height | 297mm × 210mm | 210mm × 297mm |
16
+ | Page fit budget (px @ 96dpi) | 1123 × **794** | 794 × **1123** |
17
+ | Print snapshot pixel dimensions | 1123×794 | 794×1123 |
18
+ | `@page` rule | `size: A4 landscape` | `size: A4 portrait` |
19
+ | Playwright `page.pdf()` | `landscape: true` | (default; portrait) |
20
+ | "Safe to read" snapshot ceiling | longest-edge 1123px | longest-edge 1123px |
21
+
22
+ The 1600px image-source ceiling from `images.md` is unchanged — it provides 2× retina headroom for full-bleed images at either orientation.
23
+
24
+ ### Reference template orientation swap
25
+
26
+ `references/template.html` ships **landscape** (`width: 297mm; min-height: 210mm` across `.page`, `.cover`, `.backpage`, plus `@page { size: A4 landscape }` in the print CSS). For portrait, swap every `297mm` ↔ `210mm` in those rules and change `@page { size: A4 landscape }` to `@page { size: A4 portrait }`. The page-internal flex/grid layouts then redistribute against the new aspect — re-test every page's `scrollHeight` against the new fit budget (1123 instead of 794) before generating snapshots, and expect the editorial feel to compress: the wide caption strips and side-by-side spread layouts will need to stack rather than sit alongside.
27
+
28
+ ## 16-page structure
29
+
30
+ Each page is a `<section class="page">` (or `.cover` / `.backpage`) sized to the chosen orientation: `width: 297mm; min-height: 210mm` (landscape) or `width: 210mm; min-height: 297mm` (portrait). Every page must fit within the orientation's short-edge budget (794px landscape, 1123px portrait — both at 96dpi). Measure with `element.scrollHeight` during development against that budget and adjust image heights with inline styles if content overflows.
31
+
32
+ The page count is **sixteen** so the brochure prints cleanly on duplex (16 is even) and binds cleanly as a saddle-stitched booklet (16 ÷ 4 = 4 folded sheets). See `a4-print-documents` → **Even-page count for duplex printing**.
33
+
34
+ | Page | Class | Chapter | Key content |
35
+ |------|-------|---------|-------------|
36
+ | 1 | `.cover` | Cover | Split layout — paper title block on top with property name + address subtitle, full-bleed hero photo below |
37
+ | 2 | `.page` | Contents (TOC) | Editorial image with caption, eight-chapter table of contents (Roman i–viii), credit line, folio strip |
38
+ | 3 | `.page` | I · Of place & pedigree | Opener — property name with county sub-line, street + postcode + price spec, 5-stat row, two-paragraph editorial intro with dropcap, principal elevation image with caption |
39
+ | 4 | `.page` | II · A house at ease | Hero open-plan image, text column, three-image caption strip |
40
+ | 5 | `.page intermission` | (no chapter — visual breath) | Full-bleed image-only spread between chapters; no editorial copy |
41
+ | 6 | `.page` | III · Hall, hearth & sun | Split header, large left image, two stacked right images |
42
+ | 7 | `.page intermission` | (no chapter — visual breath) | Full-bleed image-only spread between chapters |
43
+ | 8 | `.page` | IV · Bedrooms & baths | Text column with 3-stat row, 5-cell gallery (one tall feature) |
44
+ | 9 | `.page gallery-page` | Image-led additional internal | Full-page asymmetric photo grid (no body copy), gallery head with eyebrow + title, captions per cell |
45
+ | 10 | `.page` | V · Pool, outdoor kitchen & summerhouse | Full-bleed feature image, narrow text panel with attribute grid (repurpose if no leisure block — annexe / studio / outbuilding) |
46
+ | 11 | `.page intermission` | (no chapter — visual breath) | Full-bleed outdoor image-only spread |
47
+ | 12 | `.page folio-dark` | VI · Garden & ground | Full-bleed aerial with overlaid title, four short-text panels, dark-pill folio chrome |
48
+ | 13 | `.page siteplan-page` | (extension of VI) | Dedicated site-plan page — large plot plan on one side, plot/grounds text panel on the other |
49
+ | 14 | `.page` | VII · Plan & particulars | Wide chapter header, large floor plan + meta, 8-9 item particulars list, EPC bar chart |
50
+ | 15 | `.page` | VIII · Material information | Three-section disclosure grid (Parts A/B/C), boilerplate footer |
51
+ | 16 | `.backpage` | Back page | Atmospheric background, brand masthead, CTA headline, tagline, two-cell contact grid (agent + office), QR strip (video tour + listing), folio footer, disclaimer |
52
+
53
+ **Page-type classes.** The default folio uses three structural extensions to the base `.page`:
54
+
55
+ - `.intermission` — full-bleed photo spread with no editorial copy. Three intermissions sit between chapters (after II, IV/gallery, V) to give the eye a beat. If the property doesn't have enough strong landscape/atmospheric photos to fill all three, drop the weakest intermission rather than reusing an image.
56
+ - `.gallery-page` — asymmetric grid of property photos (typically 4–5 cells with one tall feature) with a small head block and per-cell captions. Used for "rooms in passing" — supplementary internal shots that don't anchor a chapter.
57
+ - `.siteplan-page` — dedicated plot-plan page with a large plan image and a text-side panel describing acreage, paddocks, drives, outlook. Pairs with the **Garden & ground** chapter — both pages share Roman numeral VI.
58
+ - `.folio-dark` — applied to dark/photo-heavy pages so the folio chrome swaps to light-on-dark.
59
+
60
+ ## Cover layout — title block above, photo below
61
+
62
+ The cover is the property's name plate, not its full pitch. The reference register (Knight Frank country houses, Strutt & Parker folios, Sotheby's International Realty) uses a **split layout**:
63
+
64
+ 1. Top ~85mm of paper, ivory background, with the property name in serif caps with heavy letter-spacing, flanked by hairline gold rules, with one tracked-caps subtitle below (full address)
65
+ 2. Bottom ~125mm full-bleed photographic image — the strongest single hero shot, no overlays
66
+
67
+ **Do not** place price, edition number, folio number, masthead with brand logo, tagline paragraph, or location eyebrow over the cover photo. Each of those is a contrast-fight against the photo and a magnet for the panel-treatment work-around. The cover reads as confident only when the image is unblemished.
68
+
69
+ Where do those data points go instead?
70
+
71
+ | Data point | Lives on |
72
+ |---|---|
73
+ | Property name + full address | Cover title block (the only thing on the cover) |
74
+ | Price | Page 3 opener, beneath the property name in italic, *and* in Material Information |
75
+ | Folio / reference number | Back page, foot-left in tracked caps, *and* implicitly in the URL |
76
+ | Edition / season | Optional, back page foot-right; usually omitted for evergreen brochures |
77
+ | Brand masthead / agency name | Back page top, as a logo (light/white variant on the dark back-page hero) |
78
+ | Tagline | Page 3 opener body or back-page tagline |
79
+
80
+ The Knight Frank pattern: **the property speaks first**. The agency surfaces on the back where the buyer reads contact details. The price surfaces on the second spread, after the buyer has seen the photo.
81
+
82
+ ## Floorplan sizing (page 10)
83
+
84
+ Floorplans are the most information-dense images in the brochure. The plan area on page 10 is the largest rectangle that does not push the particulars list, EPC bar, or chapter header off A4. Use `object-fit: contain; width: 100%; height: 100%` so the image fills the slot without distortion. Wide-aspect floorplans leave vertical headroom; tall ones leave horizontal headroom — that's expected and fine. After any change, measure both `scrollHeight` against the orientation's page-fit budget (794px landscape / 1123px portrait) **and** the spec-side column's `scrollHeight` against `clientHeight` — text overflow is the silent failure that a screenshot can hide.
85
+
86
+ If a brochure has multiple floor plans (per-floor breakdowns), tune the layout to the images' aspect ratios rather than splitting evenly. A 2:1 wide-aspect plan needs less vertical room than a 1.16:1 nearly-square one.
87
+
88
+ ## Distinguishing features clearly — "outdoor kitchen" ≠ "summerhouse" ≠ "orangery"
89
+
90
+ Property listings in this register often have several distinct outdoor or auxiliary buildings, each photographed separately. The brochure must keep them distinct in copy *and* match each photo to the right structure. The recurring failure mode is collapsing them into a single noun ("the cedar pavilion", "the garden complex") that means different things on different pages.
91
+
92
+ For Henham/Sparrows-Farm-style country homes the typical glossary is:
93
+
94
+ | Feature | Description | Photo cue |
95
+ |---|---|---|
96
+ | **Outdoor kitchen** | Cedar-clad cooking pavilion with sloped tile roof, sink, grill, often a wood-fired oven, bench or table seating | Wood/cedar walls dominate; no glass walls; cooking equipment visible |
97
+ | **Summerhouse** | Detached glass-walled structure on a raised stone plinth, accessed by steps, often houses a gym or studio | Glass walls dominate; not for cooking; raised on plinth |
98
+ | **Orangery** | Internal-to-the-home glass-roofed reception room, opens onto patio, used as a third living room | Inside the home's footprint; vaulted glass roof; furnished with sofas |
99
+ | **Garden room** | A room within the home or a detached pavilion overlooking the garden, less glass-heavy than the orangery | Often has corner glazing but solid walls behind |
100
+
101
+ Use the precise noun in copy and the precise photo per chapter. Do **not**:
102
+
103
+ - Call the outdoor kitchen "the summerhouse" because both are outdoor structures
104
+ - Call the summerhouse "the cedar pavilion" because cedar is the cladding material of the *outdoor kitchen*; the summerhouse is glass-walled
105
+ - Use "garden complex" as a chapter title — it's vague; use the actual feature names
106
+ - Conflate the orangery (interior reception) with the garden room (different room entirely)
107
+
108
+ Verify each feature has its own photograph and its own paragraph. If the property has a feature that isn't photographed prominently (e.g. the summerhouse only appears in a wide drone shot), surface that as `DONE_WITH_CONCERNS` so the user can decide whether to commission a shot or downplay the feature in the copy.
109
+
110
+ ## Material Information (UK regulatory compliance)
111
+
112
+ Three tiers per National Trading Standards and DMCCA 2024. Populate all known fields; mark unknowns as "TBC":
113
+
114
+ - **Part A** (all transactions): price, tenure, council tax, property type, rooms, floor area, utilities (electricity, water, sewerage, heating), broadband, mobile, parking, EPC
115
+ - **Part B** (where applicable): building safety, covenants, rights of way, easements, listed status, conservation area, TPOs, accessibility
116
+ - **Part C** (additional facts): flood risk, coastal erosion, planning, construction type, structural issues, subsidence, damp, asbestos, knotweed, mining
117
+
118
+ ### Floor area — exclude detached outbuildings
119
+
120
+ Total internal floor area is the sum of the principal home's floors. **Do not include detached outbuildings** (gymnasium-summerhouses, garages, plant rooms, garden offices) in the principal floor figure even when they sit at the same level on the floor plan or share a footprint reference. List them separately:
121
+
122
+ > Floor 1 · 2,573 sq ft · Floor 2 · 1,948 sq ft · Gymnasium (summerhouse) · 495 sq ft · Garage · 338 sq ft
123
+
124
+ A first-floor figure that secretly includes a detached gymnasium is a misrepresentation — even by a small amount it changes the £/sq ft and the comparable. Keep the principal home's floors honest, and disclose ancillary footprints alongside.
125
+
126
+ ### Pulling material data from a third-party report
127
+
128
+ For UK listings, a Sprift, Propalt or PropertyData report can supply many Part A and Part B/C values that are not on the public listing page. When the user supplies a Sprift report URL or invokes one of the API endpoints below, navigate the page in a browser (not `WebFetch` — Sprift dynamically loads its sections) and extract:
129
+
130
+ | Source | What it adds |
131
+ |---|---|
132
+ | [Sprift KFB report](https://reports.sprift.com/...) | Tenure, title number, council tax band + £, EPC current/potential, broadband (FTTP/FTTC/ADSL speeds), mobile signal coverage, flood risk, conservation area, restrictive covenants, UPRN, local authority, plot acreage |
133
+ | [Sprift API](https://sprift.com/data-and-api) | Same fields programmatically |
134
+ | [Propalt API](https://propalt.co.uk/product/api) | Material info bundled |
135
+ | [PropertyData / Land Registry API](https://propertydata.co.uk/api/land-registry) | Title number, sold-history, deed restrictions |
136
+
137
+ Sprift's KFB report is the most useful free-form source — it's a single URL the user pastes, contains nearly everything needed for Part A, and is current. Treat the listing page as authoritative for marketing copy (price, photos, key features) and the Sprift KFB report as authoritative for compliance data (tenure, broadband, flood risk).
138
+
139
+ ## Back-page QR codes — clickable, with visible URL
140
+
141
+ The back page includes two QR codes, one for the video tour and one for the listing URL. The QR images alone are sufficient for a printed brochure (a viewer scans with their phone), but the brochure is *also* read as a digital PDF and as a hosted web page, where a QR code is unscannable from the same screen. Each QR must therefore have:
142
+
143
+ 1. The QR image itself (for print scanning).
144
+ 2. A short label above describing what it links to ("Watch the *video tour*", "View the *full listing*").
145
+ 3. **A visible, underlined URL beneath the label** — short and human-readable (e.g. `youtu.be/8V7jjS5ZyeI`, `muvin.co.uk · listing 949931`).
146
+ 4. **The whole stack wrapped in an `<a>` tag with `target="_blank" rel="noopener"`** so the QR image, label and URL are all clickable in the digital PDF and on the web.
147
+
148
+ Markup:
149
+
150
+ ```html
151
+ <div class="back-qr-strip">
152
+ <a class="qr" href="https://youtu.be/<videoId>" target="_blank" rel="noopener">
153
+ <img src="images/qr-video.png" alt="Scan or click to view the property video tour">
154
+ <div class="qr-label">Watch the <em>video tour</em></div>
155
+ <div class="qr-link">youtu.be/<videoId></div>
156
+ </a>
157
+ <a class="qr" href="https://<agent>.co.uk/property/<slug>/<id>/" target="_blank" rel="noopener">
158
+ <img src="images/qr-listing.png" alt="Scan or click to view the full property listing">
159
+ <div class="qr-label">View the <em>full listing</em></div>
160
+ <div class="qr-link"><agent>.co.uk &middot; listing <id></div>
161
+ </a>
162
+ </div>
163
+ ```
164
+
165
+ The `.qr-link` is **always present** — never empty. A printed brochure shows it as a typeset URL; a digital reader hovers and clicks it. Don't let the URL wrap awkwardly: keep it short (path stripped), use `&middot;` to separate domain and identifier, and apply `font-variant-numeric: tabular-nums` to the digits so they kern cleanly in the underlined treatment.
166
+
167
+ Default styling:
168
+
169
+ ```css
170
+ .back-qr-strip a.qr {
171
+ display: flex; flex-direction: column; align-items: center; gap: 6px;
172
+ text-decoration: none; color: inherit;
173
+ transition: opacity 200ms ease;
174
+ }
175
+ .back-qr-strip a.qr:hover { opacity: 0.85; }
176
+ .back-qr-strip .qr-link {
177
+ font-family: var(--sans);
178
+ font-size: 9px; font-weight: 400;
179
+ text-decoration: underline;
180
+ text-decoration-color: rgba(201,176,122,0.45);
181
+ text-underline-offset: 3px;
182
+ color: var(--gold-300);
183
+ text-align: center;
184
+ font-variant-numeric: tabular-nums;
185
+ margin-top: 4px;
186
+ }
187
+ ```
188
+
189
+ A common mistake is to ship QR codes without the visible URL — it makes the digital experience worse than the print one. The visible URL is mandatory.
190
+
191
+ ## Location map — extract or omit
192
+
193
+ The brochure includes a location map **only when the source listing supplies one**. When the listing has no map, the brochure ships without a map slot. The pipeline never synthesises a map from a postcode, an OSM static-tile call, or AI-generated artwork — postcode centroids can mislead about exact location, and the brochure should reflect what the agent actually publishes, not what the pipeline could imagine. **Extract or omit.**
194
+
195
+ ### How the conditional works
196
+
197
+ `property-extract` screenshots whatever map element exists on the listing — provider-agnostic by design. Google Maps iframes (Loop CRM / Muvin), Mapbox or Leaflet div+canvas builds, static-map `<img>` tags from Rightmove-style backends, Apple/Bing embeds — they all land as `<property_dir>/images/map.webp` and `media.map: "map.webp"` in `property.json`. When no map element is detected on the listing, both `media.map` and (typically) `address.geo` are `null`. See **Map — extract or omit** in the property-extract SKILL for the heuristic detector and the screenshot contract.
198
+
199
+ The template ships with a marker-bounded conditional block on page 10 (Plan & particulars), in the `.spec-side` column above the EPC bars:
200
+
201
+ ```html
202
+ <!-- BROCHURE_MAP_SLOT_START
203
+ CONDITIONAL: render only when property.json -> media.map is non-null.
204
+ If media.map is null, DELETE everything between BROCHURE_MAP_SLOT_START
205
+ and BROCHURE_MAP_SLOT_END (inclusive of both marker comments). -->
206
+ <figure class="location-map">
207
+ <img src="images/map.webp" alt="Location of Property Name — Town, Postcode">
208
+ <figcaption>Source: Google Maps &copy; YYYY Google</figcaption>
209
+ </figure>
210
+ <!-- BROCHURE_MAP_SLOT_END -->
211
+ ```
212
+
213
+ The agent's job at brochure-assembly time:
214
+
215
+ | `property.json -> media.map` | Action |
216
+ |---|---|
217
+ | Filename string (e.g. `"map.webp"`) | Leave the block in place. Copy `<property_dir>/images/map.webp` into `<output>/images/map.webp` (re-encode at 1500px / q86 if not already optimised). Substitute the filename, alt text (property name + town/postcode), and the year in the figcaption. |
218
+ | `null` | **Delete** every line between `<!-- BROCHURE_MAP_SLOT_START` and `<!-- BROCHURE_MAP_SLOT_END -->` **inclusive of both marker comments**. The page-10 layout reflows; no placeholder, no broken image, no empty box. |
219
+
220
+ The marker pattern is the same in both the template HTML and this SKILL — grep `BROCHURE_MAP_SLOT_START` across the plugin to see every place it's referenced.
221
+
222
+ ### Attribution
223
+
224
+ When the slot is rendered, the figcaption must credit the provider whose tiles are visible in the screenshot. Read `property.json -> address.geo.source` and choose the right line:
225
+
226
+ | `source` value | Figcaption text |
227
+ |---|---|
228
+ | `google_maps_iframe` | `Source: Google Maps © {year} Google` |
229
+ | `mapbox_iframe` | `Source: © Mapbox © OpenStreetMap` |
230
+ | `apple_maps_iframe` | `Source: Apple Maps` |
231
+ | `static_map_image` | Use the attribution shown on the source listing if visible; otherwise the provider name as a generic noun (e.g. `Source: location map © OpenStreetMap contributors`) |
232
+ | `unknown` (screenshot only) | `Source: location map as shown on the agent's listing` |
233
+
234
+ Don't strip the attribution — it's a licence requirement on most providers' tiles, not a stylistic flourish. Google's brand guidelines additionally forbid recolouring the word "Google", so when that's the source keep "Google" in `var(--ink)`, not the gold accent. The italic figcaption styling lives in the template under `.location-map figcaption`.
235
+
236
+ ### Forbidden patterns
237
+
238
+ The user has explicitly rejected synthesised maps. **None of these are allowed when `media.map` is `null`**:
239
+
240
+ - Geocoding the postcode via postcodes.io (or any other geocoder) and rendering a centroid-pinned static map
241
+ - OSM static-tile calls as a fallback ("just any map is better than no map")
242
+ - AI-generated map artwork (DALL-E / Imagen / Midjourney prompts that produce map-like images)
243
+ - Re-using a screenshot from a different listing or a stock map asset
244
+
245
+ If `media.map` is `null` and the user asks for a map anyway, the correct answer is to send them back to the source listing — either the agent enables the map block on their CRM, or the brochure ships without one. **Extract or omit.**
246
+
247
+ ### Cross-reference
248
+
249
+ The render-slot table in `images.md` lists "Map / screenshot" with a 1500 px digital floor and q86 WebP — those values apply **only** when a map has been captured. When `media.map` is `null`, there is no map asset to optimise and the row is moot.