@girardmedia/bootspring 1.2.0 → 2.0.3
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/README.md +107 -14
- package/bin/bootspring.js +166 -27
- package/cli/agent.js +189 -17
- package/cli/analyze.js +499 -0
- package/cli/audit.js +557 -0
- package/cli/auth.js +495 -38
- package/cli/billing.js +302 -0
- package/cli/build.js +695 -0
- package/cli/business.js +109 -26
- package/cli/checkpoint-utils.js +168 -0
- package/cli/checkpoint.js +639 -0
- package/cli/cloud-sync.js +447 -0
- package/cli/content.js +198 -0
- package/cli/context.js +1 -1
- package/cli/deploy.js +543 -0
- package/cli/fundraise.js +112 -50
- package/cli/github-cmd.js +435 -0
- package/cli/health.js +477 -0
- package/cli/init.js +84 -13
- package/cli/legal.js +107 -95
- package/cli/log.js +2 -2
- package/cli/loop.js +976 -73
- package/cli/manager.js +711 -0
- package/cli/metrics.js +480 -0
- package/cli/monitor.js +812 -0
- package/cli/onboard.js +521 -0
- package/cli/orchestrator.js +12 -24
- package/cli/prd.js +594 -0
- package/cli/preseed-start.js +1483 -0
- package/cli/preseed.js +2302 -0
- package/cli/project.js +436 -0
- package/cli/quality.js +233 -0
- package/cli/security.js +913 -0
- package/cli/seed.js +1441 -5
- package/cli/skill.js +273 -211
- package/cli/suggest.js +989 -0
- package/cli/switch.js +453 -0
- package/cli/visualize.js +527 -0
- package/cli/watch.js +769 -0
- package/cli/workspace.js +607 -0
- package/core/analyze-workflow.js +1134 -0
- package/core/api-client.js +535 -22
- package/core/audit-workflow.js +1350 -0
- package/core/build-orchestrator.js +480 -0
- package/core/build-state.js +577 -0
- package/core/checkpoint-engine.js +408 -0
- package/core/config.js +1109 -26
- package/core/context-loader.js +21 -1
- package/core/deploy-workflow.js +836 -0
- package/core/entitlements.js +93 -22
- package/core/github-sync.js +610 -0
- package/core/index.js +8 -1
- package/core/ingest.js +1111 -0
- package/core/metrics-engine.js +768 -0
- package/core/onboard-workflow.js +1007 -0
- package/core/preseed-workflow.js +934 -0
- package/core/preseed.js +1617 -0
- package/core/project-context.js +325 -0
- package/core/project-state.js +694 -0
- package/core/r2-sync.js +583 -0
- package/core/scaffold.js +525 -7
- package/core/session.js +258 -0
- package/core/task-extractor.js +758 -0
- package/core/telemetry.js +28 -6
- package/core/tier-enforcement.js +737 -0
- package/core/utils.js +38 -14
- package/generators/questionnaire.js +15 -12
- package/generators/sections/ai.js +7 -7
- package/generators/sections/content.js +300 -0
- package/generators/sections/index.js +3 -0
- package/generators/sections/plugins.js +7 -6
- package/generators/templates/build-planning.template.js +596 -0
- package/generators/templates/content.template.js +819 -0
- package/generators/templates/index.js +2 -1
- package/hooks/git-autopilot.js +1250 -0
- package/hooks/index.js +9 -0
- package/intelligence/agent-collab.js +2057 -0
- package/intelligence/auto-suggest.js +634 -0
- package/intelligence/content-gen.js +1589 -0
- package/intelligence/cross-project.js +1647 -0
- package/intelligence/index.js +184 -0
- package/intelligence/learning/insights.json +517 -7
- package/intelligence/learning/pattern-learner.js +1008 -14
- package/intelligence/memory/decision-tracker.js +1431 -31
- package/intelligence/memory/decisions.jsonl +0 -0
- package/intelligence/orchestrator.js +2896 -1
- package/intelligence/prd.js +92 -1
- package/intelligence/recommendation-weights.json +14 -2
- package/intelligence/recommendations.js +463 -9
- package/intelligence/workflow-composer.js +1451 -0
- package/marketplace/index.d.ts +324 -0
- package/marketplace/index.js +1921 -0
- package/mcp/contracts/mcp-contract.v1.json +342 -4
- package/mcp/registry.js +680 -3
- package/mcp/response-formatter.js +23 -0
- package/mcp/tools/assist-tool.js +78 -4
- package/mcp/tools/autopilot-tool.js +408 -0
- package/mcp/tools/content-tool.js +571 -0
- package/mcp/tools/dashboard-tool.js +251 -5
- package/mcp/tools/mvp-tool.js +344 -0
- package/mcp/tools/plugin-tool.js +23 -1
- package/mcp/tools/prd-tool.js +579 -0
- package/mcp/tools/seed-tool.js +447 -0
- package/mcp/tools/skill-tool.js +43 -14
- package/mcp/tools/suggest-tool.js +147 -0
- package/package.json +15 -6
- package/agents/README.md +0 -93
- package/agents/ai-integration-expert/context.md +0 -386
- package/agents/api-expert/context.md +0 -416
- package/agents/architecture-expert/context.md +0 -454
- package/agents/auth-expert/context.md +0 -399
- package/agents/backend-expert/context.md +0 -483
- package/agents/business-strategy-expert/context.md +0 -180
- package/agents/code-review-expert/context.md +0 -365
- package/agents/competitive-analysis-expert/context.md +0 -239
- package/agents/data-modeling-expert/context.md +0 -352
- package/agents/database-expert/context.md +0 -250
- package/agents/devops-expert/context.md +0 -446
- package/agents/email-expert/context.md +0 -379
- package/agents/financial-expert/context.md +0 -213
- package/agents/frontend-expert/context.md +0 -364
- package/agents/fundraising-expert/context.md +0 -257
- package/agents/growth-expert/context.md +0 -249
- package/agents/index.js +0 -140
- package/agents/investor-relations-expert/context.md +0 -266
- package/agents/legal-expert/context.md +0 -284
- package/agents/marketing-expert/context.md +0 -236
- package/agents/monitoring-expert/context.md +0 -362
- package/agents/operations-expert/context.md +0 -279
- package/agents/partnerships-expert/context.md +0 -286
- package/agents/payment-expert/context.md +0 -340
- package/agents/performance-expert/context.md +0 -377
- package/agents/private-equity-expert/context.md +0 -246
- package/agents/railway-expert/context.md +0 -284
- package/agents/research-expert/context.md +0 -245
- package/agents/sales-expert/context.md +0 -241
- package/agents/security-expert/context.md +0 -343
- package/agents/testing-expert/context.md +0 -414
- package/agents/ui-ux-expert/context.md +0 -448
- package/agents/vercel-expert/context.md +0 -426
- package/skills/index.js +0 -787
- package/skills/patterns/README.md +0 -163
- package/skills/patterns/ai/agents.md +0 -281
- package/skills/patterns/ai/claude.md +0 -138
- package/skills/patterns/ai/embeddings.md +0 -150
- package/skills/patterns/ai/rag.md +0 -266
- package/skills/patterns/ai/streaming.md +0 -170
- package/skills/patterns/ai/structured-output.md +0 -162
- package/skills/patterns/ai/tools.md +0 -154
- package/skills/patterns/analytics/tracking.md +0 -220
- package/skills/patterns/api/errors.md +0 -296
- package/skills/patterns/api/graphql.md +0 -440
- package/skills/patterns/api/middleware.md +0 -279
- package/skills/patterns/api/openapi.md +0 -285
- package/skills/patterns/api/rate-limiting.md +0 -231
- package/skills/patterns/api/route-handler.md +0 -217
- package/skills/patterns/api/server-action.md +0 -249
- package/skills/patterns/api/versioning.md +0 -443
- package/skills/patterns/api/webhooks.md +0 -247
- package/skills/patterns/auth/clerk.md +0 -132
- package/skills/patterns/auth/mfa.md +0 -313
- package/skills/patterns/auth/nextauth.md +0 -140
- package/skills/patterns/auth/oauth.md +0 -237
- package/skills/patterns/auth/rbac.md +0 -152
- package/skills/patterns/auth/session-management.md +0 -367
- package/skills/patterns/auth/session.md +0 -120
- package/skills/patterns/database/audit.md +0 -177
- package/skills/patterns/database/migrations.md +0 -177
- package/skills/patterns/database/pagination.md +0 -230
- package/skills/patterns/database/pooling.md +0 -357
- package/skills/patterns/database/prisma.md +0 -180
- package/skills/patterns/database/relations.md +0 -187
- package/skills/patterns/database/seeding.md +0 -246
- package/skills/patterns/database/soft-delete.md +0 -153
- package/skills/patterns/database/transactions.md +0 -162
- package/skills/patterns/deployment/ci-cd.md +0 -231
- package/skills/patterns/deployment/docker.md +0 -188
- package/skills/patterns/deployment/monitoring.md +0 -387
- package/skills/patterns/deployment/vercel.md +0 -160
- package/skills/patterns/email/resend.md +0 -143
- package/skills/patterns/email/templates.md +0 -245
- package/skills/patterns/email/transactional.md +0 -503
- package/skills/patterns/email/verification.md +0 -176
- package/skills/patterns/files/download.md +0 -243
- package/skills/patterns/files/upload.md +0 -239
- package/skills/patterns/i18n/nextintl.md +0 -188
- package/skills/patterns/logging/structured.md +0 -292
- package/skills/patterns/notifications/email-queue.md +0 -248
- package/skills/patterns/notifications/push.md +0 -279
- package/skills/patterns/payments/checkout.md +0 -303
- package/skills/patterns/payments/invoices.md +0 -287
- package/skills/patterns/payments/portal.md +0 -245
- package/skills/patterns/payments/stripe.md +0 -272
- package/skills/patterns/payments/subscriptions.md +0 -300
- package/skills/patterns/payments/usage.md +0 -279
- package/skills/patterns/performance/caching.md +0 -276
- package/skills/patterns/performance/code-splitting.md +0 -233
- package/skills/patterns/performance/edge.md +0 -254
- package/skills/patterns/performance/isr.md +0 -266
- package/skills/patterns/performance/lazy-loading.md +0 -281
- package/skills/patterns/realtime/sse.md +0 -327
- package/skills/patterns/realtime/websockets.md +0 -336
- package/skills/patterns/search/filtering.md +0 -329
- package/skills/patterns/search/fulltext.md +0 -260
- package/skills/patterns/security/audit-logging.md +0 -444
- package/skills/patterns/security/csrf.md +0 -234
- package/skills/patterns/security/headers.md +0 -252
- package/skills/patterns/security/sanitization.md +0 -258
- package/skills/patterns/security/secrets.md +0 -261
- package/skills/patterns/security/validation.md +0 -268
- package/skills/patterns/security/xss.md +0 -229
- package/skills/patterns/seo/metadata.md +0 -252
- package/skills/patterns/state/context.md +0 -349
- package/skills/patterns/state/react-query.md +0 -313
- package/skills/patterns/state/url-state.md +0 -482
- package/skills/patterns/state/zustand.md +0 -262
- package/skills/patterns/testing/api.md +0 -259
- package/skills/patterns/testing/component.md +0 -233
- package/skills/patterns/testing/coverage.md +0 -207
- package/skills/patterns/testing/fixtures.md +0 -225
- package/skills/patterns/testing/integration.md +0 -436
- package/skills/patterns/testing/mocking.md +0 -177
- package/skills/patterns/testing/playwright.md +0 -162
- package/skills/patterns/testing/snapshot.md +0 -175
- package/skills/patterns/testing/vitest.md +0 -307
- package/skills/patterns/ui/accordions.md +0 -395
- package/skills/patterns/ui/cards.md +0 -299
- package/skills/patterns/ui/dropdowns.md +0 -476
- package/skills/patterns/ui/empty-states.md +0 -320
- package/skills/patterns/ui/forms.md +0 -405
- package/skills/patterns/ui/inputs.md +0 -319
- package/skills/patterns/ui/layouts.md +0 -282
- package/skills/patterns/ui/loading.md +0 -291
- package/skills/patterns/ui/modals.md +0 -338
- package/skills/patterns/ui/navigation.md +0 -374
- package/skills/patterns/ui/tables.md +0 -407
- package/skills/patterns/ui/toasts.md +0 -300
- package/skills/patterns/ui/tooltips.md +0 -396
- package/skills/patterns/utils/dates.md +0 -435
- package/skills/patterns/utils/errors.md +0 -451
- package/skills/patterns/utils/formatting.md +0 -345
- package/skills/patterns/utils/validation.md +0 -434
- package/templates/bootspring.config.js +0 -83
- package/templates/business/business-model-canvas.md +0 -246
- package/templates/business/business-plan.md +0 -266
- package/templates/business/competitive-analysis.md +0 -312
- package/templates/fundraising/data-room-checklist.md +0 -300
- package/templates/fundraising/investor-research.md +0 -243
- package/templates/fundraising/pitch-deck-outline.md +0 -253
- package/templates/legal/gdpr-checklist.md +0 -339
- package/templates/legal/privacy-policy.md +0 -285
- package/templates/legal/terms-of-service.md +0 -222
- package/templates/mcp.json +0 -9
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
# Frontend Expert Agent
|
|
2
|
-
|
|
3
|
-
## Role
|
|
4
|
-
Specialized in React, Next.js App Router, modern component patterns, state management, and UI development with Tailwind CSS.
|
|
5
|
-
|
|
6
|
-
## Core Expertise
|
|
7
|
-
|
|
8
|
-
### React Server Components (Default)
|
|
9
|
-
|
|
10
|
-
```tsx
|
|
11
|
-
// Server Components are the default in Next.js App Router
|
|
12
|
-
// They run on the server and can directly access data
|
|
13
|
-
|
|
14
|
-
// app/users/page.tsx - Server Component
|
|
15
|
-
import { prisma } from '@/lib/prisma';
|
|
16
|
-
|
|
17
|
-
export default async function UsersPage() {
|
|
18
|
-
// Direct database access - no API needed!
|
|
19
|
-
const users = await prisma.user.findMany({
|
|
20
|
-
take: 10,
|
|
21
|
-
orderBy: { createdAt: 'desc' }
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
return (
|
|
25
|
-
<main className="container mx-auto py-8">
|
|
26
|
-
<h1 className="text-2xl font-bold mb-4">Users</h1>
|
|
27
|
-
<ul className="space-y-2">
|
|
28
|
-
{users.map(user => (
|
|
29
|
-
<UserCard key={user.id} user={user} />
|
|
30
|
-
))}
|
|
31
|
-
</ul>
|
|
32
|
-
</main>
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// This is also a Server Component
|
|
37
|
-
function UserCard({ user }: { user: User }) {
|
|
38
|
-
return (
|
|
39
|
-
<div className="p-4 border rounded-lg">
|
|
40
|
-
<h2 className="font-medium">{user.name}</h2>
|
|
41
|
-
<p className="text-gray-500">{user.email}</p>
|
|
42
|
-
</div>
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### Client Components (When Needed)
|
|
48
|
-
|
|
49
|
-
```tsx
|
|
50
|
-
'use client';
|
|
51
|
-
|
|
52
|
-
// Use 'use client' ONLY when you need:
|
|
53
|
-
// - useState, useEffect, useRef
|
|
54
|
-
// - Event handlers (onClick, onChange, etc.)
|
|
55
|
-
// - Browser APIs (window, document)
|
|
56
|
-
// - Third-party libraries that use hooks
|
|
57
|
-
|
|
58
|
-
import { useState, useTransition } from 'react';
|
|
59
|
-
import { updateUser } from '@/app/actions';
|
|
60
|
-
|
|
61
|
-
export function EditUserForm({ user }: { user: User }) {
|
|
62
|
-
const [name, setName] = useState(user.name);
|
|
63
|
-
const [isPending, startTransition] = useTransition();
|
|
64
|
-
|
|
65
|
-
const handleSubmit = (e: React.FormEvent) => {
|
|
66
|
-
e.preventDefault();
|
|
67
|
-
startTransition(async () => {
|
|
68
|
-
await updateUser(user.id, { name });
|
|
69
|
-
});
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
return (
|
|
73
|
-
<form onSubmit={handleSubmit} className="space-y-4">
|
|
74
|
-
<input
|
|
75
|
-
type="text"
|
|
76
|
-
value={name}
|
|
77
|
-
onChange={(e) => setName(e.target.value)}
|
|
78
|
-
className="border rounded px-3 py-2 w-full"
|
|
79
|
-
disabled={isPending}
|
|
80
|
-
/>
|
|
81
|
-
<button
|
|
82
|
-
type="submit"
|
|
83
|
-
disabled={isPending}
|
|
84
|
-
className="bg-blue-500 text-white px-4 py-2 rounded disabled:opacity-50"
|
|
85
|
-
>
|
|
86
|
-
{isPending ? 'Saving...' : 'Save'}
|
|
87
|
-
</button>
|
|
88
|
-
</form>
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### Component Composition Pattern
|
|
94
|
-
|
|
95
|
-
```tsx
|
|
96
|
-
// Compose Server and Client Components effectively
|
|
97
|
-
|
|
98
|
-
// ServerWrapper.tsx (Server Component)
|
|
99
|
-
import { prisma } from '@/lib/prisma';
|
|
100
|
-
import { InteractiveList } from './InteractiveList';
|
|
101
|
-
|
|
102
|
-
export async function ServerWrapper() {
|
|
103
|
-
const items = await prisma.item.findMany();
|
|
104
|
-
|
|
105
|
-
// Pass data to client component
|
|
106
|
-
return <InteractiveList initialItems={items} />;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// InteractiveList.tsx (Client Component)
|
|
110
|
-
'use client';
|
|
111
|
-
|
|
112
|
-
import { useState } from 'react';
|
|
113
|
-
|
|
114
|
-
export function InteractiveList({ initialItems }: { initialItems: Item[] }) {
|
|
115
|
-
const [items, setItems] = useState(initialItems);
|
|
116
|
-
const [filter, setFilter] = useState('');
|
|
117
|
-
|
|
118
|
-
const filteredItems = items.filter(item =>
|
|
119
|
-
item.name.toLowerCase().includes(filter.toLowerCase())
|
|
120
|
-
);
|
|
121
|
-
|
|
122
|
-
return (
|
|
123
|
-
<div>
|
|
124
|
-
<input
|
|
125
|
-
type="search"
|
|
126
|
-
placeholder="Filter..."
|
|
127
|
-
value={filter}
|
|
128
|
-
onChange={(e) => setFilter(e.target.value)}
|
|
129
|
-
className="border rounded px-3 py-2 mb-4 w-full"
|
|
130
|
-
/>
|
|
131
|
-
<ul className="space-y-2">
|
|
132
|
-
{filteredItems.map(item => (
|
|
133
|
-
<li key={item.id} className="p-2 border rounded">
|
|
134
|
-
{item.name}
|
|
135
|
-
</li>
|
|
136
|
-
))}
|
|
137
|
-
</ul>
|
|
138
|
-
</div>
|
|
139
|
-
);
|
|
140
|
-
}
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### State Management
|
|
144
|
-
|
|
145
|
-
#### Local State (useState)
|
|
146
|
-
```tsx
|
|
147
|
-
// For component-specific state
|
|
148
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
#### URL State (useSearchParams)
|
|
152
|
-
```tsx
|
|
153
|
-
'use client';
|
|
154
|
-
|
|
155
|
-
import { useSearchParams, useRouter, usePathname } from 'next/navigation';
|
|
156
|
-
|
|
157
|
-
export function Filters() {
|
|
158
|
-
const searchParams = useSearchParams();
|
|
159
|
-
const router = useRouter();
|
|
160
|
-
const pathname = usePathname();
|
|
161
|
-
|
|
162
|
-
const updateFilter = (key: string, value: string) => {
|
|
163
|
-
const params = new URLSearchParams(searchParams);
|
|
164
|
-
if (value) {
|
|
165
|
-
params.set(key, value);
|
|
166
|
-
} else {
|
|
167
|
-
params.delete(key);
|
|
168
|
-
}
|
|
169
|
-
router.push(`${pathname}?${params.toString()}`);
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
return (
|
|
173
|
-
<select
|
|
174
|
-
value={searchParams.get('status') ?? ''}
|
|
175
|
-
onChange={(e) => updateFilter('status', e.target.value)}
|
|
176
|
-
>
|
|
177
|
-
<option value="">All</option>
|
|
178
|
-
<option value="active">Active</option>
|
|
179
|
-
<option value="archived">Archived</option>
|
|
180
|
-
</select>
|
|
181
|
-
);
|
|
182
|
-
}
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
#### Global State (Zustand)
|
|
186
|
-
```tsx
|
|
187
|
-
// store/user-store.ts
|
|
188
|
-
import { create } from 'zustand';
|
|
189
|
-
import { persist } from 'zustand/middleware';
|
|
190
|
-
|
|
191
|
-
interface UserStore {
|
|
192
|
-
user: User | null;
|
|
193
|
-
setUser: (user: User | null) => void;
|
|
194
|
-
preferences: { theme: 'light' | 'dark' };
|
|
195
|
-
setTheme: (theme: 'light' | 'dark') => void;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
export const useUserStore = create<UserStore>()(
|
|
199
|
-
persist(
|
|
200
|
-
(set) => ({
|
|
201
|
-
user: null,
|
|
202
|
-
setUser: (user) => set({ user }),
|
|
203
|
-
preferences: { theme: 'light' },
|
|
204
|
-
setTheme: (theme) => set((state) => ({
|
|
205
|
-
preferences: { ...state.preferences, theme }
|
|
206
|
-
})),
|
|
207
|
-
}),
|
|
208
|
-
{ name: 'user-storage' }
|
|
209
|
-
)
|
|
210
|
-
);
|
|
211
|
-
|
|
212
|
-
// Usage in component
|
|
213
|
-
'use client';
|
|
214
|
-
|
|
215
|
-
export function ThemeToggle() {
|
|
216
|
-
const { preferences, setTheme } = useUserStore();
|
|
217
|
-
|
|
218
|
-
return (
|
|
219
|
-
<button onClick={() => setTheme(preferences.theme === 'light' ? 'dark' : 'light')}>
|
|
220
|
-
Toggle Theme
|
|
221
|
-
</button>
|
|
222
|
-
);
|
|
223
|
-
}
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
### Tailwind CSS Patterns
|
|
227
|
-
|
|
228
|
-
#### Responsive Design
|
|
229
|
-
```tsx
|
|
230
|
-
<div className="
|
|
231
|
-
grid
|
|
232
|
-
grid-cols-1 /* Mobile: 1 column */
|
|
233
|
-
sm:grid-cols-2 /* Small: 2 columns */
|
|
234
|
-
lg:grid-cols-3 /* Large: 3 columns */
|
|
235
|
-
xl:grid-cols-4 /* XL: 4 columns */
|
|
236
|
-
gap-4
|
|
237
|
-
">
|
|
238
|
-
{items.map(item => <Card key={item.id} {...item} />)}
|
|
239
|
-
</div>
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
#### Component Variants with cva
|
|
243
|
-
```tsx
|
|
244
|
-
import { cva, type VariantProps } from 'class-variance-authority';
|
|
245
|
-
import { cn } from '@/lib/utils';
|
|
246
|
-
|
|
247
|
-
const buttonVariants = cva(
|
|
248
|
-
'inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2',
|
|
249
|
-
{
|
|
250
|
-
variants: {
|
|
251
|
-
variant: {
|
|
252
|
-
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
|
|
253
|
-
destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
|
|
254
|
-
outline: 'border border-input bg-background hover:bg-accent',
|
|
255
|
-
ghost: 'hover:bg-accent hover:text-accent-foreground',
|
|
256
|
-
},
|
|
257
|
-
size: {
|
|
258
|
-
default: 'h-10 px-4 py-2',
|
|
259
|
-
sm: 'h-9 rounded-md px-3',
|
|
260
|
-
lg: 'h-11 rounded-md px-8',
|
|
261
|
-
icon: 'h-10 w-10',
|
|
262
|
-
},
|
|
263
|
-
},
|
|
264
|
-
defaultVariants: {
|
|
265
|
-
variant: 'default',
|
|
266
|
-
size: 'default',
|
|
267
|
-
},
|
|
268
|
-
}
|
|
269
|
-
);
|
|
270
|
-
|
|
271
|
-
interface ButtonProps
|
|
272
|
-
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
273
|
-
VariantProps<typeof buttonVariants> {}
|
|
274
|
-
|
|
275
|
-
export function Button({ className, variant, size, ...props }: ButtonProps) {
|
|
276
|
-
return (
|
|
277
|
-
<button
|
|
278
|
-
className={cn(buttonVariants({ variant, size, className }))}
|
|
279
|
-
{...props}
|
|
280
|
-
/>
|
|
281
|
-
);
|
|
282
|
-
}
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
### Loading & Error States
|
|
286
|
-
|
|
287
|
-
```tsx
|
|
288
|
-
// loading.tsx - Automatic loading UI
|
|
289
|
-
export default function Loading() {
|
|
290
|
-
return (
|
|
291
|
-
<div className="flex items-center justify-center min-h-[400px]">
|
|
292
|
-
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-blue-500" />
|
|
293
|
-
</div>
|
|
294
|
-
);
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
// error.tsx - Automatic error UI
|
|
298
|
-
'use client';
|
|
299
|
-
|
|
300
|
-
export default function Error({
|
|
301
|
-
error,
|
|
302
|
-
reset,
|
|
303
|
-
}: {
|
|
304
|
-
error: Error & { digest?: string };
|
|
305
|
-
reset: () => void;
|
|
306
|
-
}) {
|
|
307
|
-
return (
|
|
308
|
-
<div className="flex flex-col items-center justify-center min-h-[400px] gap-4">
|
|
309
|
-
<h2 className="text-xl font-semibold">Something went wrong!</h2>
|
|
310
|
-
<p className="text-gray-500">{error.message}</p>
|
|
311
|
-
<button
|
|
312
|
-
onClick={reset}
|
|
313
|
-
className="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
|
|
314
|
-
>
|
|
315
|
-
Try again
|
|
316
|
-
</button>
|
|
317
|
-
</div>
|
|
318
|
-
);
|
|
319
|
-
}
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
### Suspense Boundaries
|
|
323
|
-
|
|
324
|
-
```tsx
|
|
325
|
-
import { Suspense } from 'react';
|
|
326
|
-
|
|
327
|
-
export default function DashboardPage() {
|
|
328
|
-
return (
|
|
329
|
-
<div className="grid grid-cols-2 gap-4">
|
|
330
|
-
<Suspense fallback={<CardSkeleton />}>
|
|
331
|
-
<RevenueCard />
|
|
332
|
-
</Suspense>
|
|
333
|
-
<Suspense fallback={<CardSkeleton />}>
|
|
334
|
-
<UsersCard />
|
|
335
|
-
</Suspense>
|
|
336
|
-
<Suspense fallback={<TableSkeleton />}>
|
|
337
|
-
<RecentOrders />
|
|
338
|
-
</Suspense>
|
|
339
|
-
</div>
|
|
340
|
-
);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
function CardSkeleton() {
|
|
344
|
-
return (
|
|
345
|
-
<div className="h-32 bg-gray-100 rounded-lg animate-pulse" />
|
|
346
|
-
);
|
|
347
|
-
}
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
## Component Checklist
|
|
351
|
-
|
|
352
|
-
- [ ] Server Component by default
|
|
353
|
-
- [ ] 'use client' only when necessary
|
|
354
|
-
- [ ] Props typed with TypeScript
|
|
355
|
-
- [ ] Loading state handled
|
|
356
|
-
- [ ] Error boundary in place
|
|
357
|
-
- [ ] Accessible (keyboard nav, ARIA labels)
|
|
358
|
-
- [ ] Responsive (mobile-first)
|
|
359
|
-
- [ ] No inline styles (use Tailwind)
|
|
360
|
-
- [ ] Component is focused and small
|
|
361
|
-
- [ ] Reusable where appropriate
|
|
362
|
-
|
|
363
|
-
## Trigger Keywords
|
|
364
|
-
component, react, ui, tailwind, state, client, server component, hook, useState, useEffect, form, button, input, modal, dropdown, responsive, mobile, layout, grid, flex, styling, css
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
# Fundraising Expert Agent
|
|
2
|
-
|
|
3
|
-
## Role
|
|
4
|
-
Specialized in startup fundraising, investor outreach, pitch deck creation, and navigating seed rounds through Series A and beyond.
|
|
5
|
-
|
|
6
|
-
## Core Expertise
|
|
7
|
-
|
|
8
|
-
### Fundraising Stages
|
|
9
|
-
|
|
10
|
-
```markdown
|
|
11
|
-
## Funding Round Overview
|
|
12
|
-
|
|
13
|
-
| Stage | Typical Amount | Valuation | Investors |
|
|
14
|
-
|-------|---------------|-----------|-----------|
|
|
15
|
-
| Pre-seed | $100K-$500K | $1-3M | Angels, friends/family |
|
|
16
|
-
| Seed | $500K-$2M | $3-10M | Angels, seed funds |
|
|
17
|
-
| Series A | $2M-$15M | $10-50M | VCs |
|
|
18
|
-
| Series B | $15M-$50M | $50-200M | VCs |
|
|
19
|
-
| Series C+ | $50M+ | $200M+ | Growth equity, late-stage VCs |
|
|
20
|
-
|
|
21
|
-
## What Investors Look For By Stage
|
|
22
|
-
|
|
23
|
-
### Pre-seed/Seed
|
|
24
|
-
- Founding team quality
|
|
25
|
-
- Market opportunity size
|
|
26
|
-
- Initial traction or strong vision
|
|
27
|
-
- Coachability
|
|
28
|
-
|
|
29
|
-
### Series A
|
|
30
|
-
- Product-market fit evidence
|
|
31
|
-
- Repeatable customer acquisition
|
|
32
|
-
- Clear path to scale
|
|
33
|
-
- Strong unit economics
|
|
34
|
-
|
|
35
|
-
### Series B+
|
|
36
|
-
- Proven growth engine
|
|
37
|
-
- Market leadership potential
|
|
38
|
-
- Path to profitability
|
|
39
|
-
- Expansion opportunities
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Pitch Deck Structure
|
|
43
|
-
|
|
44
|
-
```markdown
|
|
45
|
-
## 10-Slide Pitch Deck Template
|
|
46
|
-
|
|
47
|
-
### 1. Title Slide
|
|
48
|
-
- Company name and logo
|
|
49
|
-
- One-line description
|
|
50
|
-
- Contact information
|
|
51
|
-
|
|
52
|
-
### 2. Problem
|
|
53
|
-
- What problem do you solve?
|
|
54
|
-
- Who experiences this problem?
|
|
55
|
-
- How painful is it?
|
|
56
|
-
|
|
57
|
-
### 3. Solution
|
|
58
|
-
- How do you solve it?
|
|
59
|
-
- Key features/benefits
|
|
60
|
-
- Demo or screenshots
|
|
61
|
-
|
|
62
|
-
### 4. Market Size
|
|
63
|
-
- TAM (Total Addressable Market)
|
|
64
|
-
- SAM (Serviceable Addressable Market)
|
|
65
|
-
- SOM (Serviceable Obtainable Market)
|
|
66
|
-
|
|
67
|
-
### 5. Business Model
|
|
68
|
-
- How do you make money?
|
|
69
|
-
- Pricing tiers
|
|
70
|
-
- Unit economics
|
|
71
|
-
|
|
72
|
-
### 6. Traction
|
|
73
|
-
- Key metrics (MRR, users, growth rate)
|
|
74
|
-
- Customer logos
|
|
75
|
-
- Milestones achieved
|
|
76
|
-
|
|
77
|
-
### 7. Competition
|
|
78
|
-
- Competitive landscape
|
|
79
|
-
- Your differentiation
|
|
80
|
-
- Why you'll win
|
|
81
|
-
|
|
82
|
-
### 8. Team
|
|
83
|
-
- Founders' backgrounds
|
|
84
|
-
- Key hires
|
|
85
|
-
- Advisors
|
|
86
|
-
|
|
87
|
-
### 9. Financials
|
|
88
|
-
- Revenue projections
|
|
89
|
-
- Key assumptions
|
|
90
|
-
- Path to profitability
|
|
91
|
-
|
|
92
|
-
### 10. The Ask
|
|
93
|
-
- How much are you raising?
|
|
94
|
-
- Use of funds
|
|
95
|
-
- Timeline and milestones
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### Investor Outreach
|
|
99
|
-
|
|
100
|
-
```markdown
|
|
101
|
-
## Cold Email Template
|
|
102
|
-
|
|
103
|
-
Subject: [Company Name] - [Impressive Metric] in [Industry]
|
|
104
|
-
|
|
105
|
-
Hi [Investor Name],
|
|
106
|
-
|
|
107
|
-
I'm [Your Name], founder of [Company]. We're [one-line description].
|
|
108
|
-
|
|
109
|
-
**Quick stats:**
|
|
110
|
-
- [Key metric 1 - e.g., "$50K MRR"]
|
|
111
|
-
- [Key metric 2 - e.g., "3x growth in 6 months"]
|
|
112
|
-
- [Key metric 3 - e.g., "150 customers"]
|
|
113
|
-
|
|
114
|
-
We're raising a [$X] seed round led by [Lead Investor if any].
|
|
115
|
-
|
|
116
|
-
[Your fund] caught my attention because [specific reason - portfolio company, thesis fit, etc.].
|
|
117
|
-
|
|
118
|
-
Would you have 20 minutes this week for a quick call?
|
|
119
|
-
|
|
120
|
-
Best,
|
|
121
|
-
[Your Name]
|
|
122
|
-
|
|
123
|
-
P.S. [Optional - brief personal connection or relevant news]
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
## Warm Intro Request Template
|
|
128
|
-
|
|
129
|
-
Hi [Mutual Connection],
|
|
130
|
-
|
|
131
|
-
I'm raising a seed round for [Company] and noticed you're connected to [Investor Name] at [Fund].
|
|
132
|
-
|
|
133
|
-
Quick context: We're [one-line description] with [impressive metric]. [Fund] would be a great fit because [specific reason].
|
|
134
|
-
|
|
135
|
-
Would you be comfortable making an intro? Happy to send a forwardable blurb if helpful.
|
|
136
|
-
|
|
137
|
-
Thanks so much!
|
|
138
|
-
[Your Name]
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
### Term Sheet Basics
|
|
142
|
-
|
|
143
|
-
```markdown
|
|
144
|
-
## Key Term Sheet Terms
|
|
145
|
-
|
|
146
|
-
### Economics
|
|
147
|
-
- **Pre-money Valuation**: Company value before investment
|
|
148
|
-
- **Investment Amount**: How much they're investing
|
|
149
|
-
- **Post-money Valuation**: Pre-money + investment
|
|
150
|
-
- **Option Pool**: Equity reserved for employees (typically 10-15%)
|
|
151
|
-
|
|
152
|
-
### Control
|
|
153
|
-
- **Board Seats**: Investor representation on board
|
|
154
|
-
- **Protective Provisions**: Investor veto rights on major decisions
|
|
155
|
-
- **Information Rights**: Access to financials and metrics
|
|
156
|
-
|
|
157
|
-
### Preferences
|
|
158
|
-
- **Liquidation Preference**: What investors get paid first in exit
|
|
159
|
-
- 1x non-participating: Get investment back OR share pro-rata
|
|
160
|
-
- 1x participating: Get investment back AND share pro-rata
|
|
161
|
-
- **Anti-dilution**: Protection against down rounds
|
|
162
|
-
- Full ratchet: Price adjusts to new lower price
|
|
163
|
-
- Weighted average: More common, less severe
|
|
164
|
-
|
|
165
|
-
### Red Flags to Watch
|
|
166
|
-
- > 1x participating preference
|
|
167
|
-
- Full ratchet anti-dilution
|
|
168
|
-
- >2 board seats for seed round
|
|
169
|
-
- Super pro-rata rights
|
|
170
|
-
- Unreasonable veto provisions
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### Due Diligence Checklist
|
|
174
|
-
|
|
175
|
-
```markdown
|
|
176
|
-
## Investor Due Diligence Preparation
|
|
177
|
-
|
|
178
|
-
### Corporate Documents
|
|
179
|
-
- [ ] Certificate of Incorporation
|
|
180
|
-
- [ ] Bylaws
|
|
181
|
-
- [ ] Cap table
|
|
182
|
-
- [ ] Stock option agreements
|
|
183
|
-
- [ ] Previous financing documents
|
|
184
|
-
|
|
185
|
-
### Financials
|
|
186
|
-
- [ ] Historical financials (P&L, balance sheet)
|
|
187
|
-
- [ ] Financial projections (3 years)
|
|
188
|
-
- [ ] Current MRR and growth metrics
|
|
189
|
-
- [ ] Bank statements
|
|
190
|
-
|
|
191
|
-
### Legal
|
|
192
|
-
- [ ] Material contracts
|
|
193
|
-
- [ ] IP assignments
|
|
194
|
-
- [ ] Employment agreements
|
|
195
|
-
- [ ] Terms of service / Privacy policy
|
|
196
|
-
|
|
197
|
-
### Product
|
|
198
|
-
- [ ] Product demo
|
|
199
|
-
- [ ] Technology architecture
|
|
200
|
-
- [ ] Roadmap
|
|
201
|
-
|
|
202
|
-
### Team
|
|
203
|
-
- [ ] Org chart
|
|
204
|
-
- [ ] Founder backgrounds
|
|
205
|
-
- [ ] Key employee agreements
|
|
206
|
-
|
|
207
|
-
### Customers
|
|
208
|
-
- [ ] Customer list
|
|
209
|
-
- [ ] Reference customers
|
|
210
|
-
- [ ] Churn analysis
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
### Investor Update Template
|
|
214
|
-
|
|
215
|
-
```markdown
|
|
216
|
-
## Monthly Investor Update
|
|
217
|
-
|
|
218
|
-
### Highlights
|
|
219
|
-
- [Big win 1]
|
|
220
|
-
- [Big win 2]
|
|
221
|
-
- [Big win 3]
|
|
222
|
-
|
|
223
|
-
### Key Metrics
|
|
224
|
-
| Metric | This Month | Last Month | MoM |
|
|
225
|
-
|--------|------------|------------|-----|
|
|
226
|
-
| MRR | $X | $Y | +Z% |
|
|
227
|
-
| Customers | X | Y | +Z |
|
|
228
|
-
| Churn | X% | Y% | -Z% |
|
|
229
|
-
|
|
230
|
-
### Lowlights
|
|
231
|
-
- [Challenge 1 and what we're doing about it]
|
|
232
|
-
- [Challenge 2]
|
|
233
|
-
|
|
234
|
-
### Asks
|
|
235
|
-
- [ ] Intro to [specific person/company]
|
|
236
|
-
- [ ] Advice on [specific topic]
|
|
237
|
-
- [ ] Hiring for [role]
|
|
238
|
-
|
|
239
|
-
### Next Month Focus
|
|
240
|
-
- [Priority 1]
|
|
241
|
-
- [Priority 2]
|
|
242
|
-
- [Priority 3]
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
## Fundraising Checklist
|
|
246
|
-
|
|
247
|
-
- [ ] Data room prepared
|
|
248
|
-
- [ ] Pitch deck finalized
|
|
249
|
-
- [ ] Financial model completed
|
|
250
|
-
- [ ] Target investor list created
|
|
251
|
-
- [ ] Warm intros identified
|
|
252
|
-
- [ ] Legal counsel engaged
|
|
253
|
-
- [ ] Term sheet reviewed
|
|
254
|
-
- [ ] Due diligence materials ready
|
|
255
|
-
|
|
256
|
-
## Trigger Keywords
|
|
257
|
-
fundraising, investor, pitch, seed, series A, term sheet, valuation, VC, angel, cap table, due diligence, data room, pitch deck, raise, round
|