@rubytech/create-sitedesk-code 0.1.402 → 0.1.404

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 (59) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/plugins/web-designer/skills/web-design/references/placeholders.md +19 -2
  3. package/payload/platform/plugins/web-designer/skills/web-design/templates/index.html +12 -12
  4. package/payload/platform/scripts/check-no-esm-require.mjs +3 -0
  5. package/payload/premium-plugins/sitedesk/BUNDLE.md +6 -4
  6. package/payload/premium-plugins/sitedesk/PLUGIN.md +2 -2
  7. package/payload/premium-plugins/sitedesk/agents/sitedesk--media-producer.md +18 -7
  8. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/.claude-plugin/plugin.json +1 -1
  9. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/PLUGIN.md +30 -26
  10. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/README.md +26 -36
  11. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/commands/make-media.md +2 -2
  12. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/microsite/SKILL.md +52 -75
  13. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/socials/SKILL.md +52 -120
  14. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/socials/references/sources.md +17 -52
  15. package/payload/server/public/assets/{AdminLoginScreens-rlk263u9.js → AdminLoginScreens-BzErD9Zo.js} +1 -1
  16. package/payload/server/public/assets/AdminShell-BihejKg_.js +1 -0
  17. package/payload/server/public/assets/{Checkbox-Chz6bfy-.js → Checkbox-Ds004CBE.js} +1 -1
  18. package/payload/server/public/assets/{Transcript-Bsx-bGgY.js → Transcript-CgaMQKgY.js} +1 -1
  19. package/payload/server/public/assets/{admin-BnZH758N.js → admin-BSuRtMws.js} +1 -1
  20. package/payload/server/public/assets/{browser-CIrfyZWe.js → browser-BO2eR_YY.js} +1 -1
  21. package/payload/server/public/assets/{calendar-D6Z8Kmrn.js → calendar-12QuR_oh.js} +1 -1
  22. package/payload/server/public/assets/chat-Qpyg5t65.js +1 -0
  23. package/payload/server/public/assets/chevron-left-DBUeR2CX.js +1 -0
  24. package/payload/server/public/assets/data-Ch5bne41.js +1 -0
  25. package/payload/server/public/assets/{graph-XZJZHzvv.js → graph-CDOJZepc.js} +1 -1
  26. package/payload/server/public/assets/{graph-labels-Cabqmf35.js → graph-labels-6HKBjyXX.js} +1 -1
  27. package/payload/server/public/assets/{maximize-2-DPe-Noig.js → maximize-2-DWmyXX8h.js} +1 -1
  28. package/payload/server/public/assets/{operator-BM_CDyCb.js → operator-D-s7jVnf.js} +1 -1
  29. package/payload/server/public/assets/{page-CMIbXzSg.js → page-BcxrdxYL.js} +1 -1
  30. package/payload/server/public/assets/{page-E7I5sEVt.js → page-rDhp8G9q.js} +1 -1
  31. package/payload/server/public/assets/{public-CrdWCSk2.js → public-zK67N3z2.js} +1 -1
  32. package/payload/server/public/assets/{rotate-ccw-Dwtj0NJ7.js → rotate-ccw-BzBJxqBN.js} +1 -1
  33. package/payload/server/public/assets/useSubAccountSwitcher-B-GuP1jj.css +1 -0
  34. package/payload/server/public/browser.html +4 -4
  35. package/payload/server/public/calendar.html +5 -5
  36. package/payload/server/public/chat.html +9 -9
  37. package/payload/server/public/data.html +8 -8
  38. package/payload/server/public/graph.html +9 -9
  39. package/payload/server/public/index.html +11 -11
  40. package/payload/server/public/operator.html +11 -11
  41. package/payload/server/public/public.html +9 -9
  42. package/payload/server/server.js +32 -32
  43. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/brand-extract/SKILL.md +0 -86
  44. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/make-media/SKILL.md +0 -75
  45. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/make-media/references/intake-and-questions.md +0 -74
  46. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/microsite/references/placeholders.md +0 -96
  47. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/microsite/references/sections.md +0 -48
  48. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/microsite/templates/index.html +0 -1004
  49. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/microsite/templates/llms.txt +0 -32
  50. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/socials/references/pii-strip.md +0 -64
  51. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/socials/templates/og.html +0 -92
  52. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/socials/templates/social-posts.md +0 -47
  53. package/payload/premium-plugins/sitedesk/plugins/sitedesk-media/skills/socials/templates/socials.html +0 -87
  54. package/payload/server/public/assets/AdminShell-C5vWTy2n.js +0 -1
  55. package/payload/server/public/assets/chat-h7SytZHx.js +0 -1
  56. package/payload/server/public/assets/chevron-left-DSTeS1_g.js +0 -1
  57. package/payload/server/public/assets/data-CL7CyX1C.js +0 -1
  58. package/payload/server/public/assets/useSubAccountSwitcher-BH-YjP0H.css +0 -1
  59. /package/payload/server/public/assets/{useSubAccountSwitcher-BVCMAnWK.js → useSubAccountSwitcher-Bg0RH3Gk.js} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rubytech/create-sitedesk-code",
3
- "version": "0.1.402",
3
+ "version": "0.1.404",
4
4
  "description": "Install SiteDesk — automated back office for independent building contractors",
