@donotdev/cli 0.0.12 → 0.0.13

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 (67) hide show
  1. package/dependencies-matrix.json +30 -116
  2. package/dist/bin/commands/bump.js +33 -7
  3. package/dist/bin/commands/create-project.js +43 -7
  4. package/dist/bin/commands/deploy.js +7606 -17
  5. package/dist/bin/commands/firebase-setup.d.ts +6 -0
  6. package/dist/bin/commands/firebase-setup.d.ts.map +1 -0
  7. package/dist/bin/commands/firebase-setup.js +7 -0
  8. package/dist/bin/commands/firebase-setup.js.map +1 -0
  9. package/dist/bin/commands/staging.d.ts +11 -0
  10. package/dist/bin/commands/staging.d.ts.map +1 -0
  11. package/dist/bin/commands/staging.js +12 -0
  12. package/dist/bin/commands/staging.js.map +1 -0
  13. package/dist/bin/dndev.js +28 -3
  14. package/dist/bin/donotdev.js +28 -3
  15. package/dist/index.d.ts +1 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +7671 -39
  18. package/dist/index.js.map +1 -1
  19. package/package.json +1 -1
  20. package/templates/app-demo/src/pages/DetailPage.tsx.example +1 -1
  21. package/templates/app-demo/src/pages/FullPage.tsx.example +3 -3
  22. package/templates/app-demo/src/pages/HomePage.tsx.example +1 -1
  23. package/templates/app-demo/src/pages/components/ComponentRenderer.tsx.example +5 -5
  24. package/templates/app-demo/src/pages/components/DemoLayout.tsx.example +3 -3
  25. package/templates/app-next/.env.example +2 -0
  26. package/templates/app-next/src/pages/HomePage.tsx.example +1 -1
  27. package/templates/app-vite/.env.example +2 -0
  28. package/templates/app-vite/src/pages/HomePage.tsx.example +163 -73
  29. package/templates/functions-firebase/build.mjs.example +26 -10
  30. package/templates/functions-firebase/functions-firebase/build.mjs.example +26 -10
  31. package/templates/functions-firebase/functions.config.js.example +11 -15
  32. package/templates/github-consumer/.github/workflows/ci.yml.example +36 -0
  33. package/templates/root-consumer/.claude/agents/architect.md.example +2 -2
  34. package/templates/root-consumer/.claude/agents/builder.md.example +2 -2
  35. package/templates/root-consumer/.claude/agents/coder.md.example +2 -2
  36. package/templates/root-consumer/.claude/agents/extractor.md.example +2 -3
  37. package/templates/root-consumer/.claude/agents/polisher.md.example +67 -291
  38. package/templates/root-consumer/.claude/agents/prompt-engineer.md.example +4 -4
  39. package/templates/root-consumer/.claude/commands/build.md.example +2 -2
  40. package/templates/root-consumer/.claude/commands/polish.md.example +65 -81
  41. package/templates/root-consumer/.env.example +13 -13
  42. package/templates/root-consumer/.gemini/settings.json.example +9 -0
  43. package/templates/root-consumer/.gitignore.example +3 -1
  44. package/templates/root-consumer/AI.md.example +139 -0
  45. package/templates/root-consumer/CLAUDE.md.example +13 -104
  46. package/templates/root-consumer/README.md.example +81 -255
  47. package/templates/root-consumer/entities/Contact.ts.example +126 -0
  48. package/templates/root-consumer/entities/index.ts.example +6 -3
  49. package/templates/root-consumer/guides/dndev/AGENT_START_HERE.md.example +41 -342
  50. package/templates/root-consumer/guides/dndev/COMPONENTS_ADV.md.example +2 -1
  51. package/templates/root-consumer/guides/dndev/ENV_SETUP.md.example +144 -9
  52. package/templates/root-consumer/guides/dndev/INDEX.md.example +9 -0
  53. package/templates/root-consumer/guides/dndev/SETUP_APP_CONFIG.md.example +13 -16
  54. package/templates/root-consumer/guides/dndev/SETUP_BLOG.md.example +263 -0
  55. package/templates/root-consumer/guides/dndev/SETUP_CRUD.md.example +1 -1
  56. package/templates/root-consumer/guides/dndev/SETUP_FIREBASE.md.example +168 -0
  57. package/templates/root-consumer/guides/dndev/SETUP_FUNCTIONS.md.example +5 -12
  58. package/templates/root-consumer/guides/dndev/SETUP_TESTING.md.example +184 -0
  59. package/templates/root-consumer/guides/wai-way/WAI_WAY_CLI.md.example +134 -69
  60. package/templates/root-consumer/guides/wai-way/agents/polisher.md.example +66 -44
  61. package/templates/root-consumer/guides/wai-way/blueprints/0_brainstorm.md.example +18 -1
  62. package/templates/root-consumer/guides/wai-way/blueprints/1_scaffold.md.example +1 -0
  63. package/templates/root-consumer/guides/wai-way/blueprints/2_entities.md.example +2 -1
  64. package/templates/root-consumer/guides/wai-way/blueprints/3_compose.md.example +2 -1
  65. package/templates/root-consumer/guides/wai-way/blueprints/4_configure.md.example +180 -108
  66. package/templates/root-consumer/guides/wai-way/context_map.json.example +8 -7
  67. package/templates/root-consumer/guides/wai-way/page_patterns.md.example +4 -4
