@nerviq/cli 1.0.0 → 1.2.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 (48) hide show
  1. package/bin/cli.js +170 -73
  2. package/package.json +3 -5
  3. package/src/activity.js +20 -0
  4. package/src/aider/domain-packs.js +27 -2
  5. package/src/aider/mcp-packs.js +231 -0
  6. package/src/aider/techniques.js +3210 -1397
  7. package/src/audit.js +290 -9
  8. package/src/catalog.js +18 -2
  9. package/src/codex/domain-packs.js +23 -1
  10. package/src/codex/mcp-packs.js +254 -0
  11. package/src/codex/techniques.js +4738 -3257
  12. package/src/copilot/domain-packs.js +23 -1
  13. package/src/copilot/mcp-packs.js +254 -0
  14. package/src/copilot/techniques.js +3433 -1936
  15. package/src/cursor/domain-packs.js +23 -1
  16. package/src/cursor/mcp-packs.js +257 -0
  17. package/src/cursor/techniques.js +3697 -1869
  18. package/src/deprecation.js +98 -0
  19. package/src/domain-pack-expansion.js +571 -0
  20. package/src/domain-packs.js +25 -2
  21. package/src/formatters/otel.js +151 -0
  22. package/src/gemini/domain-packs.js +23 -1
  23. package/src/gemini/mcp-packs.js +257 -0
  24. package/src/gemini/techniques.js +3734 -2238
  25. package/src/integrations.js +194 -0
  26. package/src/mcp-packs.js +233 -0
  27. package/src/opencode/domain-packs.js +23 -1
  28. package/src/opencode/mcp-packs.js +231 -0
  29. package/src/opencode/techniques.js +3500 -1687
  30. package/src/org.js +68 -0
  31. package/src/source-urls.js +410 -260
  32. package/src/stack-checks.js +565 -0
  33. package/src/supplemental-checks.js +767 -0
  34. package/src/techniques.js +2929 -1449
  35. package/src/telemetry.js +160 -0
  36. package/src/windsurf/domain-packs.js +23 -1
  37. package/src/windsurf/mcp-packs.js +257 -0
  38. package/src/windsurf/techniques.js +3647 -1834
  39. package/src/workspace.js +233 -0
  40. package/CHANGELOG.md +0 -198
  41. package/content/case-study-template.md +0 -91
  42. package/content/claims-governance.md +0 -37
  43. package/content/claude-code/audit-repo/SKILL.md +0 -20
  44. package/content/claude-native-integration.md +0 -60
  45. package/content/devto-article.json +0 -9
  46. package/content/launch-posts.md +0 -226
  47. package/content/pilot-rollout-kit.md +0 -30
  48. package/content/release-checklist.md +0 -31
@@ -8,7 +8,9 @@
8
8
  * - .cursor/automations/ (event-driven triggers)
9
9
  */
10
10
 
