@rubytech/create-maxy-code 0.1.63 → 0.1.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/payload/platform/plugins/docs/references/admin-session.md +2 -1
- package/payload/platform/plugins/docs/references/platform.md +4 -0
- package/payload/platform/services/claude-session-manager/dist/index.js +4 -0
- package/payload/platform/services/claude-session-manager/dist/index.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts +12 -0
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js +67 -19
- package/payload/platform/services/claude-session-manager/dist/pty-spawner.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/tool-surface.d.ts.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/tool-surface.js +19 -4
- package/payload/platform/services/claude-session-manager/dist/tool-surface.js.map +1 -1
- package/payload/platform/services/claude-session-manager/dist/types.d.ts +5 -0
- package/payload/platform/services/claude-session-manager/dist/types.d.ts.map +1 -1
- package/payload/platform/templates/agents/admin/IDENTITY.md +1 -1
- package/payload/premium-plugins/real-agent/BUNDLE.md +2 -4
- package/payload/premium-plugins/real-agent/agents/valuer.md +1 -2
- package/payload/premium-plugins/real-agent/plugins/epc/.claude-plugin/plugin.json +3 -3
- package/payload/premium-plugins/real-agent/plugins/listings/.claude-plugin/plugin.json +1 -1
- package/payload/premium-plugins/real-agent/plugins/listings/PLUGIN.md +1 -3
- package/payload/premium-plugins/real-agent/plugins/listings/skills/new-instruction/SKILL.md +11 -12
- package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/SKILL.md +55 -33
- package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/references/render.py +69 -70
- package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/references/template-inputs.schema.json +12 -7
- package/payload/premium-plugins/real-agent/plugins/preval/skills/property-preval/references/template.html +88 -19
- package/payload/premium-plugins/real-agent/specs/03-new-instruction.md +8 -12
- package/payload/server/{chunk-2IKQERHN.js → chunk-S6PQA6Q4.js} +43 -34
- package/payload/server/maxy-edge.js +1 -1
- package/payload/server/server.js +1 -1
- package/payload/platform/plugins/brochures/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/brochures/PLUGIN.md +0 -38
- package/payload/platform/plugins/brochures/commands/make-brochure.md +0 -11
- package/payload/platform/plugins/brochures/skills/a4-print-documents/SKILL.md +0 -478
- package/payload/platform/plugins/brochures/skills/brand-design/SKILL.md +0 -192
- package/payload/platform/plugins/brochures/skills/make-brochure/SKILL.md +0 -354
- package/payload/platform/plugins/brochures/skills/make-brochure/references/seller-brief-template.md +0 -115
- package/payload/platform/plugins/brochures/skills/property-brochure/SKILL.md +0 -142
- package/payload/platform/plugins/brochures/skills/property-brochure/references/build.md +0 -270
- package/payload/platform/plugins/brochures/skills/property-brochure/references/copy.md +0 -211
- package/payload/platform/plugins/brochures/skills/property-brochure/references/images.md +0 -166
- package/payload/platform/plugins/brochures/skills/property-brochure/references/index-landing.md +0 -376
- package/payload/platform/plugins/brochures/skills/property-brochure/references/index.html +0 -1288
- package/payload/platform/plugins/brochures/skills/property-brochure/references/placeholders.md +0 -250
- package/payload/platform/plugins/brochures/skills/property-brochure/references/registers.md +0 -47
- package/payload/platform/plugins/brochures/skills/property-brochure/references/seller-brief.md +0 -56
- package/payload/platform/plugins/brochures/skills/property-brochure/references/structure.md +0 -249
- package/payload/platform/plugins/brochures/skills/property-brochure/references/template.html +0 -2370
- package/payload/platform/plugins/brochures/skills/property-extract/SKILL.md +0 -372
- package/payload/platform/plugins/brochures/skills/property-market-report/SKILL.md +0 -100
- package/payload/platform/plugins/brochures/skills/property-market-report/references/render.py +0 -267
- package/payload/platform/plugins/brochures/skills/property-market-report/references/template.html +0 -266
- package/payload/platform/plugins/brochures/skills/property-socials/SKILL.md +0 -141
- package/payload/platform/plugins/buyers/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/buyers/PLUGIN.md +0 -34
- package/payload/platform/plugins/buyers/skills/buyer-feedback/SKILL.md +0 -109
- package/payload/platform/plugins/buyers/skills/buyer-management/SKILL.md +0 -42
- package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-qualification-questions.md +0 -16
- package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-qualification.md +0 -59
- package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-scripts.md +0 -63
- package/payload/platform/plugins/buyers/skills/buyer-management/references/buyer-working-scripts.md +0 -54
- package/payload/platform/plugins/buyers/skills/buyer-management/references/feedback-collection.md +0 -42
- package/payload/platform/plugins/buyers/skills/buyer-management/references/offer-capture.md +0 -38
- package/payload/platform/plugins/buyers/skills/buyer-management/references/viewing-booking.md +0 -32
- package/payload/platform/plugins/buyers/skills/buyer-management/references/viewing-management.md +0 -52
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/SKILL.md +0 -407
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/care-fees-guide.md +0 -68
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/divorce-sales-guide.md +0 -61
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/downsizing-guide.md +0 -45
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/first-time-buyers.md +0 -92
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/first-time-sellers.md +0 -78
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/probate-guide.md +0 -53
- package/payload/platform/plugins/buyers/skills/buyer-seller-guides/references/upsizing-guide.md +0 -41
- package/payload/platform/plugins/buyers/skills/property-enquiry/SKILL.md +0 -126
- package/payload/platform/plugins/buyers/skills/viewing-management/SKILL.md +0 -111
- package/payload/platform/plugins/epc/.claude-plugin/plugin.json +0 -17
- package/payload/platform/plugins/epc/PLUGIN.md +0 -90
- package/payload/platform/plugins/epc/mcp/dist/index.d.ts +0 -2
- package/payload/platform/plugins/epc/mcp/dist/index.d.ts.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/index.js +0 -117
- package/payload/platform/plugins/epc/mcp/dist/index.js.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/lib/crypto.d.ts +0 -3
- package/payload/platform/plugins/epc/mcp/dist/lib/crypto.d.ts.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/lib/crypto.js +0 -72
- package/payload/platform/plugins/epc/mcp/dist/lib/crypto.js.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/lib/epc-api.d.ts +0 -60
- package/payload/platform/plugins/epc/mcp/dist/lib/epc-api.d.ts.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/lib/epc-api.js +0 -181
- package/payload/platform/plugins/epc/mcp/dist/lib/epc-api.js.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/lib/file-crypto.d.ts +0 -3
- package/payload/platform/plugins/epc/mcp/dist/lib/file-crypto.d.ts.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/lib/file-crypto.js +0 -49
- package/payload/platform/plugins/epc/mcp/dist/lib/file-crypto.js.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/lib/key-store.d.ts +0 -15
- package/payload/platform/plugins/epc/mcp/dist/lib/key-store.d.ts.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/lib/key-store.js +0 -130
- package/payload/platform/plugins/epc/mcp/dist/lib/key-store.js.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/lib/neo4j.d.ts +0 -5
- package/payload/platform/plugins/epc/mcp/dist/lib/neo4j.d.ts.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/lib/neo4j.js +0 -38
- package/payload/platform/plugins/epc/mcp/dist/lib/neo4j.js.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/tools/key-deregister.d.ts +0 -4
- package/payload/platform/plugins/epc/mcp/dist/tools/key-deregister.d.ts.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/tools/key-deregister.js +0 -9
- package/payload/platform/plugins/epc/mcp/dist/tools/key-deregister.js.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/tools/key-list.d.ts +0 -4
- package/payload/platform/plugins/epc/mcp/dist/tools/key-list.d.ts.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/tools/key-list.js +0 -10
- package/payload/platform/plugins/epc/mcp/dist/tools/key-list.js.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/tools/key-register.d.ts +0 -5
- package/payload/platform/plugins/epc/mcp/dist/tools/key-register.d.ts.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/tools/key-register.js +0 -36
- package/payload/platform/plugins/epc/mcp/dist/tools/key-register.js.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/tools/lookup.d.ts +0 -10
- package/payload/platform/plugins/epc/mcp/dist/tools/lookup.d.ts.map +0 -1
- package/payload/platform/plugins/epc/mcp/dist/tools/lookup.js +0 -30
- package/payload/platform/plugins/epc/mcp/dist/tools/lookup.js.map +0 -1
- package/payload/platform/plugins/epc/mcp/package-lock.json +0 -2566
- package/payload/platform/plugins/epc/mcp/package.json +0 -21
- package/payload/platform/plugins/epc/mcp/src/__tests__/epc-api.test.ts +0 -251
- package/payload/platform/plugins/epc/mcp/src/__tests__/key-roundtrip.test.ts +0 -113
- package/payload/platform/plugins/epc/mcp/src/__tests__/lookup.test.ts +0 -181
- package/payload/platform/plugins/epc/mcp/src/__tests__/schema-parity.test.ts +0 -54
- package/payload/platform/plugins/epc/mcp/src/index.ts +0 -156
- package/payload/platform/plugins/epc/mcp/src/lib/crypto.ts +0 -79
- package/payload/platform/plugins/epc/mcp/src/lib/epc-api.ts +0 -241
- package/payload/platform/plugins/epc/mcp/src/lib/file-crypto.ts +0 -55
- package/payload/platform/plugins/epc/mcp/src/lib/key-store.ts +0 -172
- package/payload/platform/plugins/epc/mcp/src/lib/neo4j.ts +0 -47
- package/payload/platform/plugins/epc/mcp/src/tools/key-deregister.ts +0 -9
- package/payload/platform/plugins/epc/mcp/src/tools/key-list.ts +0 -10
- package/payload/platform/plugins/epc/mcp/src/tools/key-register.ts +0 -44
- package/payload/platform/plugins/epc/mcp/src/tools/lookup.ts +0 -43
- package/payload/platform/plugins/epc/mcp/tsconfig.json +0 -20
- package/payload/platform/plugins/epc/mcp/vitest.config.ts +0 -8
- package/payload/platform/plugins/estate-business/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/estate-business/PLUGIN.md +0 -64
- package/payload/platform/plugins/estate-business/skills/business-growth/SKILL.md +0 -133
- package/payload/platform/plugins/estate-business/skills/business-growth/references/buy-back-your-time.md +0 -37
- package/payload/platform/plugins/estate-business/skills/business-growth/references/firewave-gost-scorecards.md +0 -14
- package/payload/platform/plugins/estate-business/skills/business-growth/references/keller-org-model.md +0 -17
- package/payload/platform/plugins/estate-business/skills/business-growth/references/lencioni-team-models.md +0 -22
- package/payload/platform/plugins/estate-business/skills/business-growth/references/listing-management-system.md +0 -11
- package/payload/platform/plugins/estate-business/skills/business-growth/references/net-figure-form.md +0 -11
- package/payload/platform/plugins/estate-business/skills/business-growth/references/serhant-bizinbox-notes.md +0 -13
- package/payload/platform/plugins/estate-business/skills/business-growth/references/team-roles-commission.md +0 -14
- package/payload/platform/plugins/estate-business/skills/business-growth/references/va-2026-ops.md +0 -43
- package/payload/platform/plugins/estate-business/skills/business-growth/references/wingman-structure.md +0 -13
- package/payload/platform/plugins/estate-business/skills/business-operations/SKILL.md +0 -32
- package/payload/platform/plugins/estate-business/skills/business-operations/references/crm-systems.md +0 -57
- package/payload/platform/plugins/estate-business/skills/business-operations/references/hiring-guide.md +0 -59
- package/payload/platform/plugins/estate-business/skills/business-operations/references/impact-framework.md +0 -47
- package/payload/platform/plugins/estate-business/skills/business-operations/references/minutes-equal-money.md +0 -55
- package/payload/platform/plugins/estate-business/skills/business-operations/references/team-management.md +0 -48
- package/payload/platform/plugins/estate-business/skills/commission-calculator/SKILL.md +0 -40
- package/payload/platform/plugins/estate-business/skills/exp-partnership/SKILL.md +0 -52
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/12-reasons.md +0 -39
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/95-5-system.md +0 -66
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/agent-attraction-scripts.md +0 -90
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/business-partnership.md +0 -92
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/exp-model-overview.md +0 -66
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/model-comparison.md +0 -66
- package/payload/platform/plugins/estate-business/skills/exp-partnership/references/revenue-share-explained.md +0 -57
- package/payload/platform/plugins/estate-business/skills/month-end-close/SKILL.md +0 -69
- package/payload/platform/plugins/estate-business/skills/payment-batch-stager/SKILL.md +0 -42
- package/payload/platform/plugins/estate-business/skills/period-reconciler/SKILL.md +0 -42
- package/payload/platform/plugins/estate-business/skills/personal-branding/SKILL.md +0 -117
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/attraction-agent-notes.md +0 -31
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/attraction-agent.md +0 -58
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/authenticity-boundaries.md +0 -28
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/become-a-brand-leader-notes.md +0 -19
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/blast-formula.md +0 -42
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/brand-leader.md +0 -48
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/brand-strategy-system.md +0 -59
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/content-engine.md +0 -49
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/firewave-blast-and-blogging.md +0 -23
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/gary-v-content.md +0 -52
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/gary-v-principles.md +0 -20
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/oversubscribed-positioning.md +0 -18
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/platforms.md +0 -41
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/priestley-oversubscribed.md +0 -54
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/storeys-style-examples.md +0 -25
- package/payload/platform/plugins/estate-business/skills/personal-branding/references/visual-identity.md +0 -27
- package/payload/platform/plugins/estate-coaching/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/estate-coaching/PLUGIN.md +0 -54
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/SKILL.md +0 -371
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/atomic-habits.md +0 -52
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/daily-routine-scorecard.md +0 -104
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/hp6-model.md +0 -63
- package/payload/platform/plugins/estate-coaching/skills/agent-performance/references/twelve-week-year.md +0 -71
- package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/SKILL.md +0 -36
- package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/coaching-boundaries.md +0 -56
- package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/feedback-framework.md +0 -61
- package/payload/platform/plugins/estate-coaching/skills/bespoke-coaching/references/performance-framework.md +0 -109
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/SKILL.md +0 -421
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/coaching-exercises.md +0 -86
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/goal-setting.md +0 -78
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/one-to-one-framework.md +0 -92
- package/payload/platform/plugins/estate-coaching/skills/coaching-toolkit/references/soi-workbook.md +0 -103
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/SKILL.md +0 -410
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/agent-training-guide.md +0 -70
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/business-in-a-box.md +0 -72
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/buyers-guide.md +0 -53
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/codo-method.md +0 -72
- package/payload/platform/plugins/estate-coaching/skills/serhant-training/references/website-planning-guide.md +0 -79
- package/payload/platform/plugins/estate-sales/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/estate-sales/PLUGIN.md +0 -52
- package/payload/platform/plugins/estate-sales/skills/chase-progression/SKILL.md +0 -107
- package/payload/platform/plugins/estate-sales/skills/negotiation/SKILL.md +0 -35
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/deal-saving.md +0 -47
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-deep-guide.md +0 -64
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-prep-principles.md +0 -29
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/negotiation-techniques.md +0 -42
- package/payload/platform/plugins/estate-sales/skills/negotiation/references/offer-presentation.md +0 -43
- package/payload/platform/plugins/estate-sales/skills/risk-scorer/SKILL.md +0 -42
- package/payload/platform/plugins/estate-sales/skills/sales-closer/SKILL.md +0 -24
- package/payload/platform/plugins/estate-sales/skills/sales-closer/references/serhant-emotion-stages.md +0 -36
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/SKILL.md +0 -30
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/chris-voss-discovery.md +0 -88
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/firewave-gost-journey.md +0 -68
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/phil-jones-openers.md +0 -78
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/pre-listing-checklist.md +0 -77
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/serhant-improv.md +0 -22
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/tom-ferry-discovery.md +0 -103
- package/payload/platform/plugins/estate-sales/skills/sales-discovery/references/vendor-motivation-competitor.md +0 -52
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/SKILL.md +0 -29
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/chris-voss-negotiation.md +0 -70
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/phil-jones-price-words.md +0 -40
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/serhant-negotiation-plus.md +0 -55
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/tom-panos-commission-pricing.md +0 -57
- package/payload/platform/plugins/estate-sales/skills/sales-negotiation/references/tony-morris-questioning.md +0 -54
- package/payload/platform/plugins/estate-sales/skills/sales-progression/SKILL.md +0 -27
- package/payload/platform/plugins/estate-sales/skills/sales-progression/references/conveyancing-guide.md +0 -54
- package/payload/platform/plugins/estate-sales/skills/sales-progression/references/transaction-tracking.md +0 -66
- package/payload/platform/plugins/estate-teaching/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/estate-teaching/PLUGIN.md +0 -30
- package/payload/platform/plugins/estate-teaching/skills/content-directory/SKILL.md +0 -39
- package/payload/platform/plugins/estate-teaching/skills/content-directory/references/module-delivery.md +0 -65
- package/payload/platform/plugins/estate-teaching/skills/content-directory/references/progress-tracking.md +0 -47
- package/payload/platform/plugins/leads/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/leads/PLUGIN.md +0 -61
- package/payload/platform/plugins/leads/skills/chain-progression-tracker/SKILL.md +0 -51
- package/payload/platform/plugins/leads/skills/diary-builder/SKILL.md +0 -38
- package/payload/platform/plugins/leads/skills/enquiry-triage/SKILL.md +0 -36
- package/payload/platform/plugins/leads/skills/lead-nurturing/SKILL.md +0 -137
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/buyer-search-letter.md +0 -28
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/buyer-search-letters.md +0 -37
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/database-reactivation.md +0 -30
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/email-nurture-sequences.md +0 -45
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/facebook-referrals.md +0 -30
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/firewave-email-nurture-sequences.md +0 -41
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/keller-33-touch.md +0 -34
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/neighbour-letters.md +0 -31
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/neighbour-notification-letter.md +0 -20
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/ofi-follow-up-dialogue.md +0 -22
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/ofi-follow-up.md +0 -26
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/serhant-three-fs-plus.md +0 -21
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/sharran-10x10x10.md +0 -18
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/sms-templates.md +0 -40
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/sphere-of-influence-notes.md +0 -34
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/sphere-of-influence.md +0 -60
- package/payload/platform/plugins/leads/skills/lead-nurturing/references/tom-panos-sms-templates.md +0 -59
- package/payload/platform/plugins/leads/skills/morning-round/SKILL.md +0 -72
- package/payload/platform/plugins/leads/skills/prospecting/SKILL.md +0 -33
- package/payload/platform/plugins/leads/skills/prospecting/references/database-matching.md +0 -30
- package/payload/platform/plugins/leads/skills/prospecting/references/database-value.md +0 -53
- package/payload/platform/plugins/leads/skills/prospecting/references/prospecting-dialogues.md +0 -24
- package/payload/platform/plugins/leads/skills/prospecting/references/reactivation.md +0 -34
- package/payload/platform/plugins/listings/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/listings/PLUGIN.md +0 -102
- package/payload/platform/plugins/listings/skills/comparable-finder/SKILL.md +0 -52
- package/payload/platform/plugins/listings/skills/epc-checker/SKILL.md +0 -38
- package/payload/platform/plugins/listings/skills/home-preparation/SKILL.md +0 -28
- package/payload/platform/plugins/listings/skills/home-preparation/references/kerb-appeal.md +0 -38
- package/payload/platform/plugins/listings/skills/home-preparation/references/photo-day.md +0 -59
- package/payload/platform/plugins/listings/skills/home-preparation/references/situational-tips.md +0 -50
- package/payload/platform/plugins/listings/skills/home-preparation/references/staging-guide.md +0 -52
- package/payload/platform/plugins/listings/skills/listing-copy-writer/SKILL.md +0 -55
- package/payload/platform/plugins/listings/skills/listing-presentation/SKILL.md +0 -286
- package/payload/platform/plugins/listings/skills/listing-presentation/references/booking-script.md +0 -51
- package/payload/platform/plugins/listings/skills/listing-presentation/references/objection-scripts.md +0 -193
- package/payload/platform/plugins/listings/skills/listing-presentation/references/penhaul-presentation.md +0 -123
- package/payload/platform/plugins/listings/skills/listing-presentation/references/pre-listing-kit.md +0 -139
- package/payload/platform/plugins/listings/skills/listing-presentation/references/set-to-sell.md +0 -55
- package/payload/platform/plugins/listings/skills/listing-presentation/references/sharran-frameworks.md +0 -107
- package/payload/platform/plugins/listings/skills/local-market-stats/SKILL.md +0 -33
- package/payload/platform/plugins/listings/skills/new-instruction/SKILL.md +0 -78
- package/payload/platform/plugins/listings/skills/particulars-builder/SKILL.md +0 -48
- package/payload/platform/plugins/listings/skills/portal-launch-scheduler/SKILL.md +0 -49
- package/payload/platform/plugins/listings/skills/pricing-scenario-builder/SKILL.md +0 -35
- package/payload/platform/plugins/listings/skills/property-marketing/SKILL.md +0 -337
- package/payload/platform/plugins/listings/skills/property-marketing/references/auction-report-template.md +0 -41
- package/payload/platform/plugins/listings/skills/property-marketing/references/coming-soon-campaign.md +0 -43
- package/payload/platform/plugins/listings/skills/property-marketing/references/direct-mail-templates.md +0 -121
- package/payload/platform/plugins/listings/skills/property-marketing/references/eoi-form-template.md +0 -62
- package/payload/platform/plugins/listings/skills/property-marketing/references/monthly-scorecard.md +0 -63
- package/payload/platform/plugins/listings/skills/supplier-booker/SKILL.md +0 -39
- package/payload/platform/plugins/listings/skills/talk-track-composer/SKILL.md +0 -36
- package/payload/platform/plugins/listings/skills/terms-of-business-drafter/SKILL.md +0 -54
- package/payload/platform/plugins/listings/skills/valuation-prep/SKILL.md +0 -69
- package/payload/platform/plugins/loop/.claude-plugin/plugin.json +0 -17
- package/payload/platform/plugins/loop/PLUGIN.md +0 -260
- package/payload/platform/plugins/loop/mcp/dist/index.d.ts +0 -2
- package/payload/platform/plugins/loop/mcp/dist/index.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/index.js +0 -320
- package/payload/platform/plugins/loop/mcp/dist/index.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/crypto.d.ts +0 -10
- package/payload/platform/plugins/loop/mcp/dist/lib/crypto.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/crypto.js +0 -88
- package/payload/platform/plugins/loop/mcp/dist/lib/crypto.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/file-crypto.d.ts +0 -3
- package/payload/platform/plugins/loop/mcp/dist/lib/file-crypto.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/file-crypto.js +0 -48
- package/payload/platform/plugins/loop/mcp/dist/lib/file-crypto.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/key-store.d.ts +0 -22
- package/payload/platform/plugins/loop/mcp/dist/lib/key-store.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/key-store.js +0 -165
- package/payload/platform/plugins/loop/mcp/dist/lib/key-store.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.d.ts +0 -82
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.js +0 -392
- package/payload/platform/plugins/loop/mcp/dist/lib/loop-api.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.d.ts +0 -5
- package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.js +0 -40
- package/payload/platform/plugins/loop/mcp/dist/lib/neo4j.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/auto-responder.d.ts +0 -12
- package/payload/platform/plugins/loop/mcp/dist/tools/auto-responder.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/auto-responder.js +0 -22
- package/payload/platform/plugins/loop/mcp/dist/tools/auto-responder.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.d.ts +0 -10
- package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.js +0 -24
- package/payload/platform/plugins/loop/mcp/dist/tools/customer-preferences.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/feedback.d.ts +0 -16
- package/payload/platform/plugins/loop/mcp/dist/tools/feedback.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/feedback.js +0 -35
- package/payload/platform/plugins/loop/mcp/dist/tools/feedback.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.d.ts +0 -5
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.js +0 -9
- package/payload/platform/plugins/loop/mcp/dist/tools/key-deregister.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/key-list.d.ts +0 -4
- package/payload/platform/plugins/loop/mcp/dist/tools/key-list.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/key-list.js +0 -14
- package/payload/platform/plugins/loop/mcp/dist/tools/key-list.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.d.ts +0 -9
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.js +0 -43
- package/payload/platform/plugins/loop/mcp/dist/tools/key-register.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts +0 -6
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.js +0 -7
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-enquiry.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts +0 -9
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.js +0 -16
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-batch.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts +0 -15
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.js +0 -11
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match-request.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.d.ts +0 -10
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.js +0 -39
- package/payload/platform/plugins/loop/mcp/dist/tools/marketing-match.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.d.ts +0 -9
- package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.js +0 -125
- package/payload/platform/plugins/loop/mcp/dist/tools/people-detail.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/people-search.d.ts +0 -18
- package/payload/platform/plugins/loop/mcp/dist/tools/people-search.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/people-search.js +0 -87
- package/payload/platform/plugins/loop/mcp/dist/tools/people-search.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.d.ts +0 -10
- package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.js +0 -82
- package/payload/platform/plugins/loop/mcp/dist/tools/property-detail.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/property-intent.d.ts +0 -33
- package/payload/platform/plugins/loop/mcp/dist/tools/property-intent.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/property-intent.js +0 -19
- package/payload/platform/plugins/loop/mcp/dist/tools/property-intent.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.d.ts +0 -11
- package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.js +0 -26
- package/payload/platform/plugins/loop/mcp/dist/tools/property-listed.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/property-request.d.ts +0 -15
- package/payload/platform/plugins/loop/mcp/dist/tools/property-request.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/property-request.js +0 -11
- package/payload/platform/plugins/loop/mcp/dist/tools/property-request.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/property-search.d.ts +0 -16
- package/payload/platform/plugins/loop/mcp/dist/tools/property-search.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/property-search.js +0 -41
- package/payload/platform/plugins/loop/mcp/dist/tools/property-search.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/property-sold.d.ts +0 -9
- package/payload/platform/plugins/loop/mcp/dist/tools/property-sold.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/property-sold.js +0 -19
- package/payload/platform/plugins/loop/mcp/dist/tools/property-sold.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/supplier.d.ts +0 -13
- package/payload/platform/plugins/loop/mcp/dist/tools/supplier.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/supplier.js +0 -49
- package/payload/platform/plugins/loop/mcp/dist/tools/supplier.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.d.ts +0 -7
- package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.js +0 -19
- package/payload/platform/plugins/loop/mcp/dist/tools/team-availability.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/team-info.d.ts +0 -5
- package/payload/platform/plugins/loop/mcp/dist/tools/team-info.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/team-info.js +0 -32
- package/payload/platform/plugins/loop/mcp/dist/tools/team-info.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.d.ts +0 -14
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.js +0 -11
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-create.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.d.ts +0 -9
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.js +0 -85
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-detail.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.d.ts +0 -13
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.js +0 -44
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-search.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.d.ts +0 -14
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.d.ts.map +0 -1
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.js +0 -18
- package/payload/platform/plugins/loop/mcp/dist/tools/viewing-update.js.map +0 -1
- package/payload/platform/plugins/loop/mcp/package-lock.json +0 -2549
- package/payload/platform/plugins/loop/mcp/package.json +0 -21
- package/payload/platform/plugins/loop/mcp/src/__tests__/loop-swagger.snapshot.json +0 -26467
- package/payload/platform/plugins/loop/mcp/src/__tests__/new-tool-shape.test.ts +0 -99
- package/payload/platform/plugins/loop/mcp/src/__tests__/plugin-md-time-doctrine.test.ts +0 -132
- package/payload/platform/plugins/loop/mcp/src/__tests__/swagger-write-coverage.test.ts +0 -154
- package/payload/platform/plugins/loop/mcp/src/index.ts +0 -498
- package/payload/platform/plugins/loop/mcp/src/lib/crypto.ts +0 -105
- package/payload/platform/plugins/loop/mcp/src/lib/file-crypto.ts +0 -54
- package/payload/platform/plugins/loop/mcp/src/lib/key-store.ts +0 -221
- package/payload/platform/plugins/loop/mcp/src/lib/loop-api.ts +0 -567
- package/payload/platform/plugins/loop/mcp/src/lib/neo4j.ts +0 -51
- package/payload/platform/plugins/loop/mcp/src/tools/auto-responder.ts +0 -80
- package/payload/platform/plugins/loop/mcp/src/tools/customer-preferences.ts +0 -66
- package/payload/platform/plugins/loop/mcp/src/tools/feedback.ts +0 -86
- package/payload/platform/plugins/loop/mcp/src/tools/key-deregister.ts +0 -12
- package/payload/platform/plugins/loop/mcp/src/tools/key-list.ts +0 -19
- package/payload/platform/plugins/loop/mcp/src/tools/key-register.ts +0 -70
- package/payload/platform/plugins/loop/mcp/src/tools/marketing-enquiry.ts +0 -27
- package/payload/platform/plugins/loop/mcp/src/tools/marketing-match-batch.ts +0 -53
- package/payload/platform/plugins/loop/mcp/src/tools/marketing-match-request.ts +0 -42
- package/payload/platform/plugins/loop/mcp/src/tools/marketing-match.ts +0 -84
- package/payload/platform/plugins/loop/mcp/src/tools/people-detail.ts +0 -245
- package/payload/platform/plugins/loop/mcp/src/tools/people-search.ts +0 -180
- package/payload/platform/plugins/loop/mcp/src/tools/property-detail.ts +0 -145
- package/payload/platform/plugins/loop/mcp/src/tools/property-intent.ts +0 -84
- package/payload/platform/plugins/loop/mcp/src/tools/property-listed.ts +0 -81
- package/payload/platform/plugins/loop/mcp/src/tools/property-search.ts +0 -92
- package/payload/platform/plugins/loop/mcp/src/tools/property-sold.ts +0 -67
- package/payload/platform/plugins/loop/mcp/src/tools/supplier.ts +0 -129
- package/payload/platform/plugins/loop/mcp/src/tools/team-availability.ts +0 -52
- package/payload/platform/plugins/loop/mcp/src/tools/team-info.ts +0 -95
- package/payload/platform/plugins/loop/mcp/src/tools/viewing-create.ts +0 -41
- package/payload/platform/plugins/loop/mcp/src/tools/viewing-detail.ts +0 -171
- package/payload/platform/plugins/loop/mcp/src/tools/viewing-search.ts +0 -92
- package/payload/platform/plugins/loop/mcp/src/tools/viewing-update.ts +0 -53
- package/payload/platform/plugins/loop/mcp/tsconfig.json +0 -20
- package/payload/platform/plugins/loop/mcp/vitest.config.ts +0 -9
- package/payload/platform/plugins/loop/skills/compliance-flag-checker/SKILL.md +0 -53
- package/payload/platform/plugins/loop/skills/priority-ranker/SKILL.md +0 -40
- package/payload/platform/plugins/loop/skills/tone-matched-drafter/SKILL.md +0 -53
- package/payload/platform/plugins/loop/skills/variance-narrator/SKILL.md +0 -50
- package/payload/platform/plugins/loop/skills/vendor-research/SKILL.md +0 -54
- package/payload/platform/plugins/preval/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/preval/PLUGIN.md +0 -55
- package/payload/platform/plugins/preval/hooks/preval-prompt-required.sh +0 -140
- package/payload/platform/plugins/preval/skills/property-preval/SKILL.md +0 -176
- package/payload/platform/plugins/preval/skills/property-preval/references/__tests__/adherence.test.py +0 -373
- package/payload/platform/plugins/preval/skills/property-preval/references/render.py +0 -815
- package/payload/platform/plugins/preval/skills/property-preval/references/template-inputs.schema.json +0 -199
- package/payload/platform/plugins/preval/skills/property-preval/references/template.html +0 -312
- package/payload/platform/plugins/property-data/.claude-plugin/plugin.json +0 -17
- package/payload/platform/plugins/property-data/PLUGIN.md +0 -180
- package/payload/platform/plugins/property-data/mcp/dist/index.d.ts +0 -2
- package/payload/platform/plugins/property-data/mcp/dist/index.d.ts.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/index.js +0 -236
- package/payload/platform/plugins/property-data/mcp/dist/index.js.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/crypto.d.ts +0 -3
- package/payload/platform/plugins/property-data/mcp/dist/lib/crypto.d.ts.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/crypto.js +0 -72
- package/payload/platform/plugins/property-data/mcp/dist/lib/crypto.js.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/file-crypto.d.ts +0 -3
- package/payload/platform/plugins/property-data/mcp/dist/lib/file-crypto.d.ts.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/file-crypto.js +0 -49
- package/payload/platform/plugins/property-data/mcp/dist/lib/file-crypto.js.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/key-store.d.ts +0 -15
- package/payload/platform/plugins/property-data/mcp/dist/lib/key-store.d.ts.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/key-store.js +0 -135
- package/payload/platform/plugins/property-data/mcp/dist/lib/key-store.js.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/neo4j.d.ts +0 -5
- package/payload/platform/plugins/property-data/mcp/dist/lib/neo4j.d.ts.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/neo4j.js +0 -38
- package/payload/platform/plugins/property-data/mcp/dist/lib/neo4j.js.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.d.ts +0 -28
- package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.d.ts.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.js +0 -101
- package/payload/platform/plugins/property-data/mcp/dist/lib/propertydata-api.js.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.d.ts +0 -24
- package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.d.ts.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.js +0 -33
- package/payload/platform/plugins/property-data/mcp/dist/tools/endpoints.js.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.d.ts +0 -4
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.d.ts.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.js +0 -9
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-deregister.js.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-list.d.ts +0 -4
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-list.d.ts.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-list.js +0 -10
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-list.js.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.d.ts +0 -5
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.d.ts.map +0 -1
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.js +0 -50
- package/payload/platform/plugins/property-data/mcp/dist/tools/key-register.js.map +0 -1
- package/payload/platform/plugins/property-data/mcp/package-lock.json +0 -2566
- package/payload/platform/plugins/property-data/mcp/package.json +0 -21
- package/payload/platform/plugins/property-data/mcp/src/__tests__/endpoints.test.ts +0 -252
- package/payload/platform/plugins/property-data/mcp/src/__tests__/key-roundtrip.test.ts +0 -107
- package/payload/platform/plugins/property-data/mcp/src/__tests__/propertydata-api.test.ts +0 -184
- package/payload/platform/plugins/property-data/mcp/src/__tests__/schema-parity.test.ts +0 -62
- package/payload/platform/plugins/property-data/mcp/src/index.ts +0 -409
- package/payload/platform/plugins/property-data/mcp/src/lib/crypto.ts +0 -79
- package/payload/platform/plugins/property-data/mcp/src/lib/file-crypto.ts +0 -55
- package/payload/platform/plugins/property-data/mcp/src/lib/key-store.ts +0 -181
- package/payload/platform/plugins/property-data/mcp/src/lib/neo4j.ts +0 -47
- package/payload/platform/plugins/property-data/mcp/src/lib/propertydata-api.ts +0 -120
- package/payload/platform/plugins/property-data/mcp/src/tools/endpoints.ts +0 -47
- package/payload/platform/plugins/property-data/mcp/src/tools/key-deregister.ts +0 -9
- package/payload/platform/plugins/property-data/mcp/src/tools/key-list.ts +0 -10
- package/payload/platform/plugins/property-data/mcp/src/tools/key-register.ts +0 -54
- package/payload/platform/plugins/property-data/mcp/tsconfig.json +0 -20
- package/payload/platform/plugins/property-data/mcp/vitest.config.ts +0 -8
- package/payload/platform/plugins/property-data/skills/property-data/SKILL.md +0 -77
- package/payload/platform/plugins/vendors/.claude-plugin/plugin.json +0 -8
- package/payload/platform/plugins/vendors/PLUGIN.md +0 -33
- package/payload/platform/plugins/vendors/skills/vendor-communication/SKILL.md +0 -42
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/fee-protection-and-agenda.md +0 -28
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/listing-scripts.md +0 -44
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/negotiation-deep-guide.md +0 -70
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/price-alignment-scripts.md +0 -33
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/price-alignment.md +0 -34
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/scenario-scripts.md +0 -38
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/seller-engagement.md +0 -51
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/valuation-booking.md +0 -76
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/vendor-scripts.md +0 -63
- package/payload/platform/plugins/vendors/skills/vendor-communication/references/vendor-updates.md +0 -41
- package/payload/platform/plugins/vendors/skills/vendor-updates/SKILL.md +0 -153
- package/payload/premium-plugins/real-agent/plugins/epc/PLUGIN.md +0 -90
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/package-lock.json +0 -2566
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/package.json +0 -21
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/__tests__/epc-api.test.ts +0 -251
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/__tests__/key-roundtrip.test.ts +0 -113
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/__tests__/lookup.test.ts +0 -181
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/__tests__/schema-parity.test.ts +0 -54
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/index.ts +0 -156
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/crypto.ts +0 -79
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/epc-api.ts +0 -241
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/file-crypto.ts +0 -55
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/key-store.ts +0 -172
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/lib/neo4j.ts +0 -47
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/tools/key-deregister.ts +0 -9
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/tools/key-list.ts +0 -10
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/tools/key-register.ts +0 -44
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/src/tools/lookup.ts +0 -43
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/tsconfig.json +0 -20
- package/payload/premium-plugins/real-agent/plugins/epc/mcp/vitest.config.ts +0 -8
- package/payload/premium-plugins/real-agent/plugins/listings/skills/epc-checker/SKILL.md +0 -38
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "real-agent-listings",
|
|
3
|
-
"description": "Valuation prep and new-instruction onboarding for UK residential sales agents. Includes the valuation-prep master plus four building blocks (comparable-finder, local-market-stats, pricing-scenario-builder, talk-track-composer) and the new-instruction master plus its
|
|
3
|
+
"description": "Valuation prep and new-instruction onboarding for UK residential sales agents. Includes the valuation-prep master plus four building blocks (comparable-finder, local-market-stats, pricing-scenario-builder, talk-track-composer) and the new-instruction master plus its five building blocks (terms-of-business-drafter, supplier-booker, listing-copy-writer, particulars-builder, portal-launch-scheduler). Also retains the existing listing-presentation, property-marketing, and home-preparation skills.",
|
|
4
4
|
"version": "0.1.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Rubytech LLC"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: real-agent-listings
|
|
3
|
-
description: "Valuation prep and new-instruction onboarding for UK residential sales agents. Includes the valuation-prep master plus four building blocks (comparable-finder, local-market-stats, pricing-scenario-builder, talk-track-composer) and the new-instruction master plus its
|
|
3
|
+
description: "Valuation prep and new-instruction onboarding for UK residential sales agents. Includes the valuation-prep master plus four building blocks (comparable-finder, local-market-stats, pricing-scenario-builder, talk-track-composer) and the new-instruction master plus its five building blocks (terms-of-business-drafter, supplier-booker, listing-copy-writer, particulars-builder, portal-launch-scheduler). Also retains the existing listing-presentation, property-marketing, and home-preparation skills."
|
|
4
4
|
tools: []
|
|
5
5
|
skills:
|
|
6
6
|
- skills/valuation-prep/SKILL.md
|
|
@@ -10,7 +10,6 @@ skills:
|
|
|
10
10
|
- skills/talk-track-composer/SKILL.md
|
|
11
11
|
- skills/new-instruction/SKILL.md
|
|
12
12
|
- skills/terms-of-business-drafter/SKILL.md
|
|
13
|
-
- skills/epc-checker/SKILL.md
|
|
14
13
|
- skills/supplier-booker/SKILL.md
|
|
15
14
|
- skills/listing-copy-writer/SKILL.md
|
|
16
15
|
- skills/particulars-builder/SKILL.md
|
|
@@ -80,7 +79,6 @@ The user is preparing for a valuation or market appraisal, has just won an instr
|
|
|
80
79
|
| `talk-track-composer` | valuer | Drafts vendor questions, objections, USP |
|
|
81
80
|
| `new-instruction` | valuer then negotiator | Master workflow: terms to portal in 72 hours |
|
|
82
81
|
| `terms-of-business-drafter` | compliance | Populates the agency template and stages DocuSign |
|
|
83
|
-
| `epc-checker` | valuer | EPC register lookup and order staging |
|
|
84
82
|
| `supplier-booker` | negotiator | Photographer and floorplan bookings |
|
|
85
83
|
| `listing-copy-writer` | negotiator | Portal-optimised descriptions, material info |
|
|
86
84
|
| `particulars-builder` | negotiator (chains into Maxy `content-producer` for PDF render) | Property brochure |
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: new-instruction
|
|
3
|
-
description: "Run the post-win onboarding sequence after a valuation is won. Drafts terms of business,
|
|
3
|
+
description: "Run the post-win onboarding sequence after a valuation is won. Drafts terms of business, books photographer and floorplan supplier, drafts listing copy and PDF particulars, schedules portal launch, and drafts the vendor welcome. Each write action is individually gated. Triggers when the operator says 'set up <address>', 'I won <name>', 'I won the <address> val', 'instruction taken at <address>', 'get <address> on the market', 'kick off the <name> property'. Also offered proactively when the CRM marks a property as instructed."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# New instruction
|
|
7
7
|
|
|
8
|
-
The master workflow that takes a property from "instruction won" to "on the portal" inside 72 hours. Owned jointly by the valuer (until terms are signed
|
|
8
|
+
The master workflow that takes a property from "instruction won" to "on the portal" inside 72 hours. Owned jointly by the valuer (until terms are signed) and the negotiator (from photography onward).
|
|
9
9
|
|
|
10
10
|
Done well, this workflow is the second-highest-value moment in the agent's week after winning the instruction itself. The speed compounds: faster on-market means more viewings in the first weekend, which is when offers happen.
|
|
11
11
|
|
|
@@ -20,7 +20,7 @@ If any input is missing, the workflow asks once and then proceeds with the rest
|
|
|
20
20
|
|
|
21
21
|
## Architecture principles encoded here
|
|
22
22
|
|
|
23
|
-
- Read before write. The workflow opens by reading the property's CRM state
|
|
23
|
+
- Read before write. The workflow opens by reading the property's CRM state and the calendar. It writes nothing until the operator approves each individual stage.
|
|
24
24
|
- Stage, don't send. Every write action is staged, not fired. Eight gates in total, each individually approved.
|
|
25
25
|
- One screen of output. The sequenced checklist is one screen even when every item is staged. Each item collapses to a status line.
|
|
26
26
|
- Cite the source. Every populated field in the terms of business, the listing copy, and the particulars traces to a CRM record, a profile entry, or a connector read.
|
|
@@ -29,16 +29,15 @@ If any input is missing, the workflow asks once and then proceeds with the rest
|
|
|
29
29
|
|
|
30
30
|
## Sequence and approval gates
|
|
31
31
|
|
|
32
|
-
The workflow presents the
|
|
32
|
+
The workflow presents the seven steps in order. The operator can approve them one at a time, approve everything ("ship everything"), or pause and return later. State is preserved between sessions.
|
|
33
33
|
|
|
34
34
|
1. **Terms of business.** Drafted by `terms-of-business-drafter` from the agency template, populated with property, vendor, fee structure, sole or multi agency, marketing period, withdrawal fee. Staged in DocuSign with the vendor as recipient. *Gate: approve before send.*
|
|
35
|
-
2. **
|
|
36
|
-
3. **
|
|
37
|
-
4. **
|
|
38
|
-
5. **
|
|
39
|
-
6. **
|
|
40
|
-
7. **
|
|
41
|
-
8. **Vendor welcome email.** Drafted by `tone-matched-drafter` explaining what happens next, what to expect, when to expect photos, who will be in touch. *Gate: approve before send.*
|
|
35
|
+
2. **Photographer booking.** `supplier-booker` drafts a booking request to the agent's preferred photographer with the property address, vendor contact, and the agent's standard brief. *Gate: approve before send.*
|
|
36
|
+
3. **Floorplan booking.** Same as photography. Combined into a single booking request if the same supplier handles both. *Gate: approve before send.*
|
|
37
|
+
4. **Listing copy.** Drafted by `listing-copy-writer` in the agent's voice, length, and structure from the profile. Headline, key features bullets, full description, location paragraph. Optimised for the profile's portals. *Gate: approve before any portal upload.*
|
|
38
|
+
5. **Particulars.** PDF brochure built by `particulars-builder`. The skill chains into the Maxy `content-producer` for the PDF render so the agency brand is applied consistently. Staged for the agent's review and the vendor's review before any wider distribution. *Gate: approve distribution before send.*
|
|
39
|
+
6. **Portal launch schedule.** `portal-launch-scheduler` proposes the launch sequence (Rightmove premium on a Friday by default; learns). Staged, not fired. *Gate: approve schedule before any portal upload happens.*
|
|
40
|
+
7. **Vendor welcome email.** Drafted by `tone-matched-drafter` explaining what happens next, what to expect, when to expect photos, who will be in touch. *Gate: approve before send.*
|
|
42
41
|
|
|
43
42
|
## AML and material information
|
|
44
43
|
|
|
@@ -58,7 +57,7 @@ All writes go through `profile-writer`.
|
|
|
58
57
|
|
|
59
58
|
## Connectors
|
|
60
59
|
|
|
61
|
-
Read: CRM,
|
|
60
|
+
Read: CRM, calendar, profile.
|
|
62
61
|
Write: DocuSign (terms), email (vendor welcome, supplier bookings), portal upload APIs (Rightmove, Zoopla, OnTheMarket, staged only).
|
|
63
62
|
|
|
64
63
|
## Profile keys
|
|
@@ -1,21 +1,38 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: property-preval
|
|
3
|
-
description: Use when an operator wants a pre-valuation pack to pitch for a UK property listing — a
|
|
3
|
+
description: Use when an operator wants a pre-valuation pack to pitch for a UK property listing — a 7-page A4 PDF that combines subject facts, postcode market context, market depth, vendor-side "what gets the best price" prep tips, full-width sold + asking comparables, and the agent's recent successes as the sales close. Available in two style variants (premium = editorial Cormorant/Lora/Inter lock; on-brand = follows the agent's DESIGN.md fonts end-to-end). Triggers include "preval <address>", "pre-valuation for <address>", "valuation pitch for <address>", "what's <address> worth and pitch us to list it", "pre-appraisal pack for <address>".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Property Preval
|
|
7
7
|
|
|
8
|
-
A
|
|
8
|
+
A 7-page A4 PDF that pitches the agent for the listing: cover (full-bleed subject hero + agent byline), subject facts, market context, market depth, vendor-side prep tips ("What gets the best price"), full-width comparables, and the agent's recent successes + disclaimer. **Preval is the data-and-comparables half of the pitch — the human agent values the property in person.** The pack never quotes a numeric estimate or range; that's the agent's job, supported by the comparables on page 6.
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## Style variants — premium (default) or on-brand
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
The pack renders in one of two variants, selected via the top-level `variant` field on `inputs.json`. The two variants share the same content and layout — only typography differs.
|
|
13
|
+
|
|
14
|
+
### `variant: "premium"` (default — editorial folio)
|
|
15
|
+
|
|
16
|
+
Typography lock — never substituted:
|
|
13
17
|
|
|
14
18
|
- **Display** — Cormorant Garamond (italic for headlines, KPI values, prices, addresses)
|
|
15
19
|
- **Body** — Lora
|
|
16
20
|
- **Sans / labels** — Inter (eyebrows, KPI labels, chips, footer meta)
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
The pack reads as an editorial / luxury document across every brand. The agent's identity comes through the **palette and logo only**. The agent's `DESIGN.md` font tokens are ignored.
|
|
23
|
+
|
|
24
|
+
### `variant: "on-brand"` (follows the agent's DESIGN.md end-to-end)
|
|
25
|
+
|
|
26
|
+
Renderer reads `brand.font_display` and `brand.font_body` from `inputs.json` (sourced from the agent's `DESIGN.md` font tokens) and overrides the `--display` / `--body` / `--sans` CSS variables. Headlines, body copy, eyebrows and labels all switch to the agent's identity. Colour tokens + logo apply as in premium.
|
|
27
|
+
|
|
28
|
+
Schema requires `brand.font_display` to be set for `on-brand` to engage — a missing display font silently falls back to the premium lock (no broken render). `brand.font_body` defaults to `brand.font_display` if not supplied.
|
|
29
|
+
|
|
30
|
+
### Decision rule (mirrors `property-brochure`)
|
|
31
|
+
|
|
32
|
+
1. Operator said "premium" / "super-premium" / "editorial" → premium (regardless of DESIGN.md).
|
|
33
|
+
2. Operator said "on-brand" / "branded" / "follow our DESIGN.md" → on-brand.
|
|
34
|
+
3. Operator silent + `DESIGN.md` provides both font tokens → on-brand (default for branded shops).
|
|
35
|
+
4. Otherwise → premium.
|
|
19
36
|
|
|
20
37
|
## Inputs (never invented)
|
|
21
38
|
|
|
@@ -25,10 +42,15 @@ Never substitute the agent's body or display fonts even if their `DESIGN.md` spe
|
|
|
25
42
|
- `cover_hero` (filesystem path or URL to a photo of the subject — required for the cover).
|
|
26
43
|
- Optional `beds`, `type`, `tenure`, `condition` (well / average / needs work).
|
|
27
44
|
- `adjustments[]` — operator-curated array of `{label, delta_pct}` covering esoteric factors that shift the headline range (e.g. `{"label":"South-facing garden","delta_pct":3}`, `{"label":"Needs full reno","delta_pct":-8}`). Deltas sum linearly into the final range.
|
|
28
|
-
- `narrative` — one short paragraph the operator writes about the property.
|
|
29
45
|
- **EPC certificate fields are pasted by the operator before invocation.** The three required fields are `subject.total_floor_area_m2`, `subject.current_energy_rating`, and `subject.lodgement_date` — copied verbatim from the EPC certificate. The renderer derives `sqft` from `total_floor_area_m2 × 10.7639`. There is no mid-run paste prompt and no benchmark-only render — a null in any of the three aborts the run with `reason=epc-certificate-not-supplied`.
|
|
30
46
|
- **`agent_listings`** — the agent's recent sold / under-offer / live listings to feature on the closing page. Up to 6 entries of `{url, address, price, beds, type, image, status, slug}` where `status ∈ {"Sold","Under offer","For sale"}`. Operator picks the comps that make the strongest pitch; this is *not* the PropertyData sample.
|
|
31
|
-
|
|
47
|
+
|
|
48
|
+
## Composed by the agent from the fan-out (never operator-supplied)
|
|
49
|
+
|
|
50
|
+
Two prose fields are written by the agent from the 12-call PropertyData fan-out plus the EPC and council-tax records — the operator is never prompted for them.
|
|
51
|
+
|
|
52
|
+
- **`subject.narrative`** — one short paragraph (1–3 sentences) under the valuation panel. Composed from: EPC sqft + rating, `lodgement_date` vs today (age), subject council-tax band (from the per-property `council-tax.properties[]` entry that matches the subject's house number), street context (count of dwellings on the road from the same response), plus the operator's `subject.adjustments[]` labels. Pure facts only — never speculate about orientation, decor, or interior condition that the data doesn't carry.
|
|
53
|
+
- **`market_summary`** — `headline` (one display-italic line), `paragraphs[]` (2–3 short paragraphs), `demand_gauge_position` (percentage string like `"62%"`), `price_growth_note`, `demand_note`. Every value composed from the 12-call fan-out output. Mapping: `headline` summarises the postcode in one line (e.g. demand rating + scarcity + £/sqft direction); paragraph 1 covers £/sqft band (sold vs asking) + Land Registry sample window; paragraph 2 covers demand (for-sale count, sales/mo, MoI, DoM, turnover) + property-type mix; paragraph 3 covers growth (£ + £/sqft YoY) + rental pillar. `demand_gauge_position` maps the demand rating to a percentage: Buyer's market ≈ 20–30%, Balanced market ≈ 45–55%, Seller's market ≈ 75–85%, tuned within band by MoI/DoM.
|
|
32
54
|
|
|
33
55
|
## Tools the skill calls
|
|
34
56
|
|
|
@@ -54,21 +76,25 @@ EPC certificate fields are operator paste-in — see `subject.total_floor_area_m
|
|
|
54
76
|
|
|
55
77
|
## Output
|
|
56
78
|
|
|
57
|
-
Directory under `~/
|
|
79
|
+
Directory under `~/estate-agents/<brand-slug>/preval/<address-slug>/` (e.g. `~/estate-agents/muvin/preval/11-phoenix-drive-cm23-2uj/`) containing:
|
|
58
80
|
|
|
59
81
|
- `index.html` — single self-contained file.
|
|
60
82
|
- `img/` — copied logos and the subject hero image.
|
|
61
|
-
- `<slug>-<date>.pdf` — exactly **
|
|
83
|
+
- `<slug>-<date>.pdf` — exactly **7** A4 pages. Renderer asserts via `pdfinfo` and raises if ≠ 7.
|
|
84
|
+
- `property-data.md` — markdown dump of the 12 raw PropertyData fan-out responses for transparency / vendor audit (operator may share or strip before sending).
|
|
85
|
+
- `inputs.json` + `preval.log` — the assembled input shape + the `[preval]` start/done/aborted audit lines.
|
|
62
86
|
|
|
63
|
-
Return the PDF path to the operator.
|
|
87
|
+
Output is agent-centric so each brand owns its own preval history alongside its `properties/`, `reports/` and `DESIGN.md`. Return the PDF path to the operator.
|
|
64
88
|
|
|
65
89
|
## Pages
|
|
66
90
|
|
|
67
|
-
1. **Cover** — full-bleed `subject.cover_hero` with vertical gradient scrim; light logo top-left; eyebrow "`<brand.name>` · Pre-valuation"; address in display-italic; postcode chip; four-up meta strip (
|
|
68
|
-
2. **
|
|
69
|
-
3. **Market context** — KPI cube (avg asking, avg sold, £/sqft
|
|
70
|
-
4. **
|
|
71
|
-
5. **
|
|
91
|
+
1. **Cover** — full-bleed `subject.cover_hero` with vertical gradient scrim; light logo top-left; eyebrow "`<brand.name>` · Pre-valuation"; address in display-italic; postcode chip; four-up meta strip (Prepared by · Address · Postcode · Generated). When `brand.agent_name` is set, "Prepared by" displays that name (ties the cover photo to the individual agent pitching).
|
|
92
|
+
2. **About the property** — KPI strip (sqft, beds, EPC rating, type, tenure). Agent-composed `subject.narrative` under the KPIs (drawn from EPC + council-tax records — see "Composed by the agent from the fan-out"). Optional "Notable features" bullet list rendered from `subject.adjustments[].label` (label-only — `delta_pct` is held in the schema for backward compat but no longer rendered). **No estimate, no range, no adjustments-with-running-£**. `sqft` is required — a null value aborts the run, never renders a benchmark-only panel.
|
|
93
|
+
3. **Market context** — Market-summary headline + 2–3 paragraphs (dropcap on first); KPI cube (avg asking, avg sold, £/sqft); two-col panels (price growth + demand gauge). The 7-year chart used to live here; it now has its own page (page 4) to give it space.
|
|
94
|
+
4. **Market depth** — Full-width 7-year price-trend chart (£ headline solid + £/sqft dashed gold, ≈ 48mm tall). Below: two-col panels — output-area stock mix (`demand_trend.type_dist` bars) on the left, rental pillar on the right (`demand_trend.rating` pill + 3-up KPIs for for-rent count, DoM, monthly take-up).
|
|
95
|
+
5. **What gets the best price** — Vendor-facing prep advice condensed from `real-agent/listings/home-preparation/staging-guide.md`. Two-col panel: "Five high-impact moves" (declutter / deep-clean / open the light / fix the small things / define each room) on the left; "Common mistakes" (air fresheners / personal items / cold house / overgrown garden / wardrobes) on the right. Closes with a line attributing the room-by-room walkthrough to the agent ("`<agent_name>` can walk you through this room-by-room ahead of photo day."). Content is hard-coded into the template — not per-pack-editable; for per-property customisation operators should swap to the brochure flow.
|
|
96
|
+
6. **Comparables (full-width, stacked)** — Nearest sold table (top 6, columns Date · Address · Type · Beds · Price) full-width across the page; Live asking tile grid (top 4) full-width below. Vertically stacked, never side-by-side — corrects the cramped two-column layout in the v1 preval where the asking tiles got pushed to ~40mm columns of italic addresses.
|
|
97
|
+
7. **Recently with `<brand.name>` + sources** — agent's own listings as a clickable tile grid (`<a>` per card, status badge: Sold / Under offer / For sale), then the sources / methodology / accuracy / investment block. Closes with `<brand.name> · Generated <date> · <postcode>` in the footer.
|
|
72
98
|
|
|
73
99
|
## How to execute
|
|
74
100
|
|
|
@@ -78,19 +104,15 @@ Return the PDF path to the operator.
|
|
|
78
104
|
- **PropertyData `http-429`** → back off and retry the single throttled tool **once**. A second `http-429` aborts `reason=property-data-rate-limited`.
|
|
79
105
|
- **PropertyData `http-5xx` / network failure** → abort `reason=property-data-unavailable`.
|
|
80
106
|
- **Watchdog: any of the 12 PropertyData log lines missing** within 60 s of `[preval] start` → `render.py` aborts `reason=observability-missing tool=<name>` naming the silent tool. A silent tool drop must never proceed to render.
|
|
81
|
-
3.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
- Apply `adjustments` linearly: `factor = 1 + Σ delta_pct / 100`. Final range = `[low × factor, high × factor]`, midpoint = `mid × factor`.
|
|
87
|
-
4. Assemble the `inputs.json` shape per `references/template-inputs.schema.json`.
|
|
88
|
-
5. `python3 references/render.py inputs.json`. Renderer fills the template, copies logos + hero into `img/`, drives Chrome `--print-to-pdf`, asserts page count == 5.
|
|
89
|
-
6. Return the PDF path.
|
|
107
|
+
3. Derive `sqft` from `round(subject.total_floor_area_m2 × 10.7639)` for the page-2 KPI strip. The pack does not compute a £-valuation; the £/sqft band lives on page 3 (market context) and the comparables on page 4 — the human agent values from those in person.
|
|
108
|
+
4. Compose `subject.narrative` and `market_summary` from the fan-out output per the rules in "Composed by the agent from the fan-out". No operator prompt for either.
|
|
109
|
+
5. Assemble the `inputs.json` shape per `references/template-inputs.schema.json`.
|
|
110
|
+
6. `python3 references/render.py inputs.json`. Renderer fills the template, copies logos + hero into `img/`, drives Chrome `--print-to-pdf`, asserts page count == 7.
|
|
111
|
+
7. Return the PDF path.
|
|
90
112
|
|
|
91
|
-
## Adjustments —
|
|
113
|
+
## Adjustments — label-only
|
|
92
114
|
|
|
93
|
-
|
|
115
|
+
`subject.adjustments[]` survives in the schema as `{label, delta_pct}` but the renderer uses only the `label` field — rendered as a "Notable features" bullet list on page 2. `delta_pct` is held for backward compat (it used to drive a numeric range that this skill no longer publishes). The human agent factors notable features into their valuation conversation; the pack just surfaces them as facts.
|
|
94
116
|
|
|
95
117
|
## Observability
|
|
96
118
|
|
|
@@ -119,7 +141,7 @@ Each row aborts the run with the named cause. No PDF or `index.html` is left on
|
|
|
119
141
|
The skill is the contract; if any of these slip through, the pack must not render:
|
|
120
142
|
|
|
121
143
|
- Silent fallback selection — switching to a benchmark-only / "Estimate requires floor area" panel when an input is missing.
|
|
122
|
-
- Inventing inputs — fabricating `brand`, `subject.cover_hero`, `
|
|
144
|
+
- Inventing operator-supplied inputs — fabricating `brand`, `subject.cover_hero`, `agent_listings`, the three EPC certificate fields, or `subject.adjustments[]`. `subject.narrative` and `market_summary` are NOT operator-supplied — the agent composes them from the fan-out (see "Composed by the agent from the fan-out").
|
|
123
145
|
- Reusing a hero photo from a different property as a placeholder.
|
|
124
146
|
- Defaulting `agent_listings[].status` to `"For sale"` when the source is null.
|
|
125
147
|
- Mid-run prompts for a paste-in. The three EPC certificate fields and every other operator-supplied input are pasted into `inputs.json` **before** invocation; there is no retry / paste-and-resume path.
|
|
@@ -136,8 +158,8 @@ The skill is the contract; if any of these slip through, the pack must not rende
|
|
|
136
158
|
|
|
137
159
|
These rules override every session-level "skip clarifying questions", "make the reasonable call", or "work without stopping" directive the operator has set. The named breakpoints below are documented contract points, not casual asks — the renderer and the PreToolUse hook both enforce them and a run that violates one aborts with a named cause.
|
|
138
160
|
|
|
139
|
-
- **Prompt at named breakpoints — no exceptions.** Named breakpoints: EPC certificate fields not supplied, cover_hero not depicting the subject, brand identity (which estate agent is pitching), `agent_listings` empty or carrying invented statuses
|
|
140
|
-
- **Never invent inputs.** Brand identity, brand tokens, cover hero,
|
|
161
|
+
- **Prompt at named breakpoints — no exceptions.** Named breakpoints: EPC certificate fields not supplied, cover_hero not depicting the subject, brand identity (which estate agent is pitching), `agent_listings` empty or carrying invented statuses. The load-bearing inputs themselves (EPC certificate fields, cover_hero, brand tokens) are gated by `render.py`'s `_assert_inputs`; this section layers provenance on top. `subject.narrative` and `market_summary` are not on this list — they are agent-composed from the fan-out, never operator-prompted.
|
|
162
|
+
- **Never invent operator-supplied inputs.** Brand identity, brand tokens, cover hero, agent listings, listing statuses, subject tenure / beds / type / condition, the three EPC certificate fields, and `subject.adjustments[]` — all operator-supplied. Defaulting from "area pattern", a sister property's photo, "the only DESIGN.md I found on disk", or "status:null in the source so I picked For sale" is invention. The presence of a single `~/estate-agents/<slug>/DESIGN.md` on disk does not authorise its selection — only an operator instruction does. If more than one `~/estate-agents/<slug>/` exists and the operator has not named which one is pitching, abort. (`subject.narrative` and `market_summary` are explicitly out of scope here — see "Composed by the agent from the fan-out".)
|
|
141
163
|
- **`agent_overrides` is the only bypass channel.** Every override the operator authorises lands in `inputs.json` as a named boolean (`brand_selected_by_operator`, `listings_status_curated`) so the audit trail sits next to the disputed value. Setting an override without a real operator instruction is a violation of the same contract.
|
|
142
164
|
- **Emit the three `[preval]` log lines — every run.** `[preval] start address="…" postcode=…`, then `[preval] done pdf=… pages=… ms=…` on success or `[preval] aborted reason=<cause> ms=…` on any abort. A run that emits neither `done` nor `aborted` is itself a defect.
|
|
143
165
|
|
|
@@ -147,7 +169,6 @@ These rules override every session-level "skip clarifying questions", "make the
|
|
|
147
169
|
|---|---|---|
|
|
148
170
|
| `cover-hero-not-subject` | `subject.cover_hero` resolves to a `*/properties/*/` directory whose slug doesn't contain the subject's primary street token | Supply the subject's own photo |
|
|
149
171
|
| `agent-listings-invented` | An `agent_listings[].status` is set when the source `property.json` (named by `agent_listings[].origin`) carries `status: null`, and `agent_overrides.listings_status_curated` is not `true` | Operator signs off on each listing status, then sets the override |
|
|
150
|
-
| `market-summary-invented` | `market_summary.origin` is missing or not in `{"operator", "operator-edited-llm-stub"}` | Operator drafts or accepts the paragraphs; set `origin` accordingly |
|
|
151
172
|
| `brand-invented` | `brand.name` is set without `agent_overrides.brand_selected_by_operator: true` | Operator names which estate agent is pitching; set the override |
|
|
152
173
|
| `epc-certificate-not-supplied` | Any of `subject.total_floor_area_m2`, `subject.current_energy_rating`, or `subject.lodgement_date` is null or missing | Operator copies the three fields verbatim from the EPC certificate into `subject` in `inputs.json` before re-invoking |
|
|
153
174
|
| `observability-missing tool=<name>` | One of the 12 expected `[property-data] tool=<name>` log lines did not appear within 60 s of `[preval] start` | Re-invoke and confirm every PropertyData tool returns; if a tool is genuinely down, surface a `property-data-*` cause first |
|
|
@@ -161,9 +182,10 @@ Answer all seven inline at the end of every run, with line references from `serv
|
|
|
161
182
|
2. All 12 expected `[property-data] tool=<name>` log lines present, or `[preval] aborted` emitted with a named cause? (cite the lines)
|
|
162
183
|
3. EPC certificate fields (`subject.total_floor_area_m2`, `subject.current_energy_rating`, `subject.lodgement_date`) all populated from the operator paste? (cite the `inputs.json` excerpt)
|
|
163
184
|
4. Every input field traceable to a real source — operator paste (including the EPC certificate), on-disk `DESIGN.md`, MCP response? Anything sourced from "area pattern", a sister property file, or LLM imagination is a defect.
|
|
164
|
-
5. `[preval] done pages=
|
|
165
|
-
6. PDF page count =
|
|
166
|
-
7. No fields invented from area pattern, sister-property files, or LLM imagination? List the three most fabrication-prone fields (`brand.name`, `
|
|
185
|
+
5. `[preval] done pages=7` emitted? (cite the log line)
|
|
186
|
+
6. PDF page count = 7 asserted? (cite the assertion result)
|
|
187
|
+
7. No operator-supplied fields invented from area pattern, sister-property files, or LLM imagination? List the three most fabrication-prone operator-supplied fields (`brand.name`, `agent_listings[].status`, `subject.cover_hero`) and the source for each in this run. (`subject.narrative` and `market_summary` are agent-composed from the fan-out by design — note them as such with the data fields they're drawn from.)
|
|
188
|
+
8. **Visual verification — open the rendered PDF and confirm each page.** Use the Read tool with `pages: "1-7"` against the PDF and check: (a) no content clipped at the bottom of any page (the absolutely-positioned `.doc-foot` overlays content past ~y=288mm — anything below must be footer only); (b) no remaining `<!-- REPLACE: <slot> -->` strings; (c) no KPI cells displaying "—" for fields that should be populated (especially `subject.beds`); (d) cover meta strip carries "Prepared by · <agent_name>"; (e) when `variant: "on-brand"` is set, page 1's address renders in the brand's display font (not Cormorant) — typeface drift is the variant's visual signature. Log-line success (`pages=7`) is necessary but not sufficient — page count being right does not prove each page rendered cleanly. **Skipping this check is the documented cause of two prior chart-overflow regressions; treat it as mandatory.**
|
|
167
189
|
|
|
168
190
|
## Out of scope
|
|
169
191
|
|
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
Substitutes <!-- REPLACE: <slot> --> placeholders in template.html with values
|
|
4
4
|
derived from one inputs.json (shape: template-inputs.schema.json), drives
|
|
5
|
-
Chrome headless to produce a
|
|
5
|
+
Chrome headless to produce a 7-page A4 PDF, and asserts page count == 7.
|
|
6
6
|
|
|
7
7
|
Fails loud on any missing / unverifiable load-bearing input. No silent
|
|
8
8
|
fallback modes — see _assert_inputs. Task 157 layers provenance gates
|
|
9
|
-
(
|
|
10
|
-
of 156's load-bearing-input checks.
|
|
9
|
+
(agent_listings[].origin, agent_overrides.brand_selected_by_operator) on
|
|
10
|
+
top of 156's load-bearing-input checks. `subject.narrative` and
|
|
11
|
+
`market_summary` are agent-composed from the 12-call fan-out, not
|
|
12
|
+
operator-supplied — only the `paragraphs >= 2` sanity check survives.
|
|
11
13
|
|
|
12
14
|
Usage:
|
|
13
15
|
python3 render.py inputs.json
|
|
@@ -24,8 +26,8 @@ def _money(n: int) -> str:
|
|
|
24
26
|
return f"£{int(n):,}"
|
|
25
27
|
|
|
26
28
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
# _range_money retired with the page-2 valuation panel. The pack no longer
|
|
30
|
+
# quotes a numeric range — the human estate agent values in person.
|
|
29
31
|
|
|
30
32
|
|
|
31
33
|
# ---------------- helpers ----------------
|
|
@@ -38,11 +40,12 @@ def _short_address(address: str) -> str:
|
|
|
38
40
|
|
|
39
41
|
def _sold_comps_rows(rows: list[dict]) -> str:
|
|
40
42
|
if not rows:
|
|
41
|
-
return '<tr><td colspan="
|
|
43
|
+
return '<tr><td colspan="5" class="muted">No sold transactions in the sample.</td></tr>'
|
|
42
44
|
return "".join(
|
|
43
45
|
f"<tr><td>{html.escape(r['date'])}</td>"
|
|
44
46
|
f"<td>{html.escape(r['address'])}</td>"
|
|
45
47
|
f"<td>{html.escape(r['type'])}</td>"
|
|
48
|
+
f"<td>{r['beds'] if r.get('beds') else '—'}</td>"
|
|
46
49
|
f"<td class=\"num\">{_money(r['price'])}</td></tr>"
|
|
47
50
|
for r in rows[:6]
|
|
48
51
|
)
|
|
@@ -129,6 +132,33 @@ def _summary_paragraphs(paras: list[str]) -> str:
|
|
|
129
132
|
return "".join(out)
|
|
130
133
|
|
|
131
134
|
|
|
135
|
+
def _variant_css(inputs: dict) -> str:
|
|
136
|
+
"""Compose CSS override block for the 'on-brand' variant.
|
|
137
|
+
|
|
138
|
+
Premium variant keeps the editorial Cormorant/Lora/Inter typography lock
|
|
139
|
+
— only the brand's colour tokens and logo are applied. On-brand variant
|
|
140
|
+
overrides --display / --body / --sans with brand.font_display +
|
|
141
|
+
brand.font_body — pack typography follows the agent's DESIGN.md end-to-end.
|
|
142
|
+
|
|
143
|
+
Returns empty string for premium (no overrides applied).
|
|
144
|
+
"""
|
|
145
|
+
variant = (inputs.get("variant") or "premium").lower()
|
|
146
|
+
if variant != "on-brand":
|
|
147
|
+
return ""
|
|
148
|
+
brand = inputs.get("brand") or {}
|
|
149
|
+
fd = brand.get("font_display") or ""
|
|
150
|
+
fb = brand.get("font_body") or fd
|
|
151
|
+
if not fd:
|
|
152
|
+
return ""
|
|
153
|
+
return (
|
|
154
|
+
'<style>:root{'
|
|
155
|
+
f'--display:{fd};'
|
|
156
|
+
f'--body:{fb};'
|
|
157
|
+
f'--sans:{fd};'
|
|
158
|
+
'}</style>'
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
|
|
132
162
|
def _wordmark(brand: dict, variant: str, out_dir: Path) -> str:
|
|
133
163
|
"""variant ∈ {'light', 'dark'}. Mirrors property-market-report's wordmark."""
|
|
134
164
|
key = "logo_light" if variant == "light" else "logo_dark"
|
|
@@ -214,62 +244,29 @@ def _agent_listings_cards(rows: list[dict], out_dir: Path) -> str:
|
|
|
214
244
|
return "".join(_listing_card(p, i, out_dir) for i, p in enumerate(rows[:6]))
|
|
215
245
|
|
|
216
246
|
|
|
217
|
-
# ----------------
|
|
247
|
+
# ---------------- subject facts ----------------
|
|
218
248
|
|
|
219
|
-
def
|
|
220
|
-
"""
|
|
249
|
+
def _notable_features_block(subject: dict) -> str:
|
|
250
|
+
"""Label-only bullet list from subject.adjustments[].label. No numbers.
|
|
221
251
|
|
|
222
|
-
The
|
|
223
|
-
|
|
224
|
-
|
|
252
|
+
The pre-valuation pack does NOT quote an estimate or a range — the
|
|
253
|
+
human agent values the property in person. Adjustments survive only
|
|
254
|
+
as a "Notable features" list (operator-supplied facts the agent
|
|
255
|
+
wants visible on the cover-side of the pitch); delta_pct is held in
|
|
256
|
+
the schema for backward compat but is no longer rendered.
|
|
225
257
|
"""
|
|
226
|
-
sqft = _derived_sqft(subject)
|
|
227
|
-
low_psf = valuation["sold_psf_low"]
|
|
228
|
-
mid_psf = valuation["sold_psf"]
|
|
229
|
-
high_psf = valuation["sold_psf_high"]
|
|
230
|
-
ask_psf = valuation["asking_psf"]
|
|
231
|
-
|
|
232
|
-
low_raw = int(sqft * low_psf)
|
|
233
|
-
mid_raw = int(sqft * mid_psf)
|
|
234
|
-
high_raw = int(sqft * high_psf)
|
|
235
|
-
ask_raw = int(sqft * ask_psf)
|
|
236
|
-
|
|
237
|
-
rows = [
|
|
238
|
-
('<div class="val-row headline">'
|
|
239
|
-
f'<div class="lbl">Headline range<small>{sqft:,} sqft × £{low_psf}–£{high_psf} sold £/sqft (Land Registry 70pc band)</small></div>'
|
|
240
|
-
f'<div class="num">{_range_money(low_raw, high_raw)}</div></div>'),
|
|
241
|
-
('<div class="val-row">'
|
|
242
|
-
f'<div class="lbl">Cross-check · asking £/sqft<small>{sqft:,} sqft × £{ask_psf} mean asking £/sqft</small></div>'
|
|
243
|
-
f'<div class="num">{_money(ask_raw)}</div></div>'),
|
|
244
|
-
]
|
|
245
|
-
|
|
246
258
|
adjustments = subject.get("adjustments") or []
|
|
247
|
-
if adjustments:
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
"</div>"
|
|
258
|
-
)
|
|
259
|
-
|
|
260
|
-
delta_sum = sum(float(a["delta_pct"]) for a in adjustments)
|
|
261
|
-
factor = 1.0 + delta_sum / 100.0
|
|
262
|
-
low_final = int(low_raw * factor)
|
|
263
|
-
high_final = int(high_raw * factor)
|
|
264
|
-
|
|
265
|
-
final = (
|
|
266
|
-
'<div class="val-final">'
|
|
267
|
-
f'<div class="lbl">Final indicative range</div>'
|
|
268
|
-
f'<div class="num">{_range_money(low_final, high_final)}</div>'
|
|
269
|
-
"</div>"
|
|
259
|
+
if not adjustments:
|
|
260
|
+
return ""
|
|
261
|
+
items = "".join(
|
|
262
|
+
f'<li>{html.escape(adj["label"])}</li>' for adj in adjustments
|
|
263
|
+
)
|
|
264
|
+
return (
|
|
265
|
+
'<div class="notable-features" style="margin-top:6mm">'
|
|
266
|
+
'<div class="eyebrow" style="margin-bottom:2mm">Notable features</div>'
|
|
267
|
+
f'<ul style="margin:0;padding-left:5mm;line-height:1.5">{items}</ul>'
|
|
268
|
+
'</div>'
|
|
270
269
|
)
|
|
271
|
-
|
|
272
|
-
return '<div class="val-panel">' + "".join(rows) + "</div>" + final
|
|
273
270
|
|
|
274
271
|
|
|
275
272
|
def _derived_sqft(subject: dict) -> int:
|
|
@@ -396,8 +393,10 @@ def _assert_inputs(inputs: dict) -> None:
|
|
|
396
393
|
agent-listings-empty, market-summary-too-thin.
|
|
397
394
|
|
|
398
395
|
Task 157 causes (provenance — agent didn't invent the input):
|
|
399
|
-
cover-hero-not-subject, agent-listings-invented,
|
|
400
|
-
market-summary-invented
|
|
396
|
+
cover-hero-not-subject, agent-listings-invented, brand-invented.
|
|
397
|
+
(`market-summary-invented` retired: market_summary is agent-composed
|
|
398
|
+
from the fan-out, not operator-supplied; only the paragraphs>=2
|
|
399
|
+
sanity check remains, surfaced as `market-summary-too-thin`.)
|
|
401
400
|
|
|
402
401
|
Task 163 cause (EPC certificate paste-in completes 157's mandate):
|
|
403
402
|
epc-certificate-not-supplied — any of total_floor_area_m2,
|
|
@@ -489,14 +488,6 @@ def _assert_inputs(inputs: dict) -> None:
|
|
|
489
488
|
"agent_overrides.listings_status_curated: true.",
|
|
490
489
|
)
|
|
491
490
|
|
|
492
|
-
if ms.get("origin") not in ("operator", "operator-edited-llm-stub"):
|
|
493
|
-
raise PrevalAbort(
|
|
494
|
-
"market-summary-invented",
|
|
495
|
-
"market_summary.origin must be 'operator' or 'operator-edited-llm-stub'. "
|
|
496
|
-
"Have the operator draft or accept the paragraphs before rendering — "
|
|
497
|
-
"the agent never invents the market narrative unprompted.",
|
|
498
|
-
)
|
|
499
|
-
|
|
500
491
|
if brand.get("name") and not overrides.get("brand_selected_by_operator"):
|
|
501
492
|
raise PrevalAbort(
|
|
502
493
|
"brand-invented",
|
|
@@ -539,8 +530,10 @@ def render(inputs: dict, out_dir: Path, template_path: Path | None = None) -> Pa
|
|
|
539
530
|
psf = max(1, round(d["for_sale"] / 7))
|
|
540
531
|
|
|
541
532
|
slots = {
|
|
533
|
+
"variant_css": _variant_css(inputs),
|
|
542
534
|
"brand_name": brand["name"],
|
|
543
535
|
"brand_tagline": brand["tagline"],
|
|
536
|
+
"prepared_by": brand.get("agent_name") or brand["name"],
|
|
544
537
|
"brand_primary": brand["primary"],
|
|
545
538
|
"brand_primary_dark": brand["primary_dark"],
|
|
546
539
|
"brand_accent": brand["accent"],
|
|
@@ -563,7 +556,7 @@ def render(inputs: dict, out_dir: Path, template_path: Path | None = None) -> Pa
|
|
|
563
556
|
"kpi_subject_epc_sub": subject_epc_sub,
|
|
564
557
|
"kpi_subject_type": subject.get("type") or "—",
|
|
565
558
|
"kpi_subject_tenure": subject.get("tenure") or "Tenure unknown",
|
|
566
|
-
"
|
|
559
|
+
"notable_features": _notable_features_block(subject),
|
|
567
560
|
"subject_narrative": subject.get("narrative") or "",
|
|
568
561
|
|
|
569
562
|
"summary_headline": ms["headline"],
|
|
@@ -577,6 +570,11 @@ def render(inputs: dict, out_dir: Path, template_path: Path | None = None) -> Pa
|
|
|
577
570
|
"price_growth_note": ms["price_growth_note"],
|
|
578
571
|
"demand_note": ms["demand_note"],
|
|
579
572
|
"spark_svg": _spark_svg(d.get("growth_series", []), d.get("growth_psf_series", [])),
|
|
573
|
+
"type_dist_rows": _type_dist_rows(d.get("type_dist", [])),
|
|
574
|
+
"rental_rating": r["demand_rating"],
|
|
575
|
+
"rental_for_rent": str(r["for_rent"]),
|
|
576
|
+
"rental_dom": str(r["dom"]),
|
|
577
|
+
"rental_turnover": f"{r['turnover_pct']}%",
|
|
580
578
|
|
|
581
579
|
"sold_comps_rows": _sold_comps_rows(v.get("sold_comps", [])),
|
|
582
580
|
"asking_comps_tiles": _asking_comps_tiles(v.get("asking_comps", [])),
|
|
@@ -586,12 +584,13 @@ def render(inputs: dict, out_dir: Path, template_path: Path | None = None) -> Pa
|
|
|
586
584
|
|
|
587
585
|
text_slots = {
|
|
588
586
|
"address", "address_short", "postcode", "generated",
|
|
589
|
-
"brand_name", "brand_tagline",
|
|
587
|
+
"brand_name", "brand_tagline", "prepared_by",
|
|
590
588
|
"kpi_subject_beds", "kpi_subject_epc", "kpi_subject_epc_sub",
|
|
591
589
|
"kpi_subject_sqft", "kpi_subject_sqft_sub",
|
|
592
590
|
"kpi_subject_type", "kpi_subject_tenure",
|
|
593
591
|
"summary_headline", "demand_rating",
|
|
594
592
|
"price_growth_note", "demand_note", "subject_narrative",
|
|
593
|
+
"rental_rating", "rental_for_rent", "rental_dom", "rental_turnover",
|
|
595
594
|
}
|
|
596
595
|
for k in text_slots:
|
|
597
596
|
slots[k] = html.escape(str(slots[k]))
|
|
@@ -791,7 +790,7 @@ def main():
|
|
|
791
790
|
try:
|
|
792
791
|
render(inputs, out_dir)
|
|
793
792
|
pdf = render_pdf(out_dir, f"{base}.pdf")
|
|
794
|
-
pages = assert_page_count(pdf,
|
|
793
|
+
pages = assert_page_count(pdf, 7)
|
|
795
794
|
except PrevalAbort as e:
|
|
796
795
|
pdf_path = out_dir / f"{base}.pdf"
|
|
797
796
|
if pdf_path.exists():
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"title": "property-preval inputs",
|
|
4
|
-
"description": "Single-source contract for render.py. Mirrors the 12 property-data MCP responses for one full UK address, plus operator-supplied brand, subject (including the three EPC certificate fields pasted before invocation),
|
|
4
|
+
"description": "Single-source contract for render.py. Mirrors the 12 property-data MCP responses for one full UK address, plus operator-supplied brand, subject (including the three EPC certificate fields pasted before invocation), and agent_listings. `subject.narrative` and `market_summary` are composed by the agent from the fan-out — not operator-supplied.",
|
|
5
5
|
"type": "object",
|
|
6
6
|
"required": [
|
|
7
7
|
"out_dir", "filename_stem", "address", "postcode", "generated",
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
"address": { "type": "string", "description": "Full UK address as the operator gave it." },
|
|
15
15
|
"postcode": { "type": "string", "description": "Postcode derived from the address, e.g. 'CM23 2UJ'." },
|
|
16
16
|
"generated": { "type": "string", "description": "Human date, e.g. '19 May 2026'." },
|
|
17
|
+
"variant": { "type": "string", "enum": ["premium", "on-brand"], "description": "Render variant. 'premium' (default) keeps the editorial Cormorant/Lora/Inter typography lock and only applies the brand's colours + logo. 'on-brand' overrides the type system with brand.font_display + brand.font_body — the pack follows the agent's identity end-to-end. Decision rule: if the operator says 'premium' use premium; if brand.font_display + brand.font_body are both set and the operator did not say premium, default to 'on-brand'; otherwise premium." },
|
|
17
18
|
|
|
18
19
|
"brand": {
|
|
19
20
|
"type": "object",
|
|
@@ -28,7 +29,10 @@
|
|
|
28
29
|
"paper_banded": { "type": "string" },
|
|
29
30
|
"rule": { "type": "string" },
|
|
30
31
|
"logo_light": { "type": "string", "description": "Optional filesystem path to white-on-transparent logo for the cover." },
|
|
31
|
-
"logo_dark": { "type": "string", "description": "Optional filesystem path to full-colour logo for body-page headers." }
|
|
32
|
+
"logo_dark": { "type": "string", "description": "Optional filesystem path to full-colour logo for body-page headers." },
|
|
33
|
+
"agent_name": { "type": "string", "description": "Optional. Name of the individual agent preparing the pitch — printed in the cover's 'Prepared by' meta cell. Falls back to brand.name when omitted." },
|
|
34
|
+
"font_display": { "type": "string", "description": "Optional. CSS font-family value for the display typeface (h1/h2/h4/eyebrows). Only honoured when variant='on-brand'. e.g. '\"Azo Sans\", system-ui, sans-serif'." },
|
|
35
|
+
"font_body": { "type": "string", "description": "Optional. CSS font-family value for body typography (paragraphs, lists). Only honoured when variant='on-brand'. e.g. 'Poppins, sans-serif'." }
|
|
32
36
|
}
|
|
33
37
|
},
|
|
34
38
|
|
|
@@ -44,7 +48,7 @@
|
|
|
44
48
|
"total_floor_area_m2": { "type": "number", "description": "Total internal area in square metres, copied verbatim from the EPC certificate. Operator pastes this into inputs.json before invocation. Null aborts with epc-certificate-not-supplied." },
|
|
45
49
|
"current_energy_rating": { "type": "string", "description": "Current energy rating from the EPC certificate, e.g. 'C'. Operator paste-in. Null aborts with epc-certificate-not-supplied." },
|
|
46
50
|
"lodgement_date": { "type": "string", "description": "ISO date of the EPC certificate's lodgement, e.g. '2018-04-21'. Operator paste-in. Null aborts with epc-certificate-not-supplied." },
|
|
47
|
-
"narrative": { "type": ["string", "null"], "description": "One short paragraph the
|
|
51
|
+
"narrative": { "type": ["string", "null"], "description": "One short paragraph (1–3 sentences) under the valuation panel. Composed by the agent from EPC + council-tax records + adjustments — not operator-supplied." },
|
|
48
52
|
"adjustments": {
|
|
49
53
|
"type": "array",
|
|
50
54
|
"description": "Operator-curated esoteric factors that shift the headline range. Deltas sum linearly into the final factor (1 + Σ delta_pct/100).",
|
|
@@ -81,6 +85,7 @@
|
|
|
81
85
|
"date": { "type": "string" },
|
|
82
86
|
"address": { "type": "string" },
|
|
83
87
|
"type": { "type": "string" },
|
|
88
|
+
"beds": { "type": ["integer", "null"], "description": "Bedroom count from the Land Registry transaction; some rows are null in the source." },
|
|
84
89
|
"price": { "type": "integer" }
|
|
85
90
|
}
|
|
86
91
|
}
|
|
@@ -153,14 +158,14 @@
|
|
|
153
158
|
|
|
154
159
|
"market_summary": {
|
|
155
160
|
"type": "object",
|
|
156
|
-
"
|
|
161
|
+
"description": "Composed by the agent from the 12-call PropertyData fan-out — not operator-supplied. See SKILL.md \"Composed by the agent from the fan-out\" for the field-by-field mapping.",
|
|
162
|
+
"required": ["headline", "paragraphs", "demand_gauge_position", "price_growth_note", "demand_note"],
|
|
157
163
|
"properties": {
|
|
158
164
|
"headline": { "type": "string", "description": "One-line display-italic h2 for the market context page." },
|
|
159
|
-
"paragraphs": { "type": "array", "minItems": 2, "items": { "type": "string" }, "description": "2–3 short paragraphs. First gets a drop cap. Fewer than 2 aborts the run
|
|
165
|
+
"paragraphs": { "type": "array", "minItems": 2, "items": { "type": "string" }, "description": "2–3 short paragraphs. First gets a drop cap. Fewer than 2 aborts the run with `market-summary-too-thin`." },
|
|
160
166
|
"demand_gauge_position": { "type": "string", "description": "Percentage string for the gauge marker position, e.g. '62%'." },
|
|
161
167
|
"price_growth_note": { "type": "string" },
|
|
162
|
-
"demand_note": { "type": "string" }
|
|
163
|
-
"origin": { "type": "string", "enum": ["operator", "operator-edited-llm-stub"], "description": "Provenance of the paragraphs. 'agent-invented' is never permitted — the gate aborts with `market-summary-invented`." }
|
|
168
|
+
"demand_note": { "type": "string" }
|
|
164
169
|
}
|
|
165
170
|
},
|
|
166
171
|
|