@redential/cli 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 (46) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +217 -0
  3. package/dist/build-bundle.js +37 -0
  4. package/dist/categorize.js +25 -0
  5. package/dist/churn-exclusions.js +51 -0
  6. package/dist/cli.js +87 -0
  7. package/dist/config.js +13 -0
  8. package/dist/credentials.js +26 -0
  9. package/dist/errors.js +20 -0
  10. package/dist/git.js +141 -0
  11. package/dist/hash.js +4 -0
  12. package/dist/http-client.js +129 -0
  13. package/dist/import-detect.js +281 -0
  14. package/dist/login.js +133 -0
  15. package/dist/logout.js +6 -0
  16. package/dist/merkle.js +20 -0
  17. package/dist/prompt.js +70 -0
  18. package/dist/public-remote.js +43 -0
  19. package/dist/salt.js +20 -0
  20. package/dist/scan-command.js +24 -0
  21. package/dist/scan.js +145 -0
  22. package/dist/secret-scan.js +37 -0
  23. package/dist/skill-detect.js +234 -0
  24. package/dist/submit-command.js +49 -0
  25. package/dist/submit.js +71 -0
  26. package/dist/summary.js +148 -0
  27. package/dist/types.js +12 -0
  28. package/dist/version-check.js +62 -0
  29. package/package.json +48 -0
  30. package/signatures/ai/vector-search.json +39 -0
  31. package/signatures/ai/whisper.json +36 -0
  32. package/signatures/auth/firebase-auth.json +43 -0
  33. package/signatures/auth/oauth-oidc.json +41 -0
  34. package/signatures/auth/supabase-auth.json +29 -0
  35. package/signatures/backend/axum.json +24 -0
  36. package/signatures/db/activerecord.json +21 -0
  37. package/signatures/db/eloquent.json +22 -0
  38. package/signatures/db/supabase.json +31 -0
  39. package/signatures/frontend/tailwind.json +28 -0
  40. package/signatures/infra/docker.json +20 -0
  41. package/signatures/infra/github-actions.json +19 -0
  42. package/signatures/infra/kubernetes.json +21 -0
  43. package/signatures/infra/terraform.json +22 -0
  44. package/signatures/package-map.json +483 -0
  45. package/signatures/testing/jest.json +25 -0
  46. package/taxonomy.json +119 -0
