@bleedingdev/modern-js-create 3.2.0-ultramodern.98 → 3.4.0-ultramodern.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.
- package/README.md +281 -106
- package/bin/run.js +1 -0
- package/dist/cjs/create-package-root.cjs +63 -0
- package/dist/cjs/index.cjs +658 -0
- package/dist/cjs/locale/en.cjs +101 -0
- package/dist/cjs/locale/index.cjs +50 -0
- package/dist/cjs/locale/zh.cjs +101 -0
- package/dist/cjs/ultramodern-package-source.cjs +135 -0
- package/dist/cjs/ultramodern-workspace/add-vertical.cjs +603 -0
- package/dist/cjs/ultramodern-workspace/app-files.cjs +223 -0
- package/dist/cjs/ultramodern-workspace/codesmith.cjs +134 -0
- package/dist/cjs/ultramodern-workspace/contracts.cjs +837 -0
- package/dist/cjs/ultramodern-workspace/demo-components.cjs +422 -0
- package/dist/cjs/ultramodern-workspace/descriptors.cjs +222 -0
- package/dist/cjs/ultramodern-workspace/effect-api.cjs +952 -0
- package/dist/cjs/ultramodern-workspace/fs-io.cjs +191 -0
- package/dist/cjs/ultramodern-workspace/generation-result.cjs +158 -0
- package/dist/cjs/ultramodern-workspace/index.cjs +51 -0
- package/dist/cjs/ultramodern-workspace/locales.cjs +173 -0
- package/dist/cjs/ultramodern-workspace/module-federation.cjs +487 -0
- package/dist/cjs/ultramodern-workspace/naming.cjs +161 -0
- package/dist/cjs/ultramodern-workspace/overlays.cjs +120 -0
- package/dist/cjs/ultramodern-workspace/package-json.cjs +406 -0
- package/dist/cjs/ultramodern-workspace/package-source.cjs +59 -0
- package/dist/cjs/ultramodern-workspace/policy.cjs +248 -0
- package/dist/cjs/ultramodern-workspace/public-api.cjs +47 -0
- package/dist/cjs/ultramodern-workspace/public-surface.cjs +268 -0
- package/dist/cjs/ultramodern-workspace/routes.cjs +375 -0
- package/dist/cjs/ultramodern-workspace/types.cjs +61 -0
- package/dist/cjs/ultramodern-workspace/versions.cjs +161 -0
- package/dist/cjs/ultramodern-workspace/workspace-scripts.cjs +154 -0
- package/dist/cjs/ultramodern-workspace/write-workspace.cjs +197 -0
- package/dist/esm/create-package-root.js +14 -0
- package/dist/esm/index.js +621 -0
- package/dist/esm/locale/en.js +63 -0
- package/dist/esm/locale/index.js +9 -0
- package/dist/esm/locale/zh.js +63 -0
- package/dist/esm/ultramodern-package-source.js +63 -0
- package/dist/esm/ultramodern-workspace/add-vertical.js +511 -0
- package/dist/esm/ultramodern-workspace/app-files.js +149 -0
- package/dist/esm/ultramodern-workspace/codesmith.js +86 -0
- package/dist/esm/ultramodern-workspace/contracts.js +742 -0
- package/dist/esm/ultramodern-workspace/demo-components.js +363 -0
- package/dist/esm/ultramodern-workspace/descriptors.js +133 -0
- package/dist/esm/ultramodern-workspace/effect-api.js +854 -0
- package/dist/esm/ultramodern-workspace/fs-io.js +90 -0
- package/dist/esm/ultramodern-workspace/generation-result.js +102 -0
- package/dist/esm/ultramodern-workspace/index.js +3 -0
- package/dist/esm/ultramodern-workspace/locales.js +122 -0
- package/dist/esm/ultramodern-workspace/module-federation.js +415 -0
- package/dist/esm/ultramodern-workspace/naming.js +71 -0
- package/dist/esm/ultramodern-workspace/overlays.js +79 -0
- package/dist/esm/ultramodern-workspace/package-json.js +338 -0
- package/dist/esm/ultramodern-workspace/package-source.js +21 -0
- package/dist/esm/ultramodern-workspace/policy.js +183 -0
- package/dist/esm/ultramodern-workspace/public-api.js +2 -0
- package/dist/esm/ultramodern-workspace/public-surface.js +183 -0
- package/dist/esm/ultramodern-workspace/routes.js +280 -0
- package/dist/esm/ultramodern-workspace/types.js +16 -0
- package/dist/esm/ultramodern-workspace/versions.js +36 -0
- package/dist/esm/ultramodern-workspace/workspace-scripts.js +92 -0
- package/dist/esm/ultramodern-workspace/write-workspace.js +143 -0
- package/dist/esm-node/create-package-root.js +15 -0
- package/dist/esm-node/index.js +622 -0
- package/dist/esm-node/locale/en.js +64 -0
- package/dist/esm-node/locale/index.js +10 -0
- package/dist/esm-node/locale/zh.js +64 -0
- package/dist/esm-node/ultramodern-package-source.js +64 -0
- package/dist/esm-node/ultramodern-workspace/add-vertical.js +512 -0
- package/dist/esm-node/ultramodern-workspace/app-files.js +150 -0
- package/dist/esm-node/ultramodern-workspace/codesmith.js +87 -0
- package/dist/esm-node/ultramodern-workspace/contracts.js +743 -0
- package/dist/esm-node/ultramodern-workspace/demo-components.js +364 -0
- package/dist/esm-node/ultramodern-workspace/descriptors.js +134 -0
- package/dist/esm-node/ultramodern-workspace/effect-api.js +855 -0
- package/dist/esm-node/ultramodern-workspace/fs-io.js +91 -0
- package/dist/esm-node/ultramodern-workspace/generation-result.js +103 -0
- package/dist/esm-node/ultramodern-workspace/index.js +4 -0
- package/dist/esm-node/ultramodern-workspace/locales.js +123 -0
- package/dist/esm-node/ultramodern-workspace/module-federation.js +416 -0
- package/dist/esm-node/ultramodern-workspace/naming.js +72 -0
- package/dist/esm-node/ultramodern-workspace/overlays.js +80 -0
- package/dist/esm-node/ultramodern-workspace/package-json.js +339 -0
- package/dist/esm-node/ultramodern-workspace/package-source.js +22 -0
- package/dist/esm-node/ultramodern-workspace/policy.js +184 -0
- package/dist/esm-node/ultramodern-workspace/public-api.js +3 -0
- package/dist/esm-node/ultramodern-workspace/public-surface.js +184 -0
- package/dist/esm-node/ultramodern-workspace/routes.js +281 -0
- package/dist/esm-node/ultramodern-workspace/types.js +17 -0
- package/dist/esm-node/ultramodern-workspace/versions.js +37 -0
- package/dist/esm-node/ultramodern-workspace/workspace-scripts.js +93 -0
- package/dist/esm-node/ultramodern-workspace/write-workspace.js +144 -0
- package/dist/types/create-package-root.d.ts +1 -0
- package/dist/types/locale/en.d.ts +12 -8
- package/dist/types/locale/index.d.ts +125 -2
- package/dist/types/locale/zh.d.ts +12 -8
- package/dist/types/ultramodern-package-source.d.ts +28 -0
- package/dist/types/ultramodern-workspace/add-vertical.d.ts +36 -0
- package/dist/types/ultramodern-workspace/app-files.d.ts +14 -0
- package/dist/types/ultramodern-workspace/codesmith.d.ts +53 -0
- package/dist/types/ultramodern-workspace/contracts.d.ts +21 -0
- package/dist/types/ultramodern-workspace/demo-components.d.ts +9 -0
- package/dist/types/ultramodern-workspace/descriptors.d.ts +39 -0
- package/dist/types/ultramodern-workspace/effect-api.d.ts +73 -0
- package/dist/types/ultramodern-workspace/fs-io.d.ts +18 -0
- package/dist/types/ultramodern-workspace/generation-result.d.ts +14 -0
- package/dist/types/ultramodern-workspace/index.d.ts +4 -0
- package/dist/types/ultramodern-workspace/locales.d.ts +183 -0
- package/dist/types/ultramodern-workspace/module-federation.d.ts +16 -0
- package/dist/types/ultramodern-workspace/naming.d.ts +16 -0
- package/dist/types/ultramodern-workspace/overlays.d.ts +6 -0
- package/dist/types/ultramodern-workspace/package-json.d.ts +12 -0
- package/dist/types/ultramodern-workspace/package-source.d.ts +2 -0
- package/dist/types/ultramodern-workspace/policy.d.ts +60 -0
- package/dist/types/ultramodern-workspace/public-api.d.ts +3 -0
- package/dist/types/ultramodern-workspace/public-surface.d.ts +37 -0
- package/dist/types/ultramodern-workspace/routes.d.ts +25 -0
- package/dist/types/ultramodern-workspace/types.d.ts +197 -0
- package/dist/types/ultramodern-workspace/versions.d.ts +40 -0
- package/dist/types/ultramodern-workspace/workspace-scripts.d.ts +10 -0
- package/dist/types/ultramodern-workspace/write-workspace.d.ts +4 -0
- package/package.json +58 -15
- package/template-workspace/.agents/agent-reference-repos.json +24 -0
- package/template-workspace/.agents/rstackjs-agent-skills-LICENSE +21 -0
- package/template-workspace/.agents/skills/rsbuild-best-practices/SKILL.md +57 -0
- package/template-workspace/.agents/skills/rsdoctor-analysis/SKILL.md +96 -0
- package/template-workspace/.agents/skills/rsdoctor-analysis/references/command-map.md +113 -0
- package/template-workspace/.agents/skills/rsdoctor-analysis/references/common-analysis-patterns.md +190 -0
- package/template-workspace/.agents/skills/rsdoctor-analysis/references/install-rsdoctor-common.md +88 -0
- package/template-workspace/.agents/skills/rsdoctor-analysis/references/install-rsdoctor-rspack.md +138 -0
- package/template-workspace/.agents/skills/rsdoctor-analysis/references/install-rsdoctor-webpack.md +71 -0
- package/template-workspace/.agents/skills/rsdoctor-analysis/references/install-rsdoctor.md +39 -0
- package/template-workspace/.agents/skills/rsdoctor-analysis/references/rsdoctor-data-types.md +103 -0
- package/template-workspace/.agents/skills/rslib-best-practices/SKILL.md +58 -0
- package/template-workspace/.agents/skills/rslib-modern-package/SKILL.md +173 -0
- package/template-workspace/.agents/skills/rspack-best-practices/SKILL.md +70 -0
- package/template-workspace/.agents/skills/rspack-tracing/SKILL.md +75 -0
- package/template-workspace/.agents/skills/rspack-tracing/references/bottlenecks.md +47 -0
- package/template-workspace/.agents/skills/rspack-tracing/references/tracing-guide.md +38 -0
- package/template-workspace/.agents/skills/rspack-tracing/scripts/analyze_trace.js +184 -0
- package/template-workspace/.agents/skills/rstest-best-practices/SKILL.md +133 -0
- package/template-workspace/.agents/skills-lock.json +114 -0
- package/template-workspace/.codex/hooks.json +16 -0
- package/template-workspace/.github/renovate.json +29 -0
- package/template-workspace/.github/workflows/ultramodern-workspace-gates.yml.handlebars +67 -0
- package/template-workspace/.gitignore.handlebars +5 -0
- package/template-workspace/.mise.toml.handlebars +3 -0
- package/template-workspace/{AGENTS.md → AGENTS.md.handlebars} +20 -9
- package/template-workspace/README.md.handlebars +85 -14
- package/template-workspace/lefthook.yml +18 -4
- package/template-workspace/pnpm-workspace.yaml.handlebars +45 -0
- package/template-workspace/scripts/bootstrap-agent-skills.mjs +69 -75
- package/template-workspace/scripts/setup-agent-reference-repos.mjs +8 -6
- package/templates/app/shell-frame.tsx +49 -0
- package/templates/app/ultramodern-route-head.tsx.handlebars +142 -0
- package/templates/packages/shared-contracts-index.ts +466 -0
- package/templates/workspace-scripts/assert-mf-types.mjs.handlebars +69 -0
- package/templates/workspace-scripts/check-ultramodern-i18n-boundaries.mjs +9 -0
- package/templates/workspace-scripts/generate-public-surface-assets.mjs +529 -0
- package/templates/workspace-scripts/proof-cloudflare-version.mjs +125 -0
- package/templates/workspace-scripts/ultramodern-cloudflare-proof.mjs +851 -0
- package/templates/workspace-scripts/ultramodern-performance-readiness.config.mjs +7 -0
- package/templates/workspace-scripts/ultramodern-performance-readiness.mjs +223 -0
- package/templates/workspace-scripts/validate-ultramodern-workspace.mjs.handlebars +986 -0
- package/dist/index.js +0 -6625
- package/dist/types/ultramodern-workspace.d.ts +0 -31
- package/template/AGENTS.md +0 -23
- package/template/README.md +0 -105
- package/template/api/effect/index.ts.handlebars +0 -34
- package/template/api/lambda/hello.ts.handlebars +0 -6
- package/template/config/public/locales/cs/translation.json +0 -39
- package/template/config/public/locales/en/translation.json +0 -39
- package/template/lefthook.yml +0 -10
- package/template/modern.config.ts.handlebars +0 -71
- package/template/oxfmt.config.ts +0 -15
- package/template/oxlint.config.ts +0 -19
- package/template/package.json.handlebars +0 -66
- package/template/pnpm-workspace.yaml +0 -29
- package/template/postcss.config.mjs.handlebars +0 -6
- package/template/rstest.config.mts +0 -5
- package/template/scripts/bootstrap-agent-skills.mjs +0 -228
- package/template/scripts/check-i18n-strings.mjs +0 -94
- package/template/scripts/validate-ultramodern.mjs.handlebars +0 -538
- package/template/shared/effect/api.ts.handlebars +0 -17
- package/template/src/modern-app-env.d.ts +0 -3
- package/template/src/modern.runtime.ts.handlebars +0 -23
- package/template/src/routes/[lang]/page.tsx.handlebars +0 -211
- package/template/src/routes/index.css.handlebars +0 -129
- package/template/src/routes/layout.tsx.handlebars +0 -10
- package/template/tailwind.config.ts.handlebars +0 -10
- package/template/tests/tsconfig.json +0 -7
- package/template/tests/ultramodern.contract.test.ts.handlebars +0 -78
- package/template/tsconfig.json +0 -120
- package/template-workspace/pnpm-workspace.yaml +0 -35
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rstest-best-practices
|
|
3
|
+
description: Rstest best practices for config, CLI workflow, test writing, mocking, snapshot testing, DOM testing, coverage, multi-project setup, CI integration, performance and debugging. Use when writing, reviewing, or troubleshooting Rstest test projects.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Rstest Best Practices
|
|
7
|
+
|
|
8
|
+
Apply these rules when writing or reviewing Rstest test projects.
|
|
9
|
+
|
|
10
|
+
## Configuration
|
|
11
|
+
|
|
12
|
+
- Use `rstest.config.ts` and `defineConfig` from `@rstest/core`
|
|
13
|
+
- Prefer explicit imports `import { test, expect, describe } from '@rstest/core'` over `globals: true`
|
|
14
|
+
- For Rsbuild projects, use `@rstest/adapter-rsbuild` with `extends: withRsbuildConfig()` to reuse build config
|
|
15
|
+
- For Rslib projects, use `@rstest/adapter-rslib` with `extends: withRslibConfig()` to reuse build config
|
|
16
|
+
- Use `setupFiles` for shared test setup (e.g., custom matchers, cleanup hooks)
|
|
17
|
+
- When using Rsbuild plugins (e.g., `@rsbuild/plugin-react`), add them via the `plugins` field
|
|
18
|
+
- For deep-level or advanced build configuration needs, use `tools.rspack` or `tools.bundlerChain`
|
|
19
|
+
|
|
20
|
+
## CLI
|
|
21
|
+
|
|
22
|
+
- Use `rstest` or `rstest run` to run tests (`run` disables watch mode, suitable for CI)
|
|
23
|
+
- Use `rstest --watch` or `rstest watch` for local development with file watching
|
|
24
|
+
- Use `rstest list` to list all test files and test names
|
|
25
|
+
- Use `rstest -u` to update snapshots
|
|
26
|
+
- Use `--reporter=verbose` when debugging test failures for detailed output
|
|
27
|
+
- Use `--config` (`-c`) to specify a custom config file path
|
|
28
|
+
|
|
29
|
+
## Test writing
|
|
30
|
+
|
|
31
|
+
- Import test APIs from `@rstest/core`: `test`, `describe`, `expect`, `beforeEach`, `afterEach`, etc.
|
|
32
|
+
- Use `test` or `it` for test cases; use `describe` for grouping related tests
|
|
33
|
+
- Use `.only` to focus on specific tests during development, but never commit `.only` to the codebase
|
|
34
|
+
- Use `.skip` or `.todo` to mark incomplete or temporarily skipped tests
|
|
35
|
+
- Prefer small, focused test cases that test a single behavior
|
|
36
|
+
- For async error paths, prefer `await expect(fn()).rejects.toThrow(ErrorClass)` (or `.rejects.toMatchObject({ ... })`) over `try/catch` with `expect.fail` or `.catch(e => e)` patterns — the matcher form fails clearly if the promise unexpectedly resolves, keeps the assertion in one chain, and avoids forgetting to assert the throw at all
|
|
37
|
+
- For async happy paths, use `await expect(fn()).resolves.toEqual(...)` for the same reason
|
|
38
|
+
- Use `includeSource` for in-source testing of small utility functions (Rust-style `import.meta.rstest`)
|
|
39
|
+
- For in-source tests, wrap test code in `if (import.meta.rstest) { ... }` and define `import.meta.rstest` as `false` in production build config
|
|
40
|
+
|
|
41
|
+
## Test environment
|
|
42
|
+
|
|
43
|
+
- Use `testEnvironment: 'node'` (default) for Node.js / server-side code
|
|
44
|
+
- Use `testEnvironment: 'jsdom'` or `testEnvironment: 'happy-dom'` for DOM / browser API testing
|
|
45
|
+
- Install `jsdom` or `happy-dom` as a dev dependency when using DOM environments
|
|
46
|
+
- Prefer `happy-dom` for faster DOM testing; use `jsdom` when better browser API compatibility is needed
|
|
47
|
+
- For real browser testing, use `@rstest/browser` with Playwright
|
|
48
|
+
- Use inline project configs to run different test environments within one project (e.g., `node` and `jsdom` projects)
|
|
49
|
+
|
|
50
|
+
## React / Vue testing
|
|
51
|
+
|
|
52
|
+
- For React: use `@rsbuild/plugin-react` plugin and `@testing-library/react` for component testing
|
|
53
|
+
- For Vue: use `@rsbuild/plugin-vue` plugin and `@testing-library/vue` for component testing
|
|
54
|
+
- Create a `rstest.setup.ts` with `expect.extend(jestDomMatchers)` and `afterEach(() => cleanup())` for Testing Library
|
|
55
|
+
- Add the setup file to `setupFiles` in config
|
|
56
|
+
- For SSR testing, use `testEnvironment: 'node'` and test with `react-dom/server` or framework-specific SSR APIs
|
|
57
|
+
|
|
58
|
+
## Mocking
|
|
59
|
+
|
|
60
|
+
- Use `rs.mock('./module')` to mock modules
|
|
61
|
+
- Use `rs.fn()` to create mock functions
|
|
62
|
+
- Use `rs.spyOn(object, 'method')` to spy on methods
|
|
63
|
+
- Prefer `clearMocks`, `resetMocks`, or `restoreMocks` config options to automatically clean up mocks between tests
|
|
64
|
+
- Use factory functions in `rs.mock('./module', () => ({ ... }))` to provide mock implementations
|
|
65
|
+
|
|
66
|
+
## Snapshot testing
|
|
67
|
+
|
|
68
|
+
- Use `toMatchSnapshot()` for general snapshot testing
|
|
69
|
+
- Use `toMatchInlineSnapshot()` for small, readable inline snapshots
|
|
70
|
+
- Use `toMatchFileSnapshot()` for large or structured outputs (e.g., HTML, generated code)
|
|
71
|
+
- Keep snapshots concise — only include relevant data, avoid timestamps and session IDs
|
|
72
|
+
- Use `expect.addSnapshotSerializer()` to mask paths or sensitive data in snapshots
|
|
73
|
+
- Use `path-serializer` to normalize file paths across platforms
|
|
74
|
+
- Review snapshot changes carefully in code review
|
|
75
|
+
|
|
76
|
+
## Coverage
|
|
77
|
+
|
|
78
|
+
- Enable coverage with `--coverage` CLI flag or `coverage.enabled: true` in config
|
|
79
|
+
- Install `@rstest/coverage-istanbul` for the Istanbul coverage provider
|
|
80
|
+
- Use `coverage.include` to specify source files for coverage (e.g., `['src/**/*.{js,ts,tsx}']`)
|
|
81
|
+
- Use `coverage.thresholds` to enforce minimum coverage requirements
|
|
82
|
+
- Use `coverage.reporters` to generate reports in different formats (e.g., `text`, `lcov`, `html`)
|
|
83
|
+
|
|
84
|
+
## Multi-project testing
|
|
85
|
+
|
|
86
|
+
- Use `projects` field in root config to define multiple test projects
|
|
87
|
+
- For monorepos, use glob patterns like `'packages/*'` to auto-discover sub-projects
|
|
88
|
+
- Use `defineProject` helper in sub-project configs
|
|
89
|
+
- Extract shared config and use `mergeRstestConfig` to compose project configs
|
|
90
|
+
- Global options (`reporters`, `pool`, `isolate`, `coverage`, `bail`) must be set at the root level, not in projects
|
|
91
|
+
|
|
92
|
+
## CI integration
|
|
93
|
+
|
|
94
|
+
- Use `rstest run` (not `rstest watch`) in CI
|
|
95
|
+
- Use `--shard` for parallel test execution across CI machines (e.g., `--shard 1/3`)
|
|
96
|
+
- Use `--reporter=blob` with `rstest merge-reports` to combine sharded results
|
|
97
|
+
- Use `--reporter=junit` with `outputPath` for CI report integration
|
|
98
|
+
- The `github-actions` reporter is auto-enabled in GitHub Actions for inline error annotations
|
|
99
|
+
- Use `--bail` to stop early on first failure when appropriate
|
|
100
|
+
|
|
101
|
+
## Performance
|
|
102
|
+
|
|
103
|
+
- Disable `isolate` (`--no-isolate`) when tests have no side effects for faster execution via module cache reuse
|
|
104
|
+
- Use `pool.maxWorkers` to control parallelism based on available resources
|
|
105
|
+
- Keep test build fast by avoiding unnecessary Rspack plugins in test config
|
|
106
|
+
- Use test filtering (`rstest <pattern>` or `-t <name>`) to run only relevant tests during development
|
|
107
|
+
- Leverage watch mode's incremental re-runs for fast local feedback
|
|
108
|
+
|
|
109
|
+
## Debugging
|
|
110
|
+
|
|
111
|
+
- Run with `DEBUG=rstest` to enable debug mode, which writes final configs and build outputs to disk
|
|
112
|
+
- Read generated files in `dist/.rstest-temp/.rsbuild/` to confirm final Rstest/Rsbuild/Rspack config
|
|
113
|
+
- Use VS Code's JavaScript Debug Terminal to run `rstest` with breakpoints
|
|
114
|
+
- Use `--reporter=verbose` for detailed per-test output
|
|
115
|
+
- Use `--printConsoleTrace` to trace console calls to their source
|
|
116
|
+
- Add VS Code launch config for debugging specific test files with `@rstest/core/bin/rstest.js`
|
|
117
|
+
|
|
118
|
+
## Profiling
|
|
119
|
+
|
|
120
|
+
- Use Rsdoctor with `RSDOCTOR=true rstest run` to analyze test build performance
|
|
121
|
+
- Use `samply` for native profiling of both main and worker processes
|
|
122
|
+
- Use Node.js `--heap-prof` for memory profiling
|
|
123
|
+
|
|
124
|
+
## Toolchain integration
|
|
125
|
+
|
|
126
|
+
- Use the official VS Code extension (`rstack.rstest`) for in-editor test running and debugging
|
|
127
|
+
- For Rslib libraries, use `@rstest/adapter-rslib` for config reuse
|
|
128
|
+
- For Rsbuild apps, use `@rstest/adapter-rsbuild` for config reuse
|
|
129
|
+
- Use `process.env.RSTEST` to detect test environment and apply test-specific config
|
|
130
|
+
|
|
131
|
+
## Documentation
|
|
132
|
+
|
|
133
|
+
- For the latest Rstest docs, read https://rstest.rs/llms.txt
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"source": {
|
|
4
|
+
"repository": "https://github.com/rstackjs/agent-skills",
|
|
5
|
+
"commit": "61c948b42512e223bad44b83af4080eba48b2677",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"licensePath": ".agents/rstackjs-agent-skills-LICENSE"
|
|
8
|
+
},
|
|
9
|
+
"installDir": ".agents/skills",
|
|
10
|
+
"sources": [
|
|
11
|
+
{
|
|
12
|
+
"id": "rstack-agent-skills",
|
|
13
|
+
"visibility": "public",
|
|
14
|
+
"repository": "https://github.com/rstackjs/agent-skills",
|
|
15
|
+
"commit": "61c948b42512e223bad44b83af4080eba48b2677",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"licensePath": ".agents/rstackjs-agent-skills-LICENSE",
|
|
18
|
+
"install": "vendored"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "module-federation-agent-skills",
|
|
22
|
+
"visibility": "public",
|
|
23
|
+
"repository": "https://github.com/module-federation/agent-skills",
|
|
24
|
+
"commit": "07bb5b6c43ad457609e00c081b72d4c42508ec76",
|
|
25
|
+
"install": "clone",
|
|
26
|
+
"baseline": [
|
|
27
|
+
{
|
|
28
|
+
"name": "mf",
|
|
29
|
+
"path": ".agents/skills/mf",
|
|
30
|
+
"reason": "Module Federation docs, config inspection, type checking, shared dependency checks, and observability troubleshooting"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "techsiocz-private",
|
|
36
|
+
"visibility": "private",
|
|
37
|
+
"repository": "https://github.com/TechsioCZ/skills",
|
|
38
|
+
"install": "clone-if-authorized",
|
|
39
|
+
"baseline": [
|
|
40
|
+
{
|
|
41
|
+
"name": "plan-graph",
|
|
42
|
+
"reason": "Build and validate DAGs from .plan.md files"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "dag",
|
|
46
|
+
"reason": "Inspect current plan frontiers and blocked lanes"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "subagent-graph",
|
|
50
|
+
"reason": "Design dependency-aware multi-agent launch graphs"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "helm",
|
|
54
|
+
"reason": "Steer already-running multi-agent work"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "debugger-mode",
|
|
58
|
+
"reason": "Run hypothesis-driven debugging with runtime evidence"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"baseline": [
|
|
64
|
+
{
|
|
65
|
+
"name": "rsbuild-best-practices",
|
|
66
|
+
"path": ".agents/skills/rsbuild-best-practices",
|
|
67
|
+
"reason": "Modern.js application build configuration and Rsbuild troubleshooting"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "rspack-best-practices",
|
|
71
|
+
"path": ".agents/skills/rspack-best-practices",
|
|
72
|
+
"reason": "Rspack bundling, CSS, asset, profiling, and production behavior"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"name": "rspack-tracing",
|
|
76
|
+
"path": ".agents/skills/rspack-tracing",
|
|
77
|
+
"reason": "Trace-backed Rspack failure and performance debugging"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "rsdoctor-analysis",
|
|
81
|
+
"path": ".agents/skills/rsdoctor-analysis",
|
|
82
|
+
"reason": "Evidence-backed bundle composition, duplication, and retained-module analysis"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"name": "rslib-best-practices",
|
|
86
|
+
"path": ".agents/skills/rslib-best-practices",
|
|
87
|
+
"reason": "Rslib shared package and design-system library authoring"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "rslib-modern-package",
|
|
91
|
+
"path": ".agents/skills/rslib-modern-package",
|
|
92
|
+
"reason": "Modern package contracts, exports, declarations, side effects, and release readiness"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "rstest-best-practices",
|
|
96
|
+
"path": ".agents/skills/rstest-best-practices",
|
|
97
|
+
"reason": "Rstest configuration, test writing, mocking, snapshots, coverage, and CI behavior"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "mf",
|
|
101
|
+
"path": ".agents/skills/mf",
|
|
102
|
+
"reason": "Module Federation docs, config inspection, type checking, shared dependency checks, and observability troubleshooting"
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
"excludedByDefault": [
|
|
106
|
+
"migrate-to-rsbuild",
|
|
107
|
+
"migrate-to-rslib",
|
|
108
|
+
"migrate-to-rslint",
|
|
109
|
+
"migrate-to-rstest",
|
|
110
|
+
"rsbuild-v2-upgrade",
|
|
111
|
+
"rspack-v2-upgrade",
|
|
112
|
+
"rspress-v2-upgrade"
|
|
113
|
+
]
|
|
114
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Stop": [
|
|
3
|
+
{
|
|
4
|
+
"command": "pnpm format && pnpm lint:fix && pnpm check",
|
|
5
|
+
"timeout": 600000,
|
|
6
|
+
"statusMessage": "Running UltraModern quality gates"
|
|
7
|
+
}
|
|
8
|
+
],
|
|
9
|
+
"SubagentStop": [
|
|
10
|
+
{
|
|
11
|
+
"command": "pnpm format && pnpm lint:fix && pnpm check",
|
|
12
|
+
"timeout": 600000,
|
|
13
|
+
"statusMessage": "Running UltraModern quality gates"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
+
"extends": ["config:recommended", "helpers:pinGitHubActionDigests"],
|
|
4
|
+
"dependencyDashboard": true,
|
|
5
|
+
"minimumReleaseAge": "1 day",
|
|
6
|
+
"prConcurrentLimit": 5,
|
|
7
|
+
"prHourlyLimit": 2,
|
|
8
|
+
"rangeStrategy": "bump",
|
|
9
|
+
"schedule": ["before 5am on monday"],
|
|
10
|
+
"timezone": "Etc/UTC",
|
|
11
|
+
"packageRules": [
|
|
12
|
+
{
|
|
13
|
+
"matchManagers": ["github-actions"],
|
|
14
|
+
"groupName": "github-actions",
|
|
15
|
+
"labels": ["dependencies", "github-actions", "security"]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"matchManagers": ["npm"],
|
|
19
|
+
"matchUpdateTypes": ["patch", "minor"],
|
|
20
|
+
"groupName": "npm minor and patch updates",
|
|
21
|
+
"labels": ["dependencies", "npm"]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"matchUpdateTypes": ["major"],
|
|
25
|
+
"dependencyDashboardApproval": true,
|
|
26
|
+
"labels": ["dependencies", "major"]
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
name: Ultramodern Workspace Gates
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
pull_request:
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
defaults:
|
|
11
|
+
run:
|
|
12
|
+
shell: bash
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: ultramodern-workspace-gates-${{ github.workflow }}-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: true
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
workspace-gate:
|
|
20
|
+
name: ${{ matrix.name }}
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
timeout-minutes: 30
|
|
23
|
+
strategy:
|
|
24
|
+
fail-fast: false
|
|
25
|
+
matrix:
|
|
26
|
+
include:
|
|
27
|
+
- name: Format
|
|
28
|
+
command: pnpm format:check
|
|
29
|
+
- name: Lint
|
|
30
|
+
command: pnpm lint
|
|
31
|
+
- name: Typecheck
|
|
32
|
+
command: pnpm typecheck
|
|
33
|
+
- name: Skills
|
|
34
|
+
command: pnpm skills:check
|
|
35
|
+
- name: I18n Boundaries
|
|
36
|
+
command: pnpm i18n:boundaries
|
|
37
|
+
- name: Contract
|
|
38
|
+
command: pnpm contract:check
|
|
39
|
+
- name: Build
|
|
40
|
+
command: pnpm build
|
|
41
|
+
steps:
|
|
42
|
+
- name: Harden Runner
|
|
43
|
+
uses: step-security/harden-runner@ab7a9404c0f3da075243ca237b5fac12c98deaa5 # v2
|
|
44
|
+
with:
|
|
45
|
+
egress-policy: audit
|
|
46
|
+
|
|
47
|
+
- name: Checkout
|
|
48
|
+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
49
|
+
with:
|
|
50
|
+
fetch-depth: 1
|
|
51
|
+
persist-credentials: false
|
|
52
|
+
|
|
53
|
+
- name: Setup Node.js
|
|
54
|
+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
55
|
+
with:
|
|
56
|
+
node-version: "{{nodeVersion}}"
|
|
57
|
+
|
|
58
|
+
- name: Setup mise
|
|
59
|
+
uses: jdx/mise-action@5ac50f778e26fac95da98d50503682459e86d566 # v3.2.0
|
|
60
|
+
|
|
61
|
+
- name: Install Dependencies
|
|
62
|
+
run: mise exec -- pnpm install --frozen-lockfile
|
|
63
|
+
|
|
64
|
+
- name: Run ${{ matrix.name }}
|
|
65
|
+
env:
|
|
66
|
+
MODERN_PUBLIC_SITE_URL: http://localhost:8080
|
|
67
|
+
run: mise exec -- ${{ matrix.command }}
|
|
@@ -6,12 +6,20 @@ instructions, not optional reading.
|
|
|
6
6
|
|
|
7
7
|
## Quality Gates
|
|
8
8
|
|
|
9
|
+
Generated workspaces target Node `>=26` and pnpm `{{pnpmVersion}}`. Keep
|
|
10
|
+
`packageManager`, `.mise.toml`, generated validation, and CI aligned to that
|
|
11
|
+
baseline; do not reintroduce Corepack or older pnpm aliases.
|
|
12
|
+
|
|
9
13
|
- `pnpm lint` runs Oxlint with the Ultracite preset.
|
|
10
14
|
- `pnpm format` runs oxfmt.
|
|
11
15
|
- `pnpm typecheck` runs effect-tsgo as the TypeScript checker.
|
|
12
|
-
- `pnpm
|
|
16
|
+
- `pnpm i18n:boundaries` verifies workspace source boundaries through `@modern-js/code-tools`.
|
|
17
|
+
- `pnpm contract:check` verifies the generated workspace contract.
|
|
18
|
+
- `pnpm mf:types` verifies Module Federation type outputs after builds.
|
|
19
|
+
- `pnpm check` is a local convenience aggregate for the primitive gates.
|
|
20
|
+
- Generated CI runs primitive gates as separate matrix jobs instead of calling `pnpm check`.
|
|
13
21
|
- Generated Codex stop hooks and subagent-stop hooks run `pnpm format && pnpm lint:fix && pnpm check`.
|
|
14
|
-
- `postinstall` formats the generated tree
|
|
22
|
+
- `postinstall` formats the generated tree and installs `lefthook`. It never clones repositories or installs system packages; agent skill repos and reference repos are explicit opt-in steps (`pnpm skills:install`, `pnpm agents:refs:install`). Generated `lefthook.yml` runs separate format and lint-fix commands on pre-commit; pre-push runs read-only primitive gates in parallel.
|
|
15
23
|
|
|
16
24
|
## Localized Routes
|
|
17
25
|
|
|
@@ -20,9 +28,12 @@ static language links, and canonical plus `hreflang` metadata. A new workspace
|
|
|
20
28
|
starts shell-only; `create <domain> --vertical` adds route-owned metadata,
|
|
21
29
|
localized resources, and Effect BFF surfaces for that domain. Runtime i18n is
|
|
22
30
|
not enabled in the starter because the current React 19 + Module Federation
|
|
23
|
-
streaming SSR stack must render predictably first.
|
|
24
|
-
`MODERN_PUBLIC_SITE_URL`
|
|
25
|
-
|
|
31
|
+
streaming SSR stack must render predictably first. Canonical and hreflang URLs
|
|
32
|
+
use `MODERN_PUBLIC_SITE_URL` only. JS/CSS/static assets use
|
|
33
|
+
`MODERN_ASSET_PREFIX`, then `ULTRAMODERN_ASSET_PREFIX`, then `/`; do not use
|
|
34
|
+
`MODERN_PUBLIC_SITE_URL` or stale public URL aliases as asset-prefix fallbacks.
|
|
35
|
+
Without an asset prefix, builds emit origin-relative asset paths so pages work
|
|
36
|
+
behind tunnels and reverse proxies.
|
|
26
37
|
|
|
27
38
|
## Required Skill Baseline
|
|
28
39
|
|
|
@@ -37,7 +48,7 @@ Use these skills when the task touches the matching subsystem:
|
|
|
37
48
|
- `rstest-best-practices`: Rstest configuration, test writing, mocking, snapshots, coverage, and CI test behavior.
|
|
38
49
|
- `mf`: Module Federation docs, Modern.js integration, DTS/type checks, shared dependency checks, runtime errors, and observability troubleshooting.
|
|
39
50
|
|
|
40
|
-
The public `module-federation/agent-skills` repository is installed
|
|
51
|
+
The public `module-federation/agent-skills` repository is installed only when you explicitly run `pnpm skills:install` (or set `ULTRAMODERN_AGENT_SKILLS=1` before `pnpm install`). Postinstall never clones repositories. `pnpm skills:install` remains strict for required public skills. `pnpm skills:check` fails when a vendored skill is missing and warns when clone-installed skills such as `mf` have not been fetched yet.
|
|
41
52
|
|
|
42
53
|
## Private Skills
|
|
43
54
|
|
|
@@ -51,12 +62,12 @@ The installer copies only the pinned private skills from `.agents/skills-lock.js
|
|
|
51
62
|
|
|
52
63
|
## Agent Reference Repositories
|
|
53
64
|
|
|
54
|
-
The workspace
|
|
65
|
+
The workspace can install read-only source references under `repos/` with the explicit `pnpm agents:refs:install` command using `git subtree add --squash`. These repositories are reference material for coding agents, not application source:
|
|
55
66
|
|
|
56
67
|
- `repos/effect` from `Effect-TS/effect`.
|
|
57
68
|
- `repos/ultramodern.js` from `BleedingDev/ultramodern.js`.
|
|
58
69
|
|
|
59
|
-
Agents may read files under `repos/` to understand upstream patterns, APIs, and project conventions. Do not edit files under `repos/`, import from them, or make production code depend on them.
|
|
70
|
+
Agents may read files under `repos/` to understand upstream patterns, APIs, and project conventions. Do not edit files under `repos/`, import from them, or make production code depend on them. `ULTRAMODERN_SKIP_AGENT_REPOS=1` disables the installer even when invoked explicitly.
|
|
60
71
|
|
|
61
72
|
## Project Priorities
|
|
62
73
|
|
|
@@ -73,4 +84,4 @@ Agents may read files under `repos/` to understand upstream patterns, APIs, and
|
|
|
73
84
|
|
|
74
85
|
## Skill Provenance
|
|
75
86
|
|
|
76
|
-
The vendored Rstack skills, public Module Federation skill, and private TechsioCZ skill set are pinned in `.agents/skills-lock.json`. Do not update, remove, or replace them casually. If a skill needs updating, update the lock file and run `pnpm check`.
|
|
87
|
+
The vendored Rstack skills, public Module Federation skill, and private TechsioCZ skill set are pinned in `.agents/skills-lock.json`. Do not update, remove, or replace them casually. If a skill needs updating, update the lock file and run the affected primitive gate plus `pnpm check`.
|
|
@@ -7,8 +7,8 @@ UltraModern.js 3.0 SuperApp surface and starts with an explicit shell:
|
|
|
7
7
|
|
|
8
8
|
- `apps/shell-super-app` owns shell route assembly, Module Federation host
|
|
9
9
|
wiring, shared SSR/i18n runtime setup, and the boundary debugger.
|
|
10
|
-
- `packages/shared-*` provide placeholders for cross-workspace contracts
|
|
11
|
-
design tokens
|
|
10
|
+
- `packages/shared-*` provide placeholders for cross-workspace contracts and
|
|
11
|
+
design tokens.
|
|
12
12
|
- `verticals/*` is intentionally empty until a real business domain is added.
|
|
13
13
|
|
|
14
14
|
Add a full-stack MicroVertical when the product needs one:
|
|
@@ -19,9 +19,36 @@ pnpm dlx @bleedingdev/modern-js-create payments --vertical
|
|
|
19
19
|
```
|
|
20
20
|
|
|
21
21
|
Each added vertical owns its UI/routes, browser-safe Module Federation exposes,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
stay out of browser exposes.
|
|
22
|
+
private-first route metadata, localized URLs, public-route opt-ins, CSS prefix,
|
|
23
|
+
Effect BFF handlers, local API contract, and typed client surface. Server
|
|
24
|
+
handlers and Effect client/contract modules stay out of browser exposes.
|
|
25
|
+
|
|
26
|
+
## Private-First Public Surfaces
|
|
27
|
+
|
|
28
|
+
Generated app routes are private and non-indexable by default. Author route
|
|
29
|
+
metadata in colocated `src/routes/**/route.meta.ts` files; the scaffold
|
|
30
|
+
regenerates `src/routes/ultramodern-route-metadata.ts` as a compatibility
|
|
31
|
+
manifest for config, i18n, public head, and public surface contracts. Private
|
|
32
|
+
app, auth, tenant, dashboard, and internal routes publish no discovery output
|
|
33
|
+
unless route metadata explicitly marks them `public && indexable`. The default
|
|
34
|
+
scaffold therefore emits only a disallowing `robots.txt`; sitemap, web
|
|
35
|
+
manifest, `llms.txt`, API catalog, security.txt, and JSON-LD output stay
|
|
36
|
+
omitted until a safe public route or public docs/help/product surface exists.
|
|
37
|
+
Structured data is never inferred automatically. Add `jsonLd` explicitly in
|
|
38
|
+
route metadata for `public && indexable` routes and use
|
|
39
|
+
`src/routes/ultramodern-jsonld.ts` when the route fits the generated `WebPage`,
|
|
40
|
+
`WebApplication`, `SoftwareApplication`, `BreadcrumbList`, `FAQPage`, or
|
|
41
|
+
`Organization` helpers. Private or non-indexable routes emit no JSON-LD even
|
|
42
|
+
when they have localized paths, titles, descriptions, BFF APIs, or Module
|
|
43
|
+
Federation boundaries.
|
|
44
|
+
|
|
45
|
+
Public web artifacts are build/deploy outputs generated into `dist/public` and
|
|
46
|
+
`.output/public`, not hand-authored source files under `config/public`. Dynamic
|
|
47
|
+
public routes can expand sitemap entries through route-owned, Node-safe
|
|
48
|
+
`route.sitemap.mjs` providers beside route metadata. The public-surface
|
|
49
|
+
generator discovers those providers for dynamic public routes and still honors
|
|
50
|
+
explicit `routes.publicSurface.contentSources` entries in the generated
|
|
51
|
+
compatibility manifest.
|
|
25
52
|
|
|
26
53
|
Run the scaffold validator before adding business code and after every
|
|
27
54
|
`--vertical` mutation:
|
|
@@ -33,11 +60,24 @@ pnpm check
|
|
|
33
60
|
pnpm build
|
|
34
61
|
```
|
|
35
62
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
63
|
+
The generated toolchain baseline is Node `>=26` with pnpm `{{pnpmVersion}}`.
|
|
64
|
+
`packageManager`, `.mise.toml`, generated validation, and CI should all agree
|
|
65
|
+
on that baseline; do not reintroduce Corepack or older pnpm aliases.
|
|
66
|
+
|
|
67
|
+
Generated CI does not call the local aggregate. It runs format, lint,
|
|
68
|
+
typecheck, skills, i18n boundary validation, contract validation, and build as
|
|
69
|
+
separate matrix jobs so failures are isolated and parallelizable.
|
|
70
|
+
|
|
71
|
+
Read-only agent reference repositories under `repos/` (Effect and
|
|
72
|
+
UltraModern.js source lookup using squashed git subtrees) are an explicit
|
|
73
|
+
opt-in step: run `pnpm agents:refs:install` when you want them. `pnpm install`
|
|
74
|
+
never clones repositories.
|
|
75
|
+
|
|
76
|
+
Vendored agent skills ship with the scaffold. Clone-installed skills (such as
|
|
77
|
+
the Module Federation `mf` skill) are fetched only when you explicitly run
|
|
78
|
+
`pnpm skills:install`, or when `ULTRAMODERN_AGENT_SKILLS=1` is set during
|
|
79
|
+
`pnpm install`. `pnpm skills:check` warns about missing clone-installed skills
|
|
80
|
+
without failing the gate.
|
|
41
81
|
|
|
42
82
|
The topology and ownership metadata are generated under `topology/`. The
|
|
43
83
|
workspace also ships `.github/workflows/ultramodern-workspace-gates.yml` and
|
|
@@ -53,12 +93,43 @@ development. To create a workspace that can install those packages outside the
|
|
|
53
93
|
monorepo, generate with `--ultramodern-package-source install`; generated shared
|
|
54
94
|
packages still use `workspace:*` because they are part of this workspace.
|
|
55
95
|
|
|
96
|
+
## Public URL Environment Variables
|
|
97
|
+
|
|
98
|
+
This workspace's apps must not bake absolute `http://localhost:<port>` URLs
|
|
99
|
+
into asset configuration. Public URL and asset prefix environment variables
|
|
100
|
+
have distinct roles, and stale aliases should not be carried forward when
|
|
101
|
+
regenerating or updating the workspace.
|
|
102
|
+
|
|
103
|
+
| Variable | Role | Feeds |
|
|
104
|
+
| --- | --- | --- |
|
|
105
|
+
| `MODERN_PUBLIC_SITE_URL` | Canonical site origin for public SEO output only | Canonical, hreflang, sitemap `<loc>`, robots `Sitemap:` |
|
|
106
|
+
| `MODERN_ASSET_PREFIX` | Preferred JS/CSS/static asset prefix | Modern/Rspack-emitted asset URLs |
|
|
107
|
+
| `ULTRAMODERN_ASSET_PREFIX` | UltraModern compatibility asset prefix | Modern/Rspack-emitted asset URLs when `MODERN_ASSET_PREFIX` is unset |
|
|
108
|
+
| `ULTRAMODERN_PUBLIC_URL_<APP_ID>` | Per-app deployment/proof URL | Cloudflare proof inputs and Module Federation remote URLs |
|
|
109
|
+
|
|
110
|
+
Asset URLs use this precedence: `MODERN_ASSET_PREFIX` →
|
|
111
|
+
`ULTRAMODERN_ASSET_PREFIX` → origin-relative `/`. `MODERN_PUBLIC_SITE_URL` is
|
|
112
|
+
canonical/SEO-only and must not be used as an asset-prefix fallback.
|
|
113
|
+
SEO output uses `MODERN_PUBLIC_SITE_URL`; if it is unset, generated local and
|
|
114
|
+
preview outputs remain non-public until deployment proof provides explicit
|
|
115
|
+
public URLs.
|
|
116
|
+
|
|
117
|
+
Without public URLs configured, asset paths are origin-relative (`/`), and the
|
|
118
|
+
dev server uses `dev.assetPrefix: '/'` — so apps work through tunnels and
|
|
119
|
+
reverse proxies (ngrok, cloudflared) without triggering Chrome's Local Network
|
|
120
|
+
Access prompt or mixed-content errors. Shell-only workspaces can set
|
|
121
|
+
`MODERN_PUBLIC_SITE_URL` for SEO output without changing where assets load
|
|
122
|
+
from.
|
|
123
|
+
|
|
56
124
|
## Cloudflare Proof
|
|
57
125
|
|
|
58
126
|
Deploy the generated apps, then pass each deployed app's generated public URL
|
|
59
|
-
env key into the proof step.
|
|
60
|
-
|
|
61
|
-
|
|
127
|
+
env key into the proof step. The proof script reads the generated contract and
|
|
128
|
+
checks the live Worker surface, including public-route sitemap/robots
|
|
129
|
+
consistency, preview noindex behavior, unknown-route status, asset headers,
|
|
130
|
+
byte budgets, and public sourcemap exposure. A shell-only workspace only needs
|
|
131
|
+
the shell URL; added verticals use the same `ULTRAMODERN_PUBLIC_URL_<APP_ID>`
|
|
132
|
+
pattern with hyphens converted to underscores and uppercased.
|
|
62
133
|
|
|
63
134
|
```bash
|
|
64
135
|
pnpm cloudflare:deploy
|
|
@@ -72,7 +143,7 @@ pnpm cloudflare:proof -- --require-public-urls
|
|
|
72
143
|
| --- | --- | --- |
|
|
73
144
|
| Package cohort mismatch | Regenerate with one package source strategy, run `mise install`, then rerun `pnpm install` from the activated shell. | Generated workspace package source metadata |
|
|
74
145
|
| Install failure | Check the active Node/pnpm from `mise install`; rerun `pnpm install` after the shell sees the pinned versions. | Toolchain setup |
|
|
75
|
-
| Build failure | Run `pnpm check` before `pnpm build`; fix
|
|
146
|
+
| Build failure | Run the matching primitive gate (`pnpm lint`, `pnpm typecheck`, `pnpm i18n:boundaries`, `pnpm contract:check`) before `pnpm build`; fix the owning failure first. | Owning package or generated contract |
|
|
76
147
|
| Missing public URL | Set the env key from `.modernjs/ultramodern-generated-contract.json`, for example `ULTRAMODERN_PUBLIC_URL_SHELL_SUPER_APP`. | Deployment operator |
|
|
77
148
|
| Cloudflare credentials | Confirm Wrangler credentials before `pnpm cloudflare:deploy`; local checks do not prove live Worker access. | Deployment operator |
|
|
78
149
|
| Asset or CSS 404 | Rebuild with `pnpm build` or `pnpm cloudflare:deploy` and inspect emitted Modern/Rspack asset paths instead of hardcoding CSS URLs. | Framework/runtime asset pipeline |
|
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
pre-commit:
|
|
2
2
|
commands:
|
|
3
|
-
|
|
4
|
-
run: pnpm format
|
|
3
|
+
format:
|
|
4
|
+
run: pnpm format
|
|
5
|
+
stage_fixed: true
|
|
6
|
+
lint-fix:
|
|
7
|
+
run: pnpm lint:fix
|
|
5
8
|
stage_fixed: true
|
|
6
9
|
|
|
7
10
|
pre-push:
|
|
11
|
+
parallel: true
|
|
8
12
|
commands:
|
|
9
|
-
|
|
10
|
-
run: pnpm check
|
|
13
|
+
format:
|
|
14
|
+
run: pnpm format:check
|
|
15
|
+
lint:
|
|
16
|
+
run: pnpm lint
|
|
17
|
+
typecheck:
|
|
18
|
+
run: pnpm typecheck
|
|
19
|
+
skills:
|
|
20
|
+
run: pnpm skills:check
|
|
21
|
+
i18n-boundaries:
|
|
22
|
+
run: pnpm i18n:boundaries
|
|
23
|
+
contract:
|
|
24
|
+
run: pnpm contract:check
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
packages:
|
|
2
|
+
- apps/*
|
|
3
|
+
- verticals/*
|
|
4
|
+
- packages/*
|
|
5
|
+
|
|
6
|
+
minimumReleaseAge: 1440
|
|
7
|
+
minimumReleaseAgeStrict: true
|
|
8
|
+
minimumReleaseAgeIgnoreMissingTime: false
|
|
9
|
+
minimumReleaseAgeExclude:
|
|
10
|
+
- '@bleedingdev/modern-js-*'
|
|
11
|
+
- '@tanstack/react-router'
|
|
12
|
+
- '@tanstack/router-core'
|
|
13
|
+
- 'typescript'
|
|
14
|
+
- '@typescript/native-preview'
|
|
15
|
+
- '@typescript/native-preview-*'
|
|
16
|
+
- '@types/react'
|
|
17
|
+
trustPolicy: no-downgrade
|
|
18
|
+
trustPolicyIgnoreAfter: 1440
|
|
19
|
+
blockExoticSubdeps: true
|
|
20
|
+
engineStrict: true
|
|
21
|
+
pmOnFail: error
|
|
22
|
+
verifyDepsBeforeRun: error
|
|
23
|
+
strictDepBuilds: true
|
|
24
|
+
|
|
25
|
+
peerDependencyRules:
|
|
26
|
+
allowedVersions:
|
|
27
|
+
react: '>=19.0.0'
|
|
28
|
+
'@module-federation/dts-plugin>typescript': '{{typescriptVersion}}'
|
|
29
|
+
'@module-federation/enhanced>typescript': '{{typescriptVersion}}'
|
|
30
|
+
'@module-federation/modern-js-v3>typescript': '{{typescriptVersion}}'
|
|
31
|
+
'@module-federation/rspack>typescript': '{{typescriptVersion}}'
|
|
32
|
+
'i18next>typescript': '{{typescriptVersion}}'
|
|
33
|
+
|
|
34
|
+
overrides:
|
|
35
|
+
'@tanstack/react-router': {{tanstackRouterVersion}}
|
|
36
|
+
node-fetch: '{{nodeFetchVersion}}'
|
|
37
|
+
|
|
38
|
+
allowBuilds:
|
|
39
|
+
'@swc/core': true
|
|
40
|
+
core-js: true
|
|
41
|
+
esbuild: true
|
|
42
|
+
lefthook: true
|
|
43
|
+
msgpackr-extract: true
|
|
44
|
+
sharp: true
|
|
45
|
+
workerd: true
|