@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,192 @@
1
+ ---
2
+ name: brand-design
3
+ description: Use when a website URL needs to be turned into a brand-design package — a directory containing a tokenized DESIGN.md, light and dark logo files sourced from the site, and a description.md with company copy plus registered company details. Trigger phrases include "extract brand from <url>", "build a brand pack from <site>", "tokenize <site> design", "scrape brand assets", or any request that names a live URL and asks for design tokens, logos, and company description together.
4
+ allowed-tools:
5
+ - Bash
6
+ - Read
7
+ - Write
8
+ - Edit
9
+ - Glob
10
+ - Grep
11
+ - WebFetch
12
+ ---
13
+
14
+ # brand-design
15
+
16
+ Turn one publicly-accessible website URL into a self-contained brand-design directory that downstream design, marketing, and document-generation skills can consume without re-visiting the source site.
17
+
18
+ The reference output this skill targets is `/Users/neo/estate-agents/beacons/` — read that directory once before generating to anchor the standard. (The neighbouring `/Users/neo/estate-agents/muvin/` is structurally identical; either may be inspected.)
19
+
20
+ ## Outcome contract
21
+
22
+ The skill is **complete** when the target directory contains exactly these four artifacts at its root:
23
+
24
+ ```
25
+ <output-dir>/
26
+ DESIGN.md # tokenized design system, observed values
27
+ <slug>-logo-light.png # the light-coloured logo art (white/cream/pale pixels) — for placing on dark surfaces
28
+ <slug>-logo-dark.png # the dark-coloured logo art (black/navy/charcoal pixels) — for placing on light surfaces
29
+ description.md # company copy + official registration details
30
+ ```
31
+
32
+ `<slug>` is the lowercase, hyphen-separated brand name (e.g. `beacons`, not `beaconsrealestate.co.uk`). The slug is reused as the directory name unless the caller specifies otherwise — that is, the brand workspace is `<output-dir>/<slug>/` and these four files live at its root.
33
+
34
+ A sibling `properties/` directory may also be present at `<output-dir>/properties/` — it belongs to `property-extract` and **must not** be touched by this skill. Working files this skill creates (screenshots, intermediate JSON, snapshot dumps) must be cleaned up before reporting completion. The four artifacts above are the deliverable; nothing else this skill writes is "scratch" that survives.
35
+
36
+ ## Inputs
37
+
38
+ Required: a URL. If only a brand name is given, decline and ask for the URL — there is no reliable way to disambiguate brand without the source of truth.
39
+
40
+ Optional: an output directory path. Default: `./<slug>/` in the caller's current working directory.
41
+
42
+ ## Scope boundaries
43
+
44
+ | In scope | Out of scope |
45
+ |---|---|
46
+ | Public HTML/CSS sites renderable in a headless browser | Login-gated sites, paywalled content |
47
+ | Brand colour, type, spacing, motion, radius, shadow, layout tokens | Editorial/component-level patterns (defer to `design-systems:component-spec`) |
48
+ | Header logo, footer logo, favicon | Photography, iconography sets, illustrations |
49
+ | Company copy from Home + About + Footer + Contact pages | Blog content, case studies, full marketing copy library |
50
+ | UK Companies House-style registration details when present in the footer or `/legal`, `/terms`, `/privacy`, `/imprint` | Hunting for company details outside the site (no Companies House lookups, no LinkedIn) |
51
+ | Light + dark logos as the site itself ships them | Generating brand variants the brand has not authored — but a recoloured fallback is permitted with explicit provenance, see **Logo authenticity** |
52
+
53
+ If the site is JS-only and the headless browser cannot render it, stop and report `STATUS: BLOCKED` with the symptom — do not synthesise tokens from a blank page.
54
+
55
+ ## Artifact contracts
56
+
57
+ ### `DESIGN.md`
58
+
59
+ A three-tier (primitive → semantic → component) token spec produced from **observed computed styles**, not from CSS source guesses. Every value in tier 1 must be backed by a measurement at a real viewport.
60
+
61
+ The contract for this file is owned by `design-systems:tokenize`. Invoke that skill against the target URL and write its output to `<output-dir>/DESIGN.md`. Do not re-derive tokens here.
62
+
63
+ What the file must contain regardless of who generated it:
64
+
65
+ - A header noting the source URL and the date the tokens were captured.
66
+ - Inventory & method paragraph stating viewports inspected and how counts were obtained.
67
+ - Tier 1 primitives for: colour, alpha/scrim, typography (family, weights, size scale at desktop **and** mobile, line-height, letter-spacing), spacing, radius, shadow, motion, layout, breakpoints. Each row carries the observed count or `(proposed)` if the value is being introduced rather than extracted.
68
+ - Tier 2 semantic role mappings (text, surface, action, border, typography roles, spacing roles, motion roles).
69
+ - Tier 3 component tokens for at least: primary button, text input, card, hero, footer, header, banded section.
70
+ - A **Theme Mapping** section with the as-built theme **and** a proposed dark-theme block. Mark the dark theme as proposed if the site does not ship one.
71
+ - A **Divergences** block calling out every place the captured value disagrees with prior assumed/inherited token docs (if any) — wording: "Prior assumption / Actual live behaviour".
72
+ - A migration guide: ordered find/replace from raw values to tokens, plus behaviours-to-correct table.
73
+
74
+ The naming convention is `--ds-{category}-{property}-{variant}-{state}` unless the site already ships a brand-prefixed convention, in which case adopt the existing prefix and note it.
75
+
76
+ ### `<slug>-logo-light.png` and `<slug>-logo-dark.png`
77
+
78
+ Two PNGs of the wordmark/lockup as the brand uses it. **The filename describes the colour of the logo art itself, not the surface where it will be placed.** This matches the natural reading and the convention used by Google, Bootstrap, Tailwind, and most public design systems:
79
+
80
+ | Filename | Art colour | Place it on |
81
+ |---|---|---|
82
+ | `<slug>-logo-light.png` | light/white/cream/pale pixels | dark surfaces (back-page hero, dark masthead) |
83
+ | `<slug>-logo-dark.png` | dark/black/navy/charcoal pixels | light surfaces (TOC, index.html nav, paper backgrounds) |
84
+
85
+ So if you open `donnavincent-logo-light.png` and see white text, that is correct — it's the light-coloured variant. If you open `donnavincent-logo-dark.png` and see white text, the file was misnamed by an earlier run; rename it.
86
+
87
+ Acceptance criteria:
88
+
89
+ - File format: PNG with alpha. Even if the source is SVG, also write a rasterised PNG at 2× the rendered header height for downstream document-generation skills that don't accept SVG.
90
+ - `<slug>-logo-light.png` (light-coloured art) must render crisply against a dark/ink target surface. `<slug>-logo-dark.png` (dark-coloured art) must render crisply against a paper/white target surface. **Verify by opening the file:** light-art file should look almost invisible against a white IDE background; dark-art file should look almost invisible against a dark IDE background. If either is "invisible against the wrong surface," the file is right; if either is invisible against the *correct* surface, the names are swapped.
91
+ - No surrounding chrome. The crop is the logo itself plus the brand's intended whitespace — not a slice of the navigation bar.
92
+ - Aspect ratio matches the source. Do not stretch.
93
+
94
+ #### Logo authenticity
95
+
96
+ Provenance must be honest. The two acceptable origins, in priority order:
97
+
98
+ 1. **Authored** — the brand ships two distinct logo files (one in each colour register). Use both verbatim from their `<img src>` URLs (or inline SVG, rasterised). This is the only origin that may be silently saved.
99
+ 2. **Recoloured derivative** — the brand ships only one logo. The second file is generated by recolouring (typically inverting fill from `--ds-color-ink-900` to `--ds-color-paper-0`, or vice versa). When this happens:
100
+ - Append a single line at the bottom of `description.md` under a `## Asset notes` heading: `<slug>-logo-light.png is a recoloured derivative — the source site ships one dark-coloured logo only.` (Or vice versa, whichever was synthesised.)
101
+ - Do not invent shape changes, glows, or stroke variants. Only fill colour may be inverted.
102
+
103
+ A photographic crop of the logo from a screenshot is **not** acceptable — the result has anti-aliased edges against a non-transparent background. Always pull the asset from `<img src>` / `<svg>` and rasterise on a transparent canvas.
104
+
105
+ ### `description.md`
106
+
107
+ Plain Markdown, no frontmatter. The structure mirrors the reference at `/Users/neo/estate-agents/beacons/description.md`:
108
+
109
+ 1. Brand name on its own line.
110
+ 2. The brand's own tagline / one-liner from the homepage hero.
111
+ 3. Vision / "about us" paragraph(s) verbatim from the homepage and About page. Keep paragraph breaks. Do not paraphrase.
112
+ 4. Service-area or coverage paragraph if the brand has one (common for property, legal, healthcare, trades).
113
+ 5. A short list of value-prop bullets if the homepage uses them (e.g. "Personal Service / Transparent Communication / …"). Keep them as a flat list, one per line, no bullet character.
114
+ 6. The closing call-to-action paragraph from the homepage or contact page.
115
+ 7. Brand name again as a divider.
116
+ 8. **Official details block** — extracted from the footer, terms, privacy, or imprint page. Each on its own line, label first:
117
+ - `Registered Office: …`
118
+ - `Registered Company Number: …` (UK) or `Company Registration Number: …` (other)
119
+ - `VAT Registration Number: …` (if shown)
120
+ - Any regulator-issued numbers shown publicly (FCA, ICO, RICS, ARLA, Bar Council, etc.)
121
+ 9. The source URL on the final line.
122
+
123
+ Capture rules:
124
+
125
+ - **Verbatim** — preserve the brand's punctuation, capitalisation, and Oxford comma habits. This file is the source of truth for downstream brochures, decks, and emails; paraphrasing introduces drift.
126
+ - If a section is missing from the site, omit it. Do not invent placeholders.
127
+ - If the company is non-UK, replace UK-specific labels with the local equivalents (`Handelsregister`, `SIRET`, `EIN`, `ABN`, etc.) — but only if those labels appear on the site.
128
+ - Do not include phone numbers, email addresses, or contact form URLs unless they appear in the official-details footer block. Marketing contact details belong in a separate brand asset, not this file.
129
+
130
+ ## How tokens, logos, and copy fit together
131
+
132
+ These three artifacts are not independent — they cross-reference:
133
+
134
+ - `description.md`'s "Asset notes" line records when `*-light.png` or `*-dark.png` was synthesised rather than authored.
135
+ - `DESIGN.md`'s ink and paper primitives are the colours used to fill any synthesised logo variant. `*-logo-light.png` (light-coloured art) takes its fill from `--ds-color-paper-0`. `*-logo-dark.png` (dark-coloured art) takes its fill from `--ds-color-ink-900`.
136
+ - `DESIGN.md`'s `--ds-color-action-primary-bg` is usually the same accent that appears in the brand's logo. A mismatch is a useful sanity check — if they disagree, re-inspect the logo source.
137
+
138
+ After all three artifacts are written, do a final consistency pass: open each file and confirm the cross-references are consistent.
139
+
140
+ ## Process — high level
141
+
142
+ The skill orchestrates three smaller capabilities and a final assembly. Each is a **what**, not a **how**:
143
+
144
+ 1. **Tokenize.** Drive `design-systems:tokenize` (or its equivalent) against the URL at desktop (1440×900) and mobile (500×700) viewports. Output → `DESIGN.md`.
145
+ 2. **Extract logos.** From a rendered page, locate the brand-mark element in the header (light surface) and the footer (dark surface). Pull each via its source URL or inline SVG markup. Rasterise SVG to PNG with a transparent background. If only one origin exists, generate the other as a recoloured derivative and record the provenance.
146
+ 3. **Capture copy.** Visit the homepage, About page, and footer/legal page. Extract the sections enumerated in the `description.md` contract above. Preserve verbatim text.
147
+ 4. **Assemble.** Write the four artifacts to `<output-dir>/`. Run the cross-reference consistency pass. Delete any working files.
148
+
149
+ The skill does **not** prescribe which browser tool to use. Where multiple are available (gstack `browse`, Chrome DevTools MCP, Playwright MCP), pick whichever is already wired in the current environment. Token capture in particular benefits from Chrome DevTools because computed styles and `@media` rules are first-class there.
150
+
151
+ ## Reference standard
152
+
153
+ Before producing output, read these files to anchor the format:
154
+
155
+ - `/Users/neo/estate-agents/beacons/DESIGN.md` — the depth and format expected of the token spec.
156
+ - `/Users/neo/estate-agents/beacons/description.md` — the voice and structure expected of the company description.
157
+ - `/Users/neo/estate-agents/beacons/beacons-logo-light.png`, `…-dark.png` — the visual standard for logo crops.
158
+
159
+ A delivered package that diverges substantially in structure from the reference is wrong, even if the content is accurate.
160
+
161
+ ## Common mistakes
162
+
163
+ | Mistake | Why it's wrong |
164
+ |---|---|
165
+ | Saving a screenshot crop instead of pulling `<img src>` | Crops carry the surrounding background colour as anti-aliased noise. The PNG must be transparent on the logo's negative space. |
166
+ | Synthesising a dark logo silently | Downstream consumers will treat a derivative as authoritative. Provenance is mandatory. |
167
+ | Paraphrasing the homepage hero into "punchier" copy | `description.md` is the source of truth for the brand's voice. The brand's words, not yours. |
168
+ | Inventing token values that the site doesn't use | Token tier 1 is **observed**. `(proposed)` is for tier-2/3 values that fill an obvious gap, not for guesses about what the brand wants. |
169
+ | Including blog posts or case studies in `description.md` | The file is identity, not editorial. |
170
+ | Naming files after the domain (`beaconsrealestate-logo.png`) | Slug is the brand name, not the FQDN. |
171
+ | Skipping the mobile viewport during token capture | Type scale and section padding both differ at mobile. A desktop-only tokenization is incomplete. |
172
+ | Generating the dark theme block in `DESIGN.md` from imagination | If the site is light-only, the dark theme is an **inversion derived from the primitives**, marked "proposed", not a parallel design system. |
173
+ | Embedding the company description inside `DESIGN.md` | The artifacts are separable on purpose. Each file has one job. |
174
+
175
+ ## Completion criteria
176
+
177
+ Report `DONE` only after:
178
+
179
+ - All four files exist at the expected paths and only those files.
180
+ - `DESIGN.md` references the source URL and capture date in its first paragraph.
181
+ - Both logo PNGs render correctly on their target surfaces (a quick eyeball at 64px height is sufficient — no chrome, no surrounding nav).
182
+ - `description.md` contains, at minimum, the brand name, the homepage hero copy, and any registration numbers visible on the site.
183
+ - If a recoloured logo was synthesised, the `## Asset notes` line is present in `description.md`.
184
+ - Working files (HTML dumps, snapshot JSON, intermediate screenshots) are removed.
185
+
186
+ If any of those are not true, report `DONE_WITH_CONCERNS` and list each gap.
187
+
188
+ ## When NOT to use this skill
189
+
190
+ - The user wants a **proposed** brand identity for a product that doesn't have a site yet → use `brand-pack` or `design-consultation` instead. Those generate; this one extracts.
191
+ - The user wants a fresh DESIGN.md only → call `design-systems:tokenize` directly; the wrapper here is overkill.
192
+ - The user wants a full visual audit, hover states, and component inventory → `plan-design-review` or `design-review` go deeper than this skill is scoped for.
@@ -0,0 +1,354 @@
1
+ ---
2
+ name: make-brochure
3
+ description: Use when the user gives both an estate agent's website URL (or existing brand-pack directory) and a property listing URL (or existing property-assets directory) in one request, asking for the brochure as an end-to-end deliverable. Trigger phrases include "build a brochure for <listing> using the agent at <agent-url>", "create a brochure for the property at <X> with the brand at <Y>", "end-to-end brochure for <listing>", "do everything from brand to brochure for <listing>", "make me the brochure for <listing> on <agent-site>", or any request that names both a brand source and a property source in the same turn.
4
+ allowed-tools:
5
+ - Bash
6
+ - Read
7
+ - Write
8
+ - Edit
9
+ - Glob
10
+ - Grep
11
+ - WebFetch
12
+ ---
13
+
14
+ # make-brochure
15
+
16
+ Single-entry orchestrator for the `brand-design` → `property-extract` → `property-brochure` pipeline. Routes inputs to the right skill in the right order, **skipping any upstream step whose output already exists on disk for the requested source URL**.
17
+
18
+ This skill is a playbook, not a programmatic dispatcher. It tells you (the agent) the routing rules; you execute each step using the underlying skills' own contracts.
19
+
20
+ ## Outcome contract
21
+
22
+ The deliverable is identical to `property-brochure`'s outcome — written into `<property-dir>/output/`:
23
+
24
+ - `brochure.html` plus per-page 300 dpi PNG print snapshots (canonical, archival)
25
+ - Two image-only PDFs: `<slug>-brochure-print.pdf` (300 dpi print master) and `<slug>-brochure-web.pdf` (192 dpi web/digital). Both built from per-page Playwright snapshots via img2pdf and linearized via qpdf — no Ghostscript anywhere in the chain. See `property-brochure → PDF deliverable` and `a4-print-documents → PDF deliverables`.
26
+ - A self-contained **web bundle** at `output/web/` plus `output/<slug>-web.zip` — the smaller, ready-to-host version for property micro-sites; includes both the brochure and a companion **landing page** at `index.html` that presents the property as a continuous scrollable web page. See `property-brochure → Web bundle` and `property-brochure → Page`
27
+
28
+ The orchestrator's value is in what it does **not** redo:
29
+
30
+ - If the brand pack for the agent already exists and matches the requested agent URL, `brand-design` is **skipped**.
31
+ - If the property assets for the listing already exist and match the requested listing URL, `property-extract` is **skipped**.
32
+ - `property-brochure` always runs (the brochure itself is the deliverable; re-running it is the point).
33
+
34
+ A run that re-tokenises a brand pack already on disk for the same URL is a **defect**, not an extra-careful pass. Re-tokenisation burns tokens, can mutate logo PNGs that downstream brochures already reference, and risks divergence between the brand pack and the brochures that consumed it earlier.
35
+
36
+ ## Inputs
37
+
38
+ Required, in either form for each:
39
+
40
+ | Input | URL form | Path form |
41
+ |---|---|---|
42
+ | **brand source** | `https://<agent>.co.uk` | `<dir-with-DESIGN.md>` |
43
+ | **property source** | `https://<agent>.co.uk/property/<slug>/<id>/` | `<dir-with-property.json>` |
44
+ | **orientation** | `portrait` or `landscape` (A4) — see **Orientation routing** below |
45
+ | **seller brief** | a path to `seller-brief.md` (per the template at `make-brochure/references/seller-brief-template.md`), **or** answers to all 20 brief questions in any format | — |
46
+
47
+ Optional:
48
+
49
+ - `force` — one of `brand`, `property`, `all`, or absent. When set, the named upstream step runs even if its output already exists.
50
+ - `output_root` — defaults to the **caller's current working directory** (`./`). The orchestrator creates `<output_root>/<brand_slug>/` for the brand pack and nests properties at `<brand_slug>/properties/<property_slug>-<id>/`. To place the workspace elsewhere — e.g. alongside an existing brand pack from a prior run — pass `output_root` explicitly (absolute path, or relative to CWD). The orchestrator never infers location from an existing brand pack; if you already have one and want this run to reuse it, point `brand_source` at its directory path (see Routing rule 1) AND pass `output_root` to its parent so the new property nests under the same workspace.
51
+ - `register` — one of `premium`, `branded`, or absent. **Premium** keeps the template's super-premium tokens verbatim (only the agent's logo and contact details change); the brand pack's DESIGN.md palette/type are deliberately *not* applied. **Branded** re-skins the template with the brand's tokens. Absent = use whichever the user's wording implies (the word "premium" or "super-premium" in the request → premium; presence of a DESIGN.md without that wording → branded; neither → premium defaults). The orchestrator passes the resolved register through to `property-brochure`. See `property-brochure → Default visual scheme — and when to override it` for the full contract.
52
+
53
+ If only one input is supplied, **decline and ask for the other** — the orchestrator's reason for being is having both. Route a single-input request to the appropriate sub-skill directly.
54
+
55
+ ### Why the seller brief is required, not optional
56
+
57
+ Brochure copy without a seller's brief is generic copy. The agent has the listing description, the photos, and the floor plan; it does not have *the seller's reason for buying, the room they will miss most, the feeling they want a buyer to have on entry, the three words they would use to describe the home*. Those answers are what separate "luxury 5-bedroom country home, well-presented" from a folio that reads as a specific, personal place.
58
+
59
+ The brief is **not** quoted verbatim in the brochure (unless an answer is explicitly marked `[VERBATIM]` by the seller). It is read by the brochure agent before any copy is written and informs:
60
+
61
+ - The cover sub-line and back-page tagline (Q19, Q20)
62
+ - The opening chapter deck (Q5)
63
+ - The body paragraphs of every chapter (Q1–4, Q7, Q11–14)
64
+ - The particulars list emphasis (Q9, Q10, Q18)
65
+ - The Material Information context line (Q17)
66
+ - Which photographic slot gets hero treatment (Q6 — the seller's favourite room)
67
+
68
+ See `property-brochure → Seller brief` for the per-question mapping.
69
+
70
+ ### Brief routing
71
+
72
+ Apply this rule before running `property-brochure`:
73
+
74
+ | Brief state | Action |
75
+ |---|---|
76
+ | `<property_dir>/seller-brief.md` exists, every question has a non-empty answer | **Use it.** Pass the path through to `property-brochure`. |
77
+ | `<property_dir>/seller-brief.md` exists but ≥ 1 answer is empty / placeholder text | **Stop and ask the operator** to provide the missing answers. List the question numbers that are unanswered. |
78
+ | `<property_dir>/seller-brief.md` does not exist, but the user pasted answers in this conversation | Write the answers to `<property_dir>/seller-brief.md` per the template structure, then proceed. If any of the 20 questions is missing, ask for the missing ones first. |
79
+ | Nothing — no file, no inline answers | **Stop and ask.** Send the operator the 20 questions (verbatim from `references/seller-brief-template.md`), wait for answers, write the file, then proceed. Do not synthesise answers from the listing description. |
80
+
81
+ The brief lives at `<property_dir>/seller-brief.md` so it persists across re-renders. Re-running `property-brochure` does not invalidate the brief; only the seller invalidates the brief by editing it.
82
+
83
+ ### What an "answer" must contain
84
+
85
+ A non-empty answer is at least one full sentence per question, in the seller's voice. Single-word answers are accepted only for Q19 ("three words to describe the home") — every other question expects two to four sentences. If the operator provides a single-word answer to anything other than Q19, ask a clarifying follow-up before proceeding.
86
+
87
+ If a section is genuinely not applicable (e.g. the seller has not done any improvements, so Q8/9 are "none"), record that explicitly: `Q8: No renovations since moving in. The home was substantially complete on purchase and we changed nothing.` That is a valid answer. A blank, "n/a", or "—" is not.
88
+
89
+ ## Orientation routing
90
+
91
+ The brochure ships in either portrait (210×297mm) or landscape (297×210mm) A4. The two are not visually interchangeable — page geometry, render-slot dimensions, print-snapshot pixel sizes, and the PDF call all change with the choice. See `property-brochure`'s **Orientation** section for the full dimensional contract.
92
+
93
+ Apply this rule **before** running any of the upstream steps:
94
+
95
+ | Did the user state orientation? | Action |
96
+ |---|---|
97
+ | Yes — explicit `portrait` / `landscape`, or named A4 dimensions in one of the two orders | Use the stated value. Pass it through to `property-brochure`. |
98
+ | No — but a prior brochure exists at `<property_dir>/output/brochure.html` | Read the existing `@page { size: A4 portrait \| landscape }` rule and confirm with the user in one line ("Keeping existing landscape — OK?"). Default to the inherited value if they don't object. |
99
+ | No — and there's no prior brochure | **Stop and ask.** One-line prompt: "Portrait or landscape A4?" Do not silently default to portrait. |
100
+
101
+ The reason orientation is hoisted to the orchestrator (not deferred to `property-brochure`) is the same as for missing brand/property sources: the question costs one round-trip; rebuilding a wrong-orientation brochure costs a full pipeline run plus user re-review. Always pay the cheap cost.
102
+
103
+ When the user answers, pass the orientation through to `property-brochure` as an explicit parameter. Do not re-ask in the downstream skill — the contract is "asked once at the orchestrator level".
104
+
105
+ ## Routing rules
106
+
107
+ The skill performs four checks in order. Each rule fully specifies its *condition* and its *action*; do not improvise extra branches.
108
+
109
+ ### 1. Resolve the brand identity
110
+
111
+ If `brand_source` is a URL: derive `brand_slug` as the lowercase domain root with no TLD (e.g. `https://muvin.co.uk` → `muvin`, `https://example-agent.co.uk` → `example-agent`).
112
+
113
+ If `brand_source` is a path: `brand_slug` = the directory's basename.
114
+
115
+ Resolve `brand_dir` as:
116
+ - `<output_root>/<brand_slug>/` when `brand_source` was a URL. Recall: `<output_root>` defaults to the **caller's CWD** (`./`) — never inferred from an existing brand pack. Pass `output_root` explicitly to override.
117
+ - the supplied path when `brand_source` was a path.
118
+
119
+ ### 2. Decide whether to run `brand-design`
120
+
121
+ Read `<brand_dir>/DESIGN.md` if it exists. The first paragraph should record the source URL (per the `brand-design` artefact contract).
122
+
123
+ | `<brand_dir>/DESIGN.md` exists? | Recorded source URL matches request? | `force` value | Action |
124
+ |---|---|---|---|
125
+ | No | — | any | Run `brand-design` against the URL |
126
+ | Yes | Yes | absent | **Skip**. Reuse the existing brand pack. |
127
+ | Yes | Yes | `brand` or `all` | Run `brand-design` (overwrites existing pack) |
128
+ | Yes | No | absent | **Stop and ask the user** — the directory belongs to a different brand. Do not silently overwrite. |
129
+ | Yes | No | `brand` or `all` | Run `brand-design` (overwrites — user opted in) |
130
+
131
+ If `brand_source` was a path and `DESIGN.md` is missing, treat that as an authoring error — the user pointed at a directory that isn't a brand pack. Stop and ask for the actual brand-pack directory or a URL.
132
+
133
+ ### 3. Resolve the property identity
134
+
135
+ If `property_source` is a URL: derive `property_slug` from the URL's `/property/<slug>/<id>/` path segment. The folder name is `<property_slug>-<id>` (e.g. `henham-road-debden-green-hamperden-end-cb11-3lz-949931`).
136
+
137
+ If `property_source` is a path: the folder name is the directory's basename.
138
+
139
+ Resolve `property_dir` as:
140
+ - `<brand_dir>/properties/<property_slug>-<id>/` when `property_source` was a URL. The property directory always lives **inside** the brand workspace, never as a sibling of it. This is non-negotiable — `property-extract`, `property-brochure`, and the brand pack all assume this nesting.
141
+ - the supplied path when `property_source` was a path. If the supplied path is not under `<brand_dir>/properties/`, stop and ask — silently re-rooting the property would orphan it from its brand pack.
142
+
143
+ ### 4. Decide whether to run `property-extract`
144
+
145
+ Read `<property_dir>/property.json` if it exists.
146
+
147
+ | `<property_dir>/property.json` exists? | `source.url` matches request? | `force` value | Action |
148
+ |---|---|---|---|
149
+ | No | — | any | Run `property-extract` against the URL |
150
+ | Yes | Yes | absent | **Skip**. Reuse the existing property assets. |
151
+ | Yes | Yes | `property` or `all` | Run `property-extract` (overwrites existing) |
152
+ | Yes | No | absent | **Stop and ask the user** — the directory holds a different listing. |
153
+ | Yes | No | `property` or `all` | Run `property-extract` (overwrites — user opted in) |
154
+
155
+ ### 5. Verify the seller brief is complete
156
+
157
+ Before invoking `property-brochure`, confirm `<property_dir>/seller-brief.md` exists with non-empty answers to all 20 questions. Apply the **Brief routing** table from the *Inputs* section. If any answers are missing, the orchestrator stops and asks the operator — the brochure is not generated until the brief is complete.
158
+
159
+ The brief is the single most cost-effective input to the editorial quality of the brochure. Skipping it produces generic copy that the operator will then ask to be rewritten. Asking once at the orchestrator level costs one round-trip; collecting it after the brochure is built costs a full re-render.
160
+
161
+ ### 6. Always run `property-brochure`
162
+
163
+ Once steps 2, 4, and 5 have either completed or been skipped (skip applies only to 2 and 4 — the brief check is mandatory), invoke `property-brochure` with both directories AND the seller brief as inputs. The brochure HTML and print PNGs land in `<property_dir>/output/` — that exact path, with the exact filenames listed in the Reference standard. No alternate names, no nested `brochure/` wrapper directory.
164
+
165
+ If `<property_dir>/output/brochure.html` already exists from a prior run and the user has **not** asked to re-render, ask before overwriting. Re-rendering the brochure is cheap, but it invalidates whatever review state the user had on the previous version.
166
+
167
+ ## Image preview safety
168
+
169
+ **Hard rule: never `Read` an image file whose longest edge exceeds 2000px.** The harness loads images into context as multimodal inputs and large ones break the session — the encoding budget overruns, the conversation can drop, and recovery is expensive.
170
+
171
+ Property photographs almost always exceed this threshold. Concrete examples in the validated reference directory:
172
+
173
+ | Filename pattern | Typical longest-edge |
174
+ |---|---|
175
+ | `DSC*` (DSLR) | 6000–8000px |
176
+ | `IMG*` (iPhone wide) | 4000–5000px |
177
+ | `DJI_*` (drone) | 4000–8000px |
178
+ | `ChatGPT-Image-*` (AI render) | 1024 or 2048px (borderline — measure) |
179
+ | `Screenshot-*` (desktop capture) | 1200–2880px (borderline — measure) |
180
+
181
+ ### Safe inspection workflow
182
+
183
+ Before any `Read` against an image:
184
+
185
+ 1. **Measure first.** On macOS: `sips -g pixelWidth -g pixelHeight <file>`. With ImageMagick: `identify -format "%wx%h\n" <file>`. Both are fast and require no decode.
186
+ 2. **If the longest edge ≤ 2000px**, reading the original is safe.
187
+ 3. **If the longest edge > 2000px**, generate a downscaled preview into `/tmp/`, read the preview, then delete it:
188
+ ```bash
189
+ sips -Z 2000 "<src>" --out "/tmp/preview-$(basename "<src>")"
190
+ # ...Read the preview...
191
+ rm "/tmp/preview-$(basename "<src>")"
192
+ ```
193
+ Or with ImageMagick: `magick "<src>" -resize '2000x2000>' "/tmp/preview-..."`.
194
+ 4. **Often you don't need the pixels at all** — filename, byte-size, dimensions, and EXIF tags answer most QA questions ("is this the kitchen wide shot?", "is this in landscape?") without a multimodal read.
195
+
196
+ The constraint applies to **every** image-reading touchpoint in the pipeline: shortlisting cover candidates, picking the kitchen hero, sanity-checking floorplans, verifying a downloaded asset, eyeballing AI-render quality. Treat the rule as non-negotiable; the failure mode is loss of the entire session, not a graceful error.
197
+
198
+ Generated brochure print snapshots (`cover-print.png`, `pageN-print.png`) are produced at A4 @ 96dpi which is **794×1123px** — those are safe to read directly.
199
+
200
+ ## Process — high level
201
+
202
+ 1. **Parse and validate inputs.** Confirm all three sources are present (brand, property, **seller brief**); pick form (URL/path/inline answers) per source; bail early with a clear question if any is missing or ambiguous. Apply the **Orientation routing** table — if orientation is not stated and not inheritable, stop and ask before doing any other work.
203
+ 2. **Apply the Brief routing table.** If `<property_dir>/seller-brief.md` is missing or any of the 20 answers is empty, **stop and ask the operator** — paste the questions from `references/seller-brief-template.md`, wait for answers, write the file, then proceed. Do not synthesise answers from the listing description.
204
+ 3. **Apply Routing rules 1–4** for the upstream skills. For each, determine `run` / `skip` / `ask` based on the table; record the decision in a one-line log so the user can see what was reused.
205
+ 4. **Run the upstream skills in sequence**, brand first then property. Each runs under its own SKILL.md contract — do not adapt or shortcut their completion criteria. If either reports `DONE_WITH_CONCERNS` or `STATUS: BLOCKED`, surface that to the user and stop before invoking `property-brochure`.
206
+ 5. **Verify the curator-friendly image rename happened.** `property-extract` is responsible for producing `<Property Name> N.jpg` (1-indexed) alongside the original CDN-named files — see *property-extract → Curator-friendly rename*. Before invoking `property-brochure`, check `<property_dir>/images/` for files matching `<Property Name> *.jpg` (or `<address line 1> *.jpg` if the property has no distinct name). If the rename is missing on a freshly-extracted property, run it now — the brochure step's slot map relies on `<property-slug>-NN.webp` aligning 1:1 with the curator's intuitive numbering, and that alignment is what lets a human reviewer tell "this photo is in slot 22" by looking at filenames alone.
207
+ 6. **Run `property-brochure`** pointing at the brand directory, property directory, **and the seller brief**. Confirm the canonical archive landed in `<property_dir>/output/` with `brochure.html`, the two PDFs (print master + digital), and the per-page print PNGs.
208
+ 7. **Confirm the web bundle was produced.** `property-brochure` also emits `output/web/` (with web-tier images, JPEG snapshots, and the digital PDF) and `output/<slug>-web.zip` — see *property-brochure → Web bundle*. If the web bundle is missing on an otherwise-successful brochure run (e.g. `property-brochure` reported `DONE` but only the print archive is present), invoke its web-bundle step explicitly before reporting `DONE` here.
209
+ 8. **Report.** Tell the user, in order: which steps ran fresh, which were reused, the path to the canonical print archive, the path to the web zip, and any `DONE_WITH_CONCERNS` items from the upstream steps. Note explicitly that the seller brief was used to source the editorial copy, and (if any answers were marked `[VERBATIM]`) which phrases were preserved word-for-word.
210
+
211
+ The orchestrator does not bundle the upstream skills' outputs — each leaves its artefacts where its own SKILL.md says to. The two end-user-facing deliverables are the canonical print archive (`output/brochure.html` + PDFs + PNG snapshots) and the web zip (`output/<slug>-web.zip`).
212
+
213
+ ## Slot-assignment hand-off — verify image content visually, not by filename
214
+
215
+ A repeated failure mode in this pipeline is mis-mapping a slot from filename alone — the brochure step references `images/sparrows-farm-22.webp` because slot 22 should be the inglenook, but the actual photograph at index 22 is a downstairs WC. Filename tells you order; pixels tell you content.
216
+
217
+ The orchestrator's role is to **enforce the visual-verification step** before `property-brochure` writes the HTML:
218
+
219
+ - The agent must read either a labelled contact-sheet montage of all 49 images (sized ≤ 2000px per the safety rule) or each candidate slot directly, and match content to slot before referencing the filename in the HTML.
220
+ - If a slot's intended content (cover hero, principal bedroom, family bathroom, inglenook) does not match the photograph at the chosen index, change the index — don't ship the wrong photo. The render-slot index table in `property-brochure` is canonical for *role*, but the curator's `N` numbering is canonical for *which photo is N*.
221
+
222
+ See `property-brochure → Image content verification` for the contact-sheet recipe and the common-mistake pairs.
223
+
224
+ ## Page-count — 16 canonical, 12 only when content is thin
225
+
226
+ The canonical brochure ships **16 pages** (cover + 8 chapters with intermissions, gallery, and site-plan inserts + back). The 16-page folio is the structure encoded in `property-brochure/references/template.html`, with these inserts already in place:
227
+
228
+ | Insert | Position | Content |
229
+ |---|---|---|
230
+ | Full-bleed interior intermission | After "A home at ease" and after "Hall, hearth & sun" | One strong room shot full-bleed with a dark caption pill, no chapter title — `.page.intermission` |
231
+ | Image-led gallery | After "Bedrooms & baths" | 4–5 cell grid of additional internal shots, each with a one-word italic caption in a translucent panel — `.page.gallery-page` |
232
+ | Full-bleed outdoor intermission | After "Pool, outdoor kitchen & summerhouse" | The single strongest exterior moment, full-bleed |
233
+ | Site plan dedicated page | After "Garden & ground" | The plot drawing (trees + boundary + paddocks) on one side, plot/grounds copy panel on the other — `.page.siteplan-page` |
234
+
235
+ When the property genuinely lacks the photography or features to fill 16 pages (e.g. an apartment without grounds, or fewer than ~25 strong photos), drop down to **12 pages** by removing the three intermissions and the site-plan page. Both 12 and 16 are even, so both saddle-stitch cleanly (12 = 3 folded sheets, 16 = 4). Avoid 14 — it's an awkward 3.5-sheet count. The chapter-page numbers in the TOC and folio update accordingly: 16-page chapter starts at 03, 04, 06, 08, 10, 12, 14, 15; 12-page chapter starts at 03, 04, 05, 06, 07, 08, 10, 11.
236
+
237
+ Intermission pages are unnumbered chapters — they wear a small "Continued, Chapter II" eyebrow on their caption pill, never a Roman numeral.
238
+
239
+ ## Reference standard
240
+
241
+ After a complete run, the on-disk layout is **exactly** this — no deeper nesting, no extra wrappers, no sibling `properties/`:
242
+
243
+ ```
244
+ <output_root>/
245
+ <brand_slug>/ # = brand workspace = <brand_dir>
246
+ DESIGN.md # produced by brand-design
247
+ description.md # produced by brand-design
248
+ <brand_slug>-logo-light.png # produced by brand-design — light-coloured art (white/cream pixels, for dark surfaces)
249
+ <brand_slug>-logo-dark.png # produced by brand-design — dark-coloured art (black/navy pixels, for light surfaces)
250
+ properties/ # nested INSIDE the brand workspace
251
+ <property_slug>-<id>/ # = <property_dir>
252
+ property.json # produced by property-extract
253
+ description.md # produced by property-extract
254
+ seller-brief.md # operator-supplied via the make-brochure orchestrator (20 Q&As)
255
+ images/ # produced by property-extract — original photo filenames preserved
256
+ floorplans/ # produced by property-extract
257
+ epc/ # produced by property-extract (may be empty)
258
+ output/ # canonical print archive — owned by property-brochure
259
+ brochure.html
260
+ <property_slug>-brochure-print.pdf # print master (300 dpi, ~65–100 MB) — canonical archive
261
+ <property_slug>-brochure-web.pdf # web/digital deliverable (192 dpi, ~25–45 MB) — emailed/attached
262
+ cover-print.png # canonical 300 dpi snapshots (used for print PDF + .print-img swap)
263
+ page2-print.png … page15-print.png
264
+ backpage-print.png
265
+ .snapshots-web/ # intermediate 192 dpi PNGs for web-PDF build (deletable after)
266
+ cover-print.png … backpage-print.png
267
+ images/ # renamed + per-slot-optimised brochure photos: <property_slug>-NN.webp
268
+ <property_slug>-NN.webp
269
+ <brand_slug>-logo-light.png # light-coloured logo art — used on the back-page dark masthead
270
+ <brand_slug>-logo-dark.png # dark-coloured logo art — used on the TOC credit and other paper-surface placements
271
+ qr-video.png, qr-listing.png
272
+ web/ # self-contained web bundle, generated alongside print archive
273
+ brochure.html # same HTML; print-img refs point at .jpg snapshots; QR codes are clickable <a>
274
+ index.html # companion property landing page (Modern House-style scroll)
275
+ <property_slug>-brochure.pdf # digital PDF, copied for the in-page Download button
276
+ cover-print.jpg
277
+ page2-print.jpg … page15-print.jpg
278
+ backpage-print.jpg
279
+ images/ # web-tier per-slot encodings: hero 1300/q82, story 1100/q80, thumb 800/q76
280
+ <property_slug>-NN.webp
281
+ <property_slug>-hero-1-main.webp # index.html hero rotator — source-res @ q88
282
+ <property_slug>-hero-2-<role>.webp # index.html hero rotator — interior moment
283
+ <property_slug>-hero-3-<role>.webp # index.html hero rotator — garden / outdoor
284
+ <property_slug>-floorplan.png # line-art PNG, copied unchanged from canonical
285
+ <brand_slug>-logo-light.png # light-coloured logo art — for dark surfaces (e.g. dark index.html sections)
286
+ <brand_slug>-logo-dark.png # dark-coloured logo art — for light surfaces (e.g. index.html nav, brochure cover when paper)
287
+ qr-video.png, qr-listing.png
288
+ <property_slug>-web.zip # zipped form of web/, ready to upload to a static-site host
289
+ ```
290
+
291
+ The `output/` folder is a portable deliverable: every image referenced by `brochure.html` resolves to a file under `output/images/`. References that escape `output/` (`../images/`, `../../floorplans/`, `../../epc/`) are a defect — the brochure must not depend on the sibling property-extract folders staying in place.
292
+
293
+ Reference instances that already conform (on the maintainer's machine — paths reflect where those runs happened, not a default for new callers):
294
+ - `/Users/neo/estate-agents/muvin/` (brand_slug = `muvin`)
295
+ - `/Users/neo/estate-agents/beacons/` (brand_slug = `beacons`)
296
+
297
+ A fresh run with no `output_root` and no existing brand pack lands the workspace in the caller's CWD — `./muvin/` / `./beacons/` / etc., not under any other path.
298
+
299
+ Determinism rules — a run that violates any of these is wrong, even if the brochure renders:
300
+ - `properties/` is **inside** `<brand_dir>/`, never a sibling.
301
+ - `output/` is the property's deliverable directory, sitting at the root of `<property_dir>/`. No `<name>-brochure-brand.html`, no nested `brochure/` wrapper between `<property_dir>/` and `output/`.
302
+ - The brochure's HTML lives at `<property_dir>/output/brochure.html`. The filename is literal `brochure.html` — not `<property_slug>-brochure.html`.
303
+ - Print snapshots are named `cover-print.png`, `page2-print.png` … `page15-print.png`, `backpage-print.png` (16 files for the 16-page folio; 12 if the property warranted the reduced-page variant — see **Page-count**) — never `cover-print-brand.png` or other variants.
304
+ - Both PDFs are present: `<property_slug>-brochure-print.pdf` (300 dpi print master) **and** `<property_slug>-brochure-web.pdf` (192 dpi web/digital). Shipping only one is wrong — the print master is the canonical archive artefact, the web PDF is what gets emailed and lives inside the web bundle.
305
+ - The brochure has an **even page count** (the canonical folio is 16; alternative even counts — typically 12 — only with explicit user consent). See `a4-print-documents` → Even-page count for duplex printing.
306
+ - Anything that would otherwise pollute `output/` (legacy versions, scratch HTML, branding experiments) is moved out of `output/` entirely. `_archive/` at the property root is acceptable; extra files inside `output/` are not.
307
+ - The **web bundle** is a derived artefact, not a separate canonical archive. `output/web/` contains only files derivable from `output/`. The zipped `<slug>-web.zip` lives alongside `output/web/` (at `output/<slug>-web.zip`), not inside `web/`. Regenerating the web bundle never modifies `output/brochure.html` or any canonical asset.
308
+
309
+ ## Common mistakes
310
+
311
+ | Mistake | Why it's wrong |
312
+ |---|---|
313
+ | Running `brand-design` when `DESIGN.md` already exists for the same URL | Wastes tokens and risks regenerating logo PNGs that earlier brochures point at. |
314
+ | Treating "directory exists" as enough for skip-check | The directory may exist with a different brand's content. The check is **content match** (recorded source URL), not filesystem presence. |
315
+ | Silently overwriting a brand pack whose recorded URL differs from the request | The user almost certainly meant a sibling directory or a typo. Asking takes one turn; an overwrite costs them work. |
316
+ | Reading a 6000px DSLR photo with `Read` to "have a look" | Breaks the session. Always measure first; downscale if needed. |
317
+ | Skipping `property-brochure` because the brochure already exists from a prior run | The user asked for the end-to-end deliverable. If they want to keep the existing brochure, they will say so — confirm before overwriting, but don't unilaterally skip. |
318
+ | Bundling `brand-design`'s outputs into the property directory | The artefacts are separable on purpose. The brand pack is reused across listings; collapsing it into a single property's folder defeats reuse. |
319
+ | Inferring `force` from the user's tone ("redo it properly") | `force` is an explicit lever. If the user's intent is unclear, ask — don't assume `force=all`. |
320
+ | Silently defaulting to portrait when the user did not specify orientation | The brochure's geometry, render slots, and PDF call all change with orientation. A wrong choice means a full rebuild. One-line ask is cheaper than a wasted run. |
321
+ | Asking for orientation again in `property-brochure` after the orchestrator already collected it | The contract is "asked once". Re-asking annoys the user and risks a divergent answer mid-pipeline. Pass the value through. |
322
+ | Assigning brochure slots from filename alone (e.g. "slot 22 should be the inglenook → use `<slug>-22.webp`") | Filenames carry order, not content. Verify the actual photo at index 22 before referencing it; a downstairs WC at index 22 will silently ship as the chapter's hero. See `property-brochure → Image content verification`. |
323
+ | Calling the outdoor kitchen "the cedar pavilion" or "the summerhouse" interchangeably | They are three distinct features. The outdoor kitchen is cedar-clad with a grill and bench seating; the summerhouse is glass-walled and houses the gym; the orangery is inside the home's footprint. Conflating them in copy or in image alt text is a silent editorial failure. |
324
+ | Em-dashes used as connector between phrases ("a home of beam, hearth — and quiet flow") | Hallmark of AI-generated copy. Replace with comma, full stop, or restructure. See `property-brochure → Editorial copy register`. |
325
+ | "House" instead of "home" at super-premium register | Wrong word for the buyer. "Home" is warmer, more aspirational, and matches the register. Replace globally. |
326
+ | Text overlaid on photographs relying on a gradient + text-shadow for legibility | Insufficient against busy backgrounds (stone tile, golden-hour skies). Use a translucent dark panel directly behind the text. See `property-brochure → Text on images`. |
327
+ | Including a detached gymnasium-summerhouse footprint in the principal home's first-floor sq ft | Misrepresents £/sq ft. List ancillary footprints separately. See `property-brochure → Floor area`. |
328
+ | Shipping a web bundle without `index.html` | The web bundle is the property's hosted experience. The brochure is a downloadable folio; the landing page is the scrollable "for sale" page that links to it. Both are mandatory in the zip. See `property-brochure → Page`. |
329
+ | Putting QR codes on the back page without a visible URL or a clickable wrapper | A QR is unscannable from the digital screen showing the brochure. The clickable URL beneath each QR is mandatory; it makes the digital reader experience equivalent to the print reader experience. See `property-brochure → Back-page QR codes`. |
330
+ | Using the same logo variant for the back-page masthead (dark surface) and the landing-page nav (light surface) | The two surfaces need opposite logo variants — white-on-transparent for the back page, dark/coloured for the landing nav. Both must be present in `output/web/images/`. |
331
+
332
+ ## Completion criteria
333
+
334
+ Report `DONE` only after:
335
+
336
+ - All three upstream artefact contracts are satisfied at their expected paths (`<brand_dir>/DESIGN.md`, `<property_dir>/property.json`, **`<property_dir>/seller-brief.md` with non-empty answers to all 20 questions**).
337
+ - Orientation was explicit before any layout work began — either stated by the user, inherited from a prior brochure with confirmation, or asked-and-answered.
338
+ - The brochure HTML exists at `<property_dir>/output/brochure.html` and its `@page { size: A4 portrait | landscape }` matches the chosen orientation.
339
+ - Both PDF deliverables exist alongside `brochure.html`: the print master (`<property_slug>-brochure-print.pdf`, ~50–80 MB at 300 dpi) and the web/digital (`<property_slug>-brochure-web.pdf`, ~20–35 MB at 192 dpi). Both are image-only, built from per-page Playwright snapshots via img2pdf and linearized via qpdf; both pass `qpdf --check`, both report `Optimized: yes`, and both have zero embedded fonts (`pdffonts | wc -l` returns 2). See `a4-print-documents → Verification`.
340
+ - All per-page print snapshots referenced by the HTML's print CSS exist at expected names — `cover-print.png`, `page2-print.png` through `page15-print.png`, and `backpage-print.png` (16 files for the 16-page folio) — at the orientation-correct 300 dpi pixel dimensions (3509×2481 landscape / 2481×3509 portrait).
341
+ - The brochure has an **even page count** (canonical 16; multiples of 2 required, ideally multiples of 4 for booklet binding) — see `a4-print-documents` → Even-page count for duplex printing.
342
+ - The **web bundle** exists at `output/web/` and as a zipped `output/<slug>-web.zip` — see `property-brochure → Web bundle` for what it contains. The bundle includes both `brochure.html` and the companion `index.html` (see `property-brochure → Page`), plus a copy of the web PDF named simply `<property_slug>-brochure.pdf` to match the in-page Download links. Smoke-test was performed: an isolated HTTP server returned 200 for every referenced asset (HTML, web-tier images, jpg snapshots, the bundled PDF), and **both** `brochure.html` and `index.html` rendered correctly. Typical zip is 30–50 MB for a 16-page folio.
343
+ - **Back-page QR codes are clickable.** Each QR is wrapped in an `<a target="_blank">` tag and accompanied by a visible underlined URL beneath the label, so a digital reader can click instead of scan. See `property-brochure → Back-page QR codes`.
344
+ - The user-facing report names which steps ran and which were reused, **and the chosen orientation**, **and the path to both the canonical print archive and the web zip**.
345
+ - No image was read in violation of the 2000px rule (verifiable: every image read should have been preceded by a `sips`/`identify` measurement, and any over-threshold image was previewed via `/tmp/`).
346
+
347
+ If any condition is unmet, report `DONE_WITH_CONCERNS` and list the gap.
348
+
349
+ ## When NOT to use this skill
350
+
351
+ - The user supplies only a brand URL (no property) → route directly to `brand-design`.
352
+ - The user supplies only a property URL (no brand context) → ask which agent's brand to use; if they say "use the existing one in `<dir>`", route to `property-extract` and then `property-brochure` with that brand directory.
353
+ - The user supplies pre-staged photos and asks for the brochure → route directly to `property-brochure`. There's nothing to orchestrate.
354
+ - The user wants to refresh a single piece (e.g. just regenerate the dark logo, just re-download images) → call the underlying skill directly with whatever scope they specified. The orchestrator is for end-to-end runs, not à la carte fixes.