@rubytech/create-maxy-code 0.1.17 → 0.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/__tests__/cdp-port-no-silent-fallback.test.js +2 -2
  2. package/dist/__tests__/onboarding-state-readback.test.js +61 -0
  3. package/dist/index.js +42 -0
  4. package/dist/onboarding-readback.js +27 -0
  5. package/package.json +2 -2
  6. package/payload/platform/config/brand-registry.json +4 -4
  7. package/payload/platform/config/brand.json +4 -4
  8. package/payload/platform/plugins/cloudflare/scripts/reset-tunnel.sh +1 -1
  9. package/payload/platform/plugins/cloudflare/scripts/setup-tunnel.sh +1 -1
  10. package/payload/platform/plugins/docs/references/deployment.md +25 -2
  11. package/payload/platform/scripts/installer-device-verify.sh +2 -2
  12. package/payload/platform/scripts/redact-install-logs.sh +2 -2
  13. package/payload/platform/scripts/seed-neo4j.sh +35 -0
  14. package/payload/platform/scripts/verify-skill-tool-surface.sh +1 -1
  15. package/payload/platform/scripts/vnc.sh +2 -2
  16. package/payload/premium-plugins/real-agency/plugins/brochures/skills/brand-design/SKILL.md +1 -1
  17. package/payload/premium-plugins/real-agency/plugins/brochures/skills/make-brochure/SKILL.md +9 -9
  18. package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/SKILL.md +7 -7
  19. package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/references/build.md +5 -5
  20. package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/references/copy.md +3 -3
  21. package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/references/images.md +1 -1
  22. package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/references/{page-landing.md → index-landing.md} +14 -14
  23. package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/references/{page.html → index.html} +4 -4
  24. package/payload/premium-plugins/real-agency/plugins/brochures/skills/property-brochure/references/placeholders.md +6 -6
  25. package/payload/server/package.json +1 -1
  26. package/payload/server/public/assets/{Checkbox-nrf4ISU0.js → Checkbox-BmlrSRF8.js} +1 -1
  27. package/payload/server/public/assets/{admin-BctPxbjB.js → admin-Drvl0Okz.js} +53 -53
  28. package/payload/server/public/assets/{architectureDiagram-Q4EWVU46-DZI73ap7.js → architectureDiagram-Q4EWVU46-DU8MnqOj.js} +1 -1
  29. package/payload/server/public/assets/{blockDiagram-DXYQGD6D-BQQz9YNZ.js → blockDiagram-DXYQGD6D-DwBZc1na.js} +1 -1
  30. package/payload/server/public/assets/{c4Diagram-AHTNJAMY-gl8-XVLH.js → c4Diagram-AHTNJAMY-C9ZHreVX.js} +1 -1
  31. package/payload/server/public/assets/channel-Boz4UHN2.js +1 -0
  32. package/payload/server/public/assets/{chunk-336JU56O-839etdKR.js → chunk-336JU56O-DNXqHk42.js} +2 -2
  33. package/payload/server/public/assets/{chunk-426QAEUC-hyvaLE5p.js → chunk-426QAEUC-DOLKkQGn.js} +1 -1
  34. package/payload/server/public/assets/{chunk-4TB4RGXK-DEIYWdpd.js → chunk-4TB4RGXK-l8iZx-gQ.js} +1 -1
  35. package/payload/server/public/assets/{chunk-5FUZZQ4R-zWevOyjc.js → chunk-5FUZZQ4R-DQwRtUdO.js} +1 -1
  36. package/payload/server/public/assets/{chunk-5PVQY5BW-CL9KWSZH.js → chunk-5PVQY5BW-CvvoBJnn.js} +1 -1
  37. package/payload/server/public/assets/{chunk-EDXVE4YY-D91vGp64.js → chunk-EDXVE4YY-DV1J4-LR.js} +1 -1
  38. package/payload/server/public/assets/{chunk-ENJZ2VHE-DApK4iuk.js → chunk-ENJZ2VHE-Co6qpIQl.js} +1 -1
  39. package/payload/server/public/assets/{chunk-ICPOFSXX-BOjV-nTe.js → chunk-ICPOFSXX-9v9O_mwr.js} +1 -1
  40. package/payload/server/public/assets/{chunk-OYMX7WX6-D3Cv5Z_Z.js → chunk-OYMX7WX6-D2X1NuKZ.js} +1 -1
  41. package/payload/server/public/assets/{chunk-U2HBQHQK-C92E-iRU.js → chunk-U2HBQHQK-DmqWEsN2.js} +1 -1
  42. package/payload/server/public/assets/{chunk-X2U36JSP-DohG6qWK.js → chunk-X2U36JSP-C0b2a6Bq.js} +1 -1
  43. package/payload/server/public/assets/{chunk-YZCP3GAM-CyeLVSjf.js → chunk-YZCP3GAM-BdBAquWg.js} +1 -1
  44. package/payload/server/public/assets/{chunk-ZZ45TVLE-D7R-lONY.js → chunk-ZZ45TVLE-C1AFspLM.js} +1 -1
  45. package/payload/server/public/assets/classDiagram-6PBFFD2Q-CRA6E97A.js +1 -0
  46. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-VnieTvEm.js +1 -0
  47. package/payload/server/public/assets/clone-6YhZHo8b.js +1 -0
  48. package/payload/server/public/assets/{dagre-DjhovTZd.js → dagre-7eiQzAHj.js} +1 -1
  49. package/payload/server/public/assets/{dagre-KV5264BT-DFeRlQuy.js → dagre-KV5264BT-a88ylEXY.js} +1 -1
  50. package/payload/server/public/assets/data-Dq_if_B4.js +1 -0
  51. package/payload/server/public/assets/{device-url-actions-CE3A1UDw.js → device-url-actions-_s-UgHa3.js} +1 -1
  52. package/payload/server/public/assets/{diagram-5BDNPKRD-DsmRGnVL.js → diagram-5BDNPKRD-XuINnSy-.js} +1 -1
  53. package/payload/server/public/assets/{diagram-G4DWMVQ6-CVSK-mLR.js → diagram-G4DWMVQ6-B93iSQ8a.js} +1 -1
  54. package/payload/server/public/assets/{diagram-MMDJMWI5-DMN94Pe-.js → diagram-MMDJMWI5-Gcoj967k.js} +1 -1
  55. package/payload/server/public/assets/{diagram-TYMM5635-DaD4mLMc.js → diagram-TYMM5635-C2BKnsAF.js} +1 -1
  56. package/payload/server/public/assets/{erDiagram-SMLLAGMA-BUkZ2Iq1.js → erDiagram-SMLLAGMA-DwbOuflI.js} +1 -1
  57. package/payload/server/public/assets/{flowDiagram-DWJPFMVM-DW8DX_ge.js → flowDiagram-DWJPFMVM-CEExhdxC.js} +1 -1
  58. package/payload/server/public/assets/{ganttDiagram-T4ZO3ILL-DWaRL6__.js → ganttDiagram-T4ZO3ILL-kYNYeUK-.js} +1 -1
  59. package/payload/server/public/assets/{gitGraphDiagram-UUTBAWPF-BaPTFtVx.js → gitGraphDiagram-UUTBAWPF-D3X2eJPE.js} +1 -1
  60. package/payload/server/public/assets/graph-CNFkzAKU.js +1 -0
  61. package/payload/server/public/assets/{graph-labels-BRtJE9AE.js → graph-labels-C6ZZPglH.js} +1 -1
  62. package/payload/server/public/assets/{graphlib-BUhb3hPU.js → graphlib-_S6i_Jn2.js} +1 -1
  63. package/payload/server/public/assets/{infoDiagram-42DDH7IO-Ch6CE3GO.js → infoDiagram-42DDH7IO-CQx0vDcC.js} +1 -1
  64. package/payload/server/public/assets/{ishikawaDiagram-UXIWVN3A-DApFr2KO.js → ishikawaDiagram-UXIWVN3A-0eZUgqUP.js} +1 -1
  65. package/payload/server/public/assets/{journeyDiagram-VCZTEJTY-D72xl-VA.js → journeyDiagram-VCZTEJTY-D-B2Kd_J.js} +1 -1
  66. package/payload/server/public/assets/jsx-runtime-CtqEPPN5.css +1 -0
  67. package/payload/server/public/assets/{kanban-definition-6JOO6SKY-TuAvkCJU.js → kanban-definition-6JOO6SKY-BmLn-OEz.js} +1 -1
  68. package/payload/server/public/assets/{line-Cr3lHgh8.js → line-h25nWPBw.js} +1 -1
  69. package/payload/server/public/assets/{mermaid-parser.core-BvbEd4_6.js → mermaid-parser.core-CXXeaSZi.js} +1 -1
  70. package/payload/server/public/assets/{mermaid.core-CSIEcw1L.js → mermaid.core-BjFfgEHL.js} +3 -3
  71. package/payload/server/public/assets/{mindmap-definition-QFDTVHPH-CNLvqgk-.js → mindmap-definition-QFDTVHPH-Dql4ILoK.js} +1 -1
  72. package/payload/server/public/assets/{page-B_80xGrM.js → page-CdWWweCx.js} +1 -1
  73. package/payload/server/public/assets/{page-BcnqM490.js → page-D20UnO_r.js} +1 -1
  74. package/payload/server/public/assets/{pieDiagram-DEJITSTG-CSOsdFn6.js → pieDiagram-DEJITSTG-nYaoTCKZ.js} +1 -1
  75. package/payload/server/public/assets/{public-DGrCAqZN.js → public-CXgyLdJU.js} +3 -3
  76. package/payload/server/public/assets/{quadrantDiagram-34T5L4WZ-Bsxz9S58.js → quadrantDiagram-34T5L4WZ-XG8xivm9.js} +1 -1
  77. package/payload/server/public/assets/{requirementDiagram-MS252O5E-BZRrlQlh.js → requirementDiagram-MS252O5E-C2GzfT-6.js} +1 -1
  78. package/payload/server/public/assets/{sankeyDiagram-XADWPNL6-C-W-Az7g.js → sankeyDiagram-XADWPNL6-3aI78p2X.js} +1 -1
  79. package/payload/server/public/assets/{sequenceDiagram-FGHM5R23-DCZPAj4-.js → sequenceDiagram-FGHM5R23-CvaNRYuS.js} +1 -1
  80. package/payload/server/public/assets/{stateDiagram-FHFEXIEX-C3wODMGb.js → stateDiagram-FHFEXIEX-DHT2Zyvj.js} +1 -1
  81. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-YmtuS9BN.js +1 -0
  82. package/payload/server/public/assets/{timeline-definition-GMOUNBTQ-TRzSKinM.js → timeline-definition-GMOUNBTQ-DqPjDUku.js} +1 -1
  83. package/payload/server/public/assets/{vennDiagram-DHZGUBPP-DSKZVM8N.js → vennDiagram-DHZGUBPP-lQB1LgjH.js} +1 -1
  84. package/payload/server/public/assets/{wardleyDiagram-NUSXRM2D-BRXL08eb.js → wardleyDiagram-NUSXRM2D-sxSMxkwm.js} +1 -1
  85. package/payload/server/public/assets/{xychartDiagram-5P7HB3ND-CgWMOf0l.js → xychartDiagram-5P7HB3ND-4-dvvfSD.js} +1 -1
  86. package/payload/server/public/brand-constants.json +1 -1
  87. package/payload/server/public/brand-defaults.css +1 -1
  88. package/payload/server/public/data.html +5 -5
  89. package/payload/server/public/graph.html +6 -6
  90. package/payload/server/public/index.html +8 -8
  91. package/payload/server/public/public.html +5 -5
  92. package/payload/server/server.js +91 -6
  93. package/payload/server/public/assets/channel-BIMyzzFT.js +0 -1
  94. package/payload/server/public/assets/classDiagram-6PBFFD2Q-BAfXNwa9.js +0 -1
  95. package/payload/server/public/assets/classDiagram-v2-HSJHXN6E-D5bE1GaW.js +0 -1
  96. package/payload/server/public/assets/clone-DOH_suVb.js +0 -1
  97. package/payload/server/public/assets/data-DzTaKq-r.js +0 -1
  98. package/payload/server/public/assets/graph-dgoq2zvY.js +0 -1
  99. package/payload/server/public/assets/jsx-runtime-BgXAk35j.css +0 -1
  100. package/payload/server/public/assets/stateDiagram-v2-QKLJ7IA2-Ch6qbhpm.js +0 -1
  101. /package/payload/server/public/assets/{jsx-runtime-Bz7aoCi7.js → jsx-runtime-BSJRynxp.js} +0 -0
