@clubedge/create-clubedge-app 0.2.1 → 0.4.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 (199) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +67 -36
  3. package/bin/create.mjs +2 -469
  4. package/dist/cli/args.js +54 -0
  5. package/dist/cli/ui.js +87 -0
  6. package/dist/core/customize.js +95 -0
  7. package/dist/core/execute.js +60 -0
  8. package/dist/core/manifest.js +119 -0
  9. package/dist/core/plan.js +132 -0
  10. package/dist/core/source.js +107 -0
  11. package/dist/index.js +160 -0
  12. package/dist/package-info.js +8 -0
  13. package/dist/steps/git.js +11 -0
  14. package/dist/steps/install.js +19 -0
  15. package/dist/utils/fs.js +100 -0
  16. package/dist/utils/names.js +14 -0
  17. package/dist/utils/process.js +49 -0
  18. package/package.json +19 -7
  19. package/template/.dockerignore +11 -0
  20. package/template/.env.example +25 -0
  21. package/template/.gitattributes +6 -0
  22. package/template/.github/ISSUE_TEMPLATE/bug_report.yml +35 -0
  23. package/template/.github/ISSUE_TEMPLATE/config.yml +8 -0
  24. package/template/.github/ISSUE_TEMPLATE/feature_request.yml +24 -0
  25. package/template/.github/pull_request_template.md +20 -0
  26. package/template/.github/workflows/ci.yml +96 -0
  27. package/template/.prettierignore +2 -0
  28. package/template/.prettierrc.json +1 -0
  29. package/template/AGENTS.md +32 -0
  30. package/template/CODE_OF_CONDUCT.md +22 -0
  31. package/template/CONTRIBUTING.md +53 -0
  32. package/template/Dockerfile +32 -0
  33. package/template/LICENSE +201 -0
  34. package/template/NOTICE +6 -0
  35. package/template/PUBLISHING.md +27 -0
  36. package/template/README.md +170 -0
  37. package/template/SECURITY.md +15 -0
  38. package/template/SETUP.md +196 -0
  39. package/template/SUPPORT.md +8 -0
  40. package/template/_gitignore +17 -0
  41. package/template/apps/start/.env.example +27 -0
  42. package/template/apps/start/AGENTS.md +11 -0
  43. package/template/apps/start/Dockerfile +38 -0
  44. package/template/apps/start/package.json +37 -0
  45. package/template/apps/start/public/.well-known/logo.svg +1 -0
  46. package/template/apps/start/public/favicon.ico +0 -0
  47. package/template/apps/start/src/components/auth/auth-form-controls.tsx +108 -0
  48. package/template/apps/start/src/components/branding/clubedge-mark.tsx +24 -0
  49. package/template/apps/start/src/components/dashboard/account-button.tsx +33 -0
  50. package/template/apps/start/src/components/dashboard/app-sidebar.tsx +90 -0
  51. package/template/apps/start/src/components/landing/copy-command.tsx +46 -0
  52. package/template/apps/start/src/components/theme/theme-provider.tsx +41 -0
  53. package/template/apps/start/src/components/theme/theme-toggle.tsx +21 -0
  54. package/template/apps/start/src/config/site.json +11 -0
  55. package/template/apps/start/src/config/site.ts +20 -0
  56. package/template/apps/start/src/env/server.test.ts +48 -0
  57. package/template/apps/start/src/env/server.ts +67 -0
  58. package/template/apps/start/src/lib/login-url.test.ts +16 -0
  59. package/template/apps/start/src/lib/login-url.ts +16 -0
  60. package/template/apps/start/src/routeTree.gen.ts +220 -0
  61. package/template/apps/start/src/router.tsx +27 -0
  62. package/template/apps/start/src/routes/__root.tsx +59 -0
  63. package/template/apps/start/src/routes/api/health.ts +15 -0
  64. package/template/apps/start/src/routes/auth/callback.ts +10 -0
  65. package/template/apps/start/src/routes/auth/sign-in.ts +11 -0
  66. package/template/apps/start/src/routes/auth/sign-out.ts +11 -0
  67. package/template/apps/start/src/routes/auth/sign-up.ts +11 -0
  68. package/template/apps/start/src/routes/dashboard.tsx +351 -0
  69. package/template/apps/start/src/routes/index.tsx +233 -0
  70. package/template/apps/start/src/routes/login.tsx +164 -0
  71. package/template/apps/start/src/server/auth-forms.test.ts +169 -0
  72. package/template/apps/start/src/server/auth-forms.ts +118 -0
  73. package/template/apps/start/src/server/auth.functions.ts +27 -0
  74. package/template/apps/start/src/server/auth.ts +51 -0
  75. package/template/apps/start/src/server/cache.ts +38 -0
  76. package/template/apps/start/src/server/cookies.test.ts +41 -0
  77. package/template/apps/start/src/server/cookies.ts +31 -0
  78. package/template/apps/start/src/server/db.ts +16 -0
  79. package/template/apps/start/src/server/storage.ts +39 -0
  80. package/template/apps/start/src/server/users.ts +17 -0
  81. package/template/apps/start/src/start.ts +40 -0
  82. package/template/apps/start/src/styles.css +2 -0
  83. package/template/apps/start/tsconfig.json +19 -0
  84. package/template/apps/start/vite.config.ts +27 -0
  85. package/template/apps/web/AGENTS.md +9 -0
  86. package/template/apps/web/components.json +21 -0
  87. package/template/apps/web/next-env.d.ts +7 -0
  88. package/template/apps/web/next.config.ts +32 -0
  89. package/template/apps/web/package.json +33 -0
  90. package/template/apps/web/postcss.config.mjs +3 -0
  91. package/template/apps/web/public/.gitkeep +0 -0
  92. package/template/apps/web/public/.well-known/logo.svg +1 -0
  93. package/template/apps/web/scripts/start-standalone.mjs +36 -0
  94. package/template/apps/web/src/app/actions/auth.ts +85 -0
  95. package/template/apps/web/src/app/api/health/route.ts +11 -0
  96. package/template/apps/web/src/app/auth/callback/route.ts +21 -0
  97. package/template/apps/web/src/app/dashboard/_components/account-button.tsx +34 -0
  98. package/template/apps/web/src/app/dashboard/_components/app-sidebar.tsx +91 -0
  99. package/template/apps/web/src/app/dashboard/page.tsx +352 -0
  100. package/template/apps/web/src/app/favicon.ico +0 -0
  101. package/template/apps/web/src/app/layout.tsx +36 -0
  102. package/template/apps/web/src/app/login/_components/auth-form-controls.tsx +88 -0
  103. package/template/apps/web/src/app/login/page.tsx +149 -0
  104. package/template/apps/web/src/app/page.tsx +229 -0
  105. package/template/apps/web/src/app/theme-provider.tsx +43 -0
  106. package/template/apps/web/src/app/theme-toggle.tsx +23 -0
  107. package/template/apps/web/src/components/branding/clubedge-mark.tsx +25 -0
  108. package/template/apps/web/src/components/landing/copy-command.tsx +48 -0
  109. package/template/apps/web/src/config/site.json +11 -0
  110. package/template/apps/web/src/config/site.ts +20 -0
  111. package/template/apps/web/src/env/client.ts +22 -0
  112. package/template/apps/web/src/env/server.test.ts +35 -0
  113. package/template/apps/web/src/env/server.ts +45 -0
  114. package/template/apps/web/src/lib/login-url.test.ts +16 -0
  115. package/template/apps/web/src/lib/login-url.ts +16 -0
  116. package/template/apps/web/src/lib/utils.ts +1 -0
  117. package/template/apps/web/src/proxy.ts +31 -0
  118. package/template/apps/web/src/server/auth.ts +69 -0
  119. package/template/apps/web/src/server/cache.ts +38 -0
  120. package/template/apps/web/src/server/db.ts +16 -0
  121. package/template/apps/web/src/server/storage.ts +39 -0
  122. package/template/apps/web/src/server/users.ts +17 -0
  123. package/template/apps/web/tsconfig.json +36 -0
  124. package/template/clubedge.template.json +29 -0
  125. package/template/docker-compose.yml +8 -0
  126. package/template/e2e/app.ts +12 -0
  127. package/template/e2e/auth.spec.ts +37 -0
  128. package/template/e2e/home.spec.ts +15 -0
  129. package/template/eslint.config.mjs +67 -0
  130. package/template/package.json +47 -0
  131. package/template/packages/auth/package.json +23 -0
  132. package/template/packages/auth/src/index.ts +9 -0
  133. package/template/packages/auth/src/supabase.test.ts +126 -0
  134. package/template/packages/auth/src/supabase.ts +65 -0
  135. package/template/packages/auth/src/types.ts +59 -0
  136. package/template/packages/auth/tsconfig.json +4 -0
  137. package/template/packages/cache/package.json +20 -0
  138. package/template/packages/cache/src/index.test.ts +67 -0
  139. package/template/packages/cache/src/index.ts +19 -0
  140. package/template/packages/cache/src/rate-limit.test.ts +52 -0
  141. package/template/packages/cache/src/rate-limit.ts +74 -0
  142. package/template/packages/cache/src/redis.ts +106 -0
  143. package/template/packages/cache/tsconfig.json +4 -0
  144. package/template/packages/core/package.json +17 -0
  145. package/template/packages/core/src/client-ip.test.ts +19 -0
  146. package/template/packages/core/src/client-ip.ts +11 -0
  147. package/template/packages/core/src/errors.test.ts +20 -0
  148. package/template/packages/core/src/errors.ts +20 -0
  149. package/template/packages/core/src/index.ts +4 -0
  150. package/template/packages/core/src/redirect.test.ts +27 -0
  151. package/template/packages/core/src/redirect.ts +20 -0
  152. package/template/packages/core/src/result.ts +10 -0
  153. package/template/packages/core/tsconfig.json +4 -0
  154. package/template/packages/db/drizzle/0000_initial.sql +10 -0
  155. package/template/packages/db/drizzle/meta/_journal.json +13 -0
  156. package/template/packages/db/drizzle.config.ts +9 -0
  157. package/template/packages/db/package.json +30 -0
  158. package/template/packages/db/scripts/load-env.ts +14 -0
  159. package/template/packages/db/scripts/migrate.ts +11 -0
  160. package/template/packages/db/scripts/seed.ts +14 -0
  161. package/template/packages/db/src/client.ts +22 -0
  162. package/template/packages/db/src/index.ts +4 -0
  163. package/template/packages/db/src/schema/index.ts +1 -0
  164. package/template/packages/db/src/schema/users.ts +14 -0
  165. package/template/packages/db/src/users.ts +16 -0
  166. package/template/packages/db/tsconfig.json +4 -0
  167. package/template/packages/storage/package.json +24 -0
  168. package/template/packages/storage/src/index.ts +1 -0
  169. package/template/packages/storage/src/s3.test.ts +86 -0
  170. package/template/packages/storage/src/s3.ts +86 -0
  171. package/template/packages/storage/src/supabase.ts +69 -0
  172. package/template/packages/storage/src/types.ts +18 -0
  173. package/template/packages/storage/tsconfig.json +4 -0
  174. package/template/packages/ui/components.json +21 -0
  175. package/template/packages/ui/package.json +32 -0
  176. package/template/packages/ui/src/components/badge.tsx +48 -0
  177. package/template/packages/ui/src/components/breadcrumb.tsx +102 -0
  178. package/template/packages/ui/src/components/button.tsx +57 -0
  179. package/template/packages/ui/src/components/card.tsx +87 -0
  180. package/template/packages/ui/src/components/input.tsx +19 -0
  181. package/template/packages/ui/src/components/label.tsx +19 -0
  182. package/template/packages/ui/src/components/separator.tsx +20 -0
  183. package/template/packages/ui/src/components/sheet.tsx +125 -0
  184. package/template/packages/ui/src/components/sidebar.tsx +692 -0
  185. package/template/packages/ui/src/components/skeleton.tsx +13 -0
  186. package/template/packages/ui/src/components/switch.tsx +31 -0
  187. package/template/packages/ui/src/components/table.tsx +88 -0
  188. package/template/packages/ui/src/components/tooltip.tsx +53 -0
  189. package/template/packages/ui/src/hooks/use-mobile.ts +19 -0
  190. package/template/packages/ui/src/lib/utils.ts +1 -0
  191. package/template/packages/ui/src/styles/globals.css +126 -0
  192. package/template/packages/ui/tsconfig.json +19 -0
  193. package/template/playwright.config.ts +23 -0
  194. package/template/pnpm-lock.yaml +4987 -0
  195. package/template/pnpm-workspace.yaml +3 -0
  196. package/template/tsconfig.base.json +16 -0
  197. package/template/turbo.json +17 -0
  198. package/template/vitest.config.ts +10 -0
  199. package/template.lock.json +187 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,25 @@
