midas-mcp 3.2.0 → 3.4.0
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/dist/analyzer.d.ts.map +1 -1
- package/dist/analyzer.js +93 -49
- package/dist/analyzer.js.map +1 -1
- package/dist/docs/DEPLOYMENT.md +190 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/monitoring.d.ts +97 -0
- package/dist/monitoring.d.ts.map +1 -0
- package/dist/monitoring.js +258 -0
- package/dist/monitoring.js.map +1 -0
- package/dist/prompts/grow.d.ts.map +1 -1
- package/dist/prompts/grow.js +155 -47
- package/dist/prompts/grow.js.map +1 -1
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +77 -15
- package/dist/providers.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +21 -3
- package/dist/server.js.map +1 -1
- package/dist/state/phase.d.ts +19 -4
- package/dist/state/phase.d.ts.map +1 -1
- package/dist/state/phase.js +19 -10
- package/dist/state/phase.js.map +1 -1
- package/dist/tools/analyze.d.ts.map +1 -1
- package/dist/tools/analyze.js +21 -9
- package/dist/tools/analyze.js.map +1 -1
- package/dist/tools/completeness.d.ts +36 -0
- package/dist/tools/completeness.d.ts.map +1 -0
- package/dist/tools/completeness.js +838 -0
- package/dist/tools/completeness.js.map +1 -0
- package/dist/tools/grow.d.ts +157 -0
- package/dist/tools/grow.d.ts.map +1 -0
- package/dist/tools/grow.js +532 -0
- package/dist/tools/grow.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/validate.d.ts +60 -0
- package/dist/tools/validate.d.ts.map +1 -0
- package/dist/tools/validate.js +234 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tools/verify.d.ts +4 -4
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +66 -12
- package/dist/tui.js.map +1 -1
- package/docs/DEPLOYMENT.md +190 -0
- package/package.json +1 -1
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Production Monitoring Integration
|
|
3
|
+
*
|
|
4
|
+
* Provides hooks for:
|
|
5
|
+
* - Error tracking (Sentry)
|
|
6
|
+
* - Observability (OpenTelemetry)
|
|
7
|
+
* - Custom metrics
|
|
8
|
+
*
|
|
9
|
+
* These are optional integrations - if the libraries aren't installed,
|
|
10
|
+
* the hooks gracefully degrade to no-ops.
|
|
11
|
+
*/
|
|
12
|
+
import { logger } from './logger.js';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// SENTRY INTEGRATION
|
|
15
|
+
// ============================================================================
|
|
16
|
+
let sentryClient = null;
|
|
17
|
+
let sentryInitialized = false;
|
|
18
|
+
/**
|
|
19
|
+
* Initialize Sentry if SENTRY_DSN is set
|
|
20
|
+
*
|
|
21
|
+
* Sentry cost estimate (free tier):
|
|
22
|
+
* - 5,000 errors/month free
|
|
23
|
+
* - 10,000 performance samples/month free
|
|
24
|
+
* - Beyond free: ~$0.000029 per error
|
|
25
|
+
*
|
|
26
|
+
* MAX MONTHLY COST: ~$15 at 500k errors (extreme case)
|
|
27
|
+
* Expected: $0 (well under free tier for dev tools)
|
|
28
|
+
*/
|
|
29
|
+
export function initSentry() {
|
|
30
|
+
if (sentryInitialized)
|
|
31
|
+
return !!sentryClient;
|
|
32
|
+
sentryInitialized = true;
|
|
33
|
+
const dsn = process.env.SENTRY_DSN;
|
|
34
|
+
if (!dsn) {
|
|
35
|
+
logger.debug('Sentry not configured (no SENTRY_DSN)');
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
// Dynamic import to avoid requiring Sentry as a dependency
|
|
40
|
+
// Users can install @sentry/node if they want this feature
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
42
|
+
import('@sentry/node').then((Sentry) => {
|
|
43
|
+
const S = Sentry;
|
|
44
|
+
S.init({
|
|
45
|
+
dsn,
|
|
46
|
+
environment: process.env.NODE_ENV || 'development',
|
|
47
|
+
release: process.env.npm_package_version,
|
|
48
|
+
tracesSampleRate: 0.1,
|
|
49
|
+
enabled: process.env.NODE_ENV === 'production' || process.env.SENTRY_ENABLED === 'true',
|
|
50
|
+
maxBreadcrumbs: 50,
|
|
51
|
+
});
|
|
52
|
+
sentryClient = Sentry;
|
|
53
|
+
logger.info('Sentry initialized');
|
|
54
|
+
}).catch(() => {
|
|
55
|
+
logger.debug('Sentry package not installed');
|
|
56
|
+
});
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
logger.debug('Sentry initialization failed');
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Capture an error with context
|
|
66
|
+
*/
|
|
67
|
+
export function captureError(error, context) {
|
|
68
|
+
logger.error('Error captured', { error: error.message, ...context });
|
|
69
|
+
if (!sentryClient)
|
|
70
|
+
return;
|
|
71
|
+
try {
|
|
72
|
+
const S = sentryClient;
|
|
73
|
+
S.withScope((scope) => {
|
|
74
|
+
if (context?.phase)
|
|
75
|
+
scope.setTag('phase', context.phase);
|
|
76
|
+
if (context?.step)
|
|
77
|
+
scope.setTag('step', context.step);
|
|
78
|
+
if (context?.tool)
|
|
79
|
+
scope.setTag('tool', context.tool);
|
|
80
|
+
if (context?.projectPath)
|
|
81
|
+
scope.setContext('project', { path: context.projectPath });
|
|
82
|
+
if (context?.extra)
|
|
83
|
+
scope.setExtras(context.extra);
|
|
84
|
+
S.captureException(error);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// Silently fail - monitoring should never break the app
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Add a breadcrumb for debugging context
|
|
93
|
+
*/
|
|
94
|
+
export function addBreadcrumb(message, category, data) {
|
|
95
|
+
if (!sentryClient)
|
|
96
|
+
return;
|
|
97
|
+
try {
|
|
98
|
+
const S = sentryClient;
|
|
99
|
+
S.addBreadcrumb({
|
|
100
|
+
message,
|
|
101
|
+
category,
|
|
102
|
+
data,
|
|
103
|
+
level: 'info',
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Silently fail
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// ============================================================================
|
|
111
|
+
// OPENTELEMETRY INTEGRATION
|
|
112
|
+
// ============================================================================
|
|
113
|
+
let otelMeter = null;
|
|
114
|
+
let otelInitialized = false;
|
|
115
|
+
// Metric counters (created lazily)
|
|
116
|
+
let analysisCounter = null;
|
|
117
|
+
let tokenCounter = null;
|
|
118
|
+
let latencyHistogram = null;
|
|
119
|
+
/**
|
|
120
|
+
* Initialize OpenTelemetry metrics if OTEL_EXPORTER_OTLP_ENDPOINT is set
|
|
121
|
+
*
|
|
122
|
+
* OpenTelemetry is free (self-hosted) or pay-per-use with vendors:
|
|
123
|
+
* - Datadog: ~$0.10 per million custom metrics
|
|
124
|
+
* - Grafana Cloud: 10k series free, then ~$8/1k series
|
|
125
|
+
* - Self-hosted: Infrastructure costs only
|
|
126
|
+
*
|
|
127
|
+
* MAX MONTHLY COST: ~$10 at typical usage
|
|
128
|
+
*/
|
|
129
|
+
export function initOpenTelemetry() {
|
|
130
|
+
if (otelInitialized)
|
|
131
|
+
return !!otelMeter;
|
|
132
|
+
otelInitialized = true;
|
|
133
|
+
const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
|
|
134
|
+
if (!endpoint) {
|
|
135
|
+
logger.debug('OpenTelemetry not configured (no OTEL_EXPORTER_OTLP_ENDPOINT)');
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
// Dynamic import to avoid requiring OTel as a dependency
|
|
140
|
+
import('@opentelemetry/api').then((api) => {
|
|
141
|
+
const otelApi = api;
|
|
142
|
+
otelMeter = otelApi.metrics.getMeter('midas-mcp');
|
|
143
|
+
// Create counters
|
|
144
|
+
const meter = otelMeter;
|
|
145
|
+
analysisCounter = meter.createCounter('midas.analysis.count', {
|
|
146
|
+
description: 'Number of project analyses',
|
|
147
|
+
});
|
|
148
|
+
tokenCounter = meter.createCounter('midas.tokens.total', {
|
|
149
|
+
description: 'Total tokens consumed',
|
|
150
|
+
});
|
|
151
|
+
latencyHistogram = meter.createHistogram('midas.analysis.latency', {
|
|
152
|
+
description: 'Analysis latency in milliseconds',
|
|
153
|
+
unit: 'ms',
|
|
154
|
+
});
|
|
155
|
+
logger.info('OpenTelemetry metrics initialized');
|
|
156
|
+
}).catch(() => {
|
|
157
|
+
logger.debug('OpenTelemetry package not installed');
|
|
158
|
+
});
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
logger.debug('OpenTelemetry initialization failed');
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Record an analysis event
|
|
168
|
+
*/
|
|
169
|
+
export function recordAnalysis(latencyMs, tags) {
|
|
170
|
+
if (!otelMeter || !analysisCounter || !latencyHistogram)
|
|
171
|
+
return;
|
|
172
|
+
try {
|
|
173
|
+
const counter = analysisCounter;
|
|
174
|
+
const histogram = latencyHistogram;
|
|
175
|
+
const attributes = {
|
|
176
|
+
provider: tags?.provider || 'unknown',
|
|
177
|
+
phase: tags?.phase || 'unknown',
|
|
178
|
+
cached: String(tags?.cached ?? false),
|
|
179
|
+
};
|
|
180
|
+
counter.add(1, attributes);
|
|
181
|
+
histogram.record(latencyMs, attributes);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Silently fail
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Record token usage
|
|
189
|
+
*/
|
|
190
|
+
export function recordTokens(inputTokens, outputTokens, tags) {
|
|
191
|
+
if (!otelMeter || !tokenCounter)
|
|
192
|
+
return;
|
|
193
|
+
try {
|
|
194
|
+
const counter = tokenCounter;
|
|
195
|
+
const attributes = {
|
|
196
|
+
provider: tags?.provider || 'unknown',
|
|
197
|
+
type: 'input',
|
|
198
|
+
};
|
|
199
|
+
counter.add(inputTokens, attributes);
|
|
200
|
+
counter.add(outputTokens, { ...attributes, type: 'output' });
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// Silently fail
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// ============================================================================
|
|
207
|
+
// UNIFIED MONITORING INTERFACE
|
|
208
|
+
// ============================================================================
|
|
209
|
+
/**
|
|
210
|
+
* Initialize all monitoring integrations
|
|
211
|
+
* Call this once at startup
|
|
212
|
+
*/
|
|
213
|
+
export function initMonitoring() {
|
|
214
|
+
const sentry = initSentry();
|
|
215
|
+
const otel = initOpenTelemetry();
|
|
216
|
+
if (sentry || otel) {
|
|
217
|
+
logger.info('Monitoring initialized', { sentry, otel });
|
|
218
|
+
}
|
|
219
|
+
return { sentry, otel };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Wrap an async function with error tracking
|
|
223
|
+
*/
|
|
224
|
+
export function withErrorTracking(fn, context) {
|
|
225
|
+
return fn().catch((error) => {
|
|
226
|
+
captureError(error, context);
|
|
227
|
+
throw error;
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Create a timed operation for metrics
|
|
232
|
+
*/
|
|
233
|
+
export function startTimer() {
|
|
234
|
+
const start = Date.now();
|
|
235
|
+
return {
|
|
236
|
+
end(tags) {
|
|
237
|
+
const latency = Date.now() - start;
|
|
238
|
+
recordAnalysis(latency, tags);
|
|
239
|
+
return latency;
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Health check for monitoring systems
|
|
245
|
+
*/
|
|
246
|
+
export function getMonitoringHealth() {
|
|
247
|
+
return {
|
|
248
|
+
sentry: {
|
|
249
|
+
initialized: sentryInitialized,
|
|
250
|
+
configured: !!sentryClient,
|
|
251
|
+
},
|
|
252
|
+
otel: {
|
|
253
|
+
initialized: otelInitialized,
|
|
254
|
+
configured: !!otelMeter,
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=monitoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitoring.js","sourceRoot":"","sources":["../src/monitoring.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grow.d.ts","sourceRoot":"","sources":["../../src/prompts/grow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"grow.d.ts","sourceRoot":"","sources":["../../src/prompts/grow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyR3D"}
|
package/dist/prompts/grow.js
CHANGED
|
@@ -1,7 +1,34 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
export function registerGrowPrompts(server) {
|
|
3
|
-
//
|
|
4
|
-
server.prompt('
|
|
3
|
+
// MONITOR step - Production health tracking
|
|
4
|
+
server.prompt('production_health', 'Review production health metrics and error rates', { errorLogs: z.string().optional().describe('Paste recent error logs or metrics') }, (args) => ({
|
|
5
|
+
messages: [
|
|
6
|
+
{
|
|
7
|
+
role: 'user',
|
|
8
|
+
content: {
|
|
9
|
+
type: 'text',
|
|
10
|
+
text: `Analyze production health:
|
|
11
|
+
|
|
12
|
+
${args.errorLogs ? `Recent data:\n${args.errorLogs}\n\n---` : ''}
|
|
13
|
+
|
|
14
|
+
Check:
|
|
15
|
+
1. **Error rates** - What's breaking? Frequency? Patterns?
|
|
16
|
+
2. **Latency** - p50, p95, p99 response times
|
|
17
|
+
3. **Uptime** - Any outages? Duration?
|
|
18
|
+
4. **Resources** - CPU, memory, disk usage trends
|
|
19
|
+
|
|
20
|
+
For each issue:
|
|
21
|
+
- Severity (critical/high/medium/low)
|
|
22
|
+
- Affected users/requests
|
|
23
|
+
- Recommended action
|
|
24
|
+
|
|
25
|
+
Output a health report with priorities.`,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
}));
|
|
30
|
+
// COLLECT step - Gather feedback
|
|
31
|
+
server.prompt('collect_feedback', 'Analyze user feedback to identify patterns', { feedback: z.string().describe('User feedback to analyze (paste reviews, comments, tickets)') }, (args) => ({
|
|
5
32
|
messages: [
|
|
6
33
|
{
|
|
7
34
|
role: 'user',
|
|
@@ -13,90 +40,171 @@ ${args.feedback}
|
|
|
13
40
|
|
|
14
41
|
---
|
|
15
42
|
|
|
16
|
-
1. **Categorize** each piece
|
|
43
|
+
1. **Categorize** each piece:
|
|
17
44
|
- Bug report
|
|
18
45
|
- Feature request
|
|
19
|
-
- UX
|
|
46
|
+
- UX friction
|
|
20
47
|
- Performance complaint
|
|
21
48
|
- Praise
|
|
22
49
|
|
|
23
|
-
2. **Identify patterns** -
|
|
50
|
+
2. **Identify patterns** - Themes appearing multiple times
|
|
24
51
|
|
|
25
|
-
3. **
|
|
26
|
-
- Quick wins (low effort, high impact)
|
|
27
|
-
- Major projects (high effort, high impact)
|
|
28
|
-
- Nice to haves (low effort, low impact)
|
|
29
|
-
- Avoid (high effort, low impact)
|
|
52
|
+
3. **Extract quotes** - Most impactful user statements
|
|
30
53
|
|
|
31
|
-
4. **
|
|
54
|
+
4. **Sentiment** - Overall positive/negative/neutral breakdown
|
|
55
|
+
|
|
56
|
+
Output a feedback summary with key insights.`,
|
|
32
57
|
},
|
|
33
58
|
},
|
|
34
59
|
],
|
|
35
60
|
}));
|
|
36
|
-
//
|
|
37
|
-
server.prompt('
|
|
61
|
+
// TRIAGE step - Prioritize issues
|
|
62
|
+
server.prompt('triage_bugs', 'Prioritize bugs and issues by impact and effort', { issues: z.string().describe('List of bugs/issues to triage') }, (args) => ({
|
|
38
63
|
messages: [
|
|
39
64
|
{
|
|
40
65
|
role: 'user',
|
|
41
66
|
content: {
|
|
42
67
|
type: 'text',
|
|
43
|
-
text: `
|
|
68
|
+
text: `Triage these issues:
|
|
44
69
|
|
|
45
|
-
${args.
|
|
70
|
+
${args.issues}
|
|
46
71
|
|
|
47
|
-
|
|
72
|
+
---
|
|
48
73
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
5. **Referral** - Viral coefficient
|
|
74
|
+
For each issue, determine:
|
|
75
|
+
1. **Impact** (1-5): Users affected, severity, revenue impact
|
|
76
|
+
2. **Effort** (1-5): Complexity, risk, dependencies
|
|
77
|
+
3. **Urgency**: Is it getting worse?
|
|
54
78
|
|
|
55
|
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
79
|
+
Then categorize:
|
|
80
|
+
- **P0 Critical**: Fix immediately (blocking users, security, data loss)
|
|
81
|
+
- **P1 High**: Fix this sprint (major functionality broken)
|
|
82
|
+
- **P2 Medium**: Schedule soon (degraded experience)
|
|
83
|
+
- **P3 Low**: Backlog (minor annoyance)
|
|
59
84
|
|
|
60
|
-
|
|
85
|
+
Output a prioritized list with recommended order.`,
|
|
61
86
|
},
|
|
62
87
|
},
|
|
63
88
|
],
|
|
64
89
|
}));
|
|
65
|
-
//
|
|
66
|
-
server.prompt('
|
|
90
|
+
// RETROSPECT step - Review the cycle
|
|
91
|
+
server.prompt('sprint_retro', 'Conduct a sprint/cycle retrospective', {
|
|
92
|
+
accomplishments: z.string().optional().describe('What was shipped'),
|
|
93
|
+
issues: z.string().optional().describe('Problems encountered'),
|
|
94
|
+
}, (args) => ({
|
|
67
95
|
messages: [
|
|
68
96
|
{
|
|
69
97
|
role: 'user',
|
|
70
98
|
content: {
|
|
71
99
|
type: 'text',
|
|
72
|
-
text: `
|
|
100
|
+
text: `Sprint retrospective:
|
|
101
|
+
|
|
102
|
+
${args.accomplishments ? `Shipped:\n${args.accomplishments}\n` : ''}
|
|
103
|
+
${args.issues ? `Issues:\n${args.issues}\n` : ''}
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
Guide me through:
|
|
107
|
+
|
|
108
|
+
1. **What worked well?**
|
|
109
|
+
- Processes that helped
|
|
110
|
+
- Tools that saved time
|
|
111
|
+
- Team dynamics that clicked
|
|
112
|
+
|
|
113
|
+
2. **What didn't work?**
|
|
114
|
+
- Blockers we hit
|
|
115
|
+
- Time wasted on
|
|
116
|
+
- Communication gaps
|
|
117
|
+
|
|
118
|
+
3. **What surprised us?**
|
|
119
|
+
- Unexpected wins
|
|
120
|
+
- Hidden complexity
|
|
121
|
+
- User behavior we didn't expect
|
|
122
|
+
|
|
123
|
+
4. **Action items**
|
|
124
|
+
- One thing to START doing
|
|
125
|
+
- One thing to STOP doing
|
|
126
|
+
- One thing to CONTINUE doing
|
|
127
|
+
|
|
128
|
+
Output concrete action items for next cycle.`,
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
}));
|
|
133
|
+
// PLAN_NEXT step - Scope next iteration
|
|
134
|
+
server.prompt('plan_next_cycle', 'Plan the next development cycle with clear scope', { learnings: z.string().optional().describe('Key learnings from retro') }, (args) => ({
|
|
135
|
+
messages: [
|
|
136
|
+
{
|
|
137
|
+
role: 'user',
|
|
138
|
+
content: {
|
|
139
|
+
type: 'text',
|
|
140
|
+
text: `Plan next cycle:
|
|
141
|
+
|
|
142
|
+
${args.learnings ? `Learnings:\n${args.learnings}\n\n---` : ''}
|
|
143
|
+
|
|
144
|
+
Define:
|
|
145
|
+
|
|
146
|
+
1. **Hypothesis**
|
|
147
|
+
- What are we testing?
|
|
148
|
+
- What do we believe will happen?
|
|
149
|
+
- How will we validate?
|
|
150
|
+
|
|
151
|
+
2. **Scope**
|
|
152
|
+
- Single most important thing to build
|
|
153
|
+
- Explicit non-goals (what we WON'T do)
|
|
154
|
+
- Minimum viable version
|
|
155
|
+
|
|
156
|
+
3. **Success metrics**
|
|
157
|
+
- How do we measure success?
|
|
158
|
+
- Target numbers
|
|
159
|
+
- Timeline
|
|
160
|
+
|
|
161
|
+
4. **Risks**
|
|
162
|
+
- What could go wrong?
|
|
163
|
+
- Mitigation strategies
|
|
164
|
+
- Kill criteria (when to pivot)
|
|
165
|
+
|
|
166
|
+
Output a one-page cycle plan.`,
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
}));
|
|
171
|
+
// LOOP step - Return to PLAN with context
|
|
172
|
+
server.prompt('cycle_handoff', 'Prepare context for next PLAN phase', {}, () => ({
|
|
173
|
+
messages: [
|
|
174
|
+
{
|
|
175
|
+
role: 'user',
|
|
176
|
+
content: {
|
|
177
|
+
type: 'text',
|
|
178
|
+
text: `Prepare for next PLAN phase:
|
|
179
|
+
|
|
180
|
+
Create handoff document:
|
|
73
181
|
|
|
74
|
-
1. **
|
|
75
|
-
- What
|
|
76
|
-
-
|
|
77
|
-
-
|
|
182
|
+
1. **Context summary**
|
|
183
|
+
- What was built this cycle
|
|
184
|
+
- Current state of the product
|
|
185
|
+
- Active users/usage metrics
|
|
78
186
|
|
|
79
|
-
2. **
|
|
80
|
-
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
187
|
+
2. **Lessons learned**
|
|
188
|
+
- Technical decisions that worked/didn't
|
|
189
|
+
- Process improvements needed
|
|
190
|
+
- Knowledge to preserve
|
|
83
191
|
|
|
84
|
-
3. **
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
-
|
|
192
|
+
3. **Carry forward**
|
|
193
|
+
- Unresolved bugs (prioritized)
|
|
194
|
+
- Feature requests (prioritized)
|
|
195
|
+
- Technical debt to address
|
|
88
196
|
|
|
89
|
-
4. **
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
-
|
|
197
|
+
4. **Brainlift updates**
|
|
198
|
+
- New edge knowledge gained
|
|
199
|
+
- Updated constraints
|
|
200
|
+
- Revised assumptions
|
|
93
201
|
|
|
94
|
-
Output a
|
|
202
|
+
Output a handoff doc ready to inform the next PLAN phase.`,
|
|
95
203
|
},
|
|
96
204
|
},
|
|
97
205
|
],
|
|
98
206
|
}));
|
|
99
|
-
// Performance optimization
|
|
207
|
+
// Performance optimization (keep existing)
|
|
100
208
|
server.prompt('optimize_performance', 'Identify and fix performance bottlenecks', { area: z.string().optional().describe('Specific area to optimize (frontend/backend/db)') }, (args) => ({
|
|
101
209
|
messages: [
|
|
102
210
|
{
|
package/dist/prompts/grow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grow.js","sourceRoot":"","sources":["../../src/prompts/grow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,
|
|
1
|
+
{"version":3,"file":"grow.js","sourceRoot":"","sources":["../../src/prompts/grow.ts"],"names":[],"mappings":"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"}
|
package/dist/providers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAKpF,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAkCD;;GAEG;AACH,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CA4B3F;AAyTD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAEjE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,UAAU,GAAG;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAaA"}
|