@@ -1,12 +1,12 @@
1
- # Page — companion property landing page (`page.html`)
1
+ # Page — companion property landing page (`index.html`)
2
2
 
3
- The web bundle includes a **single-page property landing site** at `output/web/page.html`. The brochure is a folio for download; the landing page is the "for sale" web page a property micro-site or a portal page links to. They share the same web-tier images in `images/` but present the property differently — the brochure as an editorial document; the landing page as a continuous, scrollable web page.
3
+ The web bundle includes a **single-page property landing site** at `output/web/index.html`. The brochure is a folio for download; the landing page is the "for sale" web page a property micro-site or a portal page links to. They share the same web-tier images in `images/` but present the property differently — the brochure as an editorial document; the landing page as a continuous, scrollable web page.
4
4
 
5
- The landing page is **mandatory in the web bundle**. A property-brochure run that ships the brochure web bundle without `page.html` is incomplete.
5
+ The landing page is **mandatory in the web bundle**. A property-brochure run that ships the brochure web bundle without `index.html` is incomplete.
6
6
 
7
- ## Canonical reference — `references/page.html` is the only starting point
7
+ ## Canonical reference — `references/index.html` is the only starting point
8
8
 
9
- `references/page.html` ships with this skill alongside `references/template.html`. It is the **only** acceptable starting point for the landing page, exactly as `template.html` is the only acceptable starting point for the brochure. Every property-brochure run that produces a web bundle MUST start by copying `references/page.html` to `<property_dir>/output/web/page.html` and substituting the markers — never re-build the file from scratch from the prose in this reference.
9
+ `references/index.html` ships with this skill alongside `references/template.html`. It is the **only** acceptable starting point for the landing page, exactly as `template.html` is the only acceptable starting point for the brochure. Every property-brochure run that produces a web bundle MUST start by copying `references/index.html` to `<property_dir>/output/web/index.html` and substituting the markers — never re-build the file from scratch from the prose in this reference.
10
10
 
