@donotdev/cli 0.0.17 → 0.0.19
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 +67 -60
- package/dist/bin/commands/coach.js +8177 -0
- package/dist/bin/commands/create-app.js +94 -145
- package/dist/bin/commands/create-project.js +98 -149
- package/dist/bin/commands/deploy.js +81 -59
- package/dist/bin/commands/doctor.js +243 -698
- package/dist/bin/commands/emu.js +2 -2
- package/dist/bin/commands/format.js +4 -1
- package/dist/bin/commands/get-demo.js +8351 -0
- package/dist/bin/commands/make-admin.js +773 -152
- package/dist/bin/commands/setup.js +519 -1711
- package/dist/bin/commands/staging.js +17852 -0
- package/dist/bin/commands/sync-secrets.js +2 -11
- package/dist/bin/commands/type-check.js +7733 -1713
- package/dist/bin/dndev.js +913 -182
- package/dist/bin/donotdev.js +913 -182
- package/dist/index.js +191 -211
- package/package.json +1 -1
- package/templates/app-demo/index.html.example +147 -10
- package/templates/app-demo/src/App.tsx.example +7 -13
- package/templates/app-demo/src/config/app.ts.example +12 -48
- package/templates/app-demo/src/entities/product.ts.example +38 -0
- package/templates/app-demo/src/globals.css.example +5 -1
- package/templates/app-demo/src/main.tsx.example +13 -7
- package/templates/app-demo/src/pages/ChangelogPage.tsx.example +14 -0
- package/templates/app-demo/src/pages/DashboardPage.tsx.example +15 -0
- package/templates/app-demo/src/pages/HomePage.tsx.example +3 -77
- package/templates/app-demo/src/pages/PricingPage.tsx.example +14 -0
- package/templates/app-demo/src/pages/ProductsPage.tsx.example +17 -0
- package/templates/app-demo/src/pages/ProfilePage.tsx.example +16 -0
- package/templates/app-demo/src/pages/SettingsPage.tsx.example +15 -0
- package/templates/app-demo/src/pages/ShowcaseDetailPage.tsx.example +112 -0
- package/templates/app-demo/src/pages/ShowcasePage.tsx.example +91 -0
- package/templates/app-demo/src/pages/legal/LegalPage.tsx.example +14 -0
- package/templates/app-demo/src/pages/legal/PrivacyPage.tsx.example +14 -0
- package/templates/app-demo/src/pages/legal/TermsPage.tsx.example +14 -0
- package/templates/app-demo/tsconfig.json.example +1 -1
- package/templates/app-demo/vite.config.ts.example +23 -48
- package/templates/app-expo/README.md.example +1 -1
- package/templates/app-expo/app/index.tsx.example +1 -1
- package/templates/app-vite/src/pages/HomePage.tsx.example +8 -10
- 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 +1 -1
- package/templates/overlay-supabase/env.fragment.expo.example +1 -1
- package/templates/overlay-supabase/env.fragment.nextjs.example +1 -1
- package/templates/overlay-vercel/env.fragment.example +1 -1
- package/templates/overlay-vercel/env.fragment.nextjs.example +1 -1
- package/templates/root-consumer/.claude/commands/brainstorm.md.example +15 -1
- package/templates/root-consumer/.claude/commands/build.md.example +24 -2
- package/templates/root-consumer/.claude/commands/design.md.example +17 -0
- package/templates/root-consumer/.claude/commands/polish.md.example +17 -0
- package/templates/root-consumer/AI.md.example +54 -21
- package/templates/root-consumer/guides/dndev/AGENT_START_HERE.md.example +21 -6
- package/templates/root-consumer/guides/dndev/COMPONENTS_ADV.md.example +16 -179
- package/templates/root-consumer/guides/dndev/ENV_SETUP.md.example +19 -21
- package/templates/root-consumer/guides/dndev/GOTCHAS.md.example +14 -3
- 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_BLOG.md.example +19 -2
- package/templates/root-consumer/guides/dndev/SETUP_CRUD.md.example +35 -1
- package/templates/root-consumer/guides/dndev/SETUP_FIREBASE.md.example +17 -12
- package/templates/root-consumer/guides/dndev/SETUP_LAYOUTS.md.example +32 -0
- package/templates/root-consumer/guides/dndev/SETUP_OAUTH_PROVIDERS.md.example +1 -1
- package/templates/root-consumer/guides/dndev/SETUP_PAGES.md.example +74 -6
- package/templates/root-consumer/guides/dndev/SETUP_STRIPE.md.example +2 -2
- package/templates/root-consumer/guides/dndev/SETUP_SUPABASE.md.example +17 -12
- package/templates/root-consumer/guides/dndev/SETUP_VERCEL.md.example +37 -16
- package/templates/root-consumer/guides/dndev/USE_ROUTING.md.example +18 -18
- package/templates/root-consumer/guides/dndev/essences_reference.css.example +119 -2
- package/templates/root-consumer/guides/wai-way/blueprints/0_brainstorm.md.example +1 -1
- package/templates/root-consumer/guides/wai-way/blueprints/1_scaffold.md.example +14 -0
- package/templates/root-consumer/guides/wai-way/blueprints/2_entities.md.example +6 -0
- package/templates/root-consumer/guides/wai-way/blueprints/3_compose.md.example +14 -0
- package/templates/root-consumer/guides/wai-way/entity_patterns.md.example +4 -5
- package/templates/root-consumer/guides/wai-way/page_patterns.md.example +2 -2
- package/dist/bin/commands/agent-setup.d.ts +0 -6
- package/dist/bin/commands/agent-setup.d.ts.map +0 -1
- package/dist/bin/commands/agent-setup.js.map +0 -1
- package/dist/bin/commands/build.d.ts +0 -11
- package/dist/bin/commands/build.d.ts.map +0 -1
- package/dist/bin/commands/build.js.map +0 -1
- package/dist/bin/commands/bump.d.ts +0 -11
- package/dist/bin/commands/bump.d.ts.map +0 -1
- package/dist/bin/commands/bump.js.map +0 -1
- package/dist/bin/commands/cacheout.d.ts +0 -11
- package/dist/bin/commands/cacheout.d.ts.map +0 -1
- package/dist/bin/commands/cacheout.js.map +0 -1
- package/dist/bin/commands/create-app.d.ts +0 -11
- package/dist/bin/commands/create-app.d.ts.map +0 -1
- package/dist/bin/commands/create-app.js.map +0 -1
- package/dist/bin/commands/create-project.d.ts +0 -11
- package/dist/bin/commands/create-project.d.ts.map +0 -1
- package/dist/bin/commands/create-project.js.map +0 -1
- package/dist/bin/commands/deploy.d.ts +0 -11
- package/dist/bin/commands/deploy.d.ts.map +0 -1
- package/dist/bin/commands/deploy.js.map +0 -1
- package/dist/bin/commands/dev.d.ts +0 -11
- package/dist/bin/commands/dev.d.ts.map +0 -1
- package/dist/bin/commands/dev.js.map +0 -1
- package/dist/bin/commands/doctor.d.ts +0 -6
- package/dist/bin/commands/doctor.d.ts.map +0 -1
- package/dist/bin/commands/doctor.js.map +0 -1
- package/dist/bin/commands/emu.d.ts +0 -11
- package/dist/bin/commands/emu.d.ts.map +0 -1
- package/dist/bin/commands/emu.js.map +0 -1
- package/dist/bin/commands/format.d.ts +0 -11
- package/dist/bin/commands/format.d.ts.map +0 -1
- package/dist/bin/commands/format.js.map +0 -1
- package/dist/bin/commands/make-admin.d.ts +0 -11
- package/dist/bin/commands/make-admin.d.ts.map +0 -1
- package/dist/bin/commands/make-admin.js.map +0 -1
- package/dist/bin/commands/preview.d.ts +0 -11
- package/dist/bin/commands/preview.d.ts.map +0 -1
- package/dist/bin/commands/preview.js.map +0 -1
- package/dist/bin/commands/setup.d.ts +0 -6
- package/dist/bin/commands/setup.d.ts.map +0 -1
- package/dist/bin/commands/setup.js.map +0 -1
- package/dist/bin/commands/sync-secrets.d.ts +0 -11
- package/dist/bin/commands/sync-secrets.d.ts.map +0 -1
- package/dist/bin/commands/sync-secrets.js.map +0 -1
- package/dist/bin/commands/type-check.d.ts +0 -14
- package/dist/bin/commands/type-check.d.ts.map +0 -1
- package/dist/bin/commands/type-check.js.map +0 -1
- package/dist/bin/commands/wai.d.ts +0 -11
- package/dist/bin/commands/wai.d.ts.map +0 -1
- package/dist/bin/commands/wai.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/templates/app-demo/src/components/ThemeToggle.tsx.example +0 -48
- package/templates/app-demo/src/pages/DetailPage.tsx.example +0 -103
- package/templates/app-demo/src/pages/FullPage.tsx.example +0 -142
- package/templates/app-demo/src/pages/components/DemoLayout.tsx.example +0 -266
- package/templates/app-demo/src/pages/components/LayoutRoute.tsx.example +0 -20
- package/templates/functions-firebase/functions-firebase/README.md.example +0 -123
- package/templates/functions-firebase/functions-firebase/build.mjs.example +0 -5
- package/templates/functions-firebase/functions-firebase/src/auth/getCustomClaims.ts.example +0 -19
- package/templates/functions-firebase/functions-firebase/src/auth/getUserAuthStatus.ts.example +0 -21
- package/templates/functions-firebase/functions-firebase/src/auth/index.ts.example +0 -11
- package/templates/functions-firebase/functions-firebase/src/auth/removeCustomClaims.ts.example +0 -21
- package/templates/functions-firebase/functions-firebase/src/auth/setCustomClaims.ts.example +0 -21
- package/templates/functions-firebase/functions-firebase/src/billing/handleStripeWebhook.ts.example +0 -24
- package/templates/functions-firebase/functions-firebase/src/billing/index.ts.example +0 -10
- package/templates/functions-firebase/functions-firebase/src/billing/processPaymentSuccess.ts.example +0 -14
- package/templates/functions-firebase/functions-firebase/src/billing/refreshSubscriptionStatus.ts.example +0 -14
- package/templates/functions-firebase/functions-firebase/src/index.ts.example +0 -39
- package/templates/functions-firebase/functions-firebase/src/oauth/checkGitHubAccess.ts.example +0 -14
- package/templates/functions-firebase/functions-firebase/src/oauth/disconnect.ts.example +0 -14
- package/templates/functions-firebase/functions-firebase/src/oauth/exchangeToken.ts.example +0 -14
- package/templates/functions-firebase/functions-firebase/src/oauth/getConnections.ts.example +0 -14
- package/templates/functions-firebase/functions-firebase/src/oauth/grantGitHubAccess.ts.example +0 -14
- package/templates/functions-firebase/functions-firebase/src/oauth/index.ts.example +0 -17
- package/templates/functions-firebase/functions-firebase/src/oauth/refreshToken.ts.example +0 -14
- package/templates/functions-firebase/functions-firebase/src/oauth/revokeGitHubAccess.ts.example +0 -14
- package/templates/functions-firebase/functions-firebase/tsconfig.json.example +0 -21
- package/templates/functions-vercel/functions-vercel/README.md.example +0 -116
- package/templates/functions-vercel/functions-vercel/build.mjs.example +0 -52
- package/templates/functions-vercel/functions-vercel/src/api/auth/getCustomClaims.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/auth/getUserAuthStatus.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/auth/removeCustomClaims.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/auth/setCustomClaims.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/billing/handleStripeWebhook.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/billing/processPaymentSuccess.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/billing/refreshSubscriptionStatus.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/crud/createEntity.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/crud/deleteEntity.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/crud/getEntity.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/crud/listEntities.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/crud/updateEntity.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/oauth/checkGitHubAccess.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/oauth/disconnect.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/oauth/exchangeToken.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/oauth/getConnections.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/oauth/grantGitHubAccess.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/oauth/refreshToken.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/src/api/oauth/revokeGitHubAccess.ts.example +0 -20
- package/templates/functions-vercel/functions-vercel/tsconfig.json.example +0 -21
- package/templates/functions-vercel/functions-vercel/vercel.json.example +0 -14
- package/templates/github/github/workflows/firebase-deploy.yml.example +0 -79
- /package/templates/functions-firebase/{functions-firebase/.env.example.example → .env.example} +0 -0
- /package/templates/functions-vercel/{functions-vercel/.env.example.example → .env.example} +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { useMemo, useState } from 'react';
|
|
2
|
+
import { useNavigate } from 'react-router-dom';
|
|
3
|
+
import { Component } from 'lucide-react';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
Badge,
|
|
7
|
+
Card,
|
|
8
|
+
Grid,
|
|
9
|
+
Input,
|
|
10
|
+
Section,
|
|
11
|
+
Stack,
|
|
12
|
+
Tabs,
|
|
13
|
+
} from '@donotdev/components';
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
COMPONENT_CONFIGS,
|
|
17
|
+
getCSSFamilies,
|
|
18
|
+
} from './components/componentConfig';
|
|
19
|
+
|
|
20
|
+
import type { PageMeta } from '@donotdev/core';
|
|
21
|
+
import type { CSSFamily } from './components/ComponentsData';
|
|
22
|
+
|
|
23
|
+
export const meta: PageMeta = {
|
|
24
|
+
icon: <Component />,
|
|
25
|
+
preset: 'admin',
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export default function ShowcasePage() {
|
|
29
|
+
const navigate = useNavigate();
|
|
30
|
+
const [selectedTab, setSelectedTab] = useState<CSSFamily | 'all'>('all');
|
|
31
|
+
const [searchQuery, setSearchQuery] = useState('');
|
|
32
|
+
|
|
33
|
+
const componentsInTab = useMemo(() => {
|
|
34
|
+
return COMPONENT_CONFIGS.filter((config) => {
|
|
35
|
+
if (selectedTab !== 'all' && config.cssFamily !== selectedTab)
|
|
36
|
+
return false;
|
|
37
|
+
return (
|
|
38
|
+
searchQuery === '' ||
|
|
39
|
+
config.name.toLowerCase().includes(searchQuery.toLowerCase())
|
|
40
|
+
);
|
|
41
|
+
}).sort((a, b) => a.name.localeCompare(b.name));
|
|
42
|
+
}, [selectedTab, searchQuery]);
|
|
43
|
+
|
|
44
|
+
const cssFamilies = getCSSFamilies();
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<Stack gap="large">
|
|
48
|
+
<Stack direction="row" gap="medium" align="end" wrap="wrap">
|
|
49
|
+
<Input
|
|
50
|
+
placeholder="Filter components..."
|
|
51
|
+
value={searchQuery}
|
|
52
|
+
onChange={(e) => setSearchQuery(e.target.value)}
|
|
53
|
+
/>
|
|
54
|
+
</Stack>
|
|
55
|
+
|
|
56
|
+
<Tabs
|
|
57
|
+
items={cssFamilies.map((family) => ({
|
|
58
|
+
value: family.id,
|
|
59
|
+
label: family.label,
|
|
60
|
+
content: null,
|
|
61
|
+
}))}
|
|
62
|
+
value={selectedTab}
|
|
63
|
+
onValueChange={(value) => setSelectedTab(value as CSSFamily | 'all')}
|
|
64
|
+
/>
|
|
65
|
+
|
|
66
|
+
<Section
|
|
67
|
+
title={
|
|
68
|
+
cssFamilies.find((f) => f.id === selectedTab)?.label || 'Components'
|
|
69
|
+
}
|
|
70
|
+
>
|
|
71
|
+
<Grid cols={[1, 2, 3, 4]} gap="medium">
|
|
72
|
+
{componentsInTab.map((config) => (
|
|
73
|
+
<Card
|
|
74
|
+
key={config.id}
|
|
75
|
+
title={config.name}
|
|
76
|
+
clickable
|
|
77
|
+
onClick={() => navigate(`/showcase/${config.id}`)}
|
|
78
|
+
>
|
|
79
|
+
<Stack direction="row" justify="end">
|
|
80
|
+
<Badge variant="secondary">
|
|
81
|
+
{cssFamilies.find((f) => f.id === config.cssFamily)?.label ||
|
|
82
|
+
config.cssFamily}
|
|
83
|
+
</Badge>
|
|
84
|
+
</Stack>
|
|
85
|
+
</Card>
|
|
86
|
+
))}
|
|
87
|
+
</Grid>
|
|
88
|
+
</Section>
|
|
89
|
+
</Stack>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Scale } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
import { LegalNoticeTemplate } from '@donotdev/templates';
|
|
4
|
+
|
|
5
|
+
import type { PageMeta } from '@donotdev/core';
|
|
6
|
+
|
|
7
|
+
export const meta: PageMeta = {
|
|
8
|
+
icon: <Scale />,
|
|
9
|
+
hideFromMenu: true,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default function LegalPage() {
|
|
13
|
+
return <LegalNoticeTemplate />;
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Shield } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
import { PrivacyPolicyTemplate } from '@donotdev/templates';
|
|
4
|
+
|
|
5
|
+
import type { PageMeta } from '@donotdev/core';
|
|
6
|
+
|
|
7
|
+
export const meta: PageMeta = {
|
|
8
|
+
icon: <Shield />,
|
|
9
|
+
hideFromMenu: true,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default function PrivacyPage() {
|
|
13
|
+
return <PrivacyPolicyTemplate />;
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FileText } from 'lucide-react';
|
|
2
|
+
|
|
3
|
+
import { TermsOfServiceTemplate } from '@donotdev/templates';
|
|
4
|
+
|
|
5
|
+
import type { PageMeta } from '@donotdev/core';
|
|
6
|
+
|
|
7
|
+
export const meta: PageMeta = {
|
|
8
|
+
icon: <FileText />,
|
|
9
|
+
hideFromMenu: true,
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export default function TermsPage() {
|
|
13
|
+
return <TermsOfServiceTemplate />;
|
|
14
|
+
}
|
|
@@ -1,53 +1,28 @@
|
|
|
1
1
|
// apps/demo/vite.config.ts
|
|
2
|
-
import react from '@vitejs/plugin-react';
|
|
3
|
-
import { defineConfig } from 'vite';
|
|
4
|
-
import tsconfigPaths from 'vite-tsconfig-paths';
|
|
5
|
-
import autoprefixer from 'autoprefixer';
|
|
6
|
-
// @ts-expect-error - postcss-import doesn't have type definitions
|
|
7
|
-
import postcssImport from 'postcss-import';
|
|
8
|
-
import postcssNesting from 'postcss-nesting';
|
|
9
|
-
import { resolve as pathResolve } from 'node:path';
|
|
10
|
-
import { createRequire } from 'node:module';
|
|
11
2
|
|
|
12
|
-
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Vite build configuration for the demo app
|
|
5
|
+
* @description Configures Vite build tool with application settings, development server, HMR, and file watching options for the demo application.
|
|
6
|
+
* @version 0.0.1
|
|
7
|
+
* @since 0.0.1
|
|
8
|
+
* @author AMBROISE PARK Consulting
|
|
9
|
+
*/
|
|
13
10
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (!id.startsWith('.')) {
|
|
30
|
-
try {
|
|
31
|
-
return require.resolve(id, { paths: [basedir] });
|
|
32
|
-
} catch {
|
|
33
|
-
// Fallback to relative resolution
|
|
34
|
-
return pathResolve(basedir, id);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
// Relative imports
|
|
38
|
-
return pathResolve(basedir, id);
|
|
39
|
-
},
|
|
40
|
-
}),
|
|
41
|
-
postcssNesting,
|
|
42
|
-
autoprefixer,
|
|
43
|
-
],
|
|
11
|
+
import { defineViteConfig } from '@donotdev/core/vite';
|
|
12
|
+
|
|
13
|
+
import { appConfig } from './src/config/app';
|
|
14
|
+
|
|
15
|
+
// Features and SEO are now in app.ts (runtime config)
|
|
16
|
+
// Only build-time configs (routes, themes, i18n, assets) go here
|
|
17
|
+
export default defineViteConfig({
|
|
18
|
+
appConfig,
|
|
19
|
+
server: {
|
|
20
|
+
port: 3003,
|
|
21
|
+
https: false,
|
|
22
|
+
|
|
23
|
+
// HMR Configuration - Enabled for debugging
|
|
24
|
+
hmr: {
|
|
25
|
+
overlay: true, // Show error overlay in browser
|
|
44
26
|
},
|
|
45
27
|
},
|
|
46
|
-
|
|
47
|
-
include: ['react', 'react-dom', 'react/jsx-runtime'],
|
|
48
|
-
},
|
|
49
|
-
resolve: {
|
|
50
|
-
dedupe: ['react', 'react-dom'],
|
|
51
|
-
preserveSymlinks: false,
|
|
52
|
-
},
|
|
53
|
-
});
|
|
28
|
+
});
|
|
@@ -8,7 +8,7 @@ Mobile app built with DoNotDev Framework and Expo.
|
|
|
8
8
|
|
|
9
9
|
- Node.js 20+ and Bun 1.3+
|
|
10
10
|
- Expo Go app on your phone (for development)
|
|
11
|
-
-
|
|
11
|
+
- Provider configured (run `dndev coach` then `dndev setup`)
|
|
12
12
|
|
|
13
13
|
### Development
|
|
14
14
|
|
|
@@ -51,17 +51,15 @@ export default function HomePage() {
|
|
|
51
51
|
/>
|
|
52
52
|
|
|
53
53
|
<Card
|
|
54
|
-
title="2.
|
|
54
|
+
title="2. Provider Setup"
|
|
55
55
|
content={[
|
|
56
|
-
'Run: dndev
|
|
57
|
-
'This
|
|
58
|
-
' -
|
|
59
|
-
' -
|
|
60
|
-
'
|
|
61
|
-
'
|
|
62
|
-
'
|
|
63
|
-
' - Download service account key',
|
|
64
|
-
' - Enable Auth + Firestore in Firebase Console',
|
|
56
|
+
'Run: dndev coach',
|
|
57
|
+
'This shows what to configure:',
|
|
58
|
+
' - Which dashboard to visit',
|
|
59
|
+
' - What to copy and where to paste it',
|
|
60
|
+
'Fill in your .env values, then run:',
|
|
61
|
+
' dndev setup',
|
|
62
|
+
'Setup validates, automates, and health-checks.',
|
|
65
63
|
]}
|
|
66
64
|
/>
|
|
67
65
|
</Grid>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Firebase Configuration
|
|
4
4
|
# =============================================================================
|
|
5
5
|
# Get these values from your Firebase project settings
|
|
6
|
-
# Run `dndev
|
|
6
|
+
# Run `dndev coach` to see where to get these, then `dndev setup` to validate
|
|
7
7
|
VITE_FIREBASE_API_KEY=
|
|
8
8
|
VITE_FIREBASE_PROJECT_ID=
|
|
9
9
|
# Copy from Firebase Console. Framework uses APP_URL hostname in production automatically.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Firebase Configuration
|
|
4
4
|
# =============================================================================
|
|
5
5
|
# Get these values from your Firebase project settings
|
|
6
|
-
# Run `dndev
|
|
6
|
+
# Run `dndev coach` to see where to get these, then `dndev setup` to validate
|
|
7
7
|
EXPO_PUBLIC_FIREBASE_API_KEY=
|
|
8
8
|
EXPO_PUBLIC_FIREBASE_PROJECT_ID=
|
|
9
9
|
# Copy from Firebase Console. Framework uses APP_URL hostname in production automatically.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Firebase Configuration
|
|
4
4
|
# =============================================================================
|
|
5
5
|
# Get these values from your Firebase project settings
|
|
6
|
-
# Run `dndev
|
|
6
|
+
# Run `dndev coach` to see where to get these, then `dndev setup` to validate
|
|
7
7
|
NEXT_PUBLIC_FIREBASE_API_KEY=
|
|
8
8
|
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
|
|
9
9
|
# Copy from Firebase Console. Framework uses APP_URL hostname in production automatically.
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# - Project URL: the https://xxx.supabase.co URL
|
|
7
7
|
# - Public key: "Publishable key" (sb_publishable_...) or legacy "anon key" (eyJ...)
|
|
8
8
|
#
|
|
9
|
-
# Then run: dndev setup
|
|
9
|
+
# Then run: dndev setup
|
|
10
10
|
# =============================================================================
|
|
11
11
|
VITE_SUPABASE_URL=
|
|
12
12
|
VITE_SUPABASE_PUBLIC_KEY=
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# - Project URL: the https://xxx.supabase.co URL
|
|
7
7
|
# - Public key: "Publishable key" (sb_publishable_...) or legacy "anon key" (eyJ...)
|
|
8
8
|
#
|
|
9
|
-
# Then run: dndev setup
|
|
9
|
+
# Then run: dndev setup
|
|
10
10
|
# =============================================================================
|
|
11
11
|
EXPO_PUBLIC_SUPABASE_URL=
|
|
12
12
|
EXPO_PUBLIC_SUPABASE_PUBLIC_KEY=
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# - Project URL: the https://xxx.supabase.co URL
|
|
7
7
|
# - Public key: "Publishable key" (sb_publishable_...) or legacy "anon key" (eyJ...)
|
|
8
8
|
#
|
|
9
|
-
# Then run: dndev setup
|
|
9
|
+
# Then run: dndev setup
|
|
10
10
|
# =============================================================================
|
|
11
11
|
NEXT_PUBLIC_SUPABASE_URL=
|
|
12
12
|
NEXT_PUBLIC_SUPABASE_PUBLIC_KEY=
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Firebase Configuration (data layer for Vercel-hosted app)
|
|
4
4
|
# =============================================================================
|
|
5
5
|
# Get these values from your Firebase project settings
|
|
6
|
-
# Run `dndev
|
|
6
|
+
# Run `dndev coach` to see where to get these, then `dndev setup` to validate
|
|
7
7
|
VITE_FIREBASE_API_KEY=
|
|
8
8
|
VITE_FIREBASE_PROJECT_ID=
|
|
9
9
|
# Copy from Firebase Console. Framework uses APP_URL hostname in production automatically.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Firebase Configuration (data layer for Vercel-hosted app)
|
|
4
4
|
# =============================================================================
|
|
5
5
|
# Get these values from your Firebase project settings
|
|
6
|
-
# Run `dndev
|
|
6
|
+
# Run `dndev coach` to see where to get these, then `dndev setup` to validate
|
|
7
7
|
NEXT_PUBLIC_FIREBASE_API_KEY=
|
|
8
8
|
NEXT_PUBLIC_FIREBASE_PROJECT_ID=
|
|
9
9
|
# Copy from Firebase Console. Framework uses APP_URL hostname in production automatically.
|
|
@@ -41,6 +41,14 @@ description: Extract requirements and generate complete HLD through conversation
|
|
|
41
41
|
|
|
42
42
|
## Process
|
|
43
43
|
|
|
44
|
+
### Step 0: Start Phase (MANDATORY — DO THIS FIRST)
|
|
45
|
+
|
|
46
|
+
**BEFORE asking any questions or doing any work**, call:
|
|
47
|
+
```
|
|
48
|
+
start_phase(0)
|
|
49
|
+
```
|
|
50
|
+
This activates Phase 0: BRAINSTORM and loads the blueprint, persona, context, and lessons learned from previous sessions. **Do NOT proceed without this call.**
|
|
51
|
+
|
|
44
52
|
### Step 1: Activate EXTRACTOR Agent
|
|
45
53
|
|
|
46
54
|
**Deploy:** `/agents extractor` (BMAD EXTRACTOR persona)
|
|
@@ -87,7 +95,7 @@ EXTRACTOR generates `HLD.md` with:
|
|
|
87
95
|
|
|
88
96
|
---
|
|
89
97
|
|
|
90
|
-
## Validation Gate
|
|
98
|
+
## Validation Gate & Phase Completion (MANDATORY)
|
|
91
99
|
|
|
92
100
|
**Before proceeding to `/design`:**
|
|
93
101
|
- [ ] HLD is complete (no empty sections or TBDs)
|
|
@@ -97,6 +105,12 @@ EXTRACTOR generates `HLD.md` with:
|
|
|
97
105
|
- [ ] Native vs custom analysis complete
|
|
98
106
|
- [ ] User has validated HLD
|
|
99
107
|
|
|
108
|
+
**When HLD is complete**, write the filled-out spec to `docs/HLD.md` (the template at `guides/wai-way/spec_template.md` stays untouched as reference). Then call:
|
|
109
|
+
```
|
|
110
|
+
complete_phase({ files: ["docs/HLD.md"], summary: "HLD complete — N entities, N pages, N features" })
|
|
111
|
+
```
|
|
112
|
+
Then wait for the user to call `approve_phase()` before moving to `/design`.
|
|
113
|
+
|
|
100
114
|
**Quality Over Speed:** Take as long as needed. A complete HLD that takes 4 hours is better than an incomplete one that takes 20 minutes.
|
|
101
115
|
|
|
102
116
|
---
|
|
@@ -36,6 +36,14 @@ description: Two-agent workflow: Prompt Engineer → Coder (AFTER /design)
|
|
|
36
36
|
|
|
37
37
|
## Process
|
|
38
38
|
|
|
39
|
+
### Step 0: Start Phase (MANDATORY — DO THIS FIRST)
|
|
40
|
+
|
|
41
|
+
**BEFORE writing any code**, call:
|
|
42
|
+
```
|
|
43
|
+
start_phase(3)
|
|
44
|
+
```
|
|
45
|
+
This activates Phase 3: COMPOSE and loads the blueprint, persona, context, and lessons. **Do NOT write code without this call.**
|
|
46
|
+
|
|
39
47
|
### Step 1: Activate FORGER Agent
|
|
40
48
|
|
|
41
49
|
**Deploy:** `/agents builder` (BMAD FORGER persona)
|
|
@@ -54,10 +62,19 @@ description: Two-agent workflow: Prompt Engineer → Coder (AFTER /design)
|
|
|
54
62
|
- Phase 6: Integration (wire everything together)
|
|
55
63
|
4. Use framework defaults ONLY (no styling, no customization)
|
|
56
64
|
5. Hardcode all strings (no i18n yet)
|
|
57
|
-
6.
|
|
65
|
+
6. Run `dndev tc` after every file change — type errors must be fixed immediately
|
|
66
|
+
7. Validate each phase before proceeding
|
|
58
67
|
|
|
59
68
|
**Output:** Working app (functional MVP, no styling)
|
|
60
69
|
|
|
70
|
+
### Phase Completion (MANDATORY)
|
|
71
|
+
|
|
72
|
+
When all pages are built and `dndev tc` passes, call:
|
|
73
|
+
```
|
|
74
|
+
complete_phase({ files: ["src/pages/...all page files..."], summary: "N pages composed, all type-checking" })
|
|
75
|
+
```
|
|
76
|
+
Wait for user to call `approve_phase()` before moving to `/polish`.
|
|
77
|
+
|
|
61
78
|
---
|
|
62
79
|
|
|
63
80
|
## Alternative: Two-Agent Workflow
|
|
@@ -79,10 +96,15 @@ For complex builds, you can use:
|
|
|
79
96
|
- **Builder (FORGER):** Implements exactly what's in LLD, uses framework defaults only
|
|
80
97
|
- **Framework defaults ONLY:** No styling, no customization (deferred to /polish)
|
|
81
98
|
- **Hardcode strings:** No i18n yet (deferred to /polish)
|
|
82
|
-
- **MCP required:** Use lookup_symbol for ALL components
|
|
83
99
|
- **Phase by phase:** Complete each phase before proceeding
|
|
84
100
|
- **User:** Reviews output, proceeds to /polish when functional
|
|
85
101
|
|
|
102
|
+
## STOP — lookup_symbol Before Every Component (Repeated Here On Purpose)
|
|
103
|
+
|
|
104
|
+
**STOP before writing ANY `@donotdev` import.** Call `lookup_symbol({ symbol: "Name" })` first. Do NOT guess props, hooks, or APIs. Do NOT proceed without verification. `complete_phase` will reject un-looked-up symbols.
|
|
105
|
+
|
|
106
|
+
**Import convention:** Always `@donotdev/<package>` — never sub-paths. No `@donotdev/ui/routing`, no `@donotdev/components/card`. The only exceptions are `@donotdev/core/server`, `@donotdev/core/vite`, `@donotdev/core/next`, `@donotdev/core/functions`.
|
|
107
|
+
|
|
86
108
|
## Mode Detection
|
|
87
109
|
|
|
88
110
|
**CRITICAL:** Check working mode first.
|
|
@@ -36,6 +36,21 @@ description: Design workflow: Architect → Design Document (BEFORE /build)
|
|
|
36
36
|
|
|
37
37
|
## Process
|
|
38
38
|
|
|
39
|
+
### Step 0: Start Phase (MANDATORY — DO THIS FIRST)
|
|
40
|
+
|
|
41
|
+
**BEFORE doing any design work**, call the appropriate phase:
|
|
42
|
+
```
|
|
43
|
+
start_phase(1) # for SCAFFOLD (routes, page stubs)
|
|
44
|
+
start_phase(2) # for ENTITIES (data models, fields, access)
|
|
45
|
+
```
|
|
46
|
+
This loads the blueprint, persona, context, and lessons. **Do NOT proceed without this call.**
|
|
47
|
+
|
|
48
|
+
When design work is complete, call:
|
|
49
|
+
```
|
|
50
|
+
complete_phase({ files: ["...affected files..."], summary: "Description of what was designed" })
|
|
51
|
+
```
|
|
52
|
+
Wait for user to call `approve_phase()` before moving on.
|
|
53
|
+
|
|
39
54
|
### Step 1: Architect Phase
|
|
40
55
|
|
|
41
56
|
**Deploy:** `/agents architect` (WAI-WAY architect role)
|
|
@@ -102,6 +117,8 @@ UNRESOLVED:
|
|
|
102
117
|
- **ALWAYS reference framework architecture** - stay aligned
|
|
103
118
|
- **ALWAYS identify impacts** - what breaks if we change this?
|
|
104
119
|
- **ALWAYS prepare for /build** - design should be actionable
|
|
120
|
+
- **ALWAYS use `lookup_symbol`** when referencing @donotdev components in your design — verify the API exists before putting it in the plan
|
|
121
|
+
- **Import convention:** Always `@donotdev/<package>` top-level, never sub-paths. The only exceptions are `@donotdev/core/server`, `@donotdev/core/vite`, `@donotdev/core/next`, `@donotdev/core/functions`
|
|
105
122
|
|
|
106
123
|
## Integration with WAI-WAY & BMAD
|
|
107
124
|
|
|
@@ -42,6 +42,14 @@ description: Generate tests, firestore rules, CI/CD, config, fix bugs, i18n (Pha
|
|
|
42
42
|
|
|
43
43
|
## Process
|
|
44
44
|
|
|
45
|
+
### Step 0: Start Phase (MANDATORY — DO THIS FIRST)
|
|
46
|
+
|
|
47
|
+
**BEFORE any polish work**, call:
|
|
48
|
+
```
|
|
49
|
+
start_phase(4)
|
|
50
|
+
```
|
|
51
|
+
This activates Phase 4: CONFIGURE and loads the blueprint, persona, context, and lessons. **Do NOT proceed without this call.**
|
|
52
|
+
|
|
45
53
|
### Step 1: Activate Polisher Agent
|
|
46
54
|
|
|
47
55
|
**Deploy:** `/agents polisher` (Phase 4 Polisher persona)
|
|
@@ -112,6 +120,7 @@ Extract strings to `src/locales/`, replace with `useTranslation()`.
|
|
|
112
120
|
## Ship Readiness
|
|
113
121
|
|
|
114
122
|
App is ready to ship when:
|
|
123
|
+
- ✅ `dndev tc` passes
|
|
115
124
|
- ✅ `bun test` passes
|
|
116
125
|
- ✅ `firestore.rules` generated
|
|
117
126
|
- ✅ `.github/workflows/ci.yml` created
|
|
@@ -121,6 +130,14 @@ App is ready to ship when:
|
|
|
121
130
|
- ✅ Configuration complete
|
|
122
131
|
- ✅ (Optional) i18n added
|
|
123
132
|
|
|
133
|
+
## Phase Completion (MANDATORY)
|
|
134
|
+
|
|
135
|
+
When all ship readiness checks pass, call:
|
|
136
|
+
```
|
|
137
|
+
complete_phase({ files: ["...all test/config files..."], summary: "Tests passing, config complete, ready to ship" })
|
|
138
|
+
```
|
|
139
|
+
Wait for user to call `approve_phase()`.
|
|
140
|
+
|
|
124
141
|
---
|
|
125
142
|
|
|
126
143
|
## Next Step
|
|
@@ -2,52 +2,83 @@
|
|
|
2
2
|
|
|
3
3
|
> **You are building a DoNotDev app.** Read this file completely before doing anything else.
|
|
4
4
|
|
|
5
|
+
## Welcome
|
|
6
|
+
|
|
7
|
+
We'll build your app together in **5 structured phases**: brainstorm requirements, scaffold pages, define data, wire everything up, and polish for production. Each phase has a clear deliverable and validation gate. This isn't freeform coding — there's a proven methodology that produces solid, production-ready apps.
|
|
8
|
+
|
|
5
9
|
## What To Do Right Now
|
|
6
10
|
|
|
7
11
|
1. **Verify MCP is working.** Call `list_features()`. If it fails, run `get_guide("AGENT_START_HERE")` for IDE-specific setup.
|
|
8
12
|
2. Call `start_phase(0)` — begin **Phase 0: BRAINSTORM**
|
|
9
|
-
3. Follow each phase in order. Do not skip phases.
|
|
13
|
+
3. Follow each phase in order. **Do not skip phases. Do not work outside a phase.**
|
|
14
|
+
|
|
15
|
+
## The 5 Phases — MANDATORY
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
**ALL work MUST happen inside an active phase.** Call `start_phase(N)` BEFORE writing any code or documents. Call `complete_phase({ files })` BEFORE moving to the next phase. Working outside a phase is a violation — no exceptions.
|
|
12
18
|
|
|
13
|
-
| Phase | Name | What Happens |
|
|
14
|
-
|
|
15
|
-
| 0 | **BRAINSTORM** | Ask questions, understand requirements, produce validated spec |
|
|
16
|
-
| 1 | **SCAFFOLD** | Create all routes and page stubs from spec |
|
|
17
|
-
| 2 | **ENTITIES** | Define all data models (fields, access, visibility) |
|
|
18
|
-
| 3 | **COMPOSE** | Build pages with framework components (hardcode strings) |
|
|
19
|
-
| 4 | **CONFIGURE** | Config, test, polish, i18n. Run `/grill` and `/techdebt` before shipping |
|
|
19
|
+
| Phase | Name | Slash Command | What Happens |
|
|
20
|
+
|-------|------|---------------|-------------|
|
|
21
|
+
| 0 | **BRAINSTORM** | `/brainstorm` | Ask questions, understand requirements, produce validated spec |
|
|
22
|
+
| 1 | **SCAFFOLD** | `/design` | Create all routes and page stubs from spec |
|
|
23
|
+
| 2 | **ENTITIES** | `/design` | Define all data models (fields, access, visibility) |
|
|
24
|
+
| 3 | **COMPOSE** | `/build` | Build pages with framework components (hardcode strings) |
|
|
25
|
+
| 4 | **CONFIGURE** | `/polish` | Config, test, polish, i18n. Run `/grill` and `/techdebt` before shipping |
|
|
20
26
|
|
|
21
|
-
## Workflow Per Phase
|
|
27
|
+
## Workflow Per Phase — NON-NEGOTIABLE
|
|
22
28
|
|
|
23
29
|
```
|
|
24
30
|
start_phase(N) → get blueprint + persona + context + lessons
|
|
25
31
|
↓
|
|
26
32
|
work → follow blueprint, lookup_symbol for every component
|
|
27
33
|
↓
|
|
34
|
+
dndev tc → type-check MUST pass before completing phase
|
|
35
|
+
↓
|
|
28
36
|
complete_phase(files) → validate conventions + symbol usage → submit for review
|
|
29
37
|
↓
|
|
30
|
-
approve_phase() →
|
|
38
|
+
approve_phase() → user approves, move to next phase
|
|
31
39
|
```
|
|
32
40
|
|
|
33
|
-
|
|
41
|
+
**You MUST call `start_phase(N)` before ANY work in that phase.**
|
|
42
|
+
**You MUST call `complete_phase({ files })` when the phase is done.**
|
|
43
|
+
**You MUST run `dndev tc` after every code change and before every `complete_phase`.**
|
|
44
|
+
Skipping these steps means the work is untracked, unvalidated, and unacceptable.
|
|
45
|
+
|
|
46
|
+
## STOP — lookup_symbol Before ANY @donotdev Code
|
|
34
47
|
|
|
35
|
-
**
|
|
48
|
+
**STOP. Before writing ANY `@donotdev` import, call `lookup_symbol({ symbol: "Name" })`.** Do NOT guess. Do NOT proceed without it. `complete_phase` rejects un-looked-up symbols.
|
|
36
49
|
|
|
37
|
-
|
|
50
|
+
**Always import from `@donotdev/<package>` top-level** — never sub-paths. See `get_guide("SETUP_PAGES")` for conventions and patterns.
|
|
38
51
|
|
|
39
52
|
## CLI Commands
|
|
40
53
|
|
|
41
|
-
`dndev` is
|
|
54
|
+
`dndev` is installed globally via `bun install -g` (no sudo needed) and also as a local devDependency. Run it directly — or use `bun run dev` / `bunx dndev` as fallback.
|
|
42
55
|
|
|
43
56
|
| Command | What it does |
|
|
44
57
|
|---------|-------------|
|
|
45
|
-
| `dndev create-app` | Interactive wizard — creates a new app in the monorepo |
|
|
46
58
|
| `dndev dev` | Start the dev server (Vite/Next.js via Turbo) |
|
|
47
|
-
| `dndev
|
|
59
|
+
| `dndev dev:myapp` | Start dev server for a specific app |
|
|
60
|
+
| `dndev build` | Build for production |
|
|
61
|
+
| `dndev preview` | Preview production build |
|
|
62
|
+
| `dndev emu` | Start dev with Firebase emulators |
|
|
63
|
+
| `dndev tc` | **Type-check all packages — run after every code change** |
|
|
64
|
+
| `dndev tc:myapp` | Type-check a specific app |
|
|
65
|
+
| `dndev format` | Format code with Prettier |
|
|
48
66
|
| `dndev deploy` | Deploy to production |
|
|
49
|
-
| `dndev
|
|
50
|
-
| `dndev
|
|
67
|
+
| `dndev staging` | Deploy to staging/UAT |
|
|
68
|
+
| `dndev coach` | Show what to configure before running setup |
|
|
69
|
+
| `dndev setup` | Validate .env, automate provider setup, health check |
|
|
70
|
+
| `dndev doctor` | Check project health (providers, .env) |
|
|
71
|
+
| `dndev bump` | Update @donotdev packages to latest |
|
|
72
|
+
| `dndev cacheout` | Clear build caches |
|
|
73
|
+
| `dndev sync-secrets` | Sync env vars to Firebase/Vercel/GitHub |
|
|
74
|
+
| `dndev make-admin` | Set a user as admin |
|
|
75
|
+
| `dndev agent` | Configure MCP server for AI agents |
|
|
76
|
+
| `dndev wai` | Output WAI-WAY activation prompt |
|
|
77
|
+
| `dndev create-app` | Interactive wizard — creates a new app in the monorepo |
|
|
78
|
+
|
|
79
|
+
Most commands support `:<app>` syntax: `dndev dev:web`, `dndev tc:admin`, `dndev build:public`.
|
|
80
|
+
|
|
81
|
+
Run `dndev --help` for the full command list.
|
|
51
82
|
|
|
52
83
|
`dndev create-app` is **interactive** — it prompts for builder (Vite/Next.js/Expo), backend (Firebase/Supabase/none), and features. There is no `--preset` flag.
|
|
53
84
|
|
|
@@ -56,6 +87,7 @@ Without MCP: read `.d.ts` files directly from `node_modules/@donotdev/*/dist/`.
|
|
|
56
87
|
- **ESM only** — never `require()`
|
|
57
88
|
- **RTL safe** — use `start`/`end`, never `left`/`right`
|
|
58
89
|
- **Import order** — React → vendors → @donotdev → relative
|
|
90
|
+
- **Import convention** — always `@donotdev/<pkg>` top-level, never sub-paths
|
|
59
91
|
- **Framework-first** — if something's missing, say what and stop
|
|
60
92
|
- **No .md file creation** — never create documentation/analysis/summary .md files unless explicitly asked. Session notes go in `.dndev/`
|
|
61
93
|
- **Follow existing patterns** — the scaffolded files ARE your documentation
|
|
@@ -64,8 +96,9 @@ Without MCP: read `.d.ts` files directly from `node_modules/@donotdev/*/dist/`.
|
|
|
64
96
|
|
|
65
97
|
Call `get_guide("AGENT_START_HERE")` for the full tool reference, IDE setup, env var guide, and fallback instructions.
|
|
66
98
|
|
|
67
|
-
Key tools: `start_phase` · `complete_phase` · `approve_phase` · `lookup_symbol` · `get_guide` · `get_guideline` · `search_framework` · `list_features` · `record_lesson`
|
|
99
|
+
Key tools: `start_phase` · `complete_phase` · `approve_phase` · `lookup_symbol` · `get_guide` · `get_guideline` · `search_framework` · `list_features` · `record_lesson` · `run_typecheck`
|
|
68
100
|
|
|
69
101
|
## Security Gate
|
|
70
102
|
|
|
71
|
-
Before production: run `
|
|
103
|
+
Before production: run `dndev doctor` and `/grill`. See `get_guide("SOC2")` for details.
|
|
104
|
+
Golden path: `dndev coach` → fill .env → `dndev setup` → `dndev doctor`.
|