@rubytech/create-maxy-code 0.1.26 → 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.
- package/dist/index.js +28 -11
- package/package.json +1 -1
- package/payload/platform/plugins/.claude-plugin/marketplace.json +5 -95
- package/payload/platform/plugins/brochures/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/brochures/PLUGIN.md +36 -0
- package/payload/platform/plugins/brochures/commands/make-brochure.md +11 -0
- package/payload/platform/plugins/brochures/skills/a4-print-documents/SKILL.md +478 -0
- package/payload/platform/plugins/brochures/skills/brand-design/SKILL.md +192 -0
- package/payload/platform/plugins/brochures/skills/make-brochure/SKILL.md +354 -0
- package/payload/platform/plugins/brochures/skills/make-brochure/references/seller-brief-template.md +115 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/SKILL.md +119 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/build.md +270 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/copy.md +211 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/images.md +166 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/index-landing.md +376 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/index.html +1288 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/placeholders.md +250 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/registers.md +47 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/seller-brief.md +56 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/structure.md +249 -0
- package/payload/platform/plugins/brochures/skills/property-brochure/references/template.html +2370 -0
- package/payload/platform/plugins/brochures/skills/property-extract/SKILL.md +372 -0
- package/payload/platform/plugins/buyers/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/buyers/PLUGIN.md +35 -0
- package/payload/platform/plugins/buyers/skills/buyer-feedback/SKILL.md +109 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/SKILL.md +42 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-qualification-questions.md +16 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-qualification.md +59 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-scripts.md +63 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-working-scripts.md +54 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/feedback-collection.md +42 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/offer-capture.md +38 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/viewing-booking.md +32 -0
- package/payload/platform/plugins/buyers/skills/buyer-management/references/viewing-management.md +52 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/SKILL.md +407 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/care-fees-guide.md +68 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/divorce-sales-guide.md +61 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/downsizing-guide.md +45 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/first-time-buyers.md +92 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/first-time-sellers.md +78 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/probate-guide.md +53 -0
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/upsizing-guide.md +41 -0
- package/payload/platform/plugins/buyers/skills/property-enquiry/SKILL.md +126 -0
- package/payload/platform/plugins/buyers/skills/viewing-management/SKILL.md +111 -0
- package/payload/platform/plugins/estate-business/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/estate-business/PLUGIN.md +65 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/SKILL.md +133 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/buy-back-your-time.md +37 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/firewave-gost-scorecards.md +14 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/keller-org-model.md +17 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/lencioni-team-models.md +22 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/listing-management-system.md +11 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/net-figure-form.md +11 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/serhant-bizinbox-notes.md +13 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/team-roles-commission.md +14 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/va-2026-ops.md +43 -0
- package/payload/platform/plugins/estate-business/skills/business-growth/references/wingman-structure.md +13 -0
- package/payload/platform/plugins/estate-business/skills/business-operations/SKILL.md +32 -0
- package/payload/platform/plugins/estate-business/skills/business-operations/references/crm-systems.md +57 -0
- package/payload/platform/plugins/estate-business/skills/business-operations/references/hiring-guide.md +59 -0
- package/payload/platform/plugins/estate-business/skills/business-operations/references/impact-framework.md +47 -0
- package/payload/platform/plugins/estate-business/skills/business-operations/references/minutes-equal-money.md +55 -0
- package/payload/platform/plugins/estate-business/skills/business-operations/references/team-management.md +48 -0
- package/payload/platform/plugins/estate-business/skills/commission-calculator/SKILL.md +40 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/SKILL.md +52 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/12-reasons.md +39 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/95-5-system.md +66 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/agent-attraction-scripts.md +90 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/business-partnership.md +92 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/exp-model-overview.md +66 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/model-comparison.md +66 -0
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/revenue-share-explained.md +57 -0
- package/payload/platform/plugins/estate-business/skills/month-end-close/SKILL.md +69 -0
- package/payload/platform/plugins/estate-business/skills/payment-batch-stager/SKILL.md +42 -0
- package/payload/platform/plugins/estate-business/skills/period-reconciler/SKILL.md +42 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/SKILL.md +117 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/attraction-agent-notes.md +31 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/attraction-agent.md +58 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/authenticity-boundaries.md +28 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/become-a-brand-leader-notes.md +19 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/blast-formula.md +42 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/brand-leader.md +48 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/brand-strategy-system.md +59 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/content-engine.md +49 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/firewave-blast-and-blogging.md +23 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/gary-v-content.md +52 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/gary-v-principles.md +20 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/oversubscribed-positioning.md +18 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/platforms.md +41 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/priestley-oversubscribed.md +54 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/storeys-style-examples.md +25 -0
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/visual-identity.md +27 -0
- package/payload/platform/plugins/estate-coaching/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/estate-coaching/PLUGIN.md +55 -0
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/SKILL.md +371 -0
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/atomic-habits.md +52 -0
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/daily-routine-scorecard.md +104 -0
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/hp6-model.md +63 -0
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/twelve-week-year.md +71 -0
- package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/SKILL.md +36 -0
- package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/coaching-boundaries.md +56 -0
- package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/feedback-framework.md +61 -0
- package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/performance-framework.md +109 -0
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/SKILL.md +421 -0
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/coaching-exercises.md +86 -0
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/goal-setting.md +78 -0
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/one-to-one-framework.md +92 -0
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/soi-workbook.md +103 -0
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/SKILL.md +410 -0
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/agent-training-guide.md +70 -0
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/business-in-a-box.md +72 -0
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/buyers-guide.md +53 -0
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/codo-method.md +72 -0
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/website-planning-guide.md +79 -0
- package/payload/platform/plugins/estate-onboarding/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/estate-onboarding/PLUGIN.md +31 -0
- package/payload/platform/plugins/estate-onboarding/skills/bootstrap/SKILL.md +26 -0
- package/payload/platform/plugins/estate-onboarding/skills/bootstrap/references/onboarding-flow.md +63 -0
- package/payload/platform/plugins/estate-sales/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/estate-sales/PLUGIN.md +53 -0
- package/payload/platform/plugins/estate-sales/skills/chase-progression/SKILL.md +107 -0
- package/payload/platform/plugins/estate-sales/skills/negotiation/SKILL.md +35 -0
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/deal-saving.md +47 -0
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-deep-guide.md +64 -0
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-prep-principles.md +29 -0
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-techniques.md +42 -0
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/offer-presentation.md +43 -0
- package/payload/platform/plugins/estate-sales/skills/risk-scorer/SKILL.md +42 -0
- package/payload/platform/plugins/estate-sales/skills/sales-closer/SKILL.md +24 -0
- package/payload/platform/plugins/estate-sales/skills/sales-closer/references/serhant-emotion-stages.md +36 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/SKILL.md +30 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/chris-voss-discovery.md +88 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/firewave-gost-journey.md +68 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/phil-jones-openers.md +78 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/pre-listing-checklist.md +77 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/serhant-improv.md +22 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/tom-ferry-discovery.md +103 -0
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/vendor-motivation-competitor.md +52 -0
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/SKILL.md +29 -0
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/chris-voss-negotiation.md +70 -0
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/phil-jones-price-words.md +40 -0
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/serhant-negotiation-plus.md +55 -0
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/tom-panos-commission-pricing.md +57 -0
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/tony-morris-questioning.md +54 -0
- package/payload/platform/plugins/estate-sales/skills/sales-progression/SKILL.md +27 -0
- package/payload/platform/plugins/estate-sales/skills/sales-progression/references/conveyancing-guide.md +54 -0
- package/payload/platform/plugins/estate-sales/skills/sales-progression/references/transaction-tracking.md +66 -0
- package/payload/platform/plugins/estate-teaching/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/estate-teaching/PLUGIN.md +31 -0
- package/payload/platform/plugins/estate-teaching/skills/content-directory/SKILL.md +39 -0
- package/payload/platform/plugins/estate-teaching/skills/content-directory/references/module-delivery.md +65 -0
- package/payload/platform/plugins/estate-teaching/skills/content-directory/references/progress-tracking.md +47 -0
- package/payload/platform/plugins/leads/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/leads/PLUGIN.md +62 -0
- package/payload/platform/plugins/leads/skills/chain-progression-tracker/SKILL.md +51 -0
- package/payload/platform/plugins/leads/skills/diary-builder/SKILL.md +38 -0
- package/payload/platform/plugins/leads/skills/enquiry-triage/SKILL.md +36 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/SKILL.md +137 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/buyer-search-letter.md +28 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/buyer-search-letters.md +37 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/database-reactivation.md +30 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/email-nurture-sequences.md +45 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/facebook-referrals.md +30 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/firewave-email-nurture-sequences.md +41 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/keller-33-touch.md +34 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/neighbour-letters.md +31 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/neighbour-notification-letter.md +20 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/ofi-follow-up-dialogue.md +22 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/ofi-follow-up.md +26 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/serhant-three-fs-plus.md +21 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/sharran-10x10x10.md +18 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/sms-templates.md +40 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/sphere-of-influence-notes.md +34 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/sphere-of-influence.md +60 -0
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/tom-panos-sms-templates.md +59 -0
- package/payload/platform/plugins/leads/skills/morning-round/SKILL.md +72 -0
- package/payload/platform/plugins/leads/skills/prospecting/SKILL.md +33 -0
- package/payload/platform/plugins/leads/skills/prospecting/references/database-matching.md +30 -0
- package/payload/platform/plugins/leads/skills/prospecting/references/database-value.md +53 -0
- package/payload/platform/plugins/leads/skills/prospecting/references/prospecting-dialogues.md +24 -0
- package/payload/platform/plugins/leads/skills/prospecting/references/reactivation.md +34 -0
- package/payload/platform/plugins/listings/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/listings/PLUGIN.md +103 -0
- package/payload/platform/plugins/listings/skills/comparable-finder/SKILL.md +52 -0
- package/payload/platform/plugins/listings/skills/epc-checker/SKILL.md +38 -0
- package/payload/platform/plugins/listings/skills/home-preparation/SKILL.md +28 -0
- package/payload/platform/plugins/listings/skills/home-preparation/references/kerb-appeal.md +38 -0
- package/payload/platform/plugins/listings/skills/home-preparation/references/photo-day.md +59 -0
- package/payload/platform/plugins/listings/skills/home-preparation/references/situational-tips.md +50 -0
- package/payload/platform/plugins/listings/skills/home-preparation/references/staging-guide.md +52 -0
- package/payload/platform/plugins/listings/skills/listing-copy-writer/SKILL.md +55 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/SKILL.md +286 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/references/booking-script.md +51 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/references/objection-scripts.md +193 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/references/penhaul-presentation.md +123 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/references/pre-listing-kit.md +139 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/references/set-to-sell.md +55 -0
- package/payload/platform/plugins/listings/skills/listing-presentation/references/sharran-frameworks.md +107 -0
- package/payload/platform/plugins/listings/skills/local-market-stats/SKILL.md +33 -0
- package/payload/platform/plugins/listings/skills/new-instruction/SKILL.md +78 -0
- package/payload/platform/plugins/listings/skills/particulars-builder/SKILL.md +48 -0
- package/payload/platform/plugins/listings/skills/portal-launch-scheduler/SKILL.md +49 -0
- package/payload/platform/plugins/listings/skills/pricing-scenario-builder/SKILL.md +35 -0
- package/payload/platform/plugins/listings/skills/property-marketing/SKILL.md +337 -0
- package/payload/platform/plugins/listings/skills/property-marketing/references/auction-report-template.md +41 -0
- package/payload/platform/plugins/listings/skills/property-marketing/references/coming-soon-campaign.md +43 -0
- package/payload/platform/plugins/listings/skills/property-marketing/references/direct-mail-templates.md +121 -0
- package/payload/platform/plugins/listings/skills/property-marketing/references/eoi-form-template.md +62 -0
- package/payload/platform/plugins/listings/skills/property-marketing/references/monthly-scorecard.md +63 -0
- package/payload/platform/plugins/listings/skills/supplier-booker/SKILL.md +39 -0
- package/payload/platform/plugins/listings/skills/talk-track-composer/SKILL.md +36 -0
- package/payload/platform/plugins/listings/skills/terms-of-business-drafter/SKILL.md +54 -0
- package/payload/platform/plugins/listings/skills/valuation-prep/SKILL.md +69 -0
- package/payload/platform/plugins/loop/.claude-plugin/plugin.json +17 -0
- package/payload/platform/plugins/loop/PLUGIN.md +108 -0
- package/payload/platform/plugins/loop/mcp/dist/index.d.ts +2 -0
- package/payload/platform/plugins/loop/mcp/dist/index.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/index.js +293 -0
- package/payload/platform/plugins/loop/mcp/dist/index.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/crypto.d.ts +10 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/crypto.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/crypto.js +88 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/crypto.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.d.ts +82 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.js +427 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.d.ts +5 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.js +40 -0
- package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.d.ts +10 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.js +24 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/feedback.d.ts +16 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/feedback.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/feedback.js +35 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/feedback.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.d.ts +5 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.js +19 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-list.d.ts +4 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-list.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-list.js +14 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-list.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.d.ts +9 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.js +60 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts +13 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.js +41 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts +9 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.js +16 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts +15 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.js +11 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.d.ts +10 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.js +39 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.d.ts +9 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.js +125 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-search.d.ts +18 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-search.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-search.js +87 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/people-search.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.d.ts +10 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.js +82 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.d.ts +12 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.js +32 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-request.d.ts +15 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-request.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-request.js +11 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-request.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-search.d.ts +16 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-search.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-search.js +41 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/property-search.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/supplier.d.ts +13 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/supplier.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/supplier.js +49 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/supplier.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.d.ts +7 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.js +19 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-info.d.ts +5 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-info.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-info.js +32 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/team-info.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.d.ts +14 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.js +11 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.d.ts +9 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.js +85 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.d.ts +13 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.js +44 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.d.ts +14 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.d.ts.map +1 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.js +18 -0
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.js.map +1 -0
- package/payload/platform/plugins/loop/mcp/package-lock.json +2549 -0
- package/payload/platform/plugins/loop/mcp/package.json +21 -0
- package/payload/platform/plugins/loop/mcp/src/__tests__/loop-swagger.snapshot.json +26467 -0
- package/payload/platform/plugins/loop/mcp/src/__tests__/swagger-write-coverage.test.ts +153 -0
- package/payload/platform/plugins/loop/mcp/src/index.ts +444 -0
- package/payload/platform/plugins/loop/mcp/src/lib/crypto.ts +105 -0
- package/payload/platform/plugins/loop/mcp/src/lib/loop-api.ts +604 -0
- package/payload/platform/plugins/loop/mcp/src/lib/neo4j.ts +51 -0
- package/payload/platform/plugins/loop/mcp/src/tools/customer-preferences.ts +66 -0
- package/payload/platform/plugins/loop/mcp/src/tools/feedback.ts +86 -0
- package/payload/platform/plugins/loop/mcp/src/tools/key-deregister.ts +27 -0
- package/payload/platform/plugins/loop/mcp/src/tools/key-list.ts +19 -0
- package/payload/platform/plugins/loop/mcp/src/tools/key-register.ts +95 -0
- package/payload/platform/plugins/loop/mcp/src/tools/marketing-enquiry.ts +113 -0
- package/payload/platform/plugins/loop/mcp/src/tools/marketing-match-batch.ts +53 -0
- package/payload/platform/plugins/loop/mcp/src/tools/marketing-match-request.ts +42 -0
- package/payload/platform/plugins/loop/mcp/src/tools/marketing-match.ts +84 -0
- package/payload/platform/plugins/loop/mcp/src/tools/people-detail.ts +245 -0
- package/payload/platform/plugins/loop/mcp/src/tools/people-search.ts +180 -0
- package/payload/platform/plugins/loop/mcp/src/tools/property-detail.ts +145 -0
- package/payload/platform/plugins/loop/mcp/src/tools/property-listed.ts +88 -0
- package/payload/platform/plugins/loop/mcp/src/tools/property-request.ts +42 -0
- package/payload/platform/plugins/loop/mcp/src/tools/property-search.ts +92 -0
- package/payload/platform/plugins/loop/mcp/src/tools/supplier.ts +129 -0
- package/payload/platform/plugins/loop/mcp/src/tools/team-availability.ts +52 -0
- package/payload/platform/plugins/loop/mcp/src/tools/team-info.ts +95 -0
- package/payload/platform/plugins/loop/mcp/src/tools/viewing-create.ts +41 -0
- package/payload/platform/plugins/loop/mcp/src/tools/viewing-detail.ts +171 -0
- package/payload/platform/plugins/loop/mcp/src/tools/viewing-search.ts +92 -0
- package/payload/platform/plugins/loop/mcp/src/tools/viewing-update.ts +53 -0
- package/payload/platform/plugins/loop/mcp/tsconfig.json +20 -0
- package/payload/platform/plugins/loop/mcp/vitest.config.ts +9 -0
- package/payload/platform/plugins/loop/skills/compliance-flag-checker/SKILL.md +53 -0
- package/payload/platform/plugins/loop/skills/priority-ranker/SKILL.md +40 -0
- package/payload/platform/plugins/loop/skills/tone-matched-drafter/SKILL.md +53 -0
- package/payload/platform/plugins/loop/skills/variance-narrator/SKILL.md +50 -0
- package/payload/platform/plugins/loop/skills/vendor-research/SKILL.md +54 -0
- package/payload/platform/plugins/teaching/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/teaching/PLUGIN.md +57 -0
- package/payload/platform/plugins/teaching/skills/interactive-tutor/SKILL.md +59 -0
- package/payload/platform/plugins/teaching/skills/interactive-tutor/references/assessment.md +70 -0
- package/payload/platform/plugins/teaching/skills/interactive-tutor/references/classroom-conduct.md +43 -0
- package/payload/platform/plugins/teaching/skills/interactive-tutor/references/teaching-modes.md +83 -0
- package/payload/platform/plugins/teaching/skills/lesson-planner/SKILL.md +48 -0
- package/payload/platform/plugins/teaching/skills/lesson-planner/references/context-gathering.md +41 -0
- package/payload/platform/plugins/teaching/skills/lesson-planner/references/plan-structure.md +94 -0
- package/payload/platform/plugins/teaching/skills/study-pack-builder/SKILL.md +52 -0
- package/payload/platform/plugins/teaching/skills/study-pack-builder/references/disaggregation.md +49 -0
- package/payload/platform/plugins/teaching/skills/study-pack-builder/references/materials.md +116 -0
- package/payload/platform/plugins/vendors/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/vendors/PLUGIN.md +34 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/SKILL.md +42 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/fee-protection-and-agenda.md +28 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/listing-scripts.md +44 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/negotiation-deep-guide.md +70 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/price-alignment-scripts.md +33 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/price-alignment.md +34 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/scenario-scripts.md +38 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/seller-engagement.md +51 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/valuation-booking.md +76 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/vendor-scripts.md +63 -0
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/vendor-updates.md +41 -0
- package/payload/platform/plugins/vendors/skills/vendor-updates/SKILL.md +153 -0
- package/payload/platform/plugins/writer-craft/.claude-plugin/plugin.json +8 -0
- package/payload/platform/plugins/writer-craft/PLUGIN.md +87 -0
- package/payload/platform/plugins/writer-craft/agents/writer-craft--manuscript-reviewer.md +92 -0
- package/payload/platform/plugins/writer-craft/skills/citation-style/SKILL.md +94 -0
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/book-and-chapter-models.md +77 -0
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/citation-rules.md +103 -0
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/journal-article-models.md +74 -0
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/other-source-models.md +146 -0
- package/payload/platform/plugins/writer-craft/skills/citation-style/references/reference-list-rules.md +70 -0
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/SKILL.md +108 -0
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/copyediting.md +73 -0
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/developmental-editing.md +85 -0
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/genre-specific-editing.md +78 -0
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/line-editing.md +55 -0
- package/payload/platform/plugins/writer-craft/skills/editorial-practice/references/self-editing.md +89 -0
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/SKILL.md +114 -0
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/audience-analysis.md +73 -0
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/crafting-persuasive-story.md +76 -0
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/persuasion-case-studies.md +67 -0
- package/payload/platform/plugins/writer-craft/skills/persuasive-storytelling/references/transformation-framework.md +86 -0
- package/payload/platform/plugins/writer-craft/skills/point-of-view/SKILL.md +97 -0
- package/payload/platform/plugins/writer-craft/skills/point-of-view/references/indirect-narration.md +72 -0
- package/payload/platform/plugins/writer-craft/skills/point-of-view/references/pov-types-and-voice.md +91 -0
- package/payload/platform/plugins/writer-craft/skills/point-of-view/references/protagonist-filter.md +71 -0
- package/payload/platform/plugins/writer-craft/skills/point-of-view/references/tense-and-person.md +85 -0
- package/payload/platform/plugins/writer-craft/skills/prose-craft/SKILL.md +100 -0
- package/payload/platform/plugins/writer-craft/skills/prose-craft/references/punctuation-and-grammar.md +72 -0
- package/payload/platform/plugins/writer-craft/skills/prose-craft/references/repetition.md +71 -0
- package/payload/platform/plugins/writer-craft/skills/prose-craft/references/sound-and-rhythm.md +64 -0
- package/payload/platform/plugins/writer-craft/skills/prose-craft/references/word-economy.md +93 -0
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/SKILL.md +100 -0
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/cause-effect-setup-payoff.md +79 -0
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/conflict-escalation.md +81 -0
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/hooking-readers.md +67 -0
- package/payload/platform/plugins/writer-craft/skills/reader-engagement/references/neurochemistry-of-engagement.md +94 -0
- package/payload/platform/plugins/writer-craft/skills/review-manuscript/SKILL.md +111 -0
- package/payload/platform/plugins/writer-craft/skills/review-manuscript/references/review-manuscript-checklist.md +119 -0
- package/payload/platform/plugins/writer-craft/skills/review-prose/SKILL.md +99 -0
- package/payload/platform/plugins/writer-craft/skills/review-prose/references/prose-review-checklist.md +112 -0
- package/payload/platform/plugins/writer-craft/skills/review-scene/SKILL.md +99 -0
- package/payload/platform/plugins/writer-craft/skills/review-scene/references/scene-analysis-framework.md +95 -0
- package/payload/platform/plugins/writer-craft/skills/story-architecture/SKILL.md +106 -0
- package/payload/platform/plugins/writer-craft/skills/story-architecture/references/blueprinting-and-scene-cards.md +118 -0
- package/payload/platform/plugins/writer-craft/skills/story-architecture/references/inner-issue-and-protagonist-goal.md +66 -0
- package/payload/platform/plugins/writer-craft/skills/story-architecture/references/misbelief-desire-worldview.md +87 -0
- package/payload/platform/plugins/writer-craft/skills/story-architecture/references/origin-scenes-and-escalation.md +82 -0
- package/payload/platform/plugins/writer-craft/skills/story-blueprint/SKILL.md +133 -0
- package/payload/platform/plugins/writer-craft/skills/story-blueprint/references/blueprinting-exercises.md +118 -0
- package/payload/platform/plugins/writer-craft/skills/story-blueprint/references/blueprinting-process.md +128 -0
- package/payload/platform/services/claude-session-manager/dist/config.d.ts +6 -0
- package/payload/platform/services/claude-session-manager/dist/config.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/config.js +60 -1
- package/payload/platform/services/claude-session-manager/dist/config.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts +9 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/http-server.js +34 -0
- package/payload/platform/services/claude-session-manager/dist/http-server.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/index.js +12 -0
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/public-tool-audit.d.ts +33 -0
- package/payload/platform/services/claude-session-manager/dist/public-tool-audit.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/public-tool-audit.js +149 -0
- package/payload/platform/services/claude-session-manager/dist/public-tool-audit.js.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/spawn-rate-limiter.d.ts +28 -0
- package/payload/platform/services/claude-session-manager/dist/spawn-rate-limiter.d.ts.map +1 -0
- package/payload/platform/services/claude-session-manager/dist/spawn-rate-limiter.js +77 -0
- package/payload/platform/services/claude-session-manager/dist/spawn-rate-limiter.js.map +1 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: property-extract
|
|
3
|
+
description: Use when a live property listing URL on an estate-agent website (Muvin, or any site using the Loop CRM CDN at b-cdn.net) needs to be turned into a local property assets directory containing photos, floorplans, EPC documents, and structured metadata that the property-brochure skill can consume. Trigger phrases include "extract property from <url>", "get property details from <url>", "scrape this listing", "pull all the photos from <listing>", "stage assets for the brochure", or any request that names a live property URL and asks for the photos, floorplans, and details to be saved locally.
|
|
4
|
+
allowed-tools:
|
|
5
|
+
- Bash
|
|
6
|
+
- Read
|
|
7
|
+
- Write
|
|
8
|
+
- Edit
|
|
9
|
+
- Glob
|
|
10
|
+
- Grep
|
|
11
|
+
- WebFetch
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# property-extract
|
|
15
|
+
|
|
16
|
+
Turn one publicly-accessible property listing URL into a self-contained property assets directory that `property-brochure` can consume without re-visiting the source site.
|
|
17
|
+
|
|
18
|
+
The reference output this skill targets is `/Users/neo/estate-agents/muvin/properties/henham-road-debden-green-hamperden-end-cb11-3lz-949931/` — read that directory once before generating to anchor the standard.
|
|
19
|
+
|
|
20
|
+
## Outcome contract
|
|
21
|
+
|
|
22
|
+
The skill is **complete** when the target directory contains exactly this structure:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
<output-dir>/<property-slug>-<listing-id>/
|
|
26
|
+
property.json # structured metadata
|
|
27
|
+
description.md # human-readable description + agent + EPC + council tax
|
|
28
|
+
epc/ # EPC certificate PDF/image, OR empty if rating is "TBC"
|
|
29
|
+
floorplans/ # all floorplan images, original filenames
|
|
30
|
+
images/ # all property photographs and renders, original filenames
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Every photograph and floorplan referenced by the listing must be downloaded. `epc/` may legitimately be empty (if no EPC has been issued); `images/` and `floorplans/` must not be empty if the listing exposes any.
|
|
34
|
+
|
|
35
|
+
Do **not** pre-create a `brochure/` slot. `property-brochure` writes its deliverable directly to `<property_dir>/output/` — see `property-brochure/SKILL.md → Reference standard`. An empty `brochure/` next to `output/` is the legacy layout and a defect.
|
|
36
|
+
|
|
37
|
+
`<property-slug>` comes from the URL path segment (e.g. `henham-road-debden-green-hamperden-end-cb11-3lz`). `<listing-id>` is the numeric ID, also from the URL. Concatenating them keeps the folder both human-readable and unique even when the same street has multiple listings.
|
|
38
|
+
|
|
39
|
+
Anything else (raw HTML dumps, `/tmp` files, intermediate URL lists) must be cleaned up before reporting completion.
|
|
40
|
+
|
|
41
|
+
## Inputs
|
|
42
|
+
|
|
43
|
+
Required: a property listing URL, fully-formed and publicly accessible. If only a postcode or property name is given, decline and ask for the URL — listings are uniquely identified by their numeric IDs, and there is no reliable way to infer one from a description.
|
|
44
|
+
|
|
45
|
+
Optional: an output directory. The default is `<brand_dir>/properties/`, where `<brand_dir>` is the brand workspace for the agent that owns the listing. For a Muvin URL with the existing brand pack at `/Users/neo/estate-agents/muvin/`, that resolves to `/Users/neo/estate-agents/muvin/properties/`. If the brand workspace cannot be located, fall back to `./properties/` in the caller's current working directory.
|
|
46
|
+
|
|
47
|
+
The property directory **must** sit inside its brand workspace at `<brand_dir>/properties/<property_slug>-<listing_id>/` — never as a sibling of the brand workspace, never inside another property's folder. This is the contract `make-brochure` and `property-brochure` read against.
|
|
48
|
+
|
|
49
|
+
## Scope boundaries
|
|
50
|
+
|
|
51
|
+
| In scope | Out of scope |
|
|
52
|
+
|---|---|
|
|
53
|
+
| Muvin listings (`muvin.co.uk/property/...`) and any other agent fronting the Loop CRM CDN (`*.b-cdn.net/propertyimages/...`, `*.b-cdn.net/floorplans/...`) | Listings on agency-specific platforms (Rightmove, Zoopla, OnTheMarket, OpenRent) — those have separate page structures and image hosts |
|
|
54
|
+
| All photos, floorplans, drone shots, AI-staged renders | Stripping AI-generated images from the photo set — keep them all and flag in metadata |
|
|
55
|
+
| Property description, key features, price, specs, agent contact | Walkthrough video transcription (the property-brochure skill handles that separately if the user supplies one) |
|
|
56
|
+
| EPC rating as a value, EPC certificate PDF if linked from the page | EPC certificate retrieval from the EPC Register — that's a separate lookup; if the listing does not link the certificate, leave `epc/` empty and record `"epc_rating": "TBC"` (or the band shown) in `property.json` |
|
|
57
|
+
| Council tax band as shown on the page | Council tax band verification against VOA — out of scope |
|
|
58
|
+
| Material Information visible on the listing page (tenure, council tax, EPC) | Full Part A/B/C compliance gathering — that's the brochure assembly step's job |
|
|
59
|
+
|
|
60
|
+
If the page is JS-rendered and `curl` returns no asset URLs, fall back to a headless-browser fetch (Chrome DevTools MCP or Playwright). If even that fails, stop and report `STATUS: BLOCKED` — do not synthesise an asset list.
|
|
61
|
+
|
|
62
|
+
## Artifact contracts
|
|
63
|
+
|
|
64
|
+
### Folder layout
|
|
65
|
+
|
|
66
|
+
The three subfolders (`images/`, `floorplans/`, `epc/`) are **mandatory and named exactly** as specified — they are part of the contract that `property-brochure` reads against. Do not pluralise differently, do not collapse `epc/` into `floorplans/`, do not add a sibling `videos/` or `brochure/` folder. If a future asset class needs accommodating, propose a contract change to the plugin first.
|
|
67
|
+
|
|
68
|
+
### `images/`
|
|
69
|
+
|
|
70
|
+
Every URL on the page matching `b-cdn.net/propertyimages/<tenant-uuid>/<listing-id>/` is an image asset. Two CDN buckets are in active use as of April 2026:
|
|
71
|
+
|
|
72
|
+
- `loop-app.b-cdn.net` — older photos (2024-vintage uploads)
|
|
73
|
+
- `loopcrm.b-cdn.net` — newer 2026 additions (drone shots, AI-staged renders, screenshots)
|
|
74
|
+
|
|
75
|
+
Download all of them. Preserve the original filenames — they encode upload timestamps as Unix epochs (e.g. `DSC01495_1727361503898.jpg` → 26 Sept 2024) which are useful for ordering and de-duplication later.
|
|
76
|
+
|
|
77
|
+
Image categories observable from filename prefixes:
|
|
78
|
+
|
|
79
|
+
| Prefix | Origin |
|
|
80
|
+
|---|---|
|
|
81
|
+
| `DSC*`, `IMG*` | Photographer's DSLR/mirrorless |
|
|
82
|
+
| `DJI_*` | Drone imagery |
|
|
83
|
+
| `ChatGPT-Image-*` | AI-staged render |
|
|
84
|
+
| `Screenshot-*` | Map/aerial screenshot from a desktop tool |
|
|
85
|
+
| `iPhone*`, `WhatsApp*` | Quick mobile snaps (lower resolution) |
|
|
86
|
+
|
|
87
|
+
Record the count per prefix in `property.json` under `media.image_breakdown` — `property-brochure` uses this to pick the right photo for each slot.
|
|
88
|
+
|
|
89
|
+
#### Curator-friendly rename — "<Property Name> N.jpg"
|
|
90
|
+
|
|
91
|
+
After downloading, **also rename the images to `<Property Name> N.jpg`** (1-indexed, ordered by upload timestamp parsed from the original filename) so a human curator can browse `images/` in Finder/Preview and intuitively pick which photo goes in which slot. The downstream `property-brochure` slot map references `images/<property-slug>-NN.webp`, where `NN` matches the curator-chosen `N` 1:1 — so renaming source images to that order at extract time makes the entire pipeline traceable: the curator sees `Sparrows Farm 22.jpg` in Finder, the brochure HTML references `images/sparrows-farm-22.webp`, and a search across either resolves to the same photograph.
|
|
92
|
+
|
|
93
|
+
The rename is **not** a replacement of the original CDN-named files — those are preserved as-is for timestamp ordering and de-duplication. The renamed files are the same bytes (or a `cp`/`ln` of the originals), placed alongside, with the new `<Property Name> N.jpg` filenames.
|
|
94
|
+
|
|
95
|
+
Recipe:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
cd <property_dir>/images
|
|
99
|
+
i=1
|
|
100
|
+
# Sort original CDN files by their embedded epoch timestamp (DSC01525_1727361503... → 1727361503)
|
|
101
|
+
for src in $(ls -1 | grep -E '^(DSC|DJI|ChatGPT-Image|Screenshot|IMG|iPhone|WhatsApp)' | \
|
|
102
|
+
awk -F_ '{print $0, $NF}' | sort -k2 -n | awk '{print $1}'); do
|
|
103
|
+
cp "$src" "<Property Name> ${i}.jpg"
|
|
104
|
+
i=$((i+1))
|
|
105
|
+
done
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
The `<Property Name>` is taken from `property.json -> property_name` (see *Property name vs address* below). If the property has no distinct name (uncommon at this register), use the first part of the address (e.g. "Henham Road").
|
|
109
|
+
|
|
110
|
+
Record the original-to-curator-name mapping in `property.json -> media.image_curator_map` so the rename is reversible:
|
|
111
|
+
|
|
112
|
+
```json
|
|
113
|
+
"media": {
|
|
114
|
+
"image_curator_map": {
|
|
115
|
+
"Sparrows Farm 1.jpg": "DJI_0125_1777122816019.jpg",
|
|
116
|
+
"Sparrows Farm 2.jpg": "DJI_0115_1777122829462.jpg",
|
|
117
|
+
"...": "..."
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### `floorplans/`
|
|
123
|
+
|
|
124
|
+
URLs matching `b-cdn.net/floorplans/<tenant-uuid>/<listing-id>/`. Listings typically ship one floorplan per floor (so 1–3 files for a UK home). Preserve original filenames.
|
|
125
|
+
|
|
126
|
+
### `epc/`
|
|
127
|
+
|
|
128
|
+
If the page links a PDF whose URL contains `epc` or whose link text mentions "EPC" / "Energy Performance Certificate", download it here. If the page only states a rating ("EPC rating: D") without linking a certificate, leave the folder empty and reflect the rating in `property.json`. If the rating is "TBC", record that exact string — do not guess.
|
|
129
|
+
|
|
130
|
+
### Map — extract or omit
|
|
131
|
+
|
|
132
|
+
**Maps are extracted, never synthesized.** If the listing doesn't supply one, the brochure ships without a map. No fallback to OSM static maps, no postcode-geocoded re-render via postcodes.io, no AI-generated map artwork. Postcode centroids can mislead about exact location, and the brochure should reflect what the agency actually publishes — not what the pipeline could imagine.
|
|
133
|
+
|
|
134
|
+
The capture is **provider-agnostic by design.** Estate agents embed maps in many ways: Google Maps iframes (Loop CRM / Muvin), Mapbox or Leaflet `<div>`+canvas instantiations (custom builds), `<img>` static-map renders (Rightmove-style), Apple Maps embeds, custom-class wrappers — and that list will only grow. Don't hard-code a single CMS's markup. Instead: **find a map element by heuristic, screenshot it, save the bytes.** The provider's brand and tile style come along for the ride.
|
|
135
|
+
|
|
136
|
+
**Detect.** Render the listing page in a real browser (Playwright). Try these heuristics in order, taking the first non-empty hit:
|
|
137
|
+
|
|
138
|
+
1. **Iframes whose src points at a known map provider:** `iframe[src*="maps.google"], iframe[src*="google.com/maps"], iframe[src*="mapbox.com"], iframe[src*="apple.com/maps"], iframe[src*="bing.com/maps"], iframe[src*="openstreetmap"]`.
|
|
139
|
+
2. **Containers whose class or id contains "map":** `[class*="property-map"], [class*="location-map"], [class*="section__map"], [class*="listing-map"], [id*="property-map"], [id*="location-map"]`. Filter out obvious false positives by element size (the map should be at least 300×300 in rendered pixels).
|
|
140
|
+
3. **`<img>` elements whose src points at a static-map service:** `img[src*="staticmap"], img[src*="maps.googleapis.com/maps/api/staticmap"], img[src*="api.mapbox.com/styles"]`.
|
|
141
|
+
4. **Visual fallback** (only if 1–3 fail and the user has confirmed the listing should have one): scan the page for a square-ish element ≥ 400×400 px containing a `<canvas>` (Mapbox-GL / Leaflet rasters). This is best-effort — log what was found and let the user verify.
|
|
142
|
+
|
|
143
|
+
Take the first hit. If all heuristics return nothing, the listing has no map: stop, write `media.map: null`, do not synthesize.
|
|
144
|
+
|
|
145
|
+
**Capture.**
|
|
146
|
+
|
|
147
|
+
1. Navigate to the listing URL with Playwright.
|
|
148
|
+
2. Scroll the detected element into view (`element.scrollIntoViewIfNeeded()`).
|
|
149
|
+
3. Wait for tiles to load — `page.waitForLoadState('networkidle')` or a 2-second buffer after scroll, plus an extra 1-second beat for canvas-based maps that fade in.
|
|
150
|
+
4. Screenshot the **element**, not the page: `element.screenshot({path: '<property_dir>/images/map.png'})`. This captures whatever the agency renders, using whatever provider and API key they've already paid for, at the visual size their site presents.
|
|
151
|
+
5. Convert PNG → WebP via `cwebp -q 86 -m 6 -mt -resize 1500 0 map.png -o map.webp`. Target ~1500 px wide.
|
|
152
|
+
6. Discard the intermediate `map.png`; `map.webp` is the asset.
|
|
153
|
+
|
|
154
|
+
**Coordinates** (best-effort, optional). If the detected element is a Google Maps iframe whose `src` exposes `q=<lat>,<lon>` or `¢er=<lat>,<lon>`, parse and record the coords under `address.geo`. If the element is a Mapbox iframe with `?center=lon,lat` in the URL, parse those. If the element is a div+canvas with no obvious URL, leave `address.geo: null` — coordinates aren't required for the map slot to render, since the screenshot is the asset. Coordinates are nice-to-have metadata, not gating data.
|
|
155
|
+
|
|
156
|
+
**Record in `property.json`.** Add two slots:
|
|
157
|
+
|
|
158
|
+
- Under `media`, set `map`: `"map.webp"` (filename, no path — the brochure resolves it inside `output/images/`).
|
|
159
|
+
- Under `address`, set `geo`: `{"latitude": <float>, "longitude": <float>, "source": "<provider-token>", "embed_url": "<src or null>"}` if coords were parseable; otherwise `null`. The `source` token is one of `google_maps_iframe`, `mapbox_iframe`, `apple_maps_iframe`, `static_map_image`, or `unknown` (when only a screenshot was captured).
|
|
160
|
+
|
|
161
|
+
**Absent case.** If no map element was detected, write `address.geo: null` and `media.map: null`. Do nothing else. The brochure step reads these nulls and removes its conditional map slot.
|
|
162
|
+
|
|
163
|
+
**Capture failure.** If a map element was detected but the screenshot fails (page rendered without tiles loading, rate-limited tile servers, transient network blip), record `media.map: null` and emit a `DONE_WITH_CONCERNS` listing the failure and the detected element — do not ship a half-cooked broken-image link. Any coords parsed from URLs may still be recorded so a later run can retry.
|
|
164
|
+
|
|
165
|
+
The rule, in one line: **extract or omit**.
|
|
166
|
+
|
|
167
|
+
### Property name vs address — they are not the same field
|
|
168
|
+
|
|
169
|
+
At the super-premium register, many properties have a **distinct name** that is separate from the postal address: *Sparrows Farm*, *The Old Rectory*, *Beacon House*. The brochure's cover hero is the property name; the subtitle is the address. The two must be captured separately at extraction time.
|
|
170
|
+
|
|
171
|
+
Detect the property name by:
|
|
172
|
+
|
|
173
|
+
1. Looking for "<Name>, <street>" patterns in the listing's title or H1 (e.g. "Sparrows Farm, Henham Road").
|
|
174
|
+
2. Looking for a name that is *not* a numbered street address (numbered addresses like "12 Henham Road" don't have a separate name).
|
|
175
|
+
3. Cross-checking with a Sprift / Land Registry report — if the title is registered as "Sparrows Farm at Henham Road", the name is *Sparrows Farm*.
|
|
176
|
+
|
|
177
|
+
Record both in `property.json`:
|
|
178
|
+
|
|
179
|
+
```json
|
|
180
|
+
"property_name": "Sparrows Farm", // or null if the property has no distinct name
|
|
181
|
+
"address": {
|
|
182
|
+
"line_1": "Henham Road",
|
|
183
|
+
"locality": "Hamperden End",
|
|
184
|
+
"...": "..."
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
When `property_name` is present, the brochure's cover hero uses it; the subtitle uses the address. When `property_name` is null, the cover hero uses `address.line_1`. Get this wrong at extract time and the brochure cover gets a street name where the property's actual name should be — a recurring failure mode this rule prevents.
|
|
189
|
+
|
|
190
|
+
### Material information from third-party reports — Sprift, Propalt, PropertyData
|
|
191
|
+
|
|
192
|
+
Beyond the listing page itself, three UK data sources provide the deeper Material Information fields (tenure, title number, council tax £, broadband, mobile signal, flood risk, conservation, planning) that buyers need under DMCCA 2024:
|
|
193
|
+
|
|
194
|
+
| Source | URL pattern | Best for |
|
|
195
|
+
|---|---|---|
|
|
196
|
+
| Sprift KFB report | `https://reports.sprift.com/property-report/<slug>/<id>` | Most fields, ready for human reading; needs Playwright to render (JS-loaded sections) |
|
|
197
|
+
| Sprift API | `https://sprift.com/data-and-api` | Programmatic access to the same data |
|
|
198
|
+
| Propalt API | `https://propalt.co.uk/product/api` | Material info bundle for compliance |
|
|
199
|
+
| PropertyData API | `https://propertydata.co.uk/api/land-registry` | Title number, sold history, deed restrictions |
|
|
200
|
+
|
|
201
|
+
If the user supplies a Sprift KFB URL, navigate it with Playwright (not `WebFetch` — sections are dynamically loaded), extract the published values, and record them in `property.json` under `material_info`:
|
|
202
|
+
|
|
203
|
+
```json
|
|
204
|
+
"material_info": {
|
|
205
|
+
"title_number": "EX23685",
|
|
206
|
+
"uprn": "100091281531",
|
|
207
|
+
"local_authority": "Uttlesford",
|
|
208
|
+
"council_tax_annual": "£3,890",
|
|
209
|
+
"broadband_fttp_mbps": 1800,
|
|
210
|
+
"mobile_coverage": { "EE": "Average", "Vodafone": "Average", "O2": "Good", "Three": "Average" },
|
|
211
|
+
"flood_risk_surface_water": "Low",
|
|
212
|
+
"flood_risk_rivers_seas": "Very low",
|
|
213
|
+
"conservation_area": false,
|
|
214
|
+
"restrictive_covenants": false,
|
|
215
|
+
"...": "..."
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
The brochure step reads `material_info` and populates page 11's three-column disclosure grid. Fields not present remain "TBC" — never invent.
|
|
220
|
+
|
|
221
|
+
### Video tours and back-page QR codes
|
|
222
|
+
|
|
223
|
+
Estate-agent listings increasingly include a Giraffe360, Matterport, YouTube or Vimeo video tour. Record the URL in `property.json -> media.video_tours` (array). The brochure's back page shows two QR codes generated at brochure-assembly time:
|
|
224
|
+
|
|
225
|
+
- QR 1: the video tour URL
|
|
226
|
+
- QR 2: the listing URL itself
|
|
227
|
+
|
|
228
|
+
`property-brochure` calls `qrencode -t PNG -s 12 -m 2 -l M -o images/qr-video.png "<url>"` for each. The extract step doesn't generate QRs (they may be regenerated if URLs change), but it does need to capture the video URLs accurately so the brochure can build them.
|
|
229
|
+
|
|
230
|
+
### `property.json`
|
|
231
|
+
|
|
232
|
+
Machine-readable metadata. Required keys:
|
|
233
|
+
|
|
234
|
+
```json
|
|
235
|
+
{
|
|
236
|
+
"source": {
|
|
237
|
+
"url": "<full listing URL>",
|
|
238
|
+
"listing_id": "<numeric id>",
|
|
239
|
+
"tenant_id": "<uuid from CDN paths>",
|
|
240
|
+
"scraped_on": "<YYYY-MM-DD>"
|
|
241
|
+
},
|
|
242
|
+
"property_name": "<distinct name or null>",
|
|
243
|
+
"address": {
|
|
244
|
+
"line_1": "...",
|
|
245
|
+
"locality": "...",
|
|
246
|
+
"postcode": "...",
|
|
247
|
+
"geo": {
|
|
248
|
+
"latitude": 51.793472,
|
|
249
|
+
"longitude": 0.637936,
|
|
250
|
+
"source": "google_maps_iframe",
|
|
251
|
+
"embed_url": "https://www.google.com/maps/embed/v1/place?key=...&q=51.793472,0.637936"
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
"price": {
|
|
255
|
+
"amount": <integer GBP>,
|
|
256
|
+
"currency": "GBP",
|
|
257
|
+
"qualifier": "Offers Over | Guide Price | Asking Price | POA"
|
|
258
|
+
},
|
|
259
|
+
"specifications": {
|
|
260
|
+
"property_type": "Detached House | ...",
|
|
261
|
+
"bedrooms": <int>,
|
|
262
|
+
"bathrooms": <int>,
|
|
263
|
+
"reception_rooms": <int>,
|
|
264
|
+
"tenure": "Freehold | Leasehold | null",
|
|
265
|
+
"epc_rating": "A | B | ... | TBC",
|
|
266
|
+
"council_tax_band": "A | B | ... | H",
|
|
267
|
+
"age": "<string, optional>"
|
|
268
|
+
},
|
|
269
|
+
"key_features": ["...", "..."],
|
|
270
|
+
"agent": {
|
|
271
|
+
"name": "...",
|
|
272
|
+
"agency": "...",
|
|
273
|
+
"phone": "...",
|
|
274
|
+
"email": "..."
|
|
275
|
+
},
|
|
276
|
+
"media": {
|
|
277
|
+
"video_tours": ["<url>", "..."],
|
|
278
|
+
"image_count": <int>,
|
|
279
|
+
"floorplan_count": <int>,
|
|
280
|
+
"epc_document": "<filename in epc/ or null>",
|
|
281
|
+
"map": "<filename in images/ or null>",
|
|
282
|
+
"brochure": null
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
Unknown values are `null`, not `""` and not omitted. The downstream brochure skill relies on `null` to recognise "we know we don't have this" vs. a missing key (= "this wasn't extracted, look again").
|
|
288
|
+
|
|
289
|
+
`address.geo` and `media.map` follow the **extract or omit** rule documented under **Map — extract or omit**. `media.map` is populated when *any* map element on the listing was detected and screenshotted successfully (whatever provider — Google, Mapbox, Apple, custom, static-image). `address.geo` is populated only when coordinates were parseable from a recognised URL pattern; it can be `null` even when `media.map` is present (a div+canvas Mapbox map may yield a screenshot but no URL-embedded coords). Both are `null` when no map element was detected. Never synthesised from postcode geocoding or any other source.
|
|
290
|
+
|
|
291
|
+
### `description.md`
|
|
292
|
+
|
|
293
|
+
Plain Markdown, no frontmatter. Structure:
|
|
294
|
+
|
|
295
|
+
1. H1: full address.
|
|
296
|
+
2. One-line summary: price, beds, baths, reception rooms, type, council tax, EPC.
|
|
297
|
+
3. Source line: linked listing URL.
|
|
298
|
+
4. Agent line: name, agency, phone, email.
|
|
299
|
+
5. H2 "Property Description" — verbatim paragraphs from the listing's description section. Preserve paragraph breaks. Do not paraphrase. Strip HTML entities (`’` → `'`, `&` → `&`).
|
|
300
|
+
6. H2 "Video tours" — bulleted list of every video URL on the page (YouTube, Vimeo, Giraffe360, Matterport, etc.).
|
|
301
|
+
7. H2 "EPC and council tax" — both values exactly as shown.
|
|
302
|
+
8. H2 "Folder layout" — one-line description of what's in each subfolder, with the actual counts.
|
|
303
|
+
|
|
304
|
+
Capture rules:
|
|
305
|
+
|
|
306
|
+
- **Verbatim** for the description body. The agent's wording is the source of truth for the brochure copy.
|
|
307
|
+
- If the listing has no description text (rare), record `_No description provided on the listing._` and continue. Do not invent.
|
|
308
|
+
- If the listing's marketing footer ("WOULD YOU LIKE TO VIEW", "CAN WE HELP YOU TOO") is intermingled with the property description, **keep the property paragraphs and drop the agency boilerplate** — the brochure has its own back-page CTA.
|
|
309
|
+
|
|
310
|
+
## Image preview safety
|
|
311
|
+
|
|
312
|
+
**Do not `Read` any downloaded image whose longest edge exceeds 2000px** — it breaks the session by overrunning the multimodal encoding budget. Most DSLR (`DSC*`) and drone (`DJI_*`) photos from a Muvin listing are 6000–8000px and will trigger this. Measure with `sips -g pixelWidth -g pixelHeight <file>` before any `Read`, or skip the visual check entirely (filename, byte-size, and `sips` dimensions cover most "did the download work?" questions). See `make-brochure` for the full safety workflow including the `sips -Z 2000` downscale recipe.
|
|
313
|
+
|
|
314
|
+
## Process — high level
|
|
315
|
+
|
|
316
|
+
The skill orchestrates four capabilities, each a **what** not a **how**:
|
|
317
|
+
|
|
318
|
+
1. **Probe.** Fetch the URL once with `WebFetch` to get a summarised view (price, address, agent, image count). This is a cheap sanity check — if the summary disagrees with what you extract from raw HTML, the page is likely JS-rendered and you need a headless browser.
|
|
319
|
+
2. **Extract.** Pull the raw HTML and grep all `b-cdn.net/propertyimages/...` and `b-cdn.net/floorplans/...` URLs. Deduplicate. Also grep PDF URLs containing `epc`. Extract the `<div class="section__description">` block for the description text. (Map detection is provider-agnostic and happens in step 4 below — don't try to parse map markup at this static-HTML stage.)
|
|
320
|
+
3. **Stage.** Create the four-folder structure under `<output-dir>/<slug>-<listing-id>/`. Download images and floorplans in parallel (`xargs -n1 -P8 curl -O -L`) — there are routinely 40–60 images per listing and serial downloads are slow.
|
|
321
|
+
4. **Capture map** (conditional, provider-agnostic). Drive Playwright to the listing URL and apply the heuristic detector under **Map — extract or omit**: try iframe-by-provider, then class/id-by-keyword, then static-map images, then visual fallback. On the first hit, scroll into view, wait for tiles, screenshot the **element** (not the page), convert to `map.webp` at ~1500 px wide. If no heuristic finds a map, skip — **extract or omit**, no fallback synthesis.
|
|
322
|
+
5. **Assemble.** Write `property.json` and `description.md`. Run a final consistency pass: image count in JSON matches files on disk, EPC rating in JSON matches the description.md line, agent contact in JSON matches the description.md header. `media.map` is populated iff a map screenshot landed on disk; `address.geo` is populated iff coordinates were parseable from a recognised URL pattern (and may legitimately be `null` even when `media.map` is set — see the schema notes).
|
|
323
|
+
|
|
324
|
+
The skill does not prescribe which HTTP tool to use. `curl` is fine for the static HTML pages Muvin serves. If a future agent ships a JS-rendered listing page, switch to Chrome DevTools MCP or Playwright — the contract on the output is unchanged.
|
|
325
|
+
|
|
326
|
+
## Reference standard
|
|
327
|
+
|
|
328
|
+
Before producing output, read these files to anchor the format:
|
|
329
|
+
|
|
330
|
+
- `/Users/neo/estate-agents/muvin/properties/henham-road-debden-green-hamperden-end-cb11-3lz-949931/property.json` — the JSON schema in practice.
|
|
331
|
+
- `/Users/neo/estate-agents/muvin/properties/henham-road-debden-green-hamperden-end-cb11-3lz-949931/description.md` — the prose voice and structure.
|
|
332
|
+
|
|
333
|
+
A delivered package that diverges substantially in shape from the reference is wrong, even if the content is accurate.
|
|
334
|
+
|
|
335
|
+
## Common mistakes
|
|
336
|
+
|
|
337
|
+
| Mistake | Why it's wrong |
|
|
338
|
+
|---|---|
|
|
339
|
+
| Using only the `WebFetch` summary | The summary lists "49 images" but does not return individual URLs. You must grep the raw HTML for filenames. |
|
|
340
|
+
| Stripping AI-generated renders from `images/` | They are part of the listing's marketing set. The brochure skill chooses which to use; the extractor's job is fidelity. |
|
|
341
|
+
| Renaming files to a `<slug>-NN.jpg` scheme on extraction | That's `property-brochure`'s job at the brochure-assembly step. Keep originals so the brochure skill can match by prefix and timestamp. |
|
|
342
|
+
| Inventing values for unknown specifications | `null` means "not on the listing". A guess at tenure or EPC introduces silent error into downstream Material Information compliance. |
|
|
343
|
+
| Including the agency's marketing boilerplate ("WOULD YOU LIKE TO VIEW", "CAN WE HELP YOU TOO") in `description.md` | The brochure has its own back page. Including it would duplicate text the brand designer is already authoring. |
|
|
344
|
+
| Skipping `floorplans/` because the listing only has one | One floorplan still goes in `floorplans/`, not `images/`. The folder layout is a contract — `property-brochure` looks for floorplans in exactly one place. |
|
|
345
|
+
| Saving `/tmp/muvin_property.html` or other working files inside the output directory | The directory is the deliverable. Working files get cleaned up. |
|
|
346
|
+
| Hardcoding the tenant UUID | The UUID identifies the agency on Loop CRM. Different Muvin offices can have different tenant IDs. Extract it from the actual URLs on the page. |
|
|
347
|
+
| Treating "EPC: TBC" as a missing field | "TBC" is information — the agent is telling you the assessment hasn't been done. Record it verbatim. |
|
|
348
|
+
| Synthesizing a map when the listing has none | The rule is **extract or omit**. Postcode-centroid renders, OSM static maps, and AI-generated map artwork are all forbidden. If the heuristic detector returns nothing, write `media.map: null` and move on. |
|
|
349
|
+
| Hard-coding a single CMS's map markup (`section__property--map`, `<iframe src="google.com/maps">`) as the only detector | Each agent embeds maps differently — Loop CRM uses Google iframes, custom builds use Mapbox-GL canvases, others use static-map `<img>` tags. The detection order is heuristic and provider-agnostic by design. Hard-coding one breaks every other listing. |
|
|
350
|
+
| Trying to render a map provider's tiles ourselves with our own API key | The screenshot approach captures whatever the agency already pays for, with their attribution. Spinning up our own Mapbox/Google account introduces a billing relationship the user didn't ask for, and risks brand-mismatch with what the agency publishes. Screenshot the element; don't reach for an API. |
|
|
351
|
+
|
|
352
|
+
## Completion criteria
|
|
353
|
+
|
|
354
|
+
Report `DONE` only after:
|
|
355
|
+
|
|
356
|
+
- The directory `<slug>-<listing-id>/` exists with the three subfolders `images/`, `floorplans/`, `epc/` — and **no** pre-created `brochure/` (that's a legacy layout artefact; `property-brochure` writes to `<property_dir>/output/` directly).
|
|
357
|
+
- `property.json` and `description.md` are at the directory root.
|
|
358
|
+
- `images/` count matches `media.image_count` in `property.json`.
|
|
359
|
+
- `floorplans/` count matches `media.floorplan_count` in `property.json`.
|
|
360
|
+
- `epc/` is either empty (with rating "TBC" or only-rating-shown) or contains a downloaded certificate referenced by `media.epc_document`.
|
|
361
|
+
- `images/map.webp` exists **only if** the listing supplied a Google Maps iframe and the screenshot succeeded — `media.map` and `address.geo` agree (both populated or both `null`); no synthesised fallbacks.
|
|
362
|
+
- No `/tmp` files, no `.html` dumps, no `urls.txt` left behind.
|
|
363
|
+
- The source URL appears in `property.json.source.url` and on the source line of `description.md`.
|
|
364
|
+
|
|
365
|
+
If any of those are not true, report `DONE_WITH_CONCERNS` and list each gap.
|
|
366
|
+
|
|
367
|
+
## When NOT to use this skill
|
|
368
|
+
|
|
369
|
+
- The user wants a brochure produced from photos they already have on disk → skip extraction, go straight to `property-brochure`.
|
|
370
|
+
- The listing is on Rightmove, Zoopla, OnTheMarket, or another non-Loop-CRM platform → the URL parsing and CDN paths differ. Either extend this skill with a new branch or route to a platform-specific extractor.
|
|
371
|
+
- The user wants a quick price/specs lookup, not the full asset bundle → use `WebFetch` directly. The folder structure is overkill.
|
|
372
|
+
- The user wants market data, comparables, or transaction history → that's a different research task; this skill is asset staging, not analysis.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "real-agency-buyers",
|
|
3
|
+
"description": "Full buyer lifecycle — enquiry handling, qualification, viewing management, feedback collection, and educational guides for buyers and sellers.",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Rubytech LLC"
|
|
7
|
+
}
|
|
8
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: real-agency-buyers
|
|
3
|
+
description: "Full buyer lifecycle — enquiry handling, qualification, viewing management, feedback collection, and educational guides for buyers and sellers."
|
|
4
|
+
tools: []
|
|
5
|
+
always: false
|
|
6
|
+
metadata: {"platform":{"optional":true,"embed":["public","admin"]}}
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Real Agency — Buyer Management
|
|
10
|
+
|
|
11
|
+
Five skills covering the complete buyer lifecycle from initial enquiry through viewing management and educational content.
|
|
12
|
+
|
|
13
|
+
## When to Activate
|
|
14
|
+
|
|
15
|
+
The user is handling buyer enquiries, qualifying applicants, managing viewings, collecting post-viewing feedback, or providing educational guides for buyers and sellers at different life stages.
|
|
16
|
+
|
|
17
|
+
## Skills
|
|
18
|
+
|
|
19
|
+
| Skill | Purpose |
|
|
20
|
+
|-------|---------|
|
|
21
|
+
| `buyer-management` | Full buyer lifecycle — enquiry, qualification, viewing, feedback, offer |
|
|
22
|
+
| `buyer-feedback` | Post-viewing feedback collection via conversational check-in |
|
|
23
|
+
| `property-enquiry` | Structured intake for new buyer enquiries — requirements, finances, timeline |
|
|
24
|
+
| `viewing-management` | Viewing lifecycle — booking, confirming, rescheduling, reminders |
|
|
25
|
+
| `buyer-seller-guides` | Educational guides for buyers and sellers — first-time, upsizing, downsizing, probate |
|
|
26
|
+
|
|
27
|
+
## Tools Used
|
|
28
|
+
|
|
29
|
+
No MCP server. Skills operate via existing platform tools:
|
|
30
|
+
- `memory-search` — retrieve domain knowledge from the knowledge base
|
|
31
|
+
- `render-component` — present structured choices during interactions
|
|
32
|
+
|
|
33
|
+
## References
|
|
34
|
+
|
|
35
|
+
Domain knowledge files loaded on demand by each skill. See individual skill files for their specific reference listings.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: buyer-feedback
|
|
3
|
+
description: "Collect structured post-viewing feedback from property buyers conversationally through the chat interface. Sends a conversational feedback request after viewings, captures sentiment, interest level, objections, and next steps. Stores feedback per-property and per-buyer for vendor reporting."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Buyer Feedback Collection
|
|
7
|
+
|
|
8
|
+
Collect post-viewing feedback from buyers in a natural, conversational way through the chat interface. This is NOT a form — it's a friendly check-in that captures structured data.
|
|
9
|
+
|
|
10
|
+
## When to Trigger
|
|
11
|
+
|
|
12
|
+
This skill applies when:
|
|
13
|
+
- The agent (or a scheduled event) initiates a post-viewing feedback request
|
|
14
|
+
- A buyer messages after a viewing with unsolicited feedback
|
|
15
|
+
- The business owner asks you to collect feedback on a specific viewing
|
|
16
|
+
|
|
17
|
+
## Feedback Flow
|
|
18
|
+
|
|
19
|
+
### Step 1: Opening
|
|
20
|
+
|
|
21
|
+
Send a warm, brief message referencing the specific property and viewing date. Keep it personal — use the buyer's first name and the property address.
|
|
22
|
+
|
|
23
|
+
Example:
|
|
24
|
+
> Hi [Name]! Hope you're well. Just wanted to check in after your viewing at [Address] on [Date]. How did you find it?
|
|
25
|
+
|
|
26
|
+
### Step 2: Capture Key Data Points
|
|
27
|
+
|
|
28
|
+
Through natural conversation (NOT a bullet list of questions), gather:
|
|
29
|
+
|
|
30
|
+
1. **Overall impression** — Did they like the property? First reaction.
|
|
31
|
+
2. **Interest level** — Are they considering making an offer? Scale: Hot / Warm / Cool / Not interested
|
|
32
|
+
3. **Positives** — What did they like most?
|
|
33
|
+
4. **Concerns/objections** — What put them off or gave them pause? (Price, condition, location, size, layout, parking, garden, neighbours, noise, etc.)
|
|
34
|
+
5. **Comparison** — How does it compare to others they've seen?
|
|
35
|
+
6. **Next steps** — Would they like a second viewing? Are they ready to make an offer? Need more information?
|
|
36
|
+
7. **Price perception** — Do they think it's fairly priced? (Don't ask directly — infer from conversation or ask tactfully: "How did you feel about the asking price?")
|
|
37
|
+
|
|
38
|
+
### Step 3: Follow-up Questions
|
|
39
|
+
|
|
40
|
+
Based on their responses, ask ONE follow-up at a time. Don't fire multiple questions. Match their energy — if they're brief, be brief. If they're chatty, engage.
|
|
41
|
+
|
|
42
|
+
If they express interest:
|
|
43
|
+
- "Would you like to book a second viewing?"
|
|
44
|
+
- "Is there anything else you'd like to know about the property?"
|
|
45
|
+
|
|
46
|
+
If they have concerns:
|
|
47
|
+
- Acknowledge the concern genuinely
|
|
48
|
+
- Offer context if you have it (e.g. "The vendor is open to offers" or "There's planning permission for an extension")
|
|
49
|
+
- Don't be pushy — respect their assessment
|
|
50
|
+
|
|
51
|
+
If not interested:
|
|
52
|
+
- Thank them warmly
|
|
53
|
+
- Ask what they ARE looking for (captures buyer criteria for future matching)
|
|
54
|
+
|
|
55
|
+
### Step 4: Store Feedback
|
|
56
|
+
|
|
57
|
+
After the conversation, save structured feedback to TWO locations:
|
|
58
|
+
|
|
59
|
+
**Property file** — `memory/shared/properties/[property-slug]/feedback/[date]-[buyer-name].md`
|
|
60
|
+
**Buyer profile** — `memory/users/[phone]/viewings/[date]-[property-slug].md`
|
|
61
|
+
|
|
62
|
+
Use this template:
|
|
63
|
+
|
|
64
|
+
```markdown
|
|
65
|
+
# Viewing Feedback
|
|
66
|
+
|
|
67
|
+
- **Property:** [Full address]
|
|
68
|
+
- **Date:** [Viewing date]
|
|
69
|
+
- **Buyer:** [Name] ([Phone])
|
|
70
|
+
- **Agent present:** [Name if known]
|
|
71
|
+
|
|
72
|
+
## Feedback
|
|
73
|
+
|
|
74
|
+
- **Overall impression:** [Their words / summary]
|
|
75
|
+
- **Interest level:** [Hot / Warm / Cool / Not interested]
|
|
76
|
+
- **Positives:** [What they liked]
|
|
77
|
+
- **Concerns:** [What they didn't like or worried about]
|
|
78
|
+
- **Price perception:** [Fair / Too high / Bargain / Not discussed]
|
|
79
|
+
- **Comparison:** [How it ranked vs other properties]
|
|
80
|
+
- **Next steps:** [Second viewing / Offer / Thinking / Declined]
|
|
81
|
+
|
|
82
|
+
## Quotes
|
|
83
|
+
> [Any notable direct quotes from the buyer]
|
|
84
|
+
|
|
85
|
+
## Notes
|
|
86
|
+
[Any additional context — body language cues mentioned, timing factors, chain status, etc.]
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Vendor Reporting
|
|
90
|
+
|
|
91
|
+
When the business owner or agent asks for a viewing feedback summary for a property:
|
|
92
|
+
|
|
93
|
+
1. Read all feedback files from `memory/shared/properties/[property-slug]/feedback/`
|
|
94
|
+
2. Compile a summary showing:
|
|
95
|
+
- Total viewings to date
|
|
96
|
+
- Interest breakdown (Hot/Warm/Cool/Not interested)
|
|
97
|
+
- Common positives (themes across multiple viewers)
|
|
98
|
+
- Common objections (recurring concerns)
|
|
99
|
+
- Price perception trend
|
|
100
|
+
- Actionable recommendations (e.g. "3 of 5 viewers mentioned the dated kitchen — consider adjusting marketing to acknowledge renovation potential")
|
|
101
|
+
|
|
102
|
+
## Rules
|
|
103
|
+
|
|
104
|
+
- **Never fabricate feedback.** Only report what buyers actually said.
|
|
105
|
+
- **Never share one buyer's feedback with another buyer.** Feedback goes to the vendor/agent only.
|
|
106
|
+
- **Be genuinely conversational.** Buyers who feel interrogated give shallow answers. Buyers who feel heard give honest ones.
|
|
107
|
+
- **Respect "no."** If a buyer doesn't want to give feedback, thank them and move on. Don't chase.
|
|
108
|
+
- **Timing matters.** Best results come 2-24 hours after the viewing. Same day is ideal. After 48 hours, response rates drop sharply.
|
|
109
|
+
- **One message at a time.** Never send a wall of questions. This is a conversation, not a survey.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: buyer-management
|
|
3
|
+
description: "Handle buyer enquiries — qualification, viewing booking, feedback collection, offer capture, and ongoing buyer relationship management."
|
|
4
|
+
publicEmbed: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Buyer Management
|
|
8
|
+
|
|
9
|
+
Guides the full buyer lifecycle — from initial enquiry through qualification, viewing management, feedback collection, and offer capture.
|
|
10
|
+
|
|
11
|
+
## When to Activate
|
|
12
|
+
|
|
13
|
+
Someone asks about a property, registers interest, requests a viewing, gives post-viewing feedback, wants to make an offer, or needs rescheduling/cancelling a viewing.
|
|
14
|
+
|
|
15
|
+
## Reference Table
|
|
16
|
+
|
|
17
|
+
| Task | When | Reference |
|
|
18
|
+
|------|------|-----------|
|
|
19
|
+
| Quick qualification (5 questions) | Early in conversation to gauge seriousness fast | `references/buyer-qualification-questions.md` |
|
|
20
|
+
| Qualification (full) | New buyer enquiry or property interest | `references/buyer-qualification.md` |
|
|
21
|
+
| Viewing booking | Qualified buyer ready for a viewing | `references/viewing-booking.md` |
|
|
22
|
+
| Feedback collection | After a viewing has taken place | `references/feedback-collection.md` |
|
|
23
|
+
| Offer capture | Buyer wants to make an offer | `references/offer-capture.md` |
|
|
24
|
+
| Buyer scripts & dialogue | Qualifying, encouraging offers, overcoming hesitation | `references/buyer-scripts.md` |
|
|
25
|
+
| Working with buyers (Serhant) | Shoppers vs buyers, elimination process, getting off the fence | `references/buyer-working-scripts.md` |
|
|
26
|
+
| Viewing management | Rescheduling, cancellations, reminders, schedule summaries | `references/viewing-management.md` |
|
|
27
|
+
|
|
28
|
+
## Key Rules
|
|
29
|
+
|
|
30
|
+
- Always qualify before booking a viewing — understand their position first
|
|
31
|
+
- One question at a time — don't overwhelm with a qualification form
|
|
32
|
+
- Never disclose vendor circumstances, other offers, or pricing flexibility
|
|
33
|
+
- Never negotiate — gather information and pass to the agent
|
|
34
|
+
- Update the buyer's profile in memory after every interaction
|
|
35
|
+
- Frame everything around helping them, not extracting information
|
|
36
|
+
- Distinguish shoppers from buyers — qualify early, invest time wisely
|
|
37
|
+
- "Buying a home is a process of elimination, not selection" — guide them through narrowing down
|
|
38
|
+
- Post-viewing follow-up within 2 hours — never leave a viewing without a next step
|
|
39
|
+
- An offer is "just a conversation starter" — help hesitant buyers understand nothing is final until exchange
|
|
40
|
+
- Never double-book a property or team member at the same time
|
|
41
|
+
- Access instructions (lockbox codes, keys) are confidential — only share with the conducting agent
|
|
42
|
+
- Two no-shows = flag to agent before booking further viewings
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Buyer qualification — 5 non‑negotiable questions (Tom Panos)
|
|
2
|
+
|
|
3
|
+
Use these to quickly learn whether a buyer is serious and where their friction is.
|
|
4
|
+
|
|
5
|
+
1) **How long have you been looking?**
|
|
6
|
+
2) **Have you made any offers on anything?**
|
|
7
|
+
3) **What is the best home you've seen so far?**
|
|
8
|
+
4) **Why didn't you buy that one?**
|
|
9
|
+
5) **If I had a home that was suitable, will you be looking at making an offer?**
|
|
10
|
+
|
|
11
|
+
## Notes for Max
|
|
12
|
+
- Ask in a friendly, curious tone.
|
|
13
|
+
- Capture the answers verbatim.
|
|
14
|
+
- If #5 is not a clear "yes", they're browsing. Keep warm, don't over-invest.
|
|
15
|
+
|
|
16
|
+
Source: *Tom Panos — Dialogue to Get More Listings* (Estate Agency Mastermind summary)
|