@@ -390,29 +390,12 @@
390
390
  "lucide-react",
391
391
  "monitoring"
392
392
  ],
393
- "dependencies": [
394
- "i18n",
395
- "react-query",
396
- "fast-glob",
397
- "cli-prompts"
398
- ],
399
- "devDependencies": [
400
- "vite",
401
- "next",
402
- "typescript"
403
- ]
393
+ "dependencies": ["i18n", "react-query", "fast-glob", "cli-prompts"],
394
+ "devDependencies": ["vite", "next", "typescript"]
404
395
  },
405
396
  "@donotdev/components": {
406
- "dependencies": [
407
- "radix",
408
- "styling",
409
- "react-day-picker"
410
- ],
411
- "peerDependencies": [
412
- "react",
413
- "shiki",
414
- "lucide-react"
415
- ],
397
+ "dependencies": ["radix", "styling", "react-day-picker"],
398
+ "peerDependencies": ["react", "shiki", "lucide-react"],
416
399
  "peerDependenciesMeta": {
417
400
  "shiki": {
418
401
  "optional": true
@@ -428,10 +411,7 @@
428
411
  "routing",
429
412
  "validation"
430
413
  ],
431
- "dependencies": [
432
- "forms",
433
- "seo"
434
- ],
414
+ "dependencies": ["forms", "seo"],
435
415
  "peerDependenciesMeta": {
436
416
  "@donotdev/crud": {
437
417
  "optional": true
@@ -439,17 +419,10 @@
439
419
  }
440
420
  },
441
421
  "@donotdev/auth": {
442
- "peerDependencies": [
443
- "react",
444
- "firebase"
445
- ]
422
+ "peerDependencies": ["react", "firebase"]
446
423
  },
447
424
  "@donotdev/billing": {
448
- "peerDependencies": [
449
- "react",
450
- "lucide-react",
451
- "stripe"
452
- ]
425
+ "peerDependencies": ["react", "lucide-react", "stripe"]
453
426
  },
454
427
  "@donotdev/crud": {
455
428
  "dependencies": [
@@ -459,9 +432,7 @@
459
432
  "@dnd-kit",
460
433
  "forms-resolvers"
461
434
  ],
462
- "devDependencies": [
463
- "tiptap"
464
- ],
435
+ "devDependencies": ["tiptap"],
465
436
  "peerDependencies": [
466
437
  "@donotdev/firebase",
467
438
  "react",
@@ -478,30 +449,18 @@
478
449
  }
479
450
  },
480
451
  "@donotdev/firebase": {
481
- "dependencies": [
482
- "browser-image-compression"
483
- ],
484
- "peerDependencies": [
485
- "firebase"
486
- ]
452
+ "dependencies": ["browser-image-compression"],
453
+ "peerDependencies": ["firebase"]
487
454
  },
488
455
  "@donotdev/i18n": {
489
- "dependencies": [
490
- "i18n"
491
- ],
492
- "peerDependencies": [
493
- "lucide-react"
494
- ]
456
+ "dependencies": ["i18n"],
457
+ "peerDependencies": ["lucide-react"]
495
458
  },
496
459
  "@donotdev/stores": {
497
- "dependencies": [
498
- "zustand"
499
- ]
460
+ "dependencies": ["zustand"]
500
461
  },
501
462
  "@donotdev/schemas": {
502
- "dependencies": [
503
- "validation"
504
- ]
463
+ "dependencies": ["validation"]
505
464
  },
506
465
  "@donotdev/types": {
507
466
  "devDependencies": [
@@ -513,34 +472,18 @@
513
472
  ]
514
473
  },
515
474
  "@donotdev/utils": {
516
- "dependencies": [
517
- "zustand"
518
- ],
519
- "peerDependencies": [
520
- "monitoring"
521
- ],
522
- "devDependencies": [
523
- "validation",
524
- "firebase",
525
- "i18n"
526
- ]
475
+ "dependencies": ["zustand"],
476
+ "peerDependencies": ["monitoring"],
477
+ "devDependencies": ["validation", "firebase", "i18n"]
527
478
  },
528
479
  "@donotdev/hooks": {
529
- "dependencies": [
530
- "react-query"
531
- ]
480
+ "dependencies": ["react-query"]
532
481
  },
533
482
  "@donotdev/cli": {
534
- "dependencies": [
535
- "cli-prompts",
536
- "cli-commander",
537
- "fast-glob"
538
- ]
483
+ "dependencies": ["cli-prompts", "cli-commander", "fast-glob"]
539
484
  },
540
485
  "@donotdev/mcp-server": {
541
- "dependencies": [
542
- "mcp-sdk"
543
- ]
486
+ "dependencies": ["mcp-sdk"]
544
487
  },
545
488
  "@donotdev/tooling": {
546
489
  "dependencies": [
@@ -550,19 +493,13 @@
550
493
  "esbuild",
551
494
  "rollup"
552
495
  ],
553
- "devDependencies": [
554
- "yaml"
555
- ]
496
+ "devDependencies": ["yaml"]
556
497
  },
557
498
  "@donotdev/oauth": {
558
- "peerDependencies": [
559
- "react"
560
- ]
499
+ "peerDependencies": ["react"]
561
500
  },
562
501
  "@donotdev/functions": {
563
- "dependencies": [
564
- "@donotdev/core"
565
- ],
502
+ "dependencies": ["@donotdev/core"],
566
503
  "peerDependencies": [
567
504
  "firebase-functions",
568
505
  "stripe",
@@ -572,10 +509,7 @@
572
509
  ]
573
510
  },
574
511
  "@donotdev/adv-comps": {
575
- "peerDependencies": [
576
- "react",
577
- "shiki"
578
- ],
512
+ "peerDependencies": ["react", "shiki"],
579
513
  "dependencies": [],
580
514
  "peerDependenciesMeta": {
581
515
  "shiki": {
@@ -712,9 +646,7 @@
712
646
  "lucide-react",
713
647
  "firebase"
714
648
  ],
715
- "devDependencies": [
716
- "root-consumer-tooling"
717
- ]
649
+ "devDependencies": ["root-consumer-tooling"]
718
650
  },
719
651
  "consumer-vite": {
720
652
  "description": "Vite app for consumers (filter inlined packages)",
@@ -738,13 +670,7 @@
738
670
  "i18n",
739
671
  "react-query"
740
672
  ],
741
- "devDependencies": [
742
- "vite",
743
- "typescript",
744
- "types",
745
- "vite-deps",
746
- "postcss"
747
- ]
673
+ "devDependencies": ["vite", "typescript", "types", "vite-deps", "postcss"]
748
674
  },
749
675
  "consumer-nextjs": {
750
676
  "description": "Nextjs app for consumers (filter inlined packages)",
@@ -767,12 +693,7 @@
767
693
  "i18n",
768
694
  "react-query"
769
695
  ],
770
- "devDependencies": [
771
- "next",
772
- "typescript",
773
- "types",
774
- "postcss"
775
- ]
696
+ "devDependencies": ["next", "typescript", "types", "postcss"]
776
697
  },
777
698
  "functions-firebase": {
778
699
  "description": "Firebase Functions app",
@@ -795,19 +716,12 @@
795
716
  "monitoring-node",
796
717
  "stripe"
797
718
  ],
798
- "devDependencies": [
799
- "vercel"
800
- ]
719
+ "devDependencies": ["vercel"]
801
720
  },
