@donotdev/cli 0.0.14 → 0.0.15

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.
Files changed (151) hide show
  1. package/dependencies-matrix.json +356 -88
  2. package/dist/bin/commands/agent-setup.js +7 -1
  3. package/dist/bin/commands/build.js +118 -38
  4. package/dist/bin/commands/bump.js +74 -28
  5. package/dist/bin/commands/cacheout.js +37 -9
  6. package/dist/bin/commands/create-app.js +222 -115
  7. package/dist/bin/commands/create-project.js +455 -140
  8. package/dist/bin/commands/deploy.js +1736 -697
  9. package/dist/bin/commands/dev.js +138 -23
  10. package/dist/bin/commands/emu.js +215 -58
  11. package/dist/bin/commands/format.js +37 -9
  12. package/dist/bin/commands/lint.js +37 -9
  13. package/dist/bin/commands/preview.js +142 -23
  14. package/dist/bin/commands/supabase-setup.d.ts +6 -0
  15. package/dist/bin/commands/supabase-setup.d.ts.map +1 -0
  16. package/dist/bin/commands/supabase-setup.js +7 -0
  17. package/dist/bin/commands/supabase-setup.js.map +1 -0
  18. package/dist/bin/commands/sync-secrets.js +211 -34
  19. package/dist/bin/commands/type-check.d.ts +14 -0
  20. package/dist/bin/commands/type-check.d.ts.map +1 -0
  21. package/dist/bin/commands/type-check.js +314 -0
  22. package/dist/bin/commands/type-check.js.map +1 -0
  23. package/dist/bin/commands/wai.js +3 -1
  24. package/dist/bin/dndev.js +27 -2
  25. package/dist/bin/donotdev.js +27 -2
  26. package/dist/index.js +3960 -3015
  27. package/package.json +2 -2
  28. package/templates/app-demo/src/App.tsx.example +1 -0
  29. package/templates/app-demo/src/pages/FullPage.tsx.example +2 -2
  30. package/templates/app-demo/src/pages/components/DemoLayout.tsx.example +2 -2
  31. package/templates/app-demo/src/themes.css.example +5 -12
  32. package/templates/app-expo/.env.example +64 -0
  33. package/templates/app-expo/.expo/README.md.example +5 -0
  34. package/templates/app-expo/.gitignore.example +36 -0
  35. package/templates/app-expo/README.md.example +58 -0
  36. package/templates/app-expo/app/.gitkeep +2 -0
  37. package/templates/app-expo/app/_layout.tsx.example +41 -0
  38. package/templates/app-expo/app/form.tsx.example +52 -0
  39. package/templates/app-expo/app/index.tsx.example +89 -0
  40. package/templates/app-expo/app/list.tsx.example +32 -0
  41. package/templates/app-expo/app/profile.tsx.example +76 -0
  42. package/templates/app-expo/app/signin.tsx.example +53 -0
  43. package/templates/app-expo/app.json.example +39 -0
  44. package/templates/app-expo/babel.config.js.example +10 -0
  45. package/templates/app-expo/eas.json.example +20 -0
  46. package/templates/app-expo/expo-env.d.ts.example +4 -0
  47. package/templates/app-expo/metro.config.js.example +20 -0
  48. package/templates/app-expo/service-account-key.json.example +12 -0
  49. package/templates/app-expo/tsconfig.json.example +19 -0
  50. package/templates/app-next/.env.example +4 -33
  51. package/templates/app-next/src/app/ClientLayout.tsx.example +2 -0
  52. package/templates/app-next/src/app/layout.tsx.example +7 -6
  53. package/templates/app-next/src/globals.css.example +2 -11
  54. package/templates/app-next/src/pages/HomePage.tsx.example +1 -1
  55. package/templates/app-next/src/themes.css.example +10 -13
  56. package/templates/app-vite/.env.example +3 -32
  57. package/templates/app-vite/index.html.example +2 -24
  58. package/templates/app-vite/src/App.tsx.example +2 -0
  59. package/templates/app-vite/src/globals.css.example +2 -12
  60. package/templates/app-vite/src/pages/FormPageExample.tsx.example +1 -2
  61. package/templates/app-vite/src/pages/HomePage.tsx.example +1 -1
  62. package/templates/app-vite/src/themes.css.example +109 -79
  63. package/templates/app-vite/vercel.json.example +11 -0
  64. package/templates/functions-firebase/build.mjs.example +2 -72
  65. package/templates/functions-firebase/functions-firebase/.env.example.example +23 -25
  66. package/templates/functions-firebase/functions-firebase/build.mjs.example +2 -72
  67. package/templates/functions-firebase/functions-firebase/tsconfig.json.example +1 -1
  68. package/templates/functions-supabase/supabase/functions/cancel-subscription/index.ts.example +7 -0
  69. package/templates/functions-supabase/supabase/functions/change-plan/index.ts.example +11 -0
  70. package/templates/functions-supabase/supabase/functions/create-checkout-session/index.ts.example +11 -0
  71. package/templates/functions-supabase/supabase/functions/create-customer-portal/index.ts.example +7 -0
  72. package/templates/functions-supabase/supabase/functions/crud/index.ts.example +16 -0
  73. package/templates/functions-supabase/supabase/functions/delete-account/index.ts.example +7 -0
  74. package/templates/functions-supabase/supabase/functions/get-custom-claims/index.ts.example +7 -0
  75. package/templates/functions-supabase/supabase/functions/get-user-auth-status/index.ts.example +7 -0
  76. package/templates/functions-supabase/supabase/functions/refresh-subscription-status/index.ts.example +7 -0
  77. package/templates/functions-supabase/supabase/functions/remove-custom-claims/index.ts.example +7 -0
  78. package/templates/functions-supabase/supabase/functions/set-custom-claims/index.ts.example +7 -0
  79. package/templates/functions-supabase/supabase/migrations/20250101000000_idempotency.sql +24 -0
  80. package/templates/functions-supabase/supabase/migrations/20250101000001_rate_limits.sql +22 -0
  81. package/templates/functions-supabase/supabase/migrations/20250101000002_cleanup_jobs.sql +28 -0
  82. package/templates/functions-supabase/supabase/migrations/20250101000003_operation_metrics.sql +28 -0
  83. package/templates/functions-vercel/functions-vercel/tsconfig.json.example +1 -1
  84. package/templates/functions-vercel/functions-vercel/vercel.json.example +1 -1
  85. package/templates/functions-vercel/vercel.json.example +1 -1
  86. package/templates/github/github/workflows/firebase-deploy.yml.example +1 -1
  87. package/templates/github/workflows/firebase-deploy.yml.example +1 -1
  88. package/templates/overlay-firebase/env.fragment.example +34 -0
  89. package/templates/overlay-firebase/env.fragment.expo.example +34 -0
  90. package/templates/overlay-firebase/env.fragment.nextjs.example +34 -0
  91. package/templates/overlay-firebase/src/config/providers.expo.ts.example +49 -0
  92. package/templates/overlay-firebase/src/config/providers.ts.example +23 -0
  93. package/templates/overlay-supabase/env.fragment.example +7 -0
  94. package/templates/overlay-supabase/env.fragment.expo.example +7 -0
  95. package/templates/overlay-supabase/env.fragment.nextjs.example +7 -0
  96. package/templates/overlay-supabase/src/config/providers.expo.ts.example +35 -0
  97. package/templates/overlay-supabase/src/config/providers.ts.example +33 -0
  98. package/templates/overlay-supabase/vercel.headers.example +23 -0
  99. package/templates/overlay-supabase/vercel.json.example +22 -0
  100. package/templates/overlay-vercel/env.fragment.example +34 -0
  101. package/templates/overlay-vercel/env.fragment.nextjs.example +34 -0
  102. package/templates/overlay-vercel/src/config/providers.ts.example +24 -0
  103. package/templates/root-consumer/.claude/agents/architect.md.example +2 -310
  104. package/templates/root-consumer/.claude/agents/builder.md.example +2 -326
  105. package/templates/root-consumer/.claude/agents/coder.md.example +2 -83
  106. package/templates/root-consumer/.claude/agents/extractor.md.example +2 -231
  107. package/templates/root-consumer/.claude/agents/polisher.md.example +2 -132
  108. package/templates/root-consumer/.claude/agents/prompt-engineer.md.example +2 -81
  109. package/templates/root-consumer/.claude/commands/grill.md.example +30 -0
  110. package/templates/root-consumer/.claude/commands/techdebt.md.example +28 -0
  111. package/templates/root-consumer/.clinerules.example +1 -0
  112. package/templates/root-consumer/.cursor/rules/no-docs.mdc.example +15 -0
  113. package/templates/root-consumer/.cursorrules.example +1 -0
  114. package/templates/root-consumer/.github/copilot-instructions.md.example +1 -0
  115. package/templates/root-consumer/.windsurfrules.example +1 -0
  116. package/templates/root-consumer/AI.md.example +29 -123
  117. package/templates/root-consumer/CLAUDE.md.example +1 -134
  118. package/templates/root-consumer/CONVENTIONS.md.example +1 -0
  119. package/templates/root-consumer/GEMINI.md.example +1 -0
  120. package/templates/root-consumer/firebase.json.example +1 -1
  121. package/templates/root-consumer/guides/dndev/AGENT_START_HERE.md.example +20 -0
  122. package/templates/root-consumer/guides/dndev/COMPONENTS_ADV.md.example +0 -18
  123. package/templates/root-consumer/guides/dndev/COMPONENTS_UI.md.example +1 -1
  124. package/templates/root-consumer/guides/dndev/ENV_SETUP.md.example +99 -30
  125. package/templates/root-consumer/guides/dndev/INDEX.md.example +3 -1
  126. package/templates/root-consumer/guides/dndev/SETUP_CRUD.md.example +143 -12
  127. package/templates/root-consumer/guides/dndev/SETUP_FIREBASE.md.example +9 -3
  128. package/templates/root-consumer/guides/dndev/SETUP_SOC2.md.example +234 -0
  129. package/templates/root-consumer/guides/dndev/SETUP_SUPABASE.md.example +124 -0
  130. package/templates/root-consumer/guides/dndev/SETUP_THEMES.md.example +6 -2
  131. package/templates/root-consumer/guides/dndev/SETUP_VERCEL.md.example +176 -0
  132. package/templates/root-consumer/guides/dndev/USE_ROUTING.md.example +5 -9
  133. package/templates/root-consumer/guides/dndev/essences_reference.css.example +174 -0
  134. package/templates/root-consumer/guides/wai-way/agents/builder.md.example +10 -0
  135. package/templates/root-consumer/guides/wai-way/agents/extractor.md.example +25 -5
  136. package/templates/root-consumer/guides/wai-way/agents/polisher.md.example +13 -2
  137. package/templates/root-consumer/guides/wai-way/blueprints/0_brainstorm.md.example +2 -2
  138. package/templates/root-consumer/guides/wai-way/blueprints/1_scaffold.md.example +47 -11
  139. package/templates/root-consumer/guides/wai-way/blueprints/3_compose.md.example +15 -4
  140. package/templates/root-consumer/guides/wai-way/spec_template.md.example +7 -6
  141. package/templates/app-payload/.env.example +0 -28
  142. package/templates/app-payload/README.md.example +0 -233
  143. package/templates/app-payload/collections/Company.ts.example +0 -125
  144. package/templates/app-payload/collections/Hero.ts.example +0 -62
  145. package/templates/app-payload/collections/Media.ts.example +0 -41
  146. package/templates/app-payload/collections/Products.ts.example +0 -115
  147. package/templates/app-payload/collections/Services.ts.example +0 -104
  148. package/templates/app-payload/collections/Testimonials.ts.example +0 -92
  149. package/templates/app-payload/collections/Users.ts.example +0 -35
  150. package/templates/app-payload/src/server.ts.example +0 -79
  151. package/templates/app-payload/tsconfig.json.example +0 -24
