@rm-industries/create-forge 1.0.2 → 1.0.3

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.
@@ -5,19 +5,28 @@ on: # yamllint disable-line rule:truthy
5
5
  pull_request:
6
6
  branches:
7
7
  - main
8
+ paths:
9
+ - '__RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_PATH_FILTER__'
10
+ - '.github/actions/setup-project/**'
11
+ - '.github/workflows/project.yml'
8
12
  push:
9
13
  branches:
10
14
  - main
15
+ paths:
16
+ - '__RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_PATH_FILTER__'
17
+ - '.github/actions/setup-project/**'
18
+ - '.github/workflows/project.yml'
11
19
 
12
20
  permissions: {}
13
21
 
14
22
  concurrency:
15
23
  group: ${{ github.workflow }}-${{ github.ref }}
16
- cancel-in-progress: true
24
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
17
25
 
18
26
  defaults:
19
27
  run:
20
28
  shell: bash
29
+ working-directory: __RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_DIRECTORY__
21
30
 
22
31
  jobs:
23
32
  format:
@@ -62,8 +71,8 @@ jobs:
62
71
  - name: Check spelling
63
72
  run: npm run spellcheck
64
73
 
65
- static-quality:
66
- name: Static quality
74
+ lint-code:
75
+ name: Lint code
67
76
  runs-on: ubuntu-latest
68
77
 
69
78
  permissions:
@@ -80,8 +89,106 @@ jobs:
80
89
  with:
81
90
  node-version: '26.x'
82
91
 
83
- - name: Run remaining static quality checks
84
- run: npm run quality:static:ci
92
+ - name: Lint code
93
+ run: npm run lint:code
94
+
95
+ lint-styles:
96
+ name: Lint styles
97
+ runs-on: ubuntu-latest
98
+ permissions:
99
+ contents: read
100
+ steps:
101
+ - name: Checkout repository
102
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
103
+ with:
104
+ persist-credentials: false
105
+ - name: Setup project
106
+ uses: $/.github/actions/setup-project
107
+ with:
108
+ node-version: '26.x'
109
+ - name: Lint styles
110
+ run: npm run lint:css
111
+
112
+ lint-markdown:
113
+ name: Lint Markdown
114
+ runs-on: ubuntu-latest
115
+ permissions:
116
+ contents: read
117
+ steps:
118
+ - name: Checkout repository
119
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
120
+ with:
121
+ persist-credentials: false
122
+ - name: Setup project
123
+ uses: $/.github/actions/setup-project
124
+ with:
125
+ node-version: '26.x'
126
+ - name: Lint source Markdown
127
+ run: npm run lint:markdown
128
+
129
+ audit-unused:
130
+ name: Audit unused code
131
+ runs-on: ubuntu-latest
132
+ permissions:
133
+ contents: read
134
+ steps:
135
+ - name: Checkout repository
136
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
137
+ with:
138
+ persist-credentials: false
139
+ - name: Setup project
140
+ uses: $/.github/actions/setup-project
141
+ with:
142
+ node-version: '26.x'
143
+ - name: Audit unused code and dependencies
144
+ run: npm run audit:unused
145
+
146
+ typecheck:
147
+ name: Type-check
148
+ runs-on: ubuntu-latest
149
+ permissions:
150
+ contents: read
151
+ steps:
152
+ - name: Checkout repository
153
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
154
+ with:
155
+ persist-credentials: false
156
+ - name: Setup project
157
+ uses: $/.github/actions/setup-project
158
+ with:
159
+ node-version: '26.x'
160
+ - name: Check TypeScript and Astro diagnostics
161
+ run: npm run typecheck
162
+
163
+ dependency-audit:
164
+ name: Dependency audit
165
+ runs-on: ubuntu-latest
166
+
167
+ permissions:
168
+ contents: read
169
+
170
+ steps:
171
+ - name: Checkout repository
172
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
173
+ with:
174
+ persist-credentials: false
175
+
176
+ - name: Setup project
177
+ uses: $/.github/actions/setup-project
178
+ with:
179
+ node-version: '26.x'
180
+
181
+ - name: Audit dependencies
182
+ id: audit
183
+ continue-on-error: true
184
+ run: npm run audit
185
+
186
+ - name: Report dependency audit
187
+ if: steps.audit.outcome == 'failure'
188
+ run: |
189
+ echo '::warning title=Dependency security findings::Review Dependabot alerts and the audit output. Dependency findings are reported here but do not block pull-request remediation.'
190
+ echo '## Dependency security findings' >> "$GITHUB_STEP_SUMMARY"
191
+ echo 'The dependency audit found blocking-severity advisories. Review the audit output and Dependabot alerts. Release security gates remain blocking.' >> "$GITHUB_STEP_SUMMARY"
85
192
 