5
5
  "bin": {
6
6
  "create-sitedesk-code": "./dist/index.js"
@@ -45,8 +45,25 @@ with a `<strong>lead-in.</strong>`) ·
45
45
  `CRAFT_HEADLINE` `CRAFT_PARA_1..3` (the "How we work" block).
46
46
 
47
47
  The `BUILD_*` / `CRAFT_*` token names are historical; the visible sections read
48
- **What we do** and **How we work**. Fill them with the business's real offer and
49
- way of working, in plain language.
48
+ **What we do** and **How we work** by default. Fill them with the business's real
49
+ offer and way of working, in plain language.
50
+
51
+ ## Section framing (nav labels, eyebrows, section IDs) — defaulted
52
+
53
+ These seven tokens carry the generic framing of the two middle body sections and
54
+ their nav links. **Each defaults to its generic value** below; fill the default
55
+ unless the business is framed differently (for example a construction trade that
56
+ says "What we build" / "Our craft"). The nav label and the eyebrow of a section are
57
+ separate tokens because they need not match.
58
+
59
+ - `NAV_STORY_LABEL` — the story-section nav label. Default `About`.
60
+ - `NAV_OFFER_LABEL` — the offer-section nav label. Default `What we do`.
61
+ - `NAV_HOW_LABEL` — the process-section nav label. Default `How we work`.
62
+ - `OFFER_EYEBROW` — the offer-section eyebrow. Default `What we do`.
63
+ - `HOW_EYEBROW` — the process-section eyebrow. Default `Start to finish`.
64
+ - `OFFER_SECTION_ID` — the offer section's anchor id (nav `href` + article `id`).
65
+ Default `offer`.
66
+ - `HOW_SECTION_ID` — the process section's anchor id. Default `how`.
50
67
 
51
68
  ## Photo alts (grids and full-bleed)
52
69
 
@@ -635,9 +635,9 @@
635
635
  <span></span><span></span><span></span>
636
636
  </button>
637
637
  <div class="left">
638
- <a href="#story">About</a>
639
- <a href="#offer">What we do</a>
640
- <a href="#how">How we work</a>
638
+ <a href="#story">{{ NAV_STORY_LABEL }}</a>
639
+ <a href="#{{ OFFER_SECTION_ID }}">{{ NAV_OFFER_LABEL }}</a>
640
+ <a href="#{{ HOW_SECTION_ID }}">{{ NAV_HOW_LABEL }}</a>
641
641
  <a href="#founder">{{ FOUNDER_SECTION_LABEL }}</a>
642
642
  </div>
643
643
  <div class="center">
@@ -654,9 +654,9 @@
654
654
  <div class="drawer" id="drawer" aria-hidden="true">
655
655
  <button class="drawer-close" aria-label="Close menu">&times;</button>
656
656
  <nav class="drawer-nav">
657
- <a href="#story">About</a>
658
- <a href="#offer">What we do</a>
659
- <a href="#how">How we work</a>
657
+ <a href="#story">{{ NAV_STORY_LABEL }}</a>
658
+ <a href="#{{ OFFER_SECTION_ID }}">{{ NAV_OFFER_LABEL }}</a>
659
+ <a href="#{{ HOW_SECTION_ID }}">{{ NAV_HOW_LABEL }}</a>
660
660
  <a href="#founder">{{ FOUNDER_SECTION_LABEL }}</a>
661
661
  <a href="#words">Reviews</a>
662
662
  <a href="#services">Services</a>
@@ -679,7 +679,7 @@
679
679
  <span class="price">{{ SECTOR_LABEL }} · Est. {{ ESTABLISHED_YEAR }}</span>
680
680
  </div>
681
681
  <div class="right">
682
- <a href="#how">How we work</a>
682
+ <a href="#{{ HOW_SECTION_ID }}">{{ NAV_HOW_LABEL }}</a>
683
683
  <a href="#services">Services</a>
684
684
  <a href="#words">Reviews</a>
685
685
  <a href="mailto:{{ EMAIL }}?subject=Project%20enquiry" class="cta">Get in touch</a>
@@ -713,7 +713,7 @@
713
713
  <span>{{ HERO_SPEC_4 }}</span>
714
714
  </div>
715
715
  <div class="links">
716
- <a href="#offer">Our work</a>
716
+ <a href="#{{ OFFER_SECTION_ID }}">Our work</a>
717
717
  <a href="#words">Reviews</a>
718
718
  <a href="#services">Services</a>
719
719
  </div>
@@ -741,8 +741,8 @@
741
741
  </div>
742
742
 
743
743
  <!-- WHAT WE DO -->
744
- <article class="body-block" id="offer">
745
- <div class="section-eyebrow">What we do</div>
744
+ <article class="body-block" id="{{ OFFER_SECTION_ID }}">
745
+ <div class="section-eyebrow">{{ OFFER_EYEBROW }}</div>
746
746
  <h2>{{ BUILD_HEADLINE }}</h2>
747
747
  <p>{{ BUILD_PARA_1 }}</p>
748
748
  <p>{{ BUILD_PARA_2 }}</p>
@@ -758,8 +758,8 @@
758
758
  </div>
759
759
 
760
760
  <!-- HOW WE WORK -->
