create-clientkit 1.0.0 → 1.0.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
@@ -1,24 +1,37 @@
1
1
  # create-clientkit
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/create-clientkit)](https://www.npmjs.com/package/create-clientkit)
4
+ [![CI](https://github.com/JosuK22/create-clientkit/actions/workflows/ci.yml/badge.svg)](https://github.com/JosuK22/create-clientkit/actions/workflows/ci.yml)
5
+ [![node](https://img.shields.io/node/v/create-clientkit)](https://nodejs.org)
6
+ [![licence](https://img.shields.io/npm/l/create-clientkit)](./LICENSE)
7
+
3
8
  **Create the boring foundation of your next client website in seconds.**
4
9
 
10
+ ```sh
11
+ npm create clientkit@latest acme-website
12
+ ```
13
+
5
14
  A scaffolding CLI for developers who build client websites over and over:
6
15
  freelancers, agencies and frontend teams. It generates the foundation you
7
- rebuild every time — layout, Coming Soon page, 404, SEO, robots, sitemap,
8
- structured data, favicon, accessibility baseline, build config — and then gets
9
- out of the way.
16
+ rebuild every time — layout, a Coming Soon page, a custom 404, SEO metadata,
17
+ `robots.txt`, a sitemap, structured data, a favicon, an accessibility baseline
18
+ and build config — and then gets out of the way.
10
19
 
11
20
  It is **not** a website builder. You own the generated source from the moment
12
21
  it lands on disk.
13
22
 
14
- ```sh
15
- npm create clientkit@latest acme-website
16
- ```
17
-
18
- ---
23
+ **What it generates** — a static [Astro](https://astro.build) 7 +
24
+ [Tailwind CSS](https://tailwindcss.com) 4 site in TypeScript: responsive, light
25
+ and dark themes, and no client-side JavaScript by default. Start in
26
+ **Coming Soon** mode for a launch page, **Full** for a small multi-section home
27
+ page, or **URL-less** when the domain is not decided yet.
19
28
 
20
- > **Status: pre-release (0.1.0).** Feature-complete for V1 and verified in CI
21
- > across Windows, macOS and Linux, but not yet published to npm.
29
+ **What it is** one bundled CLI with **zero runtime dependencies**, MIT
30
+ licensed, published from CI with
31
+ [provenance](https://docs.npmjs.com/generating-provenance-statements) and
32
+ tested on Linux, Windows and macOS across Node 20.19, 22 and 24. The site it
33
+ generates has its own dependencies — Astro and Tailwind, pinned exactly — which
34
+ is a separate thing from the CLI's own dependency count.
22
35
 
23
36
  ---
24
37
 
@@ -41,19 +54,33 @@ and warns before generating that the project itself will need 22.12+.
41
54
  | Windows | yes | yes | Node 20.19, 22, 24 (site: 22) |
42
55
  | macOS | yes | yes | Node 20.19, 22, 24 (site: 22) |
43
56
 
44
- > **Verification status.** Windows is verified directly the full test suite,
45
- > clean-room packaging and generated-project builds are run there. The Linux
46
- > and macOS rows describe what `.github/workflows/ci.yml` covers; that
47
- > workflow has not yet executed on GitHub-hosted runners, so treat those rows
48
- > as intended coverage rather than observed results until the first CI run.
57
+ > **Verification status.** Every row above is observed, not intended: the CI
58
+ > workflow runs on GitHub-hosted runners for all three platforms on each push.
59
+ > One exception is called out honestly Ctrl+C cancellation cannot be tested
60
+ > on Windows, which has neither pty allocation nor POSIX signal delivery to a
61
+ > child process, so `scripts/cancel-check.mjs` prints the manual procedure
62
+ > there instead of asserting anything.
49
63
 
50
64
  ## Usage
51
65
 
66
+ Recommended — nothing to install first, and `@latest` sidesteps npm's
67
+ initializer cache:
68
+
52
69
  ```sh
53
70
  npm create clientkit@latest [directory] [options]
71
+ ```
72
+
73
+ The same binary is reachable through `npx`, if that suits your workflow better.
74
+ It does the same thing:
75
+
76
+ ```sh
54
77
  npx create-clientkit@latest [directory] [options]
55
78
  ```
56
79
 
80
+ Note that this is about how you _invoke_ the CLI. Which package manager installs
81
+ the generated project's dependencies is a separate choice — detected from your
82
+ environment, or forced with `--pm`.
83
+
57
84
  | Flag | Description |
58
85
  | --------------------- | ----------------------------------------- |
59
86
  | `-t, --template <id>` | Template to scaffold from |
@@ -116,11 +143,27 @@ One template ships in V1:
116
143
  | ---------------- | --------------------------------------- | --------------------- |
117
144
  | `astro-tailwind` | Astro 7, Tailwind CSS 4, TypeScript 5.9 | `coming-soon`, `full` |
118
145
 
119
- - **`coming-soon`** — a single polished launch page you can put live today.
120
- - **`full`** a small home page with sections, on the same design system.
146
+ - **`coming-soon`** — a single polished launch page you can put live today,
147
+ with an optional launch date and a progressive-enhancement countdown.
148
+ - **`full`** — a small multi-section home page, on the same design system.
121
149
 
122
150
  Both include the custom 404, the design system and the full SEO layer.
123
151
 
152
+ ### URL-less
153
+
154
+ Not a third mode — a state either mode starts in, and a supported one. When you
155
+ have not decided on a domain, leave the production URL unset and the generated
156
+ site **omits** every absolute tag rather than pointing it at a guess: no
157
+ canonical, no `og:url`, no sitemap, and no `Sitemap:` line in `robots.txt`.
158
+
159
+ ```sh
160
+ npm create clientkit@latest acme-website --yes # no --url: URL-less
161
+ ```
162
+
163
+ Set `SITE.url` in `src/config/site.config.ts` whenever the domain is known and
164
+ all of it appears on the next build. Nothing needs regenerating, and no
165
+ placeholder domain was ever written to disk.
166
+
124
167
  ## The generated project
125
168
 
126
169
  ```sh
@@ -166,12 +209,18 @@ on after launch keeps the real site invisible.
166
209
 
167
210
  1. Set `SITE.url` in `src/config/site.config.ts` — canonical URLs and the
168
211
  sitemap depend on it.
169
- 2. Replace `public/favicon.svg` with the client's mark.
170
- 3. Add a 1200×630 image to `public/` and set `SEO.image` if you want social
171
- previews. No `og:image` is emitted until you do.
172
- 4. Fill in `CONTACT` and `SOCIAL` anything left empty is not rendered, and
212
+ 2. Rewrite `SITE.description`. It is generated as `Official website of <Name>.`
213
+ deliberately generic, because the CLI will not invent claims about a
214
+ business it knows nothing about. It is a placeholder, and it becomes the
215
+ meta description, `og:description` and the X card description. Aim for
216
+ roughly 120–160 characters of real copy.
217
+ 3. Replace `public/favicon.svg` with the client's mark.
218
+ 4. Add a 1200×630 image to `public/` and set `SEO.image` if you want social
219
+ previews. No `og:image` is emitted until you do, and the X card stays
220
+ `summary` rather than rendering an empty `summary_large_image`.
221
+ 5. Fill in `CONTACT` and `SOCIAL` — anything left empty is not rendered, and
173
222
  not claimed in the structured data.
174
- 5. `npm run check && npm run build`, then deploy `dist/` as a static site.
223
+ 6. `npm run check && npm run build`, then deploy `dist/` as a static site.
175
224
 
176
225
  Only the origin of `SITE.url` is used. To deploy under a subpath, also set
177
226
  `base` in `astro.config.mjs`.
@@ -222,6 +271,13 @@ The CLI publishes with `dependencies: {}` — its dependencies are bundled into
222
271
  resolution. See [THIRD-PARTY.md](./THIRD-PARTY.md) and
223
272
  [RELEASING.md](./RELEASING.md).
224
273
 
274
+ ## Contributing
275
+
276
+ Bug reports and ideas are welcome — see [CONTRIBUTING.md](./CONTRIBUTING.md).
277
+ The quickest useful report is an
278
+ [issue from a template](https://github.com/JosuK22/create-clientkit/issues/new/choose),
279
+ since they ask for the versions and the exact command up front.
280
+
225
281
  ## Licence
226
282
 
227
283
  MIT — see [LICENSE](./LICENSE). Generated client projects are **not** MIT; they
package/dist/cli.js CHANGED
@@ -2418,9 +2418,12 @@ function helpText() {
2418
2418
  npm create clientkit@latest acme-website --yes --no-install
2419
2419
  npm create clientkit@latest --from ./agency-preset.json --dry-run
2420
2420
 
2421
- Note
2422
- Early build: configuration is resolved and validated, but no files are
2423
- generated yet.
2421
+ Notes
2422
+ Dependencies are installed and a git repository is initialised by default.
2423
+ Pass --no-install or --no-git to skip either.
2424
+
2425
+ The generated project is yours - private, unlicensed and dependency-pinned.
2426
+ Nothing phones home and nothing is downloaded beyond your own install.
2424
2427
  `.trimStart();
2425
2428
  }
2426
2429
 
@@ -2474,7 +2477,7 @@ var Logger = class {
2474
2477
  };
2475
2478
 
2476
2479
  // src/version.ts
2477
- var CLI_VERSION = true ? "1.0.0" : "0.0.0-dev";
2480
+ var CLI_VERSION = true ? "1.0.2" : "0.0.0-dev";
2478
2481
 
2479
2482
  // src/cli.ts
2480
2483
  async function main(argv, options = {}) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-clientkit",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Create the boring foundation of your next client website in seconds.",
5
5
  "keywords": [
6
6
  "cli",
@@ -51,10 +51,11 @@
51
51
  "audit": "node scripts/audit-site.mjs",
52
52
  "preflight": "node scripts/preflight.mjs",
53
53
  "verify": "npm run typecheck && npm run lint && npm run format:check && npm run test && npm run build",
54
- "prepublishOnly": "npm run preflight",
54
+ "prepublishOnly": "node scripts/preflight.mjs --skip-if-verified",
55
55
  "cancel-check": "node scripts/cancel-check.mjs",
56
56
  "drift": "node scripts/drift-probe.mjs",
57
- "drift:report": "node scripts/drift-probe.mjs --report"
57
+ "drift:report": "node scripts/drift-probe.mjs --report",
58
+ "drift:selftest": "node scripts/drift-probe.mjs --simulate-drift tailwindcss@4.3.2"
58
59
  },
59
60
  "devDependencies": {
60
61
  "@clack/prompts": "^0.11.0",
@@ -24,7 +24,8 @@ npm run dev
24
24
  1. **`src/config/site.config.ts`** - the single source of truth, and the only
25
25
  file you need for most client changes:
26
26
  - `SITE` - name, description, production URL, locale, author
27
- - `NAV` - header links (empty means no menu is rendered at all)
27
+ - `NAV` - header links (empty means no menu is rendered at all; in
28
+ coming-soon mode the home page has no header, so they show on the 404 only)
28
29
  - `SOCIAL` - social profiles (empty means no links are rendered)
29
30
  - `CONTACT` - email, phone, location; each is optional
30
31
  - `LAUNCH` - optional launch date and countdown
@@ -78,6 +79,20 @@ sitemap and the sitemap line in `robots.txt` - rather than pointing them at a
78
79
  domain nobody owns yet. Fill `SITE.url` in and they all appear. Only the
79
80
  origin is used; a subpath deployment also needs Astro's `base` option.
80
81
 
82
+ ### Social previews and the description
83
+
84
+ `SITE.description` arrives as `Official website of {{siteName}}.` That is a
85
+ placeholder, not a suggestion. It was generated without knowing anything about
86
+ the business, and it becomes the meta description, `og:description` and the X
87
+ card description - so it is worth replacing with real copy, roughly 120-160
88
+ characters, before launch.
89
+
90
+ `SEO.image` starts empty and no `og:image` is emitted while it is. The X card
91
+ stays `summary` in that state rather than claiming `summary_large_image` with
92
+ no image to show, which renders as an empty card. Drop a 1200x630 image into
93
+ `public/`, point `SEO.image` at it, and the card switches to the large format
94
+ on its own.
95
+
81
96
  ### Indexing
82
97
 
83
98
  `SEO.noindex` controls it, and it is `false` by default so a launched site is
@@ -106,6 +106,12 @@ export const SITE: SiteIdentity = {
106
106
  /**
107
107
  * Site navigation. Empty by default: the header renders no menu at all rather
108
108
  * than inventing links. Add items once real pages or sections exist.
109
+ *
110
+ * NAV drives the header, so it shows up only on pages that render one. In
111
+ * coming-soon mode the home page deliberately has no header - it carries its
112
+ * own brand lockup instead - so there these links appear on the 404 page only.
113
+ * Delete `showHeader={false}` from src/pages/index.astro if you want a header
114
+ * and menu on the launch page too.
109
115
  */
110
116
  export const NAV: NavItem[] = [];
111
117
 
@@ -10,7 +10,17 @@ const hasSocial = SOCIAL.some((link) => link.label !== '' && link.href !== '');
10
10
  const hasLaunch = LAUNCH.enabled && LAUNCH.date !== '';
11
11
  ---
12
12
 
13
- {/* The page carries its own brand lockup, so a header would only repeat it. */}
13
+ {
14
+ /*
15
+ No header here: the page carries its own brand lockup below, and repeating it
16
+ in a bar would say the same thing twice on one screen. A launch page also has
17
+ nowhere to navigate to yet.
18
+
19
+ This is why NAV in src/config/site.config.ts does not show on this page - it
20
+ drives the header, and there is no header. It still applies to the 404 page.
21
+ Delete showHeader={false} if you want a header and menu here too.
22
+ */
23
+ }
14
24
  <BaseLayout showHeader={false} measure="narrow">
15
25
  <div class="hero">
16
26
  <div class="glow" aria-hidden="true"></div>