86
193
  unit-tests:
87
194
  name: Unit tests and coverage
@@ -109,7 +216,7 @@ jobs:
109
216
  uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
110
217
  with:
111
218
  name: unit-coverage
112
- path: coverage
219
+ path: __RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_DIRECTORY__/coverage
113
220
  if-no-files-found: error
114
221
  retention-days: 7
115
222
 
@@ -117,8 +224,13 @@ jobs:
117
224
  name: Production build
118
225
  needs:
119
226
  - format
227
+ - lint-code
228
+ - lint-styles
229
+ - lint-markdown
120
230
  - spellcheck
121
- - static-quality
231
+ - audit-unused
232
+ - typecheck
233
+ - unit-tests
122
234
  runs-on: ubuntu-latest
123
235
 
124
236
  permissions:
@@ -135,17 +247,14 @@ jobs:
135
247
  with:
136
248
  node-version: '26.x'
137
249
 
138
- - name: Build project
250
+ - name: Build production site once
139
251
  run: npm run build
140
252
 
141
- - name: Validate generated output
142
- run: npm run validate:build
143
-
144
253
  - name: Upload production build
145
254
  uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
146
255
  with:
147
256
  name: site-build
148
- path: dist
257
+ path: __RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_DIRECTORY__/dist
149
258
  if-no-files-found: error
150
259
  retention-days: 7
151
260
 
@@ -153,10 +262,36 @@ jobs:
153
262
  if: github.event_name == 'push' && github.ref == 'refs/heads/main'
154
263
  uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5
155
264
  with:
156
- path: dist
265
+ path: __RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_DIRECTORY__/dist
266
+
267
+ validate-build:
268
+ name: Validate build
269
+ needs:
270
+ - build
271
+ runs-on: ubuntu-latest
272
+ permissions:
273
+ contents: read
274
+ steps:
275
+ - name: Checkout repository
276
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
277
+ with:
278
+ persist-credentials: false
279
+ - name: Setup project
280
+ uses: $/.github/actions/setup-project
281
+ with:
282
+ node-version: '26.x'
283
+ - name: Download production build
284
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
285
+ with:
286
+ name: site-build
287
+ path: __RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_DIRECTORY__/dist
288
+ - name: Validate production artifacts
289
+ run: npm run validate:build
157
290
 
158
291
  browser-tests:
159
292
  name: Browser and accessibility tests
293
+ needs:
294
+ - build
160
295
  runs-on: ubuntu-latest
161
296
 
162
297
  permissions:
@@ -176,6 +311,12 @@ jobs:
176
311
  - name: Install supported browsers
177
312
  run: npx playwright install --with-deps chromium firefox webkit
178
313
 
314
+ - name: Download production build
315
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
316
+ with:
317
+ name: site-build
318
+ path: __RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_DIRECTORY__/dist
319
+
179
320
  - name: Run browser and accessibility tests
180
321
  run: npm run test:e2e
181
322
 
@@ -185,13 +326,15 @@ jobs:
185
326
  with:
186
327
  name: browser-test-failures
187
328
  path: |
188
- playwright-report
189
- test-results
329
+ __RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_DIRECTORY__/playwright-report
330
+ __RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_DIRECTORY__/test-results
190
331
  if-no-files-found: error
191
332
  retention-days: 7
192
333
 
193
334
  lighthouse:
194
335
  name: Lighthouse budgets
336
+ needs:
337
+ - build
195
338
  runs-on: ubuntu-latest
196
339
 
197
340
  permissions:
@@ -208,6 +351,15 @@ jobs:
208
351
  with:
209
352
  node-version: '26.x'
210
353
 
354
+ - name: Install Lighthouse browser
355
+ run: npx playwright install --with-deps chromium
356
+
357
+ - name: Download production build
358
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
359
+ with:
360
+ name: site-build
361
+ path: __RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_DIRECTORY__/dist
362
+
211
363
  - name: Enforce Lighthouse budgets
212
364
  run: npm run lighthouse:ci
213
365
 
@@ -216,35 +368,26 @@ jobs:
216
368
  uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
217
369
  with:
218
370
  name: lighthouse-reports
219
- path: .lighthouseci
371
+ path: __RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_DIRECTORY__/.lighthouseci
220
372
  include-hidden-files: true
221
373
  if-no-files-found: error
222
374
  retention-days: 7
223
375
 
224
- project:
225
- name: Project
376
+ deploy:
377
+ name: Deploy GitHub Pages
226
378
  needs:
227
379
  - format
380
+ - lint-code
381
+ - lint-styles
382
+ - lint-markdown
228
383
  - spellcheck
229
- - static-quality
384
+ - audit-unused
385
+ - typecheck
230
386
  - unit-tests
231
387
  - build
388
+ - validate-build
232
389
  - browser-tests
233
390
  - lighthouse
234
- runs-on: ubuntu-latest
235
-
236
- permissions:
237
- contents: read
238
-
239
- steps:
240
- - name: Confirm project checks
241
- run: echo "All project checks passed."
242
-
243
- deploy:
244
- name: Deploy GitHub Pages
245
- needs:
246
- - build
247
- - project
248
391
  if: github.event_name == 'push' && github.ref == 'refs/heads/main'
249
392
  runs-on: ubuntu-latest
250
393
 
@@ -256,7 +399,44 @@ jobs:
256
399
  name: github-pages
257
400
  url: ${{ steps.deployment.outputs.page_url }}
258
401
 
402
+ outputs:
403
+ page-url: ${{ steps.deployment.outputs.page_url }}
404
+
259
405
  steps:
260
406
  - name: Deploy GitHub Pages
261
407
  id: deployment
262
408
  uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
409
+
410
+ smoke-deployed:
411
+ name: Verify deployed website
412
+ needs:
413
+ - deploy
414
+ if: github.event_name == 'push' && github.ref == 'refs/heads/main'
415
+ runs-on: ubuntu-latest
416
+ permissions:
417
+ contents: read
418
+ steps:
419
+ - name: Checkout repository
420
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
421
+ with:
422
+ persist-credentials: false
423
+ - name: Setup project
424
+ uses: $/.github/actions/setup-project
425
+ with:
426
+ node-version: '26.x'
427
+ - name: Install Chromium
428
+ run: npx playwright install --with-deps chromium
429
+ - name: Verify deployed routes, assets, and mobile layout
430
+ env:
431
+ DEPLOYMENT_URL: ${{ needs.deploy.outputs.page-url }}
432
+ run: npm run test:smoke
433
+ - name: Upload deployed smoke failure evidence
434
+ if: failure()
435
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
436
+ with:
437
+ name: deployed-smoke-results
438
+ path: |
439
+ __RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_DIRECTORY__/playwright-report
440
+ __RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_DIRECTORY__/test-results
441
+ if-no-files-found: ignore
442
+ retention-days: 7
@@ -5,9 +5,15 @@ on: # yamllint disable-line rule:truthy
5
5
  pull_request:
6
6
  branches:
7
7
  - main
8
+ paths:
9
+ - '__RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_PATH_FILTER__'
10
+ - '.github/**'
8
11
  push:
9
12
  branches:
10
13
  - main
14
+ paths:
15
+ - '__RM_INDUSTRIES_FORGE_TEMPLATE_V1_PROJECT_PATH_FILTER__'
16
+ - '.github/**'
11
17
  schedule:
12
18
  - cron: '__RM_INDUSTRIES_FORGE_TEMPLATE_V1_SECURITY_SCHEDULE_MINUTE__ 5 * * 1'
13
19
 
@@ -65,6 +71,7 @@ jobs:
65
71
  persist-credentials: false
66
72
 
67
73
  - name: Review dependency changes
74
+ continue-on-error: true
68
75
  uses: actions/dependency-review-action@a1d282b36b6f3519aa1f3fc636f609c47dddb294 # v5
69
76
  with:
70
77
  fail-on-severity: high
@@ -41,8 +41,8 @@ reference.
41
41
  | `npm run build` | Create the production site in `dist/`. |
42
42
  | `npm run validate:build` | Validate required output and scan generated text. |
43
43
  | `npm run preview` | Serve the production build locally. Run `build` first. |
44
- | `npm run typecheck` | Generate Astro types and run TypeScript without emitting files. |
45
- | `npm run astro:check` | Validate Astro components, content, and diagnostics. |
44
+ | `npm run typecheck` | Validate TypeScript, Astro components, content, and diagnostics. |
45
+ | `npm run astro:check` | Run the same Astro diagnostics directly. |
46
46
  | `npm run format` | Check formatting with Oxfmt. |