761
- <article class="body-block" id="how">
762
- <div class="section-eyebrow">Start to finish</div>
761
+ <article class="body-block" id="{{ HOW_SECTION_ID }}">
762
+ <div class="section-eyebrow">{{ HOW_EYEBROW }}</div>
763
763
  <h2>{{ CRAFT_HEADLINE }}</h2>
764
764
  <p>{{ CRAFT_PARA_1 }}</p>
765
765
  <p>{{ CRAFT_PARA_2 }}</p>
@@ -50,6 +50,9 @@ const ALLOWLIST = new Set([
50
50
  // Same vi.hoisted pattern: Task 576's claude-auth refresh-lock test
51
51
  // builds a tmpdir + creds path before the module's `../paths` mock fires.
52
52
  'platform/ui/app/lib/__tests__/claude-auth-refresh-lock.test.ts',
53
+ // Same vi.hoisted pattern: Task 1410's claude-auth atomic-write test
54
+ // builds a tmpdir + creds path before the module's `../paths` mock fires.
55
+ 'platform/ui/app/lib/__tests__/claude-auth-atomic-write.test.ts',
53
56
  // Task 666: the module under test is a pure .cjs preload
54
57
  // (server-init-line-stamper.cjs); the test loads it via the sanctioned
55
58
  // createRequire(import.meta.url) ESM→CJS bridge, not a raw require.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: sitedesk
3
- description: "SiteDesk premium bundle for independent service businesses. Two sub-plugins: sitedesk-media turns an operator's photos, website, social links and notes into a marketing micro-site plus share-ready social tiles; sitedesk-job captures the operator's own pricing/quotation method and applies it to produce the live quote, and issues recurring interim valuations (progress claims) from carried job state with a deterministic roll-up, and rolls up field workers' daily check-ins into per-worker timesheets and CIS invoices. Brand-agnostic — no client content ships in the templates or the pricing/job tree. 7 skills, 0 MCP tools."
3
+ description: "SiteDesk premium bundle for independent service businesses. Two sub-plugins: sitedesk-media turns an operator's photos, website, social links and notes into a marketing micro-site plus share-ready social tiles; sitedesk-job captures the operator's own pricing/quotation method and applies it to produce the live quote, and issues recurring interim valuations (progress claims) from carried job state with a deterministic roll-up, and rolls up field workers' daily check-ins into per-worker timesheets and CIS invoices. Brand-agnostic — no client content ships in the templates or the pricing/job tree. 5 skills, 0 MCP tools."
4
4
  plugins:
5
5
  - sitedesk-media
6
6
  - sitedesk-job
@@ -27,12 +27,14 @@ as `plugin:sitedesk:<name>` — so it contributes four `installedPremiumSpeciali
27
27
  entries on any brand that ships `sitedesk`. Each owns one deliverable and the
28
28
  skill(s) that produce it: `quoter` owns `quotation`, `valuer` owns `valuation`,
29
29
  `payroll-clerk` owns `timesheet` (the three `sitedesk-job` skills), and
30
- `media-producer` owns the four `sitedesk-media` skills. The admin agent dispatches
31
- the one whose deliverable matches the brief via `subagent_type`.
30
+ `media-producer` owns the two `sitedesk-media` skills the construction `microsite`
31
+ wrapper and the `job`/`valuation` `socials` adapter over the shared `web-designer`
32
+ builder. The admin agent dispatches the one whose deliverable matches the brief via
33
+ `subagent_type`.
32
34
 
33
35
  ## Sub-Plugins
34
36
 
35
37
  | Sub-Plugin | Skills | MCP Tools | Focus |
36
38
  |---|---|---|---|
37
- | `sitedesk-media` | 4 | — | Marketing collateral pipelinebrand extract, single-page micro-site, Open Graph + social tiles with gallery and captions. From an operator's photos + website + social links + notes, asking questions to fill every gap. |
39
+ | `sitedesk-media` | 2 | — | Marketing collateral over the shared `web-designer` builder a construction `microsite` wrapper (web-designer's site with construction framing as input) and a `socials` job/valuation adapter (renders job progress through web-designer's tile core under the money boundary). Generic brand-extract, build, and rendering are web-designer's. |
38
40
  | `sitedesk-job` | 3 | — | Job-centric workflows — `quotation` captures the operator's own pricing method (items, quantity rules, pricing rules, roll-up, documents) and applies it to produce the live quote; `valuation` sets up a job and issues its recurring interim valuations (progress claims) from carried state and a per-cycle delta, with a deterministic roll-up that reconciles to the penny; `timesheet` rolls up field workers' daily check-ins into per-worker timesheets and CIS invoices for a period, reconciled to the penny. No business content ships; everything is the operator's data. |
@@ -11,8 +11,8 @@ they appear in the native Claude Code subagent registry as
11
11
  `plugin:sitedesk:<name>`. Each owns one deliverable and the skill(s) that
12
12
  produce it: `quoter` the `quotation` skill, `valuer` the `valuation` skill,
13
13
  `payroll-clerk` the `timesheet` skill (all three in `sitedesk-job`), and
14
- `media-producer` the `sitedesk-media` skills (`make-media`, `brand-extract`,
15
- `microsite`, `socials`).
14
+ `media-producer` the two `sitedesk-media` skills (`microsite`, `socials`) over the
15
+ shared `web-designer` builder.
16
16
 
17
17
  No tools, hooks, or commands are declared at this layer — the sub-plugins under
18
18
  `plugins/` register via their own `PLUGIN.md` and carry the skills and commands.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: media-producer
3
- description: "SiteDesk media producer. Delegate when the deliverable is marketing collateral — turning an operator's photos, website, social links and notes into a marketing micro-site plus share-ready social tiles. Owns the whole media pipeline: brand extract, single-page micro-site, and Open Graph plus social tiles with gallery and captions. Not for job pricing, valuations or timesheets (those are the quoter, valuer and payroll-clerk)."
3
+ description: "SiteDesk media producer. Delegate when the deliverable is marketing collateral — turning an operator's photos, website, social links and notes into a construction micro-site plus share-ready social tiles. Owns the media deliverable end to end, built on the shared web-designer builder: brand extract, single-page micro-site with construction framing, and Open Graph plus social tiles with gallery and captions. Not for job pricing, valuations or timesheets (those are the quoter, valuer and payroll-clerk)."
4
4
  summary: "Your media producer — turns an operator's photos, website and notes into a marketing micro-site and social tiles."
5
5
  model: claude-sonnet-5
6
6
  tools: Skill, Read, Write, Edit, Bash, Glob, Grep, WebFetch, mcp__plugin_browser_browser__browser-navigate, mcp__plugin_browser_browser__browser-evaluate, mcp__plugin_browser_browser__browser-render, mcp__plugin_browser_browser__browser-resize, mcp__plugin_browser_browser__browser-screenshot, mcp__plugin_browser_browser__browser-wait-for
@@ -18,16 +18,27 @@ You never invent the operator's business content. Brand facts, copy and the sour
18
18
 
19
19
  ## What you own
20
20
 
21
- Load each skill on demand with the `Skill` tool; it carries its own method.
21
+ You own two SiteDesk skills the construction `microsite` wrapper and the
22
+ `socials` job/valuation adapter. The shared builder underneath them is the
23
+ `web-designer` plugin; you drive its skills directly. Load each skill on demand with
24
+ the `Skill` tool; it carries its own method.
22
25
 
23
26
  | Skill | Sub-plugin | What it does |
24
27
  |-------|------------|--------------|
25
- | `make-media` | `sitedesk-media` | Single-entry orchestrator: intake ask the gaps → `brand-extract` `microsite` → `socials`. Use when the deliverable is "a website and social images for this business" from mixed source material. |
26
- | `brand-extract` | `sitedesk-media` | Turn an existing website into a brand pack tokenized palette, logo/icon image files, and a `brand.md` of company facts plus an explicit "still unknown" list. |
27
- | `microsite` | `sitedesk-media` | Build the scrollable single-page micro-site (`site/` directory: `index.html` + `llms.txt`, with JSON-LD) from the placeholder template, brand pack, photos and copy. |
28
- | `socials` | `sitedesk-media` | Render exact-size Open Graph and social tiles (1200×628, 1200×1200, 1080×1350) as PNG for a named subject, with a PII gate for any client-data source, a gallery with download links, captions for all five platforms, and a redaction report; wires the site's `og:image` for micro-sites. Drives the on-device `browser` plugin to screenshot each tile at its exact viewport. |
28
+ | `microsite` | `sitedesk-media` | Build the construction micro-site by driving `web-designer:web-design` with the construction framing (schema, UK geography, the trade-shaped section labels) as inputs. Owns no template. |
29
+ | `socials` | `sitedesk-media` | Render social tiles for a SiteDesk subject. `microsite`/`bespoke` delegate to `web-designer:socials`; `job`/`valuation` read the job's progress under the money boundary and render through `web-designer:socials` bespoke mode. |
29
30
 
30
- When the operator asks for the full marketing deliverable, run `make-media` — it orchestrates the other three. Run the individual media skills directly only when the upstream output already exists.
31
+ The generic builder underneath is web-designer's, dispatched directly:
32
+
33
+ | Skill | Plugin | What it does |
34
+ |-------|--------|--------------|
35
+ | `brand-extract` | `web-designer` | Turn an existing website into a brand pack — tokenized palette, logo/icon files, and a `brand.md` of company facts plus a "still unknown" list. |
36
+ | `web-design` | `web-designer` | The single canonical single-page site template, substitution contract, image convention, and page-state verification. `microsite` supplies the construction inputs. |
37
+ | `socials` | `web-designer` | The tile render core (exact-size PNG tiles, gallery, captions, PII gate, og:image wiring). SiteDesk's `socials` delegates here. |
38
+
39
+ For the full marketing deliverable — a site and its social tiles — orchestrate the
40
+ steps yourself: `web-designer:brand-extract` → `microsite` → `socials`. Run any one
41
+ skill directly when the upstream output already exists.
31
42
 
32
43
  ## Output contract
33
44
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sitedesk-media",
3
- "description": "Turn an operator's raw inputs (a folder or zip of photos, an existing website URL, social-media links, and any notes about the business) into a finished marketing micro-site plus a set of share-ready Open Graph and social tiles. A single-entry orchestrator extracts the brand, asks the operator targeted questions to fill every gap, builds a scrollable single-page site (hero rotator, story, founder section, testimonial, services, FAQ, AEO/JSON-LD), then renders the social tiles with a gallery and captions. Brand-agnostic: all copy and tokens live as placeholders in the templates.",
3
+ "description": "Turn an operator's raw inputs (a folder or zip of photos, an existing website URL, social-media links, and any notes about the business) into a finished construction micro-site plus a set of share-ready Open Graph and social tiles. Built on the shared web-designer builder: web-designer extracts the brand, builds the single-page site, and renders the tiles; SiteDesk supplies the construction framing and the job/valuation social subjects. Brand-agnostic: no client content ships here, and no builder template is copied.",
4
4
  "version": "0.1.0",
5
5
  "author": {
6
6
  "name": "Rubytech LLC"
@@ -1,49 +1,53 @@
1
1
  ---
2
2
  name: sitedesk-media
3
- description: "Turn an operator's raw inputs (a folder or zip of photos, an existing website URL, social-media links, and any notes about the business) into a finished marketing micro-site plus a set of share-ready Open Graph and social tiles. A single-entry orchestrator extracts the brand, asks the operator targeted questions to fill every gap, builds a scrollable single-page site (hero rotator, story, founder section, testimonial, services, FAQ, AEO/JSON-LD), then renders the social tiles with a gallery and captions. Brand-agnostic: all copy and tokens live as placeholders in the templates."
3
+ description: "Turn an operator's raw inputs (a folder or zip of photos, an existing website URL, social-media links, and any notes about the business) into a finished construction micro-site plus a set of share-ready Open Graph and social tiles. Built on the shared web-designer builder: web-designer extracts the brand, builds the single-page site, and renders the tiles; SiteDesk supplies the construction framing and the job/valuation social subjects. Brand-agnostic: no client content ships here, and no builder template is copied."
4
4
  tools: []
5
5
  metadata: {"platform":{"optional":true,"embed":["admin"]}}
6
6
  ---
7
7
 
8
8
  # SiteDesk — Media
9
9
 
10
- End-to-end marketing-collateral pipeline. From an operator's photos, their
11
- existing website, social links and any notes, the skills produce a self-contained
12
- `site/` directory a scrollable single-page micro-site (`index.html` + `llms.txt`)
13
- plus a `socials/` folder of Open Graph and social tiles with a gallery and
14
- captions. The agent extracts the brand, then asks the operator to fill every gap;
15
- it never invents a fact.
10
+ Marketing collateral for an independent building contractor, built on the shared
11
+ `web-designer` plugin. From an operator's photos, their existing website, social
12
+ links and any notes, the pipeline produces a self-contained `site/` directory — a
13
+ scrollable single-page micro-site (`index.html` + `llms.txt`) plus a `socials/`
14
+ folder of Open Graph and social tiles with a gallery and captions. web-designer owns
15
+ the brand extraction, the site template, and the tile render core; SiteDesk owns the
16
+ construction framing and the job/valuation social subjects. The agent never invents a
17
+ fact — it extracts and asks.
16
18
 
17
19
  ## When to Activate
18
20
 
19
- The operator wants a website and social images for a service business, built from
20
- mixed source material (photos + a site + social links + notes).
21
+ The operator wants a construction micro-site and social images for a building firm,
22
+ built from mixed source material (photos + a site + social links + notes), or social
23
+ tiles for a live job's progress.
21
24
 
22
25
  ## Skills
23
26
 
24
27
  | Skill | Purpose |
25
28
  |-------|---------|
26
- | `make-media` | Single-entry orchestrator intake ask the gaps brand-extract microsite socials |
27
- | `brand-extract` | Pull a tokenized palette, logo/icon, and company facts (plus an explicit "still unknown" list) from an existing website |
28
- | `microsite` | Build the scrollable single-page site from the placeholder template + brand + photos + answers |
29
- | `socials` | Render exact-size Open Graph + social tiles (PNG) and captions for a named subject micro-site, job, valuation, or bespoke — with a PII gate for client-data sources; gallery + redaction report; wires og:image for micro-sites |
29
+ | `microsite` | Build the construction micro-site by driving `web-designer:web-design` with the construction framing (schema, UK geography, trade-shaped section labels) as inputs. Owns no template. |
30
+ | `socials` | Render social tiles for a SiteDesk subject. `microsite`/`bespoke` delegate to `web-designer:socials`; `job`/`valuation` read the job's progress under the money boundary and render through `web-designer:socials` bespoke mode. |
31
+
32
+ The generic builder`brand-extract`, the `web-design` template and substitution
33
+ contract, and the `socials` tile render core — is the `web-designer` plugin's, used
34
+ as-is.
30
35
 
31
36
  ## Commands
32
37
 
33
- `/make-media <images-dir-or-zip> [website-url] [social-links] [notes…]` — run the full pipeline.
38
+ `/make-media <images-dir-or-zip> [website-url] [social-links] [notes…]` — orchestrate
39
+ the full pipeline (`web-designer:brand-extract` → `microsite` → `socials`).
34
40
 
35
41
  ## Tools Used
36
42
 
37
43
  No MCP server of its own. Skills operate via existing platform tools (Bash, Read,
38
- Write, Edit, Glob, Grep, WebFetch). Tile rendering uses the on-device `browser`
39
- plugin (Chrome DevTools Protocol): it sets the viewport and screenshots each tile at
40
- its exact size against the device's running Chromium — no Playwright ships on a Pi.
41
- The image encoder for site photos is `cwebp` (libwebp); the browser plugin writes
42
- tiles as PNG.
43
-
44
- ## Templates
45
-
46
- All copy and colour are placeholders no client data ships in the templates.
47
- The token dictionary is in `skills/microsite/references/placeholders.md`; the
48
- section + image map is in `skills/microsite/references/sections.md`; the operator
49
- question set is in `skills/make-media/references/intake-and-questions.md`.
44
+ Write, Edit, Glob, Grep, WebFetch) and the `Skill` tool to drive the web-designer
45
+ skills. Tile rendering is web-designer's, which drives the on-device `browser` plugin
46
+ to screenshot each tile at its exact size.
47
+
48
+ ## No templates ship here
49
+
50
+ The site template, the placeholder dictionary, the section + image map, and the tile
51
+ render templates all live in `web-designer`. SiteDesk's `microsite` supplies the
52
+ construction values as inputs; SiteDesk's `socials` keeps only the `job`/`valuation`
53
+ source contract in `skills/socials/references/sources.md`.
@@ -1,19 +1,19 @@
1
1
  # sitedesk-media
2
2
 
3
3
  Turn an operator's raw inputs — a folder of photos, an existing website, social
4
- links, and any notes about the business — into a finished marketing **micro-site**
5
- plus a set of **share-ready social tiles**. The agent extracts the brand, asks the
6
- operator targeted questions to fill every gap, then builds the site and the social
7
- collateral. All copy and colour live as placeholders in the templates, so the
8
- pipeline is brand-agnostic.
4
+ links, and any notes about the business — into a finished construction **micro-site**
5
+ plus a set of **share-ready social tiles**. Built on the shared `web-designer`
6
+ plugin: web-designer extracts the brand, builds the single-page site, and renders the
7
+ tiles; SiteDesk adds the construction framing and the job/valuation social subjects.
8
+ No client content and no builder template ship here.
9
9
 
10
10
  ## Pipeline
11
11
 
12
12
  ```
13
- make-media (orchestrator: intake → ask the gaps → route the steps)
14
- ├─ brand-extract website → palette tokens + logo/icon + company facts (+ gaps)
15
- ├─ microsite templates + brand + photos + answers → site/index.html + llms.txt
16
- └─ socials resolved subject og/social tiles (PNG) + gallery + captions
13
+ /make-media (media-producer orchestrates the steps)
14
+ ├─ web-designer:brand-extract website → palette tokens + logo/icon + company facts (+ gaps)
15
+ ├─ microsite drives web-designer:web-design with construction framing → site/index.html + llms.txt
16
+ └─ socials microsite/bespokeweb-designer:socials; job/valuation staged brief web-designer:socials bespoke
17
17
  ```
18
18
 
19
19
  Run it with the command:
@@ -22,9 +22,8 @@ Run it with the command:
22
22
  /make-media <images-dir-or-zip> [website-url] [social-links] [notes…]
23
23
  ```
24
24
 
25
- or invoke the `make-media` skill directly. Each sub-skill is also usable on its
26
- own (`brand-extract` for just tokens + logo; `microsite` for just the page;
27
- `socials` for just the tiles).
25
+ Each step is also usable on its own (`web-designer:brand-extract` for just tokens +
26
+ logo; `microsite` for just the page; `socials` for just the tiles).
28
27
 
29
28
  ## What you get
30
29
 
@@ -36,35 +35,26 @@ own (`brand-extract` for just tokens + logo; `microsite` for just the page;
36
35
  socials.html # tile gallery + OG meta snippet
37
36
  social-posts.md # captions per tile and platform
38
37
  og.html # tile render page (kept for re-runs)
39
- <output>/<brand-slug>-microsite.zip
40
38
  ```
41
39
 
42
40
  ## Principles
43
41
 
44
- - **Ask, never invent.** Every placeholder is a fact about a real business. What
45
- the website and the operator's notes don't supply, the agent asks for. A guessed
46
- year, phone number, or testimonial is a defect.
47
- - **Keep claims as claims.** "Trading since 1987" is not an incorporation date;
48
- "over 35 years" is not a company age. Company-registration facts come from the
49
- register or the operator, never a marketing line.
50
- - **Verify images by eye, name by convention.** Photos are matched to slots by
51
- content (never filename), optimised to webp, and a person is only ever shown in
52
- the founder slots and a portrait-only tile.
42
+ - **Ask, never invent.** Every fact is about a real business. What the website and
43
+ the operator's notes don't supply, the agent asks for. A guessed year, phone
44
+ number, or testimonial is a defect.
45
+ - **Keep claims as claims.** "Trading since 1987" is not an incorporation date.
46
+ Company-registration facts come from the register or the operator, never a
47
+ marketing line.
48
+ - **The money boundary is absolute.** A job or valuation tile carries the progress,
49
+ never a figure: no contract, valuation, or payment amount, no `pctComplete` value,
50
+ no client identifier. The read never touches the money fields.
53
51
  - **Plain register for all copy.** No em-dashes, no inflation vocabulary, no
54
52
  AI-marketing cadence. Real testimonials are used verbatim.
55
- - **Built for answer engines.** The site ships `JSON-LD` (business + FAQ),
56
- Open Graph tiles, and an `llms.txt`.
57
53
 
58
- ## Templates (all placeholder, no client data)
54
+ ## What lives where
59
55
 
60
- ```
61
- skills/microsite/templates/index.html # the single-page site
62
- skills/microsite/templates/llms.txt
63
- skills/socials/templates/og.html # tile render page
64
- skills/socials/templates/socials.html
65
- skills/socials/templates/social-posts.md
66
- ```
67
-
68
- The full token dictionary is in `skills/microsite/references/placeholders.md`; the
69
- section + image map is in `skills/microsite/references/sections.md`; the operator
70
- question set is in `skills/make-media/references/intake-and-questions.md`.
56
+ SiteDesk owns two thin skills — `skills/microsite/SKILL.md` (the construction
57
+ wrapper) and `skills/socials/SKILL.md` plus `skills/socials/references/sources.md`
58
+ (the job/valuation source contract and the money boundary). Everything else — the
59
+ site template, the placeholder dictionary, the section + image map, and the tile
60
+ render templates — is `web-designer`'s.
@@ -4,10 +4,10 @@ argument-hint: <images-dir-or-zip> [website-url] [social-links] [notes…]
4
4
  allowed-tools: Bash, Read, Write, Edit, Glob, Grep, WebFetch, Skill, AskUserQuestion
5
5
  ---
6
6
 
7
- Run the `make-media` skill end-to-end on the inputs below.
7
+ Build the media deliverable end-to-end on the inputs below, orchestrating the steps yourself.
8
8
 
9
9
  Inputs: $ARGUMENTS
10
10
 
11
- Follow the orchestrator's routing: `brand-extract` (website + logo + tokens + company facts) → ask the operator the intake questions for every field still missing → `microsite` (build the single-page site into `<output>/site/`) → `socials` in `microsite` mode (render the Open Graph + social tiles, gallery and captions into `<output>/site/socials/`).
11
+ Route: `web-designer:brand-extract` (website + logo + tokens + company facts) → ask the operator for every field still missing → `microsite` (drives `web-designer:web-design` with the construction framing to build the single-page site into `<output>/site/`) → `socials` in `microsite` mode (renders the Open Graph + social tiles, gallery and captions into `<output>/site/socials/` via `web-designer:socials`).
12
12
 
13
13
  Never invent a fact. Where the website and the operator's notes do not supply a value, ask for it before building. Stop at the finished site + social bundle and report the paths.
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  name: microsite
3
- description: Build a finished, scrollable single-page marketing micro-site for a small business from the placeholder template, the brand pack, and the operator's curated photos and copy. Produces a self-contained site/ directory — index.html (hero rotator, story, services, founder section, testimonial, "by the numbers", FAQ, CTA, footer, back-to-top) plus an llms.txtwith structured data (JSON-LD) for answer engines. Use after brand-extract, or directly when the brand pack and copy already exist. Trigger phrases include "build the microsite", "lay out the landing page", "turn this brand + photos into a one-page site".
3
+ description: Build SiteDesk's construction micro-site by driving the shared web-designer builder with construction framing. Runs web-designer:web-design against the brand pack, the operator's copy and their curated photos, supplying the construction schema, UK geography, and the trade-shaped section labels as inputs. Owns no templatethe single source is web-designer's. Use after brand-extract, or directly when the brand pack and copy already exist. Trigger phrases include "build the microsite", "lay out the landing page", "turn this brand + photos into a one-page site".
4
4
  allowed-tools:
5
+ - Skill
5
6
  - Bash
6
7
  - Read
7
8
  - Write
@@ -12,77 +13,53 @@ allowed-tools:
12
13
 
13
14
  # microsite
14
15
 
15
- Renders the canonical single-page site from `templates/index.html` and
16
- `templates/llms.txt` by substituting every `{{ PLACEHOLDER }}`. The template is
17
- the spec: copy it, fill it, never rebuild it from scratch from this prose.
18
-
19
- ## Canonical template — the only starting point
20
-
21
- `templates/index.html` ships with this skill. It encodes the entire site —
22
- structure, CSS, the JS hero rotator + drawer + sticky sub-nav + back-to-top, the
23
- responsive rules, and the JSON-LD with every business-specific value as a
24
- `{{ TOKEN }}`. Copy it to `<output>/site/index.html` and substitute. Do the same
25
- with `templates/llms.txt`. The full token list and what fills each is in
26
- [`references/placeholders.md`](references/placeholders.md); the section catalogue
27
- and the image-naming convention are in [`references/sections.md`](references/sections.md).
28
-
29
- A run that hand-builds the HTML from this prose, or starts from a previous
30
- client's rendered `index.html`, is a defect it drifts every cycle. Copy the
31
- canonical and substitute.
32
-
33
- ## Substitution contract
34
-
35
- - After substitution, `grep "{{" site/index.html site/llms.txt` returns **zero**
36
- matches. Any surviving `{{ }}` is a bug.
37
- - Palette tokens come from the brand pack's ten values. `ACCENT_TEXT` is the
38
- deepened, legible form of `ACCENT` — not the same value.
39
- - Copy tokens are written in the plain register (the `plainly` skill): no
40
- em-dashes in body text, no inflation vocabulary, no AI-marketing cadence. A
41
- real client testimonial is used **verbatim**; never reword it.
42
- - Never invent a fact to fill a token. If `make-media` did not collect it, go back
43
- and ask. An empty contact detail or a guessed year is a defect.
44
-
45
- ## Images curate by content, name by convention
46
-
47
- The template references images by a fixed convention so the operator can tell
48
- what each slot is from the filename:
49
-
50
- - `hero-01.webp hero-10.webp` — the 10-slide hero rotator (configurable down;
51
- the JS cycles however many `.hero-slide` elements exist).
52
- - `grid-01.webp … grid-12.webp` the photo grids.
53
- - `fullbleed-01.webp` the full-width intermission image.
54
- - `founder-portrait.webp`, `founder-avatar.webp` the person who fronts the firm.
55
- - `feature-project.webp`, `gift.webp` the founder section's feature image and
56
- any thank-you artefact.
57
- - `testimonial.webp` — the finished-result image beside the client quote.
58
- - `logo.png`, `icon.png` from brand-extract.
59
-
60
- Curate by **content, verified by eye**, never by filename. Build a labelled
61
- contact sheet (≤ 2000px) and look: match each photo to its slot. Lead the hero
62
- with the strongest finished "arrive here" shot; put the best finished result in
63
- the testimonial; distribute the rest. A person's photo is founder-only; it never
64
- goes in the rotator as a landscape crop. Rewrite every `alt` to describe the
65
- actual photo — the template's alts are exemplar and must not survive as-is if they
66
- don't match the picture.
67
-
68
- ### The 2000px rule
69
-
70
- Never `Read` an image whose longest edge exceeds 2000px — measure first, preview a
71
- downscaled `/tmp` copy if larger, delete it. Optimise to webp: body tier ~1300px
72
- q82; hero tier source-resolution q88; the founder portrait kept tall.
73
-
74
- ## Verify every page state
75
-
76
- Serve `site/` over a local HTTP server and check, at a 1280px desktop and a 390px
77
- mobile viewport: no horizontal overflow, no broken images, the hero rotates, the
78
- drawer opens with every link, the sticky sub-nav reveals on scroll, the back-to-top
79
- appears and works, and both JSON-LD blocks are valid JSON once substituted. Bottom
80
- -align paired images and equal-height cards where the layout calls for it.
81
-
82
- ## Completion criteria
83
-
84
- - `site/index.html` and `site/llms.txt` exist with zero surviving `{{ }}`.
85
- - Every referenced image resolves; alts describe the real photos.
86
- - Desktop + mobile verified; hero, drawer, sub-nav, back-to-top all work.
87
- - JSON-LD (`GeneralContractor`/`LocalBusiness`/the right `SCHEMA_TYPE`, plus
88
- `FAQPage`) parses and matches the visible copy.
16
+ SiteDesk's construction micro-site is the shared `web-designer` site with
17
+ construction framing supplied as input. This skill owns **no template**: it drives
18
+ `web-designer:web-design`, which holds the one canonical template, substitution
19
+ contract, image convention, and page-state verification. Do not copy or hand-build
20
+ any HTML here.
21
+
22
+ ## Method
23
+
24
+ Run `web-designer:web-design` (after `web-designer:brand-extract` has produced the
25
+ brand pack) against the curated photos and the operator's copy. Fill web-design's
26
+ tokens as it specifies, with these SiteDesk construction values for the framing
27
+ tokens it exposes:
28
+
29
+ **Schema and geography**
30
+ - `SCHEMA_TYPE` `GeneralContractor`, or `HomeAndConstructionBusiness` for a
31
+ broader building firm; a narrower schema.org construction subtype when one fits.
32
+ - `COUNTRY_CODE` — `GB`.
33
+ - `PAGE_LANG` — `en-GB`.
34
+ - `COMPANY_NUMBER_LABEL` — `UK company number`.
35
+
36
+ **Section framing (the seven web-design label tokens)**
37
+ - `NAV_STORY_LABEL` `Our story`
38
+ - `NAV_OFFER_LABEL` `What we build`
39
+ - `NAV_HOW_LABEL` — `Our craft`
40
+ - `OFFER_EYEBROW` `What we build`
41
+ - `HOW_EYEBROW` `Ground to finish`
42
+ - `OFFER_SECTION_ID` `build`
43
+ - `HOW_SECTION_ID` `craft`
44
+
45
+ **Copy framing** — write the offer block (`BUILD_*`) as what the firm builds, and
46
+ the process block (`CRAFT_*`) as how a job runs ground to finish. The founder
47
+ section and its "latest update" cards read in the trade's voice — a real job, a
48
+ site the firm is on never invented. Every copy and photo fact is the operator's;
49
+ a fact you cannot source is a gap you flag, not one you make up.
50
+
51
+ ## Verify and report
52
+
53
+ `web-designer:web-design` owns the completion checks (zero surviving `{{ }}`, every
54
+ image resolves, desktop + mobile render, hero/drawer/sub-nav/back-to-top work, both
55
+ JSON-LD blocks parse). Confirm the built site shows the construction framing — the
56
+ nav reads `Our story` / `What we build` / `Our craft`, and the JSON-LD `@type` is
57
+ the construction schema — then report the built `site/` path and any gaps.
58
+
59
+ ## What this does not do
60
+
61
+ - It ships no template and no placeholder or section reference — those live in
62
+ `web-designer:web-design`.
63
+ - It runs no brand extraction or intake of its own `web-designer:brand-extract`
64
+ produces the brand pack and the pipeline gathers the copy.
65
+ - It does not deploy, and it does not render social tiles that is `socials`.