11
11
  The subsections below describe **why** the canonical is the way it is. They are **not** instructions to rebuild it. If the canonical file already encodes a rule (e.g. drop cap on the first paragraph of every body-block, the 3-slide Ken-Burns rotator with reduced-motion fallback, the hamburger drawer with full nav set on mobile), copying the canonical IS following the rule. The reference file's leading comment block lists the editorial decisions baked in — read it once before any substitution.
12
12
 
@@ -14,12 +14,12 @@ The subsections below describe **why** the canonical is the way it is. They are
14
14
 
15
15
  Per the same logic as the brochure's *Forbidden template sources*, do **not** start the landing page from any of:
16
16
 
17
- - A sibling property's rendered `output/web/page.html` (will inherit that property's hand-tuned text + image refs)
18
- - A previous version of `references/page.html` cached anywhere outside the live skill folder
17
+ - A sibling property's rendered `output/web/index.html` (will inherit that property's hand-tuned text + image refs)
18
+ - A previous version of `references/index.html` cached anywhere outside the live skill folder
19
19
  - The prose alone, hand-copying CSS/markup blocks from the section descriptions below
20
20
  - A "modern landing page generator" or any tool that produces a layout from scratch
21
21
 
22
- A run that reconstructs page.html from prose, even if the result *looks* close to the canonical, drifts every brochure cycle. The dropcap, the rotator timing, the `BRAND-SLUG-logo-dark.png` filename pattern, the sub-nav scroll behaviour, the drawer markup — all of it lives literally in `references/page.html`. Copy it.
22
+ A run that reconstructs index.html from prose, even if the result *looks* close to the canonical, drifts every brochure cycle. The dropcap, the rotator timing, the `BRAND-SLUG-logo-dark.png` filename pattern, the sub-nav scroll behaviour, the drawer markup — all of it lives literally in `references/index.html`. Copy it.
23
23
 