@@ -7215,11 +7215,39 @@ var init_PathResolver = __esm({
7215
7215
  });
7216
7216
 
7217
7217
  // packages/tooling/src/utils/errors.ts
7218
- var DoNotDevError;
7218
+ var DO_NOT_DEV_ERROR_CODES, DoNotDevError;
7219
7219
  var init_errors = __esm({
7220
7220
  "packages/tooling/src/utils/errors.ts"() {
7221
7221
  "use strict";
7222
7222
  init_utils();
7223
+ DO_NOT_DEV_ERROR_CODES = {
7224
+ CONFIGURATION_ERROR: "configuration-error",
7225
+ CONFIG_NOT_FOUND: "config-not-found",
7226
+ CONFIG_INVALID: "config-invalid",
7227
+ PATH_RESOLUTION_ERROR: "path-resolution-error",
7228
+ FILE_OPERATION_ERROR: "file-operation-error",
7229
+ FILE_NOT_FOUND: "file-not-found",
7230
+ PERMISSION_DENIED: "permission-denied",
7231
+ GENERATION_ERROR: "generation-error",
7232
+ TEMPLATE_ERROR: "template-error",
7233
+ TEMPLATE_NOT_FOUND: "template-not-found",
7234
+ CLI_EXECUTION_ERROR: "cli-execution-error",
7235
+ COMMAND_NOT_FOUND: "command-not-found",
7236
+ COMMAND_FAILED: "command-failed",
7237
+ VALIDATION_ERROR: "validation-error",
7238
+ SCHEMA_ERROR: "schema-error",
7239
+ DEPENDENCY_ERROR: "dependency-error",
7240
+ DEPENDENCY_NOT_FOUND: "dependency-not-found",
7241
+ DEPENDENCY_VERSION_ERROR: "dependency-version-error",
7242
+ INVALID_ARGUMENT: "invalid-argument",
7243
+ MISSING_ARGUMENT: "missing-argument",
7244
+ MISSING_PROJECT_ID: "missing-project-id",
7245
+ FIREBASE_CLI_ERROR: "firebase-cli-error",
7246
+ DEPLOYMENT_FAILED: "deployment-failed",
7247
+ OPERATION_CANCELLED: "operation-cancelled",
7248
+ TIMEOUT_ERROR: "timeout-error",
7249
+ UNKNOWN_ERROR: "unknown-error"
7250
+ };
7223
7251
  DoNotDevError = class _DoNotDevError extends Error {
7224
7252
  /** The error code categorizing this error */
7225
7253
  code;
@@ -7239,7 +7267,7 @@ var init_errors = __esm({
7239
7267
  * @param {Record<string, any>} [options.context] - Additional context data
7240
7268
  * @param {boolean} [options.displayable=true] - Whether this error should be displayed to the user
7241
7269
  */
7242
- constructor(message, code = "unknown-error", options) {
7270
+ constructor(message, code = DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR, options) {
7243
7271
  super(message);
7244
7272
  this.name = "DoNotDevError";
7245
7273
  this.code = code;
@@ -7270,7 +7298,7 @@ var init_errors = __esm({
7270
7298
  * @param {boolean} [options.displayable=true] - Whether this error should be displayed to the user
7271
7299
  * @returns {DoNotDevError} New DoNotDev error wrapping the original
7272
7300
  */
7273
- static from(error2, context, code = "unknown-error", options) {
7301
+ static from(error2, context, code = DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR, options) {
7274
7302
  if (!(error2 instanceof Error)) {
7275
7303
  return new _DoNotDevError(
7276
7304
  `Unknown error: ${String(error2)}`,
@@ -7307,21 +7335,21 @@ var init_errors = __esm({
7307
7335
  }
7308
7336
  const message = error2.message.toLowerCase();
7309
7337
  if (error2.name === "ValidationError" || message.includes("validation")) {
7310
- return "validation-error";
7338
+ return DO_NOT_DEV_ERROR_CODES.VALIDATION_ERROR;
7311
7339
  }
7312
7340
  if (message.includes("not found") || message.includes("no such file")) {
7313
- return "file-not-found";
7341
+ return DO_NOT_DEV_ERROR_CODES.FILE_NOT_FOUND;
7314
7342
  }
7315
7343
  if (message.includes("permission") || message.includes("access denied")) {
7316
- return "permission-denied";
7344
+ return DO_NOT_DEV_ERROR_CODES.PERMISSION_DENIED;
7317
7345
  }
7318
7346
  if (message.includes("timeout") || message.includes("timed out")) {
7319
- return "timeout-error";
7347
+ return DO_NOT_DEV_ERROR_CODES.TIMEOUT_ERROR;
7320
7348
  }
7321
7349
  if (message.includes("dependency") || message.includes("module not found")) {
7322
- return "dependency-error";
7350
+ return DO_NOT_DEV_ERROR_CODES.DEPENDENCY_ERROR;
7323
7351
  }
7324
- return "unknown-error";
7352
+ return DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR;
7325
7353
  }
7326
7354
  };
7327
7355
  }
@@ -7215,11 +7215,39 @@ var init_PathResolver = __esm({
7215
7215
  });
7216
7216
 
7217
7217
  // packages/tooling/src/utils/errors.ts
7218
- var DoNotDevError;
7218
+ var DO_NOT_DEV_ERROR_CODES, DoNotDevError;
7219
7219
  var init_errors = __esm({
7220
7220
  "packages/tooling/src/utils/errors.ts"() {
7221
7221
  "use strict";
7222
7222
  init_utils();
7223
+ DO_NOT_DEV_ERROR_CODES = {
7224
+ CONFIGURATION_ERROR: "configuration-error",
7225
+ CONFIG_NOT_FOUND: "config-not-found",
7226
+ CONFIG_INVALID: "config-invalid",
7227
+ PATH_RESOLUTION_ERROR: "path-resolution-error",
7228
+ FILE_OPERATION_ERROR: "file-operation-error",
7229
+ FILE_NOT_FOUND: "file-not-found",
7230
+ PERMISSION_DENIED: "permission-denied",
7231
+ GENERATION_ERROR: "generation-error",
7232
+ TEMPLATE_ERROR: "template-error",
7233
+ TEMPLATE_NOT_FOUND: "template-not-found",
7234
+ CLI_EXECUTION_ERROR: "cli-execution-error",
7235
+ COMMAND_NOT_FOUND: "command-not-found",
7236
+ COMMAND_FAILED: "command-failed",
7237
+ VALIDATION_ERROR: "validation-error",
7238
+ SCHEMA_ERROR: "schema-error",
7239
+ DEPENDENCY_ERROR: "dependency-error",
7240
+ DEPENDENCY_NOT_FOUND: "dependency-not-found",
7241
+ DEPENDENCY_VERSION_ERROR: "dependency-version-error",
7242
+ INVALID_ARGUMENT: "invalid-argument",
7243
+ MISSING_ARGUMENT: "missing-argument",
7244
+ MISSING_PROJECT_ID: "missing-project-id",
7245
+ FIREBASE_CLI_ERROR: "firebase-cli-error",
7246
+ DEPLOYMENT_FAILED: "deployment-failed",
7247
+ OPERATION_CANCELLED: "operation-cancelled",
7248
+ TIMEOUT_ERROR: "timeout-error",
7249
+ UNKNOWN_ERROR: "unknown-error"
7250
+ };
7223
7251
  DoNotDevError = class _DoNotDevError extends Error {
7224
7252
  /** The error code categorizing this error */
7225
7253
  code;
@@ -7239,7 +7267,7 @@ var init_errors = __esm({
7239
7267
  * @param {Record<string, any>} [options.context] - Additional context data
7240
7268
  * @param {boolean} [options.displayable=true] - Whether this error should be displayed to the user
7241
7269
  */
7242
- constructor(message, code = "unknown-error", options) {
7270
+ constructor(message, code = DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR, options) {
7243
7271
  super(message);
7244
7272
  this.name = "DoNotDevError";
7245
7273
  this.code = code;
@@ -7270,7 +7298,7 @@ var init_errors = __esm({
7270
7298
  * @param {boolean} [options.displayable=true] - Whether this error should be displayed to the user
7271
7299
  * @returns {DoNotDevError} New DoNotDev error wrapping the original
7272
7300
  */
7273
- static from(error2, context, code = "unknown-error", options) {
7301
+ static from(error2, context, code = DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR, options) {
7274
7302
  if (!(error2 instanceof Error)) {
7275
7303
  return new _DoNotDevError(
7276
7304
  `Unknown error: ${String(error2)}`,
@@ -7307,21 +7335,21 @@ var init_errors = __esm({
7307
7335
  }
7308
7336
  const message = error2.message.toLowerCase();
7309
7337
  if (error2.name === "ValidationError" || message.includes("validation")) {
7310
- return "validation-error";
7338
+ return DO_NOT_DEV_ERROR_CODES.VALIDATION_ERROR;
7311
7339
  }
7312
7340
  if (message.includes("not found") || message.includes("no such file")) {
7313
- return "file-not-found";
7341
+ return DO_NOT_DEV_ERROR_CODES.FILE_NOT_FOUND;
7314
7342
  }
7315
7343
  if (message.includes("permission") || message.includes("access denied")) {
7316
- return "permission-denied";
7344
+ return DO_NOT_DEV_ERROR_CODES.PERMISSION_DENIED;
7317
7345
  }
7318
7346
  if (message.includes("timeout") || message.includes("timed out")) {
7319
- return "timeout-error";
7347
+ return DO_NOT_DEV_ERROR_CODES.TIMEOUT_ERROR;
7320
7348
  }
7321
7349
  if (message.includes("dependency") || message.includes("module not found")) {
7322
- return "dependency-error";
7350
+ return DO_NOT_DEV_ERROR_CODES.DEPENDENCY_ERROR;
7323
7351
  }
7324
- return "unknown-error";
7352
+ return DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR;
7325
7353
  }
7326
7354
  };
7327
7355
  }
@@ -7511,11 +7511,39 @@ var init_PathResolver = __esm({
7511
7511
  });
7512
7512
 
7513
7513
  // packages/tooling/src/utils/errors.ts
7514
- var DoNotDevError;
7514
+ var DO_NOT_DEV_ERROR_CODES, DoNotDevError;
7515
7515
  var init_errors = __esm({
7516
7516
  "packages/tooling/src/utils/errors.ts"() {
7517
7517
  "use strict";
7518
7518
  init_utils();
7519
+ DO_NOT_DEV_ERROR_CODES = {
7520
+ CONFIGURATION_ERROR: "configuration-error",
7521
+ CONFIG_NOT_FOUND: "config-not-found",
7522
+ CONFIG_INVALID: "config-invalid",
7523
+ PATH_RESOLUTION_ERROR: "path-resolution-error",
7524
+ FILE_OPERATION_ERROR: "file-operation-error",
7525
+ FILE_NOT_FOUND: "file-not-found",
7526
+ PERMISSION_DENIED: "permission-denied",
7527
+ GENERATION_ERROR: "generation-error",
7528
+ TEMPLATE_ERROR: "template-error",
7529
+ TEMPLATE_NOT_FOUND: "template-not-found",
7530
+ CLI_EXECUTION_ERROR: "cli-execution-error",
7531
+ COMMAND_NOT_FOUND: "command-not-found",
7532
+ COMMAND_FAILED: "command-failed",
7533
+ VALIDATION_ERROR: "validation-error",
7534
+ SCHEMA_ERROR: "schema-error",
7535
+ DEPENDENCY_ERROR: "dependency-error",
7536
+ DEPENDENCY_NOT_FOUND: "dependency-not-found",
7537
+ DEPENDENCY_VERSION_ERROR: "dependency-version-error",
7538
+ INVALID_ARGUMENT: "invalid-argument",
7539
+ MISSING_ARGUMENT: "missing-argument",
7540
+ MISSING_PROJECT_ID: "missing-project-id",
7541
+ FIREBASE_CLI_ERROR: "firebase-cli-error",
7542
+ DEPLOYMENT_FAILED: "deployment-failed",
7543
+ OPERATION_CANCELLED: "operation-cancelled",
7544
+ TIMEOUT_ERROR: "timeout-error",
7545
+ UNKNOWN_ERROR: "unknown-error"
7546
+ };
7519
7547
  DoNotDevError = class _DoNotDevError extends Error {
7520
7548
  /** The error code categorizing this error */
7521
7549
  code;
@@ -7535,7 +7563,7 @@ var init_errors = __esm({
7535
7563
  * @param {Record<string, any>} [options.context] - Additional context data
7536
7564
  * @param {boolean} [options.displayable=true] - Whether this error should be displayed to the user
7537
7565
  */
7538
- constructor(message, code = "unknown-error", options) {
7566
+ constructor(message, code = DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR, options) {
7539
7567
  super(message);
7540
7568
  this.name = "DoNotDevError";
7541
7569
  this.code = code;
@@ -7566,7 +7594,7 @@ var init_errors = __esm({
7566
7594
  * @param {boolean} [options.displayable=true] - Whether this error should be displayed to the user
7567
7595
  * @returns {DoNotDevError} New DoNotDev error wrapping the original
7568
7596
  */
7569
- static from(error2, context, code = "unknown-error", options) {
7597
+ static from(error2, context, code = DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR, options) {
7570
7598
  if (!(error2 instanceof Error)) {
7571
7599
  return new _DoNotDevError(
7572
7600
  `Unknown error: ${String(error2)}`,
@@ -7603,21 +7631,21 @@ var init_errors = __esm({
7603
7631
  }
7604
7632
  const message = error2.message.toLowerCase();
7605
7633
  if (error2.name === "ValidationError" || message.includes("validation")) {
7606
- return "validation-error";
7634
+ return DO_NOT_DEV_ERROR_CODES.VALIDATION_ERROR;
7607
7635
  }
7608
7636
  if (message.includes("not found") || message.includes("no such file")) {
7609
- return "file-not-found";
7637
+ return DO_NOT_DEV_ERROR_CODES.FILE_NOT_FOUND;
7610
7638
  }
7611
7639
  if (message.includes("permission") || message.includes("access denied")) {
7612
- return "permission-denied";
7640
+ return DO_NOT_DEV_ERROR_CODES.PERMISSION_DENIED;
7613
7641
  }
7614
7642
  if (message.includes("timeout") || message.includes("timed out")) {
7615
- return "timeout-error";
7643
+ return DO_NOT_DEV_ERROR_CODES.TIMEOUT_ERROR;
7616
7644
  }
7617
7645
  if (message.includes("dependency") || message.includes("module not found")) {
7618
- return "dependency-error";
7646
+ return DO_NOT_DEV_ERROR_CODES.DEPENDENCY_ERROR;
7619
7647
  }
7620
- return "unknown-error";
7648
+ return DO_NOT_DEV_ERROR_CODES.UNKNOWN_ERROR;
7621
7649
  }
7622
7650
  };
7623
7651
  }
@@ -7659,6 +7687,34 @@ var init_pathResolver = __esm({
7659
7687
  }
7660
7688
  });
7661
7689
 
7690
+ // packages/tooling/src/utils/typed-file-operations.ts
7691
+ function readPackageJson(filePath) {
7692
+ if (!pathExists(filePath)) {
7693
+ throw new DoNotDevError(
7694
+ `package.json not found: ${filePath}`,
7695
+ DO_NOT_DEV_ERROR_CODES.FILE_NOT_FOUND,
7696
+ { context: { filePath } }
7697
+ );
7698
+ }
7699
+ const content = readSync(filePath, { format: "json" });
7700
+ if (!content || typeof content !== "object" || !("name" in content)) {
7701
+ throw new DoNotDevError(
7702
+ `Invalid package.json: ${filePath}`,
7703
+ DO_NOT_DEV_ERROR_CODES.CONFIG_INVALID,
7704
+ { context: { filePath } }
7705
+ );
7706
+ }
7707
+ return content;
7708
+ }
7709
+ var init_typed_file_operations = __esm({
7710
+ "packages/tooling/src/utils/typed-file-operations.ts"() {
7711
+ "use strict";
7712
+ init_utils();
7713
+ init_pathResolver();
7714
+ init_errors();
7715
+ }
7716
+ });
7717
+
7662
7718
  // packages/tooling/src/bundler/utils.ts
7663
7719
  import { Buffer as Buffer2 } from "node:buffer";
7664
7720
  import { readFileSync as readFileSync2, writeFileSync as writeFileSync2, mkdirSync as mkdirSync2 } from "node:fs";
@@ -7702,6 +7758,7 @@ init_dist2();
7702
7758
  // packages/tooling/src/utils/app-detection.ts
7703
7759
  init_utils();
7704
7760
  init_pathResolver();
7761
+ init_typed_file_operations();
7705
7762
  function detectApps(projectRoot) {
7706
7763
  const apps = [];
7707
7764
  const appsDir = joinPath(projectRoot, "apps");
@@ -7722,9 +7779,7 @@ function detectApps(projectRoot) {
7722
7779
  const packageJsonPath = joinPath(projectRoot, "package.json");
7723
7780
  if (pathExists(packageJsonPath)) {
7724
7781
  try {
7725
- const packageJson = readSync(packageJsonPath, {
7726
- format: "json"
7727
- });
7782
+ const packageJson = readPackageJson(packageJsonPath);
7728
7783
  if (packageJson && (packageJson.dependencies?.vite || packageJson.devDependencies?.vite || packageJson.dependencies?.next || packageJson.devDependencies?.next)) {
7729
7784
  const pathParts = projectRoot.split(/[/\\]/);
7730
7785
  const appName = pathParts[pathParts.length - 1] || "app";
@@ -7744,10 +7799,10 @@ function analyzeApp(appPath, appName) {
7744
7799
  if (!pathExists(packageJsonPath)) {
7745
7800
  return null;
7746
7801
  }
7747
- let packageJson;
7802
+ let packageJson = null;
7748
7803
  try {
7749
- packageJson = readSync(packageJsonPath, { format: "json" });
7750
- if (!packageJson) {
7804
+ packageJson = readPackageJson(packageJsonPath);
7805
+ if (!packageJson.name) {
7751
7806
  return null;
7752
7807
  }
7753
7808
  } catch {
@@ -7762,14 +7817,14 @@ function analyzeApp(appPath, appName) {
7762
7817
  const functionsPath = joinPath(appPath, "functions");
7763
7818
  const functionsStat = statSync2(functionsPath);
7764
7819
  const hasFunctions = pathExists(functionsPath) && (functionsStat?.isDirectory() ?? false);
7765
- let platform;
7820
+ let platform2;
7766
7821
  if (hasFunctions) {
7767
7822
  const firebaseJsonPath = joinPath(functionsPath, "firebase.json");
7768
7823
  const vercelJsonPath = joinPath(appPath, "vercel.json");
7769
7824
  if (pathExists(firebaseJsonPath)) {
7770
- platform = "firebase";
7825
+ platform2 = "firebase";
7771
7826
  } else if (pathExists(vercelJsonPath)) {
7772
- platform = "vercel";
7827
+ platform2 = "vercel";
7773
7828
  }
7774
7829
  }
7775
7830
  return {
@@ -7780,7 +7835,7 @@ function analyzeApp(appPath, appName) {
7780
7835
  framework,
7781
7836
  hasFunctions,
7782
7837
  functionsPath: hasFunctions ? functionsPath : void 0,
7783
- platform
7838
+ platform: platform2
7784
7839
  };
7785
7840
  }
7786
7841
 
@@ -7832,10 +7887,21 @@ function createAppEnv(appPath) {
7832
7887
 
7833
7888
  // packages/tooling/src/apps/preview.ts
7834
7889
  init_utils();
7835
- import { spawnSync as spawnSync2 } from "node:child_process";
7890
+ import {
7891
+ spawn,
7892
+ spawnSync as spawnSync2,
7893
+ execSync as execSync2
7894
+ } from "node:child_process";
7895
+ import { platform } from "node:os";
7836
7896
  init_cli_output();
7837
7897
  init_errors();
7838
7898
  init_pathResolver();
7899
+ var SIGNAL_EXIT_CODES = {
7900
+ SIGINT: 130,
7901
+ // 128 + 2
7902
+ SIGTERM: 143
7903
+ // 128 + 15
7904
+ };
7839
7905
  async function main() {
7840
7906
  const args = process.argv.slice(2);
7841
7907
  const appName = args[0] && args[0] !== "preview" ? args[0] : void 0;
@@ -7872,12 +7938,65 @@ async function main() {
7872
7938
  log.info(`Previewing ${app.name}...
7873
7939
  `);
7874
7940
  const turboArgs = ["preview", "--filter", app.packageName];
7875
- const result = spawnSync2("bunx", ["turbo", ...turboArgs], {
7941
+ const isWindows = platform() === "win32";
7942
+ const childProcess = spawn("bunx", ["turbo", ...turboArgs], {
7876
7943
  stdio: "inherit",
7877
7944
  env: createAppEnv(app.path),
7878
- cwd: projectRoot
7945
+ cwd: projectRoot,
7946
+ shell: isWindows
7947
+ });
7948
+ const cleanup = (signal) => {
7949
+ if (!childProcess.pid) return;
7950
+ log.debug(`Received ${signal}, cleaning up processes...`);
7951
+ if (isWindows) {
7952
+ try {
7953
+ execSync2(`taskkill /F /T /PID ${childProcess.pid}`, {
7954
+ stdio: "ignore",
7955
+ timeout: 2e3
7956
+ });
7957
+ } catch {
7958
+ }
7959
+ } else {
7960
+ try {
7961
+ process.kill(childProcess.pid, signal);
7962
+ } catch {
7963
+ }
7964
+ try {
7965
+ execSync2(`pkill -P ${childProcess.pid}`, {
7966
+ stdio: "ignore",
7967
+ timeout: 1e3
7968
+ });
7969
+ } catch {
7970
+ }
7971
+ }
7972
+ };
7973
+ const signals = ["SIGINT", "SIGTERM"];
7974
+ const handlers = [];
7975
+ for (const signal of signals) {
7976
+ const handler = () => {
7977
+ cleanup(signal);
7978
+ handlers.forEach((h2) => h2());
7979
+ process.exit(SIGNAL_EXIT_CODES[signal] ?? 130);
7980
+ };
7981
+ process.on(signal, handler);
7982
+ handlers.push(() => process.removeListener(signal, handler));
7983
+ }
7984
+ return new Promise((resolve4) => {
7985
+ childProcess.on("exit", (code, signal) => {
7986
+ handlers.forEach((h2) => h2());
7987
+ if (signal) {
7988
+ log.debug(`Process killed by signal: ${signal}`);
7989
+ resolve4(SIGNAL_EXIT_CODES[signal] ?? 130);
7990
+ } else {
7991
+ resolve4(code ?? 0);
7992
+ }
7993
+ });
7994
+ childProcess.on("error", (error2) => {
7995
+ handlers.forEach((h2) => h2());
7996
+ log.error(`Failed to start preview server: ${error2.message}`);
7997
+ resolve4(1);
7998
+ });
7879
7999
  });
7880
- return result.status || 0;
7881
8000
  }
7882
8001
  export {
7883
8002
  main
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Supabase Setup Command Wrapper
3
+ * @description Re-exports supabaseSetup from tooling for CLI bundling.
4
+ */
5
+ export { supabaseSetup as main } from '@donotdev/tooling';
6
+ //# sourceMappingURL=supabase-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-setup.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/supabase-setup.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // packages/cli/src/bin/commands/supabase-setup.ts
2
+ /**
3
+ * @fileoverview Supabase Setup Command Wrapper
4
+ * @description Re-exports supabaseSetup from tooling for CLI bundling.
5
+ */
6
+ export { supabaseSetup as main } from '@donotdev/tooling';
7
+ //# sourceMappingURL=supabase-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase-setup.js","sourceRoot":"","sources":["../../../src/bin/commands/supabase-setup.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD;;;GAGG;AAEH,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,MAAM,mBAAmB,CAAC"}