luna-agents 2.0.1
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/.claude-plugin/LICENSE +21 -0
- package/.claude-plugin/README.md +285 -0
- package/.claude-plugin/claude-plugin.json +106 -0
- package/.claude-plugin/index.js +318 -0
- package/.claude-plugin/lib/api-client.js +504 -0
- package/.claude-plugin/lib/rag-utils.js +442 -0
- package/.claude-plugin/package.json +418 -0
- package/LICENSE +21 -0
- package/README.md +350 -0
- package/agents/json/design-architect.json +57 -0
- package/agents/json/luna-auth.json +71 -0
- package/agents/json/luna-brand.json +66 -0
- package/agents/json/luna-cloudflare.json +261 -0
- package/agents/json/luna-code-review.json +63 -0
- package/agents/json/luna-deployment.json +68 -0
- package/agents/json/luna-documentation.json +85 -0
- package/agents/json/luna-hig.json +128 -0
- package/agents/json/luna-layout-designer.json +178 -0
- package/agents/json/luna-monitoring-observability.json +64 -0
- package/agents/json/luna-post-launch-review.json +68 -0
- package/agents/json/luna-requirements-analyzer.json +53 -0
- package/agents/json/luna-task-executor.json +63 -0
- package/agents/json/luna-task-planner.json +62 -0
- package/agents/json/luna-testing-validation.json +66 -0
- package/agents/luna-365-security.md +96 -0
- package/agents/luna-analytics.md +318 -0
- package/agents/luna-api-generator.md +654 -0
- package/agents/luna-auth.md +396 -0
- package/agents/luna-brand.md +248 -0
- package/agents/luna-cloudflare.md +728 -0
- package/agents/luna-code-review.md +487 -0
- package/agents/luna-database.md +453 -0
- package/agents/luna-deployment.md +202 -0
- package/agents/luna-design-architect.md +353 -0
- package/agents/luna-docker.md +615 -0
- package/agents/luna-documentation.md +177 -0
- package/agents/luna-full-test.md +910 -0
- package/agents/luna-glm-vision.md +211 -0
- package/agents/luna-hig.md +430 -0
- package/agents/luna-lemonsqueezy.md +441 -0
- package/agents/luna-monitoring-observability.md +199 -0
- package/agents/luna-openai-app.md +499 -0
- package/agents/luna-post-launch-review.md +191 -0
- package/agents/luna-rag-enhanced.md +1619 -0
- package/agents/luna-rag.md +1733 -0
- package/agents/luna-requirements-analyzer.md +189 -0
- package/agents/luna-run.md +620 -0
- package/agents/luna-seo.md +338 -0
- package/agents/luna-task-executor.md +371 -0
- package/agents/luna-task-planner.md +275 -0
- package/agents/luna-testing-validation.md +681 -0
- package/agents/luna-ui-fix.md +591 -0
- package/agents/luna-ui-test.md +600 -0
- package/agents/luna-user-guide.md +409 -0
- package/agents/site-auditor.md +83 -0
- package/commands/3d-mesh.md +12 -0
- package/commands/3d.md +12 -0
- package/commands/agent-boost.md +13 -0
- package/commands/ai-index.md +16 -0
- package/commands/api.md +12 -0
- package/commands/assert.md +17 -0
- package/commands/audience.md +12 -0
- package/commands/auth.md +17 -0
- package/commands/autopilot.md +12 -0
- package/commands/boost-finsavvy.md +10 -0
- package/commands/boost-org.md +10 -0
- package/commands/boost-project.md +12 -0
- package/commands/brand.md +17 -0
- package/commands/browser-test.md +18 -0
- package/commands/cf.md +26 -0
- package/commands/cfg.md +33 -0
- package/commands/chain.md +12 -0
- package/commands/challenge.md +13 -0
- package/commands/clone.md +12 -0
- package/commands/cmds.md +243 -0
- package/commands/collab.md +12 -0
- package/commands/compete.md +12 -0
- package/commands/config-rules.md +21 -0
- package/commands/connect-infra.md +10 -0
- package/commands/context-pack.md +13 -0
- package/commands/curb.md +12 -0
- package/commands/des.md +38 -0
- package/commands/devto.md +20 -0
- package/commands/dock.md +26 -0
- package/commands/docs.md +33 -0
- package/commands/e2e-flow.md +18 -0
- package/commands/email-routing.md +10 -0
- package/commands/feature.md +12 -0
- package/commands/figma.md +12 -0
- package/commands/fix.md +12 -0
- package/commands/flaky.md +12 -0
- package/commands/flow-record.md +12 -0
- package/commands/gamify.md +12 -0
- package/commands/ghost.md +12 -0
- package/commands/git-insights.md +12 -0
- package/commands/go-viral.md +16 -0
- package/commands/go.md +42 -0
- package/commands/graph-rag.md +13 -0
- package/commands/guard.md +12 -0
- package/commands/heal.md +17 -0
- package/commands/heygen.md +12 -0
- package/commands/hig.md +33 -0
- package/commands/idea.md +12 -0
- package/commands/imagine.md +12 -0
- package/commands/inbox.md +12 -0
- package/commands/lam.md +12 -0
- package/commands/landing.md +12 -0
- package/commands/launch.md +12 -0
- package/commands/learn.md +12 -0
- package/commands/leverage.md +12 -0
- package/commands/ll-365-secure.md +179 -0
- package/commands/ll-3d-mesh.md +94 -0
- package/commands/ll-3d.md +123 -0
- package/commands/ll-a11y-scan.md +143 -0
- package/commands/ll-a11y.md +71 -0
- package/commands/ll-agent-boost.md +92 -0
- package/commands/ll-agent-chain.md +104 -0
- package/commands/ll-ai-index.md +120 -0
- package/commands/ll-api-client.md +77 -0
- package/commands/ll-api.md +99 -0
- package/commands/ll-assert.md +73 -0
- package/commands/ll-audience.md +308 -0
- package/commands/ll-auth.md +145 -0
- package/commands/ll-autopilot.md +113 -0
- package/commands/ll-boost-finsavvy.md +106 -0
- package/commands/ll-boost-org.md +161 -0
- package/commands/ll-boost-project.md +118 -0
- package/commands/ll-brand.md +150 -0
- package/commands/ll-browser-test.md +203 -0
- package/commands/ll-challenge.md +124 -0
- package/commands/ll-changelog.md +80 -0
- package/commands/ll-ci.md +78 -0
- package/commands/ll-claude-instructions.md +80 -0
- package/commands/ll-clone.md +82 -0
- package/commands/ll-cloudflare.md +580 -0
- package/commands/ll-codemap.md +78 -0
- package/commands/ll-collab.md +87 -0
- package/commands/ll-compete.md +67 -0
- package/commands/ll-config-rules.md +255 -0
- package/commands/ll-config.md +434 -0
- package/commands/ll-connect-infra.md +123 -0
- package/commands/ll-context-pack.md +100 -0
- package/commands/ll-curb.md +164 -0
- package/commands/ll-debug.md +76 -0
- package/commands/ll-deploy.md +101 -0
- package/commands/ll-deps.md +70 -0
- package/commands/ll-design.md +86 -0
- package/commands/ll-devto-publish.md +172 -0
- package/commands/ll-dockerize.md +273 -0
- package/commands/ll-docs.md +123 -0
- package/commands/ll-e2e-flow.md +132 -0
- package/commands/ll-e2e-test.md +231 -0
- package/commands/ll-email-routing.md +130 -0
- package/commands/ll-env.md +70 -0
- package/commands/ll-execute.md +98 -0
- package/commands/ll-feature.md +80 -0
- package/commands/ll-figma.md +82 -0
- package/commands/ll-fix.md +76 -0
- package/commands/ll-flaky.md +151 -0
- package/commands/ll-flow-record.md +180 -0
- package/commands/ll-flowdocs.md +83 -0
- package/commands/ll-gamify.md +131 -0
- package/commands/ll-gemma4.md +84 -0
- package/commands/ll-ghost.md +79 -0
- package/commands/ll-git-insights.md +152 -0
- package/commands/ll-go-viral.md +171 -0
- package/commands/ll-graph-rag.md +113 -0
- package/commands/ll-guard.md +92 -0
- package/commands/ll-heal.md +135 -0
- package/commands/ll-heygen.md +203 -0
- package/commands/ll-hig.md +578 -0
- package/commands/ll-hld.md +84 -0
- package/commands/ll-i18n.md +74 -0
- package/commands/ll-idea.md +101 -0
- package/commands/ll-imagine.md +72 -0
- package/commands/ll-inbox.md +116 -0
- package/commands/ll-lam.md +93 -0
- package/commands/ll-landing.md +171 -0
- package/commands/ll-launch.md +100 -0
- package/commands/ll-learn.md +87 -0
- package/commands/ll-leverage.md +137 -0
- package/commands/ll-local-llm.md +131 -0
- package/commands/ll-ls-products.md +160 -0
- package/commands/ll-marketplace.md +130 -0
- package/commands/ll-mcp-publish.md +104 -0
- package/commands/ll-migrate.md +68 -0
- package/commands/ll-mock.md +79 -0
- package/commands/ll-money.md +87 -0
- package/commands/ll-monitor.md +120 -0
- package/commands/ll-morph.md +117 -0
- package/commands/ll-multi-agent.md +170 -0
- package/commands/ll-native.md +93 -0
- package/commands/ll-nexa.md +79 -0
- package/commands/ll-onboarding.md +84 -0
- package/commands/ll-openhands.md +78 -0
- package/commands/ll-organic-promote.md +260 -0
- package/commands/ll-parallel.md +74 -0
- package/commands/ll-payments.md +83 -0
- package/commands/ll-perf-trace.md +147 -0
- package/commands/ll-perf.md +65 -0
- package/commands/ll-persona.md +280 -0
- package/commands/ll-pipe.md +296 -0
- package/commands/ll-plan-impl.js +570 -0
- package/commands/ll-plan-v2.md +297 -0
- package/commands/ll-plan.md +87 -0
- package/commands/ll-postlaunch.md +109 -0
- package/commands/ll-pr.md +84 -0
- package/commands/ll-present.md +110 -0
- package/commands/ll-product-map.md +152 -0
- package/commands/ll-promote.md +352 -0
- package/commands/ll-publish.md +124 -0
- package/commands/ll-pulse.md +96 -0
- package/commands/ll-rag-guided.md +345 -0
- package/commands/ll-rag-upgrade.md +504 -0
- package/commands/ll-rag.md +343 -0
- package/commands/ll-record.md +114 -0
- package/commands/ll-refactor.md +71 -0
- package/commands/ll-requirements.md +71 -0
- package/commands/ll-review.md +92 -0
- package/commands/ll-rollback.md +66 -0
- package/commands/ll-routemap.md +79 -0
- package/commands/ll-rules.md +90 -0
- package/commands/ll-shortcuts.md +229 -0
- package/commands/ll-sing.md +99 -0
- package/commands/ll-site-audit.md +228 -0
- package/commands/ll-smart-route.md +92 -0
- package/commands/ll-smart-search.md +58 -0
- package/commands/ll-storybook.md +86 -0
- package/commands/ll-swarm.md +101 -0
- package/commands/ll-test.md +97 -0
- package/commands/ll-time-machine.md +72 -0
- package/commands/ll-ui-convert.md +433 -0
- package/commands/ll-video.md +108 -0
- package/commands/ll-vision-pipeline.md +247 -0
- package/commands/ll-vision.md +74 -0
- package/commands/ll-visual-diff.md +118 -0
- package/commands/ll-visual-qa.md +204 -0
- package/commands/ll-visual-regression.md +96 -0
- package/commands/ll-voice.md +138 -0
- package/commands/ll-watch.md +65 -0
- package/commands/ll-workflow.md +108 -0
- package/commands/ll-zen.md +98 -0
- package/commands/local-llm.md +12 -0
- package/commands/marketplace.md +13 -0
- package/commands/mcp-publish.md +16 -0
- package/commands/migrate.md +12 -0
- package/commands/money.md +12 -0
- package/commands/morph.md +12 -0
- package/commands/multi-agent.md +12 -0
- package/commands/native.md +12 -0
- package/commands/nexa.md +12 -0
- package/commands/oh.md +12 -0
- package/commands/organic-promote.md +16 -0
- package/commands/perf-trace.md +12 -0
- package/commands/perf.md +12 -0
- package/commands/persona.md +12 -0
- package/commands/pipe.md +21 -0
- package/commands/plan.md +38 -0
- package/commands/pr.md +12 -0
- package/commands/present.md +12 -0
- package/commands/product-map.md +13 -0
- package/commands/promote.md +16 -0
- package/commands/publish.md +12 -0
- package/commands/pulse.md +12 -0
- package/commands/q.md +35 -0
- package/commands/record.md +12 -0
- package/commands/refactor.md +12 -0
- package/commands/req.md +40 -0
- package/commands/retro.md +33 -0
- package/commands/rev.md +39 -0
- package/commands/rules.md +19 -0
- package/commands/search.md +12 -0
- package/commands/sec.md +34 -0
- package/commands/ship.md +39 -0
- package/commands/sing.md +12 -0
- package/commands/site-audit.md +12 -0
- package/commands/smart-route.md +13 -0
- package/commands/swarm.md +12 -0
- package/commands/test.md +39 -0
- package/commands/time-machine.md +12 -0
- package/commands/ui.md +33 -0
- package/commands/video.md +12 -0
- package/commands/vision.md +12 -0
- package/commands/voice.md +12 -0
- package/commands/vr.md +18 -0
- package/commands/watch.md +39 -0
- package/commands/workflow.md +19 -0
- package/commands/zen.md +12 -0
- package/package.json +76 -0
- package/setup.sh +382 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# Luna Analytics & Monitoring Agent
|
|
2
|
+
|
|
3
|
+
## Role
|
|
4
|
+
Expert analytics and monitoring specialist implementing comprehensive tracking, metrics, logging, and observability solutions.
|
|
5
|
+
|
|
6
|
+
## Initial Setup
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
📊 Analytics Platform
|
|
10
|
+
1. Google Analytics 4 (web analytics)
|
|
11
|
+
2. Mixpanel (product analytics)
|
|
12
|
+
3. PostHog (open-source analytics)
|
|
13
|
+
4. Plausible (privacy-friendly)
|
|
14
|
+
5. Umami (simple, privacy-focused)
|
|
15
|
+
6. Custom analytics
|
|
16
|
+
|
|
17
|
+
Platform choice: _
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
🔍 Monitoring & Logging
|
|
22
|
+
1. Sentry (error tracking)
|
|
23
|
+
2. LogRocket (session replay)
|
|
24
|
+
3. Datadog (full observability)
|
|
25
|
+
4. New Relic (APM)
|
|
26
|
+
5. Grafana + Prometheus (open-source)
|
|
27
|
+
|
|
28
|
+
Monitoring choice: _
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Features
|
|
32
|
+
|
|
33
|
+
### Google Analytics 4
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
// lib/analytics/gtag.ts
|
|
37
|
+
export const GA_TRACKING_ID = process.env.NEXT_PUBLIC_GA_ID;
|
|
38
|
+
|
|
39
|
+
export const pageview = (url: string) => {
|
|
40
|
+
window.gtag('config', GA_TRACKING_ID, {
|
|
41
|
+
page_path: url,
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export const event = ({ action, category, label, value }: {
|
|
46
|
+
action: string;
|
|
47
|
+
category: string;
|
|
48
|
+
label: string;
|
|
49
|
+
value?: number;
|
|
50
|
+
}) => {
|
|
51
|
+
window.gtag('event', action, {
|
|
52
|
+
event_category: category,
|
|
53
|
+
event_label: label,
|
|
54
|
+
value: value,
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// app/layout.tsx
|
|
59
|
+
import Script from 'next/script';
|
|
60
|
+
|
|
61
|
+
export default function RootLayout({ children }) {
|
|
62
|
+
return (
|
|
63
|
+
<html>
|
|
64
|
+
<head>
|
|
65
|
+
<Script
|
|
66
|
+
src={`https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}`}
|
|
67
|
+
strategy="afterInteractive"
|
|
68
|
+
/>
|
|
69
|
+
<Script id="google-analytics" strategy="afterInteractive">
|
|
70
|
+
{`
|
|
71
|
+
window.dataLayer = window.dataLayer || [];
|
|
72
|
+
function gtag(){dataLayer.push(arguments);}
|
|
73
|
+
gtag('js', new Date());
|
|
74
|
+
gtag('config', '${GA_TRACKING_ID}');
|
|
75
|
+
`}
|
|
76
|
+
</Script>
|
|
77
|
+
</head>
|
|
78
|
+
<body>{children}</body>
|
|
79
|
+
</html>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### PostHog Integration
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
// lib/analytics/posthog.ts
|
|
88
|
+
import posthog from 'posthog-js';
|
|
89
|
+
|
|
90
|
+
export const initPostHog = () => {
|
|
91
|
+
if (typeof window !== 'undefined') {
|
|
92
|
+
posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
|
|
93
|
+
api_host: process.env.NEXT_PUBLIC_POSTHOG_HOST || 'https://app.posthog.com',
|
|
94
|
+
loaded: (posthog) => {
|
|
95
|
+
if (process.env.NODE_ENV === 'development') posthog.debug();
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export const trackEvent = (event: string, properties?: Record<string, any>) => {
|
|
102
|
+
posthog.capture(event, properties);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
export const identifyUser = (userId: string, traits?: Record<string, any>) => {
|
|
106
|
+
posthog.identify(userId, traits);
|
|
107
|
+
};
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Sentry Error Tracking
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
// sentry.client.config.ts
|
|
114
|
+
import * as Sentry from '@sentry/nextjs';
|
|
115
|
+
|
|
116
|
+
Sentry.init({
|
|
117
|
+
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
|
|
118
|
+
tracesSampleRate: 1.0,
|
|
119
|
+
debug: false,
|
|
120
|
+
replaysOnErrorSampleRate: 1.0,
|
|
121
|
+
replaysSessionSampleRate: 0.1,
|
|
122
|
+
integrations: [
|
|
123
|
+
new Sentry.Replay({
|
|
124
|
+
maskAllText: true,
|
|
125
|
+
blockAllMedia: true,
|
|
126
|
+
}),
|
|
127
|
+
],
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// sentry.server.config.ts
|
|
131
|
+
import * as Sentry from '@sentry/nextjs';
|
|
132
|
+
|
|
133
|
+
Sentry.init({
|
|
134
|
+
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
|
|
135
|
+
tracesSampleRate: 1.0,
|
|
136
|
+
debug: false,
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Custom Event Tracking
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
// lib/analytics/tracker.ts
|
|
144
|
+
class Analytics {
|
|
145
|
+
private static instance: Analytics;
|
|
146
|
+
|
|
147
|
+
private constructor() {}
|
|
148
|
+
|
|
149
|
+
static getInstance(): Analytics {
|
|
150
|
+
if (!Analytics.instance) {
|
|
151
|
+
Analytics.instance = new Analytics();
|
|
152
|
+
}
|
|
153
|
+
return Analytics.instance;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
track(event: string, properties?: Record<string, any>) {
|
|
157
|
+
// Send to multiple platforms
|
|
158
|
+
if (typeof window !== 'undefined') {
|
|
159
|
+
// Google Analytics
|
|
160
|
+
window.gtag?.('event', event, properties);
|
|
161
|
+
|
|
162
|
+
// PostHog
|
|
163
|
+
window.posthog?.capture(event, properties);
|
|
164
|
+
|
|
165
|
+
// Custom backend
|
|
166
|
+
fetch('/api/analytics/track', {
|
|
167
|
+
method: 'POST',
|
|
168
|
+
headers: { 'Content-Type': 'application/json' },
|
|
169
|
+
body: JSON.stringify({ event, properties, timestamp: new Date() }),
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
page(name: string, properties?: Record<string, any>) {
|
|
175
|
+
this.track('page_view', { page: name, ...properties });
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
identify(userId: string, traits?: Record<string, any>) {
|
|
179
|
+
if (typeof window !== 'undefined') {
|
|
180
|
+
window.posthog?.identify(userId, traits);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export const analytics = Analytics.getInstance();
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Performance Monitoring
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
// lib/monitoring/performance.ts
|
|
192
|
+
export function reportWebVitals(metric: any) {
|
|
193
|
+
const { id, name, label, value } = metric;
|
|
194
|
+
|
|
195
|
+
// Send to analytics
|
|
196
|
+
window.gtag?.('event', name, {
|
|
197
|
+
event_category: label === 'web-vital' ? 'Web Vitals' : 'Next.js custom metric',
|
|
198
|
+
value: Math.round(name === 'CLS' ? value * 1000 : value),
|
|
199
|
+
event_label: id,
|
|
200
|
+
non_interaction: true,
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// Send to custom endpoint
|
|
204
|
+
fetch('/api/analytics/web-vitals', {
|
|
205
|
+
method: 'POST',
|
|
206
|
+
headers: { 'Content-Type': 'application/json' },
|
|
207
|
+
body: JSON.stringify(metric),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// pages/_app.tsx
|
|
212
|
+
export { reportWebVitals };
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Server-Side Logging
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
// lib/logger.ts
|
|
219
|
+
import winston from 'winston';
|
|
220
|
+
|
|
221
|
+
const logger = winston.createLogger({
|
|
222
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
223
|
+
format: winston.format.combine(
|
|
224
|
+
winston.format.timestamp(),
|
|
225
|
+
winston.format.errors({ stack: true }),
|
|
226
|
+
winston.format.json()
|
|
227
|
+
),
|
|
228
|
+
transports: [
|
|
229
|
+
new winston.transports.File({ filename: 'error.log', level: 'error' }),
|
|
230
|
+
new winston.transports.File({ filename: 'combined.log' }),
|
|
231
|
+
],
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
235
|
+
logger.add(new winston.transports.Console({
|
|
236
|
+
format: winston.format.simple(),
|
|
237
|
+
}));
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export default logger;
|
|
241
|
+
|
|
242
|
+
// Usage
|
|
243
|
+
logger.info('User logged in', { userId: '123' });
|
|
244
|
+
logger.error('Payment failed', { error: err, orderId: '456' });
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Analytics Dashboard API
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
// pages/api/analytics/stats.ts
|
|
251
|
+
import { NextApiRequest, NextApiResponse } from 'next';
|
|
252
|
+
import prisma from '@/lib/prisma';
|
|
253
|
+
|
|
254
|
+
export default async function handler(
|
|
255
|
+
req: NextApiRequest,
|
|
256
|
+
res: NextApiResponse
|
|
257
|
+
) {
|
|
258
|
+
const { startDate, endDate } = req.query;
|
|
259
|
+
|
|
260
|
+
const stats = await prisma.analyticsEvent.groupBy({
|
|
261
|
+
by: ['event'],
|
|
262
|
+
where: {
|
|
263
|
+
timestamp: {
|
|
264
|
+
gte: new Date(startDate as string),
|
|
265
|
+
lte: new Date(endDate as string),
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
_count: true,
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
const userStats = await prisma.user.aggregate({
|
|
272
|
+
_count: true,
|
|
273
|
+
where: {
|
|
274
|
+
createdAt: {
|
|
275
|
+
gte: new Date(startDate as string),
|
|
276
|
+
lte: new Date(endDate as string),
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
res.json({
|
|
282
|
+
events: stats,
|
|
283
|
+
newUsers: userStats._count,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## Tracked Events
|
|
289
|
+
|
|
290
|
+
- **User Actions**: Sign up, login, logout
|
|
291
|
+
- **Page Views**: All page navigations
|
|
292
|
+
- **Interactions**: Button clicks, form submissions
|
|
293
|
+
- **E-commerce**: Product views, add to cart, purchases
|
|
294
|
+
- **Errors**: Client and server errors
|
|
295
|
+
- **Performance**: Web Vitals (LCP, FID, CLS)
|
|
296
|
+
|
|
297
|
+
## Output Files
|
|
298
|
+
|
|
299
|
+
```
|
|
300
|
+
.luna/{project}/analytics/
|
|
301
|
+
├── lib/
|
|
302
|
+
│ ├── analytics/
|
|
303
|
+
│ │ ├── gtag.ts
|
|
304
|
+
│ │ ├── posthog.ts
|
|
305
|
+
│ │ └── tracker.ts
|
|
306
|
+
│ ├── monitoring/
|
|
307
|
+
│ │ └── performance.ts
|
|
308
|
+
│ └── logger.ts
|
|
309
|
+
├── pages/api/analytics/
|
|
310
|
+
│ ├── track.ts
|
|
311
|
+
│ ├── web-vitals.ts
|
|
312
|
+
│ └── stats.ts
|
|
313
|
+
├── sentry.client.config.ts
|
|
314
|
+
├── sentry.server.config.ts
|
|
315
|
+
└── analytics-setup.md
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
Track everything that matters! 📊✨
|