24
24
  ## How to populate
25
25
 
@@ -27,7 +27,7 @@ Two steps:
27
27
 
28
28
  1. **Bulk-substitute literal placeholders** (one find/replace pass each):
29
29
  - `PROPERTY-SLUG` → property slug (e.g. `warblers-lodge`). Rewrites every image src (`PROPERTY-SLUG-NN.webp`, `PROPERTY-SLUG-floorplan.png`, `PROPERTY-SLUG-hero-N-<role>.webp`) and the in-bundle PDF link (`PROPERTY-SLUG-brochure.pdf`).
30
- - `BRAND-SLUG` → brand slug (e.g. `rossmargetts`). Rewrites the brand logo path (`BRAND-SLUG-logo-dark.png` — the dark-art variant on the warm-paper top nav). The page.html canonical only uses the dark variant; the light variant is brochure-only.
30
+ - `BRAND-SLUG` → brand slug (e.g. `rossmargetts`). Rewrites the brand logo path (`BRAND-SLUG-logo-dark.png` — the dark-art variant on the warm-paper top nav). The index.html canonical only uses the dark variant; the light variant is brochure-only.
31
31
 
32
32
  2. **Substitute each `<!-- REPLACE: ... -->` block** with property-specific copy drawn from the seller brief and `property.json`. Walk the file top-to-bottom: `<title>`, meta description, top-nav utility links, drawer nav + foot, sticky sub-nav left/right, hero info-card (tag, title, address, price, meta, four spec cells, three link slots, CTA mailto subject), three hero slides + alt text, six body-block sections (Story, The Home, Bedrooms, The Garden, The Area — eyebrow + h2 + paragraphs), six photo grids (four cells each, 4:3 cover), floor-plan section meta, key-facts grid (~15 rows), CTA strip, footer.
