@rm-industries/create-forge 0.4.0-beta.6 → 1.0.0-rc.2

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.
package/README.md CHANGED
@@ -54,8 +54,14 @@ To exercise the packed CLI across the complete generator fixture matrix:
54
54
  npm run test:generator:e2e
55
55
  ```
56
56
 
57
- This generates default, fully specified, scoped-package-name, no-install, and
58
- conflict fixtures in an OS temporary directory. The default fixture installs,
59
- type-checks, and builds outside the Forge workspace. The conflict fixture also
60
- proves that a failed invocation leaves existing files unchanged. Every fixture
61
- is removed after the run.
57
+ This generates default, fully specified, scoped-package-name, current-directory,
58
+ no-install, and conflict fixtures in an OS temporary directory. The default
59
+ fixture installs and runs the complete generated-project quality pipeline
60
+ outside the Forge workspace. The conflict fixture also proves that a failed
61
+ invocation leaves existing files unchanged. Every fixture is removed after the
62
+ run.
63
+
64
+ The release compatibility matrix runs the same packed fixtures with the
65
+ generated project's core quality gate on every supported Node line on Ubuntu
66
+ and on macOS. The complete end-to-end job adds the multi-browser and Lighthouse
67
+ checks once on the primary Node runtime.
@@ -12,6 +12,9 @@ updates:
12
12
  open-pull-requests-limit: 5
13
13
  commit-message:
14
14
  prefix: chore
15
+ labels:
16
+ - dependencies
17
+ - github-actions
15
18
  groups:
16
19
  github-actions:
17
20
  patterns:
@@ -30,6 +33,9 @@ updates:
30
33
  open-pull-requests-limit: 5
31
34
  commit-message:
32
35
  prefix: chore
36
+ labels:
37
+ - dependencies
38
+ - npm
33
39
  groups:
34
40
  production-dependencies:
35
41
  dependency-type: production
@@ -173,8 +173,8 @@ jobs:
173
173
  with:
174
174
  node-version: '26.x'
175
175
 
176
- - name: Install Chromium
177
- run: npx playwright install --with-deps chromium
176
+ - name: Install supported browsers
177
+ run: npx playwright install --with-deps chromium firefox webkit
178
178
 
179
179
  - name: Run browser and accessibility tests
180
180
  run: npm run test:e2e
@@ -259,4 +259,4 @@ jobs:
259
259
  steps:
260
260
  - name: Deploy GitHub Pages
261
261
  id: deployment
262
- uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5
262
+ uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
@@ -259,3 +259,8 @@ $RECYCLE.BIN/
259
259
  *.lnk
260
260
 
261
261
  # End of https://www.toptal.com/developers/gitignore/api/vim,node,astro,linux,macos,windows,visualstudiocode
262
+
263
+ ### Forge test output ###
264
+ .lighthouseci/
265
+ playwright-report/
266
+ test-results/
@@ -125,6 +125,21 @@ tested content-model release first. No version is ignored, security updates
125
125
  remain enabled, and every update must pass the complete project and security
126
126
  workflows before merging.
127
127
 
128
+ Dependabot pull requests use `dependencies` plus the readable ecosystem label
129
+ `npm` or `github-actions`. GitHub ignores configured custom labels that do not
130
+ exist, so initialize them once after creating the repository:
131
+
132
+ ```sh
133
+ gh label create dependencies --color 0366d6 --description "Pull requests that update a dependency file" --force
134
+ gh label create npm --color cb3837 --description "Pull requests that update npm dependencies" --force
135
+ gh label create github-actions --color 2088ff --description "Pull requests that update GitHub Actions dependencies" --force
136
+ ```
137
+
138
+ Run these commands from the generated repository while authenticated with the
139
+ GitHub CLI. They are idempotent because `--force` updates an existing label. If
140
+ they are not run, Dependabot still opens update pull requests but omits any
141
+ configured label that is missing.
142
+
128
143
  GitHub chooses the Dependabot run times, distributing update checks across its
129
144
  available schedule. Forge derives distinct weekly CodeQL and workflow-validation
130
145
  minutes from the generated package name. This keeps generation reproducible
@@ -289,6 +304,13 @@ reference in `robots.txt`. Replace `public/favicon.svg` and
289
304
  `public/social-card.svg` when establishing a project identity, and update
290
305
  `socialImage` in `src/config/site.ts` if the sharing image path changes.
291
306
 
307
+ Every HTML page, including `/admin/`, also includes the nonvisual, standard
308
+ `generator` metadata value `Forge by RM Industries`. It makes Forge-generated
309
+ sites identifiable in page source without adding telemetry, network requests,
310
+ client-side JavaScript, accessibility-tree content, or visible branding. This
311
+ generated project is owned source: remove or change the element in
312
+ `src/components/seo/SeoHead.astro` if you do not want to retain the attribution.
313
+
292
314
  ## Content manager
293
315
 
294
316
  Run the development server and open `/admin/` to use Sveltia CMS. Sveltia
@@ -12,7 +12,7 @@
12
12
  "@astrojs/sitemap": "^3.7.3",
13
13
  "@fontsource/fira-code": "^5.3.0",
14
14
  "@fontsource/fira-sans": "^5.3.0",
15
- "@rm-industries/content-model": "0.2.0-alpha.0",
15
+ "@rm-industries/content-model": "1.0.0-rc.1",
16
16
  "@sveltia/cms": "0.203.2",
17
17
  "astro": "^7.2.9"
18
18
  },
@@ -5389,9 +5389,9 @@
5389
5389
  }
5390
5390
  },
5391
5391
  "node_modules/@rm-industries/content-model": {
5392
- "version": "0.2.0-alpha.0",
5393
- "resolved": "https://registry.npmjs.org/@rm-industries/content-model/-/content-model-0.2.0-alpha.0.tgz",
5394
- "integrity": "sha512-DC5MkcUQ4iYIO40mFwNzlawkDEy2eleba8Ui48Xg9g5B6YWzEao6Mqu8FvEa923iVw127t1ZskhZEEh1+47njA==",
5392
+ "version": "1.0.0-rc.1",
5393
+ "resolved": "https://registry.npmjs.org/@rm-industries/content-model/-/content-model-1.0.0-rc.1.tgz",
5394
+ "integrity": "sha512-AqsJ8X0WLjR2VXEpl45Thbfl54w4PzVAUqf2WXexpppOVEELl0VvgCVgkyIUbHpmlxb2ZbClNifY8qJoMbw4kw==",
5395
5395
  "license": "MIT",
5396
5396
  "engines": {
5397
5397
  "node": "^22.22.2 || ^24.0.0 || ^26.0.0",
@@ -40,7 +40,7 @@
40
40
  "@astrojs/sitemap": "^3.7.3",
41
41
  "@fontsource/fira-code": "^5.3.0",
42
42
  "@fontsource/fira-sans": "^5.3.0",
43
- "@rm-industries/content-model": "0.2.0-alpha.0",
43
+ "@rm-industries/content-model": "1.0.0-rc.1",
44
44
  "@sveltia/cms": "0.203.2",
45
45
  "astro": "^7.2.9"
46
46
  },
@@ -19,6 +19,14 @@ export default defineConfig({
19
19
  name: 'chromium',
20
20
  use: { ...devices['Desktop Chrome'] },
21
21
  },
22
+ {
23
+ name: 'firefox',
24
+ use: { ...devices['Desktop Firefox'] },
25
+ },
26
+ {
27
+ name: 'webkit',
28
+ use: { ...devices['Desktop Safari'] },
29
+ },
22
30
  ],
23
31
  webServer: {
24
32
  command: 'npm run build && npm run preview -- --host 127.0.0.1',
@@ -28,6 +28,7 @@ const socialImageUrl = new URL(resolveSiteHref(site.socialImage), new URL(site.u
28
28
  ---
29
29
 
30
30
  <title>{pageTitle}</title>
31
+ <meta name="generator" content="Forge by RM Industries" />
31
32
  <meta name="description" content={description} />
32
33
  <link rel="canonical" href={canonicalUrl} />
33
34
  <link rel="sitemap" href={resolveSiteHref('/sitemap-index.xml')} />
@@ -49,9 +49,9 @@ test('identifies the current primary navigation item', async ({ page }) => {
49
49
  await expect(page.getByRole('link', { name: 'Home' })).toHaveAttribute('aria-current', 'page');
50
50
  });
51
51
 
52
- test('moves keyboard users directly to the main content', async ({ page }) => {
52
+ test('moves keyboard users directly to the main content', async ({ browserName, page }) => {
53
53
  await page.goto(resolvePreviewPath('/'));
54
- await page.keyboard.press('Tab');
54
+ await page.keyboard.press(browserName === 'webkit' && process.platform === 'darwin' ? 'Alt+Tab' : 'Tab');
55
55
 
56
56
  const skipLink = page.getByRole('link', { name: 'Skip to content' });
57
57
  await expect(skipLink).toBeFocused();
@@ -11,6 +11,7 @@ test('serves every baseline page with configured canonical and social metadata',
11
11
 
12
12
  const canonicalUrl = new URL(resolvePreviewPath(route), site.url).href;
13
13
 
14
+ await expect(page.locator('meta[name="generator"]')).toHaveAttribute('content', 'Forge by RM Industries');
14
15
  await expect(page.locator('link[rel="canonical"]')).toHaveAttribute('href', canonicalUrl);
15
16
  await expect(page.locator('meta[property="og:site_name"]')).toHaveAttribute('content', site.name);
16
17
  await expect(page.locator('meta[property="og:url"]')).toHaveAttribute('content', canonicalUrl);
@@ -33,14 +33,14 @@ test('makes every Catppuccin flavor available explicitly', async ({ page }) => {
33
33
  }
34
34
  });
35
35
 
36
- test('serves fonts locally and presents a visible keyboard focus indicator', async ({ page }) => {
36
+ test('serves fonts locally and presents a visible keyboard focus indicator', async ({ browserName, page }) => {
37
37
  const fontRequests: string[] = [];
38
38
  page.on('request', (request) => {
39
39
  if (request.resourceType() === 'font') fontRequests.push(request.url());
40
40
  });
41
41
 
42
42
  await page.goto(resolvePreviewPath('/'));
43
- await page.keyboard.press('Tab');
43
+ await page.keyboard.press(browserName === 'webkit' && process.platform === 'darwin' ? 'Alt+Tab' : 'Tab');
44
44
 
45
45
  await expect(page.locator('a').first()).toBeFocused();
46
46
  await expect(page.locator('a').first()).not.toHaveCSS('outline-style', 'none');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rm-industries/create-forge",
3
- "version": "0.4.0-beta.6",
3
+ "version": "1.0.0-rc.2",
4
4
  "description": "Create a content-driven Forge website",
5
5
  "keywords": [
6
6
  "astro",
@@ -33,6 +33,7 @@
33
33
  "build": "tsdown && node scripts/copy-template.ts",
34
34
  "prepack": "npm run typecheck && npm test && npm run build",
35
35
  "test": "vitest run",
36
+ "test:compatibility": "npm run build && node scripts/test-generator-e2e.ts --compatibility",
36
37
  "test:e2e": "npm run build && node scripts/test-generator-e2e.ts",
37
38
  "typecheck": "tsc --project tsconfig.json --noEmit",
38
39
  "verify:package": "npm run build && node scripts/verify-package.ts"