ai-forge-cli 0.1.3 → 0.2.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/dist/index.js CHANGED
@@ -19,7 +19,7 @@ var main = defineCommand({
19
19
  }
20
20
  },
21
21
  subCommands: {
22
- init: () => import("./init-VYOLCRGL.js").then((m) => m.default),
22
+ init: () => import("./init-WLRXSMFM.js").then((m) => m.default),
23
23
  "add:feature": () => import("./add-feature-YXWSRIVE.js").then((m) => m.default),
24
24
  check: () => import("./check-RCJRXIU5.js").then((m) => m.default),
25
25
  version: () => import("./version-VO3LHLDO.js").then((m) => m.default)
@@ -0,0 +1,207 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ kebabCase,
4
+ renderTemplate
5
+ } from "./chunk-PIFX2L5H.js";
6
+ import {
7
+ ensureDir,
8
+ fileExists,
9
+ logger,
10
+ readFile,
11
+ writeFile
12
+ } from "./chunk-J4V5PGVT.js";
13
+
14
+ // src/commands/init.ts
15
+ import { defineCommand } from "citty";
16
+ import { spawn } from "child_process";
17
+ import { join } from "path";
18
+ import pc from "picocolors";
19
+ function runInteractive(cmd, args, cwd) {
20
+ return new Promise((resolve, reject) => {
21
+ const proc = spawn(cmd, args, {
22
+ stdio: "inherit",
23
+ shell: true,
24
+ cwd
25
+ });
26
+ proc.on("close", (code) => {
27
+ if (code === 0) {
28
+ resolve(code);
29
+ } else {
30
+ reject(new Error(`Command failed with code ${code}`));
31
+ }
32
+ });
33
+ proc.on("error", reject);
34
+ });
35
+ }
36
+ var init_default = defineCommand({
37
+ meta: {
38
+ name: "init",
39
+ description: "Create a new project with TanStack Start + Convex + Tailwind"
40
+ },
41
+ args: {
42
+ name: {
43
+ type: "positional",
44
+ description: "Name of the project",
45
+ required: true
46
+ }
47
+ },
48
+ async run({ args }) {
49
+ const rawName = args.name;
50
+ const name = kebabCase(rawName);
51
+ const cwd = process.cwd();
52
+ const projectDir = join(cwd, name);
53
+ if (await fileExists(projectDir)) {
54
+ logger.error(`Directory "${name}" already exists`);
55
+ process.exit(1);
56
+ }
57
+ logger.blank();
58
+ logger.log(` ${pc.bold("Forge CLI")} - Creating project "${name}"`);
59
+ logger.blank();
60
+ logger.log(` ${pc.cyan("Step 1/5:")} TanStack Start setup`);
61
+ logger.blank();
62
+ try {
63
+ await runInteractive("pnpm", ["create", "@tanstack/start@latest", name]);
64
+ } catch {
65
+ logger.error("TanStack Start scaffolding failed");
66
+ process.exit(1);
67
+ }
68
+ logger.blank();
69
+ logger.log(` ${pc.cyan("Step 2/5:")} Adding Forge customizations...`);
70
+ const pkgPath = join(projectDir, "package.json");
71
+ const pkg = JSON.parse(await readFile(pkgPath));
72
+ pkg.dependencies = {
73
+ ...pkg.dependencies,
74
+ convex: "^1.31.4",
75
+ clsx: "^2.1.1",
76
+ "tailwind-merge": "^3.4.0"
77
+ };
78
+ pkg.devDependencies = {
79
+ ...pkg.devDependencies,
80
+ "@biomejs/biome": "^1.9.4",
81
+ autoprefixer: "^10.4.20",
82
+ postcss: "^8.5.0",
83
+ tailwindcss: "^3.4.17"
84
+ };
85
+ pkg.scripts = {
86
+ ...pkg.scripts,
87
+ lint: "biome check .",
88
+ "lint:fix": "biome check . --write",
89
+ format: "biome format . --write"
90
+ };
91
+ await writeFile(pkgPath, JSON.stringify(pkg, null, 2));
92
+ logger.success("Updated package.json with Convex & Tailwind deps");
93
+ const tsconfigPath = join(projectDir, "tsconfig.json");
94
+ const tsconfig = JSON.parse(await readFile(tsconfigPath));
95
+ tsconfig.compilerOptions = {
96
+ ...tsconfig.compilerOptions,
97
+ paths: {
98
+ ...tsconfig.compilerOptions?.paths,
99
+ "~/*": ["./src/*"],
100
+ "@convex/*": ["./convex/*"]
101
+ }
102
+ };
103
+ await writeFile(tsconfigPath, JSON.stringify(tsconfig, null, 2));
104
+ logger.success("Added path aliases to tsconfig.json");
105
+ const templateData = { name };
106
+ const forgeFiles = [
107
+ { templatePath: "init/biome.json.hbs", destPath: join(projectDir, "biome.json") },
108
+ { templatePath: "init/tailwind.config.ts.hbs", destPath: join(projectDir, "tailwind.config.ts") },
109
+ { templatePath: "init/postcss.config.js.hbs", destPath: join(projectDir, "postcss.config.js") },
110
+ { templatePath: "init/convex/schema.ts.hbs", destPath: join(projectDir, "convex/schema.ts") },
111
+ { templatePath: "init/src/lib/cn.ts.hbs", destPath: join(projectDir, "src/lib/cn.ts") },
112
+ { templatePath: "init/src/providers/index.tsx.hbs", destPath: join(projectDir, "src/providers/index.tsx") },
113
+ { templatePath: "init/claude.md.hbs", destPath: join(projectDir, "CLAUDE.md") }
114
+ ];
115
+ for (const file of forgeFiles) {
116
+ const content = renderTemplate(file.templatePath, templateData);
117
+ await writeFile(file.destPath, content);
118
+ const relativePath = file.destPath.replace(projectDir + "/", "");
119
+ logger.success(`Created ${relativePath}`);
120
+ }
121
+ const rootPath = join(projectDir, "src/routes/__root.tsx");
122
+ if (await fileExists(rootPath)) {
123
+ let rootContent = await readFile(rootPath);
124
+ if (!rootContent.includes("Providers")) {
125
+ rootContent = `import { Providers } from "../providers";
126
+ ${rootContent}`;
127
+ rootContent = rootContent.replace(
128
+ /(<body[^>]*>)([\s\S]*?)(<\/body>)/,
129
+ "$1<Providers>$2</Providers>$3"
130
+ );
131
+ await writeFile(rootPath, rootContent);
132
+ logger.success("Modified __root.tsx to use Providers");
133
+ }
134
+ }
135
+ const emptyDirs = [
136
+ join(projectDir, "src/components/ui"),
137
+ join(projectDir, "src/features"),
138
+ join(projectDir, "src/hooks"),
139
+ join(projectDir, "convex/features")
140
+ ];
141
+ for (const dir of emptyDirs) {
142
+ await ensureDir(dir);
143
+ await writeFile(join(dir, ".gitkeep"), "");
144
+ }
145
+ logger.success("Created directory structure");
146
+ const stylesPath = join(projectDir, "src/styles.css");
147
+ const existingStyles = await fileExists(stylesPath) ? await readFile(stylesPath) : "";
148
+ if (!existingStyles.includes("@tailwind")) {
149
+ const tailwindDirectives = `@tailwind base;
150
+ @tailwind components;
151
+ @tailwind utilities;
152
+
153
+ `;
154
+ await writeFile(stylesPath, tailwindDirectives + existingStyles);
155
+ logger.success("Added Tailwind directives to styles.css");
156
+ }
157
+ const gitignorePath = join(projectDir, ".gitignore");
158
+ let gitignore = await fileExists(gitignorePath) ? await readFile(gitignorePath) : "";
159
+ const additions = [".env", ".env.local", ".output", "convex/_generated"];
160
+ for (const item of additions) {
161
+ if (!gitignore.includes(item)) {
162
+ gitignore += `
163
+ ${item}`;
164
+ }
165
+ }
166
+ await writeFile(gitignorePath, gitignore.trim() + "\n");
167
+ logger.success("Updated .gitignore");
168
+ await writeFile(join(projectDir, ".env.example"), "VITE_CONVEX_URL=\n");
169
+ logger.success("Created .env.example");
170
+ logger.blank();
171
+ logger.log(` ${pc.cyan("Step 3/5:")} Installing dependencies...`);
172
+ logger.blank();
173
+ try {
174
+ await runInteractive("pnpm", ["install"], projectDir);
175
+ } catch {
176
+ logger.error("Failed to install dependencies");
177
+ process.exit(1);
178
+ }
179
+ logger.blank();
180
+ logger.log(` ${pc.cyan("Step 4/5:")} Convex setup`);
181
+ logger.blank();
182
+ try {
183
+ await runInteractive("npx", ["convex", "dev", "--once", "--configure=new"], projectDir);
184
+ } catch {
185
+ logger.warn("Convex setup skipped or failed - you can run it later");
186
+ }
187
+ logger.blank();
188
+ logger.log(` ${pc.cyan("Step 5/5:")} shadcn/ui setup`);
189
+ logger.blank();
190
+ try {
191
+ await runInteractive("pnpm", ["dlx", "shadcn@latest", "init"], projectDir);
192
+ } catch {
193
+ logger.warn("shadcn setup skipped or failed - you can run it later");
194
+ }
195
+ logger.blank();
196
+ logger.log(` ${pc.green("\u2713")} ${pc.bold("Project created successfully!")}`);
197
+ logger.blank();
198
+ logger.log(` ${pc.cyan("cd")} ${name}`);
199
+ logger.log(` ${pc.cyan("pnpm dev")}`);
200
+ logger.blank();
201
+ logger.log(` ${pc.dim("CLAUDE.md is configured. Claude Code will use forge CLI automatically.")}`);
202
+ logger.blank();
203
+ }
204
+ });
205
+ export {
206
+ init_default as default
207
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-forge-cli",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "description": "TypeScript stack scaffolding & enforcement CLI for TanStack Start + Convex",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -47,13 +47,13 @@
47
47
  "picocolors": "^1.1.1"
48
48
  },