33
33
 
@@ -77,7 +77,7 @@ If the property has no kitchen/garden distinction (e.g. an apartment), substitut
77
77
 
78
78
  The hero shows each image **fullscreen at viewport scale**, with a 1.05–1.20× Ken-Burns transform on top. That means a body-tier 1300 px @ q82 webp will visibly soften at typical desktop and Retina viewports. The hero needs its own encode tier:
79
79
 
80
- | Setting | Body tier (rest of `page.html`) | **Hero tier** |
80
+ | Setting | Body tier (rest of `index.html`) | **Hero tier** |
81
81
  |---|---|---|
82
82
  | Long edge | 1300 px (hero) / 1100 px (story) / 800 px (thumb) | **source resolution** (no `-resize`) — typically 1536–1600 px |
83
83
  | Quality | q82 / q80 / q76 | **q88** |
@@ -198,7 +198,7 @@ Some viewers find subtle continuous motion uncomfortable. The `@media (prefers-r
198
198
  The page has two image tiers:
199
199
 
200
200
  1. **Hero rotator** — three dedicated `<slug>-hero-1-main.webp`, `<slug>-hero-2-<role>.webp`, `<slug>-hero-3-<role>.webp` files at source resolution and q88. See **Hero — rotating Ken-Burns stage** above. These are *additional* files; they don't replace the body-tier images even when sourced from the same originals — the body-tier `<slug>-03.webp` is still used in the photo grids.
201
- 2. **Body photo grids** — `<slug>-NN.webp` at the body-tier (1300/1100/800 px @ q82/80/76) — the same images the brochure HTML references. Both `brochure.html` and `page.html` resolve them to the same file under `output/web/images/`.
201
+ 2. **Body photo grids** — `<slug>-NN.webp` at the body-tier (1300/1100/800 px @ q82/80/76) — the same images the brochure HTML references. Both `brochure.html` and `index.html` resolve them to the same file under `output/web/images/`.
202
202
 
203
203
  Distribute every brochure image across the photo grids — typically 24–28 unique images across 6 grids of 4. If the count doesn't divide cleanly (e.g. 23 images for 6 grids of 4 = 24 cells), reuse the cover hero in the final cell as a closing visual.
204
204
 
@@ -361,10 +361,10 @@ When testing at mobile widths, screenshot at three viewports: **390 × 844** (iP
361
361
 
362
362
  ## Bundling and smoke-test
363
363
 
364
- `page.html` is included in `<slug>-web.zip` automatically (the zip command zips everything in `output/web/`). After zipping, the smoke-test must include both `brochure.html` AND `page.html`:
364
+ `index.html` is included in `<slug>-web.zip` automatically (the zip command zips everything in `output/web/`). After zipping, the smoke-test must include both `brochure.html` AND `index.html`:
365
365
 
366
366
  ```bash