11
- const CURSOR_DOMAIN_PACKS = [
11
+ const { buildAdditionalDomainPacks, detectAdditionalDomainPacks } = require('../domain-pack-expansion');
12
+
13
+ const BASE_CURSOR_DOMAIN_PACKS = [
12
14
  {
13
15
  key: 'baseline-general',
14
16
  label: 'Baseline General',
@@ -171,6 +173,13 @@ const CURSOR_DOMAIN_PACKS = [
171
173
  },
172
174
  ];
173
175
 
176
+ const CURSOR_DOMAIN_PACKS = [
177
+ ...BASE_CURSOR_DOMAIN_PACKS,
178
+ ...buildAdditionalDomainPacks('cursor', {
179
+ existingKeys: new Set(BASE_CURSOR_DOMAIN_PACKS.map((pack) => pack.key)),
180
+ }),
181
+ ];
182
+
174
183
  function uniqueByKey(items) {
175
184
  const seen = new Set();
176
185
  const result = [];
@@ -328,6 +337,19 @@ function detectCursorDomainPacks(ctx, stacks = [], assets = {}) {
328
337
  addMatch('security-focused', ['Detected security-focused repo signals.', ctx.fileContent('SECURITY.md') ? 'SECURITY.md present.' : null]);
329
338
  }
330
339
 
340
+ detectAdditionalDomainPacks({
341
+ ctx,
342
+ pkg,
343
+ deps,
344
+ stackKeys,
345
+ addMatch,
346
+ hasBackend,
347
+ hasFrontend,
348
+ hasInfra,
349
+ hasCi,
350
+ isEnterpriseGoverned,
351
+ });
352
+
331
353
  if (matches.length === 0) {
332
354
  addMatch('baseline-general', [
333
355
  'No stronger platform-specific domain dominated, so a safe general Cursor baseline is the best starting point.',
@@ -385,6 +385,237 @@ const CURSOR_MCP_PACKS = [
385
385
  excludeTools: [],
386
386
  backgroundAgentCompatible: true,
387
387
  },
388
+ // ── 23 new packs ─────────────────────────────────────────────────────────
389
+ {
390
+ key: 'supabase-mcp', label: 'Supabase',
391
+ description: 'Database, auth, and storage access for Supabase projects.',
392
+ useWhen: 'Repos using Supabase for database, auth, or storage.',
393
+ adoption: 'Recommended for full-stack Supabase repos. Requires SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY.',
394
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['SUPABASE_URL', 'SUPABASE_SERVICE_ROLE_KEY'],
395
+ serverName: 'supabase',
396
+ jsonProjection: { command: 'npx', args: ['-y', '@supabase/mcp-server-supabase@latest'], env: { SUPABASE_URL: '${env:SUPABASE_URL}', SUPABASE_SERVICE_ROLE_KEY: '${env:SUPABASE_SERVICE_ROLE_KEY}' } },
397
+ excludeTools: ['delete_project', 'drop_table'], backgroundAgentCompatible: true,
398
+ },
399
+ {
400
+ key: 'prisma-mcp', label: 'Prisma ORM',
401
+ description: 'Schema inspection and migration management for Prisma.',
402
+ useWhen: 'Repos using Prisma for database schema and migrations.',
403
+ adoption: 'Recommended for any repo with a Prisma schema. Requires DATABASE_URL.',
404
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['DATABASE_URL'],
405
+ serverName: 'prisma',
406
+ jsonProjection: { command: 'npx', args: ['-y', 'prisma-mcp-server@latest'], env: { DATABASE_URL: '${env:DATABASE_URL}' } },
407
+ excludeTools: ['drop_database'], backgroundAgentCompatible: false,
408
+ },
409
+ {
410
+ key: 'vercel-mcp', label: 'Vercel',
411
+ description: 'Deployment management and log access for Vercel projects.',
412
+ useWhen: 'Repos deployed on Vercel.',
413
+ adoption: 'Recommended for Vercel-hosted repos. Requires VERCEL_TOKEN.',
414
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['VERCEL_TOKEN'],
415
+ serverName: 'vercel',
416
+ jsonProjection: { command: 'npx', args: ['-y', '@vercel/mcp-server@latest'], env: { VERCEL_TOKEN: '${env:VERCEL_TOKEN}' } },
417
+ excludeTools: ['delete_project', 'delete_deployment'], backgroundAgentCompatible: true,
418
+ },
419
+ {
420
+ key: 'cloudflare-mcp', label: 'Cloudflare',
421
+ description: 'Workers, KV, R2, and D1 management.',
422
+ useWhen: 'Repos using Cloudflare Workers, KV, R2, or D1.',
423
+ adoption: 'Recommended for edge-compute repos. Requires CLOUDFLARE_API_TOKEN.',
424
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['CLOUDFLARE_API_TOKEN'],
425
+ serverName: 'cloudflare',
426
+ jsonProjection: { command: 'npx', args: ['-y', '@cloudflare/mcp-server-cloudflare@latest'], env: { CLOUDFLARE_API_TOKEN: '${env:CLOUDFLARE_API_TOKEN}' } },
427
+ excludeTools: ['delete_worker', 'purge_cache'], backgroundAgentCompatible: true,
428
+ },
429
+ {
430
+ key: 'aws-mcp', label: 'AWS',
431
+ description: 'S3, Lambda, DynamoDB, and CloudFormation access.',
432
+ useWhen: 'Repos using AWS cloud services.',
433
+ adoption: 'Recommended for cloud-infra repos. Requires AWS credentials.',
434
+ trustLevel: 'low', transport: 'stdio', requiredAuth: ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_REGION'],
435
+ serverName: 'aws',
436
+ jsonProjection: { command: 'npx', args: ['-y', '@aws-samples/mcp-server-aws@latest'], env: { AWS_ACCESS_KEY_ID: '${env:AWS_ACCESS_KEY_ID}', AWS_SECRET_ACCESS_KEY: '${env:AWS_SECRET_ACCESS_KEY}', AWS_REGION: '${env:AWS_REGION}' } },
437
+ excludeTools: ['delete_stack', 'terminate_instances', 'delete_bucket'], backgroundAgentCompatible: true,
438
+ },
439
+ {
440
+ key: 'redis-mcp', label: 'Redis',
441
+ description: 'Cache and session management via Redis.',
442
+ useWhen: 'Repos using Redis for caching or sessions.',
443
+ adoption: 'Recommended for performance-critical repos. Requires REDIS_URL.',
444
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['REDIS_URL'],
445
+ serverName: 'redis',
446
+ jsonProjection: { command: 'npx', args: ['-y', 'redis-mcp-server@latest'], env: { REDIS_URL: '${env:REDIS_URL}' } },
447
+ excludeTools: ['flushall', 'flushdb'], backgroundAgentCompatible: true,
448
+ },
449
+ {
450
+ key: 'mongodb-mcp', label: 'MongoDB',
451
+ description: 'Document database access for MongoDB.',
452
+ useWhen: 'Repos using MongoDB.',
453
+ adoption: 'Recommended for document-model repos. Requires MONGODB_URI.',
454
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['MONGODB_URI'],
455
+ serverName: 'mongodb',
456
+ jsonProjection: { command: 'npx', args: ['-y', '@mongodb-js/mongodb-mcp-server@latest'], env: { MONGODB_URI: '${env:MONGODB_URI}' } },
457
+ excludeTools: ['drop_collection', 'drop_database'], backgroundAgentCompatible: false,
458
+ },
459
+ {
460
+ key: 'twilio-mcp', label: 'Twilio',
461
+ description: 'SMS, voice, and messaging via Twilio.',
462
+ useWhen: 'Repos using Twilio for communications.',
463
+ adoption: 'Recommended for communication-feature repos. Requires TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN.',
464
+ trustLevel: 'low', transport: 'stdio', requiredAuth: ['TWILIO_ACCOUNT_SID', 'TWILIO_AUTH_TOKEN'],
465
+ serverName: 'twilio',
466
+ jsonProjection: { command: 'npx', args: ['-y', 'twilio-mcp-server@latest'], env: { TWILIO_ACCOUNT_SID: '${env:TWILIO_ACCOUNT_SID}', TWILIO_AUTH_TOKEN: '${env:TWILIO_AUTH_TOKEN}' } },
467
+ excludeTools: ['delete_message'], backgroundAgentCompatible: true,
468
+ },
469
+ {
470
+ key: 'sendgrid-mcp', label: 'SendGrid',
471
+ description: 'Transactional and marketing email via SendGrid.',
472
+ useWhen: 'Repos using SendGrid for email delivery.',
473
+ adoption: 'Recommended for repos with email workflows. Requires SENDGRID_API_KEY.',
474
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['SENDGRID_API_KEY'],
475
+ serverName: 'sendgrid',
476
+ jsonProjection: { command: 'npx', args: ['-y', 'sendgrid-mcp-server@latest'], env: { SENDGRID_API_KEY: '${env:SENDGRID_API_KEY}' } },
477
+ excludeTools: [], backgroundAgentCompatible: true,
478
+ },
479
+ {
480
+ key: 'algolia-mcp', label: 'Algolia Search',
481
+ description: 'Search indexing and query management via Algolia.',
482
+ useWhen: 'Repos using Algolia for search.',
483
+ adoption: 'Recommended for content-heavy and e-commerce repos. Requires ALGOLIA_APP_ID and ALGOLIA_API_KEY.',
484
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['ALGOLIA_APP_ID', 'ALGOLIA_API_KEY'],
485
+ serverName: 'algolia',
486
+ jsonProjection: { command: 'npx', args: ['-y', 'algolia-mcp-server@latest'], env: { ALGOLIA_APP_ID: '${env:ALGOLIA_APP_ID}', ALGOLIA_API_KEY: '${env:ALGOLIA_API_KEY}' } },
487
+ excludeTools: ['delete_index'], backgroundAgentCompatible: true,
488
+ },
489
+ {
490
+ key: 'planetscale-mcp', label: 'PlanetScale',
491
+ description: 'MySQL database management via PlanetScale.',
492
+ useWhen: 'Repos using PlanetScale for serverless MySQL.',
493
+ adoption: 'Recommended for MySQL-based repos on PlanetScale. Requires PLANETSCALE_TOKEN.',
494
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['PLANETSCALE_TOKEN'],
495
+ serverName: 'planetscale',
496
+ jsonProjection: { command: 'npx', args: ['-y', 'planetscale-mcp-server@latest'], env: { PLANETSCALE_TOKEN: '${env:PLANETSCALE_TOKEN}' } },
497
+ excludeTools: ['delete_database'], backgroundAgentCompatible: true,
498
+ },
499
+ {
500
+ key: 'neon-mcp', label: 'Neon Serverless Postgres',
501
+ description: 'Serverless PostgreSQL management via Neon.',
502
+ useWhen: 'Repos using Neon for serverless Postgres.',
503
+ adoption: 'Recommended for serverless and edge Postgres repos. Requires NEON_API_KEY.',
504
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['NEON_API_KEY'],
505
+ serverName: 'neon',
506
+ jsonProjection: { command: 'npx', args: ['-y', '@neondatabase/mcp-server-neon@latest'], env: { NEON_API_KEY: '${env:NEON_API_KEY}' } },
507
+ excludeTools: ['delete_project'], backgroundAgentCompatible: true,
508
+ },
509
+ {
510
+ key: 'turso-mcp', label: 'Turso Edge SQLite',
511
+ description: 'Distributed edge SQLite management via Turso.',
512
+ useWhen: 'Repos using Turso for edge SQLite.',
513
+ adoption: 'Recommended for edge and multi-region apps. Requires TURSO_DATABASE_URL and TURSO_AUTH_TOKEN.',
514
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['TURSO_DATABASE_URL', 'TURSO_AUTH_TOKEN'],
515
+ serverName: 'turso',
516
+ jsonProjection: { command: 'npx', args: ['-y', 'turso-mcp-server@latest'], env: { TURSO_DATABASE_URL: '${env:TURSO_DATABASE_URL}', TURSO_AUTH_TOKEN: '${env:TURSO_AUTH_TOKEN}' } },
517
+ excludeTools: ['destroy_database'], backgroundAgentCompatible: true,
518
+ },
519
+ {
520
+ key: 'upstash-mcp', label: 'Upstash (Redis + Kafka)',
521
+ description: 'Serverless Redis, Kafka, and QStash via Upstash.',
522
+ useWhen: 'Repos using Upstash for serverless caching or messaging.',
523
+ adoption: 'Recommended for serverless apps. Requires UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN.',
524
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['UPSTASH_REDIS_REST_URL', 'UPSTASH_REDIS_REST_TOKEN'],
525
+ serverName: 'upstash',
526
+ jsonProjection: { command: 'npx', args: ['-y', '@upstash/mcp-server@latest'], env: { UPSTASH_REDIS_REST_URL: '${env:UPSTASH_REDIS_REST_URL}', UPSTASH_REDIS_REST_TOKEN: '${env:UPSTASH_REDIS_REST_TOKEN}' } },
527
+ excludeTools: [], backgroundAgentCompatible: true,
528
+ },
529
+ {
530
+ key: 'convex-mcp', label: 'Convex',
531
+ description: 'Reactive backend-as-a-service management via Convex.',
532
+ useWhen: 'Repos using Convex as reactive backend.',
533
+ adoption: 'Recommended for real-time full-stack repos. Requires CONVEX_DEPLOYMENT.',
534
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['CONVEX_DEPLOYMENT'],
535
+ serverName: 'convex',
536
+ jsonProjection: { command: 'npx', args: ['-y', '@convex-dev/mcp-server@latest'], env: { CONVEX_DEPLOYMENT: '${env:CONVEX_DEPLOYMENT}' } },
537
+ excludeTools: ['delete_deployment'], backgroundAgentCompatible: true,
538
+ },
539
+ {
540
+ key: 'clerk-mcp', label: 'Clerk Authentication',
541
+ description: 'User auth and session management via Clerk.',
542
+ useWhen: 'Repos using Clerk for authentication.',
543
+ adoption: 'Recommended for SaaS repos with Clerk. Requires CLERK_SECRET_KEY.',
544
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['CLERK_SECRET_KEY'],
545
+ serverName: 'clerk',
546
+ jsonProjection: { command: 'npx', args: ['-y', '@clerk/mcp-server@latest'], env: { CLERK_SECRET_KEY: '${env:CLERK_SECRET_KEY}' } },
547
+ excludeTools: ['delete_user'], backgroundAgentCompatible: true,
548
+ },
549
+ {
550
+ key: 'resend-mcp', label: 'Resend Email',
551
+ description: 'Developer-focused transactional email via Resend.',
552
+ useWhen: 'Repos using Resend for email.',
553
+ adoption: 'Recommended for modern full-stack repos. Requires RESEND_API_KEY.',
554
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['RESEND_API_KEY'],
555
+ serverName: 'resend',
556
+ jsonProjection: { command: 'npx', args: ['-y', 'resend-mcp-server@latest'], env: { RESEND_API_KEY: '${env:RESEND_API_KEY}' } },
557
+ excludeTools: [], backgroundAgentCompatible: true,
558
+ },
559
+ {
560
+ key: 'temporal-mcp', label: 'Temporal Workflow',
561
+ description: 'Durable workflow orchestration via Temporal.',
562
+ useWhen: 'Repos using Temporal for workflows.',
563
+ adoption: 'Recommended for async-workflow and microservice repos. Requires TEMPORAL_ADDRESS.',
564
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['TEMPORAL_ADDRESS'],
565
+ serverName: 'temporal',
566
+ jsonProjection: { command: 'npx', args: ['-y', 'temporal-mcp-server@latest'], env: { TEMPORAL_ADDRESS: '${env:TEMPORAL_ADDRESS}' } },
567
+ excludeTools: ['terminate_workflow'], backgroundAgentCompatible: true,
568
+ },
569
+ {
570
+ key: 'launchdarkly-mcp', label: 'LaunchDarkly',
571
+ description: 'Feature flags and experimentation via LaunchDarkly.',
572
+ useWhen: 'Repos using LaunchDarkly for feature flags.',
573
+ adoption: 'Recommended for feature-flag-driven development. Requires LAUNCHDARKLY_ACCESS_TOKEN.',
574
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['LAUNCHDARKLY_ACCESS_TOKEN'],
575
+ serverName: 'launchdarkly',
576
+ jsonProjection: { command: 'npx', args: ['-y', 'launchdarkly-mcp-server@latest'], env: { LAUNCHDARKLY_ACCESS_TOKEN: '${env:LAUNCHDARKLY_ACCESS_TOKEN}' } },
577
+ excludeTools: ['delete_flag'], backgroundAgentCompatible: true,
578
+ },
579
+ {
580
+ key: 'datadog-mcp', label: 'Datadog',
581
+ description: 'Monitoring, APM, and log management via Datadog.',
582
+ useWhen: 'Repos using Datadog for observability.',
583
+ adoption: 'Recommended for production repos. Requires DATADOG_API_KEY and DATADOG_APP_KEY.',
584
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['DATADOG_API_KEY', 'DATADOG_APP_KEY'],
585
+ serverName: 'datadog',
586
+ jsonProjection: { command: 'npx', args: ['-y', '@datadog/mcp-server@latest'], env: { DATADOG_API_KEY: '${env:DATADOG_API_KEY}', DATADOG_APP_KEY: '${env:DATADOG_APP_KEY}' } },
587
+ excludeTools: ['delete_monitor'], backgroundAgentCompatible: true,
588
+ },
589
+ {
590
+ key: 'grafana-mcp', label: 'Grafana',
591
+ description: 'Dashboard and observability access via Grafana.',
592
+ useWhen: 'Repos using Grafana for dashboards.',
593
+ adoption: 'Recommended for observability-focused repos. Requires GRAFANA_URL and GRAFANA_API_KEY.',
594
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['GRAFANA_URL', 'GRAFANA_API_KEY'],
595
+ serverName: 'grafana',
596
+ jsonProjection: { command: 'npx', args: ['-y', 'grafana-mcp-server@latest'], env: { GRAFANA_URL: '${env:GRAFANA_URL}', GRAFANA_API_KEY: '${env:GRAFANA_API_KEY}' } },
597
+ excludeTools: ['delete_dashboard'], backgroundAgentCompatible: true,
598
+ },
599
+ {
600
+ key: 'circleci-mcp', label: 'CircleCI',
601
+ description: 'CI/CD pipeline access via CircleCI.',
602
+ useWhen: 'Repos using CircleCI for CI/CD.',
603
+ adoption: 'Recommended for CircleCI-powered projects. Requires CIRCLECI_TOKEN.',
604
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['CIRCLECI_TOKEN'],
605
+ serverName: 'circleci',
606
+ jsonProjection: { command: 'npx', args: ['-y', 'circleci-mcp-server@latest'], env: { CIRCLECI_TOKEN: '${env:CIRCLECI_TOKEN}' } },
607
+ excludeTools: ['cancel_pipeline'], backgroundAgentCompatible: true,
608
+ },
609
+ {
610
+ key: 'anthropic-mcp', label: 'Anthropic Claude API',
611
+ description: 'Claude API access for AI-powered apps.',
612
+ useWhen: 'Repos building on the Anthropic Claude API.',
613
+ adoption: 'Recommended for AI-powered apps using Claude. Requires ANTHROPIC_API_KEY.',
614
+ trustLevel: 'high', transport: 'stdio', requiredAuth: ['ANTHROPIC_API_KEY'],
615
+ serverName: 'anthropic',
616
+ jsonProjection: { command: 'npx', args: ['-y', '@anthropic-ai/mcp-server@latest'], env: { ANTHROPIC_API_KEY: '${env:ANTHROPIC_API_KEY}' } },
617
+ excludeTools: [], backgroundAgentCompatible: true,
618
+ },
388
619
  ];
389
620
 
390
621
  // --- Helpers ---
@@ -489,6 +720,32 @@ function recommendCursorMcpPacks(stacks = [], domainPacks = [], options = {}) {
489
720
  if (domainKeys.has('ecommerce') && (hasDependency(deps, 'shopify') || hasDependency(deps, '@shopify/shopify-api'))) recommended.add('shopify-mcp');
490
721
  if (domainKeys.has('ai-ml')) recommended.add('huggingface-mcp');
491
722
  if (domainKeys.has('design-system')) recommended.add('figma-mcp');
723
+ // ── 23 new packs recommendation logic ────────────────────────────────────
724
+ if (ctx) {
725
+ if (hasDependency(deps, '@supabase/supabase-js') || hasDependency(deps, '@supabase/auth-helpers-nextjs') || hasFileContentMatch(ctx, '.env', /SUPABASE/i) || hasFileContentMatch(ctx, '.env.example', /SUPABASE/i)) recommended.add('supabase-mcp');
726
+ if (hasFileContentMatch(ctx, 'schema.prisma', /\S/) || hasDependency(deps, '@prisma/client') || hasDependency(deps, 'prisma')) recommended.add('prisma-mcp');
727
+ if (ctx.files.includes('vercel.json') || hasFileContentMatch(ctx, 'package.json', /"deploy":\s*"vercel/i) || hasFileContentMatch(ctx, '.env', /VERCEL_TOKEN/i)) recommended.add('vercel-mcp');
728
+ if (hasFileContentMatch(ctx, 'wrangler.toml', /\S/) || hasDependency(deps, 'wrangler') || hasFileContentMatch(ctx, '.env', /CLOUDFLARE/i)) recommended.add('cloudflare-mcp');
729
+ if (hasFileContentMatch(ctx, '.env', /AWS_ACCESS_KEY/i) || ctx.files.some(f => /serverless\.yml|template\.ya?ml|cdk\.json/.test(f))) recommended.add('aws-mcp');
730
+ if (hasDependency(deps, 'redis') || hasDependency(deps, 'ioredis') || hasDependency(deps, '@redis/client') || hasFileContentMatch(ctx, '.env', /REDIS_URL/i)) recommended.add('redis-mcp');
731
+ if (hasDependency(deps, 'mongoose') || hasDependency(deps, 'mongodb') || hasFileContentMatch(ctx, '.env', /MONGODB_URI/i)) recommended.add('mongodb-mcp');
732
+ if (hasDependency(deps, 'twilio') || hasFileContentMatch(ctx, '.env', /TWILIO_/i)) recommended.add('twilio-mcp');
733
+ if (hasDependency(deps, '@sendgrid/mail') || hasFileContentMatch(ctx, '.env', /SENDGRID_API_KEY/i)) recommended.add('sendgrid-mcp');
734
+ if (hasDependency(deps, 'algoliasearch') || hasDependency(deps, '@algolia/client-search') || hasFileContentMatch(ctx, '.env', /ALGOLIA_/i)) recommended.add('algolia-mcp');
735
+ if (hasFileContentMatch(ctx, '.env', /PLANETSCALE_TOKEN/i)) recommended.add('planetscale-mcp');
736
+ if (hasDependency(deps, '@neondatabase/serverless') || hasFileContentMatch(ctx, '.env', /NEON_/i)) recommended.add('neon-mcp');
737
+ if (hasDependency(deps, '@libsql/client') || hasFileContentMatch(ctx, '.env', /TURSO_/i)) recommended.add('turso-mcp');
738
+ if (hasDependency(deps, '@upstash/redis') || hasDependency(deps, '@upstash/kafka') || hasFileContentMatch(ctx, '.env', /UPSTASH_/i)) recommended.add('upstash-mcp');
739
+ if (hasDependency(deps, 'convex') || hasFileContentMatch(ctx, 'convex.json', /\S/) || hasFileContentMatch(ctx, '.env', /CONVEX_/i)) recommended.add('convex-mcp');
740
+ if (hasDependency(deps, '@clerk/nextjs') || hasDependency(deps, '@clerk/backend') || hasFileContentMatch(ctx, '.env', /CLERK_/i)) recommended.add('clerk-mcp');
741
+ if (hasDependency(deps, 'resend') || hasFileContentMatch(ctx, '.env', /RESEND_API_KEY/i)) recommended.add('resend-mcp');
742
+ if (hasDependency(deps, '@temporalio/client') || hasFileContentMatch(ctx, '.env', /TEMPORAL_/i)) recommended.add('temporal-mcp');
743
+ if (hasDependency(deps, '@launchdarkly/node-server-sdk') || hasFileContentMatch(ctx, '.env', /LAUNCHDARKLY_/i)) recommended.add('launchdarkly-mcp');
744
+ if (hasDependency(deps, 'dd-trace') || hasFileContentMatch(ctx, '.env', /DATADOG_/i)) recommended.add('datadog-mcp');
745
+ if (hasFileContentMatch(ctx, 'docker-compose.yml', /grafana/i) || hasFileContentMatch(ctx, '.env', /GRAFANA_/i)) recommended.add('grafana-mcp');
746
+ if (ctx.files.some(f => /\.circleci\/config/.test(f)) || hasFileContentMatch(ctx, '.env', /CIRCLECI_/i)) recommended.add('circleci-mcp');
747
+ if (hasDependency(deps, '@anthropic-ai/sdk') || hasDependency(deps, 'anthropic') || hasFileContentMatch(ctx, '.env', /ANTHROPIC_API_KEY/i)) recommended.add('anthropic-mcp');
748
+ }
492
749
  if (recommended.size >= 2) recommended.add('mcp-security');
493
750
  if (recommended.size === 0) recommended.add('context7-docs');
494
751