49
49
  "devDependencies": {
50
- "@types/node": "^22.10.5",
50
+ "@types/node": "^25.0.8",
51
51
  "tsx": "^4.19.2",
52
- "tsup": "^8.3.5",
53
- "typescript": "^5.7.2",
54
- "vitest": "^2.1.8"
52
+ "tsup": "^8.5.1",
53
+ "typescript": "^5.9.3",
54
+ "vitest": "^4.0.17"
55
55
  },
56
56
  "engines": {
57
- "node": ">=18"
57
+ "node": ">=22"
58
58
  }
59
59
  }
@@ -1,114 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- kebabCase,
4
- renderTemplate
5
- } from "./chunk-PIFX2L5H.js";
6
- import {
7
- ensureDir,
8
- fileExists,
9
- logger,
10
- writeFile
11
- } from "./chunk-J4V5PGVT.js";
12
-
13
- // src/commands/init.ts
14
- import { defineCommand } from "citty";
15
- import { join } from "path";
16
- import pc from "picocolors";
17
- var init_default = defineCommand({
18
- meta: {
19
- name: "init",
20
- description: "Create a new project with TanStack Start + Convex + Tailwind"
21
- },
22
- args: {
23
- name: {
24
- type: "positional",
25
- description: "Name of the project",
26
- required: true
27
- }
28
- },
29
- async run({ args }) {
30
- const rawName = args.name;
31
- const name = kebabCase(rawName);
32
- const cwd = process.cwd();
33
- const projectDir = join(cwd, name);
34
- if (await fileExists(projectDir)) {
35
- logger.error(`Directory "${name}" already exists`);
36
- process.exit(1);
37
- }
38
- logger.blank();
39
- logger.log(` Creating project "${name}"...`);
40
- logger.blank();
41
- const templateData = { name };
42
- const files = [
43
- // Root config files
44
- { templatePath: "init/package.json.hbs", destPath: join(projectDir, "package.json") },
45
- { templatePath: "init/tsconfig.json.hbs", destPath: join(projectDir, "tsconfig.json") },
46
- { templatePath: "init/biome.json.hbs", destPath: join(projectDir, "biome.json") },
47
- { templatePath: "init/tailwind.config.ts.hbs", destPath: join(projectDir, "tailwind.config.ts") },
48
- { templatePath: "init/postcss.config.js.hbs", destPath: join(projectDir, "postcss.config.js") },
49
- { templatePath: "init/vite.config.ts.hbs", destPath: join(projectDir, "vite.config.ts") },
50
- // App files
51
- { templatePath: "init/app/client.tsx.hbs", destPath: join(projectDir, "app/client.tsx") },
52
- { templatePath: "init/app/ssr.tsx.hbs", destPath: join(projectDir, "app/ssr.tsx") },
53
- { templatePath: "init/app/router.tsx.hbs", destPath: join(projectDir, "app/router.tsx") },
54
- { templatePath: "init/app/routes/__root.tsx.hbs", destPath: join(projectDir, "app/routes/__root.tsx") },
55
- { templatePath: "init/app/routes/index.tsx.hbs", destPath: join(projectDir, "app/routes/index.tsx") },
56
- // Src files
57
- { templatePath: "init/src/lib/cn.ts.hbs", destPath: join(projectDir, "src/lib/cn.ts") },
58
- { templatePath: "init/src/providers/index.tsx.hbs", destPath: join(projectDir, "src/providers/index.tsx") },
59
- // Convex files
60
- { templatePath: "init/convex/schema.ts.hbs", destPath: join(projectDir, "convex/schema.ts") },
61
- // CLAUDE.md - THE HOOK
62
- { templatePath: "init/claude.md.hbs", destPath: join(projectDir, "CLAUDE.md") }
63
- ];
64
- for (const file of files) {
65
- const content = renderTemplate(file.templatePath, templateData);
66
- await writeFile(file.destPath, content);
67
- const relativePath = file.destPath.replace(projectDir + "/", "");
68
- logger.success(`Created ${relativePath}`);
69
- }
70
- const emptyDirs = [
71
- join(projectDir, "src/components/ui"),
72
- join(projectDir, "src/features"),
73
- join(projectDir, "src/hooks"),
74
- join(projectDir, "convex/features")
75
- ];
76
- for (const dir of emptyDirs) {
77
- await ensureDir(dir);
78
- await writeFile(join(dir, ".gitkeep"), "");
79
- }
80
- const globalCss = `@tailwind base;
81
- @tailwind components;
82
- @tailwind utilities;
83
- `;
84
- await writeFile(join(projectDir, "src/styles.css"), globalCss);
85
- logger.success("Created src/styles.css");
86
- const gitignore = `node_modules
87
- dist
88
- .output
89
- .env
90
- .env.local
91
- `;
92
- await writeFile(join(projectDir, ".gitignore"), gitignore);
93
- logger.success("Created .gitignore");
94
- const envExample = `VITE_CONVEX_URL=
95
- `;
96
- await writeFile(join(projectDir, ".env.example"), envExample);
97
- logger.success("Created .env.example");
98
- logger.blank();
99
- logger.log(` ${pc.green("Project created successfully!")}`);
100
- logger.blank();
101
- logger.log(" Next steps:");
102
- logger.log(` 1. ${pc.cyan(`cd ${name}`)}`);
103
- logger.log(` 2. ${pc.cyan("pnpm install")}`);
104
- logger.log(` 3. ${pc.cyan("npx convex dev --once --configure=new")}`);
105
- logger.log(` 4. ${pc.cyan("pnpm dlx shadcn@latest init")}`);
106
- logger.log(` 5. ${pc.cyan("pnpm dev")}`);
107
- logger.blank();
108
- logger.log(` ${pc.dim("CLAUDE.md is configured. Claude Code will use forge CLI automatically.")}`);
109
- logger.blank();
110
- }
111
- });
112
- export {
113
- init_default as default
114
- };
@@ -1,7 +0,0 @@
1
- import { hydrateRoot } from "react-dom/client";
2
- import { StartClient } from "@tanstack/react-start";
3
- import { createRouter } from "./router";
4
-
5
- const router = createRouter();
6
-
7
- hydrateRoot(document, <StartClient router={router} />);
@@ -1,17 +0,0 @@
1
- import { createRouter as createTanStackRouter } from "@tanstack/react-router";
2
- import { routeTree } from "./routeTree.gen";
3
-
4
- export function createRouter() {
5
- const router = createTanStackRouter({
6
- routeTree,
7
- defaultPreload: "intent",
8
- });
9
-
10
- return router;
11
- }
12
-
13
- declare module "@tanstack/react-router" {
14
- interface Register {
15
- router: ReturnType<typeof createRouter>;
16
- }
17
- }
@@ -1,38 +0,0 @@
1
- import { Outlet, ScrollRestoration, createRootRoute } from "@tanstack/react-router";
2
- import { Meta, Scripts } from "@tanstack/start";
3
- import { Providers } from "~/providers";
4
-
5
- export const Route = createRootRoute({
6
- head: () => ({
7
- meta: [
8
- { charSet: "utf-8" },
9
- { name: "viewport", content: "width=device-width, initial-scale=1" },
10
- { title: "{{pascalCase name}}" },
11
- ],
12
- links: [{ rel: "stylesheet", href: "/styles.css" }],
13
- }),
14
- component: RootComponent,
15
- });
16
-
17
- function RootComponent() {
18
- return (
19
- <RootDocument>
20
- <Outlet />
21
- </RootDocument>
22
- );
23
- }
24
-
25
- function RootDocument({ children }: { children: React.ReactNode }) {
26
- return (
27
- <html lang="en">
28
- <head>
29
- <Meta />
30
- </head>
31
- <body>
32
- <Providers>{children}</Providers>
33
- <ScrollRestoration />
34
- <Scripts />
35
- </body>
36
- </html>
37
- );
38
- }
@@ -1,18 +0,0 @@
1
- import { createFileRoute } from "@tanstack/react-router";
2
-
3
- export const Route = createFileRoute("/")({
4
- component: Home,
5
- });
6
-
7
- function Home() {
8
- return (
9
- <div className="min-h-screen flex items-center justify-center">
10
- <div className="text-center">
11
- <h1 className="text-4xl font-bold mb-4">{{pascalCase name}}</h1>
12
- <p className="text-gray-600">
13
- Your TanStack Start + Convex app is ready.
14
- </p>
15
- </div>
16
- </div>
17
- );
18
- }
@@ -1,11 +0,0 @@
1
- import {
2
- createStartHandler,
3
- defaultStreamHandler,
4
- } from "@tanstack/react-start/server";
5
- import { getRouterManifest } from "@tanstack/react-start/router-manifest";
6
- import { createRouter } from "./router";
7
-
8
- export default createStartHandler({
9
- createRouter,
10
- getRouterManifest,
11
- })(defaultStreamHandler);
@@ -1,36 +0,0 @@
1
- {
2
- "name": "{{name}}",
3
- "version": "0.1.0",
4
- "private": true,
5
- "type": "module",
6
- "scripts": {
7
- "dev": "vite dev",
8
- "build": "vite build",
9
- "start": "node .output/server/index.mjs",
10
- "lint": "biome check .",
11
- "lint:fix": "biome check . --write",
12
- "format": "biome format . --write"
13
- },
14
- "dependencies": {
15
- "@tanstack/react-router": "^1.121.0",
16
- "@tanstack/react-start": "^1.121.0",
17
- "convex": "^1.17.4",
18
- "react": "^19.0.0",
19
- "react-dom": "^19.0.0",
20
- "clsx": "^2.1.1",
21
- "tailwind-merge": "^2.6.0"
22
- },
23
- "devDependencies": {
24
- "@biomejs/biome": "^1.9.4",
25
- "@types/node": "^22.10.0",
26
- "@types/react": "^19.0.0",
27
- "@types/react-dom": "^19.0.0",
28
- "@vitejs/plugin-react": "^4.3.4",
29
- "autoprefixer": "^10.4.20",
30
- "postcss": "^8.4.49",
31
- "tailwindcss": "^3.4.17",
32
- "typescript": "^5.7.2",
33
- "vite": "^6.0.0",
34
- "vite-tsconfig-paths": "^5.1.4"
35
- }
36
- }
@@ -1,24 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "lib": ["ES2022", "DOM", "DOM.Iterable"],
5
- "module": "ESNext",
6
- "skipLibCheck": true,
7
- "moduleResolution": "bundler",
8
- "allowImportingTsExtensions": true,
9
- "resolveJsonModule": true,
10
- "isolatedModules": true,
11
- "noEmit": true,
12
- "jsx": "react-jsx",
13
- "strict": true,
14
- "noUnusedLocals": true,
15
- "noUnusedParameters": true,
16
- "noFallthroughCasesInSwitch": true,
17
- "noUncheckedIndexedAccess": true,
18
- "paths": {
19
- "~/*": ["./src/*"],
20
- "@convex/*": ["./convex/*"]
21
- }
22
- },
23
- "include": ["src", "app", "convex"]
24
- }
@@ -1,11 +0,0 @@
1
- import { defineConfig } from "vite";
2
- import tsConfigPaths from "vite-tsconfig-paths";
3
- import { tanstackStart } from "@tanstack/react-start/plugin/vite";
4
- import react from "@vitejs/plugin-react";
5
-
6
- export default defineConfig({
7
- server: {
8
- port: 3000,
9
- },
10
- plugins: [tsConfigPaths(), tanstackStart(), react()],
11
- });
@@ -1,7 +0,0 @@
1
- import { hydrateRoot } from "react-dom/client";
2
- import { StartClient } from "@tanstack/react-start";
3
- import { createRouter } from "./router";
4
-
5
- const router = createRouter();
6
-
7
- hydrateRoot(document, <StartClient router={router} />);
@@ -1,17 +0,0 @@
1
- import { createRouter as createTanStackRouter } from "@tanstack/react-router";
2
- import { routeTree } from "./routeTree.gen";
3
-
4
- export function createRouter() {
5
- const router = createTanStackRouter({
6
- routeTree,
7
- defaultPreload: "intent",
8
- });
9
-
10
- return router;
11
- }
12
-
13
- declare module "@tanstack/react-router" {
14
- interface Register {
15
- router: ReturnType<typeof createRouter>;
16
- }
17
- }
@@ -1,38 +0,0 @@
1
- import { Outlet, ScrollRestoration, createRootRoute } from "@tanstack/react-router";
2
- import { Meta, Scripts } from "@tanstack/start";
3
- import { Providers } from "~/providers";
4
-
5
- export const Route = createRootRoute({
6
- head: () => ({
7
- meta: [
8
- { charSet: "utf-8" },
9
- { name: "viewport", content: "width=device-width, initial-scale=1" },
10
- { title: "{{pascalCase name}}" },
11
- ],
12
- links: [{ rel: "stylesheet", href: "/styles.css" }],
13
- }),
14
- component: RootComponent,
15
- });
16
-
17
- function RootComponent() {
18
- return (
19
- <RootDocument>
20
- <Outlet />
21
- </RootDocument>
22
- );
23
- }
24
-
25
- function RootDocument({ children }: { children: React.ReactNode }) {
26
- return (
27
- <html lang="en">
28
- <head>
29
- <Meta />
30
- </head>
31
- <body>
32
- <Providers>{children}</Providers>
33
- <ScrollRestoration />
34
- <Scripts />
35
- </body>
36
- </html>
37
- );
38
- }
@@ -1,18 +0,0 @@
1
- import { createFileRoute } from "@tanstack/react-router";
2
-
3
- export const Route = createFileRoute("/")({
4
- component: Home,
5
- });
6
-
7
- function Home() {
8
- return (
9
- <div className="min-h-screen flex items-center justify-center">
10
- <div className="text-center">
11
- <h1 className="text-4xl font-bold mb-4">{{pascalCase name}}</h1>
12
- <p className="text-gray-600">
13
- Your TanStack Start + Convex app is ready.
14
- </p>
15
- </div>
16
- </div>
17
- );
18
- }
@@ -1,11 +0,0 @@
1
- import {
2
- createStartHandler,
3
- defaultStreamHandler,
4
- } from "@tanstack/react-start/server";
5
- import { getRouterManifest } from "@tanstack/react-start/router-manifest";
6
- import { createRouter } from "./router";
7
-
8
- export default createStartHandler({
9
- createRouter,
10
- getRouterManifest,
11
- })(defaultStreamHandler);
@@ -1,36 +0,0 @@
1
- {
2
- "name": "{{name}}",
3
- "version": "0.1.0",
4
- "private": true,
5
- "type": "module",
6
- "scripts": {
7
- "dev": "vite dev",
8
- "build": "vite build",
9
- "start": "node .output/server/index.mjs",
10
- "lint": "biome check .",
11
- "lint:fix": "biome check . --write",
12
- "format": "biome format . --write"
13
- },
14
- "dependencies": {
15
- "@tanstack/react-router": "^1.121.0",
16
- "@tanstack/react-start": "^1.121.0",
17
- "convex": "^1.17.4",
18
- "react": "^19.0.0",
19
- "react-dom": "^19.0.0",
20
- "clsx": "^2.1.1",
21
- "tailwind-merge": "^2.6.0"
22
- },
23
- "devDependencies": {
24
- "@biomejs/biome": "^1.9.4",
25
- "@types/node": "^22.10.0",
26
- "@types/react": "^19.0.0",
27
- "@types/react-dom": "^19.0.0",
28
- "@vitejs/plugin-react": "^4.3.4",
29
- "autoprefixer": "^10.4.20",
30
- "postcss": "^8.4.49",
31
- "tailwindcss": "^3.4.17",
32
- "typescript": "^5.7.2",
33
- "vite": "^6.0.0",
34
- "vite-tsconfig-paths": "^5.1.4"
35
- }
36
- }
@@ -1,24 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2022",
4
- "lib": ["ES2022", "DOM", "DOM.Iterable"],
5
- "module": "ESNext",
6
- "skipLibCheck": true,
7
- "moduleResolution": "bundler",
8
- "allowImportingTsExtensions": true,
9
- "resolveJsonModule": true,
10
- "isolatedModules": true,
11
- "noEmit": true,
12
- "jsx": "react-jsx",
13
- "strict": true,
14
- "noUnusedLocals": true,
15
- "noUnusedParameters": true,
16
- "noFallthroughCasesInSwitch": true,
17
- "noUncheckedIndexedAccess": true,
18
- "paths": {
19
- "~/*": ["./src/*"],
20
- "@convex/*": ["./convex/*"]
21
- }
22
- },
23
- "include": ["src", "app", "convex"]
24
- }
@@ -1,11 +0,0 @@
1
- import { defineConfig } from "vite";
2
- import tsConfigPaths from "vite-tsconfig-paths";
3
- import { tanstackStart } from "@tanstack/react-start/plugin/vite";
4
- import react from "@vitejs/plugin-react";
5
-
6
- export default defineConfig({
7
- server: {
8
- port: 3000,
9
- },
10
- plugins: [tsConfigPaths(), tanstackStart(), react()],
11
- });