@getvitops/create 0.5.0 → 0.6.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 (46) hide show
  1. package/CHANGELOG.md +13 -5
  2. package/README.md +7 -0
  3. package/package.json +17 -2
  4. package/templates/emdash/.env +1 -0
  5. package/templates/emdash/.github/workflows/ci.yml +12 -0
  6. package/templates/emdash/.github/workflows/deploy-dev.yml +17 -19
  7. package/templates/emdash/.github/workflows/deploy-prod.yml +17 -21
  8. package/templates/emdash/.github/workflows/promote.yml +8 -36
  9. package/templates/emdash/.mcp.json +4 -0
  10. package/templates/emdash/.nvmrc +1 -0
  11. package/templates/emdash/AGENTS.md +4 -0
  12. package/templates/emdash/README.md +4 -0
  13. package/templates/emdash/design-system.json +1 -1
  14. package/templates/emdash/scripts/init-github.mjs +94 -10
  15. package/templates/emdash/src/assets/placeholder/wireframe-400x400.png +0 -0
  16. package/templates/emdash/src/assets/placeholder/wireframe-400x400.svg +1 -0
  17. package/templates/emdash/src/assets/placeholder/wireframe-400x600.png +0 -0
  18. package/templates/emdash/src/assets/placeholder/wireframe-400x600.svg +1 -0
  19. package/templates/emdash/src/assets/placeholder/wireframe-600x400.png +0 -0
  20. package/templates/emdash/src/assets/placeholder/wireframe-600x400.svg +1 -0
  21. package/templates/static/.env +1 -0
  22. package/templates/static/.github/workflows/ci.yml +12 -0
  23. package/templates/static/.github/workflows/deploy-dev.yml +33 -0
  24. package/templates/static/.github/workflows/deploy-prod.yml +29 -0
  25. package/templates/static/.github/workflows/promote.yml +16 -0
  26. package/templates/static/.nvmrc +1 -0
  27. package/templates/static/AGENTS.md +57 -0
  28. package/templates/static/README.md +85 -0
  29. package/templates/static/_gitignore +24 -0
  30. package/templates/static/astro.config.mjs +19 -0
  31. package/templates/static/design-system.json +148 -0
  32. package/templates/static/package.json +39 -0
  33. package/templates/static/scripts/dev-wrangler-config.mjs +28 -0
  34. package/templates/static/scripts/init-github.mjs +186 -0
  35. package/templates/static/scripts/init-hosting.mjs +62 -0
  36. package/templates/static/src/assets/placeholder/wireframe-400x400.png +0 -0
  37. package/templates/static/src/assets/placeholder/wireframe-400x400.svg +1 -0
  38. package/templates/static/src/assets/placeholder/wireframe-400x600.png +0 -0
  39. package/templates/static/src/assets/placeholder/wireframe-400x600.svg +1 -0
  40. package/templates/static/src/assets/placeholder/wireframe-600x400.png +0 -0
  41. package/templates/static/src/assets/placeholder/wireframe-600x400.svg +1 -0
  42. package/templates/static/src/layouts/Layout.astro +26 -0
  43. package/templates/static/src/pages/404.astro +11 -0
  44. package/templates/static/src/pages/index.astro +13 -0
  45. package/templates/static/tsconfig.json +5 -0
  46. package/templates/static/wrangler.jsonc +15 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @getvitops/create
2
2
 
3
+ ## 0.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Scaffolded `static` and `emdash` projects now ship neutral placeholder wireframe images under
8
+ `src/assets/placeholder/` (square, portrait, landscape; SVG + PNG) for layout work before real
9
+ imagery exists. Delete the directory once real assets land.
10
+
3
11
  ## 0.5.0
4
12
 
5
13
  ### Minor Changes
@@ -227,15 +235,15 @@
227
235
  which `@getvitops/astro` re-exports wholesale. So from `astro.config.mjs`:
228
236
 
