@getvitops/create 0.5.0 → 0.7.0

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 (56) hide show
  1. package/CHANGELOG.md +44 -5
  2. package/README.md +7 -0
  3. package/package.json +18 -2
  4. package/templates/emdash/.agents/skills/setup/SKILL.md +61 -0
  5. package/templates/emdash/.env +1 -0
  6. package/templates/emdash/.github/workflows/ci.yml +12 -0
  7. package/templates/emdash/.github/workflows/deploy-dev.yml +17 -19
  8. package/templates/emdash/.github/workflows/deploy-prod.yml +17 -21
  9. package/templates/emdash/.github/workflows/promote.yml +8 -36
  10. package/templates/emdash/.mcp.json +4 -0
  11. package/templates/emdash/.nvmrc +1 -0
  12. package/templates/emdash/AGENTS.md +23 -11
  13. package/templates/emdash/README.md +44 -42
  14. package/templates/emdash/SETUP.html +526 -0
  15. package/templates/emdash/_gitignore +3 -0
  16. package/templates/emdash/astro.config.mjs +7 -1
  17. package/templates/emdash/package.json +6 -4
  18. package/templates/emdash/seed/seed.json +1 -1
  19. package/templates/emdash/site.json +228 -0
  20. package/templates/emdash/src/assets/placeholder/wireframe-400x400.png +0 -0
  21. package/templates/emdash/src/assets/placeholder/wireframe-400x400.svg +1 -0
  22. package/templates/emdash/src/assets/placeholder/wireframe-400x600.png +0 -0
  23. package/templates/emdash/src/assets/placeholder/wireframe-400x600.svg +1 -0
  24. package/templates/emdash/src/assets/placeholder/wireframe-600x400.png +0 -0
  25. package/templates/emdash/src/assets/placeholder/wireframe-600x400.svg +1 -0
  26. package/templates/emdash/vite.config.ts +1 -1
  27. package/templates/emdash/wrangler.jsonc +8 -3
  28. package/templates/static/.agents/skills/setup/SKILL.md +61 -0
  29. package/templates/static/.env +1 -0
  30. package/templates/static/.github/workflows/ci.yml +12 -0
  31. package/templates/static/.github/workflows/deploy-dev.yml +33 -0
  32. package/templates/static/.github/workflows/deploy-prod.yml +29 -0
  33. package/templates/static/.github/workflows/promote.yml +16 -0
  34. package/templates/static/.nvmrc +1 -0
  35. package/templates/static/AGENTS.md +64 -0
  36. package/templates/static/README.md +80 -0
  37. package/templates/static/SETUP.html +526 -0
  38. package/templates/static/_gitignore +27 -0
  39. package/templates/static/astro.config.mjs +23 -0
  40. package/templates/{emdash → static}/design-system.json +1 -1
  41. package/templates/static/package.json +41 -0
  42. package/templates/static/scripts/dev-wrangler-config.mjs +28 -0
  43. package/templates/static/site.json +228 -0
  44. package/templates/static/src/assets/placeholder/wireframe-400x400.png +0 -0
  45. package/templates/static/src/assets/placeholder/wireframe-400x400.svg +1 -0
  46. package/templates/static/src/assets/placeholder/wireframe-400x600.png +0 -0
  47. package/templates/static/src/assets/placeholder/wireframe-400x600.svg +1 -0
  48. package/templates/static/src/assets/placeholder/wireframe-600x400.png +0 -0
  49. package/templates/static/src/assets/placeholder/wireframe-600x400.svg +1 -0
  50. package/templates/static/src/layouts/Layout.astro +26 -0
  51. package/templates/static/src/pages/404.astro +11 -0
  52. package/templates/static/src/pages/index.astro +13 -0
  53. package/templates/static/tsconfig.json +5 -0
  54. package/templates/static/wrangler.jsonc +22 -0
  55. package/templates/emdash/scripts/init-github.mjs +0 -102
  56. package/templates/emdash/scripts/init-hosting.mjs +0 -150
