@pugi/cli 1.0.0-alpha.241 → 1.0.0-alpha.243

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 (126) hide show
  1. package/models.json +1 -1
  2. package/package.json +7 -7
  3. package/skills/ha-prototype-web/NOTICE.md +44 -3
  4. package/skills/od-blog-post/LICENSE-APACHE-2.0 +201 -0
  5. package/skills/od-blog-post/NOTICE.md +126 -0
  6. package/skills/od-blog-post/SKILL.md +81 -0
  7. package/skills/od-contact-widget/LICENSE-APACHE-2.0 +201 -0
  8. package/skills/od-contact-widget/NOTICE.md +126 -0
  9. package/skills/od-contact-widget/SKILL.md +132 -0
  10. package/skills/od-craft/NOTICE.md +44 -3
  11. package/skills/od-critique/LICENSE-APACHE-2.0 +201 -0
  12. package/skills/od-critique/NOTICE.md +126 -0
  13. package/skills/od-critique/SKILL.md +259 -0
  14. package/skills/od-dashboard/LICENSE-APACHE-2.0 +201 -0
  15. package/skills/od-dashboard/NOTICE.md +126 -0
  16. package/skills/od-dashboard/SKILL.md +77 -0
  17. package/skills/od-design-brief/LICENSE-APACHE-2.0 +201 -0
  18. package/skills/od-design-brief/NOTICE.md +126 -0
  19. package/skills/od-design-brief/SKILL.md +260 -0
  20. package/skills/od-docs-page/LICENSE-APACHE-2.0 +201 -0
  21. package/skills/od-docs-page/NOTICE.md +126 -0
  22. package/skills/od-docs-page/SKILL.md +81 -0
  23. package/skills/od-email-marketing/LICENSE-APACHE-2.0 +201 -0
  24. package/skills/od-email-marketing/NOTICE.md +126 -0
  25. package/skills/od-email-marketing/SKILL.md +85 -0
  26. package/skills/od-eng-runbook/LICENSE-APACHE-2.0 +201 -0
  27. package/skills/od-eng-runbook/NOTICE.md +126 -0
  28. package/skills/od-eng-runbook/SKILL.md +52 -0
  29. package/skills/od-faq-page/LICENSE-APACHE-2.0 +201 -0
  30. package/skills/od-faq-page/NOTICE.md +126 -0
  31. package/skills/od-faq-page/SKILL.md +113 -0
  32. package/skills/od-finance-report/LICENSE-APACHE-2.0 +201 -0
  33. package/skills/od-finance-report/NOTICE.md +126 -0
  34. package/skills/od-finance-report/SKILL.md +62 -0
  35. package/skills/od-frontend-design/LICENSE-APACHE-2.0 +201 -0
  36. package/skills/od-frontend-design/LICENSE.txt +177 -0
  37. package/skills/od-frontend-design/NOTICE.md +126 -0
  38. package/skills/od-frontend-design/SKILL.md +86 -0
  39. package/skills/od-hr-onboarding/LICENSE-APACHE-2.0 +201 -0
  40. package/skills/od-hr-onboarding/NOTICE.md +126 -0
  41. package/skills/od-hr-onboarding/SKILL.md +53 -0
  42. package/skills/od-invoice/LICENSE-APACHE-2.0 +201 -0
  43. package/skills/od-invoice/NOTICE.md +126 -0
  44. package/skills/od-invoice/SKILL.md +49 -0
  45. package/skills/od-kanban-board/LICENSE-APACHE-2.0 +201 -0
  46. package/skills/od-kanban-board/NOTICE.md +126 -0
  47. package/skills/od-kanban-board/SKILL.md +51 -0
  48. package/skills/od-login-flow/LICENSE-APACHE-2.0 +201 -0
  49. package/skills/od-login-flow/NOTICE.md +126 -0
  50. package/skills/od-login-flow/SKILL.md +49 -0
  51. package/skills/od-login-flow/references/checklist.md +19 -0
  52. package/skills/od-magazine-poster/LICENSE-APACHE-2.0 +201 -0
  53. package/skills/od-magazine-poster/NOTICE.md +126 -0
  54. package/skills/od-magazine-poster/SKILL.md +90 -0
  55. package/skills/od-meeting-notes/LICENSE-APACHE-2.0 +201 -0
  56. package/skills/od-meeting-notes/NOTICE.md +126 -0
  57. package/skills/od-meeting-notes/SKILL.md +48 -0
  58. package/skills/od-mobile-app/LICENSE-APACHE-2.0 +201 -0
  59. package/skills/od-mobile-app/NOTICE.md +126 -0
  60. package/skills/od-mobile-app/SKILL.md +103 -0
  61. package/skills/od-mobile-app/assets/template.html +442 -0
  62. package/skills/od-mobile-app/references/checklist.md +46 -0
  63. package/skills/od-mobile-app/references/layouts.md +312 -0
  64. package/skills/od-mobile-onboarding/LICENSE-APACHE-2.0 +201 -0
  65. package/skills/od-mobile-onboarding/NOTICE.md +126 -0
  66. package/skills/od-mobile-onboarding/SKILL.md +54 -0
  67. package/skills/od-pm-spec/LICENSE-APACHE-2.0 +201 -0
  68. package/skills/od-pm-spec/NOTICE.md +126 -0
  69. package/skills/od-pm-spec/SKILL.md +53 -0
  70. package/skills/od-pricing-page/LICENSE-APACHE-2.0 +201 -0
  71. package/skills/od-pricing-page/NOTICE.md +126 -0
  72. package/skills/od-pricing-page/SKILL.md +80 -0
  73. package/skills/od-redesign-skill/LICENSE +21 -0
  74. package/skills/od-redesign-skill/LICENSE-APACHE-2.0 +201 -0
  75. package/skills/od-redesign-skill/NOTICE.md +126 -0
  76. package/skills/od-redesign-skill/SKILL.md +205 -0
  77. package/skills/od-reference-design-contract/NOTICE.md +44 -3
  78. package/skills/od-reference-design-contract/SKILL.md +1 -1
  79. package/skills/od-saas-landing/LICENSE-APACHE-2.0 +201 -0
  80. package/skills/od-saas-landing/NOTICE.md +126 -0
  81. package/skills/od-saas-landing/SKILL.md +125 -0
  82. package/skills/od-social-carousel/LICENSE-APACHE-2.0 +201 -0
  83. package/skills/od-social-carousel/NOTICE.md +126 -0
  84. package/skills/od-social-carousel/SKILL.md +92 -0
  85. package/skills/od-team-okrs/LICENSE-APACHE-2.0 +201 -0
  86. package/skills/od-team-okrs/NOTICE.md +126 -0
  87. package/skills/od-team-okrs/SKILL.md +48 -0
  88. package/skills/od-waitlist-page/LICENSE-APACHE-2.0 +201 -0
  89. package/skills/od-waitlist-page/NOTICE.md +126 -0
  90. package/skills/od-waitlist-page/SKILL.md +229 -0
  91. package/skills/od-waitlist-page/assets/template.html +457 -0
  92. package/skills/od-waitlist-page/references/checklist.md +42 -0
  93. package/skills/od-web-design-guidelines/LICENSE +21 -0
  94. package/skills/od-web-design-guidelines/LICENSE-APACHE-2.0 +201 -0
  95. package/skills/od-web-design-guidelines/NOTICE.md +126 -0
  96. package/skills/od-web-design-guidelines/SKILL.md +66 -0
  97. package/skills/od-web-design-guidelines/references/guidelines.md +133 -0
  98. package/skills/od-web-prototype/NOTICE.md +44 -3
  99. package/skills/od-web-prototype/SKILL.md +1 -1
  100. package/skills/od-web-prototype-taste-brutalist/LICENSE-APACHE-2.0 +201 -0
  101. package/skills/od-web-prototype-taste-brutalist/LICENSE-MIT-Leonxlnx +21 -0
  102. package/skills/od-web-prototype-taste-brutalist/NOTICE.md +126 -0
  103. package/skills/od-web-prototype-taste-brutalist/SKILL.md +64 -0
  104. package/skills/od-web-prototype-taste-editorial/LICENSE-APACHE-2.0 +201 -0
  105. package/skills/od-web-prototype-taste-editorial/LICENSE-MIT-Leonxlnx +21 -0
  106. package/skills/od-web-prototype-taste-editorial/NOTICE.md +126 -0
  107. package/skills/od-web-prototype-taste-editorial/SKILL.md +61 -0
  108. package/skills/od-web-prototype-taste-soft/LICENSE-APACHE-2.0 +201 -0
  109. package/skills/od-web-prototype-taste-soft/LICENSE-MIT-Leonxlnx +21 -0
  110. package/skills/od-web-prototype-taste-soft/NOTICE.md +126 -0
  111. package/skills/od-web-prototype-taste-soft/SKILL.md +64 -0
  112. package/skills/od-webgl-experience/LICENSE-APACHE-2.0 +201 -0
  113. package/skills/od-webgl-experience/NOTICE.md +126 -0
  114. package/skills/od-webgl-experience/SKILL.md +81 -0
  115. package/skills/od-wireframe-annotated/LICENSE-APACHE-2.0 +201 -0
  116. package/skills/od-wireframe-annotated/NOTICE.md +126 -0
  117. package/skills/od-wireframe-annotated/SKILL.md +90 -0
  118. package/skills/od-wireframe-greybox/LICENSE-APACHE-2.0 +201 -0
  119. package/skills/od-wireframe-greybox/NOTICE.md +126 -0
  120. package/skills/od-wireframe-greybox/SKILL.md +90 -0
  121. package/skills/od-wireframe-mobile-flow/LICENSE-APACHE-2.0 +201 -0
  122. package/skills/od-wireframe-mobile-flow/NOTICE.md +126 -0
  123. package/skills/od-wireframe-mobile-flow/SKILL.md +96 -0
  124. package/skills/od-wireframe-sketch/LICENSE-APACHE-2.0 +201 -0
  125. package/skills/od-wireframe-sketch/NOTICE.md +126 -0
  126. package/skills/od-wireframe-sketch/SKILL.md +98 -0
