stylemcp 0.1.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.
Files changed (83) hide show
  1. package/README.md +261 -0
  2. package/action/action.yml +59 -0
  3. package/action/package.json +24 -0
  4. package/action/src/index.ts +455 -0
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +335 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/index.d.ts +5 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +10 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/rewriter/index.d.ts +45 -0
  14. package/dist/rewriter/index.d.ts.map +1 -0
  15. package/dist/rewriter/index.js +163 -0
  16. package/dist/rewriter/index.js.map +1 -0
  17. package/dist/schema/copy-patterns.d.ts +298 -0
  18. package/dist/schema/copy-patterns.d.ts.map +1 -0
  19. package/dist/schema/copy-patterns.js +53 -0
  20. package/dist/schema/copy-patterns.js.map +1 -0
  21. package/dist/schema/cta-rules.d.ts +274 -0
  22. package/dist/schema/cta-rules.d.ts.map +1 -0
  23. package/dist/schema/cta-rules.js +45 -0
  24. package/dist/schema/cta-rules.js.map +1 -0
  25. package/dist/schema/index.d.ts +2172 -0
  26. package/dist/schema/index.d.ts.map +1 -0
  27. package/dist/schema/index.js +92 -0
  28. package/dist/schema/index.js.map +1 -0
  29. package/dist/schema/tests.d.ts +274 -0
  30. package/dist/schema/tests.d.ts.map +1 -0
  31. package/dist/schema/tests.js +37 -0
  32. package/dist/schema/tests.js.map +1 -0
  33. package/dist/schema/tokens.d.ts +632 -0
  34. package/dist/schema/tokens.d.ts.map +1 -0
  35. package/dist/schema/tokens.js +68 -0
  36. package/dist/schema/tokens.js.map +1 -0
  37. package/dist/schema/voice.d.ts +280 -0
  38. package/dist/schema/voice.d.ts.map +1 -0
  39. package/dist/schema/voice.js +52 -0
  40. package/dist/schema/voice.js.map +1 -0
  41. package/dist/server/billing.d.ts +53 -0
  42. package/dist/server/billing.d.ts.map +1 -0
  43. package/dist/server/billing.js +216 -0
  44. package/dist/server/billing.js.map +1 -0
  45. package/dist/server/http.d.ts +5 -0
  46. package/dist/server/http.d.ts.map +1 -0
  47. package/dist/server/http.js +470 -0
  48. package/dist/server/http.js.map +1 -0
  49. package/dist/server/index.d.ts +3 -0
  50. package/dist/server/index.d.ts.map +1 -0
  51. package/dist/server/index.js +480 -0
  52. package/dist/server/index.js.map +1 -0
  53. package/dist/server/middleware/auth.d.ts +15 -0
  54. package/dist/server/middleware/auth.d.ts.map +1 -0
  55. package/dist/server/middleware/auth.js +83 -0
  56. package/dist/server/middleware/auth.js.map +1 -0
  57. package/dist/utils/pack-loader.d.ts +13 -0
  58. package/dist/utils/pack-loader.d.ts.map +1 -0
  59. package/dist/utils/pack-loader.js +98 -0
  60. package/dist/utils/pack-loader.js.map +1 -0
  61. package/dist/validator/index.d.ts +21 -0
  62. package/dist/validator/index.d.ts.map +1 -0
  63. package/dist/validator/index.js +60 -0
  64. package/dist/validator/index.js.map +1 -0
  65. package/dist/validator/rules/constraints.d.ts +8 -0
  66. package/dist/validator/rules/constraints.d.ts.map +1 -0
  67. package/dist/validator/rules/constraints.js +150 -0
  68. package/dist/validator/rules/constraints.js.map +1 -0
  69. package/dist/validator/rules/cta.d.ts +11 -0
  70. package/dist/validator/rules/cta.d.ts.map +1 -0
  71. package/dist/validator/rules/cta.js +113 -0
  72. package/dist/validator/rules/cta.js.map +1 -0
  73. package/dist/validator/rules/voice.d.ts +6 -0
  74. package/dist/validator/rules/voice.d.ts.map +1 -0
  75. package/dist/validator/rules/voice.js +106 -0
  76. package/dist/validator/rules/voice.js.map +1 -0
  77. package/package.json +61 -0
  78. package/packs/saas/copy_patterns.yaml +423 -0
  79. package/packs/saas/cta_rules.yaml +362 -0
  80. package/packs/saas/manifest.yaml +16 -0
  81. package/packs/saas/tests.yaml +305 -0
  82. package/packs/saas/tokens.json +226 -0
  83. package/packs/saas/voice.yaml +232 -0
