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
|
+
[](https://www.npmjs.com/package/create-clientkit)
|
|
4
|
+
[](https://github.com/JosuK22/create-clientkit/actions/workflows/ci.yml)
|
|
5
|
+
[](https://nodejs.org)
|
|
6
|
+
[](./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
|
|
8
|
-
structured data, favicon, accessibility baseline
|
|
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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
21
|
-
|
|
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.**
|
|
45
|
-
>
|
|
46
|
-
>
|
|
47
|
-
>
|
|
48
|
-
>
|
|
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
|
-
|
|
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.
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
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.
|
|
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.
|
|
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": "
|
|
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
|
-
{
|
|
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>
|