@@ -0,0 +1,228 @@
1
+ {
2
+ "$schema": "./node_modules/@getvitops/generator/config.schema.json",
3
+ "designSystem": {
4
+ "themes": {
5
+ "default": {
6
+ "$schema": "./node_modules/@getvitops/generator/schema.json",
7
+ "colors": {
8
+ "palette": {
9
+ "brand": {
10
+ "seed": "#2e9b73"
11
+ },
12
+ "ink": {
13
+ "seed": "#3f4a5c"
14
+ },
15
+ "sky": {
16
+ "seed": "#2f7bc0"
17
+ },
18
+ "sun": {
19
+ "seed": "#d08a1f"
20
+ },
21
+ "rose": {
22
+ "seed": "#c74a42"
23
+ }
24
+ },
25
+ "roles": {
26
+ "neutral": "ink",
27
+ "surface": "ink",
28
+ "ui-primary": "brand",
29
+ "brand-primary": "brand",
30
+ "info": "sky",
31
+ "success": "brand",
32
+ "warning": "sun",
33
+ "danger": "rose"
34
+ },
35
+ "utilities": ["bg", "text", "icon", "border"]
36
+ },
37
+ "shadows": {
38
+ "sm": "0 1px 2px rgb(0 0 0 / 0.08)",
39
+ "md": "0 4px 6px rgb(0 0 0 / 0.12)",
40
+ "lg": "0 10px 15px rgb(0 0 0 / 0.18)"
41
+ },
42
+ "fonts": {
43
+ "display": "system-ui, -apple-system, \"Segoe UI\", sans-serif",
44
+ "sans": "system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif",
45
+ "mono": "ui-monospace, \"SF Mono\", Menlo, monospace"
46
+ },
47
+ "typeScale": {
48
+ "base": "1rem",
49
+ "names": ["2xs", "xs", "s", "m", "l", "xl", "2xl", "3xl"],
50
+ "baseStep": 4,
51
+ "baseline": "m",
52
+ "ratio": 1.2,
53
+ "fluid": {
54
+ "minVw": "22.5rem",
55
+ "maxVw": "80rem",
56
+ "minRatio": 1.12
57
+ }
58
+ },
59
+ "spaceScale": {
60
+ "base": "1rem",
61
+ "names": ["2xs", "xs", "s", "m", "l", "xl", "2xl", "3xl"],
62
+ "baseStep": 4,
63
+ "baseline": "m",
64
+ "ratio": 1.25,
65
+ "fluid": {
66
+ "minVw": "22.5rem",
67
+ "maxVw": "80rem",
68
+ "minRatio": 1.2
69
+ }
70
+ },
71
+ "patterns": {
72
+ "defaults": {
73
+ "ds": "none",
74
+ "b": "1px solid var(--color-bg-surface-x-muted)",
75
+ "br": "0.375rem",
76
+ "p": "1rem",
77
+ "fs": "1rem"
78
+ },
79
+ "radii": {
80
+ "circle": "50%"
81
+ },
82
+ "groups": {
83
+ "control": {
84
+ "ds": "var(--ds-default)",
85
+ "b": "var(--b-default)",
86
+ "br": "var(--br-default)",
87
+ "p": "0.5em 1em",
88
+ "fs": "var(--fs-default)"
89
+ },
90
+ "panel": {
91
+ "ds": "var(--shadow-md)",
92
+ "b": "var(--b-default)",
93
+ "br": "0.5rem",
94
+ "p": "1rem",
95
+ "fs": "var(--fs-default)"
96
+ }
97
+ },
98
+ "z": {
99
+ "raised": 1,
100
+ "sticky": 100,
101
+ "overlay": 200,
102
+ "top": 1000
103
+ },
104
+ "items": {
105
+ "button": {
106
+ "group": "control",
107
+ "element": "button",
108
+ "default_role": "brand-primary",
109
+ "base": {
110
+ "padding": "0.6em 1.2em",
111
+ "border-radius": "var(--br-control, 0.25rem)",
112
+ "border": "none",
113
+ "font-weight": "600",
114
+ "color": "#fff",
115
+ "cursor": "pointer",
116
+ "box-shadow": "var(--shadow-sm)"
117
+ },
118
+ "states": {
119
+ "hover": {
120
+ "step": 1
121
+ },
122
+ "active": {
123
+ "scale": 0.97
124
+ },
125
+ "focus-visible": {
126
+ "ring": true
127
+ }
128
+ },
129
+ "roles": []
130
+ },
131
+ "card": {
132
+ "group": "panel",
133
+ "class": "card",
134
+ "base": {
135
+ "border-radius": "var(--br-card-group)",
136
+ "padding": "1.5rem",
137
+ "background": "var(--color-bg-surface-muted)",
138
+ "border": "var(--b-card-group)",
139
+ "box-shadow": "var(--ds-card-group)"
140
+ },
141
+ "states": {},
142
+ "roles": []
143
+ }
144
+ }
145
+ },
146
+ "typography": {
147
+ "families": {
148
+ "display": "var(--font-display)",
149
+ "sans": "var(--font-sans)",
150
+ "code": "var(--font-mono, ui-monospace, monospace)"
151
+ },
152
+ "roles": {
153
+ "display": {
154
+ "family": "display",
155
+ "size": "var(--text-3xl)",
156
+ "weight": 700,
157
+ "line-height": "1.05",
158
+ "tracking": "-0.03em"
159
+ },
160
+ "heading": {
161
+ "family": "display",
162
+ "size": "var(--text-xl)",
163
+ "weight": 600,
164
+ "line-height": "1.3"
165
+ },
166
+ "body": {
167
+ "family": "sans",
168
+ "size": "var(--text-m)",
169
+ "weight": 400,
170
+ "line-height": "1.55"
171
+ }
172
+ },
173
+ "headings": {
174
+ "h1": "display",
175
+ "h2": "heading",
176
+ "h3": "heading"
177
+ }
178
+ },
179
+ "animations": {
180
+ "effects": {
181
+ "fade-in": {
182
+ "kf": "composite",
183
+ "vars": {
184
+ "opacity-from": 0
185
+ }
186
+ },
187
+ "slide-up": {
188
+ "kf": "composite",
189
+ "vars": {
190
+ "translate-y-from": "var(--slide-distance, 2rem)"
191
+ }
192
+ }
193
+ },
194
+ "journeys": {
195
+ "base": {
196
+ "fade": {
197
+ "opacity-from": 0
198
+ },
199
+ "slide": {}
200
+ },
201
+ "compose": [["fade"], ["slide"], ["fade", "slide"]]
202
+ }
203
+ }
204
+ }
205
+ },
206
+ "defaultColorScheme": "light"
207
+ },
208
+ "organization": {
209
+ "name": "My EmDash Site"
210
+ },
211
+ "site": {
212
+ "defaultLocale": "en",
213
+ "locales": {
214
+ "en": {
215
+ "name": "English"
216
+ }
217
+ },
218
+ "environments": {
219
+ "production": {
220
+ "url": "https://my-emdash-site.example.com"
221
+ },
222
+ "dev": {
223
+ "url": "https://dev.my-emdash-site.example.com",
224
+ "robots": "noindex,nofollow"
225
+ }
226
+ }
227
+ }
228
+ }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 400 400"><rect width="100%" height="100%" fill="#DDDDDD"/><path fill="#999999" d="M87.3 204.72h11.66v-12.54q0-1.77.24-3.92zm17.36 0h4.82v3.79q0 .53-.35.91-.34.39-.98.39h-3.49v9.35h-5.7v-9.35H82.79q-.66 0-1.16-.42-.51-.41-.64-1.02l-.69-3.31 18.16-24.25h6.2zm35.59-4.72q0 5.01-1.08 8.71-1.07 3.69-2.97 6.1-1.89 2.42-4.47 3.59-2.59 1.18-5.58 1.18-3 0-5.55-1.18-2.56-1.17-4.44-3.59-1.88-2.41-2.94-6.1-1.06-3.7-1.06-8.71 0-5.03 1.06-8.72 1.06-3.68 2.94-6.09t4.44-3.59q2.55-1.18 5.55-1.18 2.99 0 5.58 1.18 2.58 1.18 4.47 3.59 1.9 2.41 2.97 6.09 1.08 3.69 1.08 8.72m-6.76 0q0-4.16-.61-6.89t-1.63-4.35q-1.02-1.61-2.35-2.26-1.32-.65-2.75-.65-1.41 0-2.72.65t-2.32 2.26q-1 1.62-1.6 4.35t-.6 6.89.6 6.89 1.6 4.35q1.01 1.61 2.32 2.26t2.72.65q1.43 0 2.75-.65 1.33-.65 2.35-2.26 1.02-1.62 1.63-4.35t.61-6.89m37.5 0q0 5.01-1.08 8.71-1.07 3.69-2.97 6.1-1.89 2.42-4.47 3.59-2.59 1.18-5.58 1.18-3 0-5.55-1.18-2.56-1.17-4.44-3.59-1.88-2.41-2.94-6.1-1.06-3.7-1.06-8.71 0-5.03 1.06-8.72 1.06-3.68 2.94-6.09t4.44-3.59q2.55-1.18 5.55-1.18 2.99 0 5.58 1.18 2.58 1.18 4.47 3.59 1.9 2.41 2.97 6.09 1.08 3.69 1.08 8.72m-6.76 0q0-4.16-.61-6.89t-1.63-4.35q-1.02-1.61-2.35-2.26-1.32-.65-2.75-.65-1.41 0-2.72.65t-2.32 2.26q-1 1.62-1.6 4.35t-.6 6.89.6 6.89 1.6 4.35q1.01 1.61 2.32 2.26t2.72.65q1.43 0 2.75-.65 1.33-.65 2.35-2.26 1.02-1.62 1.63-4.35t.61-6.89m48.84 10.39-3.47 3.42-8.99-8.99-9.06 9.04-3.47-3.42 9.06-9.09-8.64-8.64 3.45-3.44 8.64 8.64 8.58-8.59 3.5 3.45-8.61 8.61zm22.95-5.67h11.66v-12.54q0-1.77.24-3.92zm17.35 0h4.83v3.79q0 .53-.35.91-.34.39-.98.39h-3.5v9.35h-5.69v-9.35h-16.17q-.66 0-1.16-.42-.51-.41-.64-1.02l-.69-3.31 18.15-24.25h6.2zm35.59-4.72q0 5.01-1.07 8.71-1.07 3.69-2.97 6.1-1.89 2.42-4.48 3.59-2.58 1.18-5.57 1.18-3 0-5.56-1.18-2.55-1.17-4.43-3.59-1.89-2.41-2.95-6.1-1.06-3.7-1.06-8.71 0-5.03 1.06-8.72 1.06-3.68 2.95-6.09 1.88-2.41 4.43-3.59 2.56-1.18 5.56-1.18 2.99 0 5.57 1.18 2.59 1.18 4.48 3.59 1.9 2.41 2.97 6.09 1.07 3.69 1.07 8.72m-6.75 0q0-4.16-.61-6.89t-1.63-4.35q-1.02-1.61-2.35-2.26-1.32-.65-2.75-.65-1.41 0-2.72.65t-2.32 2.26q-1.01 1.62-1.6 4.35-.6 2.73-.6 6.89t.6 6.89q.59 2.73 1.6 4.35 1.01 1.61 2.32 2.26t2.72.65q1.43 0 2.75-.65 1.33-.65 2.35-2.26 1.02-1.62 1.63-4.35t.61-6.89m37.49 0q0 5.01-1.07 8.71-1.07 3.69-2.97 6.1-1.89 2.42-4.48 3.59-2.58 1.18-5.57 1.18-3 0-5.56-1.18-2.55-1.17-4.43-3.59-1.89-2.41-2.95-6.1-1.06-3.7-1.06-8.71 0-5.03 1.06-8.72 1.06-3.68 2.95-6.09 1.88-2.41 4.43-3.59 2.56-1.18 5.56-1.18 2.99 0 5.57 1.18 2.59 1.18 4.48 3.59 1.9 2.41 2.97 6.09 1.07 3.69 1.07 8.72m-6.75 0q0-4.16-.61-6.89t-1.63-4.35q-1.02-1.61-2.35-2.26-1.32-.65-2.75-.65-1.41 0-2.72.65t-2.32 2.26q-1.01 1.62-1.6 4.35-.6 2.73-.6 6.89t.6 6.89q.59 2.73 1.6 4.35 1.01 1.61 2.32 2.26t2.72.65q1.43 0 2.75-.65 1.33-.65 2.35-2.26 1.02-1.62 1.63-4.35t.61-6.89"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="400" height="600" viewBox="0 0 400 600"><rect width="100%" height="100%" fill="#DDDDDD"/><path fill="#999999" d="M87.3 304.72h11.66v-12.54q0-1.77.24-3.92zm17.36 0h4.82v3.79q0 .53-.35.91-.34.39-.98.39h-3.49v9.35h-5.7v-9.35H82.79q-.66 0-1.16-.42-.51-.41-.64-1.02l-.69-3.31 18.16-24.25h6.2zm35.59-4.72q0 5.01-1.08 8.71-1.07 3.69-2.97 6.1-1.89 2.42-4.47 3.59-2.59 1.18-5.58 1.18-3 0-5.55-1.18-2.56-1.17-4.44-3.59-1.88-2.41-2.94-6.1-1.06-3.7-1.06-8.71 0-5.03 1.06-8.72 1.06-3.68 2.94-6.09t4.44-3.59q2.55-1.18 5.55-1.18 2.99 0 5.58 1.18 2.58 1.18 4.47 3.59 1.9 2.41 2.97 6.09 1.08 3.69 1.08 8.72m-6.76 0q0-4.16-.61-6.89t-1.63-4.35q-1.02-1.61-2.35-2.26-1.32-.65-2.75-.65-1.41 0-2.72.65t-2.32 2.26q-1 1.62-1.6 4.35t-.6 6.89.6 6.89 1.6 4.35q1.01 1.61 2.32 2.26t2.72.65q1.43 0 2.75-.65 1.33-.65 2.35-2.26 1.02-1.62 1.63-4.35t.61-6.89m37.5 0q0 5.01-1.08 8.71-1.07 3.69-2.97 6.1-1.89 2.42-4.47 3.59-2.59 1.18-5.58 1.18-3 0-5.55-1.18-2.56-1.17-4.44-3.59-1.88-2.41-2.94-6.1-1.06-3.7-1.06-8.71 0-5.03 1.06-8.72 1.06-3.68 2.94-6.09t4.44-3.59q2.55-1.18 5.55-1.18 2.99 0 5.58 1.18 2.58 1.18 4.47 3.59 1.9 2.41 2.97 6.09 1.08 3.69 1.08 8.72m-6.76 0q0-4.16-.61-6.89t-1.63-4.35q-1.02-1.61-2.35-2.26-1.32-.65-2.75-.65-1.41 0-2.72.65t-2.32 2.26q-1 1.62-1.6 4.35t-.6 6.89.6 6.89 1.6 4.35q1.01 1.61 2.32 2.26t2.72.65q1.43 0 2.75-.65 1.33-.65 2.35-2.26 1.02-1.62 1.63-4.35t.61-6.89m48.84 10.39-3.47 3.42-8.99-8.99-9.06 9.04-3.47-3.42 9.06-9.09-8.64-8.64 3.45-3.44 8.64 8.64 8.58-8.59 3.5 3.45-8.61 8.61zm40.94-29.55-11.37 13.91-1.32 1.65q1.11-.56 2.4-.86 1.28-.31 2.76-.31 2.18 0 4.23.72 2.05.71 3.62 2.16 1.56 1.44 2.52 3.59.95 2.14.95 5 0 2.68-.98 5.03-.98 2.34-2.76 4.09-1.77 1.75-4.28 2.76-2.5 1-5.52 1-3.08 0-5.51-.98-2.44-.98-4.16-2.74-1.73-1.76-2.64-4.24-.92-2.48-.92-5.5 0-2.7 1.1-5.55t3.41-5.92l9.14-12.27q.48-.64 1.39-1.09.92-.45 2.11-.45zm-9.88 33.39q1.56 0 2.87-.53t2.25-1.48q.94-.96 1.47-2.24.53-1.29.53-2.8 0-1.64-.5-2.95t-1.43-2.23q-.93-.91-2.23-1.39-1.29-.48-2.86-.48-1.56 0-2.83.53-1.28.53-2.18 1.47t-1.4 2.23-.5 2.77q0 1.59.43 2.9.44 1.31 1.3 2.24t2.13 1.44q1.28.52 2.95.52M288.96 300q0 5.01-1.07 8.71-1.07 3.69-2.97 6.1-1.89 2.42-4.48 3.59-2.58 1.18-5.57 1.18-3 0-5.56-1.18-2.55-1.17-4.43-3.59-1.89-2.41-2.95-6.1-1.06-3.7-1.06-8.71 0-5.03 1.06-8.72 1.06-3.68 2.95-6.09 1.88-2.41 4.43-3.59 2.56-1.18 5.56-1.18 2.99 0 5.57 1.18 2.59 1.18 4.48 3.59 1.9 2.41 2.97 6.09 1.07 3.69 1.07 8.72m-6.75 0q0-4.16-.61-6.89t-1.63-4.35q-1.02-1.61-2.35-2.26-1.32-.65-2.75-.65-1.41 0-2.72.65t-2.32 2.26q-1.01 1.62-1.6 4.35-.6 2.73-.6 6.89t.6 6.89q.59 2.73 1.6 4.35 1.01 1.61 2.32 2.26t2.72.65q1.43 0 2.75-.65 1.33-.65 2.35-2.26 1.02-1.62 1.63-4.35t.61-6.89m37.49 0q0 5.01-1.07 8.71-1.07 3.69-2.97 6.1-1.89 2.42-4.48 3.59-2.58 1.18-5.57 1.18-3 0-5.56-1.18-2.55-1.17-4.43-3.59-1.89-2.41-2.95-6.1-1.06-3.7-1.06-8.71 0-5.03 1.06-8.72 1.06-3.68 2.95-6.09 1.88-2.41 4.43-3.59 2.56-1.18 5.56-1.18 2.99 0 5.57 1.18 2.59 1.18 4.48 3.59 1.9 2.41 2.97 6.09 1.07 3.69 1.07 8.72m-6.75 0q0-4.16-.61-6.89t-1.63-4.35q-1.02-1.61-2.35-2.26-1.32-.65-2.75-.65-1.41 0-2.72.65t-2.32 2.26q-1.01 1.62-1.6 4.35-.6 2.73-.6 6.89t.6 6.89q.59 2.73 1.6 4.35 1.01 1.61 2.32 2.26t2.72.65q1.43 0 2.75-.65 1.33-.65 2.35-2.26 1.02-1.62 1.63-4.35t.61-6.89"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="600" height="400" viewBox="0 0 600 400"><rect width="100%" height="100%" fill="#DDDDDD"/><path fill="#999999" d="m155.52 171.08-17.16 21-2 2.48q1.68-.84 3.62-1.3t4.18-.46q3.28 0 6.38 1.08t5.46 3.26 3.8 5.42 1.44 7.56q0 4.04-1.48 7.58t-4.16 6.18-6.46 4.16-8.34 1.52q-4.64 0-8.32-1.48t-6.28-4.14-3.98-6.4-1.38-8.3q0-4.08 1.66-8.38t5.14-8.94l13.8-18.52q.72-.96 2.1-1.64t3.18-.68zm-14.92 50.4q2.36 0 4.34-.8t3.4-2.24 2.22-3.38.8-4.22q0-2.48-.76-4.46t-2.16-3.36-3.36-2.1-4.32-.72-4.28.8-3.28 2.22-2.12 3.36-.76 4.18q0 2.4.66 4.38t1.96 3.38 3.22 2.18 4.44.78M208.28 200q0 7.56-1.62 13.14t-4.48 9.22-6.76 5.42-8.42 1.78-8.38-1.78-6.7-5.42-4.44-9.22-1.6-13.14q0-7.6 1.6-13.16t4.44-9.2 6.7-5.42 8.38-1.78 8.42 1.78 6.76 5.42 4.48 9.2 1.62 13.16m-10.2 0q0-6.28-.92-10.4t-2.46-6.56-3.54-3.42-4.16-.98q-2.12 0-4.1.98t-3.5 3.42-2.42 6.56-.9 10.4.9 10.4 2.42 6.56 3.5 3.42 4.1.98q2.16 0 4.16-.98t3.54-3.42 2.46-6.56.92-10.4m56.6 0q0 7.56-1.62 13.14t-4.48 9.22-6.76 5.42-8.42 1.78-8.38-1.78-6.7-5.42-4.44-9.22-1.6-13.14q0-7.6 1.6-13.16t4.44-9.2 6.7-5.42 8.38-1.78 8.42 1.78 6.76 5.42 4.48 9.2 1.62 13.16m-10.2 0q0-6.28-.92-10.4t-2.46-6.56-3.54-3.42-4.16-.98q-2.12 0-4.1.98t-3.5 3.42-2.42 6.56-.9 10.4.9 10.4 2.42 6.56 3.5 3.42 4.1.98q2.16 0 4.16-.98t3.54-3.42 2.46-6.56.92-10.4m73.72 15.68-5.24 5.16-13.56-13.56-13.68 13.64-5.24-5.16 13.68-13.72L281.12 189l5.2-5.2 13.04 13.04 12.96-12.96 5.28 5.2-13 13zm34.64-8.56h17.6V188.2q0-2.68.36-5.92zm26.2 0h7.28v5.72q0 .8-.52 1.38t-1.48.58h-5.28v14.12h-8.6V214.8h-24.4q-1 0-1.76-.62t-.96-1.54l-1.04-5 27.4-36.6h9.36zm53.72-7.12q0 7.56-1.62 13.14t-4.48 9.22-6.76 5.42-8.42 1.78-8.38-1.78-6.7-5.42-4.44-9.22-1.6-13.14q0-7.6 1.6-13.16t4.44-9.2 6.7-5.42 8.38-1.78 8.42 1.78 6.76 5.42 4.48 9.2 1.62 13.16m-10.2 0q0-6.28-.92-10.4t-2.46-6.56-3.54-3.42-4.16-.98q-2.12 0-4.1.98t-3.5 3.42-2.42 6.56-.9 10.4.9 10.4 2.42 6.56 3.5 3.42 4.1.98q2.16 0 4.16-.98t3.54-3.42 2.46-6.56.92-10.4m56.6 0q0 7.56-1.62 13.14t-4.48 9.22-6.76 5.42-8.42 1.78-8.38-1.78-6.7-5.42-4.44-9.22-1.6-13.14q0-7.6 1.6-13.16t4.44-9.2 6.7-5.42 8.38-1.78 8.42 1.78 6.76 5.42 4.48 9.2 1.62 13.16m-10.2 0q0-6.28-.92-10.4t-2.46-6.56-3.54-3.42-4.16-.98q-2.12 0-4.1.98t-3.5 3.42-2.42 6.56-.9 10.4.9 10.4 2.42 6.56 3.5 3.42 4.1.98q2.16 0 4.16-.98t3.54-3.42 2.46-6.56.92-10.4"/></svg>
@@ -8,7 +8,7 @@ export default defineConfig({
8
8
  // `subgrid` is the drift this catches, and it is only ever cheap to fix at the
9
9
  // moment it is written. `vitops lint` takes the staged paths as positionals.
10
10
  'src/**/*.{astro,html,ts,tsx,jsx,vue,svelte,css}':
11
- 'vitops lint -i design-system.json -f tailwind --strict',
11
+ 'vitops lint -i site.json -f tailwind --strict',
12
12
  },
13
13
  fmt: {
14
14
  ignorePatterns: ['dist/**', 'node_modules/**', 'src/styles/**', 'public/vitops/**'],
@@ -4,11 +4,16 @@
4
4
  "main": "./src/worker.ts",
5
5
  "compatibility_date": "2026-02-24",
6
6
  "compatibility_flags": ["nodejs_compat"],
7
+ // Explicit rather than relying on wrangler's default: this is the fact that
8
+ // lets a first deploy go live at <name>.<account>.workers.dev without
9
+ // touching any existing site's DNS — see SETUP.html's "Domain strategy"
10
+ // stage and site.json's environments.production.url.
7
11
  "workers_dev": true,
8
12
  // Custom domain: uncomment and set your apex. Cloudflare provisions the DNS
9
- // record + TLS cert on deploy (the zone must already exist in the account).
10
- // The dev deploy (scripts/build-dev-wrangler.mjs) automatically serves the
11
- // dev worker from dev.<domain> when this is set.
13
+ // record + TLS cert on deploy (the zone must already exist in the account) —
14
+ // and OVERWRITES it, the moment an existing live site at that domain goes
15
+ // dark. The dev deploy (scripts/build-dev-wrangler.mjs) automatically serves
16
+ // the dev worker from dev.<domain> when this is set.
12
17
  // "routes": [{ "pattern": "example.com", "custom_domain": true }],
13
18
  // No database_id / bucket ids needed up front: wrangler provisions the D1
14
19
  // database and R2 bucket on the first `pnpm deploy` if they don't exist.
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: setup
3
+ description: Work the client-onboarding checklist (SETUP.html) autonomously — GitHub repo + branch policy, hosting resources, Search Console/GCP/ads connections. Use when the user asks to set up, onboard, or provision this project (e.g. "run setup", "onboard this site", "get this ready to deploy"). Never run this as a side effect of unrelated work, and never on your own initiative without the user asking.
4
+ ---
5
+
6
+ # Setup (client onboarding)
7
+
8
+ `SETUP.html` is the canonical checklist — this skill adds only sequencing,
9
+ gates, and where to stop. It does not restate the steps; read `SETUP.html`
10
+ (or `npx vitops setup --help`) for what each stage actually does and why.
11
+
12
+ ## Steps
13
+
14
+ 1. **Preview the whole sequence first.**
15
+
16
+ ```bash
17
+ npx vitops setup all --dry
18
+ ```
19
+
20
+ Read the plan before doing anything. It names every step it would take and
21
+ why any step is blocked — a missing credential, a field not yet in
22
+ `site.json`, GitHub Pro/Team gating branch protection.
23
+
24
+ 2. **Run it.**
25
+
26
+ ```bash
27
+ npx vitops setup all
28
+ ```
29
+
30
+ Re-run `npx vitops setup --check` after each leg rather than retrying on
31
+ your own judgment — a step already done resolves to a no-op skip, so a
32
+ second run is safe, and `--check` tells you exactly what still needs doing
33
+ instead of you guessing from output.
34
+
35
+ 3. **Tick `SETUP.html` boxes only for what you actually completed.** Never
36
+ check a box for a step marked below as human-only, even if you did
37
+ everything up to it — the human still has to act.
38
+
39
+ ## Hard stops — ask the human, do not attempt
40
+
41
+ - **The Cloudflare API token.** No API can create one; there is no command to
42
+ run. Tell the user to create it at
43
+ <https://dash.cloudflare.com/profile/api-tokens> (Workers + D1 + R2 edit)
44
+ and run `gh secret set CLOUDFLARE_API_TOKEN`, then continue.
45
+ - **The domain cutover** (`vitops setup domain`, stage 4b in `SETUP.html`).
46
+ Uncommenting the custom-domain route and deploying overwrites the zone's DNS
47
+ record at that instant — it takes an existing live site down. `setup domain`
48
+ only ever plans and checks this; it never applies it, and neither should
49
+ you. Report the plan and hand the actual cutover to the user.
50
+ - **Publishing any generated legal document.** `vitops legal` renders a
51
+ starting point from the config, not a reviewed policy. Generate it, tell the
52
+ user it needs review, and stop — do not paste it into the admin or commit it
53
+ yourself.
54
+
55
+ ## If something is blocked
56
+
57
+ `vitops setup --check` names the field or credential and where to get it —
58
+ report that verbatim rather than guessing at a fix. A step reported as
59
+ "blocked" is not a failure to retry; it is waiting on one of the hard stops
60
+ above, or on a `site.json` field the user still needs to fill in (stage 5,
61
+ Configuration).
@@ -0,0 +1 @@
1
+ CLOUDFLARE_API_TOKEN=your_cloudflare_api_token
@@ -0,0 +1,12 @@
1
+ # Runs on every PR: typecheck + design-lint + build. deploy-dev.yml /
2
+ # deploy-prod.yml call the same reusable `site-ci.yml` themselves before they
3
+ # deploy, so this is what gives a PR the identical signal before it's even
4
+ # merged to `dev` — a broken build never reaches the dev worker.
5
+ name: CI
6
+
7
+ on:
8
+ pull_request:
9
+
10
+ jobs:
11
+ ci:
12
+ uses: getvitops/design-system/.github/workflows/site-ci.yml@v1
@@ -0,0 +1,33 @@
1
+ # Deploys the `dev` branch to the isolated dev worker (<name>-dev, and
2
+ # dev.<domain> if a custom domain is configured in wrangler.jsonc).
3
+ # `dev` is the integration branch — every push here refreshes the review site.
4
+ # Promote to production with the "Promote dev → main" workflow (promote.yml).
5
+ #
6
+ # Deploys via the vitops toolchain's reusable static-site deploy workflow — see
7
+ # https://github.com/getvitops/design-system/blob/main/.github/workflows/site-deploy-static.yml
8
+ # Pinned to @v1 so a fix there reaches this repo without a manual re-paste;
9
+ # bump the tag deliberately if you want to pick up a change.
10
+ #
11
+ # Required repo secrets:
12
+ # CLOUDFLARE_API_TOKEN — token with Workers edit on this account
13
+ # CLOUDFLARE_ACCOUNT_ID — the Cloudflare account id
14
+ name: Deploy dev
15
+
16
+ on:
17
+ push:
18
+ branches: [dev]
19
+
20
+ concurrency:
21
+ group: deploy-dev
22
+ cancel-in-progress: true
23
+
24
+ jobs:
25
+ deploy:
26
+ uses: getvitops/design-system/.github/workflows/site-deploy-static.yml@v1
27
+ with:
28
+ environment: dev
29
+ worker-name-suffix: -dev
30
+ route-prefix: dev.
31
+ secrets:
32
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
33
+ CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
@@ -0,0 +1,29 @@
1
+ # Deploys `main` to production.
2
+ # `main` should be branch-protected — it then only advances via the Promote
3
+ # workflow (promote.yml), so a push here always represents promoted code. The
4
+ # `production` GitHub Environment (set up by `scripts/init-github.mjs`) has
5
+ # required reviewers restricted to admins, so this PAUSES for approval before
6
+ # deploying.
7
+ #
8
+ # Deploys via the vitops toolchain's reusable static-site deploy workflow — see
9
+ # https://github.com/getvitops/design-system/blob/main/.github/workflows/site-deploy-static.yml
10
+ #
11
+ # Required repo secrets: CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID
12
+ name: Deploy prod
13
+
14
+ on:
15
+ push:
16
+ branches: [main]
17
+
18
+ concurrency:
19
+ group: deploy-prod
20
+ cancel-in-progress: false
21
+
22
+ jobs:
23
+ deploy:
24
+ uses: getvitops/design-system/.github/workflows/site-deploy-static.yml@v1
25
+ with:
26
+ environment: production
27
+ secrets:
28
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
29
+ CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
@@ -0,0 +1,16 @@
1
+ # Promote dev → main. Run manually after reviewing the dev site.
2
+ # Opens a PR from dev into the protected `main` branch and enables auto-merge;
3
+ # the merge triggers Deploy prod.
4
+ #
5
+ # Deploys via the vitops toolchain's reusable promote workflow — see
6
+ # https://github.com/getvitops/design-system/blob/main/.github/workflows/site-promote.yml
7
+ # for the branch-protection / PROMOTE_TOKEN options.
8
+ name: Promote dev → main
9
+
10
+ on:
11
+ workflow_dispatch:
12
+
13
+ jobs:
14
+ promote:
15
+ uses: getvitops/design-system/.github/workflows/site-promote.yml@v1
16
+ secrets: inherit
@@ -0,0 +1 @@
1
+ 24
@@ -0,0 +1,64 @@
1
+ This is a static Astro website styled by the Vitops design system, deployed
2
+ as Cloudflare Workers static assets (no server runtime, no database).
3
+
4
+ ## Ground rules
5
+
6
+ - `site.json` is the single source of truth — organization + site facts, and
7
+ the design system (colors, type, spacing, patterns, animations) under
8
+ `designSystem.themes.default`. Never edit `src/styles/` by hand — it is
9
+ generated from `site.json` by the `vitops()` integration on every dev/build
10
+ and is gitignored. (There is no separate `design-system.json`: a scaffolded
11
+ config can't merely reference a sibling file, so the token set lives inside
12
+ `site.json`.)
13
+ - `src/assets/placeholder/` holds neutral wireframe stand-ins (square,
14
+ portrait, landscape; SVG + PNG) for layout work before real imagery
15
+ exists. Delete the directory once real assets land.
16
+ - Prefer framework CSS classes (utilities, patterns, type roles like
17
+ `font-heading`) over bespoke CSS. Run `npx vitops agents` to append the
18
+ full generated class-vocabulary reference to this file.
19
+ - **Layout foundations — these are the answer, not a starting point.** Six
20
+ substitutions carry the structure of nearly every page:
21
+ | About to write… | Write instead |
22
+ | --- | --- |
23
+ | a `wrap`/`wrapper`/`container`/`inner` class | **`centered`** |
24
+ | `max-width` + `margin-inline: auto` | **`centered`** |
25
+ | `padding-block` on a section | **`region`** |
26
+ | margins between headings/paragraphs/lists | **`rhythm`** |
27
+ | `display: grid` + `grid-template-columns: repeat(n, …)` | **`subgrid`** |
28
+ | `repeat(auto-fit, minmax(…))` | **`grid-auto`** |
29
+ | `display: flex` + `gap` for a row of controls | **`cluster`** |
30
+ - Every page is prerendered by default (`output: 'static'`) — there is no
31
+ server to fall back to, so nothing here can read request-time data
32
+ (cookies, headers, query params) at render time. If a page genuinely needs
33
+ that, it needs an adapter and a different template — this one stays pure
34
+ static on purpose.
35
+ - **`SETUP.html` is the client-onboarding checklist.** When working it via the
36
+ `.agents/skills/setup/` skill, tick a box only for a step you actually
37
+ completed — never on the operator's behalf for a step marked human-only
38
+ (the Cloudflare API token, the domain cutover, publishing legal documents).
39
+
40
+ ## Branch model
41
+
42
+ - Work on **`dev`** (the integration branch). Every push auto-deploys the
43
+ isolated `-dev` worker (`dev.<domain>` with a custom domain).
44
+ - **`main`** is production and branch-protected — never push or merge to it
45
+ directly. Production ships only via the manual **promote** flow:
46
+ `.github/workflows/promote.yml`, dispatched manually, opens a `dev → main`
47
+ PR with auto-merge; merging deploys prod. Only run it when the user
48
+ explicitly asks to promote/ship to production.
49
+
50
+ ## Commands
51
+
52
+ - `pnpm dev` — local dev
53
+ - `pnpm typecheck` — `astro check`
54
+ - `pnpm run build:css` — regenerate the framework CSS from `site.json`
55
+ - `pnpm deploy` — build + `wrangler deploy` to prod
56
+ - `pnpm run deploy:dev` — build + deploy the isolated dev worker
57
+ - `pnpm run init:github` — one-time: create + push the GitHub repo (main +
58
+ dev, dev default, branch protection + environment policy). Only run when
59
+ the user asks to set up GitHub.
60
+ - `pnpm run init:hosting` — one-time: read the Cloudflare account id and set
61
+ it as a repo secret. Only run when the user asks for it.
62
+ - `npx vitops validate site.json` — schema-check the site config
63
+ - `npx vitops lint -i site.json -f css` — find framework classes in
64
+ source that resolve to nothing under this format
@@ -0,0 +1,80 @@
1
+ # My Static Site
2
+
3
+ A static [Astro](https://astro.build) website on Cloudflare Workers (static
4
+ assets — no server runtime), styled by the
5
+ [Vitops design system](https://www.npmjs.com/org/getvitops).
6
+
7
+ Scaffolded from `vp create @getvitops:static`.
8
+
9
+ ## Stack
10
+
11
+ - **Astro** (`output: 'static'`) on **Cloudflare Workers Static Assets** — no
12
+ adapter, no database, no server runtime
13
+ - **`@getvitops/astro`** — generates the design-system CSS from `site.json`
14
+ (design tokens live at `designSystem.themes.default`) and serves the
15
+ web-component runtime
16
+
17
+ `src/assets/placeholder/` ships neutral wireframe images for layout work
18
+ before real imagery exists — delete once real assets land.
19
+
20
+ ## Local development
21
+
22
+ ```bash
23
+ pnpm install
24
+ pnpm dev
25
+ ```
26
+
27
+ - Site: <http://localhost:4321>
28
+
29
+ ## Deploy
30
+
31
+ ```bash
32
+ npx wrangler login
33
+ pnpm deploy
34
+ ```
35
+
36
+ For a custom domain, uncomment the `routes` block in `wrangler.jsonc` and set
37
+ your apex — Cloudflare provisions the DNS record + TLS cert on deploy.
38
+
39
+ ## Environments: dev → main promotion
40
+
41
+ The repo ships a two-environment flow modeled on branch = environment:
42
+
43
+ - **`dev`** is the integration branch. Every push auto-deploys the isolated
44
+ `-dev` worker (`.github/workflows/deploy-dev.yml`), served at
45
+ `dev.<domain>` when a custom domain is configured (or the worker's
46
+ `workers.dev` URL otherwise).
47
+ - **`main`** is production. Every push auto-deploys the prod worker
48
+ (`.github/workflows/deploy-prod.yml`) — gated behind a `production`
49
+ GitHub Environment that requires an admin's approval before it runs.
50
+ - **Promotion is manual**: run the **"Promote dev → main"** workflow
51
+ (`.github/workflows/promote.yml`) and it opens a PR from `dev` into `main`
52
+ with auto-merge enabled. With required reviews on `main`, a human approves
53
+ the PR; merging deploys prod (after the admin approval above).
54
+
55
+ One-time setup — work through the checklist:
56
+
57
+ ```bash
58
+ pnpm run sop && open SETUP.html # or: xdg-open SETUP.html
59
+ ```
60
+
61
+ It covers host choice, GitHub + branch policy, hosting resources, going live
62
+ safely on `*.workers.dev` before any custom-domain cutover, configuration,
63
+ Search Console/GCP/ads connections, legal documents, and launch gates — one
64
+ command per step. An AI agent can work the same list autonomously via
65
+ `.agents/skills/setup/`; it stops at the steps that genuinely need a human
66
+ (the Cloudflare API token, the domain cutover, publishing legal documents).
67
+
68
+ `pnpm run deploy:dev` reproduces the dev deploy locally: it writes a
69
+ gitignored `.wrangler.dev.json` with the worker renamed and any custom-domain
70
+ route prefixed `dev.` (`scripts/dev-wrangler-config.mjs`), so it never
71
+ touches the prod worker.
72
+
73
+ ## CI/deploy workflows
74
+
75
+ `.github/workflows/{ci,deploy-dev,deploy-prod,promote}.yml` are thin callers
76
+ of reusable workflows published by
77
+ [`getvitops/design-system`](https://github.com/getvitops/design-system),
78
+ pinned to `@v1`. A fix to the shared deploy logic there reaches this repo the
79
+ next time those workflows run — no re-pasting needed. Bump the pin
80
+ deliberately if you want to hold back a change.