367
- for f in brochure.html page.html cover-print.jpg images/<slug>-01.webp images/<brand>-logo-dark.png <slug>-brochure.pdf; do
367
+ for f in brochure.html index.html cover-print.jpg images/<slug>-01.webp images/<brand>-logo-dark.png <slug>-brochure.pdf; do
368
368
  echo "$(curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8765/$f) $f"
369
369
  done
370
370
  ```
@@ -373,4 +373,4 @@ Both pages must return 200 and render correctly. The landing page should not exh
373
373
 
374
374
  ## When to regenerate
375
375
 
376
- `page.html` is regenerated whenever the brochure's image set changes (new photos, swapped slot assignments) or whenever the brochure's chapter copy materially changes (the landing page mirrors the brochure's narrative). Cosmetic CSS-only changes to the brochure don't require a landing-page regenerate. The landing page is *not* part of the canonical print archive — it lives only in `output/web/` and the zip.
376
+ `index.html` is regenerated whenever the brochure's image set changes (new photos, swapped slot assignments) or whenever the brochure's chapter copy materially changes (the landing page mirrors the brochure's narrative). Cosmetic CSS-only changes to the brochure don't require a landing-page regenerate. The landing page is *not* part of the canonical print archive — it lives only in `output/web/` and the zip.
@@ -1,6 +1,6 @@
1
1
  <!--
2
2
  ════════════════════════════════════════════════════════════════════════════
3
- COMPANION LANDING PAGE — page.html · canonical reference template
3
+ COMPANION LANDING PAGE — index.html · canonical reference template
4
4
  ════════════════════════════════════════════════════════════════════════════
5
5
 
6
6
  This file is the canonical starting point for the property micro-site that
@@ -13,7 +13,7 @@
13
13
  ─────────────────────
14
14
  Every property-specific value in this file is a {{ token }} placeholder.
15
15
  There is no exemplar copy left to accidentally inherit. After substitution,
16
- `grep "{{" output/web/page.html` must return ZERO matches — any remaining
16
+ `grep "{{" output/web/index.html` must return ZERO matches — any remaining
17
17
  {{ x }} is a bug.
18
18
 
19
19
  The full token list (with source field, format, length, voice) lives in
@@ -23,7 +23,7 @@
23
23
 
24
24
  Contract:
25
25
 
26
- 1. Copy this file to <property>/output/web/page.html.
26
+ 1. Copy this file to <property>/output/web/index.html.
27
27
  2. Substitute every {{ placeholder }} token from the master placeholders.md.
28
28
  3. Update <title>, meta description, OG/Twitter image refs.
29
29
  4. If a section does not apply (e.g. property has no garden complex), follow
@@ -40,7 +40,7 @@
40
40
  - Mobile collapse: top-nav → hamburger drawer at ≤960px; hero stacks at
41
41
  ≤760px; hero aspect 5/4 at ≤440px.
42
42
  - Type system: Cormorant Garamond (display) + Lora (body serif) + Inter
43
- (UI labels). DO NOT swap these per-brand — the page.html register is
43
+ (UI labels). DO NOT swap these per-brand — the index.html register is
44
44
  tuned to the canonical premium tier; brand identity lives in the logo,
45
45
  copy and brand-specific colour accents that may be added via :root
46
46
  overrides if needed (rare).
@@ -1,6 +1,6 @@
1
1
  # Placeholders — the substitution contract
2
2
 
3
- `template.html` and `page.html` are pure placeholder templates: every property-specific value is a `{{ token }}` token. There is no exemplar copy left to accidentally inherit. After rendering, `grep "{{" output/brochure.html` (and `output/web/page.html`) MUST return **zero matches**. Any remaining `{{ x }}` is a substitution bug.
3
+ `template.html` and `index.html` are pure placeholder templates: every property-specific value is a `{{ token }}` token. There is no exemplar copy left to accidentally inherit. After rendering, `grep "{{" output/brochure.html` (and `output/web/index.html`) MUST return **zero matches**. Any remaining `{{ x }}` is a substitution bug.
4
4
 
5
5
  This file is the substitution contract — the exhaustive list of every token used across both templates, what fills it, what format it takes, and what voice the copy tokens need. Style and composition guidance lives in `copy.md` (and is referenced inline from each `<!-- REPLACE: ... -->` comment in the templates). The two files are complementary: this one says **what** each token is; `copy.md` says **how** the copy should read.
6
6
 
@@ -11,7 +11,7 @@ Worked examples below quote the validated Sparrows Farm reference brochure at `/
11
11
  1. Open the seller brief at `<property_dir>/seller-brief.md` and `<property_dir>/property.json` side-by-side.