802
721
  "entities": {
803
722
  "description": "Entities workspace package",
804
- "dependencies": [
805
- "validation"
806
- ],
807
- "devDependencies": [
808
- "eslint",
809
- "typescript"
810
- ]
723
+ "dependencies": ["validation"],
724
+ "devDependencies": ["eslint", "typescript"]
811
725
  },
812
726
  "demo": {
813
727
  "description": "Demo app template (components only)",
@@ -8082,7 +8082,10 @@ function getSourceTemplatesPath() {
8082
8082
  async function syncFile(sourcePath, destPath, preserveIfExists, appRoot) {
8083
8083
  const destPathWithoutExample = destPath.endsWith(".example") ? destPath.slice(0, -8) : destPath;
8084
8084
  if (preserveIfExists && pathExists(destPathWithoutExample)) {
8085
- const relativePath = getRelativePathBetween(appRoot, destPathWithoutExample);
8085
+ const relativePath = getRelativePathBetween(
8086
+ appRoot,
8087
+ destPathWithoutExample
8088
+ );
8086
8089
  log.info(`Preserving user-customized file: ${relativePath}`);
8087
8090
  return false;
8088
8091
  }
@@ -8169,7 +8172,11 @@ async function syncTemplates(sourceRoot, destRoot, dryRun) {
8169
8172
  errors++;
8170
8173
  log.error(
8171
8174
  `Error syncing pattern ${pattern}:`,
8172
- DoNotDevError.from(error2, `Failed to sync ${pattern}`, "file-operation-error")
8175
+ DoNotDevError.from(
8176
+ error2,
8177
+ `Failed to sync ${pattern}`,
8178
+ "file-operation-error"
8179
+ )
8173
8180
  );
8174
8181
  }
8175
8182
  }
@@ -8205,7 +8212,9 @@ async function syncDocumentation(options = {}) {
8205
8212
  log.info(`
8206
8213
  [DRY RUN] Would sync ${result.synced} file(s)`);
8207
8214
  if (result.preserved > 0) {
8208
- log.info(`[DRY RUN] Would preserve ${result.preserved} user-customized file(s)`);
8215
+ log.info(
8216
+ `[DRY RUN] Would preserve ${result.preserved} user-customized file(s)`
8217
+ );
8209
8218
  }
8210
8219
  log.info("[DRY RUN] No files modified");
8211
8220
  } else {
@@ -8291,9 +8300,21 @@ async function main(options = {}) {
8291
8300
  updateDocs = true;
8292
8301
  } else {
8293
8302
  const choices = [
8294
- { title: "Update packages", value: "packages", hint: "Update @donotdev/* packages and dependencies" },
8295
- { title: "Sync documentation", value: "docs", hint: "Sync guides, commands, and agents from framework" },
8296
- { title: "Both", value: "both", hint: "Update packages and sync documentation" }
8303
+ {
8304
+ title: "Update packages",
8305
+ value: "packages",
8306
+ hint: "Update @donotdev/* packages and dependencies"
8307
+ },
8308
+ {
8309
+ title: "Sync documentation",
8310
+ value: "docs",
8311
+ hint: "Sync guides, commands, and agents from framework"
8312
+ },
8313
+ {
8314
+ title: "Both",
8315
+ value: "both",
8316
+ hint: "Update packages and sync documentation"
8317
+ }
8297
8318
  ];
8298
8319
  const selection = await askForSelection(
8299
8320
  "What would you like to update?",
@@ -8376,7 +8397,12 @@ async function main(options = {}) {
8376
8397
  if (updates.length === 0 && majorUpdates.length === 0) {
8377
8398
  log.success("All packages up to date!");
8378
8399
  } else {
8379
- await handlePackageUpdates(updates, majorUpdates, appRoot, dryRun || false);
8400
+ await handlePackageUpdates(
8401
+ updates,
8402
+ majorUpdates,
8403
+ appRoot,
8404
+ dryRun || false
8405
+ );
8380
8406
  }
8381
8407
  }
8382
8408
  }
@@ -9267,6 +9267,17 @@ function detectExecutionMode2() {
9267
9267
  async function main(options) {
9268
9268
  try {
9269
9269
  Ie("\u{1F680} DoNotDev Project Creator");
9270
+ try {
9271
+ const { execSync } = await import("node:child_process");
9272
+ execSync("bun --version", { stdio: "ignore" });
9273
+ } catch {
9274
+ log.error("bun is required but not installed.");
9275
+ Me(
9276
+ "Install bun:\n\n curl -fsSL https://bun.sh/install | bash\n\nThen re-run: dndev init",
9277
+ "Missing dependency"
9278
+ );
9279
+ process.exit(1);
9280
+ }
9270
9281
  if (SHOW_WIP2) {
9271
9282
  Me("WIP mode enabled - showing experimental features", "\u{1F527} Debug");
9272
9283
  }
@@ -9517,6 +9528,10 @@ async function main(options) {
9517
9528
  };
9518
9529
  }
9519
9530
  }
9531
+ const setupGithubActions = await askForConfirmation(
9532
+ "Set up GitHub Actions CI/CD?",
9533
+ true
9534
+ );
9520
9535
  const s = Y2();
9521
9536
  if (!isMergeMode) {
9522
9537
  s.start("Creating project structure...");
@@ -9528,6 +9543,21 @@ async function main(options) {
9528
9543
  joinPath(entitiesDir, "index.ts"),
9529
9544
  "// entities/index.ts\n// Add your entity files here\n// Entities are shared between frontend and backend\n"
9530
9545
  );
9546
+ const geminiDir = joinPath(projectDirNormalized, ".gemini");
9547
+ await ensureDir(geminiDir);
9548
+ const geminiSettings = {
9549
+ mcpServers: {
9550
+ donotdev: {
9551
+ command: "npx",
9552
+ args: ["-y", "@donotdev/mcp-server@latest"],
9553
+ trust: true
9554
+ }
9555
+ }
9556
+ };
9557
+ await write(joinPath(geminiDir, "settings.json"), geminiSettings, {
9558
+ format: "json",
9559
+ overwrite: true
9560
+ });
9531
9561
  const entitiesPackageJson = generatePackageJson(
9532
9562
  "entities",
9533
9563
  executionMode
@@ -9557,7 +9587,7 @@ async function main(options) {
9557
9587
  projectName,
9558
9588
  appNames: isMergeMode ? allAppNames : appNames,
9559
9589
  includeFunctions: anyAppNeedsBackend,
9560
- setupGithubActions: false,
9590
+ setupGithubActions,
9561
9591
  monorepoRelativePath: relativeMonorepoPath,
9562
9592
  appTemplate: "vite",
9563
9593
  isNextjs: false,
@@ -9597,6 +9627,10 @@ async function main(options) {
9597
9627
  await replacePlaceholders(destPath, rootReplacements);
9598
9628
  }
9599
9629
  }
9630
+ if (setupGithubActions) {
9631
+ const ciTemplateDir = joinPath(templatesRoot, "github-consumer");
9632
+ await copyTemplateFiles(ciTemplateDir, projectDirNormalized, rootReplacements);
9633
+ }
9600
9634
  s.stop("Project structure created");
9601
9635
  } else {
9602
9636
  s.start("Merging root files...");
@@ -9704,14 +9738,16 @@ async function main(options) {
9704
9738
  Se("\u{1F389} Project created successfully!");
9705
9739
  const cdCommand = executionMode === "development" ? `cd ../${projectName}` : `cd ${projectName}`;
9706
9740
  Me(
9707
- `Next steps:
9708
-
9709
- 1. ${cdCommand}
9741
+ `1. ${cdCommand}
9710
9742
  2. bun install
9711
- 3. dndev dev
9712
- ` + (anyAppNeedsBackend ? `4. dndev emu (to run with emulators)
9743
+ 3. Open the project in your IDE (Cursor, VS Code, etc.)
9744
+ 4. Tell your AI agent: "Read AI.md and build my app"
9745
+
9746
+ That's it. The agent handles the rest.
9713
9747
 
9714
- ` : "\n") + `Enjoy the ride!`,
9748
+ ` + (anyAppNeedsBackend ? `Dev server: dndev dev | With emulators: dndev emu
9749
+ ` : `Dev server: dndev dev
9750
+ `) + `AI setup: dndev agent (re-configure MCP if needed)`,
9715
9751
  "\u{1F4CB} Next Steps"
9716
9752
  );
9717
9753
  } catch (error2) {