229
237
  ```js
230
- import { generateIconInclude } from '@getvitops/astro';
231
- import icon from 'astro-icon';
238
+ import { generateIconInclude } from "@getvitops/astro";
239
+ import icon from "astro-icon";
232
240
 
233
241
  integrations: [
234
242
  icon({
235
243
  include: generateIconInclude({
236
- ui: 'fa7-solid',
237
- brand: 'simple-icons',
238
- semantic: ['menu', 'close', 'search', 'github'],
244
+ ui: "fa7-solid",
245
+ brand: "simple-icons",
246
+ semantic: ["menu", "close", "search", "github"],
239
247
  }),
240
248
  }),
241
249
  ];
package/README.md CHANGED
@@ -73,6 +73,13 @@ provisions the D1/R2 resources on first deploy).
73
73
  Template dependencies must use concrete npm ranges (no `workspace:*` /
74
74
  `catalog:` — the scaffolded project lives outside this monorepo).
75
75
 
76
+ `assets/` (this package root, unpublished) is the source of truth for
77
+ placeholder imagery shared across templates — `vp create` copies only the
78
+ one directory a template names, so there's no step that could copy a
79
+ sibling `assets/` for you. Mirror any new file into each template's
80
+ `src/assets/placeholder/` by hand; `templates.test.ts` asserts every mirror
81
+ stays byte-identical to the source.
82
+
76
83
  ## Changelog
77
84
 
78
85
  This package's history: [`CHANGELOG.md`](./CHANGELOG.md) (shipped in the npm tarball, so it
package/package.json CHANGED
@@ -1,8 +1,15 @@
1
1
  {
2
2
  "name": "@getvitops/create",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "Project templates for the Vitops design system — scaffold wired-up sites with `vp create @getvitops`.",
5
+ "homepage": "https://docs.vitops.ca",
6
+ "bugs": "https://github.com/getvitops/design-system/issues",
5
7
  "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/getvitops/design-system.git",
11
+ "directory": "packages/create"
12
+ },
6
13
  "files": [
7
14
  "templates",
8
15
  "CHANGELOG.md"
@@ -12,10 +19,18 @@
12
19
  "access": "public"
13
20
  },
14
21
  "devDependencies": {
15
- "vitest": "^4.1.9"
22
+ "vitest": "4.1.9"
23
+ },
24
+ "engines": {
25
+ "node": ">=24"
16
26
  },
17
27
  "createConfig": {
18
28
  "templates": [
29
+ {
30
+ "name": "static",
31
+ "description": "Static Astro website on Cloudflare Workers static assets with the Vitops design system pre-wired",
32
+ "template": "./templates/static"
33
+ },
19
34
  {
20
35
  "name": "emdash",
21
36
  "description": "EmDash CMS website on Cloudflare Workers (D1 + R2) with the Vitops design system pre-wired",
@@ -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
@@ -3,6 +3,11 @@
3
3
  # `dev` is the integration branch — every push here refreshes the review site.
4
4
  # Promote to production with the "Promote dev → main" workflow (promote.yml).
5
5
  #
6
+ # Deploys via the vitops toolchain's reusable EmDash deploy workflow — see
7
+ # https://github.com/getvitops/design-system/blob/main/.github/workflows/site-deploy-emdash.yml
8
+ # for what it does. Pinned to @v1 so a fix there reaches this repo without a
9
+ # manual re-paste; bump the tag deliberately if you want to pick up a change.
10
+ #
6
11
  # Required repo secrets:
7
12
  # CLOUDFLARE_API_TOKEN — token with Workers + D1 + R2 edit on this account
8
13
  # CLOUDFLARE_ACCOUNT_ID — the Cloudflare account id
@@ -14,28 +19,21 @@ on:
14
19
  push:
15
20
  branches: [dev]
16
21
 
17
- permissions:
18
- contents: read
19
-
20
22
  concurrency:
21
23
  group: deploy-dev
22
24
  cancel-in-progress: true
23
25
 
24
26
  jobs:
25
27
  deploy:
26
- runs-on: ubuntu-latest
27
- environment: dev
28
- steps:
29
- - uses: actions/checkout@v4
30
- - uses: pnpm/action-setup@v4
31
- - uses: actions/setup-node@v4
32
- with:
33
- node-version: '24'
34
- cache: pnpm
35
- - run: pnpm install --frozen-lockfile
36
- - name: Build + deploy dev worker
37
- run: pnpm run deploy:dev
38
- env:
39
- CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
40
- CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
41
- DEV_D1_ID: ${{ secrets.DEV_D1_ID }}
28
+ uses: getvitops/design-system/.github/workflows/site-deploy-emdash.yml@v1
29
+ with:
30
+ environment: dev
31
+ is-dev: true
32
+ # Set this to your dev worker's URL (or dev.<domain>) once known, so a
33
+ # bad migration fails the deploy instead of surfacing to the first
34
+ # visitor — see the reusable workflow's docblock.
35
+ health-check-url: ''
36
+ secrets:
37
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
38
+ CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
39
+ DEV_D1_ID: ${{ secrets.DEV_D1_ID }}
@@ -1,36 +1,32 @@
1
1
  # Deploys `main` to production.
2
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.
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.
4
7
  #
5
- # Required repo secrets:
6
- # CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID
8
+ # Deploys via the vitops toolchain's reusable EmDash deploy workflow — see
9
+ # https://github.com/getvitops/design-system/blob/main/.github/workflows/site-deploy-emdash.yml
10
+ #
11
+ # Required repo secrets: CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID
7
12
  name: Deploy prod
8
13
 
9
14
  on:
10
15
  push:
11
16
  branches: [main]
12
17
 
13
- permissions:
14
- contents: read
15
-
16
18
  concurrency:
17
19
  group: deploy-prod
18
20
  cancel-in-progress: false
19
21
 
20
22
  jobs:
21
23
  deploy:
22
- runs-on: ubuntu-latest
23
- environment: production
24
- steps:
25
- - uses: actions/checkout@v4
26
- - uses: pnpm/action-setup@v4
27
- - uses: actions/setup-node@v4
28
- with:
29
- node-version: '24'
30
- cache: pnpm
31
- - run: pnpm install --frozen-lockfile
32
- - name: Build + deploy prod worker
33
- run: pnpm run deploy
34
- env:
35
- CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
36
- CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
24
+ uses: getvitops/design-system/.github/workflows/site-deploy-emdash.yml@v1
25
+ with:
26
+ environment: production
27
+ is-dev: false
28
+ # Set this to your production URL once known.
29
+ health-check-url: ''
30
+ secrets:
31
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
32
+ CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
@@ -2,48 +2,20 @@
2
2
  # Opens a PR from dev into the protected `main` branch and enables auto-merge;
3
3
  # the merge triggers Deploy prod.
4
4
  #
5
- # Branch protection on `main` means the merge only completes when its rules are
6
- # satisfied. Choose ONE:
7
- # (a) let a human approve the PR (required reviews) — safest, full audit trail;
8
- # (b) set repo secret PROMOTE_TOKEN to a PAT / GitHub App token allowed to
9
- # bypass protection, for hands-off promotion.
10
- # The default GITHUB_TOKEN cannot approve its own PR, so with required reviews
11
- # the PR waits for a human — which is usually what you want for a prod promotion.
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.
12
8
  #
13
- # Schema/content promotion is deliberately NOT here — the content model lives in
14
- # the EmDash database, not git. Apply schema changes to prod via the admin or
15
- # the site's MCP server, additive changes before the code deploy that uses
9
+ # Schema/content promotion is deliberately NOT here — the content model lives
10
+ # in the EmDash database, not git. Apply schema changes to prod via the admin
11
+ # or the site's MCP server, additive changes before the code deploy that uses
16
12
  # them, removals after the code that stops using them.
17
13
  name: Promote dev → main
18
14
 
19
15
  on:
20
16
  workflow_dispatch:
21
17
 
22
- permissions:
23
- contents: write
24
- pull-requests: write
25
-
26
18
  jobs:
27
19
  promote:
28
- runs-on: ubuntu-latest
29
- steps:
30
- - uses: actions/checkout@v4
31
- with:
32
- fetch-depth: 0
33
- - name: Open promotion PR and enable auto-merge
34
- env:
35
- GH_TOKEN: ${{ secrets.PROMOTE_TOKEN || github.token }}
36
- run: |
37
- set -euo pipefail
38
- if gh pr view dev --base main --json number >/dev/null 2>&1; then
39
- echo "Promotion PR already open; ensuring auto-merge is enabled."
40
- else
41
- # printf, not a multi-line string: an unindented continuation line
42
- # would end this YAML block and break the whole workflow file.
43
- gh pr create --base main --head dev \
44
- --title "Promote dev → main" \
45
- --body "$(printf '%s\n\n%s' \
46
- "Automated code promotion from \`dev\`. Merging deploys to production." \
47
- "Remember: schema/content changes live in the EmDash database, not git — promote them separately if this release changes the content model.")"
48
- fi
49
- gh pr merge dev --auto --merge
20
+ uses: getvitops/design-system/.github/workflows/site-promote.yml@v1
21
+ secrets: inherit
@@ -7,6 +7,10 @@
7
7
  "emdash-docs": {
8
8
  "type": "http",
9
9
  "url": "https://docs.emdashcms.com/mcp"
10
+ },
11
+ "semrush": {
12
+ "type": "http",
13
+ "url": "https://mcp.semrush.com/v1/mcp"
10
14
  }
11
15
  }
12
16
  }
@@ -0,0 +1 @@
1
+ 24
@@ -7,6 +7,10 @@ styled by the Vitops design system.
7
7
  (colors, type, spacing, patterns, animations). Never edit
8
8
  `src/styles/tailwind.css` — it is generated from the JSON by the
9
9
  `vitops()` integration on every dev/build and is gitignored.
10
+ - `src/assets/placeholder/` holds neutral wireframe stand-ins (square,
11
+ portrait, landscape; SVG + PNG) for layout work before real imagery
12
+ exists. Delete the directory once real assets land — it's separate from
13
+ `src/assets/logo.svg`, the actual brand asset.
10
14
  - Content lives in the EmDash database, not in the repo. Query it with
11
15
  `getEmDashCollection` / `getEmDashEntry` from `emdash`; render Portable Text
12
16
  with `<PortableText />` from `emdash/ui` (the Vitops blocks from
@@ -16,6 +16,10 @@ Scaffolded from `vp create @getvitops:emdash`.
16
16
  - **`@getvitops/emdash`** — design-system Portable Text blocks in the editor
17
17
  slash menu: image compare, copy snippet, banner, disclosure, carousel
18
18
 
19
+ `src/assets/placeholder/` ships neutral wireframe images for layout work
20
+ before real imagery exists — delete once real assets land (separate from
21
+ `src/assets/logo.svg`, the brand asset).
22
+
19
23
  ## Local development
20
24
 
21
25
  ```bash
