@donotdev/cli 0.0.15 → 0.0.16
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/dependencies-matrix.json +36 -20
- package/dist/bin/commands/build.js +69 -52
- package/dist/bin/commands/bump.js +7 -13
- package/dist/bin/commands/create-app.js +77 -29
- package/dist/bin/commands/create-project.js +109 -135
- package/dist/bin/commands/deploy.js +97 -45
- package/dist/bin/commands/dev.js +43 -24
- package/dist/bin/commands/doctor.d.ts +6 -0
- package/dist/bin/commands/doctor.d.ts.map +1 -0
- package/dist/bin/commands/{lint.js → doctor.js} +1178 -147
- package/dist/bin/commands/doctor.js.map +1 -0
- package/dist/bin/commands/emu.js +297 -107
- package/dist/bin/commands/make-admin.js +77499 -11
- package/dist/bin/commands/preview.js +44 -25
- package/dist/bin/commands/setup.d.ts +6 -0
- package/dist/bin/commands/setup.d.ts.map +1 -0
- package/dist/bin/commands/setup.js +11733 -0
- package/dist/bin/commands/setup.js.map +1 -0
- package/dist/bin/commands/type-check.js +2018 -283
- package/dist/bin/dndev.js +54 -58
- package/dist/bin/donotdev.js +28 -44
- package/dist/index.js +633 -416
- package/package.json +2 -2
- package/templates/app-expo/.env.example +2 -22
- package/templates/app-expo/README.md.example +1 -1
- package/templates/app-expo/assets/adaptive-icon.png +0 -0
- package/templates/app-expo/assets/favicon.png +0 -0
- package/templates/app-expo/assets/icon.png +0 -0
- package/templates/app-expo/assets/splash.png +0 -0
- package/templates/app-expo/src/config/app.ts.example +46 -0
- package/templates/app-expo/src/config/providers.ts.example +7 -0
- package/templates/app-next/src/config/providers.ts.example +7 -0
- package/templates/app-vite/src/config/providers.ts.example +7 -0
- package/templates/app-vite/src/pages/HomePage.tsx.example +1 -1
- package/templates/functions-firebase/README.md.example +1 -1
- package/templates/functions-firebase/functions-firebase/.env.example.example +1 -1
- package/templates/functions-firebase/functions-firebase/README.md.example +1 -1
- package/templates/functions-firebase/functions-firebase/tsconfig.json.example +1 -1
- package/templates/functions-firebase/functions.config.js.example +1 -1
- package/templates/functions-supabase/supabase/config.toml.example +59 -0
- package/templates/functions-supabase/supabase/functions/.env.example +13 -0
- package/templates/functions-supabase/supabase/functions/deno.json.example +8 -0
- package/templates/overlay-firebase/env.fragment.example +1 -1
- package/templates/overlay-firebase/env.fragment.expo.example +1 -1
- package/templates/overlay-firebase/env.fragment.nextjs.example +1 -1
- package/templates/overlay-supabase/env.fragment.example +8 -3
- package/templates/overlay-supabase/env.fragment.expo.example +8 -3
- package/templates/overlay-supabase/env.fragment.nextjs.example +8 -3
- package/templates/overlay-vercel/env.fragment.example +1 -1
- package/templates/overlay-vercel/env.fragment.nextjs.example +1 -1
- package/templates/root-consumer/AI.md.example +15 -0
- package/templates/root-consumer/guides/dndev/AGENT_START_HERE.md.example +2 -2
- package/templates/root-consumer/guides/dndev/ENV_SETUP.md.example +6 -6
- package/templates/root-consumer/guides/dndev/INDEX.md.example +2 -2
- package/templates/root-consumer/guides/dndev/SETUP_APP_CONFIG.md.example +3 -3
- package/templates/root-consumer/guides/dndev/SETUP_CRUD.md.example +98 -0
- package/templates/root-consumer/guides/dndev/SETUP_FIREBASE.md.example +4 -4
- package/templates/root-consumer/guides/dndev/SETUP_OAUTH_PROVIDERS.md.example +60 -0
- package/templates/root-consumer/guides/dndev/SETUP_STRIPE.md.example +62 -0
- package/templates/root-consumer/guides/dndev/SETUP_SUPABASE.md.example +3 -3
- package/templates/root-consumer/guides/dndev/SETUP_VERCEL.md.example +2 -2
- package/templates/root-consumer/guides/wai-way/WAI_WAY_CLI.md.example +7 -8
- package/templates/root-consumer/guides/wai-way/blueprints/1_scaffold.md.example +9 -5
- package/dist/bin/commands/lint.d.ts +0 -11
- package/dist/bin/commands/lint.d.ts.map +0 -1
- package/dist/bin/commands/lint.js.map +0 -1
- package/dist/bin/commands/staging.d.ts +0 -11
- package/dist/bin/commands/staging.d.ts.map +0 -1
- package/dist/bin/commands/staging.js +0 -12
- package/dist/bin/commands/staging.js.map +0 -1
package/dist/bin/dndev.js
CHANGED
|
@@ -32,8 +32,11 @@ var init_utils = __esm({
|
|
|
32
32
|
|
|
33
33
|
// packages/cli/src/bin/dndev.mjs
|
|
34
34
|
init_utils();
|
|
35
|
+
import { readFileSync } from "node:fs";
|
|
35
36
|
import { Command } from "commander";
|
|
36
|
-
var CLI_VERSION =
|
|
37
|
+
var CLI_VERSION = JSON.parse(
|
|
38
|
+
readFileSync(new URL("../../package.json", import.meta.url), "utf-8")
|
|
39
|
+
).version;
|
|
37
40
|
var args = process.argv.slice(2);
|
|
38
41
|
if (args.length === 1 && (args[0] === "--version" || args[0] === "-v")) {
|
|
39
42
|
console.log(CLI_VERSION);
|
|
@@ -50,14 +53,15 @@ Commands:
|
|
|
50
53
|
dev [app] Start development server
|
|
51
54
|
build [app] Build for production
|
|
52
55
|
preview [app] Preview production build
|
|
53
|
-
emu [app] Start dev with
|
|
56
|
+
emu [app] Start dev with local backend
|
|
54
57
|
format Format code with Prettier
|
|
55
58
|
tc [app] Type-check TypeScript (all packages or specific app)
|
|
56
59
|
deploy [app] Deploy to Firebase
|
|
57
60
|
staging [subcommand] Deploy to staging/UAT (deploy, deploy:hosting, deploy:functions, seed, status)
|
|
58
61
|
sync-secrets Sync env vars to Firebase/Vercel/GitHub Secrets
|
|
59
|
-
|
|
60
|
-
|
|
62
|
+
make-admin [userId] Set a user as admin (custom claims / app_metadata)
|
|
63
|
+
setup [provider] Set up provider credentials (firebase, supabase, vercel, stripe, oauth, auth)
|
|
64
|
+
doctor Check project health: validate provider connections and .env files
|
|
61
65
|
cacheout [app] Clear build caches
|
|
62
66
|
bump Update framework packages and peer dependencies
|
|
63
67
|
agent Configure MCP server for AI agents (Cursor, Claude, Gemini)
|
|
@@ -87,11 +91,11 @@ function extractCommonOptions(commanderOptions) {
|
|
|
87
91
|
const quiet = process.env.QUIET === "true" || process.env.QUIET === "1" || commanderOptions.quiet || false;
|
|
88
92
|
const debug = process.env.DEBUG === "true" || process.env.DEBUG === "1" || commanderOptions.debug || false;
|
|
89
93
|
const verbose = !debug && (process.env.VERBOSE === "true" || process.env.VERBOSE === "1" || commanderOptions.verbose || false);
|
|
90
|
-
const dryRun = process.env.DRY_RUN === "true" || process.env.DRY_RUN === "1" || commanderOptions.dryRun ||
|
|
94
|
+
const dryRun = process.env.DRY_RUN === "true" || process.env.DRY_RUN === "1" || commanderOptions.dryRun || false;
|
|
91
95
|
return { dryRun, quiet, verbose, debug };
|
|
92
96
|
}
|
|
93
97
|
function addCommonOptions(cmd) {
|
|
94
|
-
cmd.option("
|
|
98
|
+
cmd.option("-d, --dry-run", "Preview changes without applying").option("--verbose", "Verbose output").option("--debug", "Debug output").option("-q, --quiet", "Quiet output (errors only)");
|
|
95
99
|
}
|
|
96
100
|
program.command("init [name]").alias("create-project").description("Create a new DoNotDev project").action(async (name) => {
|
|
97
101
|
const { main } = await import("./commands/create-project.js");
|
|
@@ -119,7 +123,7 @@ formatCmd.action(async (commanderOptions) => {
|
|
|
119
123
|
const options = { ...commonOptions, ...commanderOptions };
|
|
120
124
|
try {
|
|
121
125
|
const { main } = await import("./commands/format.js");
|
|
122
|
-
await main(options);
|
|
126
|
+
process.exitCode = await main(options);
|
|
123
127
|
} catch (error) {
|
|
124
128
|
if (error.code === "invalid-argument" || error.name === "DoNotDevError") {
|
|
125
129
|
process.exit(error.context?.exitCode || 1);
|
|
@@ -151,7 +155,7 @@ cacheoutCmd.action(async (app, commanderOptions) => {
|
|
|
151
155
|
options.app = app;
|
|
152
156
|
}
|
|
153
157
|
const { main } = await import("./commands/cacheout.js");
|
|
154
|
-
await main(options);
|
|
158
|
+
process.exitCode = await main(options);
|
|
155
159
|
});
|
|
156
160
|
var bumpCmd = program.command("bump").description("Update framework packages and peer dependencies to latest compatible versions");
|
|
157
161
|
addCommonOptions(bumpCmd);
|
|
@@ -160,7 +164,7 @@ bumpCmd.action(async (commanderOptions) => {
|
|
|
160
164
|
const options = { ...commonOptions, ...commanderOptions };
|
|
161
165
|
try {
|
|
162
166
|
const { main } = await import("./commands/bump.js");
|
|
163
|
-
await main(options);
|
|
167
|
+
process.exitCode = await main(options);
|
|
164
168
|
} catch (error) {
|
|
165
169
|
if (error.code === "invalid-argument" || error.name === "DoNotDevError") {
|
|
166
170
|
process.exit(error.context?.exitCode || 1);
|
|
@@ -189,62 +193,54 @@ addCommonOptions(syncSecretsCmd);
|
|
|
189
193
|
syncSecretsCmd.action(async (commanderOptions) => {
|
|
190
194
|
const commonOptions = extractCommonOptions(commanderOptions);
|
|
191
195
|
const options = { ...commonOptions, ...commanderOptions };
|
|
196
|
+
if (options.project) {
|
|
197
|
+
options.projectId = options.project;
|
|
198
|
+
}
|
|
192
199
|
const { main } = await import("./commands/sync-secrets.js");
|
|
193
|
-
await main(options);
|
|
200
|
+
process.exitCode = await main(options);
|
|
194
201
|
});
|
|
195
|
-
var
|
|
196
|
-
addCommonOptions(
|
|
197
|
-
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
+
var makeAdminCmd = program.command("make-admin [userId]").alias("ma").description("Set a user as admin (custom claims / app_metadata)").option("--project <projectId>", "Project ID (Firebase or Supabase)").option("--project-id <projectId>", "Project ID (alias for --project)").option("--super", "Assign super role (isAdmin=true, isSuper=true, role=super)");
|
|
203
|
+
addCommonOptions(makeAdminCmd);
|
|
204
|
+
makeAdminCmd.action(async (userId, commanderOptions) => {
|
|
205
|
+
const args2 = [];
|
|
206
|
+
if (userId) args2.push(userId);
|
|
207
|
+
if (commanderOptions.project) args2.push(`--project=${commanderOptions.project}`);
|
|
208
|
+
if (commanderOptions.projectId) args2.push(`--project-id=${commanderOptions.projectId}`);
|
|
209
|
+
if (commanderOptions.super) args2.push("--super");
|
|
210
|
+
const { main } = await import("./commands/make-admin.js");
|
|
211
|
+
await main(args2);
|
|
202
212
|
});
|
|
203
|
-
var
|
|
204
|
-
addCommonOptions(
|
|
205
|
-
|
|
213
|
+
var setupCmd = program.command("setup [provider]").description("Set up provider credentials and connections (firebase, supabase, vercel, stripe, oauth, auth)").option("-a, --app <app>", "app name (if multiple apps)").option("--skip-doctor", "Skip running doctor after setup");
|
|
214
|
+
addCommonOptions(setupCmd);
|
|
215
|
+
setupCmd.action(async (provider, commanderOptions) => {
|
|
206
216
|
const commonOptions = extractCommonOptions(commanderOptions);
|
|
207
|
-
const options = { ...commonOptions,
|
|
208
|
-
const { main } = await import("./commands/
|
|
209
|
-
await main(options);
|
|
217
|
+
const options = { ...commonOptions, provider, app: commanderOptions.app, skipDoctor: commanderOptions.skipDoctor };
|
|
218
|
+
const { main } = await import("./commands/setup.js");
|
|
219
|
+
process.exitCode = await main(options);
|
|
210
220
|
});
|
|
211
|
-
program.command("
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
process.exit(await main());
|
|
219
|
-
});
|
|
220
|
-
program.command("emu [app]").description("Start dev with Firebase emulators").action(async (app) => {
|
|
221
|
-
const { main } = await import("./commands/emu.js");
|
|
222
|
-
if (app) {
|
|
223
|
-
process.argv = [process.argv[0], process.argv[1], app];
|
|
224
|
-
} else {
|
|
225
|
-
process.argv = [process.argv[0], process.argv[1]];
|
|
226
|
-
}
|
|
227
|
-
process.exit(await main());
|
|
228
|
-
});
|
|
229
|
-
program.command("build [app]").description("Build for production").action(async (app) => {
|
|
230
|
-
const { main } = await import("./commands/build.js");
|
|
231
|
-
if (app) {
|
|
232
|
-
process.argv = [process.argv[0], process.argv[1], app];
|
|
233
|
-
} else {
|
|
234
|
-
process.argv = [process.argv[0], process.argv[1]];
|
|
235
|
-
}
|
|
236
|
-
process.exit(await main());
|
|
221
|
+
var doctorCmd = program.command("doctor").description("Check project health: validate provider connections and .env files").option("-a, --app <app>", "app name (if multiple apps)").option("-c, --check <check>", "run a single check (env, firebase, supabase, stripe, auth)");
|
|
222
|
+
addCommonOptions(doctorCmd);
|
|
223
|
+
doctorCmd.action(async (commanderOptions) => {
|
|
224
|
+
const commonOptions = extractCommonOptions(commanderOptions);
|
|
225
|
+
const options = { ...commonOptions, app: commanderOptions.app, check: commanderOptions.check };
|
|
226
|
+
const { main } = await import("./commands/doctor.js");
|
|
227
|
+
process.exit(await main(options));
|
|
237
228
|
});
|
|
238
|
-
|
|
239
|
-
const
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
process.
|
|
229
|
+
async function runAppCommand(commandPath, app) {
|
|
230
|
+
const savedArgv = process.argv;
|
|
231
|
+
process.argv = app ? [savedArgv[0], savedArgv[1], app] : [savedArgv[0], savedArgv[1]];
|
|
232
|
+
try {
|
|
233
|
+
const { main } = await import(commandPath);
|
|
234
|
+
process.exit(await main());
|
|
235
|
+
} finally {
|
|
236
|
+
process.argv = savedArgv;
|
|
244
237
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
program.command("
|
|
238
|
+
}
|
|
239
|
+
program.command("dev [app]").description("Start development server").action((app) => runAppCommand("./commands/dev.js", app));
|
|
240
|
+
program.command("emu [app]").description("Start dev with local backend").action((app) => runAppCommand("./commands/emu.js", app));
|
|
241
|
+
program.command("build [app]").description("Build for production").action((app) => runAppCommand("./commands/build.js", app));
|
|
242
|
+
program.command("preview [app]").description("Preview production build").action((app) => runAppCommand("./commands/preview.js", app));
|
|
243
|
+
program.command("agent").alias("agent:setup").description("Configure MCP server for all AI agents (Cursor, Claude Code, Gemini, Claude Desktop)").option("-d, --dry-run", "Preview changes without applying").action(async (commanderOptions) => {
|
|
248
244
|
const options = extractCommonOptions(commanderOptions);
|
|
249
245
|
const { main } = await import("./commands/agent-setup.js");
|
|
250
246
|
await main(options);
|
package/dist/bin/donotdev.js
CHANGED
|
@@ -32,8 +32,11 @@ var init_utils = __esm({
|
|
|
32
32
|
|
|
33
33
|
// packages/cli/src/bin/dndev.mjs
|
|
34
34
|
init_utils();
|
|
35
|
+
import { readFileSync } from "node:fs";
|
|
35
36
|
import { Command } from "commander";
|
|
36
|
-
var CLI_VERSION =
|
|
37
|
+
var CLI_VERSION = JSON.parse(
|
|
38
|
+
readFileSync(new URL("../../package.json", import.meta.url), "utf-8")
|
|
39
|
+
).version;
|
|
37
40
|
var args = process.argv.slice(2);
|
|
38
41
|
if (args.length === 1 && (args[0] === "--version" || args[0] === "-v")) {
|
|
39
42
|
console.log(CLI_VERSION);
|
|
@@ -50,7 +53,7 @@ Commands:
|
|
|
50
53
|
dev [app] Start development server
|
|
51
54
|
build [app] Build for production
|
|
52
55
|
preview [app] Preview production build
|
|
53
|
-
emu [app] Start dev with
|
|
56
|
+
emu [app] Start dev with local backend
|
|
54
57
|
format Format code with Prettier
|
|
55
58
|
tc [app] Type-check TypeScript (all packages or specific app)
|
|
56
59
|
deploy [app] Deploy to Firebase
|
|
@@ -87,11 +90,11 @@ function extractCommonOptions(commanderOptions) {
|
|
|
87
90
|
const quiet = process.env.QUIET === "true" || process.env.QUIET === "1" || commanderOptions.quiet || false;
|
|
88
91
|
const debug = process.env.DEBUG === "true" || process.env.DEBUG === "1" || commanderOptions.debug || false;
|
|
89
92
|
const verbose = !debug && (process.env.VERBOSE === "true" || process.env.VERBOSE === "1" || commanderOptions.verbose || false);
|
|
90
|
-
const dryRun = process.env.DRY_RUN === "true" || process.env.DRY_RUN === "1" || commanderOptions.dryRun ||
|
|
93
|
+
const dryRun = process.env.DRY_RUN === "true" || process.env.DRY_RUN === "1" || commanderOptions.dryRun || false;
|
|
91
94
|
return { dryRun, quiet, verbose, debug };
|
|
92
95
|
}
|
|
93
96
|
function addCommonOptions(cmd) {
|
|
94
|
-
cmd.option("
|
|
97
|
+
cmd.option("-d, --dry-run", "Preview changes without applying").option("--verbose", "Verbose output").option("--debug", "Debug output").option("-q, --quiet", "Quiet output (errors only)");
|
|
95
98
|
}
|
|
96
99
|
program.command("init [name]").alias("create-project").description("Create a new DoNotDev project").action(async (name) => {
|
|
97
100
|
const { main } = await import("./commands/create-project.js");
|
|
@@ -119,7 +122,7 @@ formatCmd.action(async (commanderOptions) => {
|
|
|
119
122
|
const options = { ...commonOptions, ...commanderOptions };
|
|
120
123
|
try {
|
|
121
124
|
const { main } = await import("./commands/format.js");
|
|
122
|
-
await main(options);
|
|
125
|
+
process.exitCode = await main(options);
|
|
123
126
|
} catch (error) {
|
|
124
127
|
if (error.code === "invalid-argument" || error.name === "DoNotDevError") {
|
|
125
128
|
process.exit(error.context?.exitCode || 1);
|
|
@@ -151,7 +154,7 @@ cacheoutCmd.action(async (app, commanderOptions) => {
|
|
|
151
154
|
options.app = app;
|
|
152
155
|
}
|
|
153
156
|
const { main } = await import("./commands/cacheout.js");
|
|
154
|
-
await main(options);
|
|
157
|
+
process.exitCode = await main(options);
|
|
155
158
|
});
|
|
156
159
|
var bumpCmd = program.command("bump").description("Update framework packages and peer dependencies to latest compatible versions");
|
|
157
160
|
addCommonOptions(bumpCmd);
|
|
@@ -160,7 +163,7 @@ bumpCmd.action(async (commanderOptions) => {
|
|
|
160
163
|
const options = { ...commonOptions, ...commanderOptions };
|
|
161
164
|
try {
|
|
162
165
|
const { main } = await import("./commands/bump.js");
|
|
163
|
-
await main(options);
|
|
166
|
+
process.exitCode = await main(options);
|
|
164
167
|
} catch (error) {
|
|
165
168
|
if (error.code === "invalid-argument" || error.name === "DoNotDevError") {
|
|
166
169
|
process.exit(error.context?.exitCode || 1);
|
|
@@ -189,8 +192,11 @@ addCommonOptions(syncSecretsCmd);
|
|
|
189
192
|
syncSecretsCmd.action(async (commanderOptions) => {
|
|
190
193
|
const commonOptions = extractCommonOptions(commanderOptions);
|
|
191
194
|
const options = { ...commonOptions, ...commanderOptions };
|
|
195
|
+
if (options.project) {
|
|
196
|
+
options.projectId = options.project;
|
|
197
|
+
}
|
|
192
198
|
const { main } = await import("./commands/sync-secrets.js");
|
|
193
|
-
await main(options);
|
|
199
|
+
process.exitCode = await main(options);
|
|
194
200
|
});
|
|
195
201
|
var firebaseSetupCmd = program.command("firebase:setup").description("Set up Firebase project, web app, and .env config").option("-a, --app <app>", "app name (if multiple apps)");
|
|
196
202
|
addCommonOptions(firebaseSetupCmd);
|
|
@@ -208,43 +214,21 @@ supabaseSetupCmd.action(async (commanderOptions) => {
|
|
|
208
214
|
const { main } = await import("./commands/supabase-setup.js");
|
|
209
215
|
await main(options);
|
|
210
216
|
});
|
|
211
|
-
|
|
212
|
-
const
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
process.
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
});
|
|
220
|
-
program.command("emu [app]").description("Start dev with Firebase emulators").action(async (app) => {
|
|
221
|
-
const { main } = await import("./commands/emu.js");
|
|
222
|
-
if (app) {
|
|
223
|
-
process.argv = [process.argv[0], process.argv[1], app];
|
|
224
|
-
} else {
|
|
225
|
-
process.argv = [process.argv[0], process.argv[1]];
|
|
226
|
-
}
|
|
227
|
-
process.exit(await main());
|
|
228
|
-
});
|
|
229
|
-
program.command("build [app]").description("Build for production").action(async (app) => {
|
|
230
|
-
const { main } = await import("./commands/build.js");
|
|
231
|
-
if (app) {
|
|
232
|
-
process.argv = [process.argv[0], process.argv[1], app];
|
|
233
|
-
} else {
|
|
234
|
-
process.argv = [process.argv[0], process.argv[1]];
|
|
235
|
-
}
|
|
236
|
-
process.exit(await main());
|
|
237
|
-
});
|
|
238
|
-
program.command("preview [app]").description("Preview production build").action(async (app) => {
|
|
239
|
-
const { main } = await import("./commands/preview.js");
|
|
240
|
-
if (app) {
|
|
241
|
-
process.argv = [process.argv[0], process.argv[1], app];
|
|
242
|
-
} else {
|
|
243
|
-
process.argv = [process.argv[0], process.argv[1]];
|
|
217
|
+
async function runAppCommand(commandPath, app) {
|
|
218
|
+
const savedArgv = process.argv;
|
|
219
|
+
process.argv = app ? [savedArgv[0], savedArgv[1], app] : [savedArgv[0], savedArgv[1]];
|
|
220
|
+
try {
|
|
221
|
+
const { main } = await import(commandPath);
|
|
222
|
+
process.exit(await main());
|
|
223
|
+
} finally {
|
|
224
|
+
process.argv = savedArgv;
|
|
244
225
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
program.command("
|
|
226
|
+
}
|
|
227
|
+
program.command("dev [app]").description("Start development server").action((app) => runAppCommand("./commands/dev.js", app));
|
|
228
|
+
program.command("emu [app]").description("Start dev with local backend").action((app) => runAppCommand("./commands/emu.js", app));
|
|
229
|
+
program.command("build [app]").description("Build for production").action((app) => runAppCommand("./commands/build.js", app));
|
|
230
|
+
program.command("preview [app]").description("Preview production build").action((app) => runAppCommand("./commands/preview.js", app));
|
|
231
|
+
program.command("agent").alias("agent:setup").description("Configure MCP server for all AI agents (Cursor, Claude Code, Gemini, Claude Desktop)").option("-d, --dry-run", "Preview changes without applying").action(async (commanderOptions) => {
|
|
248
232
|
const options = extractCommonOptions(commanderOptions);
|
|
249
233
|
const { main } = await import("./commands/agent-setup.js");
|
|
250
234
|
await main(options);
|