@@ -0,0 +1,126 @@
1
+ # Third-party skills vendored into the Pugi designer pack
2
+
3
+ These skills are part of Sofia's (designer) skill pack. They help her go from a
4
+ brief to a design system to the clickable HTML prototype that the customer
5
+ approves at the plan gate (`.pugi/artifacts/prototype.html`, BACKLOG AO), and,
6
+ since 2026-10-17, carry the craft rules every build turn is held to.
7
+
8
+ The skill pack generator copies this file and `LICENSE-APACHE-2.0` into every
9
+ vendored skill directory, so each one carries its attribution wherever it is
10
+ baked.
11
+
12
+ Both upstream projects are licensed under the Apache License, Version 2.0. The
13
+ full licence text is in `LICENSE-APACHE-2.0` next to this file. The LICENSE file
14
+ of each repository was checked before anything was copied (2026-10-04 and
15
+ 2026-10-17). Neither repository ships a NOTICE file, so this file is the
16
+ attribution.
17
+
18
+ ## nexu-io/open-design
19
+
20
+ - Source: https://github.com/nexu-io/open-design
21
+ - Licence: Apache-2.0, "Copyright 2026 Open Design contributors"
22
+ - The upstream `skills/README.md` says skills are Apache-2.0 unless their own
23
+ `LICENSE` says otherwise. No directory copied here has its own licence.
24
+ - Commit 53231d40b778d88eba23f35547bf99485d3ae9fc (2026-09-30) for the two
25
+ prototype skills (re-checked unchanged at 3b0df90f and re-stamped);
26
+ commit 78d5637cb49da07e81314d1544b5fc6d37c95084 (v0.25.1, 2026-10-16) for
27
+ the craft rules and the two ports below; commit
28
+ 3b0df90f305c8279e748c292accf336d02b924ef (2026-10-20) for the design
29
+ templates and design skills added 2026-10-21 (CEO: "Open Design inside
30
+ Pugi"). The LICENSE file of the repository was checked again on 2026-10-21.
31
+
32
+ | Pugi skill | Upstream path | Files copied |
33
+ |---|---|---|
34
+ | `od-web-prototype` | `design-templates/web-prototype/` | `SKILL.md`, `assets/template.html`, `references/layouts.md`, `references/checklist.md` |
35
+ | `od-reference-design-contract` | `skills/reference-design-contract/` | `SKILL.md`, `references/checklist.md` |
36
+ | `od-craft` | `craft/` | all twelve documents, as `references/<name>.md`: `README.md`, `accessibility-baseline.md`, `animation-discipline.md`, `anti-ai-slop.md`, `color.md`, `form-validation.md`, `laws-of-ux.md`, `rtl-and-bidi.md`, `state-coverage.md`, `typography-hierarchy-editorial.md`, `typography-hierarchy.md`, `typography.md` |
37
+
38
+ ### Design templates (added 2026-10-21, commit 3b0df90f) — the "Start from" catalogue
39
+
40
+ Each is `design-templates/<name>/` → `od-<name>/`, `SKILL.md` only unless noted.
41
+ Apache-2.0, nexu-io/open-design contributors, except where a row says otherwise.
42
+
43
+ | Pugi skill | Upstream path | Files copied / licence |
44
+ |---|---|---|
45
+ | `od-saas-landing`, `od-dashboard`, `od-mobile-onboarding`, `od-pricing-page`, `od-blog-post`, `od-docs-page`, `od-kanban-board`, `od-invoice`, `od-meeting-notes`, `od-contact-widget`, `od-email-marketing`, `od-social-carousel`, `od-wireframe-annotated`, `od-wireframe-greybox`, `od-wireframe-mobile-flow`, `od-wireframe-sketch`, `od-pm-spec`, `od-team-okrs`, `od-eng-runbook`, `od-finance-report`, `od-hr-onboarding`, `od-magazine-poster`, `od-webgl-experience` | `design-templates/<name>/` | `SKILL.md` |
46
+ | `od-mobile-app` | `design-templates/mobile-app/` | `SKILL.md`, `assets/template.html`, `references/layouts.md`, `references/checklist.md` |
47
+ | `od-waitlist-page` | `design-templates/waitlist-page/` | `SKILL.md`, `assets/template.html`, `references/checklist.md` |
48
+ | `od-web-prototype-taste-soft`, `-editorial`, `-brutalist` | `design-templates/web-prototype-taste-*/` | `SKILL.md`; distilled by open-design from Leonxlnx/taste-skill (MIT, © 2026 Leonxlnx) — that MIT text is carried as `LICENSE-MIT-Leonxlnx` in each directory |
49
+ | `od-login-flow` | `skills/login-flow/` | `SKILL.md`, `references/checklist.md` |
50
+ | `od-faq-page` | `skills/faq-page/` | `SKILL.md` |
51
+
52
+ ### Design skills (added 2026-10-21, commit 3b0df90f)
53
+
54
+ | Pugi skill | Upstream path | Files copied / licence |
55
+ |---|---|---|
56
+ | `od-design-brief` | `skills/design-brief/` | `SKILL.md` (Apache-2.0, nexu-io) |
57
+ | `od-critique` | `design-templates/critique/` | `SKILL.md` (Apache-2.0, nexu-io) |
58
+ | `od-frontend-design` | `skills/frontend-design/` | `SKILL.md`, `LICENSE.txt` (Apache-2.0; the skill is Anthropic's `frontend-design` as open-design redistributes it) |
59
+ | `od-redesign-skill` | `skills/redesign-skill/` | `SKILL.md`, `LICENSE` (MIT, © 2026 Leonxlnx; upstream frontmatter name `redesign-existing-projects`) |
60
+ | `od-web-design-guidelines` | `skills/web-design-guidelines/` | `SKILL.md`, `LICENSE`, `references/guidelines.md` (MIT, vercel-labs/web-interface-guidelines, as open-design redistributes it) |
61
+
62
+ Looked at and left out on 2026-10-21 (no licence file in the open-design
63
+ directory although the upstream is MIT/Apache; take later with the upstream
64
+ text): `design-md`, `enhance-prompt` (google-labs-code/skills),
65
+ `design-consultation`, `plan-design-review` (garrytan/gstack, MIT),
66
+ `copywriting` (coreyhaines31/marketingskills, MIT), `impeccable-design-polish`
67
+ (pbakaus/impeccable, Apache-2.0), `ui-skills` (ibelick/ui-skills, MIT),
68
+ `emil-design-eng`, `animate`, `review-animations`, `stitch-skill`. Decks,
69
+ video, live-artifact and `tweaks` templates are not Pugi surfaces.
70
+
71
+ Upstream attributions kept inside those files: `craft/` is adapted from
72
+ referodesign/refero_skill (MIT, © Refero Design); the "Adapted from" lines
73
+ stay where upstream put them.
74
+
75
+ ### Ports (derivative works, Apache-2.0 §4), not copies
76
+
77
+ | Pugi file | Upstream source | What changed |
78
+ |---|---|---|
79
+ | `packages/opencode/src/session/design-lint.ts` | `apps/daemon/src/lint-artifact.ts` | The seven P0 checks and the external-image advisory are kept; the finding shape is local; it runs over a workspace (source and `dist/`) rather than one artifact body; Tailwind utility-class forms of each sin are added; the deck, `data-od-id`, all-caps tracking and raw-hex checks are dropped; the sans-display check fires only when a serif display token is bound. The daemon's analytics were never in this file. |
80
+ | `packages/opencode/src/scaffold/design-direction.ts` | `apps/daemon/src/prompts/directions.ts` | The five schools are kept as postures; labels no longer name other brands; palettes are hex; faces are the Google fonts the starters link; two directions added; no question form (the direction is decided by the model, never asked of the customer). |
81
+ | `packages/plugin-pugi-personas/src/craft-digest.ts` | `craft/*.md` | A condensed summary written by Pugi from the twelve documents. |
82
+
83
+ Nothing ported touches the network: open-design's PostHog / Langfuse telemetry
84
+ lives in its apps, none of which were taken.
85
+
86
+ ## nexu-io/html-anything
87
+
88
+ - Source: https://github.com/nexu-io/html-anything
89
+ - Commit: 553ed98c283f9c0f489902d035416a972d6a9699 (2026-09-15)
90
+ - Licence: Apache-2.0. The upstream copyright line is the unfilled template
91
+ ("Copyright [yyyy] [name of copyright owner]"), so the copyright belongs to
92
+ the html-anything contributors.
93
+
94
+ | Pugi skill | Upstream path | Files copied |
95
+ |---|---|---|
96
+ | `ha-prototype-web` | `next/src/lib/templates/skills/prototype-web/` | `SKILL.md` |
97
+
98
+ ## Changes made by Pugi (Apache-2.0 §4(b))
99
+
100
+ - The frontmatter `name` of every `SKILL.md` was prefixed (`od-`, `ha-`). Skill
101
+ names are permission patterns in Pugi, and upstream names such as
102
+ `web-prototype` would collide across the two sources.
103
+ - One HTML comment was added under each frontmatter block. It names the source,
104
+ the commit and these changes.
105
+ - `od-craft/SKILL.md` is written by Pugi (upstream has no skill wrapper for
106
+ `craft/`; its daemon injects the files per `od.craft.requires`). Each
107
+ `references/*.md` begins with one added HTML comment naming the source
108
+ commit and stating that the rest is verbatim; the text below it is
109
+ unchanged, including upstream's references to its own paths
110
+ (`apps/daemon/src/lint-artifact.ts`, `pnpm lint:craft`).
111
+ - Example files (`example.html`, `example.md`) were not copied (the sanitised
112
+ example pages live under `scaffold/seeds/` with their own NOTICE).
113
+ - The three `od-web-prototype-taste-*` directories and `od-redesign-skill`
114
+ carry the MIT licence of Leonxlnx next to the Apache-2.0 text, because the
115
+ upstream `skills/README.md` says a skill's own LICENSE prevails.
116
+ - Every other byte of the copied files is unchanged.
117
+
118
+ Where an upstream rule conflicts with the Pugi plan-gate prototype contract in
119
+ Sofia's persona prompt, the Pugi contract wins.
120
+ Two upstream rules conflict on purpose. The output file is
121
+ `.pugi/artifacts/prototype.html`, not `index.html`. Photos are Pexels CDN URLs
122
+ taken from Anvil `/v1/images`, not copies in the project, because the console
123
+ renders the prototype from a single document.
124
+ Where a craft rule names open-design's tokens (`var(--accent)`), the starter's
125
+ own token scheme (`src/globals.css` bare HSL components, `src/theme.css`
126
+ typefaces) wins.
@@ -0,0 +1,229 @@
1
+ ---
2
+ name: od-waitlist-page
3
+ description: |
4
+ Minimal pre-launch landing with email capture, brand logo, and optional decorative layer.
5
+ Reads DESIGN.md for colors, typography, and layout rules.
6
+ Best for: product launches, beta signups, early access programs, indie projects.
7
+ triggers:
8
+ - "waitlist page"
9
+ - "coming soon page"
10
+ - "pre-launch landing page"
11
+ - "email capture page"
12
+ - "launch page"
13
+ od:
14
+ mode: prototype
15
+ platform: desktop
16
+ scenario: marketing
17
+ preview:
18
+ type: html
19
+ entry: example.html
20
+ design_system:
21
+ requires: true
22
+ sections: [color, typography, layout, components]
23
+ inputs:
24
+ - name: product_name
25
+ type: string
26
+ required: true
27
+ - name: tagline
28
+ type: string
29
+ required: true
30
+ - name: bg_expression
31
+ type: string
32
+ description: "CSS color expression for background (e.g., '#FDE8DF' or 'rgba(...)')."
33
+ required: true
34
+ - name: fg_expression
35
+ type: string
36
+ description: "CSS color expression for text and primary shapes (e.g., '#1A1410' or 'rgba(...)')."
37
+ required: true
38
+ - name: accent_expression
39
+ type: string
40
+ description: "CSS color expression for brand badge and highlights."
41
+ required: true
42
+ - name: deco_expression
43
+ type: string
44
+ description: "CSS color expression for decoration primary."
45
+ required: true
46
+ - name: stripe_expression
47
+ type: string
48
+ description: "CSS color expression for accent stripe."
49
+ required: true
50
+ - name: border_expression
51
+ type: string
52
+ description: "CSS color expression for input borders (e.g., 'rgba(100,50,30,0.38)' or 'color-mix(in srgb, var(--fg) 38%, transparent)'). Must be valid CSS."
53
+ required: true
54
+ - name: success_expression
55
+ type: string
56
+ description: "CSS color expression for success message. Defaults to #2D6A4F if not in DESIGN.md."
57
+ required: true
58
+ - name: btn_label_expression
59
+ type: string
60
+ description: "CSS color expression for button label text (e.g., 'rgba(255,255,255,1)' or '#fff'). Ensure WCAG AA contrast."
61
+ required: true
62
+ - name: ticker_bg_expression
63
+ type: string
64
+ description: "CSS color expression for ticker background (e.g., 'rgba(0,0,0,0.9)'). Must be valid CSS."
65
+ required: true
66
+ - name: ticker_fg_expression
67
+ type: string
68
+ description: "CSS color expression for ticker text (e.g., 'rgba(255,255,255,0.9)'). Ensure contrast."
69
+ required: true
70
+ - name: deco_stroke_expression
71
+ type: string
72
+ description: "CSS color expression for SVG strokes (e.g., 'rgba(0,0,0,0.12)'). Typically a muted foreground or neutral."
73
+ required: true
74
+ - name: logo_shadow_expression
75
+ type: string
76
+ description: "CSS color expression for logo container shadow (e.g., 'rgba(0,0,0,0.08)'). Typically a subtle foreground shade."
77
+ required: true
78
+ - name: logo_fg_expression
79
+ type: string
80
+ description: "CSS color expression for logo text/initials (e.g., 'rgba(255,255,255,1)' or '#fff'). Ensure contrast against accent."
81
+ required: true
82
+ - name: logo_mark
83
+ type: string
84
+ description: "Text initials are HTML-escaped by default. Inline SVG is allowed only after strict allowlist-based sanitization (removing scripts, event handlers, foreignObject, and external references); unsafe input falls back to escaped text."
85
+ required: false
86
+ - name: display_font_url
87
+ type: string
88
+ description: "Display font name with spaces encoded as '+' (e.g., 'Syne', 'DM+Sans'). Used in Google Fonts URL."
89
+ required: true
90
+ - name: display_font_css
91
+ type: string
92
+ description: "Display font name as it appears in CSS (e.g., 'Syne', 'DM Sans'). Already quoted if needed; no extra quotes in template."
93
+ required: true
94
+ - name: body_font_url
95
+ type: string
96
+ description: "Body font name with spaces encoded as '+' (e.g., 'DM+Sans', 'IBM+Plex+Serif'). Used in Google Fonts URL."
97
+ required: true
98
+ - name: body_font_css
99
+ type: string
100
+ description: "Body font name as it appears in CSS (e.g., 'DM Sans', 'IBM Plex Serif'). Already quoted if needed; no extra quotes in template."
101
+ required: true
102
+ outputs:
103
+ primary: index.html
104
+ capabilities_required:
105
+ - file_write
106
+ example_prompt: "Make a waitlist page for a design tool — clean, minimal, with a custom logo and one call-to-action."
107
+ ---
108
+ <!-- Vendored from nexu-io/open-design@3b0df90f305c (design-templates/waitlist-page), Apache-2.0. Modified by Pugi: frontmatter `name` changed from `waitlist-page` to `od-waitlist-page`; example files omitted. See NOTICE.md in this directory. Where this skill conflicts with the Pugi plan-gate prototype contract in the designer persona prompt, the Pugi contract wins. -->
109
+
110
+ # Waitlist Page Skill
111
+
112
+ Pre-launch pages are your first handshake with future users. This skill builds a focused, honest entrance: your brand identity, what you're making, one clear path to join the early list. No artificial scarcity, no fake countdown, no inflation tactics—just a clean, mobile-first vessel for genuine interest.
113
+
114
+ ## Workflow
115
+
116
+ ### Preflight: Load hardened template and brand foundation
117
+
118
+ 0. **Load the brand identity** — Read `DESIGN.md` for the color system, font pairing, and spatial rules. This is your foundation. A waitlist page lives or dies by consistency with the brand it represents. If `DESIGN.md` is missing, ask the user to provide one before you proceed.
119
+ 1. **Read and copy the reusable template** — Read `assets/template.html`. This template is the hardened seed for all outputs. Copy it to `index.html` as your base. Do not write HTML from scratch or deviate from this structure. The template has all required layout, form structure, decorations, focus styles, and accessibility scaffolding baked in.
120
+
121
+ ### Steps: Token replacement with validation and escaping
122
+
123
+ 2. **Map tokens from inputs** — For each placeholder in the template (e.g., `{{PRODUCT_NAME}}`, `{{BG_EXPRESSION}}`, `{{BORDER_EXPRESSION}}`, `{{LOGO_MARK}}`), follow the replacement rules below:
124
+ - **Text tokens** (`{{PRODUCT_NAME}}`, `{{TAGLINE}}`): HTML-escape `<`, `>`, `&`, `"`, `'` before insertion into HTML text nodes or attribute values.
125
+ - **HTML tokens** (`{{LOGO_MARK}}`): If using text initials, HTML-escape them by default. If using inline SVG, you must strictly sanitize it using an allowlist: strip `<script>` tags, event handlers (`on*`), `<foreignObject>`, external refs (`href`, `xlink:href`, `url()`), and any disallowed attributes/elements before insertion. If the SVG cannot be safely sanitized, fallback to escaped text initials. Never emit raw, unsanitized arbitrary HTML. Ensure any SVG scales cleanly within its container.
126
+ - **Color expression tokens** (`{{BG_EXPRESSION}}`, `{{FG_EXPRESSION}}`, `{{ACCENT_EXPRESSION}}`, `{{DECO_EXPRESSION}}`, `{{STRIPE_EXPRESSION}}`, `{{SUCCESS_EXPRESSION}}`, `{{BORDER_EXPRESSION}}`, `{{BTN_LABEL_EXPRESSION}}`, `{{TICKER_BG_EXPRESSION}}`, `{{TICKER_FG_EXPRESSION}}`, `{{DECO_STROKE_EXPRESSION}}`, `{{LOGO_SHADOW_EXPRESSION}}`, `{{LOGO_FG_EXPRESSION}}`): Must strictly adhere to an explicit color grammar (`#hex`, `rgb`/`rgba`, `hsl`/`hsla`, `oklch`, or `color-mix()` using only local variables). Hard reject any input containing `;`, `{}`, `<`, `>`, comments (`/*`), `@`, `url(`, or external refs to prevent CSS injection. Do not wrap in `#` or add extra quotes. Examples: `rgba(196, 169, 154, 0.38)`, `color-mix(in srgb, var(--fg) 38%, transparent)`, `#FDE8DF`. Insert as-is into `:root` CSS variables. Derive `--success` from DESIGN.md if present; otherwise use the allowed fallback `#2D6A4F` only.
127
+ - **Font name tokens** (`{{DISPLAY_FONT_CSS}}`, `{{BODY_FONT_CSS}}`): These are CSS font-family values, already quoted if they contain spaces (e.g., `'DM Sans'`, `Syne`). Insert as-is into `--font-display` and `--font-body` declarations; do NOT add extra quotes.
128
+ - **Font URL tokens** (`{{DISPLAY_FONT_URL}}`, `{{BODY_FONT_URL}}`): Spaces must be encoded as `+` for the Google Fonts URL (e.g., `DM+Sans`, `IBM+Plex+Serif`). Validate the URL is well-formed before insertion.
129
+ 3. **Verify token mapping rules** — All color tokens are now in CSS variables:
130
+ - `--bg` = `{{BG_EXPRESSION}}` (e.g., `#FDE8DF`)
131
+ - `--fg` = `{{FG_EXPRESSION}}` (e.g., `#1A1410`)
132
+ - `--accent` = `{{ACCENT_EXPRESSION}}` (brand badge)
133
+ - `--deco` = `{{DECO_EXPRESSION}}` (decoration primary)
134
+ - `--deco-stripe` = `{{STRIPE_EXPRESSION}}` (accent stripe)
135
+ - `--input-border` = `{{BORDER_EXPRESSION}}` (full CSS expression with opacity)
136
+ - `--success` = `{{SUCCESS_EXPRESSION}}` or `#2D6A4F` fallback
137
+ - `--btn-label` = `{{BTN_LABEL_EXPRESSION}}` (button text color for contrast)
138
+ - `--ticker-bg` = `{{TICKER_BG_EXPRESSION}}` (animated ticker background)
139
+ - `--ticker-fg` = `{{TICKER_FG_EXPRESSION}}` (animated ticker text)
140
+ - `--deco-stroke` = `{{DECO_STROKE_EXPRESSION}}` (SVG strokes, typically muted with 12–15% opacity)
141
+ - `--logo-shadow` = `{{LOGO_SHADOW_EXPRESSION}}` (logo container shadow, subtle foreground shade)
142
+ - `--logo-fg` = `{{LOGO_FG_EXPRESSION}}` (contrasting text color for logo initials)
143
+ 4. **Responsive layout** — The template includes mobile-first scaling:
144
+ - 375px: form stacks to single column, logo shrinks to 40px, decoration compresses, no horizontal scroll.
145
+ - 768px: comfortable two-column breathing room.
146
+ - 1440px+: centered layout with generous whitespace.
147
+ - Verify all text remains readable and the email input + button are fully visible (no clipping) at 375×667 and 390×844.
148
+
149
+ ### Validation: Run hardened quality gates before emitting
150
+
151
+ 5. **Run the quality checklist** — Read `references/checklist.md`. Validate every **P0 gate** before emitting:
152
+ - Exactly one CTA (email form)
153
+ - No countdown timer, no fake social proof, no emoji
154
+ - No horizontal scroll at 375px
155
+ - Email input has `type="email"` and `required`; first name has no `required`
156
+ - Form does NOT use `novalidate`; JS uses `checkValidity()` guard
157
+ - Success message has `role="status"` or `aria-live="polite"`
158
+ - All colors from DESIGN.md or allowed fallback; **no invented hex values**
159
+ - All user text is HTML-escaped; color tokens adhere to strict grammar; fonts are URL-encoded
160
+ - **Pass P0 or do not emit.** If any P0 gate fails, ask the user or fix the token mappings and try again.
161
+ 6. **Verify P1 gates** for quality submission (recommended):
162
+ - Hover and active states on submit button
163
+ - Form validation with clear feedback
164
+ - Ticker animation respects `prefers-reduced-motion: reduce`
165
+ - All interactive elements have visible focus styles (input:focus includes `outline`)
166
+ - Tab/Enter keyboard support
167
+ - WCAG AA contrast for body text (≥4.5:1) and button label (≥4.5:1)
168
+ - Logo alt/aria-label present; ticker has `aria-hidden="true"`
169
+ - `<html lang="">` is set
170
+
171
+ ### Output
172
+
173
+ 7. **Emit clean HTML** — Single file, CSS inlined, SVG for graphics. Mark interactive elements with `data-od-id` (headline, form, logo, ticker, grid, etc.) so agents can customize without parsing.
174
+
175
+ ## Quality gates
176
+
177
+ This skill enforces a hardened, template-based workflow to ensure compliance. **You must follow this execution path; deviating from the template disqualifies the output.**
178
+
179
+ **Mandatory template-based execution:**
180
+ - Read `assets/template.html` as your base; do not write HTML from scratch.
181
+ - Copy it to `index.html` and replace only the `{{PLACEHOLDER}}` tokens with validated/escaped values.
182
+ - Run every P0 gate in `references/checklist.md` before emitting; if any fail, fix and re-validate.
183
+
184
+ **P0 gates (must pass):**
185
+ - Single CTA: Email form is the only interactive element. No nav, no secondary buttons, no social links.
186
+ - Logo placement: Fixed top-left, matches DESIGN.md accent color, scales down on mobile (50px → 40px).
187
+ - Color consistency: Every color from DESIGN.md palette. Only allowed hardcoded exception: `#2D6A4F` for `--success`.
188
+ - No anti-patterns: No countdown timer, no fake social proof, no emoji icons, no lorem ipsum.
189
+ - Content integrity: Headline and copy tie directly to `product_name` and `tagline` inputs—no filler copy.
190
+ - Mobile fit: No horizontal scroll at 375px. Email input and submit button are fully visible (no clipping) at 375×667 and 390×844. Vertical overflow is scrollable, not hidden.
191
+ - Typographic discipline: Display + body fonts only (2-font rule). Consistent sizing across sections.
192
+ - Form structure: Two fields (first name optional, email required), `checkValidity()` guard, success message with `role="status"`.
193
+ - Token escaping: All user-supplied text HTML-escaped; color tokens adhere to strict grammar and contain no unsafe characters (`;`, `{}`, `<`, `>`, `/*`, `@`, `url(`); font names are URL-encoded; `{{LOGO_MARK}}` is escaped text initials or strictly sanitized inline SVG (no scripts, no event handlers, no foreignObject, no external hrefs).
194
+
195
+ **P1 gates (should pass for quality submission):**
196
+ - Hero section visually distinct and above-the-fold.
197
+ - Email submit button has hover and active states.
198
+ - Form validation provides clear feedback.
199
+ - Page scrollable (not clipped) at all mobile viewports; CTA visible without scroll.
200
+ - Ticker animation paused/removed under `prefers-reduced-motion: reduce`.
201
+ - All interactive elements have visible focus styles (outline, not just outline:none).
202
+ - Keyboard: Tab reaches each form field; Enter submits.
203
+ - WCAG AA contrast: Body text ≥4.5:1, button label ≥4.5:1.
204
+ - Logo alt/aria-label present; ticker has `aria-hidden="true"`.
205
+ - `<html lang="">` set to correct language code.
206
+
207
+ **Decoration restraint:**
208
+ - Lower zone enhances without distraction. Opacity, subtle strokes, muted animation.
209
+ - No gradient that spans more than 20% of viewport height.
210
+ - Coil, stripe, grid, or ticker all use colors from DESIGN.md only.
211
+
212
+ ## Output
213
+
214
+ **Only emit after all P0 gates in `references/checklist.md` pass.**
215
+
216
+ Emit the artifact between tags:
217
+
218
+ ```
219
+ <artifact identifier="waitlist-id" type="text/html" title="Coming Soon — {{PRODUCT_NAME}}">
220
+ <!doctype html>
221
+ <html lang="en">
222
+ ...
223
+ </html>
224
+ </artifact>
225
+ ```
226
+
227
+ One line of description above the artifact; nothing below.
228
+
229
+ **Post-emission:** If the user asks for changes, update the index.html in-place and re-run the P0 checklist gates before emitting the next version. Do not skip validation on iterations.