@@ -54,7 +54,7 @@
54
54
  "p": "1rem",
55
55
  "fs": "1rem"
56
56
  },
57
- "radii": { "pill": "999px", "circle": "50%" },
57
+ "radii": { "circle": "50%" },
58
58
  "groups": {
59
59
  "control": {
60
60
  "ds": "var(--ds-default)",
@@ -1,15 +1,29 @@
1
1
  // One-time GitHub bootstrap: creates a GitHub repo named after this project
2
- // (package.json name), pushes `main` + `dev`, and makes `dev` the default
3
- // branch — the shape the deploy workflows expect (deploy-dev on push to dev,
4
- // deploy-prod on push to main, promote.yml between them).
2
+ // (package.json name), pushes `main` + `dev`, makes `dev` the default branch,
3
+ // and provisions the branch-protection + environment policy the deploy
4
+ // workflows assume (deploy-dev on push to dev, deploy-prod on push to main,
5
+ // promote.yml between them):
6
+ //
7
+ // - `main` requires a PR + the `ci` status check — it only advances via
8
+ // promote.yml, never a direct push.
9
+ // - the `production` GitHub Environment requires review from an admin
10
+ // collaborator before deploy-prod.yml is allowed to run — this is the
11
+ // "promoting to prod needs admin sign-off" gate.
12
+ // - `dev` is left UNPROTECTED on purpose — that's what lets an agent (or
13
+ // anyone with push access) commit and merge there directly for
14
+ // integration; only the promotion to `main` is gated.
5
15
  //
6
16
  // pnpm run init:github # private repo (default)
7
17
  // pnpm run init:github -- --public
8
18
  // pnpm run init:github -- --dry-run
9
19
  //
10
- // Idempotent: safe to re-run — existing git repo, commits, dev branch, and
11
- // origin remote are all left alone. Requires the GitHub CLI (`gh`), logged in
12
- // (`gh auth login`).
20
+ // Idempotent: safe to re-run — existing git repo, commits, dev branch, origin
21
+ // remote, branch protection and environments are all left alone or updated
22
+ // in place. Requires the GitHub CLI (`gh`), logged in (`gh auth login`).
23
+ //
24
+ // NOTE: branch protection and environment required-reviewers are GitHub
25
+ // Pro/Team features on a PRIVATE repo. Each `gh api` call below prints the
26
+ // manual equivalent and continues rather than aborting when it 403s.
13
27
 
14
28
  import { execSync, spawnSync } from 'node:child_process';
15
29
  import { readFileSync } from 'node:fs';
@@ -48,6 +62,26 @@ function run(cmd) {
48
62
  }
49
63
  }
50
64
 
65
+ /**
66
+ * Like `run`, but for `gh api` calls that provision an org/plan-gated
67
+ * feature (branch protection, environment reviewers). A 403 there means the
68
+ * repo's plan doesn't support it — not that the bootstrap failed — so this
69
+ * prints the manual equivalent and keeps going instead of exiting.
70
+ */
71
+ function runPolicy(cmd, manualHint) {
72
+ if (dryRun) {
73
+ console.log(`[dry-run] ${cmd}`);
74
+ return;
75
+ }
76
+ console.log(`$ ${cmd}`);
77
+ const result = spawnSync(cmd, { shell: true, encoding: 'utf8' });
78
+ if (result.status === 0) return;
79
+ console.warn(
80
+ `\nWARNING: \`${cmd}\` failed (likely needs GitHub Pro/Team on a private repo).\n` +
81
+ `Set it up manually instead:\n ${manualHint}\n`,
82
+ );
83
+ }
84
+
51
85
  // --- Preflight: gh installed and authenticated -------------------------------
52
86
  if (check(['gh', '--version']).status !== 0) {
53
87
  console.error('ERROR: the GitHub CLI (`gh`) is required. Install it from https://cli.github.com');
@@ -64,7 +98,7 @@ if (quiet('git rev-parse --is-inside-work-tree') === null) {
64
98
  }
65
99
  if (quiet('git rev-parse HEAD') === null) {
66
100
  run('git add -A');
67
- run('git commit -m "Initial commit (scaffolded from @getvitops/create emdash template)"');
101
+ run('git commit -m "Initial commit (scaffolded from @getvitops/create)"');
68
102
  }
69
103
 
70
104
  // The workflows key off `main`; normalize whatever the initial branch is.
@@ -86,9 +120,58 @@ run('git push -u origin main dev');
86
120
  run('gh repo edit --default-branch dev');
87
121
  run('git checkout dev');
88
122
 
123
+ // --- Policy: protect main, gate production behind admin review --------------
124
+ const nwo = quiet('gh repo view --json nameWithOwner -q .nameWithOwner');
125
+ if (nwo) {
126
+ runPolicy(
127
+ `gh api -X PUT repos/${nwo}/branches/main/protection --input - <<'JSON'
128
+ {
129
+ "required_status_checks": { "strict": true, "contexts": ["ci"] },
130
+ "enforce_admins": false,
131
+ "required_pull_request_reviews": { "required_approving_review_count": 1 },
132
+ "restrictions": null,
133
+ "allow_force_pushes": false,
134
+ "allow_deletions": false
135
+ }
136
+ JSON`,
137
+ `Settings → Branches → protect 'main' (require a PR, 1 approval, the 'ci' ` +
138
+ `status check, no force-push/deletion).`,
139
+ );
140
+
141
+ const admins = quiet(
142
+ `gh api repos/${nwo}/collaborators?permission=admin -q '[.[].login]' 2>/dev/null`,
143
+ );
144
+ const reviewers = admins
145
+ ? JSON.parse(admins).map((login) => ({ type: 'User', id_or_login: login }))
146
+ : [];
147
+
148
+ runPolicy(
149
+ `gh api -X PUT repos/${nwo}/environments/production --input - <<'JSON'
150
+ {
151
+ "reviewers": ${JSON.stringify(reviewers)},
152
+ "deployment_branch_policy": { "protected_branches": true, "custom_branch_policies": false }
153
+ }
154
+ JSON`,
155
+ `Settings → Environments → 'production' → require reviewers = your admins, ` +
156
+ `restrict deployment branches to 'main'. This is the prod-needs-admin-approval gate.`,
157
+ );
158
+
159
+ // `dev` gets an environment too (for the deploy-dev workflow's `environment:
160
+ // dev` reference), but deliberately no reviewers and no branch restriction —
161
+ // that's what keeps it open for direct pushes/merges.
162
+ runPolicy(
163
+ `gh api -X PUT repos/${nwo}/environments/dev --input - <<'JSON'
164
+ { "reviewers": [] }
165
+ JSON`,
166
+ `Settings → Environments → create 'dev' with no required reviewers.`,
167
+ );
168
+ } else {
169
+ console.warn('WARNING: could not resolve the repo name-with-owner; skipping policy setup.');
170
+ }
171
+
89
172
  // --- What's left (manual, needs your Cloudflare account) ---------------------
90
173
  console.log(`
91
- Repo ready: main (production) + dev (integration, default branch).
174
+ Repo ready: main (protected, production) + dev (integration, default branch).
92
175
  NOTE: the first workflow runs will fail until the secrets below exist.
93
176
 
94
177
  Next steps:
@@ -97,6 +180,7 @@ Next steps:
97
180
  2. Secrets: gh secret set CLOUDFLARE_API_TOKEN
98
181
  gh secret set CLOUDFLARE_ACCOUNT_ID
99
182
  gh secret set DEV_D1_ID
100
- 3. Protect main: Settings → Branches → protect 'main' (require the
101
- promotion PR + review), so prod only ships via promote.yml.
183
+ 3. Verify policy: Settings → Branches (main protected?) and
184
+ Settings → Environments → production (reviewers set?) —
185
+ printed above if this ran on a plan that supports them.
102
186
  `);
@@ -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>
@@ -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