@@ -0,0 +1,480 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { loadPack, getPacksDirectory, listAvailablePacks } from '../utils/pack-loader.js';
6
+ import { validate } from '../validator/index.js';
7
+ import { rewrite, rewriteMinimal, rewriteAggressive, formatChanges } from '../rewriter/index.js';
8
+ import { join } from 'path';
9
+ // Server state
10
+ let currentPack = null;
11
+ let currentPackName = 'saas';
12
+ /**
13
+ * Load a pack by name
14
+ */
15
+ async function ensurePack(packName) {
16
+ const targetPack = packName || currentPackName;
17
+ if (currentPack && currentPackName === targetPack) {
18
+ return currentPack;
19
+ }
20
+ const packPath = join(getPacksDirectory(), targetPack);
21
+ const result = await loadPack({ packPath });
22
+ if (result.errors.length > 0) {
23
+ console.error('Pack loading warnings:', result.errors);
24
+ }
25
+ currentPack = result.pack;
26
+ currentPackName = targetPack;
27
+ return currentPack;
28
+ }
29
+ /**
30
+ * Create and configure the MCP server
31
+ */
32
+ function createServer() {
33
+ const server = new Server({
34
+ name: 'stylemcp',
35
+ version: '0.1.0',
36
+ }, {
37
+ capabilities: {
38
+ tools: {},
39
+ resources: {},
40
+ },
41
+ });
42
+ // List available tools
43
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
44
+ return {
45
+ tools: [
46
+ {
47
+ name: 'validate_text',
48
+ description: 'Validate text against brand/voice rules. Returns a compliance score (0-100), list of violations, and suggestions for fixes.',
49
+ inputSchema: {
50
+ type: 'object',
51
+ properties: {
52
+ text: {
53
+ type: 'string',
54
+ description: 'The text to validate',
55
+ },
56
+ pack: {
57
+ type: 'string',
58
+ description: 'Style pack to use (default: saas)',
59
+ },
60
+ context_type: {
61
+ type: 'string',
62
+ enum: ['ui-copy', 'marketing', 'docs', 'support', 'general'],
63
+ description: 'Type of content being validated',
64
+ },
65
+ },
66
+ required: ['text'],
67
+ },
68
+ },
69
+ {
70
+ name: 'rewrite_to_style',
71
+ description: 'Rewrite text to conform to brand/voice rules. Makes minimal changes to fix violations.',
72
+ inputSchema: {
73
+ type: 'object',
74
+ properties: {
75
+ text: {
76
+ type: 'string',
77
+ description: 'The text to rewrite',
78
+ },
79
+ pack: {
80
+ type: 'string',
81
+ description: 'Style pack to use (default: saas)',
82
+ },
83
+ mode: {
84
+ type: 'string',
85
+ enum: ['minimal', 'normal', 'aggressive'],
86
+ description: 'How aggressively to rewrite (minimal=errors only, normal=errors+warnings, aggressive=all)',
87
+ },
88
+ context_type: {
89
+ type: 'string',
90
+ enum: ['ui-copy', 'marketing', 'docs', 'support', 'general'],
91
+ description: 'Type of content being rewritten',
92
+ },
93
+ },
94
+ required: ['text'],
95
+ },
96
+ },
97
+ {
98
+ name: 'get_voice_rules',
99
+ description: 'Get the voice/tone rules including vocabulary preferences, forbidden phrases, and writing examples.',
100
+ inputSchema: {
101
+ type: 'object',
102
+ properties: {
103
+ pack: {
104
+ type: 'string',
105
+ description: 'Style pack to use (default: saas)',
106
+ },
107
+ section: {
108
+ type: 'string',
109
+ enum: ['all', 'tone', 'vocabulary', 'doNot', 'examples', 'constraints'],
110
+ description: 'Which section of voice rules to return',
111
+ },
112
+ },
113
+ },
114
+ },
115
+ {
116
+ name: 'get_copy_patterns',
117
+ description: 'Get reusable copy patterns for UI situations (errors, empty states, success messages, etc.).',
118
+ inputSchema: {
119
+ type: 'object',
120
+ properties: {
121
+ pack: {
122
+ type: 'string',
123
+ description: 'Style pack to use (default: saas)',
124
+ },
125
+ category: {
126
+ type: 'string',
127
+ enum: ['error', 'empty-state', 'success', 'loading', 'confirmation', 'onboarding', 'tooltip', 'notification', 'feature-gate', 'all'],
128
+ description: 'Filter by pattern category',
129
+ },
130
+ },
131
+ },
132
+ },
133
+ {
134
+ name: 'get_cta_rules',
135
+ description: 'Get CTA (call-to-action) guidelines and approved CTAs by context.',
136
+ inputSchema: {
137
+ type: 'object',
138
+ properties: {
139
+ pack: {
140
+ type: 'string',
141
+ description: 'Style pack to use (default: saas)',
142
+ },
143
+ category: {
144
+ type: 'string',
145
+ description: 'Filter by CTA category (e.g., "Primary Actions", "Destructive Actions")',
146
+ },
147
+ },
148
+ },
149
+ },
150
+ {
151
+ name: 'get_tokens',
152
+ description: 'Get design tokens (colors, typography, spacing, etc.).',
153
+ inputSchema: {
154
+ type: 'object',
155
+ properties: {
156
+ pack: {
157
+ type: 'string',
158
+ description: 'Style pack to use (default: saas)',
159
+ },
160
+ type: {
161
+ type: 'string',
162
+ enum: ['all', 'colors', 'typography', 'spacing', 'shadows', 'borderRadius'],
163
+ description: 'Type of tokens to return',
164
+ },
165
+ },
166
+ },
167
+ },
168
+ {
169
+ name: 'suggest_ctas',
170
+ description: 'Suggest appropriate CTAs for a given context or situation.',
171
+ inputSchema: {
172
+ type: 'object',
173
+ properties: {
174
+ context: {
175
+ type: 'string',
176
+ description: 'The context/situation needing a CTA (e.g., "form submission", "delete confirmation")',
177
+ },
178
+ pack: {
179
+ type: 'string',
180
+ description: 'Style pack to use (default: saas)',
181
+ },
182
+ },
183
+ required: ['context'],
184
+ },
185
+ },
186
+ {
187
+ name: 'list_packs',
188
+ description: 'List all available style packs.',
189
+ inputSchema: {
190
+ type: 'object',
191
+ properties: {},
192
+ },
193
+ },
194
+ ],
195
+ };
196
+ });
197
+ // Handle tool calls
198
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
199
+ const { name, arguments: args } = request.params;
200
+ try {
201
+ switch (name) {
202
+ case 'validate_text': {
203
+ const pack = await ensurePack(args?.pack);
204
+ const result = validate({
205
+ pack,
206
+ text: args?.text,
207
+ context: args?.context_type ? { type: args.context_type } : undefined,
208
+ });
209
+ return {
210
+ content: [
211
+ {
212
+ type: 'text',
213
+ text: JSON.stringify(result, null, 2),
214
+ },
215
+ ],
216
+ };
217
+ }
218
+ case 'rewrite_to_style': {
219
+ const pack = await ensurePack(args?.pack);
220
+ const mode = args?.mode || 'normal';
221
+ let result;
222
+ const options = {
223
+ pack,
224
+ text: args?.text,
225
+ context: args?.context_type ? { type: args.context_type } : undefined,
226
+ };
227
+ if (mode === 'minimal') {
228
+ result = rewriteMinimal(options);
229
+ }
230
+ else if (mode === 'aggressive') {
231
+ result = rewriteAggressive(options);
232
+ }
233
+ else {
234
+ result = rewrite(options);
235
+ }
236
+ return {
237
+ content: [
238
+ {
239
+ type: 'text',
240
+ text: JSON.stringify({
241
+ ...result,
242
+ summary: formatChanges(result),
243
+ }, null, 2),
244
+ },
245
+ ],
246
+ };
247
+ }
248
+ case 'get_voice_rules': {
249
+ const pack = await ensurePack(args?.pack);
250
+ const section = args?.section || 'all';
251
+ let data;
252
+ if (section === 'all') {
253
+ data = pack.voice;
254
+ }
255
+ else {
256
+ data = pack.voice[section];
257
+ }
258
+ return {
259
+ content: [
260
+ {
261
+ type: 'text',
262
+ text: JSON.stringify(data, null, 2),
263
+ },
264
+ ],
265
+ };
266
+ }
267
+ case 'get_copy_patterns': {
268
+ const pack = await ensurePack(args?.pack);
269
+ const category = args?.category;
270
+ let patterns = pack.copyPatterns.patterns;
271
+ if (category && category !== 'all') {
272
+ patterns = patterns.filter(p => p.category === category);
273
+ }
274
+ return {
275
+ content: [
276
+ {
277
+ type: 'text',
278
+ text: JSON.stringify(patterns, null, 2),
279
+ },
280
+ ],
281
+ };
282
+ }
283
+ case 'get_cta_rules': {
284
+ const pack = await ensurePack(args?.pack);
285
+ const category = args?.category;
286
+ let data = {
287
+ guidelines: pack.ctaRules.guidelines,
288
+ categories: pack.ctaRules.categories,
289
+ antiPatterns: pack.ctaRules.antiPatterns,
290
+ };
291
+ if (category) {
292
+ data.categories = pack.ctaRules.categories.filter(c => c.name.toLowerCase().includes(category.toLowerCase()));
293
+ }
294
+ return {
295
+ content: [
296
+ {
297
+ type: 'text',
298
+ text: JSON.stringify(data, null, 2),
299
+ },
300
+ ],
301
+ };
302
+ }
303
+ case 'get_tokens': {
304
+ const pack = await ensurePack(args?.pack);
305
+ const type = args?.type || 'all';
306
+ let data;
307
+ if (type === 'all') {
308
+ data = pack.tokens;
309
+ }
310
+ else {
311
+ data = pack.tokens[type];
312
+ }
313
+ return {
314
+ content: [
315
+ {
316
+ type: 'text',
317
+ text: JSON.stringify(data, null, 2),
318
+ },
319
+ ],
320
+ };
321
+ }
322
+ case 'suggest_ctas': {
323
+ const pack = await ensurePack(args?.pack);
324
+ const context = (args?.context).toLowerCase();
325
+ // Find relevant CTAs based on context
326
+ const suggestions = [];
327
+ for (const category of pack.ctaRules.categories) {
328
+ for (const cta of category.ctas) {
329
+ const matchesContext = cta.context.some(c => c.toLowerCase().includes(context) || context.includes(c.toLowerCase()));
330
+ if (matchesContext) {
331
+ suggestions.push({
332
+ text: cta.text,
333
+ category: category.name,
334
+ priority: cta.priority,
335
+ contexts: cta.context,
336
+ });
337
+ }
338
+ }
339
+ }
340
+ // Also check contextual rules for preferred CTAs
341
+ for (const rule of pack.ctaRules.contextualRules) {
342
+ if (rule.context.toLowerCase().includes(context)) {
343
+ suggestions.push({
344
+ type: 'contextual_recommendation',
345
+ context: rule.context,
346
+ preferred: rule.preferred,
347
+ avoid: rule.forbidden,
348
+ });
349
+ }
350
+ }
351
+ return {
352
+ content: [
353
+ {
354
+ type: 'text',
355
+ text: JSON.stringify({
356
+ context: args?.context,
357
+ suggestions: suggestions.slice(0, 10),
358
+ guidelines: pack.ctaRules.guidelines,
359
+ }, null, 2),
360
+ },
361
+ ],
362
+ };
363
+ }
364
+ case 'list_packs': {
365
+ const packs = await listAvailablePacks();
366
+ return {
367
+ content: [
368
+ {
369
+ type: 'text',
370
+ text: JSON.stringify({ available_packs: packs }, null, 2),
371
+ },
372
+ ],
373
+ };
374
+ }
375
+ default:
376
+ throw new Error(`Unknown tool: ${name}`);
377
+ }
378
+ }
379
+ catch (error) {
380
+ return {
381
+ content: [
382
+ {
383
+ type: 'text',
384
+ text: JSON.stringify({
385
+ error: error instanceof Error ? error.message : 'Unknown error',
386
+ }),
387
+ },
388
+ ],
389
+ isError: true,
390
+ };
391
+ }
392
+ });
393
+ // List resources (pack files)
394
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
395
+ const packs = await listAvailablePacks();
396
+ const resources = [];
397
+ for (const packName of packs) {
398
+ resources.push({
399
+ uri: `stylemcp://pack/${packName}/manifest`,
400
+ name: `${packName} manifest`,
401
+ mimeType: 'application/json',
402
+ });
403
+ resources.push({
404
+ uri: `stylemcp://pack/${packName}/voice`,
405
+ name: `${packName} voice rules`,
406
+ mimeType: 'application/json',
407
+ });
408
+ resources.push({
409
+ uri: `stylemcp://pack/${packName}/copy-patterns`,
410
+ name: `${packName} copy patterns`,
411
+ mimeType: 'application/json',
412
+ });
413
+ resources.push({
414
+ uri: `stylemcp://pack/${packName}/cta-rules`,
415
+ name: `${packName} CTA rules`,
416
+ mimeType: 'application/json',
417
+ });
418
+ resources.push({
419
+ uri: `stylemcp://pack/${packName}/tokens`,
420
+ name: `${packName} design tokens`,
421
+ mimeType: 'application/json',
422
+ });
423
+ }
424
+ return { resources };
425
+ });
426
+ // Read resources
427
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
428
+ const uri = request.params.uri;
429
+ const match = uri.match(/^stylemcp:\/\/pack\/([^/]+)\/(.+)$/);
430
+ if (!match) {
431
+ throw new Error(`Invalid resource URI: ${uri}`);
432
+ }
433
+ const [, packName, resource] = match;
434
+ const pack = await ensurePack(packName);
435
+ let content;
436
+ switch (resource) {
437
+ case 'manifest':
438
+ content = pack.manifest;
439
+ break;
440
+ case 'voice':
441
+ content = pack.voice;
442
+ break;
443
+ case 'copy-patterns':
444
+ content = pack.copyPatterns;
445
+ break;
446
+ case 'cta-rules':
447
+ content = pack.ctaRules;
448
+ break;
449
+ case 'tokens':
450
+ content = pack.tokens;
451
+ break;
452
+ default:
453
+ throw new Error(`Unknown resource: ${resource}`);
454
+ }
455
+ return {
456
+ contents: [
457
+ {
458
+ uri,
459
+ mimeType: 'application/json',
460
+ text: JSON.stringify(content, null, 2),
461
+ },
462
+ ],
463
+ };
464
+ });
465
+ return server;
466
+ }
467
+ /**
468
+ * Main entry point
469
+ */
470
+ async function main() {
471
+ const server = createServer();
472
+ const transport = new StdioServerTransport();
473
+ await server.connect(transport);
474
+ console.error('StyleMCP server running on stdio');
475
+ }
476
+ main().catch((error) => {
477
+ console.error('Fatal error:', error);
478
+ process.exit(1);
479
+ });
480
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import { UserProfile, UsageStats } from '../billing.js';
3
+ declare global {
4
+ namespace Express {
5
+ interface Request {
6
+ user?: UserProfile;
7
+ usageStats?: UsageStats;
8
+ requestStart?: number;
9
+ }
10
+ }
11
+ }
12
+ export declare function authMiddleware(req: Request, res: Response, next: NextFunction): Promise<void>;
13
+ export declare function usageLogger(req: Request, res: Response, next: NextFunction): void;
14
+ export declare function optionalAuth(req: Request, res: Response, next: NextFunction): Promise<void>;
15
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAA6D,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGnH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,IAAI,CAAC,EAAE,WAAW,CAAC;YACnB,UAAU,CAAC,EAAE,UAAU,CAAC;YACxB,YAAY,CAAC,EAAE,MAAM,CAAC;SACvB;KACF;CACF;AAKD,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DnG;AAGD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAiBjF;AAGD,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBjG"}
@@ -0,0 +1,83 @@
1
+ import { validateApiKey, checkQuota, recordUsage, isBillingEnabled } from '../billing.js';
2
+ const LEGACY_API_KEY = process.env.STYLEMCP_API_KEY || '';
3
+ // Authentication middleware
4
+ export async function authMiddleware(req, res, next) {
5
+ req.requestStart = Date.now();
6
+ // If billing is not enabled, fall back to legacy API key
7
+ if (!isBillingEnabled()) {
8
+ if (LEGACY_API_KEY) {
9
+ const providedKey = req.headers['x-api-key'] || req.query.api_key;
10
+ if (providedKey !== LEGACY_API_KEY) {
11
+ res.status(401).json({ error: 'Invalid or missing API key' });
12
+ return;
13
+ }
14
+ }
15
+ next();
16
+ return;
17
+ }
18
+ // Get API key from header or query
19
+ const apiKey = (req.headers['x-api-key'] || req.query.api_key);
20
+ if (!apiKey) {
21
+ res.status(401).json({
22
+ error: 'API key required',
23
+ docs: 'https://stylemcp.com/docs#authentication'
24
+ });
25
+ return;
26
+ }
27
+ // Validate API key
28
+ const user = await validateApiKey(apiKey);
29
+ if (!user) {
30
+ res.status(401).json({
31
+ error: 'Invalid API key',
32
+ docs: 'https://stylemcp.com/docs#authentication'
33
+ });
34
+ return;
35
+ }
36
+ // Check quota
37
+ const { allowed, stats } = await checkQuota(user.id);
38
+ if (!allowed) {
39
+ res.status(429).json({
40
+ error: 'Monthly request limit exceeded',
41
+ usage: stats,
42
+ upgrade_url: 'https://stylemcp.com/pricing',
43
+ });
44
+ return;
45
+ }
46
+ // Attach user and stats to request
47
+ req.user = user;
48
+ req.usageStats = stats;
49
+ // Add usage headers
50
+ res.setHeader('X-RateLimit-Limit', stats.limit);
51
+ res.setHeader('X-RateLimit-Remaining', stats.remaining - 1);
52
+ res.setHeader('X-RateLimit-Reset', stats.reset_date);
53
+ next();
54
+ }
55
+ // Response logging middleware (call after response is sent)
56
+ export function usageLogger(req, res, next) {
57
+ // Hook into response finish to log usage
58
+ res.on('finish', async () => {
59
+ if (req.user && isBillingEnabled()) {
60
+ const responseTime = req.requestStart ? Date.now() - req.requestStart : 0;
61
+ await recordUsage(req.user.id, req.path, req.method, res.statusCode, responseTime);
62
+ }
63
+ });
64
+ next();
65
+ }
66
+ // Optional auth - doesn't require key but attaches user if provided
67
+ export async function optionalAuth(req, res, next) {
68
+ if (!isBillingEnabled()) {
69
+ next();
70
+ return;
71
+ }
72
+ const apiKey = (req.headers['x-api-key'] || req.query.api_key);
73
+ if (apiKey) {
74
+ const user = await validateApiKey(apiKey);
75
+ if (user) {
76
+ const { stats } = await checkQuota(user.id);
77
+ req.user = user;
78
+ req.usageStats = stats;
79
+ }
80
+ }
81
+ next();
82
+ }
83
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { Pack } from '../schema/index.js';
2
+ export interface LoadPackOptions {
3
+ packPath: string;
4
+ validate?: boolean;
5
+ }
6
+ export interface PackLoadResult {
7
+ pack: Pack;
8
+ errors: string[];
9
+ }
10
+ export declare function loadPack(options: LoadPackOptions): Promise<PackLoadResult>;
11
+ export declare function getPacksDirectory(): string;
12
+ export declare function listAvailablePacks(): Promise<string[]>;
13
+ //# sourceMappingURL=pack-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-loader.d.ts","sourceRoot":"","sources":["../../src/utils/pack-loader.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,IAAI,EAaL,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAcD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAoEhF;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAS5D"}