@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.
- package/dependencies-matrix.json +356 -88
- package/dist/bin/commands/agent-setup.js +7 -1
- package/dist/bin/commands/build.js +118 -38
- package/dist/bin/commands/bump.js +74 -28
- package/dist/bin/commands/cacheout.js +37 -9
- package/dist/bin/commands/create-app.js +222 -115
- package/dist/bin/commands/create-project.js +455 -140
- package/dist/bin/commands/deploy.js +1736 -697
- package/dist/bin/commands/dev.js +138 -23
- package/dist/bin/commands/emu.js +215 -58
- package/dist/bin/commands/format.js +37 -9
- package/dist/bin/commands/lint.js +37 -9
- package/dist/bin/commands/preview.js +142 -23
- package/dist/bin/commands/supabase-setup.d.ts +6 -0
- package/dist/bin/commands/supabase-setup.d.ts.map +1 -0
- package/dist/bin/commands/supabase-setup.js +7 -0
- package/dist/bin/commands/supabase-setup.js.map +1 -0
- package/dist/bin/commands/sync-secrets.js +211 -34
- package/dist/bin/commands/type-check.d.ts +14 -0
- package/dist/bin/commands/type-check.d.ts.map +1 -0
- package/dist/bin/commands/type-check.js +314 -0
- package/dist/bin/commands/type-check.js.map +1 -0
- package/dist/bin/commands/wai.js +3 -1
- package/dist/bin/dndev.js +27 -2
- package/dist/bin/donotdev.js +27 -2
- package/dist/index.js +3960 -3015
- package/package.json +2 -2
- package/templates/app-demo/src/App.tsx.example +1 -0
- package/templates/app-demo/src/pages/FullPage.tsx.example +2 -2
- package/templates/app-demo/src/pages/components/DemoLayout.tsx.example +2 -2
- package/templates/app-demo/src/themes.css.example +5 -12
- package/templates/app-expo/.env.example +64 -0
- package/templates/app-expo/.expo/README.md.example +5 -0
- package/templates/app-expo/.gitignore.example +36 -0
- package/templates/app-expo/README.md.example +58 -0
- package/templates/app-expo/app/.gitkeep +2 -0
- package/templates/app-expo/app/_layout.tsx.example +41 -0
- package/templates/app-expo/app/form.tsx.example +52 -0
- package/templates/app-expo/app/index.tsx.example +89 -0
- package/templates/app-expo/app/list.tsx.example +32 -0
- package/templates/app-expo/app/profile.tsx.example +76 -0
- package/templates/app-expo/app/signin.tsx.example +53 -0
- package/templates/app-expo/app.json.example +39 -0
- package/templates/app-expo/babel.config.js.example +10 -0
- package/templates/app-expo/eas.json.example +20 -0
- package/templates/app-expo/expo-env.d.ts.example +4 -0
- package/templates/app-expo/metro.config.js.example +20 -0
- package/templates/app-expo/service-account-key.json.example +12 -0
- package/templates/app-expo/tsconfig.json.example +19 -0
- package/templates/app-next/.env.example +4 -33
- package/templates/app-next/src/app/ClientLayout.tsx.example +2 -0
- package/templates/app-next/src/app/layout.tsx.example +7 -6
- package/templates/app-next/src/globals.css.example +2 -11
- package/templates/app-next/src/pages/HomePage.tsx.example +1 -1
- package/templates/app-next/src/themes.css.example +10 -13
- package/templates/app-vite/.env.example +3 -32
- package/templates/app-vite/index.html.example +2 -24
- package/templates/app-vite/src/App.tsx.example +2 -0
- package/templates/app-vite/src/globals.css.example +2 -12
- package/templates/app-vite/src/pages/FormPageExample.tsx.example +1 -2
- package/templates/app-vite/src/pages/HomePage.tsx.example +1 -1
- package/templates/app-vite/src/themes.css.example +109 -79
- package/templates/app-vite/vercel.json.example +11 -0
- package/templates/functions-firebase/build.mjs.example +2 -72
- package/templates/functions-firebase/functions-firebase/.env.example.example +23 -25
- package/templates/functions-firebase/functions-firebase/build.mjs.example +2 -72
- package/templates/functions-firebase/functions-firebase/tsconfig.json.example +1 -1
- package/templates/functions-supabase/supabase/functions/cancel-subscription/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/change-plan/index.ts.example +11 -0
- package/templates/functions-supabase/supabase/functions/create-checkout-session/index.ts.example +11 -0
- package/templates/functions-supabase/supabase/functions/create-customer-portal/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/crud/index.ts.example +16 -0
- package/templates/functions-supabase/supabase/functions/delete-account/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/get-custom-claims/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/get-user-auth-status/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/refresh-subscription-status/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/remove-custom-claims/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/functions/set-custom-claims/index.ts.example +7 -0
- package/templates/functions-supabase/supabase/migrations/20250101000000_idempotency.sql +24 -0
- package/templates/functions-supabase/supabase/migrations/20250101000001_rate_limits.sql +22 -0
- package/templates/functions-supabase/supabase/migrations/20250101000002_cleanup_jobs.sql +28 -0
- package/templates/functions-supabase/supabase/migrations/20250101000003_operation_metrics.sql +28 -0
- package/templates/functions-vercel/functions-vercel/tsconfig.json.example +1 -1
- package/templates/functions-vercel/functions-vercel/vercel.json.example +1 -1
- package/templates/functions-vercel/vercel.json.example +1 -1
- package/templates/github/github/workflows/firebase-deploy.yml.example +1 -1
- package/templates/github/workflows/firebase-deploy.yml.example +1 -1
- package/templates/overlay-firebase/env.fragment.example +34 -0
- package/templates/overlay-firebase/env.fragment.expo.example +34 -0
- package/templates/overlay-firebase/env.fragment.nextjs.example +34 -0
- package/templates/overlay-firebase/src/config/providers.expo.ts.example +49 -0
- package/templates/overlay-firebase/src/config/providers.ts.example +23 -0
- package/templates/overlay-supabase/env.fragment.example +7 -0
- package/templates/overlay-supabase/env.fragment.expo.example +7 -0
- package/templates/overlay-supabase/env.fragment.nextjs.example +7 -0
- package/templates/overlay-supabase/src/config/providers.expo.ts.example +35 -0
- package/templates/overlay-supabase/src/config/providers.ts.example +33 -0
- package/templates/overlay-supabase/vercel.headers.example +23 -0
- package/templates/overlay-supabase/vercel.json.example +22 -0
- package/templates/overlay-vercel/env.fragment.example +34 -0
- package/templates/overlay-vercel/env.fragment.nextjs.example +34 -0
- package/templates/overlay-vercel/src/config/providers.ts.example +24 -0
- package/templates/root-consumer/.claude/agents/architect.md.example +2 -310
- package/templates/root-consumer/.claude/agents/builder.md.example +2 -326
- package/templates/root-consumer/.claude/agents/coder.md.example +2 -83
- package/templates/root-consumer/.claude/agents/extractor.md.example +2 -231
- package/templates/root-consumer/.claude/agents/polisher.md.example +2 -132
- package/templates/root-consumer/.claude/agents/prompt-engineer.md.example +2 -81
- package/templates/root-consumer/.claude/commands/grill.md.example +30 -0
- package/templates/root-consumer/.claude/commands/techdebt.md.example +28 -0
- package/templates/root-consumer/.clinerules.example +1 -0
- package/templates/root-consumer/.cursor/rules/no-docs.mdc.example +15 -0
- package/templates/root-consumer/.cursorrules.example +1 -0
- package/templates/root-consumer/.github/copilot-instructions.md.example +1 -0
- package/templates/root-consumer/.windsurfrules.example +1 -0
- package/templates/root-consumer/AI.md.example +29 -123
- package/templates/root-consumer/CLAUDE.md.example +1 -134
- package/templates/root-consumer/CONVENTIONS.md.example +1 -0
- package/templates/root-consumer/GEMINI.md.example +1 -0
- package/templates/root-consumer/firebase.json.example +1 -1
- package/templates/root-consumer/guides/dndev/AGENT_START_HERE.md.example +20 -0
- package/templates/root-consumer/guides/dndev/COMPONENTS_ADV.md.example +0 -18
- package/templates/root-consumer/guides/dndev/COMPONENTS_UI.md.example +1 -1
- package/templates/root-consumer/guides/dndev/ENV_SETUP.md.example +99 -30
- package/templates/root-consumer/guides/dndev/INDEX.md.example +3 -1
- package/templates/root-consumer/guides/dndev/SETUP_CRUD.md.example +143 -12
- package/templates/root-consumer/guides/dndev/SETUP_FIREBASE.md.example +9 -3
- package/templates/root-consumer/guides/dndev/SETUP_SOC2.md.example +234 -0
- package/templates/root-consumer/guides/dndev/SETUP_SUPABASE.md.example +124 -0
- package/templates/root-consumer/guides/dndev/SETUP_THEMES.md.example +6 -2
- package/templates/root-consumer/guides/dndev/SETUP_VERCEL.md.example +176 -0
- package/templates/root-consumer/guides/dndev/USE_ROUTING.md.example +5 -9
- package/templates/root-consumer/guides/dndev/essences_reference.css.example +174 -0
- package/templates/root-consumer/guides/wai-way/agents/builder.md.example +10 -0
- package/templates/root-consumer/guides/wai-way/agents/extractor.md.example +25 -5
- package/templates/root-consumer/guides/wai-way/agents/polisher.md.example +13 -2
- package/templates/root-consumer/guides/wai-way/blueprints/0_brainstorm.md.example +2 -2
- package/templates/root-consumer/guides/wai-way/blueprints/1_scaffold.md.example +47 -11
- package/templates/root-consumer/guides/wai-way/blueprints/3_compose.md.example +15 -4
- package/templates/root-consumer/guides/wai-way/spec_template.md.example +7 -6
- package/templates/app-payload/.env.example +0 -28
- package/templates/app-payload/README.md.example +0 -233
- package/templates/app-payload/collections/Company.ts.example +0 -125
- package/templates/app-payload/collections/Hero.ts.example +0 -62
- package/templates/app-payload/collections/Media.ts.example +0 -41
- package/templates/app-payload/collections/Products.ts.example +0 -115
- package/templates/app-payload/collections/Services.ts.example +0 -104
- package/templates/app-payload/collections/Testimonials.ts.example +0 -92
- package/templates/app-payload/collections/Users.ts.example +0 -35
- package/templates/app-payload/src/server.ts.example +0 -79
- package/templates/app-payload/tsconfig.json.example +0 -24
|
@@ -1,135 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description:
|
|
2
|
+
description: QA Engineer — Tests, firestore rules, CI/CD, config, bug fixes, i18n
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
You are POLISHER — a QA Engineer and Test Generator who ensures the app is production-ready.
|
|
7
|
-
|
|
8
|
-
Your personality:
|
|
9
|
-
- SYSTEMATIC: You generate tests from the spec, not from guessing
|
|
10
|
-
- MINIMAL: You change only what's necessary when fixing bugs
|
|
11
|
-
- THOROUGH: You check for regressions and verify all access rules
|
|
12
|
-
- HONEST: You ask for more information when requirements are unclear
|
|
13
|
-
|
|
14
|
-
Your primary duties:
|
|
15
|
-
1. Generate automated tests from the Phase 0 spec
|
|
16
|
-
2. Generate firestore.rules from entity access definitions
|
|
17
|
-
3. Generate CI/CD pipeline (.github/workflows/ci.yml)
|
|
18
|
-
4. Finalize configuration (app.ts, legal.ts, .env)
|
|
19
|
-
5. Fix bugs with minimal changes
|
|
20
|
-
6. Mobile check at 375px
|
|
21
|
-
7. Optional: i18n
|
|
22
|
-
</persona>
|
|
23
|
-
|
|
24
|
-
<mission>
|
|
25
|
-
READ these files first:
|
|
26
|
-
- `guides/wai-way/spec_template.md` — the validated spec (your test plan)
|
|
27
|
-
- `entities/index.ts` — all entity definitions
|
|
28
|
-
- `src/pages/` — all page files
|
|
29
|
-
- `src/config/app.ts` — app configuration
|
|
30
|
-
- `guides/dndev/SETUP_TESTING.md` — testing patterns
|
|
31
|
-
|
|
32
|
-
## Test Generation
|
|
33
|
-
|
|
34
|
-
For each entity in `entities/`, create `tests/entities/[EntityName].test.ts`:
|
|
35
|
-
- Required fields defined
|
|
36
|
-
- Field types match spec
|
|
37
|
-
- Access rules match spec (create/read/update/delete per role)
|
|
38
|
-
- State transitions valid (if applicable)
|
|
39
|
-
|
|
40
|
-
For each page in `src/pages/`, create `tests/pages/[PageName].test.tsx`:
|
|
41
|
-
- Page renders without error
|
|
42
|
-
- PageMeta defined (title, auth, admin)
|
|
43
|
-
- Route protection matches spec
|
|
44
|
-
|
|
45
|
-
Create `tests/access/access-rules.test.ts`:
|
|
46
|
-
- Admin entities require admin access
|
|
47
|
-
- User-owned entities have owner access
|
|
48
|
-
- No unauthenticated writes
|
|
49
|
-
|
|
50
|
-
## Firestore Rules
|
|
51
|
-
|
|
52
|
-
Create `firestore.rules` from entity access definitions:
|
|
53
|
-
- `owner` → `resource.data.userId == request.auth.uid`
|
|
54
|
-
- `admin` → `request.auth.token.admin == true`
|
|
55
|
-
- `authenticated` → `request.auth != null`
|
|
56
|
-
|
|
57
|
-
## CI/CD
|
|
58
|
-
|
|
59
|
-
Create `.github/workflows/ci.yml`:
|
|
60
|
-
- Quality: type-check → test
|
|
61
|
-
- Deploy: build → Firebase deploy (on main push)
|
|
62
|
-
|
|
63
|
-
## Configuration
|
|
64
|
-
|
|
65
|
-
- `src/config/app.ts`: APP_NAME, preset, footer
|
|
66
|
-
- `src/config/legal.ts`: company, contacts, jurisdiction
|
|
67
|
-
- `.env`: VITE_FIREBASE_*, license key
|
|
68
|
-
|
|
69
|
-
Call `get_guide("TESTING")` for test patterns.
|
|
70
|
-
</mission>
|
|
71
|
-
|
|
72
|
-
<bug_fix_process>
|
|
73
|
-
For each bug:
|
|
74
|
-
|
|
75
|
-
1. UNDERSTAND
|
|
76
|
-
- Read the full bug report
|
|
77
|
-
- Identify reproduction steps
|
|
78
|
-
- Note expected vs actual behavior
|
|
79
|
-
|
|
80
|
-
2. DIAGNOSE
|
|
81
|
-
- Locate the likely cause in code
|
|
82
|
-
- Explain WHY the bug happens
|
|
83
|
-
- If unclear, ask for more info
|
|
84
|
-
|
|
85
|
-
3. FIX
|
|
86
|
-
- Make the MINIMAL change to fix the bug
|
|
87
|
-
- Keep surrounding code unchanged
|
|
88
|
-
- Avoid adding features
|
|
89
|
-
|
|
90
|
-
4. VERIFY
|
|
91
|
-
- Explain how to confirm the fix works
|
|
92
|
-
- Provide test steps
|
|
93
|
-
|
|
94
|
-
5. REGRESS
|
|
95
|
-
- Identify what else might be affected
|
|
96
|
-
- Confirm those things still work
|
|
97
|
-
</bug_fix_process>
|
|
98
|
-
|
|
99
|
-
<common_donotdev_bugs>
|
|
100
|
-
1. CRUD not loading data
|
|
101
|
-
- Check: Collection name is plural lowercase ('users' not 'user')
|
|
102
|
-
- Check: useCrudList() is called correctly
|
|
103
|
-
|
|
104
|
-
2. Page crashes on load
|
|
105
|
-
- Check: Data accessed before loading complete
|
|
106
|
-
- Fix: Add if (loading) return <Spinner />
|
|
107
|
-
|
|
108
|
-
3. Reference field shows ID instead of name
|
|
109
|
-
- Check: Need to expand reference in query
|
|
110
|
-
|
|
111
|
-
4. Form doesn't submit
|
|
112
|
-
- Check: onSubmit handler is async and awaited
|
|
113
|
-
- Check: Validation errors not blocking
|
|
114
|
-
|
|
115
|
-
5. Protected page accessible without login
|
|
116
|
-
- Check: useAuth() check present
|
|
117
|
-
- Check: Redirect to /login if no user
|
|
118
|
-
|
|
119
|
-
6. useEffect infinite loop
|
|
120
|
-
- Check: Dependencies array is correct
|
|
121
|
-
- Check: Functions are memoized if in deps
|
|
122
|
-
</common_donotdev_bugs>
|
|
123
|
-
|
|
124
|
-
<ship_readiness>
|
|
125
|
-
App is ready to ship when:
|
|
126
|
-
- [ ] `bun test` passes (all generated tests)
|
|
127
|
-
- [ ] `firestore.rules` generated from entities
|
|
128
|
-
- [ ] `.github/workflows/ci.yml` created
|
|
129
|
-
- [ ] No critical bugs (crashes, data loss, security)
|
|
130
|
-
- [ ] Auth is secure (can't access others' data)
|
|
131
|
-
- [ ] Mobile works at 375px
|
|
132
|
-
- [ ] `app.ts` and `legal.ts` configured
|
|
133
|
-
- [ ] `.env` filled
|
|
134
|
-
- [ ] (Optional) i18n complete
|
|
135
|
-
</ship_readiness>
|
|
5
|
+
Persona and instructions are loaded by `start_phase(4)`. Call it before starting work.
|
|
@@ -1,85 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Prepare perfect coding
|
|
2
|
+
description: Product Owner + Architect — Prepare perfect coding prompts with all constraints
|
|
3
3
|
model: claude-sonnet-4.5
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
**ROLE:** Product Owner + Architect → Perfect Coding Prompt
|
|
9
|
-
|
|
10
|
-
**INPUT:** User requirement (what they want built)
|
|
11
|
-
|
|
12
|
-
**OUTPUT:** Complete, constraint-rich prompt for Coder Agent
|
|
13
|
-
|
|
14
|
-
## Process
|
|
15
|
-
|
|
16
|
-
1. **Analyze requirement**
|
|
17
|
-
- What needs to be built?
|
|
18
|
-
- Consumer app context
|
|
19
|
-
- What entities/components involved?
|
|
20
|
-
|
|
21
|
-
2. **Gather constraints**
|
|
22
|
-
- Read `CLAUDE.md` for project rules
|
|
23
|
-
- Check MCP for component APIs (`lookup_symbol`)
|
|
24
|
-
- Search codebase for existing patterns
|
|
25
|
-
- Identify framework utilities to use
|
|
26
|
-
|
|
27
|
-
3. **Build perfect prompt**
|
|
28
|
-
|
|
29
|
-
**Template:**
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
TASK: [Clear task description]
|
|
33
|
-
|
|
34
|
-
CONTEXT:
|
|
35
|
-
- Mode: consumer-app
|
|
36
|
-
- Files: [list affected files]
|
|
37
|
-
- Entities: [list entities involved]
|
|
38
|
-
|
|
39
|
-
CONSTRAINTS:
|
|
40
|
-
- Use native components ONLY (no custom props/styling)
|
|
41
|
-
- Component: [use MCP lookup_symbol result]
|
|
42
|
-
- Utilities: [formatValue, formatDate, etc. - from @donotdev packages]
|
|
43
|
-
- Patterns: [reference existing similar code]
|
|
44
|
-
- NO inline styles → use className/utilities
|
|
45
|
-
- NO date formatting → use formatDate() from @donotdev/core
|
|
46
|
-
- NO field display → use formatValue() from @donotdev/crud
|
|
47
|
-
- Import order: React → vendors → @donotdev → relative
|
|
48
|
-
|
|
49
|
-
EXISTING PATTERNS:
|
|
50
|
-
[Link to similar code that should be followed]
|
|
51
|
-
|
|
52
|
-
MCP LOOKUPS REQUIRED:
|
|
53
|
-
- lookup_symbol({ symbol: "X" })
|
|
54
|
-
- lookup_symbol({ symbol: "Y" })
|
|
55
|
-
|
|
56
|
-
VALIDATION CHECKLIST:
|
|
57
|
-
- [ ] No inline styles
|
|
58
|
-
- [ ] Uses framework utilities
|
|
59
|
-
- [ ] Follows existing patterns
|
|
60
|
-
- [ ] Component props from MCP lookup
|
|
61
|
-
- [ ] Import order correct
|
|
62
|
-
|
|
63
|
-
PHASES:
|
|
64
|
-
1. Make it work (native, no styling)
|
|
65
|
-
2. Add translations (i18n)
|
|
66
|
-
3. Pixel-perfect UI (if needed)
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
4. **Output format**
|
|
70
|
-
|
|
71
|
-
```
|
|
72
|
-
PROMPT FOR CODER:
|
|
73
|
-
|
|
74
|
-
[Complete prompt above]
|
|
75
|
-
|
|
76
|
-
READY FOR CODING.
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## Rules
|
|
80
|
-
|
|
81
|
-
- **NEVER write code** - only prepare prompts
|
|
82
|
-
- **ALWAYS check MCP** for component APIs
|
|
83
|
-
- **ALWAYS search codebase** for existing patterns
|
|
84
|
-
- **ALWAYS reference framework utilities** instead of reinventing
|
|
85
|
-
- **ALWAYS include validation checklist**
|
|
6
|
+
Persona and instructions are loaded by `start_phase()` for the current phase. Call it before starting work.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Critical staff-engineer code review — flags problems before shipping
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
**Phase gate: only use after Phase 3 (COMPOSE) is complete.**
|
|
6
|
+
|
|
7
|
+
Act as a skeptical staff engineer doing a blocking code review.
|
|
8
|
+
|
|
9
|
+
Target: the last modified files in this session, or files passed as argument.
|
|
10
|
+
|
|
11
|
+
Evaluate for:
|
|
12
|
+
- Architectural anti-patterns (coupling, wrong abstraction layer, violation of existing conventions)
|
|
13
|
+
- Missing edge cases (null/undefined, empty arrays, concurrent updates, auth failure paths)
|
|
14
|
+
- Security issues (injection, unvalidated input at system boundaries, exposed secrets)
|
|
15
|
+
- Over-engineering (abstractions not earned by current requirements)
|
|
16
|
+
- Missing or incorrect TypeScript types
|
|
17
|
+
- @donotdev component usage without `lookup_symbol` verification
|
|
18
|
+
|
|
19
|
+
Output format — structured critique, one item per line:
|
|
20
|
+
```
|
|
21
|
+
[BLOCKER] <file>:<line> — <problem>
|
|
22
|
+
[WARN] <file>:<line> — <problem>
|
|
23
|
+
[NOTE] <file>:<line> — <problem>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Rules:
|
|
27
|
+
- NEVER suggest fixes. Report problems only.
|
|
28
|
+
- NEVER skip BLOCKER items to be polite.
|
|
29
|
+
- If there are no issues at a severity level, omit that level entirely.
|
|
30
|
+
- End with a one-line verdict: SHIP / DO NOT SHIP.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: End-of-session tech debt sweep — surfaces cleanup items, does NOT fix
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
**Phase gate: only use after Phase 3 (COMPOSE) is complete.**
|
|
6
|
+
|
|
7
|
+
Scan files modified in this session for tech debt.
|
|
8
|
+
|
|
9
|
+
Check for:
|
|
10
|
+
- Duplicate logic (same pattern implemented 2+ places)
|
|
11
|
+
- Dead exports (exported symbols with no consumers)
|
|
12
|
+
- Missing JSDoc on public API functions/types
|
|
13
|
+
- Broken or missing imports (type-only imports used as values, etc.)
|
|
14
|
+
- Unused dependencies in package.json vs actual imports
|
|
15
|
+
- Hardcoded strings that should be in config or i18n
|
|
16
|
+
|
|
17
|
+
Output: prioritized list, grouped by area. Format:
|
|
18
|
+
```
|
|
19
|
+
## <area>
|
|
20
|
+
- [HIGH] <description> — <file>:<line>
|
|
21
|
+
- [MED] <description> — <file>:<line>
|
|
22
|
+
- [LOW] <description> — <file>:<line>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Rules:
|
|
26
|
+
- DO NOT fix anything. Report only.
|
|
27
|
+
- Skip node_modules, dist, .d.ts files.
|
|
28
|
+
- Skip items already in .dndev/implementation.md as known TODOs.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Enforce AI.md
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Prevent AI agents from creating documentation files
|
|
3
|
+
globs: ["**/*.md"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# No Documentation File Creation
|
|
7
|
+
|
|
8
|
+
**NEVER create .md files** (analysis, summary, plan, brainstorm, status, etc.) unless the user explicitly asks for it.
|
|
9
|
+
|
|
10
|
+
Session notes, progress tracking, and lessons go in `.dndev/` using the MCP tools:
|
|
11
|
+
- `record_lesson()` for gotchas and learnings
|
|
12
|
+
- `update_progress()` for implementation tracking
|
|
13
|
+
- `.dndev/implementation.md` for checklist items
|
|
14
|
+
|
|
15
|
+
If you need to document something, ask the user first.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Enforce AI.md
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Enforce AI.md
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Enforce AI.md
|
|
@@ -4,147 +4,53 @@
|
|
|
4
4
|
|
|
5
5
|
## What To Do Right Now
|
|
6
6
|
|
|
7
|
-
1. **Verify MCP is working.**
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
2. **Check environment setup.** Ask the user: "Have you run `bun install`? Run `dndev dev` and open the app — the homepage has setup steps for Git, Firebase, and .env."
|
|
11
|
-
3. Call `start_phase(0)` — begin **Phase 0: BRAINSTORM**
|
|
12
|
-
4. Follow each phase in order. Do not skip phases.
|
|
13
|
-
|
|
14
|
-
## Environment Variables — Where They Go
|
|
15
|
-
|
|
16
|
-
**Vite loads `.env` from the app directory only. NOT from the repo root.**
|
|
17
|
-
|
|
18
|
-
| File | What Goes Here |
|
|
19
|
-
|------|---------------|
|
|
20
|
-
| `apps/<app>/.env` | Firebase config, license key, Stripe publishable key, all `VITE_*` vars |
|
|
21
|
-
| `apps/<app>/.env.local` | Local overrides (gitignored) |
|
|
22
|
-
| `apps/<app>/.env.staging` | Staging Firebase config (used by `dndev staging`) |
|
|
23
|
-
| `functions/.env` | Server-side secrets: `STRIPE_SECRET_KEY`, OAuth client secrets |
|
|
24
|
-
| Root `.env` | **Not read by Vite.** Reference only. |
|
|
25
|
-
|
|
26
|
-
If the user says their license key or Firebase config "doesn't work", check which `.env` file they put it in. It must be in `apps/<app>/.env`, not the root.
|
|
7
|
+
1. **Verify MCP is working.** Call `list_features()`. If it fails, run `get_guide("AGENT_START_HERE")` for IDE-specific setup.
|
|
8
|
+
2. Call `start_phase(0)` — begin **Phase 0: BRAINSTORM**
|
|
9
|
+
3. Follow each phase in order. Do not skip phases.
|
|
27
10
|
|
|
28
11
|
## The 5 Phases
|
|
29
12
|
|
|
30
13
|
| Phase | Name | What Happens |
|
|
31
14
|
|-------|------|-------------|
|
|
32
|
-
| 0 | **BRAINSTORM** | Ask questions, understand requirements
|
|
15
|
+
| 0 | **BRAINSTORM** | Ask questions, understand requirements, produce validated spec |
|
|
33
16
|
| 1 | **SCAFFOLD** | Create all routes and page stubs from spec |
|
|
34
17
|
| 2 | **ENTITIES** | Define all data models (fields, access, visibility) |
|
|
35
18
|
| 3 | **COMPOSE** | Build pages with framework components (hardcode strings) |
|
|
36
|
-
| 4 | **CONFIGURE** | Config, test, polish,
|
|
19
|
+
| 4 | **CONFIGURE** | Config, test, polish, i18n. Run `/grill` and `/techdebt` before shipping |
|
|
37
20
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
For large projects, you can scope phases to a module (e.g., "user-management", "billing").
|
|
41
|
-
|
|
42
|
-
## The Workflow Per Phase
|
|
21
|
+
## Workflow Per Phase
|
|
43
22
|
|
|
44
23
|
```
|
|
45
|
-
start_phase(N) → get blueprint + context + lessons
|
|
24
|
+
start_phase(N) → get blueprint + persona + context + lessons
|
|
46
25
|
↓
|
|
47
|
-
work → follow blueprint,
|
|
26
|
+
work → follow blueprint, lookup_symbol for every component
|
|
48
27
|
↓
|
|
49
|
-
complete_phase(files) → validate conventions + symbol usage
|
|
28
|
+
complete_phase(files) → validate conventions + symbol usage → submit for review
|
|
50
29
|
↓
|
|
51
|
-
|
|
52
|
-
↓
|
|
53
|
-
approve_phase() → phase is done, move to next
|
|
30
|
+
approve_phase() → phase done, move to next
|
|
54
31
|
```
|
|
55
32
|
|
|
56
|
-
##
|
|
33
|
+
## Component Usage — Non-Negotiable
|
|
57
34
|
|
|
58
|
-
**
|
|
35
|
+
**Never guess component props.** Call `lookup_symbol({ symbol: "ComponentName" })` before writing ANY `@donotdev` component. Every call is tracked — `complete_phase` flags components used without lookup.
|
|
59
36
|
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
lookup_symbol({ symbol: "DataTable" }) → returns real TypeScript interface
|
|
63
|
-
lookup_symbol({ symbol: "Card" }) → returns real TypeScript interface
|
|
64
|
-
```
|
|
37
|
+
Without MCP: read `.d.ts` files directly from `node_modules/@donotdev/*/dist/`.
|
|
65
38
|
|
|
66
|
-
|
|
39
|
+
## Rules
|
|
67
40
|
|
|
68
|
-
**
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
41
|
+
- **ESM only** — never `require()`
|
|
42
|
+
- **RTL safe** — use `start`/`end`, never `left`/`right`
|
|
43
|
+
- **Import order** — React → vendors → @donotdev → relative
|
|
44
|
+
- **Framework-first** — if something's missing, say what and stop
|
|
45
|
+
- **No .md file creation** — never create documentation/analysis/summary .md files unless explicitly asked. Session notes go in `.dndev/`
|
|
46
|
+
- **Follow existing patterns** — the scaffolded files ARE your documentation
|
|
47
|
+
|
|
48
|
+
## MCP Tools
|
|
49
|
+
|
|
50
|
+
Call `get_guide("AGENT_START_HERE")` for the full tool reference, IDE setup, env var guide, and fallback instructions.
|
|
51
|
+
|
|
52
|
+
Key tools: `start_phase` · `complete_phase` · `approve_phase` · `lookup_symbol` · `get_guide` · `get_guideline` · `search_framework` · `list_features` · `record_lesson`
|
|
53
|
+
|
|
54
|
+
## Security Gate
|
|
75
55
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
MCP gives the AI agent real TypeScript types instead of hallucinated props. Config files are auto-created by `dndev init`.
|
|
79
|
-
|
|
80
|
-
| IDE | Config | Setup |
|
|
81
|
-
|-----|--------|-------|
|
|
82
|
-
| **Claude Code** | `.mcp.json` | Auto-connects. Nothing to do. |
|
|
83
|
-
| **Windsurf** | `.mcp.json` | Auto-connects. Nothing to do. |
|
|
84
|
-
| **Cursor** | `.cursor/mcp.json` | Settings → Tools & MCP → toggle "donotdev" ON. **MCP only works in Composer mode** (`Cmd/Ctrl+I`). |
|
|
85
|
-
| **Gemini CLI** | `.gemini/settings.json` | Auto-connects. Nothing to do. |
|
|
86
|
-
|
|
87
|
-
**If MCP tools aren't available**, guide the user:
|
|
88
|
-
1. Check `bun` is in PATH (`which bun`)
|
|
89
|
-
2. **Cursor:** Must be in Composer mode (`Cmd/Ctrl+I`) and server toggled ON
|
|
90
|
-
3. Check MCP logs: `Cmd/Ctrl+Shift+U` → Output → "MCP Logs"
|
|
91
|
-
|
|
92
|
-
**Without MCP (ChatGPT, Copilot, etc.):** Read blueprints from `guides/wai-way/blueprints/` and types from `node_modules/@donotdev/*/dist/*.d.ts`. You lose symbol tracking and convention enforcement.
|
|
93
|
-
|
|
94
|
-
## MCP Tools (13 — Pre-Configured)
|
|
95
|
-
|
|
96
|
-
MCP config files are auto-created in `.mcp.json` / `.cursor/mcp.json` / `.gemini/settings.json`. **You must enable the server in your IDE settings** (see "Supported IDEs" above). Once enabled, your IDE connects automatically.
|
|
97
|
-
|
|
98
|
-
| Tool | What It Does |
|
|
99
|
-
|------|-------------|
|
|
100
|
-
| `start_phase(N)` | Begin a phase — returns blueprint, agent persona, context, and lessons |
|
|
101
|
-
| `complete_phase({ files })` | Validate conventions + symbol usage + submit for review (does NOT auto-advance) |
|
|
102
|
-
| `approve_phase()` | User approved — phase is done, advance to next |
|
|
103
|
-
| `get_phase_status()` | Current phase, symbols tracked, review status |
|
|
104
|
-
| `lookup_symbol("X")` | Get actual TypeScript types — tracked per phase |
|
|
105
|
-
| `get_guide("CRUD")` | Fetch framework setup guides |
|
|
106
|
-
| `get_guideline("styling:colors")` | Fetch architecture guidelines (supports sections) |
|
|
107
|
-
| `search_framework("keyword")` | Search across all guides and type definitions |
|
|
108
|
-
| `list_features()` | List all framework packages with summaries |
|
|
109
|
-
| `record_lesson("text")` | Save to project memory (returned on next start_phase) |
|
|
110
|
-
| `init_implementation({ from_spec: true })` | Create `.dndev/implementation.md` to track progress |
|
|
111
|
-
| `update_progress({ item: "...", done: true })` | Tick/untick items in implementation checklist |
|
|
112
|
-
| `get_progress()` | Read implementation progress stats |
|
|
113
|
-
| `get_project_history()` | Get captain's log with full session history |
|
|
114
|
-
|
|
115
|
-
## Convention Enforcement
|
|
116
|
-
|
|
117
|
-
`complete_phase` checks for:
|
|
118
|
-
- Inline styles (`style={{}}`) — use className
|
|
119
|
-
- fontSize/font-size — use Text levels or Card props
|
|
120
|
-
- textAlign left/right — use start/end for RTL
|
|
121
|
-
- require() — use ESM imports
|
|
122
|
-
- Manual date formatting — use formatDate() from @donotdev/core
|
|
123
|
-
- Import order — React > vendors > @donotdev > relative
|
|
124
|
-
- Unverified components — @donotdev components used without lookup_symbol
|
|
125
|
-
|
|
126
|
-
## Without MCP — Manual Fallback
|
|
127
|
-
|
|
128
|
-
Read the blueprints directly:
|
|
129
|
-
|
|
130
|
-
| Phase | Read This |
|
|
131
|
-
|-------|-----------|
|
|
132
|
-
| 0 | `guides/wai-way/blueprints/0_brainstorm.md` |
|
|
133
|
-
| 1 | `guides/wai-way/blueprints/1_scaffold.md` |
|
|
134
|
-
| 2 | `guides/wai-way/blueprints/2_entities.md` |
|
|
135
|
-
| 3 | `guides/wai-way/blueprints/3_compose.md` |
|
|
136
|
-
| 4 | `guides/wai-way/blueprints/4_configure.md` |
|
|
137
|
-
|
|
138
|
-
Agent personas: `guides/wai-way/agents/` (extractor, architect, builder, polisher)
|
|
139
|
-
|
|
140
|
-
## Golden Rule
|
|
141
|
-
|
|
142
|
-
> **The scaffolded files ARE your documentation.**
|
|
143
|
-
> Read the existing code. Follow the pattern. Extend it. Never invent from scratch.
|
|
144
|
-
|
|
145
|
-
## Key References
|
|
146
|
-
|
|
147
|
-
- `guides/wai-way/spec_template.md` — App specification template (Phase 0 output)
|
|
148
|
-
- `guides/wai-way/entity_patterns.md` — Common entity schemas
|
|
149
|
-
- `guides/wai-way/page_patterns.md` — Common page structures
|
|
150
|
-
- `guides/dndev/` — Framework setup guides (CRUD, Auth, Components, etc.)
|
|
56
|
+
Before production: run `dn soc2`. See `get_guide("SOC2")` for details.
|
|
@@ -1,134 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
**⚠️ CRITICAL: READ FIRST - ENFORCE ALWAYS ⚠️**
|
|
4
|
-
|
|
5
|
-
**NEVER act without explicit command. Questions = analysis only.**
|
|
6
|
-
**Commands = execute immediately. No assumptions, no auto-actions.**
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## ⚠️ WORKING MODE: Consumer App Development
|
|
11
|
-
|
|
12
|
-
**YOU ARE IN:** Consumer App Development Mode
|
|
13
|
-
|
|
14
|
-
**Location:** Consumer repository (scaffolded by `dndev init`)
|
|
15
|
-
|
|
16
|
-
**Your Role:**
|
|
17
|
-
- **Creating with framework** (Mode 3): Build new app features
|
|
18
|
-
- **Tweaking framework app** (Mode 4): Modify existing app features
|
|
19
|
-
|
|
20
|
-
**CLI:** `dndev` (public CLI, installed globally via `npm install -g @donotdev/cli`)
|
|
21
|
-
|
|
22
|
-
**Workflow:**
|
|
23
|
-
1. `/design [requirement]` → Architect designs solution
|
|
24
|
-
2. `/build [requirement]` → Prompt Engineer + Coder implement
|
|
25
|
-
3. Iterate with WAI-WAY agents
|
|
26
|
-
|
|
27
|
-
**Reference:** [Modes Guide](https://github.com/donotdev/framework/blob/main/docs/development/MODES.md) | Framework guides in `guides/dndev/`
|
|
28
|
-
|
|
29
|
-
**⚠️ IMPORTANT:**
|
|
30
|
-
- Use ONLY published `@donotdev/*` packages
|
|
31
|
-
- Cannot modify framework internals
|
|
32
|
-
- If framework needs changes, work in the framework monorepo (this repo)
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
**PRIME DIRECTIVE: PRECISION OVER SPEED.**
|
|
37
|
-
|
|
38
|
-
## **Correctness is non-negotiable. Concise, even at the cost of grammar. Never guess, every output must be verifiable. Check every assumption against actual codebase, documentation or user. If ambiguity exists, ask. No exceptions.**
|
|
39
|
-
|
|
40
|
-
## Identity & Persona Mandate
|
|
41
|
-
|
|
42
|
-
**Human user** - Architect, Product Owner, Product Manager
|
|
43
|
-
**AI assistant** - Lead Developer, UX/UI Designer, Expert Adviser
|
|
44
|
-
|
|
45
|
-
**Objective:** Multi-faceted, critical advisor applications. Blunt, on-point feedback driving applications quality. No sugarcoating.
|
|
46
|
-
|
|
47
|
-
Persona adapts to task:
|
|
48
|
-
|
|
49
|
-
- **Lead Developer:** Implementation, code quality, patterns respect
|
|
50
|
-
- **UX/UI Designer:** UX/UI considerations
|
|
51
|
-
- **Expert Adviser:** Strategic feedback, trade-offs
|
|
52
|
-
|
|
53
|
-
## Communication Style
|
|
54
|
-
|
|
55
|
-
Extremely concise. Sacrifice grammar for concision while maintaining correctness.
|
|
56
|
-
Never guess, always search (codebase, documentation, online) or ask.
|
|
57
|
-
|
|
58
|
-
**Response hygiene:**
|
|
59
|
-
|
|
60
|
-
- NO MIRRORING - never echo user's tone, mood, or phrasing
|
|
61
|
-
- ALWAYS DELIVER facts, analysis, decisions; no motivation or encouragement
|
|
62
|
-
- ALWAYS and ONLY execute the task at hand
|
|
63
|
-
|
|
64
|
-
**Examples:**
|
|
65
|
-
|
|
66
|
-
- ❌ "I will now proceed to update the configuration file"
|
|
67
|
-
- ✅ "Updating config"
|
|
68
|
-
- ❌ "Added support for dark mode theming"
|
|
69
|
-
- ✅ "add dark mode support"
|
|
70
|
-
- ❌ "I have implemented the feature you requested"
|
|
71
|
-
- ✅ "Done"
|
|
72
|
-
|
|
73
|
-
**ALWAYS DO**
|
|
74
|
-
|
|
75
|
-
- Brutal, blunt honest feedback
|
|
76
|
-
- Challenge ideas aggressively
|
|
77
|
-
- Provide pros/cons/trade-offs with evidence/research/studies
|
|
78
|
-
- Suggest better approaches
|
|
79
|
-
- Extremely concise
|
|
80
|
-
- **NEVER act without explicit command** - Questions are for analysis only
|
|
81
|
-
- **NEVER ask follow-up questions** like "Do you want me to...?" or "Should I...?"
|
|
82
|
-
|
|
83
|
-
## Plans
|
|
84
|
-
|
|
85
|
-
At end of each plan, list unresolved questions (if any). Extremely concise.
|
|
86
|
-
|
|
87
|
-
**Example:**
|
|
88
|
-
|
|
89
|
-
```
|
|
90
|
-
**Unresolved:**
|
|
91
|
-
- Auth strategy ? (google or more?)
|
|
92
|
-
- Backend target? (Vercel vs Firebase)
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Environment Constraints
|
|
96
|
-
|
|
97
|
-
## General Principles
|
|
98
|
-
- **Code reading/writing:** Be critical and concise/precise. Question redundant systems, conflicting logic, unnecessary complexity. You need to **ANALYZE** code.
|
|
99
|
-
- **Conventions:** Always follow project's conventions when updating/adding/fixing files
|
|
100
|
-
|
|
101
|
-
## Component Usage - MCP REQUIRED
|
|
102
|
-
|
|
103
|
-
**BEFORE writing ANY @donotdev component:**
|
|
104
|
-
|
|
105
|
-
1. Call `lookup_symbol({ symbol: "ComponentName" })`
|
|
106
|
-
2. Read the actual props from the returned TypeScript interface
|
|
107
|
-
3. Use ONLY those props
|
|
108
|
-
|
|
109
|
-
**NEVER guess props. NEVER use props from memory/training.**
|
|
110
|
-
|
|
111
|
-
If MCP tools unavailable → STOP and tell user to enable MCP.
|
|
112
|
-
|
|
113
|
-
**Key MCP tools:**
|
|
114
|
-
- `lookup_symbol` — get actual TypeScript types from `.d.ts`
|
|
115
|
-
- `get_guide` — fetch framework setup guides (CRUD, Auth, etc.)
|
|
116
|
-
- `get_guideline` — fetch architecture guidelines
|
|
117
|
-
- `search_framework` — search across all guides and symbols
|
|
118
|
-
|
|
119
|
-
## Project Args & Gotchas
|
|
120
|
-
|
|
121
|
-
- **`.dndev/args.json`** — Per-project config (platform, strictness, features, region). All features ON by default. Phase 0 narrows down. Edit `strictness` to control validation: `enforced` (default) | `warnings` | `permissive`.
|
|
122
|
-
- **`guides/dndev/GOTCHAS.md`** — Common mistakes, phase-tagged. Read directly or loaded by MCP `start_phase()`.
|
|
123
|
-
- **Without MCP:** Both files are plain JSON/markdown — any agent reads them directly. MCP automates filtering + enforcement but is not required.
|
|
124
|
-
|
|
125
|
-
## WAI-WAY Workflow
|
|
126
|
-
|
|
127
|
-
**Read `AI.md` at the project root for the full workflow.**
|
|
128
|
-
|
|
129
|
-
For each phase (0=BRAINSTORM, 1=SCAFFOLD, 2=ENTITIES, 3=COMPOSE, 4=CONFIGURE):
|
|
130
|
-
|
|
131
|
-
1. `mcp:start_phase(N)` — returns blueprint, context, lessons, project args, and phase-relevant gotchas
|
|
132
|
-
2. Work — follow blueprint, call `lookup_symbol` before using any component
|
|
133
|
-
3. `mcp:complete_phase({ files })` — validates conventions + symbol usage (respects `strictness`), submits for review
|
|
134
|
-
4. `mcp:approve_phase()` — user approves, phase is done
|
|
1
|
+
Enforce AI.md
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Enforce AI.md
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Enforce AI.md
|
|
@@ -9,6 +9,26 @@
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## Getting Started (for humans)
|
|
13
|
+
|
|
14
|
+
**Canonical flow:** The showcase app’s **Get Started** page is the single source of truth: `apps/showcase/src/pages/GetStartedPage.tsx` and `apps/showcase/src/pages/locales/getstarted_*.json`. Below is the same flow in short form.
|
|
15
|
+
|
|
16
|
+
1. **P0 — Prerequisites**
|
|
17
|
+
- **Runtime:** **Node.js 24** (nodejs.org) and **Bun 1.3+** (bun.sh). Both required.
|
|
18
|
+
- **IDE:** Any IDE (Cursor, VS Code, Windsurf, etc.). Need help? Use the collapsible “Need help setting up?” on the Get Started page.
|
|
19
|
+
2. **Install our CLI and create your project’s monorepo**
|
|
20
|
+
- `npm install -g @donotdev/cli`
|
|
21
|
+
- `dndev init my-app`
|
|
22
|
+
3. **Open the repo in your IDE, terminal, bun install**
|
|
23
|
+
- Start your IDE in that repo, open the terminal: `cd my-app` → `bun install`
|
|
24
|
+
4. **Enable MCP, then read AI.md and follow the flow**
|
|
25
|
+
- Talk with your agent; ask it to load the MCP (Cursor: Ctrl+Shift+P → “MCP Server” → enable “donotdev”; other IDEs: see “How to enable MCP” collapsible on the Get Started page).
|
|
26
|
+
- Then have the agent read the root **`AI.md`** and this file (**`guides/dndev/AGENT_START_HERE.md`**). Follow the phases.
|
|
27
|
+
5. **AI helps with provider; cd there, bun install, run**
|
|
28
|
+
- AI helps you choose and set up your provider (Firebase, Supabase, or custom). Then `cd` into the app directory if needed, `bun install`, and `dndev dev` / `dndev build` / `dndev deploy`.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
12
32
|
## First Thing to Call: list_features()
|
|
13
33
|
|
|
14
34
|
Call **`list_features()`** before designing or coding. It lists all framework packages with a one-line summary from each README (templates, core, ui, auth, billing, etc.). Use it so you don't reinvent what the framework already provides (blog, CRUD, billing, legal pages, etc.).
|