create-cartwright 0.1.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 ADDED
@@ -0,0 +1,59 @@
1
+ # create-cartwright
2
+
3
+ CLI scaffolder for AI-first webshops powered by [Cartwright](https://cartwright.app).
4
+
5
+ ## Quick start
6
+
7
+ ```bash
8
+ npx create-cartwright@latest my-shop
9
+ cd my-shop
10
+ npx prisma migrate deploy
11
+ npx prisma db seed
12
+ pnpm dev
13
+ ```
14
+
15
+ Or with all defaults (no prompts):
16
+
17
+ ```bash
18
+ npx create-cartwright@latest my-shop --yes --db=turso --ai
19
+ ```
20
+
21
+ ## Flags
22
+
23
+ | Flag | Default | What it does |
24
+ |---|---|---|
25
+ | `--yes`, `-y` | false | Skip prompts, use defaults |
26
+ | `--db=<turso\|postgres\|sqlite>` | (prompt) | Database choice — drives next-steps guidance |
27
+ | `--ai` / `--no-ai` | (prompt) | Enable / disable the AI commerce features hint |
28
+ | `--ref=<tag\|branch>` | `v0.1.0-beta` | Template ref on `cartwright-template` mirror |
29
+ | `--pm=<pnpm\|npm\|yarn\|bun>` | auto-detect | Package manager for install |
30
+ | `--no-install` | false | Skip dependency install |
31
+ | `--no-git` | false | Skip `git init` + initial commit |
32
+
33
+ ## What it does
34
+
35
+ 1. Three prompts (project name, database, AI features) — skippable with `--yes`.
36
+ 2. Downloads a sanitised snapshot from [`cartwright-template`](https://github.com/Teloz1870/cartwright-template) at the pinned `--ref` (default `v0.1.0-beta`).
37
+ 3. Generates a random 32-byte `AUTH_SECRET` and writes `.env.local`.
38
+ 4. Patches `brand.config.ts` — `storeName` (Title Case of project name) + `storeSlug` (kebab-case).
39
+ 5. Optional: `git init` + initial commit.
40
+ 6. Optional: install dependencies with the detected (or specified) package manager.
41
+ 7. Prints database-aware next-steps with copy-pastable commands.
42
+
43
+ ## Requirements
44
+
45
+ - Node.js ≥ 22
46
+ - (Optional) git, for the initial commit
47
+ - (Optional) pnpm/npm/yarn/bun, for dependency install
48
+
49
+ ## Why a public mirror?
50
+
51
+ The Cartwright template repo is currently in private early access. The CLI fetches from a **public sanitised mirror** (`cartwright-template`) that auto-syncs on every release tag — so you don't need a GitHub token to scaffold. When the template flips to public, the CLI will point at it directly with no breaking change.
52
+
53
+ ## Source
54
+
55
+ This CLI is part of the [`cartwright-app`](https://github.com/Teloz1870/cartwright-app) monorepo. PRs welcome.
56
+
57
+ ## License
58
+
59
+ MIT
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,254 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * create-cartwright — scaffolder for AI-first webshops.
4
+ *
5
+ * Usage:
6
+ * npx create-cartwright@latest [name] [--yes]
7
+ * [--db=turso|postgres|sqlite] [--ai|--no-ai]
8
+ * [--ref=<tag-or-branch>]
9
+ * [--pm=pnpm|npm|yarn|bun]
10
+ * [--no-install] [--no-git]
11
+ *
12
+ * Pulls a sanitised snapshot of cartwright-template via giget, generates a
13
+ * fresh AUTH_SECRET, injects the project name into brand.config.ts, and
14
+ * optionally installs deps + inits git.
15
+ */
16
+ import { intro, outro, text, select, confirm, cancel, isCancel, spinner, note, } from "@clack/prompts";
17
+ import { downloadTemplate } from "giget";
18
+ import pc from "picocolors";
19
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
20
+ import { join, resolve } from "node:path";
21
+ import { execSync } from "node:child_process";
22
+ import { randomBytes } from "node:crypto";
23
+ import { parseArgs } from "node:util";
24
+ const TEMPLATE_REPO = "github:Teloz1870/cartwright-template";
25
+ const DEFAULT_REF = "v0.1.0-beta";
26
+ function detectPackageManager() {
27
+ const ua = process.env.npm_config_user_agent ?? "";
28
+ if (ua.startsWith("pnpm"))
29
+ return "pnpm";
30
+ if (ua.startsWith("yarn"))
31
+ return "yarn";
32
+ if (ua.startsWith("bun"))
33
+ return "bun";
34
+ return "npm";
35
+ }
36
+ function exitOnCancel(value) {
37
+ if (isCancel(value)) {
38
+ cancel("Cancelled.");
39
+ process.exit(0);
40
+ }
41
+ return value;
42
+ }
43
+ function generateAuthSecret() {
44
+ return randomBytes(32).toString("hex");
45
+ }
46
+ function patchEnvLocal(targetDir, authSecret) {
47
+ const envExamplePath = join(targetDir, ".env.example");
48
+ if (!existsSync(envExamplePath))
49
+ return;
50
+ const example = readFileSync(envExamplePath, "utf8");
51
+ const patched = example.replace(/^AUTH_SECRET=.*/m, `AUTH_SECRET="${authSecret}"`);
52
+ writeFileSync(join(targetDir, ".env.local"), patched);
53
+ }
54
+ function patchBrandConfig(targetDir, projectName) {
55
+ const path = join(targetDir, "brand.config.ts");
56
+ if (!existsSync(path))
57
+ return;
58
+ const original = readFileSync(path, "utf8");
59
+ const titled = projectName
60
+ .split("-")
61
+ .map((s) => s.charAt(0).toUpperCase() + s.slice(1))
62
+ .join(" ");
63
+ // Replace the first storeName + storeSlug occurrences in the brand object.
64
+ const patched = original
65
+ .replace(/storeName:\s*"[^"]*"/, `storeName: "${titled}"`)
66
+ .replace(/storeSlug:\s*"[^"]*"/, `storeSlug: "${projectName}"`);
67
+ if (patched !== original)
68
+ writeFileSync(path, patched);
69
+ }
70
+ function tryGitInit(targetDir) {
71
+ try {
72
+ execSync("git init -q && git add -A && git commit -q -m 'feat: initial commit from create-cartwright'", { cwd: targetDir, stdio: "ignore" });
73
+ return true;
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ }
79
+ function tryInstall(targetDir, pm) {
80
+ try {
81
+ execSync(`${pm} install`, { cwd: targetDir, stdio: "ignore" });
82
+ return true;
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ function databaseNote(db) {
89
+ switch (db) {
90
+ case "turso":
91
+ return [
92
+ pc.bold("Turso setup (production):"),
93
+ " turso db create my-shop-db",
94
+ " turso db tokens create my-shop-db",
95
+ pc.dim(" Set TURSO_DATABASE_URL + TURSO_AUTH_TOKEN in Vercel."),
96
+ ].join("\n");
97
+ case "postgres":
98
+ return [
99
+ pc.bold("Postgres setup:"),
100
+ " Update DATABASE_URL in .env.local to your Postgres URL.",
101
+ pc.dim(" Prisma schema currently uses 'sqlite' provider — switch to 'postgresql' in prisma/schema.prisma and run a fresh migration."),
102
+ ].join("\n");
103
+ case "sqlite":
104
+ return [
105
+ pc.bold("SQLite (local only):"),
106
+ " No extra setup. dev.db will be created on first migration.",
107
+ ].join("\n");
108
+ }
109
+ }
110
+ async function run() {
111
+ const { values, positionals } = parseArgs({
112
+ allowPositionals: true,
113
+ options: {
114
+ yes: { type: "boolean", short: "y" },
115
+ db: { type: "string" },
116
+ ai: { type: "boolean" },
117
+ "no-ai": { type: "boolean" },
118
+ ref: { type: "string" },
119
+ pm: { type: "string" },
120
+ "no-install": { type: "boolean" },
121
+ "no-git": { type: "boolean" },
122
+ },
123
+ });
124
+ intro(`${pc.bgYellow(pc.black(" create-cartwright "))} ${pc.dim("v0.1.0-beta")}`);
125
+ // ── Project name ────────────────────────────────────────────────────────
126
+ const defaultName = positionals[0] ?? "my-cartwright-shop";
127
+ const projectName = values.yes
128
+ ? defaultName
129
+ : exitOnCancel(await text({
130
+ message: "Project name?",
131
+ initialValue: defaultName,
132
+ validate: (v) => /^[a-z][a-z0-9-]*$/.test(v)
133
+ ? undefined
134
+ : "Use lowercase letters, digits and dashes; start with a letter.",
135
+ }));
136
+ // ── Database ────────────────────────────────────────────────────────────
137
+ const dbFromFlag = values.db;
138
+ const database = dbFromFlag ??
139
+ (values.yes
140
+ ? "turso"
141
+ : exitOnCancel(await select({
142
+ message: "Database?",
143
+ options: [
144
+ {
145
+ value: "turso",
146
+ label: "Turso (recommended — libSQL on edge)",
147
+ },
148
+ {
149
+ value: "postgres",
150
+ label: "Postgres (Neon / Supabase / self-hosted)",
151
+ },
152
+ { value: "sqlite", label: "SQLite (local-only)" },
153
+ ],
154
+ initialValue: "turso",
155
+ })));
156
+ if (!["turso", "postgres", "sqlite"].includes(database)) {
157
+ cancel(`Unknown database "${database}". Use turso, postgres, or sqlite.`);
158
+ process.exit(1);
159
+ }
160
+ // ── AI features ─────────────────────────────────────────────────────────
161
+ const aiFlag = values.ai === true ? true : values["no-ai"] === true ? false : undefined;
162
+ const withAi = aiFlag ??
163
+ (values.yes
164
+ ? true
165
+ : exitOnCancel(await confirm({
166
+ message: "Include AI commerce features? (requires Anthropic + Gemini API keys)",
167
+ initialValue: true,
168
+ })));
169
+ // ── Tooling defaults ────────────────────────────────────────────────────
170
+ const detected = detectPackageManager();
171
+ const packageManager = values.pm ?? detected;
172
+ const installDeps = !values["no-install"];
173
+ const initGit = !values["no-git"];
174
+ const templateRef = values.ref ?? DEFAULT_REF;
175
+ // ── Pre-flight ──────────────────────────────────────────────────────────
176
+ const targetDir = resolve(process.cwd(), projectName);
177
+ if (existsSync(targetDir)) {
178
+ cancel(`Directory "${projectName}" already exists.`);
179
+ process.exit(1);
180
+ }
181
+ // ── Template fetch ──────────────────────────────────────────────────────
182
+ const fetchSpinner = spinner();
183
+ fetchSpinner.start(`Fetching cartwright template (${templateRef})…`);
184
+ try {
185
+ await downloadTemplate(`${TEMPLATE_REPO}#${templateRef}`, {
186
+ dir: targetDir,
187
+ force: false,
188
+ });
189
+ fetchSpinner.stop(pc.green(`Template downloaded (${templateRef}).`));
190
+ }
191
+ catch (err) {
192
+ fetchSpinner.stop(pc.red("Template fetch failed."));
193
+ console.error(err);
194
+ process.exit(1);
195
+ }
196
+ // ── Customise the scaffold ──────────────────────────────────────────────
197
+ const authSecret = generateAuthSecret();
198
+ patchEnvLocal(targetDir, authSecret);
199
+ patchBrandConfig(targetDir, projectName);
200
+ // ── Git init ────────────────────────────────────────────────────────────
201
+ if (initGit) {
202
+ const gitOk = tryGitInit(targetDir);
203
+ if (!gitOk) {
204
+ note(pc.yellow("git init skipped — git not available."), "info");
205
+ }
206
+ }
207
+ // ── Install ─────────────────────────────────────────────────────────────
208
+ if (installDeps) {
209
+ const installSpinner = spinner();
210
+ installSpinner.start(`Installing dependencies with ${packageManager}…`);
211
+ const ok = tryInstall(targetDir, packageManager);
212
+ if (ok) {
213
+ installSpinner.stop(pc.green("Dependencies installed."));
214
+ }
215
+ else {
216
+ installSpinner.stop(pc.yellow(`Install failed — run \`${packageManager} install\` in ${projectName} manually.`));
217
+ }
218
+ }
219
+ // ── Next steps ──────────────────────────────────────────────────────────
220
+ const runCmd = packageManager === "npm" ? "npm run" : packageManager;
221
+ const aiHint = withAi
222
+ ? `\n ${pc.dim("Add ANTHROPIC_API_KEY (+ optional GEMINI keys) to .env.local before pnpm dev,")}\n ${pc.dim("or configure them later in /admin/integrations after first sign-in.")}`
223
+ : "";
224
+ const lines = [
225
+ pc.green("✓") +
226
+ ` Created ${pc.bold(projectName)} at ${pc.dim(targetDir)}`,
227
+ pc.green("✓") + ` AUTH_SECRET generated and written to .env.local`,
228
+ pc.green("✓") + ` brand.config.ts patched (storeName + storeSlug)`,
229
+ "",
230
+ pc.bold("Next steps:"),
231
+ ` cd ${projectName}`,
232
+ ` npx prisma migrate deploy ${pc.dim("# create / sync the DB schema")}`,
233
+ ` npx prisma db seed ${pc.dim("# seed demo products + categories")}`,
234
+ ` ${runCmd} dev ${pc.dim("# http://localhost:3000")}`,
235
+ "",
236
+ databaseNote(database),
237
+ aiHint,
238
+ "",
239
+ pc.bold("Going to production?"),
240
+ pc.dim(" Deploy, custom domain, and email — the Go Live guide has the path:"),
241
+ pc.dim(" https://cartwright.app/docs/deployment/go-live"),
242
+ "",
243
+ pc.dim("Docs: https://cartwright.app/docs/getting-started/quick-start"),
244
+ pc.dim("Mirror: https://github.com/Teloz1870/cartwright-template"),
245
+ ]
246
+ .filter(Boolean)
247
+ .join("\n");
248
+ outro(lines);
249
+ }
250
+ run().catch((err) => {
251
+ console.error(pc.red("Unexpected error:"), err);
252
+ process.exit(1);
253
+ });
254
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "create-cartwright",
3
+ "version": "0.1.0",
4
+ "description": "Scaffolder for AI-first webshops powered by Cartwright",
5
+ "keywords": [
6
+ "cartwright",
7
+ "nextjs",
8
+ "scaffolder",
9
+ "starter",
10
+ "template",
11
+ "ecommerce",
12
+ "ai",
13
+ "mcp",
14
+ "stripe"
15
+ ],
16
+ "type": "module",
17
+ "bin": {
18
+ "create-cartwright": "dist/index.js"
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "README.md"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc",
26
+ "dev": "tsx src/index.ts",
27
+ "typecheck": "tsc --noEmit",
28
+ "lint": "eslint src --max-warnings=0",
29
+ "test": "echo 'TODO: vitest'",
30
+ "prepublishOnly": "pnpm build"
31
+ },
32
+ "dependencies": {
33
+ "@clack/prompts": "^0.11.0",
34
+ "giget": "^1.2.5",
35
+ "picocolors": "^1.1.0",
36
+ "zod": "^4.4.3"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^22.10.0",
40
+ "eslint": "^9.0.0",
41
+ "tsx": "^4.19.0",
42
+ "typescript": "^5.7.0"
43
+ },
44
+ "engines": {
45
+ "node": ">=22"
46
+ },
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "license": "MIT",
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "git+https://github.com/Teloz1870/cartwright-app.git",
54
+ "directory": "apps/cli"
55
+ },
56
+ "homepage": "https://cartwright.app",
57
+ "bugs": "https://github.com/Teloz1870/cartwright-app/issues"
58
+ }