47
47
  | `npm run format:fix` | Apply Oxfmt formatting. |
48
48
  | `npm run lint` | Run code, CSS, Markdown, and spelling checks. |
@@ -51,7 +51,7 @@ reference.
51
51
  | `npm run lint:markdown` | Check Markdown with Markdownlint. |
52
52
  | `npm run spellcheck` | Check repository text with cspell. |
53
53
  | `npm run audit:unused` | Detect unused files, exports, and dependencies with Knip. |
54
- | `npm run lighthouse:ci` | Build and enforce Lighthouse scores and transfer budgets. |
54
+ | `npm run lighthouse:ci` | Enforce Lighthouse scores against an existing build. |
55
55
  | `npm test` | Run the `test:unit` command. |
56
56
  | `npm run test:unit` | Run deterministic TypeScript unit tests with Vitest. |
57
57
  | `npm run test:a11y` | Run focused Playwright and axe accessibility checks. |
@@ -74,45 +74,42 @@ any deployment base path from the configured canonical site URL.
74
74
 
75
75
  The complete command is intentionally high cost. Use `npm run quality:static`
76
76
  for the quickest source-only feedback or `npm run quality:core` for every check
77
- that does not launch a browser. Both commands include `npm run audit`, so they
78
- query the npm registry and can change when new advisories are published. Run
79
- the individual scripts when working offline. CI may execute independent stages
80
- in parallel, but a project generated by the packed Forge initializer must pass
81
- the documented `npm run quality` command as a single ordered pipeline.
77
+ that does not launch a browser. Dependency auditing remains the explicit
78
+ `npm run audit` command. CI executes independent source stages in parallel,
79
+ builds once, and gives that output to validation, browser tests, Lighthouse, and
80
+ deployment.
82
81
 
83
82
  ## Continuous integration
84
83
 
85
84
  The generated `.github/workflows/project.yml` runs on pull requests targeting
86
- `main` and on pushes to `main`. It separates static quality, coverage-enforced
87
- unit tests, the validated production build, browser and accessibility tests,
88
- and Lighthouse budgets so failures identify the affected gate directly. The
89
- required `Project` result succeeds only after every release-blocking job passes.
90
- On pushes to `main`, that result unlocks a separate GitHub Pages deployment;
91
- pull requests never upload or deploy a Pages artifact. Deployment setup,
92
- project-site URLs, custom domains, and environment protections are documented in
93
- [`docs/github-pages.md`](docs/github-pages.md).
94
-
95
- The workflow installs dependencies with `npm ci`, caches npm downloads using
96
- the lockfile, cancels superseded runs on the same Git reference, and grants only
97
- read access to repository contents. Pull requests receive no secrets or write
98
- permissions. Coverage, production builds, Lighthouse reports, and browser
85
+ `main` and on pushes to `main`. Formatting, code/style/Markdown linting,
86
+ spelling, unused-code analysis, Astro diagnostics, and unit coverage report
87
+ independently. One production build follows those checks; build validation,
88
+ browser tests, and Lighthouse download and test that same artifact. Deployment
89
+ depends directly on every applicable check and publishes the Pages artifact
90
+ packaged by the build job. A live Chromium smoke test then verifies the deployed
91
+ URL, assets, and mobile layout. There is no aggregate/no-op project job.
92
+ Deployment setup, project-site URLs, custom domains, and environment protections
93
+ are documented in [`docs/github-pages.md`](docs/github-pages.md).
94
+
95
+ The workflow installs dependencies with `npm ci`, caches npm downloads using the
96
+ lockfile, cancels superseded pull-request runs, serializes deployment runs, and
97
+ grants only read access outside deployment. Pull requests receive no secrets or
98
+ write permissions. Coverage, production builds, Lighthouse reports, and browser
99
99
  failure evidence are retained for seven days. All third-party actions use
100
100
  immutable commit pins.
101
101
 
102
102
  Security automation is included alongside project CI. CodeQL analyzes the
103
103
  project's TypeScript and GitHub Actions on pull requests, pushes to `main`, and