@@ -0,0 +1,483 @@
1
+ {
2
+ "$comment": "Tier 1 of skill detection (docs/signatures.md): flat package-name -> taxonomy slug map. Every key is a normalized package name as ACTUALLY produced by src/import-detect.ts (scope+first-segment for JS, first-dot-segment for Python, first-segment for Ruby, version-stripped path for Go, composer.json's literal keys or PHP `use`'s lowercased first namespace segment) — a Python/Ruby *distribution* name that differs from its *import* name (e.g. PyPI's beautifulsoup4 vs `import bs4`) is a dead key that can never match, not a valid entry. A package deliberately absent here (e.g. @supabase/supabase-js, firebase, @xenova/transformers) is intentionally left to a Tier 2 signature instead, because the bare import doesn't disambiguate which slug applies, or is used for too many unrelated purposes to safely commit to one slug — see docs/signatures.md.",
3
+ "map": {
4
+ "@supabase/auth-helpers-nextjs": "auth/supabase-auth",
5
+ "@supabase/auth-helpers-react": "auth/supabase-auth",
6
+ "@supabase/auth-helpers-shared": "auth/supabase-auth",
7
+ "@supabase/ssr": "auth/supabase-auth",
8
+ "@supabase/auth-ui-react": "auth/supabase-auth",
9
+ "next-auth": "auth/nextauth",
10
+ "@auth/core": "auth/nextauth",
11
+ "@auth/nextjs": "auth/nextauth",
12
+ "@auth/express": "auth/nextauth",
13
+ "@auth0/nextjs-auth0": "auth/auth0",
14
+ "@auth0/auth0-react": "auth/auth0",
15
+ "@auth0/auth0-spa-js": "auth/auth0",
16
+ "auth0": "auth/auth0",
17
+ "@clerk/nextjs": "auth/clerk",
18
+ "@clerk/clerk-react": "auth/clerk",
19
+ "@clerk/clerk-sdk-node": "auth/clerk",
20
+ "@clerk/clerk-js": "auth/clerk",
21
+ "@clerk/backend": "auth/clerk",
22
+ "@clerk/express": "auth/clerk",
23
+ "openid-client": "auth/oauth-oidc",
24
+ "oauth4webapi": "auth/oauth-oidc",
25
+ "simple-oauth2": "auth/oauth-oidc",
26
+ "jsonwebtoken": "auth/jwt",
27
+ "jose": "auth/jwt",
28
+ "jwt-decode": "auth/jwt",
29
+ "@types/jsonwebtoken": "auth/jwt",
30
+ "jwt": "auth/jwt",
31
+ "lucia": "auth/lucia",
32
+ "@lucia-auth/adapter-postgresql": "auth/lucia",
33
+ "@lucia-auth/adapter-sqlite": "auth/lucia",
34
+ "@lucia-auth/adapter-drizzle": "auth/lucia",
35
+ "passport": "auth/passport",
36
+ "passport-local": "auth/passport",
37
+ "passport-jwt": "auth/passport",
38
+ "passport-google-oauth20": "auth/passport",
39
+ "passport-github2": "auth/passport",
40
+ "@react-native-firebase/auth": "auth/firebase-auth",
41
+ "@workos-inc/node": "auth/workos",
42
+ "devise": "auth/devise",
43
+
44
+ "stripe": "payments/stripe",
45
+ "@stripe/stripe-js": "payments/stripe",
46
+ "@stripe/react-stripe-js": "payments/stripe",
47
+ "paypal-rest-sdk": "payments/paypal",
48
+ "@paypal/checkout-server-sdk": "payments/paypal",
49
+ "@paypal/react-paypal-js": "payments/paypal",
50
+ "@paypal/paypal-server-sdk": "payments/paypal",
51
+ "mercadopago": "payments/mercadopago",
52
+ "@lemonsqueezy/lemonsqueezy.js": "payments/lemonsqueezy",
53
+ "@paddle/paddle-js": "payments/paddle",
54
+ "@paddle/paddle-node-sdk": "payments/paddle",
55
+
56
+ "openai": "ai/openai-api",
57
+ "@azure/openai": "ai/openai-api",
58
+ "openai-edge": "ai/openai-api",
59
+ "tiktoken": "ai/openai-api",
60
+ "@anthropic-ai/sdk": "ai/anthropic-api",
61
+ "@anthropic-ai/bedrock-sdk": "ai/anthropic-api",
62
+ "@anthropic-ai/vertex-sdk": "ai/anthropic-api",
63
+ "anthropic": "ai/anthropic-api",
64
+ "langchain": "ai/langchain",
65
+ "@langchain/core": "ai/langchain",
66
+ "@langchain/openai": "ai/langchain",
67
+ "@langchain/anthropic": "ai/langchain",
68
+ "@langchain/community": "ai/langchain",
69
+ "@langchain/textsplitters": "ai/langchain",
70
+ "langchain_core": "ai/langchain",
71
+ "langchain_openai": "ai/langchain",
72
+ "langchain_community": "ai/langchain",
73
+ "@langchain/langgraph": "ai/langgraph",
74
+ "@langchain/langgraph-sdk": "ai/langgraph",
75
+ "langgraph": "ai/langgraph",
76
+ "llamaindex": "ai/llamaindex",
77
+ "llama_index": "ai/llamaindex",
78
+ "@ai-sdk/openai": "ai/vercel-ai-sdk",
79
+ "@ai-sdk/anthropic": "ai/vercel-ai-sdk",
80
+ "@ai-sdk/google": "ai/vercel-ai-sdk",
81
+ "@ai-sdk/mistral": "ai/vercel-ai-sdk",
82
+ "@ai-sdk/cohere": "ai/vercel-ai-sdk",
83
+ "@ai-sdk/groq": "ai/vercel-ai-sdk",
84
+ "@ai-sdk/react": "ai/vercel-ai-sdk",
85
+ "@ai-sdk/svelte": "ai/vercel-ai-sdk",
86
+ "@ai-sdk/vue": "ai/vercel-ai-sdk",
87
+ "@huggingface/inference": "ai/huggingface",
88
+ "transformers": "ai/huggingface",
89
+ "sentence_transformers": "ai/huggingface",
90
+ "huggingface_hub": "ai/huggingface",
91
+ "datasets": "ai/huggingface",
92
+ "accelerate": "ai/huggingface",
93
+ "diffusers": "ai/huggingface",
94
+ "tokenizers": "ai/huggingface",
95
+ "ollama": "ai/ollama",
96
+ "replicate": "ai/replicate",
97
+ "groq-sdk": "ai/groq",
98
+ "groq": "ai/groq",
99
+ "@google/generative-ai": "ai/gemini",
100
+ "@google/genai": "ai/gemini",
101
+ "@google-cloud/vertexai": "ai/gemini",
102
+ "vertexai": "ai/gemini",
103
+ "cohere-ai": "ai/cohere",
104
+ "cohere": "ai/cohere",
105
+ "@pinecone-database/pinecone": "ai/pinecone",
106
+ "pinecone": "ai/pinecone",
107
+ "weaviate-client": "ai/weaviate",
108
+ "weaviate-ts-client": "ai/weaviate",
109
+ "weaviate": "ai/weaviate",
110
+ "chromadb": "ai/chroma",
111
+ "mistralai": "ai/mistral",
112
+ "@mistralai/mistralai": "ai/mistral",
113
+ "qdrant_client": "ai/vector-search",
114
+
115
+ "pg": "db/postgres",
116
+ "postgres": "db/postgres",
117
+ "pg-promise": "db/postgres",
118
+ "psycopg2": "db/postgres",
119
+ "psycopg": "db/postgres",
120
+ "asyncpg": "db/postgres",
121
+ "aiopg": "db/postgres",
122
+ "pg-hstore": "db/postgres",
123
+ "@prisma/client": "db/prisma",
124
+ "@prisma/extension-accelerate": "db/prisma",
125
+ "@prisma/migrate": "db/prisma",
126
+ "drizzle-orm": "db/drizzle",
127
+ "drizzle-kit": "db/drizzle",
128
+ "drizzle-zod": "db/drizzle",
129
+ "drizzle-seed": "db/drizzle",
130
+ "mongodb": "db/mongodb",
131
+ "mongoose": "db/mongodb",
132
+ "pymongo": "db/mongodb",
133
+ "mongoengine": "db/mongodb",
134
+ "mongodb-memory-server": "db/mongodb",
135
+ "redis": "db/redis",
136
+ "ioredis": "db/redis",
137
+ "@upstash/redis": "db/redis",
138
+ "@upstash/ratelimit": "db/redis",
139
+ "redis-om": "db/redis",
140
+ "connect-redis": "db/redis",
141
+ "mysql2": "db/mysql",
142
+ "mysql": "db/mysql",
143
+ "MySQLdb": "db/mysql",
144
+ "pymysql": "db/mysql",
145
+ "better-sqlite3": "db/sqlite",
146
+ "sqlite3": "db/sqlite",
147
+ "node:sqlite": "db/sqlite",
148
+ "expo-sqlite": "db/sqlite",
149
+ "sql.js": "db/sqlite",
150
+ "@planetscale/database": "db/planetscale",
151
+ "@neondatabase/serverless": "db/neon",
152
+ "@libsql/client": "db/turso",
153
+ "typeorm": "db/typeorm",
154
+ "sequelize": "db/sequelize",
155
+ "sequelize-typescript": "db/sequelize",
156
+ "knex": "db/knex",
157
+ "objection": "db/knex",
158
+ "sqlalchemy": "db/sqlalchemy",
159
+ "sqlalchemy_utils": "db/sqlalchemy",
160
+ "alembic": "db/sqlalchemy",
161
+ "flask_sqlalchemy": "db/sqlalchemy",
162
+ "gorm.io/gorm": "db/gorm",
163
+ "gorm.io/driver/postgres": "db/gorm",
164
+ "gorm.io/driver/mysql": "db/gorm",
165
+ "gorm.io/driver/sqlite": "db/gorm",
166
+
167
+ "react": "frontend/react",
168
+ "react-dom": "frontend/react",
169
+ "react-is": "frontend/react",
170
+ "react-router": "frontend/react",
171
+ "react-router-dom": "frontend/react",
172
+ "react-hook-form": "frontend/react",
173
+ "swr": "frontend/react",
174
+ "@types/react": "frontend/react",
175
+ "@types/react-dom": "frontend/react",
176
+ "next": "frontend/nextjs",
177
+ "@next/font": "frontend/nextjs",
178
+ "@next/bundle-analyzer": "frontend/nextjs",
179
+ "next-intl": "frontend/nextjs",
180
+ "next-seo": "frontend/nextjs",
181
+ "next-themes": "frontend/nextjs",
182
+ "vue": "frontend/vue",
183
+ "vue-router": "frontend/vue",
184
+ "vuex": "frontend/vue",
185
+ "pinia": "frontend/vue",
186
+ "nuxt": "frontend/vue",
187
+ "vue-i18n": "frontend/vue",
188
+ "vue-tsc": "frontend/vue",
189
+ "@vueuse/core": "frontend/vue",
190
+ "@vitejs/plugin-vue": "frontend/vue",
191
+ "tailwindcss": "frontend/tailwind",
192
+ "@tailwindcss/typography": "frontend/tailwind",
193
+ "@tailwindcss/forms": "frontend/tailwind",
194
+ "tailwind-merge": "frontend/tailwind",
195
+ "tailwind-variants": "frontend/tailwind",
196
+ "svelte": "frontend/svelte",
197
+ "@sveltejs/kit": "frontend/svelte",
198
+ "svelte-check": "frontend/svelte",
199
+ "svelte-preprocess": "frontend/svelte",
200
+ "@sveltejs/adapter-node": "frontend/svelte",
201
+ "@sveltejs/adapter-auto": "frontend/svelte",
202
+ "@angular/core": "frontend/angular",
203
+ "@angular/common": "frontend/angular",
204
+ "@angular/router": "frontend/angular",
205
+ "@angular/forms": "frontend/angular",
206
+ "@angular/material": "frontend/angular",
207
+ "@angular/cli": "frontend/angular",
208
+ "@angular/animations": "frontend/angular",
209
+ "astro": "frontend/astro",
210
+ "@astrojs/react": "frontend/astro",
211
+ "@astrojs/vue": "frontend/astro",
212
+ "@astrojs/tailwind": "frontend/astro",
213
+ "@astrojs/mdx": "frontend/astro",
214
+ "@astrojs/sitemap": "frontend/astro",
215
+ "@remix-run/react": "frontend/remix",
216
+ "@remix-run/node": "frontend/remix",
217
+ "@remix-run/dev": "frontend/remix",
218
+ "@remix-run/serve": "frontend/remix",
219
+ "@remix-run/eslint-config": "frontend/remix",
220
+ "@remix-run/css-bundle": "frontend/remix",
221
+ "react-native": "frontend/react-native",
222
+ "expo": "frontend/react-native",
223
+ "expo-router": "frontend/react-native",
224
+ "expo-status-bar": "frontend/react-native",
225
+ "expo-constants": "frontend/react-native",
226
+ "expo-linking": "frontend/react-native",
227
+ "expo-splash-screen": "frontend/react-native",
228
+ "@react-native-async-storage/async-storage": "frontend/react-native",
229
+ "react-native-reanimated": "frontend/react-native",
230
+ "react-native-gesture-handler": "frontend/react-native",
231
+ "react-native-screens": "frontend/react-native",
232
+ "@react-navigation/native": "frontend/react-native",
233
+ "zustand": "frontend/zustand",
234
+ "redux": "frontend/redux",
235
+ "@reduxjs/toolkit": "frontend/redux",
236
+ "react-redux": "frontend/redux",
237
+ "redux-thunk": "frontend/redux",
238
+ "redux-saga": "frontend/redux",
239
+ "redux-persist": "frontend/redux",
240
+ "@tanstack/react-query": "frontend/tanstack-query",
241
+ "@tanstack/vue-query": "frontend/tanstack-query",
242
+ "@tanstack/svelte-query": "frontend/tanstack-query",
243
+ "@tanstack/query-core": "frontend/tanstack-query",
244
+ "@tanstack/react-query-devtools": "frontend/tanstack-query",
245
+
246
+ "express": "backend/express",
247
+ "express-session": "backend/express",
248
+ "cors": "backend/express",
249
+ "helmet": "backend/express",
250
+ "morgan": "backend/express",
251
+ "body-parser": "backend/express",
252
+ "cookie-parser": "backend/express",
253
+ "express-rate-limit": "backend/express",
254
+ "express-validator": "backend/express",
255
+ "fastify": "backend/fastify",
256
+ "@fastify/cors": "backend/fastify",
257
+ "@fastify/cookie": "backend/fastify",
258
+ "@fastify/jwt": "backend/fastify",
259
+ "@fastify/static": "backend/fastify",
260
+ "@fastify/swagger": "backend/fastify",
261
+ "fastify-plugin": "backend/fastify",
262
+ "hono": "backend/hono",
263
+ "@hono/node-server": "backend/hono",
264
+ "@hono/zod-validator": "backend/hono",
265
+ "@hono/swagger-ui": "backend/hono",
266
+ "@nestjs/core": "backend/nestjs",
267
+ "@nestjs/common": "backend/nestjs",
268
+ "@nestjs/platform-express": "backend/nestjs",
269
+ "@nestjs/graphql": "backend/nestjs",
270
+ "@nestjs/typeorm": "backend/nestjs",
271
+ "@nestjs/config": "backend/nestjs",
272
+ "@nestjs/jwt": "backend/nestjs",
273
+ "@nestjs/passport": "backend/nestjs",
274
+ "@nestjs/swagger": "backend/nestjs",
275
+ "@nestjs/mongoose": "backend/nestjs",
276
+ "@nestjs/cli": "backend/nestjs",
277
+ "django": "backend/django",
278
+ "rest_framework": "backend/django",
279
+ "corsheaders": "backend/django",
280
+ "rest_framework_simplejwt": "backend/django",
281
+ "django_filters": "backend/django",
282
+ "django_extensions": "backend/django",
283
+ "channels": "backend/django",
284
+ "flask": "backend/flask",
285
+ "flask_cors": "backend/flask",
286
+ "flask_migrate": "backend/flask",
287
+ "flask_login": "backend/flask",
288
+ "flask_restful": "backend/flask",
289
+ "flask_jwt_extended": "backend/flask",
290
+ "fastapi": "backend/fastapi",
291
+ "fastapi_users": "backend/fastapi",
292
+ "sqlmodel": "backend/fastapi",
293
+ "rails": "backend/rails",
294
+ "laravel/framework": "backend/laravel",
295
+ "illuminate": "backend/laravel",
296
+ "graphql": "backend/graphql",
297
+ "graphql-yoga": "backend/graphql",
298
+ "@apollo/server": "backend/graphql",
299
+ "apollo-server": "backend/graphql",
300
+ "apollo-server-express": "backend/graphql",
301
+ "graphene": "backend/graphql",
302
+ "ariadne": "backend/graphql",
303
+ "strawberry": "backend/graphql",
304
+ "graphql-tag": "backend/graphql",
305
+ "graphql-request": "backend/graphql",
306
+ "@graphql-tools/schema": "backend/graphql",
307
+ "type-graphql": "backend/graphql",
308
+ "@grpc/grpc-js": "backend/grpc",
309
+ "@grpc/proto-loader": "backend/grpc",
310
+ "grpc": "backend/grpc",
311
+ "grpc-web": "backend/grpc",
312
+ "protobufjs": "backend/grpc",
313
+ "ws": "backend/websockets",
314
+ "socket.io": "backend/websockets",
315
+ "socket.io-client": "backend/websockets",
316
+ "socket.io-redis": "backend/websockets",
317
+ "socket.io-msgpack-parser": "backend/websockets",
318
+ "websockets": "backend/websockets",
319
+ "uWebSockets.js": "backend/websockets",
320
+
321
+ "@aws-sdk/client-dynamodb": "infra/aws-sdk",
322
+ "@aws-sdk/client-lambda": "infra/aws-sdk",
323
+ "@aws-sdk/client-ec2": "infra/aws-sdk",
324
+ "@aws-sdk/client-cloudwatch": "infra/aws-sdk",
325
+ "@aws-sdk/client-secrets-manager": "infra/aws-sdk",
326
+ "@aws-sdk/client-ssm": "infra/aws-sdk",
327
+ "@aws-sdk/credential-providers": "infra/aws-sdk",
328
+ "@aws-sdk/client-iam": "infra/aws-sdk",
329
+ "@aws-sdk/client-sts": "infra/aws-sdk",
330
+ "@aws-sdk/client-cloudformation": "infra/aws-sdk",
331
+ "aws-cdk-lib": "infra/aws-sdk",
332
+ "aws-sdk": "infra/aws-sdk",
333
+ "boto3": "infra/aws-sdk",
334
+ "botocore": "infra/aws-sdk",
335
+ "dockerode": "infra/docker",
336
+ "docker": "infra/docker",
337
+ "@pulumi/pulumi": "infra/pulumi",
338
+ "@pulumi/aws": "infra/pulumi",
339
+ "@pulumi/gcp": "infra/pulumi",
340
+ "@pulumi/azure-native": "infra/pulumi",
341
+ "@pulumi/kubernetes": "infra/pulumi",
342
+ "@pulumi/docker": "infra/pulumi",
343
+ "@pulumi/cloudflare": "infra/pulumi",
344
+ "pulumi": "infra/pulumi",
345
+ "ansible": "infra/ansible",
346
+ "ansible_runner": "infra/ansible",
347
+ "molecule": "infra/ansible",
348
+ "@cloudflare/workers-types": "infra/cloudflare-workers",
349
+ "@cloudflare/kv-asset-handler": "infra/cloudflare-workers",
350
+ "@cloudflare/next-on-pages": "infra/cloudflare-workers",
351
+ "miniflare": "infra/cloudflare-workers",
352
+
353
+ "@trigger.dev/sdk": "queues/trigger-dev",
354
+ "@trigger.dev/nextjs": "queues/trigger-dev",
355
+ "@trigger.dev/react": "queues/trigger-dev",
356
+ "@trigger.dev/react-hooks": "queues/trigger-dev",
357
+ "bullmq": "queues/bullmq",
358
+ "bull": "queues/bullmq",
359
+ "@bull-board/api": "queues/bullmq",
360
+ "@bull-board/express": "queues/bullmq",
361
+ "amqplib": "queues/rabbitmq",
362
+ "amqp-connection-manager": "queues/rabbitmq",
363
+ "pika": "queues/rabbitmq",
364
+ "rascal": "queues/rabbitmq",
365
+ "celery": "queues/celery",
366
+ "django_celery_beat": "queues/celery",
367
+ "flower": "queues/celery",
368
+ "sidekiq": "queues/sidekiq",
369
+ "sidekiq-cron": "queues/sidekiq",
370
+ "sidekiq-scheduler": "queues/sidekiq",
371
+ "sidekiq-unique-jobs": "queues/sidekiq",
372
+ "kafkajs": "queues/kafka",
373
+ "kafka": "queues/kafka",
374
+ "confluent_kafka": "queues/kafka",
375
+ "node-rdkafka": "queues/kafka",
376
+ "@aws-sdk/client-sqs": "queues/sqs",
377
+ "sqs-consumer": "queues/sqs",
378
+ "sqs-producer": "queues/sqs",
379
+ "@aws-sdk/client-sns": "queues/sqs",
380
+ "sns-sqs-big-payload": "queues/sqs",
381
+
382
+ "@sentry/node": "observability/sentry",
383
+ "@sentry/nextjs": "observability/sentry",
384
+ "@sentry/react": "observability/sentry",
385
+ "@sentry/browser": "observability/sentry",
386
+ "@sentry/vue": "observability/sentry",
387
+ "@sentry/remix": "observability/sentry",
388
+ "@sentry/svelte": "observability/sentry",
389
+ "@sentry/angular": "observability/sentry",
390
+ "@sentry/tracing": "observability/sentry",
391
+ "sentry_sdk": "observability/sentry",
392
+ "posthog-js": "observability/posthog",
393
+ "posthog-node": "observability/posthog",
394
+ "posthog-react-native": "observability/posthog",
395
+ "posthog": "observability/posthog",
396
+ "dd-trace": "observability/datadog",
397
+ "ddtrace": "observability/datadog",
398
+ "datadog_api_client": "observability/datadog",
399
+ "datadog-lambda-js": "observability/datadog",
400
+ "@datadog/browser-rum": "observability/datadog",
401
+ "@datadog/browser-logs": "observability/datadog",
402
+ "@opentelemetry/api": "observability/opentelemetry",
403
+ "@opentelemetry/sdk-node": "observability/opentelemetry",
404
+ "@opentelemetry/sdk-trace-node": "observability/opentelemetry",
405
+ "@opentelemetry/exporter-trace-otlp-http": "observability/opentelemetry",
406
+ "@opentelemetry/instrumentation": "observability/opentelemetry",
407
+ "@opentelemetry/exporter-jaeger": "observability/opentelemetry",
408
+ "@opentelemetry/instrumentation-http": "observability/opentelemetry",
409
+ "@opentelemetry/instrumentation-express": "observability/opentelemetry",
410
+ "@opentelemetry/resources": "observability/opentelemetry",
411
+ "opentelemetry": "observability/opentelemetry",
412
+ "logrocket": "observability/logrocket",
413
+ "logrocket-react": "observability/logrocket",
414
+ "logrocket-redux": "observability/logrocket",
415
+
416
+ "jest": "testing/jest",
417
+ "jest-environment-jsdom": "testing/jest",
418
+ "babel-jest": "testing/jest",
419
+ "ts-jest": "testing/jest",
420
+ "jest-mock-extended": "testing/jest",
421
+ "vitest": "testing/vitest",
422
+ "@vitest/ui": "testing/vitest",
423
+ "@vitest/coverage-v8": "testing/vitest",
424
+ "@vitest/browser": "testing/vitest",
425
+ "@playwright/test": "testing/playwright",
426
+ "playwright": "testing/playwright",
427
+ "playwright-core": "testing/playwright",
428
+ "@playwright/experimental-ct-react": "testing/playwright",
429
+ "playwright-chromium": "testing/playwright",
430
+ "cypress": "testing/cypress",
431
+ "cypress-file-upload": "testing/cypress",
432
+ "@cypress/vite-dev-server": "testing/cypress",
433
+ "cypress-axe": "testing/cypress",
434
+ "pytest": "testing/pytest",
435
+ "rspec": "testing/rspec",
436
+ "rspec-rails": "testing/rspec",
437
+ "capybara": "testing/rspec",
438
+ "factory_bot": "testing/rspec",
439
+ "shoulda-matchers": "testing/rspec",
440
+ "@testing-library/react": "testing/testing-library",
441
+ "@testing-library/vue": "testing/testing-library",
442
+ "@testing-library/svelte": "testing/testing-library",
443
+ "@testing-library/jest-dom": "testing/testing-library",
444
+ "@testing-library/user-event": "testing/testing-library",
445
+ "@testing-library/dom": "testing/testing-library",
446
+ "@testing-library/react-hooks": "testing/testing-library",
447
+ "@testing-library/react-native": "testing/testing-library",
448
+ "@testing-library/cypress": "testing/testing-library",
449
+
450
+ "pandas": "data/pandas",
451
+ "pandas-stubs": "data/pandas",
452
+
453
+ "resend": "email/resend",
454
+ "@react-email/render": "email/resend",
455
+ "@react-email/components": "email/resend",
456
+ "@sendgrid/mail": "email/sendgrid",
457
+ "@sendgrid/client": "email/sendgrid",
458
+ "@sendgrid/eventwebhook": "email/sendgrid",
459
+ "sendgrid": "email/sendgrid",
460
+ "nodemailer": "email/nodemailer",
461
+ "nodemailer-sendgrid": "email/nodemailer",
462
+ "nodemailer-smtp-transport": "email/nodemailer",
463
+
464
+ "@aws-sdk/client-s3": "storage/s3",
465
+ "@aws-sdk/lib-storage": "storage/s3",
466
+ "@aws-sdk/s3-request-presigner": "storage/s3",
467
+ "@aws-sdk/cloudfront-signer": "storage/s3",
468
+ "multer-s3": "storage/s3",
469
+ "s3fs": "storage/s3",
470
+ "cloudinary": "storage/cloudinary",
471
+ "cloudinary-react": "storage/cloudinary",
472
+ "cloudinary-core": "storage/cloudinary",
473
+ "next-cloudinary": "storage/cloudinary",
474
+ "uploadthing": "storage/uploadthing",
475
+ "@uploadthing/react": "storage/uploadthing",
476
+
477
+ "pusher": "realtime/pusher",
478
+ "pusher-js": "realtime/pusher",
479
+ "pusher-websocket-react-native": "realtime/pusher",
480
+ "laravel-echo": "realtime/pusher",
481
+ "ably": "realtime/ably"
482
+ }
483
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "slug": "testing/jest",
3
+ "importPatterns": [
4
+ "from\\s+[\"']@jest/globals[\"']"
5
+ ],
6
+ "apiPatterns": [
7
+ "\\bjest\\.(fn|mock|spyOn)\\("
8
+ ],
9
+ "configFilePatterns": [
10
+ "(^|/)jest\\.config\\.(js|ts|cjs|mjs|json)$"
11
+ ],
12
+ "fixtures": {
13
+ "positive": [
14
+ { "path": "jest.config.ts", "diff": "export default { testEnvironment: \"node\" };" },
15
+ { "path": "src/foo.test.ts", "diff": "import { describe, it, expect, jest } from \"@jest/globals\";\nconst spy = jest.spyOn(console, \"log\");\njest.mock(\"./foo\");\nconst mockFn = jest.fn();\nexpect(result).toMatchSnapshot();" }
16
+ ],
17
+ "negative": [
18
+ { "path": "README.md", "diff": "We currently use jest for unit tests but are evaluating a migration to a faster runner." },
19
+ {
20
+ "path": "src/foo.test.ts",
21
+ "diff": "import { describe, it, expect } from \"vitest\";\nit(\"matches the snapshot\", () => {\n expect(result).toMatchSnapshot();\n});"
22
+ }
23
+ ]
24
+ }
25
+ }
package/taxonomy.json ADDED
@@ -0,0 +1,119 @@
1
+ {
2
+ "$comment": "Closed public vocabulary of skill slugs. This file is the ONLY source of valid values for detected_skills[].slug in the bundle: a slug not listed here makes the bundle invalid. Detection maps signatures/*.json matches to these slugs — deterministically, locally, with zero network calls. Adding a slug requires a PR to this file (and a signature definition); slugs are never hardcoded in the CLI. Placeholder set, to be expanded.",
3
+ "version": "1.2.0",
4
+ "skills": [
5
+ { "slug": "auth/supabase-auth", "label": "Supabase Auth" },
6
+ { "slug": "auth/nextauth", "label": "NextAuth / Auth.js" },
7
+ { "slug": "auth/auth0", "label": "Auth0" },
8
+ { "slug": "auth/clerk", "label": "Clerk" },
9
+ { "slug": "auth/oauth-oidc", "label": "OAuth 2.0 / OIDC" },
10
+ { "slug": "auth/jwt", "label": "JWT session handling" },
11
+ { "slug": "auth/lucia", "label": "Lucia Auth" },
12
+ { "slug": "auth/passport", "label": "Passport.js" },
13
+ { "slug": "auth/firebase-auth", "label": "Firebase Authentication" },
14
+ { "slug": "auth/workos", "label": "WorkOS" },
15
+ { "slug": "auth/devise", "label": "Devise (Rails)" },
16
+ { "slug": "payments/stripe", "label": "Stripe" },
17
+ { "slug": "payments/paypal", "label": "PayPal" },
18
+ { "slug": "payments/mercadopago", "label": "Mercado Pago" },
19
+ { "slug": "payments/lemonsqueezy", "label": "Lemon Squeezy" },
20
+ { "slug": "payments/paddle", "label": "Paddle" },
21
+ { "slug": "ai/openai-api", "label": "OpenAI API" },
22
+ { "slug": "ai/anthropic-api", "label": "Anthropic API" },
23
+ { "slug": "ai/langchain", "label": "LangChain" },
24
+ { "slug": "ai/langgraph", "label": "LangGraph" },
25
+ { "slug": "ai/llamaindex", "label": "LlamaIndex" },
26
+ { "slug": "ai/vercel-ai-sdk", "label": "Vercel AI SDK" },
27
+ { "slug": "ai/whisper", "label": "Whisper (speech-to-text)" },
28
+ { "slug": "ai/vector-search", "label": "Vector search / embeddings" },
29
+ { "slug": "ai/huggingface", "label": "Hugging Face Transformers" },
30
+ { "slug": "ai/ollama", "label": "Ollama" },
31
+ { "slug": "ai/replicate", "label": "Replicate" },
32
+ { "slug": "ai/groq", "label": "Groq" },
33
+ { "slug": "ai/gemini", "label": "Google Gemini API" },
34
+ { "slug": "ai/cohere", "label": "Cohere" },
35
+ { "slug": "ai/pinecone", "label": "Pinecone" },
36
+ { "slug": "ai/weaviate", "label": "Weaviate" },
37
+ { "slug": "ai/chroma", "label": "Chroma" },
38
+ { "slug": "ai/mistral", "label": "Mistral AI" },
39
+ { "slug": "db/postgres", "label": "PostgreSQL" },
40
+ { "slug": "db/prisma", "label": "Prisma ORM" },
41
+ { "slug": "db/drizzle", "label": "Drizzle ORM" },
42
+ { "slug": "db/mongodb", "label": "MongoDB" },
43
+ { "slug": "db/redis", "label": "Redis" },
44
+ { "slug": "db/supabase", "label": "Supabase (Postgres client)" },
45
+ { "slug": "db/mysql", "label": "MySQL" },
46
+ { "slug": "db/sqlite", "label": "SQLite" },
47
+ { "slug": "db/planetscale", "label": "PlanetScale" },
48
+ { "slug": "db/neon", "label": "Neon" },
49
+ { "slug": "db/turso", "label": "Turso" },
50
+ { "slug": "db/typeorm", "label": "TypeORM" },
51
+ { "slug": "db/sequelize", "label": "Sequelize" },
52
+ { "slug": "db/knex", "label": "Knex.js" },
53
+ { "slug": "db/activerecord", "label": "Active Record (Rails)" },
54
+ { "slug": "db/eloquent", "label": "Eloquent (Laravel)" },
55
+ { "slug": "db/sqlalchemy", "label": "SQLAlchemy" },
56
+ { "slug": "db/gorm", "label": "GORM (Go)" },
57
+ { "slug": "frontend/react", "label": "React" },
58
+ { "slug": "frontend/nextjs", "label": "Next.js" },
59
+ { "slug": "frontend/vue", "label": "Vue" },
60
+ { "slug": "frontend/tailwind", "label": "Tailwind CSS" },
61
+ { "slug": "frontend/svelte", "label": "Svelte" },
62
+ { "slug": "frontend/angular", "label": "Angular" },
63
+ { "slug": "frontend/astro", "label": "Astro" },
64
+ { "slug": "frontend/remix", "label": "Remix" },
65
+ { "slug": "frontend/react-native", "label": "React Native / Expo" },
66
+ { "slug": "frontend/zustand", "label": "Zustand" },
67
+ { "slug": "frontend/redux", "label": "Redux" },
68
+ { "slug": "frontend/tanstack-query", "label": "TanStack Query" },
69
+ { "slug": "backend/express", "label": "Express" },
70
+ { "slug": "backend/fastapi", "label": "FastAPI" },
71
+ { "slug": "backend/graphql", "label": "GraphQL" },
72
+ { "slug": "backend/grpc", "label": "gRPC" },
73
+ { "slug": "backend/websockets", "label": "WebSockets" },
74
+ { "slug": "backend/fastify", "label": "Fastify" },
75
+ { "slug": "backend/hono", "label": "Hono" },
76
+ { "slug": "backend/nestjs", "label": "NestJS" },
77
+ { "slug": "backend/django", "label": "Django" },
78
+ { "slug": "backend/flask", "label": "Flask" },
79
+ { "slug": "backend/rails", "label": "Ruby on Rails" },
80
+ { "slug": "backend/laravel", "label": "Laravel" },
81
+ { "slug": "backend/axum", "label": "Axum (Rust)" },
82
+ { "slug": "infra/docker", "label": "Docker" },
83
+ { "slug": "infra/kubernetes", "label": "Kubernetes" },
84
+ { "slug": "infra/terraform", "label": "Terraform" },
85
+ { "slug": "infra/github-actions", "label": "GitHub Actions" },
86
+ { "slug": "infra/aws-sdk", "label": "AWS SDK" },
87
+ { "slug": "infra/pulumi", "label": "Pulumi" },
88
+ { "slug": "infra/ansible", "label": "Ansible" },
89
+ { "slug": "infra/cloudflare-workers", "label": "Cloudflare Workers" },
90
+ { "slug": "queues/trigger-dev", "label": "Trigger.dev" },
91
+ { "slug": "queues/bullmq", "label": "BullMQ" },
92
+ { "slug": "queues/rabbitmq", "label": "RabbitMQ" },
93
+ { "slug": "queues/celery", "label": "Celery" },
94
+ { "slug": "queues/sidekiq", "label": "Sidekiq" },
95
+ { "slug": "queues/kafka", "label": "Kafka" },
96
+ { "slug": "queues/sqs", "label": "AWS SQS" },
97
+ { "slug": "observability/sentry", "label": "Sentry" },
98
+ { "slug": "observability/posthog", "label": "PostHog" },
99
+ { "slug": "observability/datadog", "label": "Datadog" },
100
+ { "slug": "observability/opentelemetry", "label": "OpenTelemetry" },
101
+ { "slug": "observability/logrocket", "label": "LogRocket" },
102
+ { "slug": "testing/jest", "label": "Jest" },
103
+ { "slug": "testing/vitest", "label": "Vitest" },
104
+ { "slug": "testing/playwright", "label": "Playwright" },
105
+ { "slug": "testing/cypress", "label": "Cypress" },
106
+ { "slug": "testing/pytest", "label": "pytest" },
107
+ { "slug": "testing/rspec", "label": "RSpec" },
108
+ { "slug": "testing/testing-library", "label": "Testing Library" },
109
+ { "slug": "data/pandas", "label": "pandas" },
110
+ { "slug": "email/resend", "label": "Resend" },
111
+ { "slug": "email/sendgrid", "label": "SendGrid" },
112
+ { "slug": "email/nodemailer", "label": "Nodemailer" },
113
+ { "slug": "storage/s3", "label": "Amazon S3" },
114
+ { "slug": "storage/cloudinary", "label": "Cloudinary" },
115
+ { "slug": "storage/uploadthing", "label": "UploadThing" },
116
+ { "slug": "realtime/pusher", "label": "Pusher" },
117
+ { "slug": "realtime/ably", "label": "Ably" }
118
+ ]
119
+ }