2
2
 
3
3
  All notable changes to `create-clubedge-app` are documented here.
4
4
 
5
+ ## 0.4.0
6
+
7
+ - Default to Starter `v0.4.0`, which adds the TanStack Start app and template schema 2.
8
+ - Add `--framework next|tanstack-start`, and ask which framework to use when the Starter offers several. Next.js stays the default.
9
+ - Read template schema 2, which describes each framework's app, environment example, and Dockerfile. The selected app is moved to `apps/web`, the others are left out, and `pnpm-lock.yaml` is kept in step so frozen installs work.
10
+ - Record the chosen framework in the generated `package.json` and `README.md`.
11
+ - Test generated projects for both frameworks in CI and in the release smoke test.
12
+
13
+ ## 0.3.0
14
+
15
+ - Default to Starter `v0.3.0`, which adds the `clubedge.template.json` template manifest.
16
+ - Rewrite the CLI in TypeScript, organized into argument parsing, planning, execution, and steps.
17
+ - Bundle the pinned Starter release into the package. The default scaffold no longer downloads from GitHub or requires Git.
18
+ - Read the Starter's `clubedge.template.json` manifest and refuse Starters with a newer template schema.
19
+ - Add `--dry-run`, `--yes`, and `--template-dir`.
20
+ - Remove everything written when scaffolding fails, instead of leaving a partial project.
21
+ - Check the Node.js version before starting, and fall back to `corepack pnpm` when `pnpm` is not on the path.
22
+ - Never copy local environment files, dependencies, or build output from a template directory, even when it sits inside another Git repository.
23
+
5
24
  ## 0.2.1
