cmp-standards 2.8.0 → 2.9.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/dist/analytics/CrossProjectAnalytics.d.ts +128 -0
- package/dist/analytics/CrossProjectAnalytics.d.ts.map +1 -0
- package/dist/analytics/CrossProjectAnalytics.js +431 -0
- package/dist/analytics/CrossProjectAnalytics.js.map +1 -0
- package/dist/analytics/index.d.ts +1 -0
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +2 -0
- package/dist/analytics/index.js.map +1 -1
- package/dist/cache/EmbeddingCache.d.ts +6 -4
- package/dist/cache/EmbeddingCache.d.ts.map +1 -1
- package/dist/cache/EmbeddingCache.js +28 -17
- package/dist/cache/EmbeddingCache.js.map +1 -1
- package/dist/cli/index.js +247 -141
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ui.d.ts +134 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +311 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/dashboard/tokens.d.ts +228 -0
- package/dist/dashboard/tokens.d.ts.map +1 -0
- package/dist/dashboard/tokens.js +450 -0
- package/dist/dashboard/tokens.js.map +1 -0
- package/dist/dashboard/ui.d.ts +3 -0
- package/dist/dashboard/ui.d.ts.map +1 -1
- package/dist/dashboard/ui.js +95 -61
- package/dist/dashboard/ui.js.map +1 -1
- package/dist/db/cloud.d.ts +11 -0
- package/dist/db/cloud.d.ts.map +1 -1
- package/dist/db/cloud.js +49 -1
- package/dist/db/cloud.js.map +1 -1
- package/dist/db/migrations.d.ts +1 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +109 -0
- package/dist/db/migrations.js.map +1 -1
- package/dist/experts/ExpertVotePersistence.d.ts +86 -0
- package/dist/experts/ExpertVotePersistence.d.ts.map +1 -0
- package/dist/experts/ExpertVotePersistence.js +234 -0
- package/dist/experts/ExpertVotePersistence.js.map +1 -0
- package/dist/experts/index.d.ts +1 -0
- package/dist/experts/index.d.ts.map +1 -1
- package/dist/experts/index.js +2 -0
- package/dist/experts/index.js.map +1 -1
- package/dist/hooks/cloud-post-tool-use.d.ts +5 -0
- package/dist/hooks/cloud-post-tool-use.d.ts.map +1 -1
- package/dist/hooks/cloud-post-tool-use.js +43 -10
- package/dist/hooks/cloud-post-tool-use.js.map +1 -1
- package/dist/hooks/cloud-session-start.d.ts.map +1 -1
- package/dist/hooks/cloud-session-start.js +64 -0
- package/dist/hooks/cloud-session-start.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/session-end.d.ts +67 -0
- package/dist/hooks/session-end.d.ts.map +1 -0
- package/dist/hooks/session-end.js +268 -0
- package/dist/hooks/session-end.js.map +1 -0
- package/dist/hooks/startup-verify.d.ts +31 -0
- package/dist/hooks/startup-verify.d.ts.map +1 -0
- package/dist/hooks/startup-verify.js +360 -0
- package/dist/hooks/startup-verify.js.map +1 -0
- package/dist/mcp/schemas.d.ts +2 -2
- package/dist/performance/Debouncer.d.ts +57 -0
- package/dist/performance/Debouncer.d.ts.map +1 -1
- package/dist/performance/Debouncer.js +149 -0
- package/dist/performance/Debouncer.js.map +1 -1
- package/dist/performance/index.d.ts +1 -1
- package/dist/performance/index.d.ts.map +1 -1
- package/dist/performance/index.js +3 -1
- package/dist/performance/index.js.map +1 -1
- package/dist/plugins/PluginManager.d.ts +160 -0
- package/dist/plugins/PluginManager.d.ts.map +1 -0
- package/dist/plugins/PluginManager.js +417 -0
- package/dist/plugins/PluginManager.js.map +1 -0
- package/dist/plugins/index.d.ts +7 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +7 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/schema/expert-types.d.ts +2 -2
- package/dist/services/AuditLog.d.ts +205 -0
- package/dist/services/AuditLog.d.ts.map +1 -0
- package/dist/services/AuditLog.js +352 -0
- package/dist/services/AuditLog.js.map +1 -0
- package/dist/services/FeedbackCollector.d.ts +71 -0
- package/dist/services/FeedbackCollector.d.ts.map +1 -0
- package/dist/services/FeedbackCollector.js +236 -0
- package/dist/services/FeedbackCollector.js.map +1 -0
- package/dist/services/GitIntegration.d.ts +140 -0
- package/dist/services/GitIntegration.d.ts.map +1 -0
- package/dist/services/GitIntegration.js +423 -0
- package/dist/services/GitIntegration.js.map +1 -0
- package/dist/services/HookVerifier.d.ts +95 -0
- package/dist/services/HookVerifier.d.ts.map +1 -0
- package/dist/services/HookVerifier.js +493 -0
- package/dist/services/HookVerifier.js.map +1 -0
- package/dist/services/MemoryVersioning.d.ts +108 -0
- package/dist/services/MemoryVersioning.d.ts.map +1 -0
- package/dist/services/MemoryVersioning.js +281 -0
- package/dist/services/MemoryVersioning.js.map +1 -0
- package/dist/services/context-injector.d.ts +8 -0
- package/dist/services/context-injector.d.ts.map +1 -1
- package/dist/services/context-injector.js +19 -2
- package/dist/services/context-injector.js.map +1 -1
- package/dist/services/index.d.ts +6 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +8 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/memory-router.d.ts +8 -0
- package/dist/services/memory-router.d.ts.map +1 -1
- package/dist/services/memory-router.js +19 -2
- package/dist/services/memory-router.js.map +1 -1
- package/dist/services/pattern-tracker.d.ts +63 -0
- package/dist/services/pattern-tracker.d.ts.map +1 -1
- package/dist/services/pattern-tracker.js +180 -2
- package/dist/services/pattern-tracker.js.map +1 -1
- package/dist/services/semantic-search.d.ts +4 -0
- package/dist/services/semantic-search.d.ts.map +1 -1
- package/dist/services/semantic-search.js +53 -13
- package/dist/services/semantic-search.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Startup Verification Hook
|
|
3
|
+
* @description Validates all services and infrastructure on session start
|
|
4
|
+
*
|
|
5
|
+
* This hook should run FIRST to verify:
|
|
6
|
+
* - Environment variables are loaded correctly
|
|
7
|
+
* - Cloud services are reachable
|
|
8
|
+
* - Database connections work
|
|
9
|
+
* - Required configurations exist
|
|
10
|
+
*
|
|
11
|
+
* Outputs a clear status report so issues are visible immediately.
|
|
12
|
+
*
|
|
13
|
+
* @version 2.9.0
|
|
14
|
+
*/
|
|
15
|
+
import { config as dotenvConfig } from 'dotenv';
|
|
16
|
+
import { resolve } from 'path';
|
|
17
|
+
import { existsSync, readFileSync } from 'fs';
|
|
18
|
+
import { fileURLToPath } from 'url';
|
|
19
|
+
// =============================================================================
|
|
20
|
+
// Environment Loading
|
|
21
|
+
// =============================================================================
|
|
22
|
+
/**
|
|
23
|
+
* Load .env from multiple possible locations (monorepo support)
|
|
24
|
+
*/
|
|
25
|
+
function loadEnvironment(cwd) {
|
|
26
|
+
const possiblePaths = [
|
|
27
|
+
resolve(cwd, '.env'),
|
|
28
|
+
resolve(cwd, '../.env'),
|
|
29
|
+
resolve(cwd, '../../.env'),
|
|
30
|
+
resolve(cwd, '../../../.env'),
|
|
31
|
+
];
|
|
32
|
+
for (const envPath of possiblePaths) {
|
|
33
|
+
if (existsSync(envPath)) {
|
|
34
|
+
dotenvConfig({ path: envPath, override: true });
|
|
35
|
+
return { loaded: true, path: envPath };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Try default dotenv behavior
|
|
39
|
+
dotenvConfig();
|
|
40
|
+
return { loaded: false };
|
|
41
|
+
}
|
|
42
|
+
// =============================================================================
|
|
43
|
+
// Individual Verifications
|
|
44
|
+
// =============================================================================
|
|
45
|
+
function verifyEnvVariable(name, required = true) {
|
|
46
|
+
const value = process.env[name];
|
|
47
|
+
if (!value) {
|
|
48
|
+
return {
|
|
49
|
+
service: `ENV:${name}`,
|
|
50
|
+
status: required ? 'error' : 'warn',
|
|
51
|
+
message: required ? `Missing required variable` : `Optional variable not set`,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// Mask the value for display
|
|
55
|
+
const masked = value.length > 8 ? value.slice(0, 4) + '***' + value.slice(-4) : '***';
|
|
56
|
+
return {
|
|
57
|
+
service: `ENV:${name}`,
|
|
58
|
+
status: 'ok',
|
|
59
|
+
message: `Set (${masked})`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async function verifyTurso() {
|
|
63
|
+
const url = process.env.TURSO_DATABASE_URL;
|
|
64
|
+
const token = process.env.TURSO_AUTH_TOKEN;
|
|
65
|
+
if (!url || !token) {
|
|
66
|
+
return {
|
|
67
|
+
service: 'Turso',
|
|
68
|
+
status: 'error',
|
|
69
|
+
message: 'Missing credentials',
|
|
70
|
+
details: `URL: ${url ? 'set' : 'missing'}, Token: ${token ? 'set' : 'missing'}`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const { createClient } = await import('@libsql/client');
|
|
75
|
+
const client = createClient({ url, authToken: token });
|
|
76
|
+
const result = await client.execute('SELECT 1 as test');
|
|
77
|
+
if (result.rows.length > 0) {
|
|
78
|
+
return {
|
|
79
|
+
service: 'Turso',
|
|
80
|
+
status: 'ok',
|
|
81
|
+
message: 'Connected and responding',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
service: 'Turso',
|
|
86
|
+
status: 'warn',
|
|
87
|
+
message: 'Connected but query returned no results',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return {
|
|
92
|
+
service: 'Turso',
|
|
93
|
+
status: 'error',
|
|
94
|
+
message: 'Connection failed',
|
|
95
|
+
details: error instanceof Error ? error.message : String(error),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function verifyRedis() {
|
|
100
|
+
const url = process.env.UPSTASH_REDIS_REST_URL;
|
|
101
|
+
const token = process.env.UPSTASH_REDIS_REST_TOKEN;
|
|
102
|
+
if (!url || !token) {
|
|
103
|
+
return {
|
|
104
|
+
service: 'Redis',
|
|
105
|
+
status: 'error',
|
|
106
|
+
message: 'Missing credentials',
|
|
107
|
+
details: `URL: ${url ? 'set' : 'missing'}, Token: ${token ? 'set' : 'missing'}`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const { Redis } = await import('@upstash/redis');
|
|
112
|
+
const redis = new Redis({ url, token });
|
|
113
|
+
const pong = await redis.ping();
|
|
114
|
+
if (pong === 'PONG') {
|
|
115
|
+
return {
|
|
116
|
+
service: 'Redis',
|
|
117
|
+
status: 'ok',
|
|
118
|
+
message: 'Connected (PONG)',
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
service: 'Redis',
|
|
123
|
+
status: 'warn',
|
|
124
|
+
message: `Unexpected response: ${pong}`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
return {
|
|
129
|
+
service: 'Redis',
|
|
130
|
+
status: 'error',
|
|
131
|
+
message: 'Connection failed',
|
|
132
|
+
details: error instanceof Error ? error.message : String(error),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function verifyVector() {
|
|
137
|
+
const url = process.env.UPSTASH_VECTOR_REST_URL;
|
|
138
|
+
const token = process.env.UPSTASH_VECTOR_REST_TOKEN;
|
|
139
|
+
if (!url || !token) {
|
|
140
|
+
return {
|
|
141
|
+
service: 'Vector',
|
|
142
|
+
status: 'warn',
|
|
143
|
+
message: 'Not configured (optional)',
|
|
144
|
+
details: `URL: ${url ? 'set' : 'missing'}, Token: ${token ? 'set' : 'missing'}`,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const { Index } = await import('@upstash/vector');
|
|
149
|
+
const index = new Index({ url, token });
|
|
150
|
+
const info = await index.info();
|
|
151
|
+
return {
|
|
152
|
+
service: 'Vector',
|
|
153
|
+
status: 'ok',
|
|
154
|
+
message: `Connected (${info.vectorCount ?? 0} vectors)`,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
return {
|
|
159
|
+
service: 'Vector',
|
|
160
|
+
status: 'warn',
|
|
161
|
+
message: 'Connection failed (optional service)',
|
|
162
|
+
details: error instanceof Error ? error.message : String(error),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function verifyProjectConfig(cwd) {
|
|
167
|
+
const configPath = resolve(cwd, '.claude/project.config.json');
|
|
168
|
+
if (!existsSync(configPath)) {
|
|
169
|
+
return {
|
|
170
|
+
service: 'Project Config',
|
|
171
|
+
status: 'warn',
|
|
172
|
+
message: 'Not found (.claude/project.config.json)',
|
|
173
|
+
details: 'Run: npx cmp-standards init --system YOUR_SYSTEM',
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
178
|
+
const config = JSON.parse(content);
|
|
179
|
+
if (!config.system) {
|
|
180
|
+
return {
|
|
181
|
+
service: 'Project Config',
|
|
182
|
+
status: 'warn',
|
|
183
|
+
message: 'Missing system identifier',
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
service: 'Project Config',
|
|
188
|
+
status: 'ok',
|
|
189
|
+
message: `System: ${config.system}`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
return {
|
|
194
|
+
service: 'Project Config',
|
|
195
|
+
status: 'error',
|
|
196
|
+
message: 'Invalid JSON',
|
|
197
|
+
details: error instanceof Error ? error.message : String(error),
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function verifyHooksDirectory(cwd) {
|
|
202
|
+
const hooksPath = resolve(cwd, '.claude/hooks');
|
|
203
|
+
if (!existsSync(hooksPath)) {
|
|
204
|
+
return {
|
|
205
|
+
service: 'Hooks Directory',
|
|
206
|
+
status: 'warn',
|
|
207
|
+
message: 'Not found (.claude/hooks)',
|
|
208
|
+
details: 'Run: npx cmp-standards sync --hooks',
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
service: 'Hooks Directory',
|
|
213
|
+
status: 'ok',
|
|
214
|
+
message: 'Exists',
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// =============================================================================
|
|
218
|
+
// Main Verification Function
|
|
219
|
+
// =============================================================================
|
|
220
|
+
export async function verifyStartup(cwd) {
|
|
221
|
+
const timestamp = new Date().toISOString();
|
|
222
|
+
const results = [];
|
|
223
|
+
const issues = [];
|
|
224
|
+
const recommendations = [];
|
|
225
|
+
// 1. Load environment
|
|
226
|
+
const envResult = loadEnvironment(cwd);
|
|
227
|
+
results.push({
|
|
228
|
+
service: 'Environment',
|
|
229
|
+
status: envResult.loaded ? 'ok' : 'warn',
|
|
230
|
+
message: envResult.loaded ? `Loaded from ${envResult.path}` : 'Using process.env only',
|
|
231
|
+
});
|
|
232
|
+
// 2. Check required env vars
|
|
233
|
+
const requiredVars = ['TURSO_DATABASE_URL', 'TURSO_AUTH_TOKEN'];
|
|
234
|
+
const optionalVars = ['UPSTASH_REDIS_REST_URL', 'UPSTASH_REDIS_REST_TOKEN', 'UPSTASH_VECTOR_REST_URL', 'UPSTASH_VECTOR_REST_TOKEN'];
|
|
235
|
+
for (const varName of requiredVars) {
|
|
236
|
+
results.push(verifyEnvVariable(varName, true));
|
|
237
|
+
}
|
|
238
|
+
for (const varName of optionalVars) {
|
|
239
|
+
results.push(verifyEnvVariable(varName, false));
|
|
240
|
+
}
|
|
241
|
+
// 3. Check cloud services
|
|
242
|
+
const [tursoResult, redisResult, vectorResult] = await Promise.all([
|
|
243
|
+
verifyTurso(),
|
|
244
|
+
verifyRedis(),
|
|
245
|
+
verifyVector(),
|
|
246
|
+
]);
|
|
247
|
+
results.push(tursoResult, redisResult, vectorResult);
|
|
248
|
+
// 4. Check project configuration
|
|
249
|
+
results.push(verifyProjectConfig(cwd));
|
|
250
|
+
results.push(verifyHooksDirectory(cwd));
|
|
251
|
+
// Analyze results
|
|
252
|
+
const errors = results.filter(r => r.status === 'error');
|
|
253
|
+
const warnings = results.filter(r => r.status === 'warn');
|
|
254
|
+
for (const err of errors) {
|
|
255
|
+
issues.push(`${err.service}: ${err.message}${err.details ? ` (${err.details})` : ''}`);
|
|
256
|
+
}
|
|
257
|
+
// Generate recommendations
|
|
258
|
+
if (errors.some(e => e.service.includes('TURSO'))) {
|
|
259
|
+
recommendations.push('Set TURSO_DATABASE_URL and TURSO_AUTH_TOKEN in your .env file');
|
|
260
|
+
}
|
|
261
|
+
if (errors.some(e => e.service === 'Turso')) {
|
|
262
|
+
recommendations.push('Check Turso credentials at https://turso.tech/app');
|
|
263
|
+
}
|
|
264
|
+
if (errors.some(e => e.service === 'Redis')) {
|
|
265
|
+
recommendations.push('Check Upstash Redis credentials at https://console.upstash.com');
|
|
266
|
+
}
|
|
267
|
+
if (warnings.some(w => w.service === 'Project Config')) {
|
|
268
|
+
recommendations.push('Run: npx cmp-standards init --system YOUR_SYSTEM');
|
|
269
|
+
}
|
|
270
|
+
// Determine overall status
|
|
271
|
+
let overallStatus = 'healthy';
|
|
272
|
+
if (warnings.length > 0)
|
|
273
|
+
overallStatus = 'degraded';
|
|
274
|
+
if (errors.length > 0)
|
|
275
|
+
overallStatus = 'critical';
|
|
276
|
+
return {
|
|
277
|
+
timestamp,
|
|
278
|
+
cwd,
|
|
279
|
+
results,
|
|
280
|
+
overallStatus,
|
|
281
|
+
issues,
|
|
282
|
+
recommendations,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
// =============================================================================
|
|
286
|
+
// Output Formatting
|
|
287
|
+
// =============================================================================
|
|
288
|
+
function formatReport(report) {
|
|
289
|
+
const lines = [];
|
|
290
|
+
// Header
|
|
291
|
+
const statusIcon = {
|
|
292
|
+
healthy: '\u2705', // green check
|
|
293
|
+
degraded: '\u26A0\uFE0F', // warning
|
|
294
|
+
critical: '\u274C', // red X
|
|
295
|
+
}[report.overallStatus];
|
|
296
|
+
lines.push('');
|
|
297
|
+
lines.push(`${statusIcon} CMP Standards Startup Verification`);
|
|
298
|
+
lines.push(`${'='.repeat(50)}`);
|
|
299
|
+
lines.push(`Status: ${report.overallStatus.toUpperCase()}`);
|
|
300
|
+
lines.push(`Time: ${report.timestamp}`);
|
|
301
|
+
lines.push(`Directory: ${report.cwd}`);
|
|
302
|
+
lines.push('');
|
|
303
|
+
// Service Status
|
|
304
|
+
lines.push('Service Status:');
|
|
305
|
+
lines.push('-'.repeat(30));
|
|
306
|
+
for (const result of report.results) {
|
|
307
|
+
const icon = result.status === 'ok' ? '\u2705' : result.status === 'warn' ? '\u26A0\uFE0F' : '\u274C';
|
|
308
|
+
lines.push(`${icon} ${result.service}: ${result.message}`);
|
|
309
|
+
if (result.details && result.status !== 'ok') {
|
|
310
|
+
lines.push(` \u2514\u2500 ${result.details}`);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Issues
|
|
314
|
+
if (report.issues.length > 0) {
|
|
315
|
+
lines.push('');
|
|
316
|
+
lines.push('Issues Found:');
|
|
317
|
+
lines.push('-'.repeat(30));
|
|
318
|
+
for (const issue of report.issues) {
|
|
319
|
+
lines.push(`\u2022 ${issue}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Recommendations
|
|
323
|
+
if (report.recommendations.length > 0) {
|
|
324
|
+
lines.push('');
|
|
325
|
+
lines.push('Recommendations:');
|
|
326
|
+
lines.push('-'.repeat(30));
|
|
327
|
+
for (const rec of report.recommendations) {
|
|
328
|
+
lines.push(`\u27A4 ${rec}`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
lines.push('');
|
|
332
|
+
lines.push(`${'='.repeat(50)}`);
|
|
333
|
+
lines.push('');
|
|
334
|
+
return lines.join('\n');
|
|
335
|
+
}
|
|
336
|
+
// =============================================================================
|
|
337
|
+
// CLI Entry Point
|
|
338
|
+
// =============================================================================
|
|
339
|
+
async function main() {
|
|
340
|
+
const cwd = process.cwd();
|
|
341
|
+
try {
|
|
342
|
+
const report = await verifyStartup(cwd);
|
|
343
|
+
console.log(formatReport(report));
|
|
344
|
+
// Exit with error code if critical
|
|
345
|
+
if (report.overallStatus === 'critical') {
|
|
346
|
+
process.exit(1);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
console.error('Startup verification failed:', error);
|
|
351
|
+
process.exit(1);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// Run if executed directly
|
|
355
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
356
|
+
if (process.argv[1] === __filename || process.argv[1]?.includes('startup-verify')) {
|
|
357
|
+
main();
|
|
358
|
+
}
|
|
359
|
+
export default verifyStartup;
|
|
360
|
+
//# sourceMappingURL=startup-verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup-verify.js","sourceRoot":"","sources":["../../src/hooks/startup-verify.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/schemas.d.ts
CHANGED
|
@@ -139,12 +139,12 @@ export declare const FeedbackSubmitSchema: z.ZodObject<{
|
|
|
139
139
|
helpful: z.ZodBoolean;
|
|
140
140
|
comment: z.ZodOptional<z.ZodString>;
|
|
141
141
|
}, "strip", z.ZodTypeAny, {
|
|
142
|
-
memoryId: string;
|
|
143
142
|
helpful: boolean;
|
|
143
|
+
memoryId: string;
|
|
144
144
|
comment?: string | undefined;
|
|
145
145
|
}, {
|
|
146
|
-
memoryId: string;
|
|
147
146
|
helpful: boolean;
|
|
147
|
+
memoryId: string;
|
|
148
148
|
comment?: string | undefined;
|
|
149
149
|
}>;
|
|
150
150
|
export declare const TaskStartSchema: z.ZodObject<{
|
|
@@ -23,6 +23,19 @@ export interface DebouncerStats {
|
|
|
23
23
|
skipRate: number;
|
|
24
24
|
activeEntries: number;
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Tool-specific debounce windows
|
|
28
|
+
* Different tools have different optimal debounce times
|
|
29
|
+
*/
|
|
30
|
+
export declare const TOOL_DEBOUNCE_CONFIG: Record<string, number>;
|
|
31
|
+
/**
|
|
32
|
+
* Get debounce window for a specific tool
|
|
33
|
+
*/
|
|
34
|
+
export declare function getToolDebounceMs(toolName: string): number;
|
|
35
|
+
/**
|
|
36
|
+
* Check if a tool should never be debounced (write operations)
|
|
37
|
+
*/
|
|
38
|
+
export declare function isWriteOperation(toolName: string): boolean;
|
|
26
39
|
export declare class Debouncer {
|
|
27
40
|
private config;
|
|
28
41
|
private entries;
|
|
@@ -84,8 +97,52 @@ export declare class HookDebouncer extends Debouncer {
|
|
|
84
97
|
constructor(config?: Partial<DebouncerConfig>);
|
|
85
98
|
shouldSkipHook(hookName: string, context: Record<string, unknown>): boolean;
|
|
86
99
|
}
|
|
100
|
+
/**
|
|
101
|
+
* Smart Debouncer with tool-specific windows
|
|
102
|
+
* Uses different debounce times based on tool type
|
|
103
|
+
*/
|
|
104
|
+
export declare class SmartDebouncer {
|
|
105
|
+
private entries;
|
|
106
|
+
private maxEntries;
|
|
107
|
+
private debug;
|
|
108
|
+
private stats;
|
|
109
|
+
constructor(options?: {
|
|
110
|
+
maxEntries?: number;
|
|
111
|
+
debug?: boolean;
|
|
112
|
+
});
|
|
113
|
+
/**
|
|
114
|
+
* Check if operation should be skipped based on tool-specific window
|
|
115
|
+
*/
|
|
116
|
+
shouldSkip(toolName: string, params: Record<string, unknown>): boolean;
|
|
117
|
+
private trackCall;
|
|
118
|
+
/**
|
|
119
|
+
* Cleanup old entries (uses longest debounce window)
|
|
120
|
+
*/
|
|
121
|
+
cleanup(): number;
|
|
122
|
+
/**
|
|
123
|
+
* Get statistics including per-tool breakdown
|
|
124
|
+
*/
|
|
125
|
+
getStats(): {
|
|
126
|
+
totalCalls: number;
|
|
127
|
+
skipped: number;
|
|
128
|
+
skipRate: number;
|
|
129
|
+
byTool: Record<string, {
|
|
130
|
+
total: number;
|
|
131
|
+
skipped: number;
|
|
132
|
+
skipRate: number;
|
|
133
|
+
}>;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Reset all state
|
|
137
|
+
*/
|
|
138
|
+
reset(): void;
|
|
139
|
+
}
|
|
87
140
|
export declare function getDebouncer(config?: Partial<DebouncerConfig>): Debouncer;
|
|
88
141
|
export declare function getEmbeddingDebouncer(config?: Partial<DebouncerConfig>): EmbeddingDebouncer;
|
|
89
142
|
export declare function getHookDebouncer(config?: Partial<DebouncerConfig>): HookDebouncer;
|
|
143
|
+
export declare function getSmartDebouncer(options?: {
|
|
144
|
+
maxEntries?: number;
|
|
145
|
+
debug?: boolean;
|
|
146
|
+
}): SmartDebouncer;
|
|
90
147
|
export declare function resetDebouncers(): void;
|
|
91
148
|
//# sourceMappingURL=Debouncer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Debouncer.d.ts","sourceRoot":"","sources":["../../src/performance/Debouncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAA;IAChB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,2BAA2B;IAC3B,KAAK,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB;AAiBD,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,KAAK,CAGZ;gBAEW,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAIjD;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IA4BhC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IAMpE;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAK/E;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAM1C;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,OAAO,IAAI,MAAM;IAkBjB;;OAEG;IACH,QAAQ,IAAI,cAAc;IAY1B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,SAAS,IAAI,eAAe;IAI5B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;CAGlD;AAMD;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAQjD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAIxC;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAQjD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;CAI5E;
|
|
1
|
+
{"version":3,"file":"Debouncer.d.ts","sourceRoot":"","sources":["../../src/performance/Debouncer.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,45 @@ const DEFAULT_CONFIG = {
|
|
|
15
15
|
debug: false,
|
|
16
16
|
};
|
|
17
17
|
// =============================================================================
|
|
18
|
+
// Smart Debouncing by Tool Type
|
|
19
|
+
// =============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Tool-specific debounce windows
|
|
22
|
+
* Different tools have different optimal debounce times
|
|
23
|
+
*/
|
|
24
|
+
export const TOOL_DEBOUNCE_CONFIG = {
|
|
25
|
+
// Read operations - frequent, short debounce
|
|
26
|
+
'Read': 1000,
|
|
27
|
+
'Glob': 2000,
|
|
28
|
+
'Grep': 2000,
|
|
29
|
+
'LSP': 1000,
|
|
30
|
+
// Write operations - no debounce (always execute)
|
|
31
|
+
'Write': 0,
|
|
32
|
+
'Edit': 0,
|
|
33
|
+
'NotebookEdit': 0,
|
|
34
|
+
// External operations - longer debounce
|
|
35
|
+
'WebSearch': 5000,
|
|
36
|
+
'WebFetch': 5000,
|
|
37
|
+
'Bash': 3000,
|
|
38
|
+
// Task/Agent operations - medium debounce
|
|
39
|
+
'Task': 3000,
|
|
40
|
+
'Skill': 2000,
|
|
41
|
+
// Default for unknown tools
|
|
42
|
+
'default': 3000
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Get debounce window for a specific tool
|
|
46
|
+
*/
|
|
47
|
+
export function getToolDebounceMs(toolName) {
|
|
48
|
+
return TOOL_DEBOUNCE_CONFIG[toolName] ?? TOOL_DEBOUNCE_CONFIG['default'];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if a tool should never be debounced (write operations)
|
|
52
|
+
*/
|
|
53
|
+
export function isWriteOperation(toolName) {
|
|
54
|
+
return ['Write', 'Edit', 'NotebookEdit'].includes(toolName);
|
|
55
|
+
}
|
|
56
|
+
// =============================================================================
|
|
18
57
|
// Debouncer Implementation
|
|
19
58
|
// =============================================================================
|
|
20
59
|
export class Debouncer {
|
|
@@ -166,12 +205,115 @@ export class HookDebouncer extends Debouncer {
|
|
|
166
205
|
return this.shouldSkip(`hook:${key}`);
|
|
167
206
|
}
|
|
168
207
|
}
|
|
208
|
+
/**
|
|
209
|
+
* Smart Debouncer with tool-specific windows
|
|
210
|
+
* Uses different debounce times based on tool type
|
|
211
|
+
*/
|
|
212
|
+
export class SmartDebouncer {
|
|
213
|
+
entries = new Map();
|
|
214
|
+
maxEntries;
|
|
215
|
+
debug;
|
|
216
|
+
stats = {
|
|
217
|
+
totalCalls: 0,
|
|
218
|
+
skipped: 0,
|
|
219
|
+
byTool: new Map()
|
|
220
|
+
};
|
|
221
|
+
constructor(options = {}) {
|
|
222
|
+
this.maxEntries = options.maxEntries ?? 500;
|
|
223
|
+
this.debug = options.debug ?? false;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Check if operation should be skipped based on tool-specific window
|
|
227
|
+
*/
|
|
228
|
+
shouldSkip(toolName, params) {
|
|
229
|
+
const debounceMs = getToolDebounceMs(toolName);
|
|
230
|
+
// Write operations are never debounced
|
|
231
|
+
if (debounceMs === 0) {
|
|
232
|
+
this.trackCall(toolName, false);
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
this.stats.totalCalls++;
|
|
236
|
+
const now = Date.now();
|
|
237
|
+
const paramsStr = JSON.stringify(params, Object.keys(params).sort());
|
|
238
|
+
const key = createHash('md5').update(`${toolName}:${paramsStr}`).digest('hex');
|
|
239
|
+
const entry = this.entries.get(key);
|
|
240
|
+
if (entry && now - entry.lastCall < debounceMs) {
|
|
241
|
+
this.stats.skipped++;
|
|
242
|
+
entry.callCount++;
|
|
243
|
+
this.trackCall(toolName, true);
|
|
244
|
+
if (this.debug) {
|
|
245
|
+
console.log(`[SmartDebouncer] Skipping ${toolName} (window: ${debounceMs}ms, called ${entry.callCount}x)`);
|
|
246
|
+
}
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
// Update or create entry
|
|
250
|
+
this.entries.set(key, { lastCall: now, callCount: 1 });
|
|
251
|
+
// Cleanup if needed
|
|
252
|
+
if (this.entries.size > this.maxEntries) {
|
|
253
|
+
this.cleanup();
|
|
254
|
+
}
|
|
255
|
+
this.trackCall(toolName, false);
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
trackCall(toolName, skipped) {
|
|
259
|
+
const existing = this.stats.byTool.get(toolName) ?? { total: 0, skipped: 0 };
|
|
260
|
+
existing.total++;
|
|
261
|
+
if (skipped)
|
|
262
|
+
existing.skipped++;
|
|
263
|
+
this.stats.byTool.set(toolName, existing);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Cleanup old entries (uses longest debounce window)
|
|
267
|
+
*/
|
|
268
|
+
cleanup() {
|
|
269
|
+
const now = Date.now();
|
|
270
|
+
const maxWindow = Math.max(...Object.values(TOOL_DEBOUNCE_CONFIG));
|
|
271
|
+
let removed = 0;
|
|
272
|
+
for (const [key, entry] of this.entries) {
|
|
273
|
+
if (now - entry.lastCall > maxWindow) {
|
|
274
|
+
this.entries.delete(key);
|
|
275
|
+
removed++;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return removed;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get statistics including per-tool breakdown
|
|
282
|
+
*/
|
|
283
|
+
getStats() {
|
|
284
|
+
const byTool = {};
|
|
285
|
+
for (const [tool, stats] of this.stats.byTool) {
|
|
286
|
+
byTool[tool] = {
|
|
287
|
+
...stats,
|
|
288
|
+
skipRate: stats.total > 0 ? stats.skipped / stats.total : 0
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
totalCalls: this.stats.totalCalls,
|
|
293
|
+
skipped: this.stats.skipped,
|
|
294
|
+
skipRate: this.stats.totalCalls > 0 ? this.stats.skipped / this.stats.totalCalls : 0,
|
|
295
|
+
byTool
|
|
296
|
+
};
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Reset all state
|
|
300
|
+
*/
|
|
301
|
+
reset() {
|
|
302
|
+
this.entries.clear();
|
|
303
|
+
this.stats = {
|
|
304
|
+
totalCalls: 0,
|
|
305
|
+
skipped: 0,
|
|
306
|
+
byTool: new Map()
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
}
|
|
169
310
|
// =============================================================================
|
|
170
311
|
// Singleton Instances
|
|
171
312
|
// =============================================================================
|
|
172
313
|
let globalDebouncer = null;
|
|
173
314
|
let globalEmbeddingDebouncer = null;
|
|
174
315
|
let globalHookDebouncer = null;
|
|
316
|
+
let globalSmartDebouncer = null;
|
|
175
317
|
export function getDebouncer(config) {
|
|
176
318
|
if (!globalDebouncer) {
|
|
177
319
|
globalDebouncer = new Debouncer(config);
|
|
@@ -190,9 +332,16 @@ export function getHookDebouncer(config) {
|
|
|
190
332
|
}
|
|
191
333
|
return globalHookDebouncer;
|
|
192
334
|
}
|
|
335
|
+
export function getSmartDebouncer(options) {
|
|
336
|
+
if (!globalSmartDebouncer) {
|
|
337
|
+
globalSmartDebouncer = new SmartDebouncer(options);
|
|
338
|
+
}
|
|
339
|
+
return globalSmartDebouncer;
|
|
340
|
+
}
|
|
193
341
|
export function resetDebouncers() {
|
|
194
342
|
globalDebouncer = null;
|
|
195
343
|
globalEmbeddingDebouncer = null;
|
|
196
344
|
globalHookDebouncer = null;
|
|
345
|
+
globalSmartDebouncer = null;
|
|
197
346
|
}
|
|
198
347
|
//# sourceMappingURL=Debouncer.js.map
|