@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
  * - copilot-setup-steps.yml (Copilot-unique)
9
9
  */
10
10
 
11
- const COPILOT_DOMAIN_PACKS = [
11
+ const { buildAdditionalDomainPacks, detectAdditionalDomainPacks } = require('../domain-pack-expansion');
12
+
13
+ const BASE_COPILOT_DOMAIN_PACKS = [
12
14
  {
13
15
  key: 'baseline-general',
14
16
  label: 'Baseline General',
@@ -171,6 +173,13 @@ const COPILOT_DOMAIN_PACKS = [
171
173
  },
172
174
  ];
173
175
 
176
+ const COPILOT_DOMAIN_PACKS = [
177
+ ...BASE_COPILOT_DOMAIN_PACKS,
178
+ ...buildAdditionalDomainPacks('copilot', {
179
+ existingKeys: new Set(BASE_COPILOT_DOMAIN_PACKS.map((pack) => pack.key)),
180
+ }),
181
+ ];
182
+
174
183
  function uniqueByKey(items) {
175
184
  const seen = new Set();
176
185
  const result = [];
@@ -332,6 +341,19 @@ function detectCopilotDomainPacks(ctx, stacks = [], assets = {}) {
332
341
  addMatch('security-focused', ['Detected security-focused repo signals.', ctx.fileContent('SECURITY.md') ? 'SECURITY.md present.' : null]);
333
342
  }
334
343
 
344
+ detectAdditionalDomainPacks({
345
+ ctx,
346
+ pkg,
347
+ deps,
348
+ stackKeys,
349
+ addMatch,
350
+ hasBackend,
351
+ hasFrontend,
352
+ hasInfra,
353
+ hasCi,
354
+ isEnterpriseGoverned,
355
+ });
356
+
335
357
  if (matches.length === 0) {
336
358
  addMatch('baseline-general', [
337
359
  'No stronger platform-specific domain dominated, so a safe general Copilot baseline is the best starting point.',
@@ -385,6 +385,260 @@ const COPILOT_MCP_PACKS = [
385
385
  excludeTools: [],
386
386
  cloudAgentCompatible: true,
387
387
  },
388
+ // ── 23 new packs ─────────────────────────────────────────────────────────
389
+ {
390
+ key: 'supabase-mcp', label: 'Supabase',
391
+ description: 'Database, auth, and storage for Supabase.',
392
+ useWhen: 'Repos using Supabase.',
393
+ adoption: 'Requires: SUPABASE_URL, 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'],
398
+ cloudAgentCompatible: true,
399
+ },
400
+ {
401
+ key: 'prisma-mcp', label: 'Prisma ORM',
402
+ description: 'Schema inspection and migrations via Prisma.',
403
+ useWhen: 'Repos with a Prisma schema.',
404
+ adoption: 'Requires: DATABASE_URL.',
405
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['DATABASE_URL'],
406
+ serverName: 'prisma',
407
+ jsonProjection: { command: 'npx', args: ['-y', 'prisma-mcp-server@latest'], env: { DATABASE_URL: '${env:DATABASE_URL}' } },
408
+ excludeTools: ['drop_database'],
409
+ cloudAgentCompatible: true,
410
+ },
411
+ {
412
+ key: 'vercel-mcp', label: 'Vercel',
413
+ description: 'Deployment management via Vercel.',
414
+ useWhen: 'Repos deployed on Vercel.',
415
+ adoption: 'Requires: VERCEL_TOKEN.',
416
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['VERCEL_TOKEN'],
417
+ serverName: 'vercel',
418
+ jsonProjection: { command: 'npx', args: ['-y', '@vercel/mcp-server@latest'], env: { VERCEL_TOKEN: '${env:VERCEL_TOKEN}' } },
419
+ excludeTools: ['delete_project', 'delete_deployment'],
420
+ cloudAgentCompatible: true,
421
+ },
422
+ {
423
+ key: 'cloudflare-mcp', label: 'Cloudflare',
424
+ description: 'Workers, KV, R2, and D1 management.',
425
+ useWhen: 'Repos using Cloudflare edge.',
426
+ adoption: 'Requires: CLOUDFLARE_API_TOKEN.',
427
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['CLOUDFLARE_API_TOKEN'],
428
+ serverName: 'cloudflare',
429
+ jsonProjection: { command: 'npx', args: ['-y', '@cloudflare/mcp-server-cloudflare@latest'], env: { CLOUDFLARE_API_TOKEN: '${env:CLOUDFLARE_API_TOKEN}' } },
430
+ excludeTools: ['delete_worker', 'purge_cache'],
431
+ cloudAgentCompatible: true,
432
+ },
433
+ {
434
+ key: 'aws-mcp', label: 'AWS',
435
+ description: 'S3, Lambda, DynamoDB access.',
436
+ useWhen: 'Repos using AWS.',
437
+ adoption: 'Requires: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION.',
438
+ trustLevel: 'low', transport: 'stdio', requiredAuth: ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_REGION'],
439
+ serverName: 'aws',
440
+ 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}' } },
441
+ excludeTools: ['delete_stack', 'terminate_instances', 'delete_bucket'],
442
+ cloudAgentCompatible: true,
443
+ },
444
+ {
445
+ key: 'redis-mcp', label: 'Redis',
446
+ description: 'Cache and session management.',
447
+ useWhen: 'Repos using Redis.',
448
+ adoption: 'Requires: REDIS_URL.',
449
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['REDIS_URL'],
450
+ serverName: 'redis',
451
+ jsonProjection: { command: 'npx', args: ['-y', 'redis-mcp-server@latest'], env: { REDIS_URL: '${env:REDIS_URL}' } },
452
+ excludeTools: ['flushall', 'flushdb'],
453
+ cloudAgentCompatible: true,
454
+ },
455
+ {
456
+ key: 'mongodb-mcp', label: 'MongoDB',
457
+ description: 'Document database access.',
458
+ useWhen: 'Repos using MongoDB.',
459
+ adoption: 'Requires: MONGODB_URI.',
460
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['MONGODB_URI'],
461
+ serverName: 'mongodb',
462
+ jsonProjection: { command: 'npx', args: ['-y', '@mongodb-js/mongodb-mcp-server@latest'], env: { MONGODB_URI: '${env:MONGODB_URI}' } },
463
+ excludeTools: ['drop_collection', 'drop_database'],
464
+ cloudAgentCompatible: true,
465
+ },
466
+ {
467
+ key: 'twilio-mcp', label: 'Twilio',
468
+ description: 'SMS, voice, and messaging.',
469
+ useWhen: 'Repos using Twilio.',
470
+ adoption: 'Requires: TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN.',
471
+ trustLevel: 'low', transport: 'stdio', requiredAuth: ['TWILIO_ACCOUNT_SID', 'TWILIO_AUTH_TOKEN'],
472
+ serverName: 'twilio',
473
+ jsonProjection: { command: 'npx', args: ['-y', 'twilio-mcp-server@latest'], env: { TWILIO_ACCOUNT_SID: '${env:TWILIO_ACCOUNT_SID}', TWILIO_AUTH_TOKEN: '${env:TWILIO_AUTH_TOKEN}' } },
474
+ excludeTools: ['delete_message'],
475
+ cloudAgentCompatible: true,
476
+ },
477
+ {
478
+ key: 'sendgrid-mcp', label: 'SendGrid',
479
+ description: 'Transactional email delivery.',
480
+ useWhen: 'Repos using SendGrid.',
481
+ adoption: 'Requires: SENDGRID_API_KEY.',
482
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['SENDGRID_API_KEY'],
483
+ serverName: 'sendgrid',
484
+ jsonProjection: { command: 'npx', args: ['-y', 'sendgrid-mcp-server@latest'], env: { SENDGRID_API_KEY: '${env:SENDGRID_API_KEY}' } },
485
+ excludeTools: [],
486
+ cloudAgentCompatible: true,
487
+ },
488
+ {
489
+ key: 'algolia-mcp', label: 'Algolia Search',
490
+ description: 'Search indexing via Algolia.',
491
+ useWhen: 'Repos using Algolia.',
492
+ adoption: 'Requires: ALGOLIA_APP_ID, ALGOLIA_API_KEY.',
493
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['ALGOLIA_APP_ID', 'ALGOLIA_API_KEY'],
494
+ serverName: 'algolia',
495
+ jsonProjection: { command: 'npx', args: ['-y', 'algolia-mcp-server@latest'], env: { ALGOLIA_APP_ID: '${env:ALGOLIA_APP_ID}', ALGOLIA_API_KEY: '${env:ALGOLIA_API_KEY}' } },
496
+ excludeTools: ['delete_index'],
497
+ cloudAgentCompatible: true,
498
+ },
499
+ {
500
+ key: 'planetscale-mcp', label: 'PlanetScale',
501
+ description: 'Serverless MySQL via PlanetScale.',
502
+ useWhen: 'Repos on PlanetScale.',
503
+ adoption: 'Requires: PLANETSCALE_TOKEN.',
504
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['PLANETSCALE_TOKEN'],
505
+ serverName: 'planetscale',
506
+ jsonProjection: { command: 'npx', args: ['-y', 'planetscale-mcp-server@latest'], env: { PLANETSCALE_TOKEN: '${env:PLANETSCALE_TOKEN}' } },
507
+ excludeTools: ['delete_database'],
508
+ cloudAgentCompatible: true,
509
+ },
510
+ {
511
+ key: 'neon-mcp', label: 'Neon Serverless Postgres',
512
+ description: 'Serverless Postgres via Neon.',
513
+ useWhen: 'Repos using Neon.',
514
+ adoption: 'Requires: NEON_API_KEY.',
515
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['NEON_API_KEY'],
516
+ serverName: 'neon',
517
+ jsonProjection: { command: 'npx', args: ['-y', '@neondatabase/mcp-server-neon@latest'], env: { NEON_API_KEY: '${env:NEON_API_KEY}' } },
518
+ excludeTools: ['delete_project'],
519
+ cloudAgentCompatible: true,
520
+ },
521
+ {
522
+ key: 'turso-mcp', label: 'Turso Edge SQLite',
523
+ description: 'Edge SQLite via Turso.',
524
+ useWhen: 'Repos using Turso.',
525
+ adoption: 'Requires: TURSO_DATABASE_URL, TURSO_AUTH_TOKEN.',
526
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['TURSO_DATABASE_URL', 'TURSO_AUTH_TOKEN'],
527
+ serverName: 'turso',
528
+ jsonProjection: { command: 'npx', args: ['-y', 'turso-mcp-server@latest'], env: { TURSO_DATABASE_URL: '${env:TURSO_DATABASE_URL}', TURSO_AUTH_TOKEN: '${env:TURSO_AUTH_TOKEN}' } },
529
+ excludeTools: ['destroy_database'],
530
+ cloudAgentCompatible: true,
531
+ },
532
+ {
533
+ key: 'upstash-mcp', label: 'Upstash Redis+Kafka',
534
+ description: 'Serverless Redis and Kafka.',
535
+ useWhen: 'Repos using Upstash.',
536
+ adoption: 'Requires: UPSTASH_REDIS_REST_URL, UPSTASH_REDIS_REST_TOKEN.',
537
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['UPSTASH_REDIS_REST_URL', 'UPSTASH_REDIS_REST_TOKEN'],
538
+ serverName: 'upstash',
539
+ 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}' } },
540
+ excludeTools: [],
541
+ cloudAgentCompatible: true,
542
+ },
543
+ {
544
+ key: 'convex-mcp', label: 'Convex',
545
+ description: 'Reactive backend via Convex.',
546
+ useWhen: 'Repos using Convex.',
547
+ adoption: 'Requires: CONVEX_DEPLOYMENT.',
548
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['CONVEX_DEPLOYMENT'],
549
+ serverName: 'convex',
550
+ jsonProjection: { command: 'npx', args: ['-y', '@convex-dev/mcp-server@latest'], env: { CONVEX_DEPLOYMENT: '${env:CONVEX_DEPLOYMENT}' } },
551
+ excludeTools: ['delete_deployment'],
552
+ cloudAgentCompatible: true,
553
+ },
554
+ {
555
+ key: 'clerk-mcp', label: 'Clerk Authentication',
556
+ description: 'User auth via Clerk.',
557
+ useWhen: 'Repos using Clerk.',
558
+ adoption: 'Requires: CLERK_SECRET_KEY.',
559
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['CLERK_SECRET_KEY'],
560
+ serverName: 'clerk',
561
+ jsonProjection: { command: 'npx', args: ['-y', '@clerk/mcp-server@latest'], env: { CLERK_SECRET_KEY: '${env:CLERK_SECRET_KEY}' } },
562
+ excludeTools: ['delete_user'],
563
+ cloudAgentCompatible: true,
564
+ },
565
+ {
566
+ key: 'resend-mcp', label: 'Resend Email',
567
+ description: 'Transactional email via Resend.',
568
+ useWhen: 'Repos using Resend.',
569
+ adoption: 'Requires: RESEND_API_KEY.',
570
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['RESEND_API_KEY'],
571
+ serverName: 'resend',
572
+ jsonProjection: { command: 'npx', args: ['-y', 'resend-mcp-server@latest'], env: { RESEND_API_KEY: '${env:RESEND_API_KEY}' } },
573
+ excludeTools: [],
574
+ cloudAgentCompatible: true,
575
+ },
576
+ {
577
+ key: 'temporal-mcp', label: 'Temporal Workflow',
578
+ description: 'Workflow orchestration via Temporal.',
579
+ useWhen: 'Repos using Temporal.',
580
+ adoption: 'Requires: TEMPORAL_ADDRESS.',
581
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['TEMPORAL_ADDRESS'],
582
+ serverName: 'temporal',
583
+ jsonProjection: { command: 'npx', args: ['-y', 'temporal-mcp-server@latest'], env: { TEMPORAL_ADDRESS: '${env:TEMPORAL_ADDRESS}' } },
584
+ excludeTools: ['terminate_workflow'],
585
+ cloudAgentCompatible: true,
586
+ },
587
+ {
588
+ key: 'launchdarkly-mcp', label: 'LaunchDarkly',
589
+ description: 'Feature flags via LaunchDarkly.',
590
+ useWhen: 'Repos using LaunchDarkly.',
591
+ adoption: 'Requires: LAUNCHDARKLY_ACCESS_TOKEN.',
592
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['LAUNCHDARKLY_ACCESS_TOKEN'],
593
+ serverName: 'launchdarkly',
594
+ jsonProjection: { command: 'npx', args: ['-y', 'launchdarkly-mcp-server@latest'], env: { LAUNCHDARKLY_ACCESS_TOKEN: '${env:LAUNCHDARKLY_ACCESS_TOKEN}' } },
595
+ excludeTools: ['delete_flag'],
596
+ cloudAgentCompatible: true,
597
+ },
598
+ {
599
+ key: 'datadog-mcp', label: 'Datadog',
600
+ description: 'Monitoring and APM via Datadog.',
601
+ useWhen: 'Repos using Datadog.',
602
+ adoption: 'Requires: DATADOG_API_KEY, DATADOG_APP_KEY.',
603
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['DATADOG_API_KEY', 'DATADOG_APP_KEY'],
604
+ serverName: 'datadog',
605
+ jsonProjection: { command: 'npx', args: ['-y', '@datadog/mcp-server@latest'], env: { DATADOG_API_KEY: '${env:DATADOG_API_KEY}', DATADOG_APP_KEY: '${env:DATADOG_APP_KEY}' } },
606
+ excludeTools: ['delete_monitor'],
607
+ cloudAgentCompatible: true,
608
+ },
609
+ {
610
+ key: 'grafana-mcp', label: 'Grafana',
611
+ description: 'Dashboards via Grafana.',
612
+ useWhen: 'Repos using Grafana.',
613
+ adoption: 'Requires: GRAFANA_URL, GRAFANA_API_KEY.',
614
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['GRAFANA_URL', 'GRAFANA_API_KEY'],
615
+ serverName: 'grafana',
616
+ jsonProjection: { command: 'npx', args: ['-y', 'grafana-mcp-server@latest'], env: { GRAFANA_URL: '${env:GRAFANA_URL}', GRAFANA_API_KEY: '${env:GRAFANA_API_KEY}' } },
617
+ excludeTools: ['delete_dashboard'],
618
+ cloudAgentCompatible: true,
619
+ },
620
+ {
621
+ key: 'circleci-mcp', label: 'CircleCI',
622
+ description: 'CI/CD via CircleCI.',
623
+ useWhen: 'Repos using CircleCI.',
624
+ adoption: 'Requires: CIRCLECI_TOKEN.',
625
+ trustLevel: 'medium', transport: 'stdio', requiredAuth: ['CIRCLECI_TOKEN'],
626
+ serverName: 'circleci',
627
+ jsonProjection: { command: 'npx', args: ['-y', 'circleci-mcp-server@latest'], env: { CIRCLECI_TOKEN: '${env:CIRCLECI_TOKEN}' } },
628
+ excludeTools: ['cancel_pipeline'],
629
+ cloudAgentCompatible: true,
630
+ },
631
+ {
632
+ key: 'anthropic-mcp', label: 'Anthropic Claude API',
633
+ description: 'Claude API for AI-powered apps.',
634
+ useWhen: 'Repos building on Claude API.',
635
+ adoption: 'Requires: ANTHROPIC_API_KEY.',
636
+ trustLevel: 'high', transport: 'stdio', requiredAuth: ['ANTHROPIC_API_KEY'],
637
+ serverName: 'anthropic',
638
+ jsonProjection: { command: 'npx', args: ['-y', '@anthropic-ai/mcp-server@latest'], env: { ANTHROPIC_API_KEY: '${env:ANTHROPIC_API_KEY}' } },
639
+ excludeTools: [],
640
+ cloudAgentCompatible: true,
641
+ },
388
642
  ];
389
643
 
390
644
  // --- Helpers ---