12
12
  2. Walk the categories below top-to-bottom — common tokens first (identity, brand, agent, listing, specs), then chapter-by-chapter editorial copy.
13
13
  3. For each token, write the substitution into a single dict / map keyed by token name. The substitution step at the end of `property-brochure` reads the map and rewrites both files in one pass.
14
- 4. Run the **completion check**: `grep -c "{{" output/brochure.html output/web/page.html`. Both files must return `0`. If any token is unsubstituted, it is a defect — the brochure is not shippable until every `{{ x }}` is gone.
14
+ 4. Run the **completion check**: `grep -c "{{" output/brochure.html output/web/index.html`. Both files must return `0`. If any token is unsubstituted, it is a defect — the brochure is not shippable until every `{{ x }}` is gone.
15
15
 
16
16
  ## Category 1 — Property identity
17
17
 
@@ -46,7 +46,7 @@ From the brand pack at `<brand_dir>/{description.md, DESIGN.md}` and `property.j
46
46
  | `{{ brand_name }}` | `description.md` first line | Title Case | "Muvin", "Beacons Real Estate". |
47
47
  | `{{ brand_town }}` | `description.md` officials block | Title Case | Branch town. |
48
48
  | `{{ brand_county }}` | `description.md` officials block | Title Case | |
49
- | `{{ brand_year }}` | Current year | YYYY | Used in the page.html footer copyright. |
49
+ | `{{ brand_year }}` | Current year | YYYY | Used in the index.html footer copyright. |
50
50
  | `{{ office_address_line_1 }}` | `description.md` registered office line | "25 Bell Street" | Street, first line of the postal address. |
51
51
  | `{{ office_address_line_2 }}` | `description.md` registered office line | "Sawbridgeworth, Hertfordshire CM21 9AR" | Locality + county + postcode. |
52
52
  | `{{ office_phone }}` | `property.json -> agent.phone` | Display format | "01873 377 575". |
@@ -208,7 +208,7 @@ Every `{{ mi_* }}` token corresponds to a Material Information row. Mark unknown
208
208
  | `{{ backpage_headline }}` | "Arrange a viewing of <em>{{ property_name }}</em>" — canonical phrasing. |
209
209
  | `{{ backpage_tagline }}` | 25-45 words. Mirrors but does not duplicate the cover/opener. Close with "Best understood in person." or equivalent clincher. |
210
210
 
211
- ## Category 9 — page.html (landing) editorial copy
211
+ ## Category 9 — index.html (landing) editorial copy
212
212
 
213
213
  The landing page mirrors the brochure's content but in a continuous-scroll form. Tokens are prefixed `landing_*` to avoid name collisions with the brochure tokens. Sections:
214
214
 
@@ -235,7 +235,7 @@ The substitution step that runs `property-brochure` should end with this verific
235
235
 
236
236
  ```bash