6
25
 
7
26
  - Publish the default Starter pin in the `clubedge` field of `package.json`. The CLI and release workflow read it from there, and the npm registry exposes it so the website always shows the Starter each CLI version scaffolds.
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [![CI](https://github.com/Clubedge/create-clubedge-app/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/Clubedge/create-clubedge-app/actions/workflows/ci.yml)
4
4
  [![License: Apache-2.0](https://img.shields.io/badge/License-Apache--2.0-blue.svg)](LICENSE)
5
5
 
6
- Create a Next.js application from the [Clubedge Starter](https://github.com/Clubedge/clubedge-starter) reference implementation.
6
+ Create a Next.js or TanStack Start application from the [Clubedge Starter](https://github.com/Clubedge/clubedge-starter) reference implementation.
7
7
 
8
8
  The CLI downloads a tested Starter release, names the generated project, creates `apps/web/.env.local` from the example, initializes Git, and installs dependencies. The Starter remains the source of truth for the generated architecture.
9
9
 
@@ -12,34 +12,34 @@ The CLI downloads a tested Starter release, names the generated project, creates
12
12
  Each CLI release is tested against one specific Starter release:
13
13
 
14
14
  ```text
15
- create-clubedge-app v0.2.1
15
+ create-clubedge-app v0.4.0
16
16
  |
17
17
  v
18
- Clubedge Starter v0.2.0
19
- commit db15901da90d8d8a190d158c895dfe76c172b415
18
+ Clubedge Starter v0.4.0
19
+ commit fc01d33bb1a3944e099a1750679be87a96ff9a22
20
20
  ```
21
21
 
22
22
  The current relationship is:
23
23
 
24
24
  | CLI release | Default Starter release | Meaning |
25
25
  | --- | --- | --- |
26
- | `create-clubedge-app@0.2.1` | `clubedge-starter@v0.2.0` | The CLI's required, tested default |
26
+ | `create-clubedge-app@0.4.0` | `clubedge-starter@v0.4.0` | The CLI's required, tested default |
27
27
 
28
28
  This means the same CLI version always scaffolds the same Starter revision by default. The CLI does not silently follow Starter `main`.
29
29
 
30
- The `v0.2.0` tag is expected to resolve to commit
31
- `db15901da90d8d8a190d158c895dfe76c172b415`. The CLI verifies this before
30
+ The `v0.4.0` tag is expected to resolve to commit
31
+ `fc01d33bb1a3944e099a1750679be87a96ff9a22`. The CLI verifies this before
32
32
  scaffolding with the default reference and fails rather than silently using a
33
33
  moved tag.
34
34
 
35
- When the Starter changes, its maintainers first publish a new versioned release, such as `v0.2.0`. The CLI is then updated to use that release, all generated-project checks must pass, and a new CLI version is published. This keeps Starter and CLI releases independently versioned while preserving a tested compatibility relationship.
35
+ When the Starter changes, its maintainers first publish a new versioned release, such as `v0.4.0`. The CLI is then updated to use that release, all generated-project checks must pass, and a new CLI version is published. This keeps Starter and CLI releases independently versioned while preserving a tested compatibility relationship.
36
36
 
37
37
  ## Requirements
38
38
 
39
39
  - Node.js 22.12 or newer.
40
- - pnpm 10.9.0 or newer (the generated starter uses Corepack and pnpm).
40
+ - pnpm 10.9.0 or newer. The generated project is a pnpm workspace, so dependencies are installed with pnpm even when you start the CLI with `npx`; the CLI falls back to `corepack pnpm` when `pnpm` is not on your path.
41
41
  - Git, when using the default Git initialization.
42
- - Internet access to download the starter from GitHub and install dependencies.
42
+ - Internet access to install dependencies. The default Starter release ships inside the CLI package, so GitHub is only contacted for `--ref`.
43
43
 
44
44
  ## Usage
45
45
 
@@ -68,58 +68,89 @@ When no destination is provided, the CLI asks where to create the project:
68
68
  pnpm dlx @clubedge/create-clubedge-app
69
69
  ```
70
70
 
71
- ## Options
71
+ ### Choosing a framework
72
72
 
73
- ```text
74
- Usage: pnpm dlx @clubedge/create-clubedge-app [project-directory] [options]
73
+ The Starter ships the same application for two React frameworks. Next.js is the default; pick TanStack Start with `--framework`, or choose interactively when the Starter offers more than one:
75
74
 
76
- --ref <ref> Select a starter tag, branch, or commit (default: v0.2.0)
77
- --no-install Skip pnpm install
78
- --no-git Skip Git initialization
79
- -h, --help Show help
80
- -v, --version Show the CLI version
75
+ ```sh
76
+ pnpm dlx @clubedge/create-clubedge-app my-app --framework tanstack-start
81
77
  ```
82
78
 
83
- Examples:
79
+ | `--framework` | App | Production output |
80
+ | ---------------- | --------------------------- | ----------------------------- |
81
+ | `next` | Next.js App Router | Next.js standalone build |
82
+ | `tanstack-start` | TanStack Start with Vite | Nitro `.output` server bundle |
84
83
 
85
- ```sh
86
- pnpm dlx @clubedge/create-clubedge-app my-app --ref <starter-tag-or-commit>
87
- pnpm dlx @clubedge/create-clubedge-app my-app --no-install
88
- ```
84
+ Either way, the app lives in `apps/web` and uses the same shared packages, so the project layout, root scripts, and Docker commands are identical.
89
85
 
90
- The target directory must be empty or not exist. The CLI will not delete or overwrite files in a non-empty target directory. The default is the tested `v0.2.0` Starter release, so the same CLI version produces the same Starter revision. Use `--ref` to explicitly select a tag, branch, or commit.
86
+ ## Options
91
87
 
92
- The default is the tested Starter release tag `v0.2.0`. Every generated project records its CLI version, Starter repository, exact Starter ref, and resolved Starter commit in `package.json` and `README.md`.
88
+ ```text
89
+ Usage: pnpm dlx @clubedge/create-clubedge-app [project-directory] [options]
90
+
91
+ --framework <id> App framework: next (default) or tanstack-start
92
+ --ref <ref> Download this Starter tag, branch, or commit from GitHub instead
93
+ --template-dir <path> Scaffold from a local Starter checkout (for Starter development)
94
+ --dry-run Show what would be created without writing anything
95
+ -y, --yes Accept defaults and never prompt (default directory: my-app)
96
+ --no-install Skip dependency installation
97
+ --no-git Skip Git initialization
98
+ -h, --help Show help
99
+ -v, --version Show the CLI version
100
+ ```
93
101
 
94
- Use `--ref` only when you intentionally want a different Starter revision:
102
+ The target directory must be empty or not exist. The CLI never deletes or overwrites existing files, and if scaffolding fails it removes whatever it wrote, so a failed run leaves nothing behind.
103
+
104
+ Every generated project records its CLI version, Starter repository, Starter ref, Starter commit, and framework in `package.json` and `README.md`.
95
105
 
96
106
  ```sh
97
- # Reproduce the supported default
98
- pnpm dlx @clubedge/create-clubedge-app my-app
107
+ # Preview the files and edits without writing anything
108
+ pnpm dlx @clubedge/create-clubedge-app my-app --dry-run
109
+
110
+ # Non-interactive, for scripts and CI
111
+ pnpm dlx @clubedge/create-clubedge-app my-app --yes --no-git --framework tanstack-start
99
112
 
100
113
  # Try an unreleased Starter change
101
114
  pnpm dlx @clubedge/create-clubedge-app my-app --ref main
102
115
 
103
116
  # Reproduce a specific Starter release or commit
104
- pnpm dlx @clubedge/create-clubedge-app my-app --ref v0.2.0
117
+ pnpm dlx @clubedge/create-clubedge-app my-app --ref v0.4.0
105
118
  pnpm dlx @clubedge/create-clubedge-app my-app --ref <commit-sha>
119
+
120
+ # Test local Starter changes before releasing them
121
+ pnpm dlx @clubedge/create-clubedge-app my-app --template-dir ../clubedge-starter
106
122
  ```
107
123
 
108
124
  ## How it works
109
125
 
110
- This CLI scaffolds the complete reference Starter. It does not yet offer selectable SaaS, dashboard, or minimal feature presets; those should be added once each preset has a distinct, maintained template. This keeps CLI output aligned with the Starter repository instead of creating a second, drifting copy of its source.
126
+ Each CLI release bundles one Starter release. When the release is built, `scripts/bundle-template.mjs` clones the pinned Starter tag, verifies that it resolves to the pinned commit, and copies its tracked files into the package (`template/` and `template.lock.json`). Running the CLI then needs no GitHub access for the default Starter.
127
+
128
+ The Starter describes itself in `clubedge.template.json`: its app directory, site config, environment files, Docker image name, and files that stay out of generated projects. Schema 2 manifests also list each framework's app directory, environment example, and Dockerfile. The CLI moves the selected framework's app to `apps/web` (renaming its package to `@clubedge/web`), moves its environment example and Dockerfile to the project root, leaves the other frameworks out, and removes their entries from `pnpm-lock.yaml` so `pnpm install --frozen-lockfile` keeps working. The CLI refuses a Starter whose manifest schema is newer than it understands and asks you to update. Starters before v0.3.0 have no manifest and use the previous layout.
129
+
130
+ The CLI first builds a plan (the files to copy and the edits to make), which `--dry-run` prints, and then applies it. The source is organized the same way:
131
+
132
+ ```text
133
+ src/
134
+ cli/ argument parsing and terminal output
135
+ core/ manifest, template sources, customizations, planning, and execution
136
+ steps/ Git initialization and dependency installation
137
+ utils/ file listing and copying, processes, and naming
138
+ ```
111
139
 
112
140
  ## Development
113
141
 
114
142
  ```sh
115
143
  corepack enable
116
144
  pnpm install
117
- node ./bin/create.mjs --help
118
- pnpm check
119
- pnpm test
145
+ pnpm check # type-check sources and tests
146
+ pnpm test # unit and scaffolding tests
147
+ pnpm build # compile src/ to dist/
148
+ node ./bin/create.mjs my-app --template-dir ../clubedge-starter --dry-run
120
149
  ```
121
150
 
122
- CI scaffolds a clean project from the pinned Starter release, installs its dependencies, runs linting, typechecking, unit tests, browser checks, and a production build, then starts the generated app and checks the landing page, sign-up page, dashboard, health endpoint, logo, and favicon. A scheduled, non-blocking compatibility job also checks Starter `main`.
151
+ Without a bundled template, a local build downloads the pinned Starter release from GitHub and verifies its commit. Run `pnpm bundle-template` to bundle it, or `pnpm bundle-template --from ../clubedge-starter` to bundle a local checkout.
152
+
153
+ CI packs the CLI with `npm pack`, scaffolds a clean project from the packed tarball, installs its dependencies, runs linting, typechecking, unit tests, browser checks, and a production build, then starts the generated app and checks the landing page, sign-up page, dashboard, health endpoint, logo, and favicon. A scheduled, non-blocking compatibility job also checks Starter `main`.
123
154
 
124
155
  ## Release workflow
125
156
 
@@ -128,11 +159,11 @@ CI scaffolds a clean project from the pinned Starter release, installs its depen
128
159
  1. Make and validate changes in `clubedge-starter`.
129
160
  2. Run lint, typecheck, unit tests, browser tests, and production build.
130
161
  3. Update the Starter package versions.
131
- 4. Commit `main`, create a release tag such as `v0.2.0`, and publish the Starter release.
162
+ 4. Commit `main`, create a release tag such as `v0.4.0`, and publish the Starter release.
132
163
 
133
164
  ### CLI maintainers
134
165
 
135
- 1. Change `defaultStarterRef` in [`bin/create.mjs`](bin/create.mjs) to the new tested Starter tag.
166
+ 1. Set `clubedge.starterRef` and `clubedge.starterCommit` in [`package.json`](package.json) to the new tested Starter tag, and bump `version`.
136
167
  2. Update the version relationship table and changelog.
137
168
  3. Generate a clean project from that exact tag.
138
169
  4. Run install, lint, typecheck, unit tests, browser tests, production build, and runtime smoke checks.