104
- a weekly schedule. Dependency review rejects pull requests that introduce
105
- known high- or critical-severity vulnerabilities. A separate scheduled
106
- automation workflow validates workflow syntax and scans GitHub Actions with
107
- Zizmor. Zizmor uploads its findings to GitHub code scanning for review in the
108
- Security tab without failing the workflow solely because it found an issue.
109
- The job receives `security-events: write` only for that upload; all other access
110
- remains read-only. Repositories can make selected code-scanning severities
111
- merge-blocking later through their ruleset without changing the workflow.
112
- The `Automation` aggregate runs when `.github/**` changes and succeeds only after
113
- both workflow syntax and security validation pass. Because it is path-filtered,
114
- do not configure it as a globally required status check; review it whenever an
115
- automation change causes it to appear.
104
+ a weekly schedule. Dependency review reports introduced dependency risk without
105
+ blocking remediation pull requests. A separate scheduled automation workflow
106
+ validates workflow syntax with Actionlint and scans GitHub Actions with Zizmor.
107
+ Zizmor uploads its findings to GitHub code scanning and fails `Workflow security`
108
+ when it finds an issue. The job receives `security-events: write` only for that
109
+ upload; all other access remains read-only. `Workflow syntax` and `Workflow
110
+ security` run when `.github/**` changes. Because they are path-filtered, do not
111
+ configure them as globally required status checks; require both whenever an
112
+ automation change causes them to appear.
116
113
 
117
114
  Dependabot checks npm and GitHub Actions weekly. Minor and patch npm updates are
118
115
  grouped by production or development scope, while major updates remain separate
@@ -13,8 +13,10 @@ not upload a Pages artifact or run a deployment.
13
13
  needs a manual production approval.
14
14
 
15
15
  The build job has read-only repository access. The separate deployment job is
16
- the only job granted `pages: write` and `id-token: write`, and it cannot begin
17
- until the complete `Project` quality gate succeeds.
16
+ the only job granted `pages: write` and `id-token: write`, and it depends
17
+ directly on every source, unit, build, validation, browser, and Lighthouse job.
18
+ After deployment, one Chromium smoke test verifies the live URL, assets, and
19
+ mobile layout.
18
20
 
19
21
  ## Choose the public URL
20
22
 
@@ -12,7 +12,7 @@ npm run quality
12
12
  ```
13
13
 
14
14
  - `quality:static` checks formatting, code, CSS, Markdown, spelling, unused code,
15
- types, Astro diagnostics, and dependency policy.
15
+ types, and Astro diagnostics.
16
16
  - `quality:core` adds coverage-enforced unit tests, a production build, and
17
17
  required-output validation.
18
18
  - `quality` adds Playwright browser/accessibility tests and Lighthouse budgets.
@@ -83,11 +83,11 @@ the validator when introducing a route that is part of the public contract.
83
83
 
84
84
  ### GitHub Pages does not deploy
85
85
 
86
- Open the `Project` workflow first. Deployment is intentionally blocked unless
87
- all quality jobs pass on `main`. If they pass, inspect the `github-pages`
88
- environment, Pages source, branch restrictions, URL configuration, and deploy
89
- job. Follow the [GitHub Pages guide](../github-pages.md) rather than bypassing
90
- the quality dependency.
86
+ Open the `Project Continuous Integration` workflow first. Deployment depends
87
+ directly on every applicable source and artifact check. If they pass, inspect
88
+ the `github-pages` environment, Pages source, branch restrictions, URL
89
+ configuration, and deploy job. Follow the [GitHub Pages guide](../github-pages.md)
90
+ rather than bypassing a failed dependency.
91
91
 
92
92
  ## Review dependency updates
93
93
 
@@ -98,7 +98,13 @@ Dependabot proposes npm and GitHub Actions updates. Before merging one:
98
98
  3. review changes to `package.json` and `package-lock.json` together;
99
99
  4. keep Sveltia updates within the exact content-model compatibility range;
100
100
  5. run `npm run audit`, `npm run quality`, and any affected manual check; and
101
- 6. merge only after project and security workflows pass.
101
+ 6. review the project checks and all security findings before merging.
102
+
103
+ CodeQL and dependency findings report through GitHub code scanning and
104
+ Dependabot alerts rather than blocking ordinary pull requests. Actionlint and
105
+ Zizmor block workflow changes with syntax or security defects. `npm run audit`
106
+ remains an explicit release gate and must pass—or use a reviewed, justified,
107
+ time-bounded exception—before publishing a release.
102
108
 
103
109
  Do not widen `@rm-industries/content-model` peer compatibility inside a
104
110
  generated project. Forge publishes tested content-model compatibility first,