237
237
  PROP=<property_dir>
238
- remaining=$(grep -c '{{' "$PROP/output/brochure.html" "$PROP/output/web/page.html" 2>/dev/null | awk -F: '{s+=$2} END {print s}')
238
+ remaining=$(grep -c '{{' "$PROP/output/brochure.html" "$PROP/output/web/index.html" 2>/dev/null | awk -F: '{s+=$2} END {print s}')
239
239
  if [ "$remaining" -gt 0 ]; then
240
240
  echo "DEFECT: $remaining unsubstituted {{ tokens }} remain — see grep '{{' output/"
241
241
  exit 1
@@ -247,4 +247,4 @@ A brochure with any `{{ x }}` remaining in the rendered output is shipped broken
247
247
 
248
248
  ## Adding a new token
249
249
 
250
- If a property has a feature the canonical placeholder set doesn't cover (e.g. an annexe with separate utility, a wine cellar, a moat — they exist), do not invent a new token in the templates without also adding the entry here. The substitution contract is what catches the bug; an unlisted token gets silently ignored by the substitution step and the brochure ships with `{{ wine_cellar }}` literal in the body. Either reuse an existing token, or add the new one to this file AND to template.html/page.html before rendering.
250
+ If a property has a feature the canonical placeholder set doesn't cover (e.g. an annexe with separate utility, a wine cellar, a moat — they exist), do not invent a new token in the templates without also adding the entry here. The substitution contract is what catches the bug; an unlisted token gets silently ignored by the substitution step and the brochure ships with `{{ wine_cellar }}` literal in the body. Either reuse an existing token, or add the new one to this file AND to template.html/index.html before rendering.
@@ -1,5 +1,5 @@
1
1
  {
2
- "name": "maxy-server-deps",
2
+ "name": "maxy-code-server-deps",
3
3
  "private": true,
4
4
  "type": "module",
5
5
  "dependencies": {
@@ -1 +1 @@
1
- import{t as e}from"./jsx-runtime-Bz7aoCi7.js";var t=e();function n({checked:e,onChange:n,label:r,disabled:i}){return(0,t.jsxs)(`label`,{className:`maxy-checkbox${i?` maxy-checkbox--disabled`:``}`,children:[(0,t.jsx)(`input`,{type:`checkbox`,checked:e,onChange:e=>n(e.target.checked),disabled:i}),(0,t.jsx)(`span`,{className:`maxy-checkbox__box`,children:`✱`}),r&&(0,t.jsx)(`span`,{className:`maxy-checkbox__label`,children:r})]})}export{n as t};
1
+ import{t as e}from"./jsx-runtime-BSJRynxp.js";var t=e();function n({checked:e,onChange:n,label:r,disabled:i}){return(0,t.jsxs)(`label`,{className:`maxy-checkbox${i?` maxy-checkbox--disabled`:``}`,children:[(0,t.jsx)(`input`,{type:`checkbox`,checked:e,onChange:e=>n(e.target.checked),disabled:i}),(0,t.jsx)(`span`,{className:`maxy-checkbox__box`,children:`✱`}),r&&(0,t.jsx)(`span`,{className:`maxy-checkbox__label`,children:r})]})}export{n as t};