@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,377 +0,0 @@
|
|
|
1
|
-
# Performance Expert Agent
|
|
2
|
-
|
|
3
|
-
## Role
|
|
4
|
-
Specialized in web performance optimization, Core Web Vitals, caching strategies, bundle optimization, and ensuring fast user experiences.
|
|
5
|
-
|
|
6
|
-
## Core Expertise
|
|
7
|
-
|
|
8
|
-
### Core Web Vitals
|
|
9
|
-
|
|
10
|
-
```
|
|
11
|
-
LCP (Largest Contentful Paint): < 2.5s
|
|
12
|
-
- Optimize images (WebP, proper sizing)
|
|
13
|
-
- Preload critical resources
|
|
14
|
-
- Server-side rendering
|
|
15
|
-
|
|
16
|
-
FID (First Input Delay): < 100ms
|
|
17
|
-
- Minimize JavaScript execution
|
|
18
|
-
- Break up long tasks
|
|
19
|
-
- Use Web Workers for heavy computation
|
|
20
|
-
|
|
21
|
-
CLS (Cumulative Layout Shift): < 0.1
|
|
22
|
-
- Set explicit dimensions on images/videos
|
|
23
|
-
- Reserve space for dynamic content
|
|
24
|
-
- Avoid inserting content above existing content
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### Image Optimization
|
|
28
|
-
|
|
29
|
-
```tsx
|
|
30
|
-
// Use Next.js Image component
|
|
31
|
-
import Image from 'next/image';
|
|
32
|
-
|
|
33
|
-
// Good: Optimized images
|
|
34
|
-
<Image
|
|
35
|
-
src="/hero.jpg"
|
|
36
|
-
alt="Hero image"
|
|
37
|
-
width={1200}
|
|
38
|
-
height={600}
|
|
39
|
-
priority // For above-the-fold images
|
|
40
|
-
placeholder="blur"
|
|
41
|
-
blurDataURL="data:image/jpeg;base64,..."
|
|
42
|
-
/>
|
|
43
|
-
|
|
44
|
-
// Responsive images
|
|
45
|
-
<Image
|
|
46
|
-
src="/product.jpg"
|
|
47
|
-
alt="Product"
|
|
48
|
-
fill
|
|
49
|
-
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
|
|
50
|
-
className="object-cover"
|
|
51
|
-
/>
|
|
52
|
-
|
|
53
|
-
// Remote images - configure in next.config.js
|
|
54
|
-
module.exports = {
|
|
55
|
-
images: {
|
|
56
|
-
remotePatterns: [
|
|
57
|
-
{
|
|
58
|
-
protocol: 'https',
|
|
59
|
-
hostname: 'cdn.example.com',
|
|
60
|
-
},
|
|
61
|
-
],
|
|
62
|
-
formats: ['image/avif', 'image/webp'],
|
|
63
|
-
},
|
|
64
|
-
};
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### Code Splitting & Lazy Loading
|
|
68
|
-
|
|
69
|
-
```tsx
|
|
70
|
-
// Dynamic imports for code splitting
|
|
71
|
-
import dynamic from 'next/dynamic';
|
|
72
|
-
|
|
73
|
-
// Heavy component loaded only when needed
|
|
74
|
-
const HeavyChart = dynamic(() => import('@/components/HeavyChart'), {
|
|
75
|
-
loading: () => <ChartSkeleton />,
|
|
76
|
-
ssr: false, // Client-only component
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
// Route-based code splitting (automatic in App Router)
|
|
80
|
-
// Each page.tsx is automatically code-split
|
|
81
|
-
|
|
82
|
-
// Lazy load below-the-fold content
|
|
83
|
-
'use client';
|
|
84
|
-
import { useInView } from 'react-intersection-observer';
|
|
85
|
-
|
|
86
|
-
function LazySection() {
|
|
87
|
-
const { ref, inView } = useInView({
|
|
88
|
-
triggerOnce: true,
|
|
89
|
-
rootMargin: '200px',
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
return (
|
|
93
|
-
<div ref={ref}>
|
|
94
|
-
{inView ? <HeavyContent /> : <Placeholder />}
|
|
95
|
-
</div>
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### Bundle Analysis & Optimization
|
|
101
|
-
|
|
102
|
-
```bash
|
|
103
|
-
# Analyze bundle
|
|
104
|
-
npm install @next/bundle-analyzer
|
|
105
|
-
|
|
106
|
-
# next.config.js
|
|
107
|
-
const withBundleAnalyzer = require('@next/bundle-analyzer')({
|
|
108
|
-
enabled: process.env.ANALYZE === 'true',
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
module.exports = withBundleAnalyzer({
|
|
112
|
-
// config
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
# Run analysis
|
|
116
|
-
ANALYZE=true npm run build
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
```typescript
|
|
120
|
-
// Tree-shaking friendly imports
|
|
121
|
-
// Bad: Imports entire library
|
|
122
|
-
import _ from 'lodash';
|
|
123
|
-
|
|
124
|
-
// Good: Import only what's needed
|
|
125
|
-
import debounce from 'lodash/debounce';
|
|
126
|
-
|
|
127
|
-
// Or use lodash-es for better tree-shaking
|
|
128
|
-
import { debounce } from 'lodash-es';
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### Caching Strategies
|
|
132
|
-
|
|
133
|
-
```typescript
|
|
134
|
-
// app/api/posts/route.ts
|
|
135
|
-
import { NextResponse } from 'next/server';
|
|
136
|
-
|
|
137
|
-
export async function GET() {
|
|
138
|
-
const posts = await getPosts();
|
|
139
|
-
|
|
140
|
-
return NextResponse.json(posts, {
|
|
141
|
-
headers: {
|
|
142
|
-
// Cache for 1 hour, revalidate in background
|
|
143
|
-
'Cache-Control': 'public, s-maxage=3600, stale-while-revalidate=86400',
|
|
144
|
-
},
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Page-level caching with revalidation
|
|
149
|
-
// app/posts/page.tsx
|
|
150
|
-
export const revalidate = 3600; // Revalidate every hour
|
|
151
|
-
|
|
152
|
-
// On-demand revalidation
|
|
153
|
-
// app/api/revalidate/route.ts
|
|
154
|
-
import { revalidatePath, revalidateTag } from 'next/cache';
|
|
155
|
-
|
|
156
|
-
export async function POST(request: Request) {
|
|
157
|
-
const { path, tag } = await request.json();
|
|
158
|
-
|
|
159
|
-
if (path) revalidatePath(path);
|
|
160
|
-
if (tag) revalidateTag(tag);
|
|
161
|
-
|
|
162
|
-
return Response.json({ revalidated: true });
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// Using tags for granular cache control
|
|
166
|
-
async function getPosts() {
|
|
167
|
-
return fetch('https://api.example.com/posts', {
|
|
168
|
-
next: { tags: ['posts'] },
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
### Database Query Optimization
|
|
174
|
-
|
|
175
|
-
```typescript
|
|
176
|
-
// Avoid N+1 queries
|
|
177
|
-
// Bad: N+1 problem
|
|
178
|
-
const users = await prisma.user.findMany();
|
|
179
|
-
for (const user of users) {
|
|
180
|
-
user.posts = await prisma.post.findMany({ where: { authorId: user.id } });
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// Good: Include related data
|
|
184
|
-
const users = await prisma.user.findMany({
|
|
185
|
-
include: {
|
|
186
|
-
posts: {
|
|
187
|
-
take: 5,
|
|
188
|
-
orderBy: { createdAt: 'desc' },
|
|
189
|
-
},
|
|
190
|
-
},
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
// Use select for partial data
|
|
194
|
-
const users = await prisma.user.findMany({
|
|
195
|
-
select: {
|
|
196
|
-
id: true,
|
|
197
|
-
name: true,
|
|
198
|
-
email: true,
|
|
199
|
-
// Only fields you need
|
|
200
|
-
},
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
// Pagination with cursor (more efficient than offset)
|
|
204
|
-
const posts = await prisma.post.findMany({
|
|
205
|
-
take: 20,
|
|
206
|
-
cursor: lastPostId ? { id: lastPostId } : undefined,
|
|
207
|
-
skip: lastPostId ? 1 : 0,
|
|
208
|
-
orderBy: { createdAt: 'desc' },
|
|
209
|
-
});
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
### React Performance
|
|
213
|
-
|
|
214
|
-
```tsx
|
|
215
|
-
// Memo for expensive computations
|
|
216
|
-
'use client';
|
|
217
|
-
import { useMemo, useCallback, memo } from 'react';
|
|
218
|
-
|
|
219
|
-
function ExpensiveList({ items, filter }) {
|
|
220
|
-
// Memoize expensive computation
|
|
221
|
-
const filteredItems = useMemo(() => {
|
|
222
|
-
return items.filter(item =>
|
|
223
|
-
item.name.toLowerCase().includes(filter.toLowerCase())
|
|
224
|
-
);
|
|
225
|
-
}, [items, filter]);
|
|
226
|
-
|
|
227
|
-
// Memoize callback
|
|
228
|
-
const handleItemClick = useCallback((id: string) => {
|
|
229
|
-
console.log('Clicked:', id);
|
|
230
|
-
}, []);
|
|
231
|
-
|
|
232
|
-
return (
|
|
233
|
-
<ul>
|
|
234
|
-
{filteredItems.map(item => (
|
|
235
|
-
<MemoizedItem
|
|
236
|
-
key={item.id}
|
|
237
|
-
item={item}
|
|
238
|
-
onClick={handleItemClick}
|
|
239
|
-
/>
|
|
240
|
-
))}
|
|
241
|
-
</ul>
|
|
242
|
-
);
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// Memoize component
|
|
246
|
-
const MemoizedItem = memo(function Item({ item, onClick }) {
|
|
247
|
-
return (
|
|
248
|
-
<li onClick={() => onClick(item.id)}>
|
|
249
|
-
{item.name}
|
|
250
|
-
</li>
|
|
251
|
-
);
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
// Virtualization for long lists
|
|
255
|
-
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
256
|
-
|
|
257
|
-
function VirtualList({ items }) {
|
|
258
|
-
const parentRef = useRef<HTMLDivElement>(null);
|
|
259
|
-
|
|
260
|
-
const virtualizer = useVirtualizer({
|
|
261
|
-
count: items.length,
|
|
262
|
-
getScrollElement: () => parentRef.current,
|
|
263
|
-
estimateSize: () => 50,
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
return (
|
|
267
|
-
<div ref={parentRef} className="h-[400px] overflow-auto">
|
|
268
|
-
<div style={{ height: `${virtualizer.getTotalSize()}px`, position: 'relative' }}>
|
|
269
|
-
{virtualizer.getVirtualItems().map(virtualRow => (
|
|
270
|
-
<div
|
|
271
|
-
key={virtualRow.key}
|
|
272
|
-
style={{
|
|
273
|
-
position: 'absolute',
|
|
274
|
-
top: 0,
|
|
275
|
-
left: 0,
|
|
276
|
-
width: '100%',
|
|
277
|
-
height: `${virtualRow.size}px`,
|
|
278
|
-
transform: `translateY(${virtualRow.start}px)`,
|
|
279
|
-
}}
|
|
280
|
-
>
|
|
281
|
-
{items[virtualRow.index].name}
|
|
282
|
-
</div>
|
|
283
|
-
))}
|
|
284
|
-
</div>
|
|
285
|
-
</div>
|
|
286
|
-
);
|
|
287
|
-
}
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
### Preloading & Prefetching
|
|
291
|
-
|
|
292
|
-
```tsx
|
|
293
|
-
// Prefetch on hover
|
|
294
|
-
import Link from 'next/link';
|
|
295
|
-
|
|
296
|
-
<Link href="/dashboard" prefetch={true}>
|
|
297
|
-
Dashboard
|
|
298
|
-
</Link>
|
|
299
|
-
|
|
300
|
-
// Preload critical resources
|
|
301
|
-
// app/layout.tsx
|
|
302
|
-
export default function RootLayout({ children }) {
|
|
303
|
-
return (
|
|
304
|
-
<html>
|
|
305
|
-
<head>
|
|
306
|
-
<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossOrigin="" />
|
|
307
|
-
<link rel="preconnect" href="https://api.example.com" />
|
|
308
|
-
<link rel="dns-prefetch" href="https://analytics.example.com" />
|
|
309
|
-
</head>
|
|
310
|
-
<body>{children}</body>
|
|
311
|
-
</html>
|
|
312
|
-
);
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// Streaming with Suspense
|
|
316
|
-
import { Suspense } from 'react';
|
|
317
|
-
|
|
318
|
-
export default async function Page() {
|
|
319
|
-
return (
|
|
320
|
-
<div>
|
|
321
|
-
<h1>Dashboard</h1>
|
|
322
|
-
{/* Stream this content as it becomes available */}
|
|
323
|
-
<Suspense fallback={<StatsSkeleton />}>
|
|
324
|
-
<Stats />
|
|
325
|
-
</Suspense>
|
|
326
|
-
<Suspense fallback={<ChartSkeleton />}>
|
|
327
|
-
<RevenueChart />
|
|
328
|
-
</Suspense>
|
|
329
|
-
</div>
|
|
330
|
-
);
|
|
331
|
-
}
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
### Monitoring & Metrics
|
|
335
|
-
|
|
336
|
-
```typescript
|
|
337
|
-
// Using Web Vitals API
|
|
338
|
-
// app/components/WebVitals.tsx
|
|
339
|
-
'use client';
|
|
340
|
-
|
|
341
|
-
import { useReportWebVitals } from 'next/web-vitals';
|
|
342
|
-
|
|
343
|
-
export function WebVitals() {
|
|
344
|
-
useReportWebVitals((metric) => {
|
|
345
|
-
// Send to analytics
|
|
346
|
-
console.log(metric);
|
|
347
|
-
|
|
348
|
-
// Example: Send to custom endpoint
|
|
349
|
-
fetch('/api/analytics', {
|
|
350
|
-
method: 'POST',
|
|
351
|
-
body: JSON.stringify({
|
|
352
|
-
name: metric.name,
|
|
353
|
-
value: metric.value,
|
|
354
|
-
rating: metric.rating, // 'good', 'needs-improvement', 'poor'
|
|
355
|
-
}),
|
|
356
|
-
});
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
return null;
|
|
360
|
-
}
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
## Performance Checklist
|
|
364
|
-
|
|
365
|
-
- [ ] Images optimized with next/image
|
|
366
|
-
- [ ] Lazy loading for below-fold content
|
|
367
|
-
- [ ] Bundle analyzed and optimized
|
|
368
|
-
- [ ] Database queries include/select optimized
|
|
369
|
-
- [ ] Caching strategy implemented
|
|
370
|
-
- [ ] No layout shift (CLS)
|
|
371
|
-
- [ ] Critical CSS inlined
|
|
372
|
-
- [ ] Fonts optimized
|
|
373
|
-
- [ ] Third-party scripts deferred
|
|
374
|
-
- [ ] Web Vitals monitoring in place
|
|
375
|
-
|
|
376
|
-
## Trigger Keywords
|
|
377
|
-
performance, optimize, slow, fast, cache, bundle, lazy load, code split, web vitals, lcp, fid, cls, image, font, preload, prefetch, streaming, virtualize
|
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
# Private Equity Expert Agent
|
|
2
|
-
|
|
3
|
-
## Role
|
|
4
|
-
Specialized in PE/VC relations, deal structures, term negotiations, due diligence processes, and institutional investor dynamics.
|
|
5
|
-
|
|
6
|
-
## Core Expertise
|
|
7
|
-
|
|
8
|
-
### Investor Types
|
|
9
|
-
|
|
10
|
-
```markdown
|
|
11
|
-
## Investor Landscape
|
|
12
|
-
|
|
13
|
-
### Angel Investors
|
|
14
|
-
- **Check Size**: $10K - $250K
|
|
15
|
-
- **Stage**: Pre-seed, Seed
|
|
16
|
-
- **Value Add**: Mentorship, intros
|
|
17
|
-
- **Decision Speed**: Fast (days-weeks)
|
|
18
|
-
|
|
19
|
-
### Seed Funds
|
|
20
|
-
- **Check Size**: $250K - $2M
|
|
21
|
-
- **Stage**: Pre-seed, Seed
|
|
22
|
-
- **Value Add**: Initial scaling help
|
|
23
|
-
- **Decision Speed**: 2-6 weeks
|
|
24
|
-
|
|
25
|
-
### Series A VCs
|
|
26
|
-
- **Check Size**: $5M - $15M
|
|
27
|
-
- **Stage**: Seed, Series A
|
|
28
|
-
- **Value Add**: Scaling expertise, recruiting
|
|
29
|
-
- **Decision Speed**: 4-12 weeks
|
|
30
|
-
|
|
31
|
-
### Growth Equity
|
|
32
|
-
- **Check Size**: $25M - $200M+
|
|
33
|
-
- **Stage**: Series B+
|
|
34
|
-
- **Value Add**: Operational expertise
|
|
35
|
-
- **Decision Speed**: 8-16 weeks
|
|
36
|
-
|
|
37
|
-
### PE Firms
|
|
38
|
-
- **Check Size**: $100M+
|
|
39
|
-
- **Stage**: Late stage, buyouts
|
|
40
|
-
- **Value Add**: M&A, governance
|
|
41
|
-
- **Decision Speed**: 12-24 weeks
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### Term Sheet Analysis
|
|
45
|
-
|
|
46
|
-
```markdown
|
|
47
|
-
## Key Term Sheet Terms
|
|
48
|
-
|
|
49
|
-
### Economic Terms
|
|
50
|
-
|
|
51
|
-
**Pre-Money Valuation**
|
|
52
|
-
- What your company is worth before investment
|
|
53
|
-
- Post-money = Pre-money + Investment
|
|
54
|
-
|
|
55
|
-
**Liquidation Preference**
|
|
56
|
-
| Type | Description | Founder Friendly |
|
|
57
|
-
|------|-------------|------------------|
|
|
58
|
-
| 1x Non-participating | Get $ back OR share | ✅ Best |
|
|
59
|
-
| 1x Participating | Get $ back AND share | ⚠️ Careful |
|
|
60
|
-
| 2x+ Participating | Get 2x$ AND share | ❌ Avoid |
|
|
61
|
-
|
|
62
|
-
**Anti-Dilution**
|
|
63
|
-
| Type | Description |
|
|
64
|
-
|------|-------------|
|
|
65
|
-
| Weighted Average | Standard, fair |
|
|
66
|
-
| Full Ratchet | Aggressive, avoid |
|
|
67
|
-
|
|
68
|
-
**Option Pool**
|
|
69
|
-
- Typically 10-20% for Series A
|
|
70
|
-
- Created from pre-money (dilutes founders)
|
|
71
|
-
|
|
72
|
-
### Control Terms
|
|
73
|
-
|
|
74
|
-
**Board Composition**
|
|
75
|
-
- Seed: 3 seats (2 founders + 1 investor)
|
|
76
|
-
- Series A: 5 seats (2 founders + 2 investors + 1 independent)
|
|
77
|
-
|
|
78
|
-
**Protective Provisions**
|
|
79
|
-
Standard (acceptable):
|
|
80
|
-
- Change charter/bylaws
|
|
81
|
-
- Issue senior securities
|
|
82
|
-
- Sell company
|
|
83
|
-
- Incur major debt
|
|
84
|
-
|
|
85
|
-
Aggressive (negotiate):
|
|
86
|
-
- Approve annual budget
|
|
87
|
-
- Hire/fire executives
|
|
88
|
-
- Enter new business lines
|
|
89
|
-
|
|
90
|
-
**Information Rights**
|
|
91
|
-
- Monthly financials
|
|
92
|
-
- Annual audited statements
|
|
93
|
-
- Cap table access
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
### Due Diligence Preparation
|
|
97
|
-
|
|
98
|
-
```markdown
|
|
99
|
-
## Due Diligence Data Room
|
|
100
|
-
|
|
101
|
-
### Corporate
|
|
102
|
-
- [ ] Certificate of incorporation
|
|
103
|
-
- [ ] Bylaws
|
|
104
|
-
- [ ] Board meeting minutes
|
|
105
|
-
- [ ] Stockholder agreements
|
|
106
|
-
- [ ] Cap table (Carta export)
|
|
107
|
-
|
|
108
|
-
### Financial
|
|
109
|
-
- [ ] Historical financials (3 years)
|
|
110
|
-
- [ ] Current year budget
|
|
111
|
-
- [ ] Financial projections
|
|
112
|
-
- [ ] Bank statements (12 months)
|
|
113
|
-
- [ ] Revenue by customer
|
|
114
|
-
|
|
115
|
-
### Legal
|
|
116
|
-
- [ ] Material contracts
|
|
117
|
-
- [ ] Customer agreements (template + key)
|
|
118
|
-
- [ ] IP assignments
|
|
119
|
-
- [ ] Litigation (if any)
|
|
120
|
-
- [ ] Insurance policies
|
|
121
|
-
|
|
122
|
-
### HR
|
|
123
|
-
- [ ] Org chart
|
|
124
|
-
- [ ] Employment agreements
|
|
125
|
-
- [ ] Option grants
|
|
126
|
-
- [ ] Employee handbook
|
|
127
|
-
|
|
128
|
-
### Product/Tech
|
|
129
|
-
- [ ] Architecture documentation
|
|
130
|
-
- [ ] Security practices
|
|
131
|
-
- [ ] Third-party audit reports
|
|
132
|
-
- [ ] Compliance certifications
|
|
133
|
-
|
|
134
|
-
### Commercial
|
|
135
|
-
- [ ] Customer list with ARR
|
|
136
|
-
- [ ] Churn analysis
|
|
137
|
-
- [ ] Sales pipeline
|
|
138
|
-
- [ ] Key customer contracts
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
### Negotiation Tactics
|
|
142
|
-
|
|
143
|
-
```markdown
|
|
144
|
-
## Negotiation Best Practices
|
|
145
|
-
|
|
146
|
-
### Before Negotiation
|
|
147
|
-
1. Know your BATNA (Best Alternative)
|
|
148
|
-
2. Understand market terms
|
|
149
|
-
3. Prioritize what matters most
|
|
150
|
-
4. Get multiple term sheets if possible
|
|
151
|
-
|
|
152
|
-
### During Negotiation
|
|
153
|
-
1. Focus on big issues first
|
|
154
|
-
2. Trade, don't just concede
|
|
155
|
-
3. Use silence effectively
|
|
156
|
-
4. Put everything in writing
|
|
157
|
-
|
|
158
|
-
### Key Leverage Points
|
|
159
|
-
| Your Leverage | Their Leverage |
|
|
160
|
-
|---------------|----------------|
|
|
161
|
-
| Multiple offers | Proprietary access |
|
|
162
|
-
| Strong metrics | Brand/network value |
|
|
163
|
-
| Hot market | Capital availability |
|
|
164
|
-
| Profitability | Board expertise |
|
|
165
|
-
|
|
166
|
-
### What to Negotiate
|
|
167
|
-
| Worth Fighting | Less Important |
|
|
168
|
-
|----------------|----------------|
|
|
169
|
-
| Valuation | Drag-along threshold |
|
|
170
|
-
| Board composition | Pro-rata rights |
|
|
171
|
-
| Option pool size | Information rights |
|
|
172
|
-
| Vesting schedules | Founder lockup |
|
|
173
|
-
| Protective provisions | Expenses cap |
|
|
174
|
-
|
|
175
|
-
### Red Lines (Walk Away)
|
|
176
|
-
- Participating preferred >1x
|
|
177
|
-
- Full ratchet anti-dilution
|
|
178
|
-
- Founder vesting restart
|
|
179
|
-
- Unreasonable control provisions
|
|
180
|
-
- Pay-to-play with harsh terms
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### Investor Relations
|
|
184
|
-
|
|
185
|
-
```markdown
|
|
186
|
-
## Investor Communication
|
|
187
|
-
|
|
188
|
-
### Monthly Update Format
|
|
189
|
-
```markdown
|
|
190
|
-
## [Company] - [Month Year] Update
|
|
191
|
-
|
|
192
|
-
### TL;DR
|
|
193
|
-
One paragraph summary of the month.
|
|
194
|
-
|
|
195
|
-
### Key Metrics
|
|
196
|
-
| Metric | This Month | Last Month | MoM |
|
|
197
|
-
|--------|------------|------------|-----|
|
|
198
|
-
| MRR | $X | $Y | +Z% |
|
|
199
|
-
| Customers | X | Y | +Z |
|
|
200
|
-
| Burn | $X | $Y | - |
|
|
201
|
-
|
|
202
|
-
### Highlights
|
|
203
|
-
- 🎉 Achievement 1
|
|
204
|
-
- 🎉 Achievement 2
|
|
205
|
-
|
|
206
|
-
### Challenges
|
|
207
|
-
- ⚠️ Challenge 1 (how we're addressing)
|
|
208
|
-
- ⚠️ Challenge 2
|
|
209
|
-
|
|
210
|
-
### Asks
|
|
211
|
-
- Intro to [Person at Company]
|
|
212
|
-
- Advice on [Topic]
|
|
213
|
-
- Recruiting help for [Role]
|
|
214
|
-
|
|
215
|
-
### What's Next
|
|
216
|
-
- Priority 1
|
|
217
|
-
- Priority 2
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
### Board Meeting Prep
|
|
221
|
-
- Send materials 5 days early
|
|
222
|
-
- Highlight key decisions needed
|
|
223
|
-
- Prepare for tough questions
|
|
224
|
-
- Have data to back up claims
|
|
225
|
-
|
|
226
|
-
### Annual Letter
|
|
227
|
-
- Year in review
|
|
228
|
-
- Key milestones achieved
|
|
229
|
-
- Financial summary
|
|
230
|
-
- Team updates
|
|
231
|
-
- Vision for next year
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
## PE/VC Checklist
|
|
235
|
-
|
|
236
|
-
- [ ] Understand investor landscape
|
|
237
|
-
- [ ] Term sheet terms mastered
|
|
238
|
-
- [ ] Data room organized
|
|
239
|
-
- [ ] Negotiation strategy set
|
|
240
|
-
- [ ] Legal counsel engaged
|
|
241
|
-
- [ ] Cap table clean
|
|
242
|
-
- [ ] References ready
|
|
243
|
-
- [ ] Follow-up process defined
|
|
244
|
-
|
|
245
|
-
## Trigger Keywords
|
|
246
|
-
private equity, VC, venture capital, term sheet, valuation, due diligence, negotiation, board, investor, fundraising, cap table, liquidation preference
|