create-clientkit 0.1.0 → 1.0.1
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
|
@@ -15,10 +15,8 @@ it lands on disk.
|
|
|
15
15
|
npm create clientkit@latest acme-website
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
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.
|
|
18
|
+
[](https://www.npmjs.com/package/create-clientkit)
|
|
19
|
+
[](https://github.com/JosuK22/create-clientkit/actions/workflows/ci.yml)
|
|
22
20
|
|
|
23
21
|
---
|
|
24
22
|
|
|
@@ -41,11 +39,12 @@ and warns before generating that the project itself will need 22.12+.
|
|
|
41
39
|
| Windows | yes | yes | Node 20.19, 22, 24 (site: 22) |
|
|
42
40
|
| macOS | yes | yes | Node 20.19, 22, 24 (site: 22) |
|
|
43
41
|
|
|
44
|
-
> **Verification status.**
|
|
45
|
-
>
|
|
46
|
-
>
|
|
47
|
-
>
|
|
48
|
-
>
|
|
42
|
+
> **Verification status.** Every row above is observed, not intended: the CI
|
|
43
|
+
> workflow runs on GitHub-hosted runners for all three platforms on each push.
|
|
44
|
+
> One exception is called out honestly — Ctrl+C cancellation cannot be tested
|
|
45
|
+
> on Windows, which has neither pty allocation nor POSIX signal delivery to a
|
|
46
|
+
> child process, so `scripts/cancel-check.mjs` prints the manual procedure
|
|
47
|
+
> there instead of asserting anything.
|
|
49
48
|
|
|
50
49
|
## Usage
|
|
51
50
|
|
|
@@ -166,12 +165,18 @@ on after launch keeps the real site invisible.
|
|
|
166
165
|
|
|
167
166
|
1. Set `SITE.url` in `src/config/site.config.ts` — canonical URLs and the
|
|
168
167
|
sitemap depend on it.
|
|
169
|
-
2.
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
168
|
+
2. Rewrite `SITE.description`. It is generated as `Official website of <Name>.`
|
|
169
|
+
— deliberately generic, because the CLI will not invent claims about a
|
|
170
|
+
business it knows nothing about. It is a placeholder, and it becomes the
|
|
171
|
+
meta description, `og:description` and the X card description. Aim for
|
|
172
|
+
roughly 120–160 characters of real copy.
|
|
173
|
+
3. Replace `public/favicon.svg` with the client's mark.
|
|
174
|
+
4. Add a 1200×630 image to `public/` and set `SEO.image` if you want social
|
|
175
|
+
previews. No `og:image` is emitted until you do, and the X card stays
|
|
176
|
+
`summary` rather than rendering an empty `summary_large_image`.
|
|
177
|
+
5. Fill in `CONTACT` and `SOCIAL` — anything left empty is not rendered, and
|
|
173
178
|
not claimed in the structured data.
|
|
174
|
-
|
|
179
|
+
6. `npm run check && npm run build`, then deploy `dist/` as a static site.
|
|
175
180
|
|
|
176
181
|
Only the origin of `SITE.url` is used. To deploy under a subpath, also set
|
|
177
182
|
`base` in `astro.config.mjs`.
|
|
@@ -222,6 +227,13 @@ The CLI publishes with `dependencies: {}` — its dependencies are bundled into
|
|
|
222
227
|
resolution. See [THIRD-PARTY.md](./THIRD-PARTY.md) and
|
|
223
228
|
[RELEASING.md](./RELEASING.md).
|
|
224
229
|
|
|
230
|
+
## Contributing
|
|
231
|
+
|
|
232
|
+
Bug reports and ideas are welcome — see [CONTRIBUTING.md](./CONTRIBUTING.md).
|
|
233
|
+
The quickest useful report is an
|
|
234
|
+
[issue from a template](https://github.com/JosuK22/create-clientkit/issues/new/choose),
|
|
235
|
+
since they ask for the versions and the exact command up front.
|
|
236
|
+
|
|
225
237
|
## Licence
|
|
226
238
|
|
|
227
239
|
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 ? "0.1
|
|
2480
|
+
var CLI_VERSION = true ? "1.0.1" : "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": "0.1
|
|
3
|
+
"version": "1.0.1",
|
|
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",
|
|
@@ -64,6 +64,12 @@ what it needs to override:
|
|
|
64
64
|
**Everything derives from `SITE`.** You never repeat the site name,
|
|
65
65
|
description or URL.
|
|
66
66
|
|
|
67
|
+
### Set the URL before the final build
|
|
68
|
+
|
|
69
|
+
`SITE.url` is read at **build time**, so canonical tags, `og:url` and the
|
|
70
|
+
sitemap are baked into the output. Moving a built site to a different domain
|
|
71
|
+
leaves them pointing at the old one - rebuild after changing it.
|
|
72
|
+
|
|
67
73
|
### Before you have a domain
|
|
68
74
|
|
|
69
75
|
`SITE.url` starts empty and that is a supported state, not a broken one. While
|
|
@@ -72,6 +78,20 @@ sitemap and the sitemap line in `robots.txt` - rather than pointing them at a
|
|
|
72
78
|
domain nobody owns yet. Fill `SITE.url` in and they all appear. Only the
|
|
73
79
|
origin is used; a subpath deployment also needs Astro's `base` option.
|
|
74
80
|
|
|
81
|
+
### Social previews and the description
|
|
82
|
+
|
|
83
|
+
`SITE.description` arrives as `Official website of {{siteName}}.` That is a
|
|
84
|
+
placeholder, not a suggestion. It was generated without knowing anything about
|
|
85
|
+
the business, and it becomes the meta description, `og:description` and the X
|
|
86
|
+
card description - so it is worth replacing with real copy, roughly 120-160
|
|
87
|
+
characters, before launch.
|
|
88
|
+
|
|
89
|
+
`SEO.image` starts empty and no `og:image` is emitted while it is. The X card
|
|
90
|
+
stays `summary` in that state rather than claiming `summary_large_image` with
|
|
91
|
+
no image to show, which renders as an empty card. Drop a 1200x630 image into
|
|
92
|
+
`public/`, point `SEO.image` at it, and the card switches to the large format
|
|
93
|
+
on its own.
|
|
94
|
+
|
|
75
95
|
### Indexing
|
|
76
96
|
|
|
77
97
|
`SEO.noindex` controls it, and it is `false` by default so a launched site is
|
|
@@ -4,7 +4,12 @@ import { CONTACT, SITE, SOCIAL } from '../config/site.config.ts';
|
|
|
4
4
|
|
|
5
5
|
// Computed at build time rather than frozen in at scaffold time, so the notice
|
|
6
6
|
// stays correct for as long as the site is rebuilt.
|
|
7
|
-
|
|
7
|
+
//
|
|
8
|
+
// Built as one string rather than as adjacent `{year} {SITE.name}` expressions
|
|
9
|
+
// in the markup: a formatter may put those on separate lines, and Astro drops
|
|
10
|
+
// the newline between two adjacent expressions, which silently renders
|
|
11
|
+
// "2026Acme Studio" with no space.
|
|
12
|
+
const copyright = `© ${new Date().getFullYear()} ${SITE.name}`;
|
|
8
13
|
|
|
9
14
|
const hasSocial = SOCIAL.some((link) => link.label !== '' && link.href !== '');
|
|
10
15
|
const hasContact = CONTACT.email !== '' || CONTACT.phone !== '';
|
|
@@ -12,10 +17,7 @@ const hasContact = CONTACT.email !== '' || CONTACT.phone !== '';
|
|
|
12
17
|
|
|
13
18
|
<footer class="site-footer">
|
|
14
19
|
<div class="container-page inner">
|
|
15
|
-
<p class="copyright">
|
|
16
|
-
© {year}
|
|
17
|
-
{SITE.name}
|
|
18
|
-
</p>
|
|
20
|
+
<p class="copyright">{copyright}</p>
|
|
19
21
|
|
|
20
22
|
{
|
|
21
23
|
(hasContact || hasSocial) && (
|