lurqrun 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/core/types.ts","../src/core/constants.ts","../src/core/config.ts","../src/core/logger.ts","../src/db/schema.ts","../src/db/client.ts","../src/core/http.ts","../src/ingestion/sources/npmRegistry.ts","../src/ingestion/sources/npmDownloads.ts","../src/ingestion/sources/github.ts","../src/ingestion/sources/depsDev.ts","../src/ingestion/sources/bundlephobia.ts","../src/ingestion/sources/index.ts","../src/ingestion/sources/githubReadme.ts","../src/ingestion/summarize.ts","../src/ingestion/collect.ts","../src/scoring/weights.ts","../src/scoring/score.ts","../src/scoring/index.ts","../src/search/embeddings.ts","../src/db/packages.ts","../src/core/concurrency.ts","../src/pipeline/sync.ts","../src/pipeline/single.ts","../src/search/categoryInference.ts","../src/search/recommend.ts","../src/mcp/handlers.ts","../src/mcp/diagram.ts","../src/mcp/server.ts","../src/pipeline/index.ts","../src/cli/format.ts","../src/cli/commands.ts","../src/core/paths.ts","../src/cli/installSkill.ts","../src/db/seed.ts","../src/db/migrate.ts","../src/index.ts","../src/cli/index.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","/**\n * Shared domain types and the v1 category taxonomy (§8.3).\n * These are the stable contracts the rest of the system builds on.\n */\n\n/** Category taxonomy for the JS/TS web stack (§8.3). `other` is the fallback. */\nexport const CATEGORIES = [\n 'framework',\n 'meta-framework',\n 'state-management',\n 'routing',\n 'orm',\n 'database-client',\n 'ui-component-library',\n 'styling',\n 'forms',\n 'validation',\n 'data-fetching',\n 'http-client',\n 'auth',\n 'testing',\n 'build-tool',\n 'bundler',\n 'linting',\n 'date-time',\n 'animation',\n 'charts',\n 'i18n',\n 'utility',\n 'other',\n] as const;\n\nexport type Category = (typeof CATEGORIES)[number];\n\nexport function isCategory(value: string): value is Category {\n return (CATEGORIES as readonly string[]).includes(value);\n}\n\n/**\n * Categories for which bundle size is meaningful and Bundlephobia is consulted\n * (§9.5). Backend-only categories get a null bundle size, and their efficiency\n * weight is redistributed (§10, see scoring).\n */\nexport const FRONTEND_CATEGORIES = [\n 'ui-component-library',\n 'styling',\n 'state-management',\n 'forms',\n 'validation',\n 'data-fetching',\n 'charts',\n 'animation',\n 'date-time',\n 'utility',\n] as const;\n\nexport function isFrontendCategory(category: Category | null | undefined): boolean {\n return category != null && (FRONTEND_CATEGORIES as readonly string[]).includes(category);\n}\n\n/** Evidence-trustworthiness label, independent of the numeric score (§10). */\nexport type Confidence = 'proven' | 'emerging' | 'unproven';\n\nexport type Runtime = 'browser' | 'node' | 'both';\n\nexport type AdvisorySeverity = 'critical' | 'high' | 'moderate' | 'low' | 'info';\n\nexport interface Advisory {\n id: string;\n severity: AdvisorySeverity;\n summary: string;\n}\n\n/** Sub-scores composing the health score (§10). `efficiency` is null when not\n * size-based (backend categories) — its weight is redistributed. */\nexport interface ScoreBreakdown {\n maintenance: number;\n adoption: number;\n reliability: number;\n efficiency: number | null;\n}\n\n/**\n * Structured usage guide generated at ingest (product refinement: lurq explains,\n * not just ranks). Grounded in the package README/description — never fabricated.\n * Exact current API specifics are deferred to Context7 via `context7Hint`.\n */\nexport interface UsageGuide {\n whatItIs: string;\n whenToUse: string;\n whenNotToUse?: string;\n whereItFits: string;\n howToWireIn?: string;\n context7Hint?: string;\n}\n\n/** A single recommendation candidate (§12.3.1). Intentionally compact. */\nexport interface Candidate {\n name: string;\n category: Category | null;\n healthScore: number;\n confidence: Confidence;\n why: string;\n latestVersion: string | null;\n weeklyDownloads: number | null;\n lastReleaseAt: string | null;\n repoUrl: string | null;\n}\n\n/** Full evidence read for one package (§12.3.2). */\nexport interface EvaluateOutput {\n dataAsOf: string;\n stale?: boolean;\n name: string;\n category: Category | null;\n healthScore: number;\n confidence: Confidence;\n scoreBreakdown: ScoreBreakdown;\n latestVersion: string | null;\n lastReleaseAt: string | null;\n weeklyDownloads: number | null;\n downloadGrowth90d: number | null;\n dependentsCount: number | null;\n scorecard: number | null;\n bundleMinGzipKb: number | null;\n deprecated: boolean;\n archived: boolean;\n advisories: Advisory[];\n summary: string | null;\n usageGuide: UsageGuide | null;\n repoUrl: string | null;\n}\n\n/** `verify` output (§12.3.4). */\nexport interface VerifyOutput {\n exists: boolean;\n tracked: boolean;\n deprecated: boolean;\n archived: boolean;\n latestVersion: string | null;\n weeklyDownloads: number | null;\n riskFlags: string[];\n confidence: Confidence | null;\n advisoryCount: number;\n}\n","/** Static identifiers shared across the CLI and MCP server. */\nexport const SERVER_NAME = 'lurq';\n/** Published npm package name (the CLI command and MCP nickname stay `lurq`).\n * Keep in sync with package.json \"name\". */\nexport const PACKAGE_NAME = 'lurqrun';\n/** Keep in sync with package.json \"version\". */\nexport const VERSION = '0.0.1';\n\n/** Embedding vector dimensionality (OpenAI text-embedding-3-small). The local\n * fallback embedder produces vectors of the same length so the DB column and\n * pgvector index never need to change. */\nexport const EMBEDDING_DIM = 1536;\n\n/** A package row is flagged `stale: true` in tool responses once its data is\n * older than this (§17). */\nexport const STALENESS_DAYS = 7;\n\nconst HOUR = 60 * 60 * 1000;\nconst DAY = 24 * HOUR;\n\n/** Per-source persistent-cache TTLs (§17). */\nexport const CACHE_TTL = {\n npmRegistry: 6 * HOUR,\n npmDownloads: 12 * HOUR,\n github: 12 * HOUR,\n depsDev: 24 * HOUR,\n bundlephobia: 7 * DAY,\n} as const;\n","/**\n * Environment configuration (§15). Validated with zod. Most vars are optional\n * so the CLI can run partially (e.g. `lurq --help`) without a full setup;\n * commands that need a specific var call `requireConfig` to fail fast with a\n * clear message.\n */\nimport { config as dotenvConfig } from 'dotenv';\nimport { z } from 'zod';\n\nlet envLoaded = false;\n\n/** Load `.env` into process.env exactly once. Safe to call repeatedly. */\nexport function loadEnv(): void {\n if (envLoaded) return;\n dotenvConfig();\n envLoaded = true;\n}\n\nconst EnvSchema = z.object({\n DATABASE_URL: z.string().min(1).optional(),\n GITHUB_TOKEN: z.string().min(1).optional(),\n\n EMBEDDING_PROVIDER: z.enum(['openai', 'local']).default('openai'),\n EMBEDDING_API_KEY: z.string().min(1).optional(),\n EMBEDDING_MODEL: z.string().min(1).default('text-embedding-3-small'),\n\n SUMMARY_PROVIDER: z.enum(['openai', 'none']).default('openai'),\n SUMMARY_API_KEY: z.string().min(1).optional(),\n SUMMARY_MODEL: z.string().min(1).default('gpt-4o-mini'),\n\n LURQ_SYNC_CONCURRENCY: z.coerce.number().int().positive().max(50).default(5),\n LOG_LEVEL: z.enum(['error', 'warn', 'info', 'debug']).default('info'),\n});\n\nexport type Config = z.infer<typeof EnvSchema>;\n\nexport class ConfigError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ConfigError';\n }\n}\n\nlet cached: Config | undefined;\n\n/** Parse + validate the environment. Throws ConfigError on malformed values. */\nexport function getConfig(): Config {\n if (cached) return cached;\n loadEnv();\n const parsed = EnvSchema.safeParse(process.env);\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => ` - ${i.path.join('.')}: ${i.message}`)\n .join('\\n');\n throw new ConfigError(`Invalid environment configuration:\\n${issues}`);\n }\n cached = parsed.data;\n return cached;\n}\n\n/** For tests: clear the memoized config so a fresh getConfig() re-reads\n * process.env. Does not force a `.env` reload (loadEnv stays idempotent). */\nexport function resetConfigCache(): void {\n cached = undefined;\n}\n\n/**\n * Return the config but fail fast if any of the named required keys are absent.\n * Use in command handlers that genuinely need them (e.g. sync needs DATABASE_URL).\n */\nexport function requireConfig<K extends keyof Config>(keys: K[]): Config {\n const config = getConfig();\n const missing = keys.filter((k) => config[k] === undefined || config[k] === '');\n if (missing.length > 0) {\n throw new ConfigError(\n `Missing required environment variable(s): ${missing.join(', ')}.\\n` +\n `See .env.example for setup. Tip: copy it to .env and fill in the values.`,\n );\n }\n return config;\n}\n","/**\n * Minimal leveled logger.\n *\n * IMPORTANT: all output goes to **stderr**. The MCP server communicates over\n * stdio (stdout is the protocol channel), so anything written to stdout would\n * corrupt the JSON-RPC stream. Never log to stdout.\n */\n\nconst LEVELS = { error: 0, warn: 1, info: 2, debug: 3 } as const;\nexport type LogLevel = keyof typeof LEVELS;\n\nfunction currentLevel(): number {\n const raw = process.env.LOG_LEVEL as LogLevel | undefined;\n return raw && raw in LEVELS ? LEVELS[raw] : LEVELS.info;\n}\n\nfunction emit(level: LogLevel, args: unknown[]): void {\n if (LEVELS[level] > currentLevel()) return;\n const parts = args.map((a) =>\n typeof a === 'string' ? a : a instanceof Error ? (a.stack ?? a.message) : safeStringify(a),\n );\n process.stderr.write(`[lurq] ${level.toUpperCase()} ${parts.join(' ')}\\n`);\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nexport const logger = {\n error: (...args: unknown[]) => emit('error', args),\n warn: (...args: unknown[]) => emit('warn', args),\n info: (...args: unknown[]) => emit('info', args),\n debug: (...args: unknown[]) => emit('debug', args),\n};\n","/**\n * Drizzle schema (§8). One denormalized `packages` table feeds all reads (§8.2),\n * plus `sync_runs` (ingestion audit) and `seed_packages` (curated bootstrap list).\n *\n * The `vector` extension must exist before these migrations apply — `db migrate`\n * runs `CREATE EXTENSION IF NOT EXISTS vector` first (pgvector is not created\n * automatically by Drizzle).\n */\nimport {\n bigint,\n boolean,\n index,\n integer,\n jsonb,\n pgTable,\n real,\n serial,\n text,\n timestamp,\n vector,\n} from 'drizzle-orm/pg-core';\nimport { EMBEDDING_DIM } from '../core/constants';\nimport type { Advisory, Category, Confidence, ScoreBreakdown, UsageGuide } from '../core/types';\n\nconst ts = (name: string) => timestamp(name, { withTimezone: true, mode: 'date' });\n\n/** One row per tracked npm package. */\nexport const packages = pgTable(\n 'packages',\n {\n id: serial('id').primaryKey(),\n name: text('name').notNull().unique(),\n ecosystem: text('ecosystem').notNull().default('npm'),\n\n // Classification + descriptive text\n category: text('category').$type<Category>(),\n description: text('description'),\n summary: text('summary'),\n repoUrl: text('repo_url'),\n homepage: text('homepage'),\n latestVersion: text('latest_version'),\n license: text('license'),\n\n // Lifecycle flags\n deprecated: boolean('deprecated').notNull().default(false),\n archived: boolean('archived').notNull().default(false),\n\n // Age / maintenance signals\n firstPublishedAt: ts('first_published_at'),\n lastReleaseAt: ts('last_release_at'),\n\n // Adoption signals\n weeklyDownloads: bigint('weekly_downloads', { mode: 'number' }),\n downloadGrowth90d: real('download_growth_90d'),\n dependentsCount: integer('dependents_count'),\n stars: integer('stars'),\n openIssues: integer('open_issues'),\n closedIssues: integer('closed_issues'),\n\n // Reliability / efficiency signals\n scorecard: real('scorecard'),\n bundleMinGzipKb: real('bundle_min_gzip_kb'),\n advisories: jsonb('advisories').$type<Advisory[]>(),\n\n // Computed outputs\n healthScore: integer('health_score'),\n confidence: text('confidence').$type<Confidence>(),\n scoreBreakdown: jsonb('score_breakdown').$type<ScoreBreakdown>(),\n usageGuide: jsonb('usage_guide').$type<UsageGuide>(),\n embedding: vector('embedding', { dimensions: EMBEDDING_DIM }),\n\n // Freshness + bookkeeping\n dataAsOf: timestamp('data_as_of', { withTimezone: true, mode: 'date' }),\n createdAt: ts('created_at').notNull().defaultNow(),\n updatedAt: ts('updated_at').notNull().defaultNow(),\n },\n (table) => [\n index('packages_category_idx').on(table.category),\n index('packages_health_score_idx').on(table.healthScore),\n // pgvector HNSW index for cosine similarity search (§11).\n index('packages_embedding_idx').using('hnsw', table.embedding.op('vector_cosine_ops')),\n ],\n);\n\n/** Ingestion audit trail (§8.1). */\nexport const syncRuns = pgTable('sync_runs', {\n id: serial('id').primaryKey(),\n startedAt: ts('started_at').notNull().defaultNow(),\n finishedAt: ts('finished_at'),\n packagesSeen: integer('packages_seen').notNull().default(0),\n packagesUpdated: integer('packages_updated').notNull().default(0),\n errors: jsonb('errors').$type<SyncError[]>().notNull().default([]),\n status: text('status').$type<SyncStatus>().notNull().default('running'),\n});\n\n/** Curated v1 seed list (§16), loaded from seed.json. */\nexport const seedPackages = pgTable('seed_packages', {\n name: text('name').primaryKey(),\n category: text('category').$type<Category>(),\n addedAt: ts('added_at').notNull().defaultNow(),\n});\n\nexport type SyncStatus = 'running' | 'success' | 'partial' | 'failed';\n\nexport interface SyncError {\n package: string;\n source: string;\n message: string;\n}\n\nexport type PackageRow = typeof packages.$inferSelect;\nexport type NewPackageRow = typeof packages.$inferInsert;\nexport type SeedPackageRow = typeof seedPackages.$inferSelect;\nexport type SyncRunRow = typeof syncRuns.$inferSelect;\n","/**\n * Database client factory. Uses postgres.js + Drizzle. Callers own the lifecycle:\n * create, use, then `await close()` (CLI commands are short-lived processes).\n */\nimport { drizzle, type PostgresJsDatabase } from 'drizzle-orm/postgres-js';\nimport postgres from 'postgres';\nimport { requireConfig } from '../core/config';\nimport * as schema from './schema';\n\nexport type Database = PostgresJsDatabase<typeof schema>;\n\nexport interface DbHandle {\n db: Database;\n /** Underlying postgres.js client, for raw SQL (e.g. CREATE EXTENSION). */\n sql: postgres.Sql;\n /** Close the connection pool. Always call when done. */\n close: () => Promise<void>;\n}\n\nexport function createDb(opts: { max?: number } = {}): DbHandle {\n const { DATABASE_URL } = requireConfig(['DATABASE_URL']);\n const sql = postgres(DATABASE_URL!, { max: opts.max ?? 10, onnotice: () => {} });\n const db = drizzle(sql, { schema });\n return { db, sql, close: () => sql.end() };\n}\n\nexport { schema };\n","/**\n * Shared HTTP layer (§17). One wrapper for every external call:\n * - per-host rate limiting (max concurrency + minimum gap between starts),\n * - exponential backoff on 429 / 5xx (respecting Retry-After),\n * - in-run (memory) cache + persistent on-disk cache with per-source TTLs.\n *\n * Source clients pass a `ttlMs` (the per-source TTL from §17) and a `host`\n * bucket. `ttlMs: 0` disables caching (used for liveness checks like `verify`).\n */\nimport { createHash } from 'node:crypto';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { logger } from './logger';\n\nexport class HttpError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly url: string,\n ) {\n super(message);\n this.name = 'HttpError';\n }\n}\n\nexport interface HttpOptions {\n /** Rate-limit bucket key, usually the hostname. */\n host: string;\n /** Persistent cache TTL in ms. 0 disables read+write caching. */\n ttlMs: number;\n method?: 'GET' | 'POST';\n headers?: Record<string, string>;\n body?: string;\n accept?: 'json' | 'text';\n timeoutMs?: number;\n retries?: number;\n /** Override the cache key (e.g. to keep auth tokens out of the key). */\n cacheKey?: string;\n /** Injected for tests. Defaults to global fetch. */\n fetchImpl?: typeof fetch;\n}\n\nexport interface HttpResponse<T> {\n status: number;\n data: T;\n fromCache: boolean;\n}\n\n// ── Per-host rate limiting ──────────────────────────────────────────────────\n\ninterface HostConfig {\n maxConcurrent: number;\n minIntervalMs: number;\n}\n\nconst DEFAULT_HOST_CONFIG: HostConfig = { maxConcurrent: 6, minIntervalMs: 0 };\n\nconst HOST_CONFIG: Record<string, HostConfig> = {\n 'api.github.com': { maxConcurrent: 4, minIntervalMs: 50 },\n 'registry.npmjs.org': { maxConcurrent: 4, minIntervalMs: 50 },\n // The downloads API rate-limits aggressively — serialize with a steady gap.\n // Weekly downloads go through the bulk endpoint; only growth hits this often.\n 'api.npmjs.org': { maxConcurrent: 1, minIntervalMs: 250 },\n 'api.deps.dev': { maxConcurrent: 4, minIntervalMs: 40 },\n 'raw.githubusercontent.com': { maxConcurrent: 4, minIntervalMs: 30 },\n // Bundlephobia is slow/flaky — be gentle (§9.5).\n 'bundlephobia.com': { maxConcurrent: 2, minIntervalMs: 200 },\n};\n\nclass HostLimiter {\n private active = 0;\n private nextAvailable = 0;\n private queue: Array<() => void> = [];\n\n constructor(private readonly config: HostConfig) {}\n\n async acquire(): Promise<void> {\n if (this.active >= this.config.maxConcurrent) {\n await new Promise<void>((resolve) => this.queue.push(resolve));\n }\n this.active++;\n const now = Date.now();\n const wait = Math.max(0, this.nextAvailable - now);\n this.nextAvailable = Math.max(now, this.nextAvailable) + this.config.minIntervalMs;\n if (wait > 0) await delay(wait);\n }\n\n release(): void {\n this.active--;\n const next = this.queue.shift();\n if (next) next();\n }\n}\n\nconst limiters = new Map<string, HostLimiter>();\n\nfunction limiterFor(host: string): HostLimiter {\n let limiter = limiters.get(host);\n if (!limiter) {\n limiter = new HostLimiter(HOST_CONFIG[host] ?? DEFAULT_HOST_CONFIG);\n limiters.set(host, limiter);\n }\n return limiter;\n}\n\n// ── Caching ─────────────────────────────────────────────────────────────────\n\ninterface CacheEntry {\n fetchedAt: number;\n status: number;\n body: string;\n}\n\nconst memoryCache = new Map<string, CacheEntry>();\n\n/** When true, cache reads are skipped (writes still happen). Used by `sync --full`. */\nlet bypassCacheRead = false;\n\n/** Force fresh fetches (ignore cache TTLs) while still refreshing the cache. */\nexport function setCacheBypassRead(value: boolean): void {\n bypassCacheRead = value;\n}\n\nfunction cacheDir(): string {\n return process.env.LURQ_CACHE_DIR ?? join(homedir(), '.cache', 'lurq', 'http');\n}\n\nfunction cacheFile(key: string): string {\n const hash = createHash('sha256').update(key).digest('hex');\n return join(cacheDir(), `${hash}.json`);\n}\n\nasync function readCache(key: string, ttlMs: number): Promise<CacheEntry | undefined> {\n const now = Date.now();\n const mem = memoryCache.get(key);\n if (mem && now - mem.fetchedAt < ttlMs) return mem;\n\n const file = cacheFile(key);\n if (!existsSync(file)) return undefined;\n try {\n const entry = JSON.parse(await readFile(file, 'utf8')) as CacheEntry;\n if (now - entry.fetchedAt < ttlMs) {\n memoryCache.set(key, entry);\n return entry;\n }\n } catch {\n /* corrupt cache file — ignore and refetch */\n }\n return undefined;\n}\n\nasync function writeCache(key: string, entry: CacheEntry): Promise<void> {\n memoryCache.set(key, entry);\n const file = cacheFile(key);\n try {\n await mkdir(dirname(file), { recursive: true });\n await writeFile(file, JSON.stringify(entry), 'utf8');\n } catch (err) {\n logger.debug(`http cache write failed: ${(err as Error).message}`);\n }\n}\n\n// ── Core request ────────────────────────────────────────────────────────────\n\nconst RETRYABLE = new Set([429, 500, 502, 503, 504]);\n\nexport async function httpRequest<T = unknown>(\n url: string,\n opts: HttpOptions,\n): Promise<HttpResponse<T>> {\n const {\n host,\n ttlMs,\n method = 'GET',\n headers = {},\n body,\n accept = 'json',\n timeoutMs = 15_000,\n retries = 3,\n fetchImpl = fetch,\n } = opts;\n const key = opts.cacheKey ?? `${method} ${url} ${body ?? ''}`;\n\n if (ttlMs > 0 && !bypassCacheRead) {\n const cached = await readCache(key, ttlMs);\n if (cached) {\n return { status: cached.status, data: decode<T>(cached.body, accept), fromCache: true };\n }\n }\n\n const limiter = limiterFor(host);\n let lastErr: unknown;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n await limiter.acquire();\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, { method, headers, body, signal: controller.signal });\n const text = await res.text();\n\n if (res.ok) {\n if (ttlMs > 0) await writeCache(key, { fetchedAt: Date.now(), status: res.status, body: text });\n return { status: res.status, data: decode<T>(text, accept), fromCache: false };\n }\n\n // Non-2xx\n if (RETRYABLE.has(res.status) && attempt < retries) {\n const retryAfter = parseRetryAfter(res.headers.get('retry-after'));\n await delay(retryAfter ?? backoff(attempt));\n lastErr = new HttpError(`HTTP ${res.status} for ${url}`, res.status, url);\n continue;\n }\n throw new HttpError(`HTTP ${res.status} for ${url}`, res.status, url);\n } catch (err) {\n lastErr = err;\n const isAbort = err instanceof Error && err.name === 'AbortError';\n const isHttp = err instanceof HttpError;\n // Retry network/timeout errors; don't retry non-retryable HTTP statuses.\n if (isHttp && !RETRYABLE.has(err.status)) throw err;\n if (attempt < retries) {\n await delay(backoff(attempt));\n continue;\n }\n if (isAbort) throw new HttpError(`Timeout after ${timeoutMs}ms for ${url}`, 0, url);\n } finally {\n clearTimeout(timer);\n limiter.release();\n }\n }\n throw lastErr instanceof Error ? lastErr : new HttpError(`Request failed for ${url}`, 0, url);\n}\n\nexport async function httpGetJson<T = unknown>(\n url: string,\n opts: Omit<HttpOptions, 'accept' | 'method'>,\n): Promise<HttpResponse<T>> {\n return httpRequest<T>(url, { ...opts, method: 'GET', accept: 'json' });\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction decode<T>(text: string, accept: 'json' | 'text'): T {\n if (accept === 'text') return text as unknown as T;\n return (text ? JSON.parse(text) : null) as T;\n}\n\nfunction backoff(attempt: number): number {\n const base = 500 * 2 ** attempt;\n return base + Math.floor(((attempt * 137) % 100) * 3); // small deterministic jitter\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n if (!value) return undefined;\n const seconds = Number(value);\n if (!Number.isNaN(seconds)) return seconds * 1000;\n const date = Date.parse(value);\n return Number.isNaN(date) ? undefined : Math.max(0, date - Date.now());\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/** Test helper: clear the in-memory cache and per-host limiters. */\nexport function __resetHttpStateForTests(): void {\n memoryCache.clear();\n limiters.clear();\n}\n","/**\n * npm registry client (§9.1). Base metadata: version, description, license,\n * repository, publish times, deprecation, maintainers, README.\n */\nimport { CACHE_TTL } from '../../core/constants';\nimport { httpGetJson } from '../../core/http';\nimport type { NpmRegistryData } from '../types';\n\nconst HOST = 'registry.npmjs.org';\n\n/** Encode a package name for a registry URL (scoped names need `/` → `%2F`). */\nexport function encodeNpmName(name: string): string {\n return name.startsWith('@') ? name.replace('/', '%2F') : name;\n}\n\n/** Extract `{ owner, repo }` from any GitHub repository URL form. */\nexport function parseGithubRepo(\n url: string | null | undefined,\n): { owner: string; repo: string } | null {\n if (!url) return null;\n const match = url.match(/github\\.com[/:]([^/]+)\\/([^/#?]+?)(?:\\.git)?(?:[/#?].*)?$/i);\n if (!match) return null;\n const owner = match[1];\n const repo = match[2];\n if (!owner || !repo) return null;\n return { owner, repo };\n}\n\nfunction normalizeRepoUrl(\n repository: unknown,\n homepage: string | null,\n): { repoUrl: string | null; repo: { owner: string; repo: string } | null } {\n let raw: string | null = null;\n if (typeof repository === 'string') raw = repository;\n else if (repository && typeof repository === 'object' && 'url' in repository) {\n raw = String((repository as { url: unknown }).url);\n }\n const repo = parseGithubRepo(raw) ?? parseGithubRepo(homepage);\n const repoUrl = repo ? `https://github.com/${repo.owner}/${repo.repo}` : (cleanUrl(raw) ?? null);\n return { repoUrl, repo };\n}\n\nfunction cleanUrl(url: string | null): string | null {\n if (!url) return null;\n return url\n .replace(/^git\\+/, '')\n .replace(/^git:\\/\\//, 'https://')\n .replace(/\\.git$/, '');\n}\n\nfunction pickLicense(value: unknown): string | null {\n if (!value) return null;\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && 'type' in value) return String((value as { type: unknown }).type);\n return null;\n}\n\nfunction toDate(value: unknown): Date | null {\n if (typeof value !== 'string') return null;\n const ms = Date.parse(value);\n return Number.isNaN(ms) ? null : new Date(ms);\n}\n\nexport function parseNpmRegistry(json: any): NpmRegistryData {\n const latest: string | null = json?.['dist-tags']?.latest ?? null;\n const latestManifest = latest ? (json?.versions?.[latest] ?? {}) : {};\n const time = json?.time ?? {};\n\n const repository = json?.repository ?? latestManifest?.repository;\n const homepage = json?.homepage ?? latestManifest?.homepage ?? null;\n const { repoUrl, repo } = normalizeRepoUrl(repository, homepage);\n\n const deprecated = Boolean(latestManifest?.deprecated ?? json?.deprecated);\n const maintainers = Array.isArray(json?.maintainers) ? json.maintainers.length : null;\n\n return {\n name: json?.name ?? '',\n description: json?.description ?? latestManifest?.description ?? null,\n latestVersion: latest,\n license: pickLicense(json?.license ?? latestManifest?.license),\n homepage,\n repo,\n repoUrl,\n firstPublishedAt: toDate(time?.created),\n lastReleaseAt: toDate(latest ? time?.[latest] : null) ?? toDate(time?.modified),\n deprecated,\n maintainersCount: maintainers,\n readme: typeof json?.readme === 'string' ? json.readme : null,\n };\n}\n\nexport async function fetchNpmRegistry(\n name: string,\n fetchImpl?: typeof fetch,\n): Promise<NpmRegistryData> {\n const url = `https://${HOST}/${encodeNpmName(name)}`;\n const { data } = await httpGetJson<any>(url, {\n host: HOST,\n ttlMs: CACHE_TTL.npmRegistry,\n fetchImpl,\n });\n return parseNpmRegistry(data);\n}\n\n/** Live existence check for `verify` (§12.3.4) — bypasses cache. */\nexport async function npmPackageExists(name: string, fetchImpl?: typeof fetch): Promise<boolean> {\n const url = `https://${HOST}/${encodeNpmName(name)}`;\n try {\n const { status } = await httpGetJson<any>(url, {\n host: HOST,\n ttlMs: 0,\n retries: 1,\n fetchImpl,\n });\n return status === 200;\n } catch (err) {\n if (err && typeof err === 'object' && 'status' in err && (err as any).status === 404) {\n return false;\n }\n throw err;\n }\n}\n","/**\n * npm downloads client (§9.2). Weekly downloads + 90-day growth.\n *\n * Weekly downloads is fetched in BULK at the pipeline level — npm's point API\n * accepts up to 128 comma-separated packages per call, which avoids the harsh\n * rate-limiting that per-package bursts trigger. The range (growth) API has no\n * bulk form, so growth is a per-package best-effort secondary signal.\n *\n * Bulk does not support scoped (@scope/name) packages; those are fetched singly.\n */\nimport { CACHE_TTL } from '../../core/constants';\nimport { httpGetJson, HttpError } from '../../core/http';\nimport type { NpmDownloadsData } from '../types';\n\nconst HOST = 'api.npmjs.org';\nconst BULK_CHUNK = 128;\n\nexport function parseWeeklyDownloads(json: any): number | null {\n const value = json?.downloads;\n return typeof value === 'number' ? value : null;\n}\n\ninterface RangePoint {\n day: string;\n downloads: number;\n}\n\n/** Compute the 90d growth fraction from a daily-downloads range. */\nexport function parseDownloadGrowth(json: any): number | null {\n const points: RangePoint[] = Array.isArray(json?.downloads) ? json.downloads : [];\n if (points.length < 60) return null;\n const tail = points.slice(-60);\n const prior = tail.slice(0, 30);\n const recent = tail.slice(30);\n const sum = (arr: RangePoint[]) => arr.reduce((acc, p) => acc + (p.downloads || 0), 0);\n const priorAvg = sum(prior) / prior.length;\n const recentAvg = sum(recent) / recent.length;\n if (priorAvg <= 0) return recentAvg > 0 ? 1 : 0;\n return (recentAvg - priorAvg) / priorAvg;\n}\n\n/** Format a Date as YYYY-MM-DD (UTC) for the npm range API. */\nfunction ymd(date: Date): string {\n return date.toISOString().slice(0, 10);\n}\n\n/** Build a `start:end` range string covering the last 90 days. */\nexport function last90DayRange(now: Date = new Date()): string {\n const end = now;\n const start = new Date(end.getTime() - 90 * 24 * 60 * 60 * 1000);\n return `${ymd(start)}:${ymd(end)}`;\n}\n\n/** Parse a bulk point response into a name→downloads map (handles single + multi forms). */\nexport function parseBulkWeekly(json: any, requested: string[]): Map<string, number | null> {\n const map = new Map<string, number | null>();\n // A single-package request returns the object directly, not keyed by name.\n if (json && typeof json.downloads === 'number' && typeof json.package === 'string') {\n map.set(json.package, json.downloads);\n return map;\n }\n for (const name of requested) {\n const entry = json?.[name];\n map.set(name, entry && typeof entry.downloads === 'number' ? entry.downloads : null);\n }\n return map;\n}\n\nfunction chunk<T>(items: T[], size: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += size) out.push(items.slice(i, i + size));\n return out;\n}\n\n/** Single-package weekly downloads. 404 → null (no per-package data). */\nexport async function fetchWeeklyDownloads(\n name: string,\n fetchImpl?: typeof fetch,\n): Promise<number | null> {\n try {\n const { data } = await httpGetJson<any>(\n `https://${HOST}/downloads/point/last-week/${name}`,\n { host: HOST, ttlMs: CACHE_TTL.npmDownloads, retries: 5, fetchImpl },\n );\n return parseWeeklyDownloads(data);\n } catch (err) {\n if (err instanceof HttpError && err.status === 404) return null;\n throw err;\n }\n}\n\n/** Per-package 90d growth (best-effort secondary signal). */\nexport async function fetchDownloadGrowth(\n name: string,\n fetchImpl?: typeof fetch,\n): Promise<number | null> {\n try {\n const { data } = await httpGetJson<any>(\n `https://${HOST}/downloads/range/${last90DayRange()}/${name}`,\n { host: HOST, ttlMs: CACHE_TTL.npmDownloads, retries: 3, fetchImpl },\n );\n return parseDownloadGrowth(data);\n } catch {\n return null;\n }\n}\n\n/**\n * Bulk-fetch weekly downloads for many packages. Unscoped packages go through\n * the 128-at-a-time bulk endpoint; scoped packages are fetched individually.\n */\nexport async function fetchBulkWeeklyDownloads(\n names: string[],\n fetchImpl?: typeof fetch,\n): Promise<Map<string, number | null>> {\n const result = new Map<string, number | null>();\n const unscoped = names.filter((n) => !n.startsWith('@'));\n const scoped = names.filter((n) => n.startsWith('@'));\n\n for (const batch of chunk(unscoped, BULK_CHUNK)) {\n try {\n const { data } = await httpGetJson<any>(\n `https://${HOST}/downloads/point/last-week/${batch.join(',')}`,\n { host: HOST, ttlMs: CACHE_TTL.npmDownloads, retries: 5, fetchImpl },\n );\n for (const [k, v] of parseBulkWeekly(data, batch)) result.set(k, v);\n } catch {\n // Leave this batch absent; per-package fallback will retry it.\n }\n }\n\n for (const name of scoped) {\n try {\n result.set(name, await fetchWeeklyDownloads(name, fetchImpl));\n } catch {\n /* leave absent → per-package fallback */\n }\n }\n\n return result;\n}\n\n/** Combined per-package fetch (used when no bulk pre-fetch is available). */\nexport async function fetchNpmDownloads(\n name: string,\n fetchImpl?: typeof fetch,\n): Promise<NpmDownloadsData> {\n const weeklyDownloads = await fetchWeeklyDownloads(name, fetchImpl);\n const downloadGrowth90d = await fetchDownloadGrowth(name, fetchImpl);\n return { weeklyDownloads, downloadGrowth90d };\n}\n","/**\n * GitHub client (§9.3). One GraphQL call per repo fetches stars, issue counts,\n * archived flag, and recent releases (latest date + 12-month cadence).\n * Requires GITHUB_TOKEN; without it, the pipeline skips this source.\n */\nimport { CACHE_TTL } from '../../core/constants';\nimport { httpRequest } from '../../core/http';\nimport type { GithubRepoData } from '../types';\n\nconst HOST = 'api.github.com';\nconst ENDPOINT = `https://${HOST}/graphql`;\n\nconst QUERY = `query($owner:String!, $name:String!) {\n repository(owner:$owner, name:$name) {\n stargazerCount\n isArchived\n openIssues: issues(states:OPEN) { totalCount }\n closedIssues: issues(states:CLOSED) { totalCount }\n releases(first: 50, orderBy: {field: CREATED_AT, direction: DESC}) {\n nodes { createdAt }\n }\n }\n}`;\n\nconst ONE_YEAR_MS = 365 * 24 * 60 * 60 * 1000;\n\nexport function parseGithub(json: any, now: Date = new Date()): GithubRepoData | null {\n const repo = json?.data?.repository;\n if (!repo) return null;\n\n const releaseNodes: { createdAt: string }[] = repo.releases?.nodes ?? [];\n const releaseDates = releaseNodes\n .map((n) => Date.parse(n.createdAt))\n .filter((ms) => !Number.isNaN(ms));\n const cutoff = now.getTime() - ONE_YEAR_MS;\n\n return {\n stars: typeof repo.stargazerCount === 'number' ? repo.stargazerCount : null,\n openIssues: repo.openIssues?.totalCount ?? null,\n closedIssues: repo.closedIssues?.totalCount ?? null,\n archived: Boolean(repo.isArchived),\n lastReleaseAt: releaseDates.length ? new Date(Math.max(...releaseDates)) : null,\n releasesLast12mo: releaseDates.filter((ms) => ms >= cutoff).length,\n };\n}\n\nexport async function fetchGithubRepo(\n owner: string,\n repo: string,\n token: string,\n fetchImpl?: typeof fetch,\n): Promise<GithubRepoData | null> {\n const body = JSON.stringify({ query: QUERY, variables: { owner, name: repo } });\n const { data } = await httpRequest<any>(ENDPOINT, {\n host: HOST,\n ttlMs: CACHE_TTL.github,\n method: 'POST',\n headers: {\n Authorization: `bearer ${token}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'lurq',\n },\n body,\n // Keep the auth token out of the cache key.\n cacheKey: `POST ${ENDPOINT} ${owner}/${repo}`,\n fetchImpl,\n });\n return parseGithub(data);\n}\n","/**\n * deps.dev client (§9.4). Primary source for OpenSSF Scorecard and security\n * advisories.\n * - Scorecard comes from the project endpoint (keyed by github.com/owner/repo).\n * - Advisories: the version endpoint lists advisoryKeys; we fetch each (capped)\n * and derive a severity bucket from its CVSS score.\n */\nimport { CACHE_TTL } from '../../core/constants';\nimport { httpGetJson, type HttpResponse } from '../../core/http';\nimport type { Advisory, AdvisorySeverity } from '../../core/types';\nimport type { DepsDevData } from '../types';\n\nconst HOST = 'api.deps.dev';\nconst MAX_ADVISORIES = 10;\n\nfunction encodeName(name: string): string {\n return encodeURIComponent(name);\n}\n\nexport function severityFromCvss(score: number | null | undefined): AdvisorySeverity {\n if (score == null) return 'moderate';\n if (score >= 9) return 'critical';\n if (score >= 7) return 'high';\n if (score >= 4) return 'moderate';\n if (score > 0) return 'low';\n return 'info';\n}\n\nexport function parseScorecard(json: any): number | null {\n const score = json?.scorecard?.overallScore;\n return typeof score === 'number' ? score : null;\n}\n\nexport function parseAdvisoryKeys(versionJson: any): string[] {\n const keys = versionJson?.advisoryKeys;\n if (!Array.isArray(keys)) return [];\n return keys\n .map((k: any) => (typeof k === 'string' ? k : k?.id))\n .filter((id: unknown): id is string => typeof id === 'string');\n}\n\nexport function parseAdvisoryDetail(json: any): Advisory {\n return {\n id: json?.advisoryKey?.id ?? json?.advisoryKey ?? 'unknown',\n severity: severityFromCvss(json?.cvss3Score),\n summary: json?.title ?? '',\n };\n}\n\nexport async function fetchScorecard(\n owner: string,\n repo: string,\n fetchImpl?: typeof fetch,\n): Promise<number | null> {\n const projectKey = encodeURIComponent(`github.com/${owner}/${repo}`);\n const url = `https://${HOST}/v3/projects/${projectKey}`;\n try {\n const { data } = await httpGetJson<any>(url, {\n host: HOST,\n ttlMs: CACHE_TTL.depsDev,\n fetchImpl,\n });\n return parseScorecard(data);\n } catch {\n return null;\n }\n}\n\nexport async function fetchAdvisories(\n name: string,\n version: string,\n fetchImpl?: typeof fetch,\n): Promise<Advisory[]> {\n const versionUrl = `https://${HOST}/v3/systems/npm/packages/${encodeName(name)}/versions/${encodeURIComponent(version)}`;\n let keys: string[] = [];\n try {\n const { data } = await httpGetJson<any>(versionUrl, {\n host: HOST,\n ttlMs: CACHE_TTL.depsDev,\n fetchImpl,\n });\n keys = parseAdvisoryKeys(data).slice(0, MAX_ADVISORIES);\n } catch {\n return [];\n }\n\n const details = await Promise.allSettled(\n keys.map((key) =>\n httpGetJson<any>(`https://${HOST}/v3/advisories/${encodeURIComponent(key)}`, {\n host: HOST,\n ttlMs: CACHE_TTL.depsDev,\n fetchImpl,\n }),\n ),\n );\n return details\n .filter(\n (d): d is PromiseFulfilledResult<HttpResponse<any>> => d.status === 'fulfilled',\n )\n .map((d) => parseAdvisoryDetail(d.value.data));\n}\n\nexport async function fetchDepsDev(\n name: string,\n version: string | null,\n repo: { owner: string; repo: string } | null,\n fetchImpl?: typeof fetch,\n): Promise<DepsDevData> {\n const [scorecard, advisories] = await Promise.all([\n repo ? fetchScorecard(repo.owner, repo.repo, fetchImpl) : Promise.resolve(null),\n version ? fetchAdvisories(name, version, fetchImpl) : Promise.resolve([]),\n ]);\n return { scorecard, advisories };\n}\n","/**\n * Bundlephobia client (§9.5). Minified + gzipped size for frontend packages.\n * Strictly best-effort: this API is slow and flaky, so failures degrade to null\n * and never block ingestion (per R1 build decision). Cached aggressively (7d).\n */\nimport { CACHE_TTL } from '../../core/constants';\nimport { httpGetJson } from '../../core/http';\nimport { isFrontendCategory, type Category } from '../../core/types';\nimport type { BundlephobiaData } from '../types';\n\nconst HOST = 'bundlephobia.com';\n\nexport function parseBundleSize(json: any): number | null {\n const gzipBytes = json?.gzip;\n if (typeof gzipBytes !== 'number') return null;\n return Math.round((gzipBytes / 1024) * 10) / 10; // KB, 1 decimal\n}\n\n/**\n * Fetch bundle size — only for frontend categories (§9.5); returns null for\n * backend-only packages without making a request.\n */\nexport async function fetchBundlephobia(\n name: string,\n category: Category | null,\n fetchImpl?: typeof fetch,\n): Promise<BundlephobiaData> {\n if (!isFrontendCategory(category)) return { bundleMinGzipKb: null };\n\n const url = `https://${HOST}/api/size?package=${encodeURIComponent(name)}`;\n try {\n const { data } = await httpGetJson<any>(url, {\n host: HOST,\n ttlMs: CACHE_TTL.bundlephobia,\n timeoutMs: 12_000,\n retries: 1,\n fetchImpl,\n });\n return { bundleMinGzipKb: parseBundleSize(data) };\n } catch {\n return { bundleMinGzipKb: null };\n }\n}\n","export * from './npmRegistry';\nexport * from './npmDownloads';\nexport * from './github';\nexport * from './depsDev';\nexport * from './bundlephobia';\n","/**\n * GitHub raw README fallback (§9.6). The npm packument `readme` field is often\n * empty (e.g. zod), so we fetch the repo README directly when needed. Public\n * raw content needs no token.\n */\nimport { CACHE_TTL } from '../../core/constants';\nimport { httpRequest } from '../../core/http';\n\nconst HOST = 'raw.githubusercontent.com';\nconst CANDIDATES = ['README.md', 'readme.md', 'README.markdown', 'README'];\n\nexport async function fetchGithubReadme(\n owner: string,\n repo: string,\n fetchImpl?: typeof fetch,\n): Promise<string | null> {\n for (const file of CANDIDATES) {\n const url = `https://${HOST}/${owner}/${repo}/HEAD/${file}`;\n try {\n const { data } = await httpRequest<string>(url, {\n host: HOST,\n ttlMs: CACHE_TTL.github,\n accept: 'text',\n retries: 0,\n fetchImpl,\n });\n if (data && data.trim().length > 0) return data;\n } catch {\n /* try the next candidate */\n }\n }\n return null;\n}\n","/**\n * Summary + usage-guide generation (§9.6 + R1 explainer refinement).\n *\n * lurq generates its OWN guide grounded in the package's README/description —\n * it never depends on Context7. When a summary LLM key is configured we use it;\n * otherwise we fall back to the npm description + a category-derived guide,\n * fabricating nothing. The exact current API is deferred to Context7 via a hint.\n */\nimport type { Category, UsageGuide } from '../core/types';\nimport { getConfig } from '../core/config';\nimport { httpRequest } from '../core/http';\nimport { logger } from '../core/logger';\nimport { fetchGithubReadme } from './sources/githubReadme';\nimport type { RawPackageSignals } from './types';\n\nexport interface SummaryInput {\n name: string;\n description: string | null;\n category: Category | null;\n readme: string | null;\n repoUrl: string | null;\n}\n\nexport interface SummaryResult {\n summary: string | null;\n usageGuide: UsageGuide;\n}\n\nexport interface SummaryProvider {\n readonly kind: 'openai' | 'fallback';\n generate(input: SummaryInput): Promise<SummaryResult>;\n}\n\n/** Human-readable architectural role per category (generic — lurq has no code context). */\nconst CATEGORY_ROLE: Record<string, string> = {\n framework: 'the core application framework your app is built on',\n 'meta-framework': 'the full-stack framework wrapping routing, rendering, and build',\n 'state-management': 'the client state layer shared across components',\n routing: 'the routing layer mapping URLs to views',\n orm: 'the data-access layer between your code and the database',\n 'database-client': 'the low-level driver that talks to your database',\n 'ui-component-library': 'the prebuilt UI component layer',\n styling: 'the styling layer for your components',\n forms: 'form state and submission handling',\n validation: 'input/schema validation at your boundaries',\n 'data-fetching': 'the server-state/data-fetching layer',\n 'http-client': 'the HTTP request layer for calling APIs',\n auth: 'authentication and session handling',\n testing: 'the test tooling layer',\n 'build-tool': 'the build/dev pipeline',\n bundler: 'the module bundling step',\n linting: 'code-quality and formatting checks',\n 'date-time': 'date and time handling',\n animation: 'UI animation and motion',\n charts: 'data visualization and charts',\n i18n: 'internationalization and localization',\n utility: 'a focused helper you compose into your app',\n other: 'a supporting library in your app',\n};\n\nfunction context7Hint(name: string): string {\n return `For the exact current API of \"${name}\", resolve it via Context7 (resolve-library-id → query-docs).`;\n}\n\n/** Keep text to ~`max` sentences. */\nexport function truncateSentences(text: string, max = 3): string {\n const clean = text.replace(/\\s+/g, ' ').trim();\n if (!clean) return '';\n // Match full sentences, plus a trailing fragment with no terminal punctuation\n // (so descriptions without a period return the whole text, not just the last word).\n const sentences = clean.match(/[^.!?]+[.!?]+|[^.!?]+$/g) ?? [clean];\n return sentences\n .slice(0, max)\n .map((s) => s.trim())\n .join(' ')\n .trim();\n}\n\n// ── Fallback provider (no LLM key) ──────────────────────────────────────────\n\nexport class FallbackSummaryProvider implements SummaryProvider {\n readonly kind = 'fallback' as const;\n\n async generate(input: SummaryInput): Promise<SummaryResult> {\n const description = input.description?.trim() || null;\n const role = CATEGORY_ROLE[input.category ?? 'other'] ?? CATEGORY_ROLE.other!;\n const summary = description ? truncateSentences(description, 3) : null;\n const guide: UsageGuide = {\n whatItIs: description ? truncateSentences(description, 2) : input.name,\n whenToUse: `Reach for ${input.name} when you need ${role}.`,\n whereItFits: `Sits at ${role}.`,\n context7Hint: context7Hint(input.name),\n };\n return { summary, usageGuide: guide };\n }\n}\n\n// ── OpenAI provider (raw fetch, no SDK dependency) ──────────────────────────\n\nconst SYSTEM_PROMPT =\n 'You summarize npm packages factually for an AI coding agent choosing dependencies. ' +\n 'Use ONLY the provided README/description. Never invent capabilities or APIs. ' +\n 'Be concise and concrete. Respond with a JSON object.';\n\nfunction buildUserPrompt(input: SummaryInput): string {\n const readme = (input.readme ?? '').slice(0, 4000);\n return [\n `Package: ${input.name}`,\n `Category: ${input.category ?? 'unknown'}`,\n `Description: ${input.description ?? '(none)'}`,\n `README (truncated):\\n${readme || '(none)'}`,\n '',\n 'Return JSON with keys:',\n '- \"summary\": 2-3 sentences: what it is, when to use it, how it fits an app.',\n '- \"whatItIs\": one sentence.',\n '- \"whenToUse\": one sentence on the ideal use case.',\n '- \"whenNotToUse\": one sentence on when to pick something else (or \"\").',\n '- \"whereItFits\": one sentence on its architectural role.',\n '- \"howToWireIn\": one short sentence on the minimal setup (install + entry point), or \"\".',\n ].join('\\n');\n}\n\nexport class OpenAISummaryProvider implements SummaryProvider {\n readonly kind = 'openai' as const;\n\n constructor(\n private readonly apiKey: string,\n private readonly model: string,\n private readonly fetchImpl?: typeof fetch,\n ) {}\n\n async generate(input: SummaryInput): Promise<SummaryResult> {\n try {\n const body = JSON.stringify({\n model: this.model,\n messages: [\n { role: 'system', content: SYSTEM_PROMPT },\n { role: 'user', content: buildUserPrompt(input) },\n ],\n response_format: { type: 'json_object' },\n temperature: 0.2,\n });\n const { data } = await httpRequest<any>('https://api.openai.com/v1/chat/completions', {\n host: 'api.openai.com',\n method: 'POST',\n ttlMs: 30 * 24 * 60 * 60 * 1000, // cache summaries 30d to control cost\n cacheKey: `openai-summary ${this.model} ${input.name} ${(input.readme ?? '').length}`,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body,\n fetchImpl: this.fetchImpl,\n });\n const content = data?.choices?.[0]?.message?.content;\n const parsed = content ? JSON.parse(content) : {};\n const guide: UsageGuide = {\n whatItIs: str(parsed.whatItIs) || input.name,\n whenToUse: str(parsed.whenToUse),\n whenNotToUse: str(parsed.whenNotToUse) || undefined,\n whereItFits: str(parsed.whereItFits),\n howToWireIn: str(parsed.howToWireIn) || undefined,\n context7Hint: context7Hint(input.name),\n };\n return { summary: str(parsed.summary) ? truncateSentences(parsed.summary, 3) : null, usageGuide: guide };\n } catch (err) {\n logger.warn(`summary LLM failed for ${input.name}, using fallback: ${(err as Error).message}`);\n return new FallbackSummaryProvider().generate(input);\n }\n }\n}\n\nfunction str(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\n// ── Factory + input assembly ────────────────────────────────────────────────\n\nexport function createSummaryProvider(fetchImpl?: typeof fetch): SummaryProvider {\n const config = getConfig();\n if (config.SUMMARY_PROVIDER === 'openai' && config.SUMMARY_API_KEY) {\n return new OpenAISummaryProvider(config.SUMMARY_API_KEY, config.SUMMARY_MODEL, fetchImpl);\n }\n return new FallbackSummaryProvider();\n}\n\n/** Assemble the summary input, fetching the GitHub-raw README when npm's is empty. */\nexport async function buildSummaryInput(\n signals: RawPackageSignals,\n category: Category | null,\n fetchImpl?: typeof fetch,\n): Promise<SummaryInput> {\n const registry = signals.registry;\n let readme = registry?.readme?.trim() || null;\n if (!readme && registry?.repo) {\n readme = await fetchGithubReadme(registry.repo.owner, registry.repo.repo, fetchImpl).catch(\n () => null,\n );\n }\n return {\n name: signals.name,\n description: registry?.description ?? null,\n category,\n readme,\n repoUrl: registry?.repoUrl ?? null,\n };\n}\n","/**\n * Gather all source signals for one package (§9.7 steps 1–5). Fault-isolated:\n * each source is wrapped so a single failure records an error and degrades that\n * signal to null rather than failing the package (§17).\n */\nimport { logger } from '../core/logger';\nimport type { Category } from '../core/types';\nimport { fetchBundlephobia } from './sources/bundlephobia';\nimport { fetchDepsDev } from './sources/depsDev';\nimport { fetchGithubRepo } from './sources/github';\nimport { fetchDownloadGrowth, fetchWeeklyDownloads } from './sources/npmDownloads';\nimport { fetchNpmRegistry } from './sources/npmRegistry';\nimport type { NpmDownloadsData, RawPackageSignals } from './types';\n\nexport interface CollectDeps {\n githubToken?: string;\n fetchImpl?: typeof fetch;\n /**\n * Pre-fetched weekly downloads (from the bulk endpoint). When provided (even\n * as null), the per-package weekly fetch is skipped — avoiding the downloads\n * API's harsh rate limits during a full sync.\n */\n prefetchedWeekly?: number | null;\n}\n\nasync function attempt<T>(\n source: string,\n errors: { source: string; message: string }[],\n fn: () => Promise<T>,\n): Promise<T | null> {\n try {\n return await fn();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n errors.push({ source, message });\n logger.debug(`[${source}] ${message}`);\n return null;\n }\n}\n\nexport async function collectSignals(\n name: string,\n category: Category | null,\n deps: CollectDeps = {},\n): Promise<RawPackageSignals> {\n const { githubToken, fetchImpl } = deps;\n const errors: { source: string; message: string }[] = [];\n\n // 1. Registry first — it provides the repo + version the other sources need.\n const registry = await attempt('npm-registry', errors, () => fetchNpmRegistry(name, fetchImpl));\n\n const repo = registry?.repo ?? null;\n const version = registry?.latestVersion ?? null;\n\n // 2–5. The rest run concurrently.\n const [downloads, github, depsDev, bundle] = await Promise.all([\n attempt('npm-downloads', errors, async (): Promise<NpmDownloadsData> => {\n const weeklyDownloads =\n deps.prefetchedWeekly !== undefined\n ? deps.prefetchedWeekly\n : await fetchWeeklyDownloads(name, fetchImpl);\n const downloadGrowth90d = await fetchDownloadGrowth(name, fetchImpl);\n return { weeklyDownloads, downloadGrowth90d };\n }),\n repo && githubToken\n ? attempt('github', errors, () => fetchGithubRepo(repo.owner, repo.repo, githubToken, fetchImpl))\n : Promise.resolve(null),\n attempt('deps-dev', errors, () => fetchDepsDev(name, version, repo, fetchImpl)),\n attempt('bundlephobia', errors, () => fetchBundlephobia(name, category, fetchImpl)),\n ]);\n\n return { name, registry, downloads, github, depsDev, bundle, errors };\n}\n","/**\n * All scoring weights and thresholds in one tunable file (§10).\n * Changing the model means editing this file only.\n */\n\n/** Composite health-score weights. Must sum to 1.0. */\nexport const HEALTH_WEIGHTS = {\n maintenance: 0.35,\n adoption: 0.3,\n reliability: 0.25,\n efficiency: 0.1,\n} as const;\n\n/** Maintenance sub-score component weights (of the available components). */\nexport const MAINTENANCE_WEIGHTS = {\n recency: 0.5,\n cadence: 0.25,\n closeRatio: 0.25,\n} as const;\n\nexport const MAINTENANCE = {\n /** A release within this many days scores full recency. */\n freshDays: 30,\n /** Recency decays linearly to 0 by this many days (~24 months). */\n staleDays: 730,\n /** Releases/12mo at or above this cap full cadence. */\n cadenceCap: 12,\n /** deprecated/archived hard-cap maintenance at this value. */\n deadCap: 15,\n} as const;\n\nexport const ADOPTION = {\n /** log10(weekly downloads): this maps to 0. */\n downloadsLogMin: 1, // 10/wk\n /** log10(weekly downloads): this maps to 100. */\n downloadsLogMax: 7, // 10M/wk\n /** log10(stars) that maps to 100. */\n starsLogMax: 5, // 100k stars\n /** Weight of the stars component when available (downloads gets the rest). */\n starsWeight: 0.2,\n /** Growth bonus: growth fraction × this, clamped to ±cap. */\n growthMultiplier: 30,\n growthBonusCap: 20,\n} as const;\n\nexport const RELIABILITY = {\n /** Used when no Scorecard is available (unknown security posture). */\n neutralWhenUnknown: 50,\n /** Advisory penalties by severity. */\n penalty: {\n critical: 40,\n high: 20,\n moderate: 8,\n low: 3,\n info: 0,\n },\n} as const;\n\nexport const EFFICIENCY = {\n /** Bundle size at the category median maps to this score; smaller → higher. */\n medianScore: 50,\n} as const;\n\n/** Confidence-label thresholds (§10). */\nexport const CONFIDENCE = {\n proven: {\n minWeeklyDownloads: 100_000,\n minAgeMonths: 12,\n maxLastReleaseMonths: 6,\n },\n emerging: {\n minWeeklyDownloads: 5_000,\n strongGrowth: 0.5,\n maxLastReleaseMonths: 9,\n },\n} as const;\n","/**\n * Scoring & confidence model (§10). All functions are pure and take an explicit\n * `now` for deterministic testing.\n *\n * Two-pass design: maintenance / adoption / reliability / confidence depend only\n * on a single package, so they're computed in pass 1. Efficiency needs the\n * category median bundle size (§10), so it — and the composite health score —\n * are computed in pass 2 once all packages are collected.\n */\nimport type { Advisory, Category, Confidence, ScoreBreakdown } from '../core/types';\nimport { isFrontendCategory } from '../core/types';\nimport type { RawPackageSignals } from '../ingestion/types';\nimport {\n ADOPTION,\n CONFIDENCE,\n EFFICIENCY,\n HEALTH_WEIGHTS,\n MAINTENANCE,\n MAINTENANCE_WEIGHTS,\n RELIABILITY,\n} from './weights';\n\nexport interface ScoringInput {\n weeklyDownloads: number | null;\n downloadGrowth90d: number | null;\n stars: number | null;\n dependentsCount: number | null;\n firstPublishedAt: Date | null;\n lastReleaseAt: Date | null;\n releasesLast12mo: number | null;\n openIssues: number | null;\n closedIssues: number | null;\n scorecard: number | null;\n advisories: Advisory[];\n deprecated: boolean;\n archived: boolean;\n bundleMinGzipKb: number | null;\n category: Category | null;\n}\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst MONTH_MS = 30 * DAY_MS;\n\nconst clamp = (n: number, lo = 0, hi = 100): number => Math.max(lo, Math.min(hi, n));\nconst daysSince = (date: Date | null, now: Date): number | null =>\n date ? (now.getTime() - date.getTime()) / DAY_MS : null;\nconst monthsSince = (date: Date | null, now: Date): number | null =>\n date ? (now.getTime() - date.getTime()) / MONTH_MS : null;\n\n/** Build a ScoringInput from collected raw signals. */\nexport function toScoringInput(signals: RawPackageSignals, category: Category | null): ScoringInput {\n const { registry, downloads, github, depsDev, bundle } = signals;\n return {\n weeklyDownloads: downloads?.weeklyDownloads ?? null,\n downloadGrowth90d: downloads?.downloadGrowth90d ?? null,\n stars: github?.stars ?? null,\n dependentsCount: null, // not collected in v1 (see spec R1 note)\n firstPublishedAt: registry?.firstPublishedAt ?? null,\n lastReleaseAt: github?.lastReleaseAt ?? registry?.lastReleaseAt ?? null,\n releasesLast12mo: github?.releasesLast12mo ?? null,\n openIssues: github?.openIssues ?? null,\n closedIssues: github?.closedIssues ?? null,\n scorecard: depsDev?.scorecard ?? null,\n advisories: depsDev?.advisories ?? [],\n deprecated: registry?.deprecated ?? false,\n archived: github?.archived ?? false,\n bundleMinGzipKb: bundle?.bundleMinGzipKb ?? null,\n category,\n };\n}\n\n// ── Maintenance ─────────────────────────────────────────────────────────────\n\nexport function computeMaintenance(input: ScoringInput, now: Date): number {\n if (input.deprecated || input.archived) return MAINTENANCE.deadCap;\n\n const components: { value: number; weight: number }[] = [];\n\n const days = daysSince(input.lastReleaseAt, now);\n if (days !== null) {\n const recency =\n days <= MAINTENANCE.freshDays\n ? 100\n : clamp((100 * (MAINTENANCE.staleDays - days)) / (MAINTENANCE.staleDays - MAINTENANCE.freshDays));\n components.push({ value: recency, weight: MAINTENANCE_WEIGHTS.recency });\n }\n\n if (input.releasesLast12mo !== null) {\n const cadence = clamp((Math.min(input.releasesLast12mo, MAINTENANCE.cadenceCap) / MAINTENANCE.cadenceCap) * 100);\n components.push({ value: cadence, weight: MAINTENANCE_WEIGHTS.cadence });\n }\n\n if (input.openIssues !== null && input.closedIssues !== null) {\n const total = input.openIssues + input.closedIssues;\n if (total > 0) {\n components.push({ value: (input.closedIssues / total) * 100, weight: MAINTENANCE_WEIGHTS.closeRatio });\n }\n }\n\n return weightedAverage(components);\n}\n\n// ── Adoption ────────────────────────────────────────────────────────────────\n\nexport function computeAdoption(input: ScoringInput): number {\n const dl = input.weeklyDownloads ?? 0;\n const downloadsScore = clamp(\n ((Math.log10(Math.max(dl, 1)) - ADOPTION.downloadsLogMin) /\n (ADOPTION.downloadsLogMax - ADOPTION.downloadsLogMin)) *\n 100,\n );\n\n let base = downloadsScore;\n if (input.stars !== null) {\n const starsScore = clamp((Math.log10(Math.max(input.stars, 1)) / ADOPTION.starsLogMax) * 100);\n base = (1 - ADOPTION.starsWeight) * downloadsScore + ADOPTION.starsWeight * starsScore;\n }\n\n if (input.downloadGrowth90d !== null) {\n const bonus = clamp(\n input.downloadGrowth90d * ADOPTION.growthMultiplier,\n -ADOPTION.growthBonusCap,\n ADOPTION.growthBonusCap,\n );\n base += bonus;\n }\n\n return clamp(base);\n}\n\n// ── Reliability ─────────────────────────────────────────────────────────────\n\nexport function computeReliability(input: ScoringInput): number {\n const base = input.scorecard !== null ? input.scorecard * 10 : RELIABILITY.neutralWhenUnknown;\n const penalty = input.advisories.reduce(\n (sum, adv) => sum + (RELIABILITY.penalty[adv.severity] ?? 0),\n 0,\n );\n return clamp(base - penalty);\n}\n\n// ── Efficiency (pass 2 — needs the category median) ─────────────────────────\n\n/**\n * Efficiency for frontend categories: smaller-than-median bundle → higher score\n * (median maps to 50). Returns null for backend categories / missing data; the\n * null signals the composite to redistribute the efficiency weight (§10, R1).\n */\nexport function computeEfficiency(\n bundleMinGzipKb: number | null,\n category: Category | null,\n categoryMedian: number | null,\n): number | null {\n if (!isFrontendCategory(category) || bundleMinGzipKb === null || !categoryMedian || categoryMedian <= 0) {\n return null;\n }\n const ratio = bundleMinGzipKb / categoryMedian;\n return clamp(100 - ratio * EFFICIENCY.medianScore);\n}\n\n// ── Composite ───────────────────────────────────────────────────────────────\n\n/** Compose the health score, redistributing efficiency's weight when null. */\nexport function computeHealthScore(breakdown: ScoreBreakdown): number {\n const { maintenance, adoption, reliability, efficiency } = breakdown;\n if (efficiency === null) {\n const w = HEALTH_WEIGHTS;\n const denom = w.maintenance + w.adoption + w.reliability;\n return Math.round(\n (w.maintenance * maintenance + w.adoption * adoption + w.reliability * reliability) / denom,\n );\n }\n return Math.round(\n HEALTH_WEIGHTS.maintenance * maintenance +\n HEALTH_WEIGHTS.adoption * adoption +\n HEALTH_WEIGHTS.reliability * reliability +\n HEALTH_WEIGHTS.efficiency * efficiency,\n );\n}\n\n// ── Confidence ──────────────────────────────────────────────────────────────\n\nexport function hasCriticalOrHighAdvisory(advisories: Advisory[]): boolean {\n return advisories.some((a) => a.severity === 'critical' || a.severity === 'high');\n}\n\nexport function computeConfidence(input: ScoringInput, now: Date): Confidence {\n const dl = input.weeklyDownloads ?? 0;\n const ageMonths = monthsSince(input.firstPublishedAt, now);\n const lastReleaseMonths = monthsSince(input.lastReleaseAt, now);\n const growth = input.downloadGrowth90d ?? 0;\n\n const provenReleaseOk =\n lastReleaseMonths !== null && lastReleaseMonths <= CONFIDENCE.proven.maxLastReleaseMonths;\n const provenAgeOk = ageMonths !== null && ageMonths >= CONFIDENCE.proven.minAgeMonths;\n\n if (\n dl >= CONFIDENCE.proven.minWeeklyDownloads &&\n provenAgeOk &&\n provenReleaseOk &&\n !hasCriticalOrHighAdvisory(input.advisories) &&\n !input.deprecated &&\n !input.archived\n ) {\n return 'proven';\n }\n\n const emergingReleaseOk =\n lastReleaseMonths !== null && lastReleaseMonths <= CONFIDENCE.emerging.maxLastReleaseMonths;\n const emergingAdoptionOk =\n dl >= CONFIDENCE.emerging.minWeeklyDownloads || growth >= CONFIDENCE.emerging.strongGrowth;\n\n if (emergingAdoptionOk && emergingReleaseOk && !input.deprecated && !input.archived) {\n return 'emerging';\n }\n\n return 'unproven';\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction weightedAverage(components: { value: number; weight: number }[]): number {\n if (components.length === 0) return 0;\n const totalWeight = components.reduce((s, c) => s + c.weight, 0);\n if (totalWeight === 0) return 0;\n return Math.round(components.reduce((s, c) => s + c.value * c.weight, 0) / totalWeight);\n}\n\n/** Median of a numeric list, or null if empty. */\nexport function median(values: number[]): number | null {\n if (values.length === 0) return null;\n const sorted = [...values].sort((a, b) => a - b);\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 0 ? (sorted[mid - 1]! + sorted[mid]!) / 2 : sorted[mid]!;\n}\n","export * from './score';\nexport * from './weights';\n","/**\n * Embedding providers (§11). A pluggable interface with two implementations:\n * - OpenAI (`text-embedding-3-small`, 1536-dim) — the default when a key is set.\n * - Local deterministic embedder (no key) — a hashing bag-of-words that captures\n * lexical overlap. Crude but real: it makes `recommend` and tests work with\n * zero credentials (R1 decision). Both emit EMBEDDING_DIM-length unit vectors,\n * so the DB column and pgvector index never change.\n */\nimport { createHash } from 'node:crypto';\nimport { getConfig } from '../core/config';\nimport { EMBEDDING_DIM } from '../core/constants';\nimport { httpRequest } from '../core/http';\nimport { logger } from '../core/logger';\nimport type { Category } from '../core/types';\n\nexport interface EmbeddingProvider {\n readonly kind: 'openai' | 'local';\n readonly dimensions: number;\n embed(texts: string[]): Promise<number[][]>;\n}\n\n/** Normalized text blob embedded per package (§8.2). */\nexport function buildEmbeddingText(input: {\n name: string;\n category: Category | null;\n summary: string | null;\n description: string | null;\n}): string {\n const body = input.summary || input.description || '';\n return `${input.name}. ${input.category ?? ''}. ${body}`.trim();\n}\n\n// ── Local deterministic embedder ────────────────────────────────────────────\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length > 1);\n}\n\n/** FNV-1a 32-bit hash. */\nfunction fnv1a(str: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return h >>> 0;\n}\n\nexport function localEmbed(text: string, dim = EMBEDDING_DIM): number[] {\n const vec = new Float64Array(dim);\n const tokens = tokenize(text);\n const add = (token: string, weight: number) => {\n const idx = fnv1a(token) % dim;\n const sign = fnv1a('s:' + token) & 1 ? 1 : -1;\n vec[idx]! += weight * sign;\n };\n for (const t of tokens) add(t, 1);\n for (let i = 0; i < tokens.length - 1; i++) add(`${tokens[i]} ${tokens[i + 1]}`, 0.5);\n\n // L2-normalize to a unit vector (cosine-friendly).\n let norm = 0;\n for (let i = 0; i < dim; i++) norm += vec[i]! * vec[i]!;\n norm = Math.sqrt(norm) || 1;\n const out = new Array<number>(dim);\n for (let i = 0; i < dim; i++) out[i] = vec[i]! / norm;\n return out;\n}\n\nexport class LocalEmbeddingProvider implements EmbeddingProvider {\n readonly kind = 'local' as const;\n readonly dimensions = EMBEDDING_DIM;\n async embed(texts: string[]): Promise<number[][]> {\n return texts.map((t) => localEmbed(t));\n }\n}\n\n// ── OpenAI embedder ─────────────────────────────────────────────────────────\n\nconst OPENAI_BATCH = 96;\n\nexport class OpenAIEmbeddingProvider implements EmbeddingProvider {\n readonly kind = 'openai' as const;\n readonly dimensions = EMBEDDING_DIM;\n\n constructor(\n private readonly apiKey: string,\n private readonly model: string,\n private readonly fetchImpl?: typeof fetch,\n ) {}\n\n async embed(texts: string[]): Promise<number[][]> {\n const out: number[][] = [];\n for (let i = 0; i < texts.length; i += OPENAI_BATCH) {\n const batch = texts.slice(i, i + OPENAI_BATCH);\n const body = JSON.stringify({ model: this.model, input: batch });\n const { data } = await httpRequest<any>('https://api.openai.com/v1/embeddings', {\n host: 'api.openai.com',\n method: 'POST',\n ttlMs: 30 * 24 * 60 * 60 * 1000, // cache embeddings 30d to control cost\n cacheKey: `openai-embed ${this.model} ${createHash('sha256').update(body).digest('hex')}`,\n headers: { Authorization: `Bearer ${this.apiKey}`, 'Content-Type': 'application/json' },\n body,\n fetchImpl: this.fetchImpl,\n });\n const vectors: { embedding: number[]; index: number }[] = data?.data ?? [];\n vectors.sort((a, b) => a.index - b.index);\n for (const v of vectors) out.push(v.embedding);\n }\n return out;\n }\n}\n\n// ── Factory ─────────────────────────────────────────────────────────────────\n\nexport function createEmbeddingProvider(fetchImpl?: typeof fetch): EmbeddingProvider {\n const config = getConfig();\n if (config.EMBEDDING_PROVIDER === 'openai' && config.EMBEDDING_API_KEY) {\n return new OpenAIEmbeddingProvider(config.EMBEDDING_API_KEY, config.EMBEDDING_MODEL, fetchImpl);\n }\n if (config.EMBEDDING_PROVIDER === 'openai' && !config.EMBEDDING_API_KEY) {\n logger.warn('EMBEDDING_API_KEY not set — falling back to the local embedder.');\n }\n return new LocalEmbeddingProvider();\n}\n","/**\n * Read/write helpers for the `packages` table. All recommendation/eval reads use\n * this single denormalized table (§8.2).\n */\nimport { eq, sql } from 'drizzle-orm';\nimport type { Category } from '../core/types';\nimport type { Database } from './client';\nimport { packages, seedPackages, syncRuns, type NewPackageRow, type SyncError } from './schema';\n\nexport async function getSeedTargets(\n db: Database,\n): Promise<{ name: string; category: Category | null }[]> {\n const rows = await db\n .select({ name: seedPackages.name, category: seedPackages.category })\n .from(seedPackages);\n return rows.map((r) => ({ name: r.name, category: r.category ?? null }));\n}\n\nexport async function getPackageByName(db: Database, name: string) {\n const rows = await db.select().from(packages).where(eq(packages.name, name)).limit(1);\n return rows[0] ?? null;\n}\n\n/**\n * Promote a package into the curated seed list so future `sync` runs keep it\n * fresh. Used by the on-demand path (§12.5) to make organically-discovered\n * packages durable. No-op if already seeded — preserves the original category\n * and `added_at` rather than overwriting a hand-curated entry.\n */\nexport async function ensureSeedEntry(\n db: Database,\n name: string,\n category: Category | null,\n): Promise<void> {\n await db\n .insert(seedPackages)\n .values({ name, category })\n .onConflictDoNothing({ target: seedPackages.name });\n}\n\n/** Upsert a fully-computed package row, refreshing every field on conflict. */\nexport async function upsertPackage(db: Database, row: NewPackageRow): Promise<void> {\n const { name: _name, createdAt: _createdAt, ...mutable } = row;\n await db\n .insert(packages)\n .values(row)\n .onConflictDoUpdate({\n target: packages.name,\n set: { ...mutable, updatedAt: new Date() },\n });\n}\n\n// ── sync_runs audit ─────────────────────────────────────────────────────────\n\nexport async function startSyncRun(db: Database): Promise<number> {\n const [row] = await db\n .insert(syncRuns)\n .values({ status: 'running' })\n .returning({ id: syncRuns.id });\n return row!.id;\n}\n\nexport async function finishSyncRun(\n db: Database,\n id: number,\n data: {\n packagesSeen: number;\n packagesUpdated: number;\n errors: SyncError[];\n status: 'success' | 'partial' | 'failed';\n },\n): Promise<void> {\n await db\n .update(syncRuns)\n .set({\n finishedAt: new Date(),\n packagesSeen: data.packagesSeen,\n packagesUpdated: data.packagesUpdated,\n errors: data.errors,\n status: data.status,\n })\n .where(eq(syncRuns.id, id));\n}\n\n/** Count tracked packages — handy for CLI/diagnostics. */\nexport async function countPackages(db: Database): Promise<number> {\n const [row] = await db.select({ n: sql<number>`count(*)::int` }).from(packages);\n return row?.n ?? 0;\n}\n","/** Map over items with bounded concurrency, preserving input order. */\nexport async function pMap<T, R>(\n items: readonly T[],\n mapper: (item: T, index: number) => Promise<R>,\n concurrency: number,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n let cursor = 0;\n const workerCount = Math.max(1, Math.min(concurrency, items.length));\n const workers = Array.from({ length: workerCount }, async () => {\n while (cursor < items.length) {\n const index = cursor++;\n results[index] = await mapper(items[index]!, index);\n }\n });\n await Promise.all(workers);\n return results;\n}\n","/**\n * `lurq sync` pipeline (§9.7). End-to-end ingestion for the seed list (or one\n * package): collect signals → score → summarize → upsert, recording a sync_runs\n * row. Idempotent, concurrent, and tolerant of individual source failures (§17).\n *\n * Two-pass for efficiency (§10): pass 1 collects + scores everything that's\n * per-package; then category medians are computed; pass 2 finalizes efficiency\n * and the composite health score. Embeddings are added in M4.\n */\nimport { getConfig } from '../core/config';\nimport { pMap } from '../core/concurrency';\nimport { setCacheBypassRead } from '../core/http';\nimport { logger } from '../core/logger';\nimport type { Category, ScoreBreakdown } from '../core/types';\nimport { collectSignals } from '../ingestion/collect';\nimport { fetchBulkWeeklyDownloads } from '../ingestion/sources/npmDownloads';\nimport { buildSummaryInput, createSummaryProvider } from '../ingestion/summarize';\nimport { buildEmbeddingText, createEmbeddingProvider } from '../search/embeddings';\nimport type { RawPackageSignals } from '../ingestion/types';\nimport {\n computeAdoption,\n computeConfidence,\n computeEfficiency,\n computeHealthScore,\n computeMaintenance,\n computeReliability,\n median,\n toScoringInput,\n type ScoringInput,\n} from '../scoring';\nimport { createDb, type Database } from '../db/client';\nimport {\n finishSyncRun,\n getSeedTargets,\n startSyncRun,\n upsertPackage,\n} from '../db/packages';\nimport { isFrontendCategory } from '../core/types';\nimport type { NewPackageRow, SyncError } from '../db/schema';\n\nexport interface SyncOptions {\n full?: boolean;\n packageName?: string;\n}\n\nexport interface SyncSummary {\n seen: number;\n updated: number;\n errors: number;\n status: 'success' | 'partial' | 'failed';\n}\n\ninterface Target {\n name: string;\n category: Category | null;\n}\n\n/** Per-package state carried from pass 1 to pass 2. */\ninterface Computed {\n target: Target;\n signals: RawPackageSignals;\n input: ScoringInput;\n maintenance: number;\n adoption: number;\n reliability: number;\n confidence: ReturnType<typeof computeConfidence>;\n summary: string | null;\n usageGuide: NewPackageRow['usageGuide'];\n}\n\nexport async function runSync(opts: SyncOptions = {}): Promise<SyncSummary> {\n const config = getConfig();\n const now = new Date();\n if (opts.full) setCacheBypassRead(true);\n\n const handle = createDb({ max: Math.max(4, config.LURQ_SYNC_CONCURRENCY) });\n const provider = createSummaryProvider();\n logger.info(`Summary provider: ${provider.kind}`);\n\n const runId = await startSyncRun(handle.db);\n const allErrors: SyncError[] = [];\n\n try {\n const targets = await resolveTargets(handle.db, opts);\n logger.info(`Syncing ${targets.length} package(s) with concurrency ${config.LURQ_SYNC_CONCURRENCY}…`);\n\n // Bulk-fetch weekly downloads up front (one call per 128 packages) to avoid\n // the downloads API rate limit that per-package bursts trigger.\n logger.info('Fetching weekly downloads in bulk…');\n const weeklyMap = await fetchBulkWeeklyDownloads(targets.map((t) => t.name));\n\n // ── Pass 1: collect + per-package scoring + summary ──────────────────────\n let done = 0;\n const computed = await pMap(\n targets,\n async (target): Promise<Computed | null> => {\n try {\n const signals = await collectSignals(target.name, target.category, {\n githubToken: config.GITHUB_TOKEN,\n prefetchedWeekly: weeklyMap.has(target.name) ? weeklyMap.get(target.name)! : undefined,\n });\n for (const e of signals.errors) allErrors.push({ package: target.name, ...e });\n\n const input = toScoringInput(signals, target.category);\n const summaryInput = await buildSummaryInput(signals, target.category);\n const { summary, usageGuide } = await provider.generate(summaryInput);\n\n if (++done % 25 === 0) logger.info(` …${done}/${targets.length}`);\n return {\n target,\n signals,\n input,\n maintenance: computeMaintenance(input, now),\n adoption: computeAdoption(input),\n reliability: computeReliability(input),\n confidence: computeConfidence(input, now),\n summary,\n usageGuide,\n };\n } catch (err) {\n allErrors.push({\n package: target.name,\n source: 'pipeline',\n message: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n },\n config.LURQ_SYNC_CONCURRENCY,\n );\n\n const ok = computed.filter((c): c is Computed => c !== null);\n\n // ── Category medians for efficiency (§10) ────────────────────────────────\n const medians = computeCategoryMedians(ok);\n\n // ── Embeddings (§11): embed the normalized text blob for each package ─────\n const embProvider = createEmbeddingProvider();\n logger.info(`Embedding provider: ${embProvider.kind}`);\n const embeddings = await embProvider.embed(\n ok.map((c) =>\n buildEmbeddingText({\n name: c.target.name,\n category: c.target.category,\n summary: c.summary,\n description: c.signals.registry?.description ?? null,\n }),\n ),\n );\n\n // ── Pass 2: efficiency + composite + upsert ──────────────────────────────\n let updated = 0;\n for (let i = 0; i < ok.length; i++) {\n const c = ok[i]!;\n const efficiency = computeEfficiency(\n c.input.bundleMinGzipKb,\n c.target.category,\n c.target.category ? (medians.get(c.target.category) ?? null) : null,\n );\n const breakdown: ScoreBreakdown = {\n maintenance: c.maintenance,\n adoption: c.adoption,\n reliability: c.reliability,\n efficiency,\n };\n const healthScore = computeHealthScore(breakdown);\n await upsertPackage(\n handle.db,\n assemblePackageRow({\n name: c.target.name,\n category: c.target.category,\n signals: c.signals,\n input: c.input,\n summary: c.summary,\n usageGuide: c.usageGuide,\n confidence: c.confidence,\n breakdown,\n healthScore,\n embedding: embeddings[i] ?? null,\n now,\n }),\n );\n updated++;\n }\n\n const status: SyncSummary['status'] =\n updated === 0 ? 'failed' : allErrors.length > 0 ? 'partial' : 'success';\n await finishSyncRun(handle.db, runId, {\n packagesSeen: targets.length,\n packagesUpdated: updated,\n errors: allErrors,\n status,\n });\n\n logger.info(`Sync ${status}: ${updated}/${targets.length} updated, ${allErrors.length} source errors.`);\n return { seen: targets.length, updated, errors: allErrors.length, status };\n } catch (err) {\n await finishSyncRun(handle.db, runId, {\n packagesSeen: 0,\n packagesUpdated: 0,\n errors: [{ package: '*', source: 'pipeline', message: (err as Error).message }],\n status: 'failed',\n });\n throw err;\n } finally {\n if (opts.full) setCacheBypassRead(false);\n await handle.close();\n }\n}\n\nasync function resolveTargets(db: Database, opts: SyncOptions): Promise<Target[]> {\n if (opts.packageName) {\n const seeds = await getSeedTargets(db);\n const found = seeds.find((s) => s.name === opts.packageName);\n return [{ name: opts.packageName, category: found?.category ?? null }];\n }\n return getSeedTargets(db);\n}\n\nfunction computeCategoryMedians(computed: Computed[]): Map<Category, number> {\n const byCategory = new Map<Category, number[]>();\n for (const c of computed) {\n const cat = c.target.category;\n const kb = c.input.bundleMinGzipKb;\n if (cat && isFrontendCategory(cat) && kb !== null) {\n const list = byCategory.get(cat) ?? [];\n list.push(kb);\n byCategory.set(cat, list);\n }\n }\n const medians = new Map<Category, number>();\n for (const [cat, list] of byCategory) {\n const m = median(list);\n if (m !== null) medians.set(cat, m);\n }\n return medians;\n}\n\n/** Assemble a fully-scored package row. Shared by the bulk sync and the\n * on-demand single-package path (§12.5). */\nexport function assemblePackageRow(p: {\n name: string;\n category: Category | null;\n signals: RawPackageSignals;\n input: ScoringInput;\n summary: string | null;\n usageGuide: NewPackageRow['usageGuide'];\n confidence: NewPackageRow['confidence'];\n breakdown: ScoreBreakdown;\n healthScore: number;\n embedding: number[] | null;\n now: Date;\n}): NewPackageRow {\n const r = p.signals.registry;\n return {\n name: p.name,\n ecosystem: 'npm',\n category: p.category,\n description: r?.description ?? null,\n summary: p.summary,\n repoUrl: r?.repoUrl ?? null,\n homepage: r?.homepage ?? null,\n latestVersion: r?.latestVersion ?? null,\n license: r?.license ?? null,\n deprecated: p.input.deprecated,\n archived: p.input.archived,\n firstPublishedAt: p.input.firstPublishedAt,\n lastReleaseAt: p.input.lastReleaseAt,\n weeklyDownloads: p.input.weeklyDownloads,\n downloadGrowth90d: p.input.downloadGrowth90d,\n dependentsCount: p.input.dependentsCount,\n stars: p.input.stars,\n openIssues: p.input.openIssues,\n closedIssues: p.input.closedIssues,\n scorecard: p.input.scorecard,\n bundleMinGzipKb: p.input.bundleMinGzipKb,\n advisories: p.input.advisories,\n healthScore: p.healthScore,\n confidence: p.confidence,\n scoreBreakdown: p.breakdown,\n usageGuide: p.usageGuide,\n embedding: p.embedding,\n dataAsOf: p.now,\n };\n}\n","/**\n * Single-package ingestion + the on-demand path (§12.5). When a queried package\n * isn't tracked but exists on npm, lurq fetches, scores, embeds, stores, and\n * returns it — organically growing coverage beyond the seed list.\n */\nimport { and, eq, isNotNull, sql } from 'drizzle-orm';\nimport { getConfig } from '../core/config';\nimport type { Category, ScoreBreakdown } from '../core/types';\nimport { collectSignals } from '../ingestion/collect';\nimport { fetchWeeklyDownloads, npmPackageExists } from '../ingestion/sources';\nimport { buildSummaryInput, createSummaryProvider } from '../ingestion/summarize';\nimport {\n computeAdoption,\n computeConfidence,\n computeEfficiency,\n computeHealthScore,\n computeMaintenance,\n computeReliability,\n toScoringInput,\n} from '../scoring';\nimport { buildEmbeddingText, createEmbeddingProvider } from '../search/embeddings';\nimport type { Database } from '../db/client';\nimport { ensureSeedEntry, getPackageByName, upsertPackage } from '../db/packages';\nimport { packages, seedPackages, type PackageRow } from '../db/schema';\nimport { assemblePackageRow } from './sync';\n\nasync function getSeedCategory(db: Database, name: string): Promise<Category | null> {\n const [row] = await db\n .select({ category: seedPackages.category })\n .from(seedPackages)\n .where(eq(seedPackages.name, name))\n .limit(1);\n return row?.category ?? null;\n}\n\n/** Median bundle size across already-tracked packages in a category (for efficiency). */\nasync function getCategoryMedianBundle(db: Database, category: Category): Promise<number | null> {\n const [row] = await db\n .select({\n m: sql<number | null>`percentile_cont(0.5) within group (order by ${packages.bundleMinGzipKb})`,\n })\n .from(packages)\n .where(and(eq(packages.category, category), isNotNull(packages.bundleMinGzipKb)));\n return row?.m ?? null;\n}\n\n/** Fetch, score, embed, and upsert a single package; returns the stored row. */\nexport async function syncOnePackage(\n db: Database,\n name: string,\n opts: { category?: Category | null } = {},\n): Promise<PackageRow> {\n const config = getConfig();\n const now = new Date();\n\n const existing = await getPackageByName(db, name);\n const category =\n opts.category ?? existing?.category ?? (await getSeedCategory(db, name)) ?? null;\n\n const prefetchedWeekly = await fetchWeeklyDownloads(name).catch(() => null);\n const signals = await collectSignals(name, category, {\n githubToken: config.GITHUB_TOKEN,\n prefetchedWeekly,\n });\n\n const input = toScoringInput(signals, category);\n const summaryInput = await buildSummaryInput(signals, category);\n const { summary, usageGuide } = await createSummaryProvider().generate(summaryInput);\n\n const median = category ? await getCategoryMedianBundle(db, category) : null;\n const breakdown: ScoreBreakdown = {\n maintenance: computeMaintenance(input, now),\n adoption: computeAdoption(input),\n reliability: computeReliability(input),\n efficiency: computeEfficiency(input.bundleMinGzipKb, category, median),\n };\n const healthScore = computeHealthScore(breakdown);\n const confidence = computeConfidence(input, now);\n\n const [embedding] = await createEmbeddingProvider().embed([\n buildEmbeddingText({ name, category, summary, description: signals.registry?.description ?? null }),\n ]);\n\n await upsertPackage(\n db,\n assemblePackageRow({\n name,\n category,\n signals,\n input,\n summary,\n usageGuide,\n confidence,\n breakdown,\n healthScore,\n embedding: embedding ?? null,\n now,\n }),\n );\n return (await getPackageByName(db, name))!;\n}\n\nexport interface GetOrFetchResult {\n row: PackageRow | null;\n /** True if the package was already in the index before this call. */\n wasTracked: boolean;\n existsOnNpm: boolean;\n}\n\n/**\n * Return a tracked package, or fetch+store it on demand if it's a real npm\n * package not yet in the index (§12.5). Returns row=null when it doesn't exist.\n */\nexport async function getOrFetchPackage(db: Database, name: string): Promise<GetOrFetchResult> {\n const existing = await getPackageByName(db, name);\n if (existing) return { row: existing, wasTracked: true, existsOnNpm: true };\n\n const exists = await npmPackageExists(name);\n if (!exists) return { row: null, wasTracked: false, existsOnNpm: false };\n\n const row = await syncOnePackage(db, name);\n // Persist the discovery into the seed list so future syncs keep it fresh.\n await ensureSeedEntry(db, name, row.category);\n return { row, wasTracked: false, existsOnNpm: true };\n}\n","/**\n * Lightweight category inference (§11). Maps a natural-language need to a\n * taxonomy category via keyword matching. Returns null when uncertain, so the\n * caller searches across all categories rather than over-filtering.\n */\nimport type { Category } from '../core/types';\n\nconst RULES: { category: Category; patterns: RegExp }[] = [\n { category: 'meta-framework', patterns: /\\b(meta-?framework|next\\.?js|nuxt|remix|astro|gatsby|sveltekit|full-?stack framework)\\b/ },\n { category: 'state-management', patterns: /\\b(state management|global state|store|redux|zustand|jotai|mobx|atoms?)\\b/ },\n { category: 'routing', patterns: /\\b(rout(e|er|ing)|navigation|url matching)\\b/ },\n { category: 'orm', patterns: /\\b(orm|object-?relational|query builder|prisma|drizzle|sequelize|typeorm)\\b/ },\n { category: 'database-client', patterns: /\\b(database (driver|client)|postgres|mysql|mongo(db)?|redis|sqlite|db driver)\\b/ },\n { category: 'ui-component-library', patterns: /\\b(component library|ui kit|ui components?|design system|buttons?|modal|dialog)\\b/ },\n { category: 'styling', patterns: /\\b(styl(e|ing)|css|tailwind|sass|scss|class ?names?|theme)\\b/ },\n { category: 'forms', patterns: /\\b(forms?|form (state|library|handling)|input handling)\\b/ },\n { category: 'validation', patterns: /\\b(validat(e|ion|or)|schema|parse input|type ?safe parsing)\\b/ },\n { category: 'data-fetching', patterns: /\\b(data fetching|server state|react query|swr|graphql client|caching queries)\\b/ },\n { category: 'http-client', patterns: /\\b(http client|fetch wrapper|rest client|make (a )?request|ajax|api calls?)\\b/ },\n { category: 'auth', patterns: /\\b(auth(entication|orization)?|login|session|jwt|oauth|password hashing)\\b/ },\n { category: 'testing', patterns: /\\b(test(ing|s)?|unit test|e2e|assertion|mocking|test runner)\\b/ },\n { category: 'bundler', patterns: /\\b(bundler|bundle (modules?|code)|webpack|rollup|esbuild|parcel)\\b/ },\n { category: 'build-tool', patterns: /\\b(build tool|dev server|monorepo|task runner|compile|transpile)\\b/ },\n // date-time precedes linting: \"date formatting\" must not be captured by linting's\n // bare \"formatting\" token before the date rule is reached (first-match-wins).\n { category: 'date-time', patterns: /\\b(dates?|date ?time|time(zone)?s?|calendar|parse dates?|format dates?)\\b/ },\n { category: 'linting', patterns: /\\b(lint(er|ing)?|formatter|formatting|code (quality|style|format)|prettier|eslint)\\b/ },\n { category: 'animation', patterns: /\\b(animat(e|ion)|motion|transition|spring|gsap|3d)\\b/ },\n { category: 'charts', patterns: /\\b(charts?|graphs?|data ?vis(ualization)?|plots?|dashboards?)\\b/ },\n { category: 'i18n', patterns: /\\b(i18n|internationali[sz]ation|localization|translat(e|ion)|locale)\\b/ },\n { category: 'framework', patterns: /\\b(framework|react|vue|svelte|angular|web server|backend framework)\\b/ },\n { category: 'utility', patterns: /\\b(debounce|throttle|deep ?clone|slugify|uuid|util(ity|ities)?|helper|lodash|retry)\\b/ },\n];\n\nexport function inferCategory(need: string): Category | null {\n const text = need.toLowerCase();\n for (const rule of RULES) {\n if (rule.patterns.test(text)) return rule.category;\n }\n return null;\n}\n","/**\n * Semantic recommendation (§11). Embeds the need, runs a pgvector cosine search\n * (optionally pre-filtered by inferred category + constraints), then re-ranks by\n * a blend of similarity and health score.\n */\nimport { and, cosineDistance, desc, eq, isNotNull, lte, sql } from 'drizzle-orm';\nimport type { Candidate, Category, Confidence, Runtime } from '../core/types';\nimport type { Database } from '../db/client';\nimport { packages } from '../db/schema';\nimport { inferCategory } from './categoryInference';\nimport { createEmbeddingProvider, type EmbeddingProvider } from './embeddings';\n\nexport interface RecommendConstraints {\n runtime?: Runtime;\n license?: string;\n maxBundleKb?: number;\n minConfidence?: Confidence;\n}\n\nexport interface RecommendOptions {\n need: string;\n category?: Category;\n constraints?: RecommendConstraints;\n limit?: number;\n}\n\nconst CONFIDENCE_RANK: Record<Confidence, number> = { unproven: 0, emerging: 1, proven: 2 };\n/** Similarity vs health blend (§11). */\nconst SIM_WEIGHT = 0.6;\nconst HEALTH_WEIGHT = 0.4;\n\ninterface Row {\n name: string;\n category: Category | null;\n healthScore: number | null;\n confidence: Confidence | null;\n latestVersion: string | null;\n weeklyDownloads: number | null;\n lastReleaseAt: Date | null;\n repoUrl: string | null;\n similarity: number;\n}\n\nexport async function recommend(\n db: Database,\n opts: RecommendOptions,\n provider: EmbeddingProvider = createEmbeddingProvider(),\n): Promise<Candidate[]> {\n const limit = Math.min(Math.max(opts.limit ?? 3, 1), 5);\n const [queryVec] = await provider.embed([opts.need]);\n if (!queryVec) return [];\n\n const category = opts.category ?? inferCategory(opts.need);\n const pool = Math.max(limit * 5, 25);\n\n // Primary search (category-filtered when we have one).\n let rows = await runQuery(db, queryVec, opts.constraints, category, pool);\n // If a category filter starved the results, broaden to all categories.\n if (category && rows.length < limit) {\n const broad = await runQuery(db, queryVec, opts.constraints, null, pool);\n const seen = new Set(rows.map((r) => r.name));\n rows = rows.concat(broad.filter((r) => !seen.has(r.name)));\n }\n if (rows.length === 0) return [];\n\n // Re-rank: blend normalized cosine similarity with health (§11). We map cosine\n // [-1,1] → [0,1] with a fixed transform rather than pool min-max — min-max\n // over-amplifies the single closest match, letting one noisy embedding hit\n // outrank a much healthier package. Fixed normalization keeps health meaningful.\n const ranked = rows\n .map((r) => {\n const simNorm = Math.max(0, Math.min(1, (r.similarity + 1) / 2));\n const health = (r.healthScore ?? 0) / 100;\n return { row: r, score: SIM_WEIGHT * simNorm + HEALTH_WEIGHT * health };\n })\n .sort((a, b) => b.score - a.score)\n .slice(0, limit);\n\n return ranked.map(({ row }) => toCandidate(row));\n}\n\nasync function runQuery(\n db: Database,\n queryVec: number[],\n constraints: RecommendConstraints | undefined,\n category: Category | null,\n pool: number,\n): Promise<Row[]> {\n const similarity = sql<number>`1 - (${cosineDistance(packages.embedding, queryVec)})`;\n const conditions = [isNotNull(packages.embedding)];\n\n if (category) conditions.push(eq(packages.category, category));\n if (constraints?.license) conditions.push(eq(packages.license, constraints.license));\n if (constraints?.maxBundleKb !== undefined) {\n conditions.push(lte(packages.bundleMinGzipKb, constraints.maxBundleKb));\n }\n if (constraints?.minConfidence) {\n const allowed = (['proven', 'emerging', 'unproven'] as Confidence[]).filter(\n (c) => CONFIDENCE_RANK[c] >= CONFIDENCE_RANK[constraints.minConfidence!],\n );\n conditions.push(\n sql`${packages.confidence} in ${sql.raw(`(${allowed.map((c) => `'${c}'`).join(',')})`)}`,\n );\n }\n\n return db\n .select({\n name: packages.name,\n category: packages.category,\n healthScore: packages.healthScore,\n confidence: packages.confidence,\n latestVersion: packages.latestVersion,\n weeklyDownloads: packages.weeklyDownloads,\n lastReleaseAt: packages.lastReleaseAt,\n repoUrl: packages.repoUrl,\n similarity,\n })\n .from(packages)\n .where(and(...conditions))\n .orderBy(desc(similarity))\n .limit(pool);\n}\n\nfunction toCandidate(row: Row): Candidate {\n return {\n name: row.name,\n category: row.category,\n healthScore: row.healthScore ?? 0,\n confidence: row.confidence ?? 'unproven',\n why: buildWhy(row),\n latestVersion: row.latestVersion,\n weeklyDownloads: row.weeklyDownloads,\n lastReleaseAt: row.lastReleaseAt ? row.lastReleaseAt.toISOString() : null,\n repoUrl: row.repoUrl,\n };\n}\n\n/** A ≤1-sentence rationale (§12.3.1). */\nfunction buildWhy(row: Row): string {\n const parts: string[] = [];\n if (row.confidence) parts.push(row.confidence);\n if (row.weeklyDownloads) parts.push(`${formatDownloads(row.weeklyDownloads)} weekly downloads`);\n if (row.healthScore !== null) parts.push(`health ${row.healthScore}`);\n return parts.join(', ') || 'tracked package';\n}\n\nfunction formatDownloads(n: number): string {\n if (n >= 1_000_000) return `${Math.round(n / 100_000) / 10}M`;\n if (n >= 1_000) return `${Math.round(n / 1_000)}k`;\n return String(n);\n}\n","/**\n * MCP tool handlers (§12.3). Pure functions over a Database — the transport\n * layer (server.ts) just wires zod schemas to these. Responses are kept compact\n * (§12.4): summaries truncated, advisories capped, no raw payloads, always a\n * `dataAsOf` and a `stale` hint when data is old (§17).\n */\nimport { sql } from 'drizzle-orm';\nimport { STALENESS_DAYS } from '../core/constants';\nimport type {\n Advisory,\n AdvisorySeverity,\n Category,\n Confidence,\n EvaluateOutput,\n VerifyOutput,\n} from '../core/types';\nimport type { Database } from '../db/client';\nimport { packages, type PackageRow } from '../db/schema';\nimport { fetchNpmRegistry, npmPackageExists } from '../ingestion/sources';\nimport { truncateSentences } from '../ingestion/summarize';\nimport { getOrFetchPackage } from '../pipeline/single';\nimport { recommend, type RecommendOptions } from '../search/recommend';\n\nconst SEVERITY_RANK: Record<AdvisorySeverity, number> = {\n critical: 4,\n high: 3,\n moderate: 2,\n low: 1,\n info: 0,\n};\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\nfunction isStale(dataAsOf: Date | null): boolean {\n if (!dataAsOf) return true;\n return Date.now() - dataAsOf.getTime() > STALENESS_DAYS * DAY_MS;\n}\n\nfunction withinDays(date: Date | null, days: number): boolean {\n return date ? Date.now() - date.getTime() <= days * DAY_MS : false;\n}\n\n/** Top advisories by severity, capped (§12.4). */\nfunction topAdvisories(advisories: Advisory[] | null, max = 5): Advisory[] {\n if (!advisories?.length) return [];\n return [...advisories]\n .sort((a, b) => SEVERITY_RANK[b.severity] - SEVERITY_RANK[a.severity])\n .slice(0, max);\n}\n\n/** Map a stored row to the compact EvaluateOutput shape (§12.3.2). */\nexport function rowToEvaluate(row: PackageRow): EvaluateOutput {\n const breakdown = row.scoreBreakdown ?? {\n maintenance: 0,\n adoption: 0,\n reliability: 0,\n efficiency: null,\n };\n return {\n dataAsOf: (row.dataAsOf ?? new Date()).toISOString(),\n stale: isStale(row.dataAsOf) || undefined,\n name: row.name,\n category: row.category,\n healthScore: row.healthScore ?? 0,\n confidence: (row.confidence as Confidence) ?? 'unproven',\n scoreBreakdown: breakdown,\n latestVersion: row.latestVersion,\n lastReleaseAt: row.lastReleaseAt ? row.lastReleaseAt.toISOString() : null,\n weeklyDownloads: row.weeklyDownloads,\n downloadGrowth90d: row.downloadGrowth90d,\n dependentsCount: row.dependentsCount,\n scorecard: row.scorecard,\n bundleMinGzipKb: row.bundleMinGzipKb,\n deprecated: row.deprecated,\n archived: row.archived,\n advisories: topAdvisories(row.advisories),\n summary: row.summary ? truncateSentences(row.summary, 3) : null,\n usageGuide: row.usageGuide ?? null,\n repoUrl: row.repoUrl,\n };\n}\n\nasync function latestDataAsOf(db: Database): Promise<string> {\n const [row] = await db\n .select({ m: sql<string | null>`max(${packages.dataAsOf})` })\n .from(packages);\n return new Date(row?.m ?? Date.now()).toISOString();\n}\n\n// ── recommend ───────────────────────────────────────────────────────────────\n\nexport interface RecommendInput {\n need: string;\n category?: Category;\n constraints?: RecommendOptions['constraints'];\n}\n\nexport async function handleRecommend(db: Database, input: RecommendInput) {\n const candidates = await recommend(db, {\n need: input.need,\n category: input.category,\n constraints: input.constraints,\n limit: 5,\n });\n return { dataAsOf: await latestDataAsOf(db), candidates };\n}\n\n// ── evaluate ────────────────────────────────────────────────────────────────\n\nexport async function handleEvaluate(\n db: Database,\n input: { package: string },\n): Promise<EvaluateOutput | { tracked: false; suggestion: string }> {\n const { row, existsOnNpm } = await getOrFetchPackage(db, input.package);\n if (!row) {\n return {\n tracked: false,\n suggestion: existsOnNpm\n ? `\"${input.package}\" exists on npm but could not be scored right now; try again.`\n : `\"${input.package}\" was not found on the npm registry. Check the package name.`,\n };\n }\n return rowToEvaluate(row);\n}\n\n// ── compare ─────────────────────────────────────────────────────────────────\n\nexport async function handleCompare(db: Database, input: { packages: string[] }) {\n const results = await Promise.all(input.packages.map((name) => getOrFetchPackage(db, name)));\n const rows = results\n .map((r) => r.row)\n .filter((row): row is PackageRow => row !== null)\n .map(rowToEvaluate)\n .sort((a, b) => b.healthScore - a.healthScore);\n const missing = input.packages.filter(\n (name) => !rows.some((r) => r.name === name),\n );\n return { dataAsOf: await latestDataAsOf(db), rows, ...(missing.length ? { missing } : {}) };\n}\n\n// ── verify ──────────────────────────────────────────────────────────────────\n\nexport async function handleVerify(\n db: Database,\n input: { package: string },\n): Promise<VerifyOutput> {\n const name = input.package;\n const exists = await npmPackageExists(name);\n if (!exists) {\n return {\n exists: false,\n tracked: false,\n deprecated: false,\n archived: false,\n latestVersion: null,\n weeklyDownloads: null,\n riskFlags: ['not-found-on-registry'],\n confidence: null,\n advisoryCount: 0,\n };\n }\n\n const registry = await fetchNpmRegistry(name).catch(() => null);\n const { row, wasTracked } = await getOrFetchPackage(db, name);\n\n const weeklyDownloads = row?.weeklyDownloads ?? null;\n const advisoryCount = row?.advisories?.length ?? 0;\n const deprecated = Boolean(row?.deprecated || registry?.deprecated);\n const archived = Boolean(row?.archived);\n\n const riskFlags: string[] = [];\n if (weeklyDownloads === null || weeklyDownloads === 0) riskFlags.push('zero-downloads');\n else if (weeklyDownloads < 1000) riskFlags.push('low-downloads');\n if (withinDays(registry?.firstPublishedAt ?? null, 7)) riskFlags.push('published-within-7-days');\n if (registry?.maintainersCount === 1) riskFlags.push('single-maintainer');\n if (advisoryCount > 0) riskFlags.push('has-known-advisory');\n if (deprecated) riskFlags.push('deprecated');\n if (archived) riskFlags.push('archived');\n\n return {\n exists: true,\n tracked: wasTracked,\n deprecated,\n archived,\n latestVersion: registry?.latestVersion ?? row?.latestVersion ?? null,\n weeklyDownloads,\n riskFlags,\n confidence: (row?.confidence as Confidence) ?? null,\n advisoryCount,\n };\n}\n","/**\n * Optional `diagram` tool (§12.3.5). Emits a reference-architecture Mermaid\n * diagram for a stack the caller has *already chosen* (package names), using\n * built-in layer patterns. Input is stack-only by design: inferring an\n * architecture from a freeform description is the \"architecture oracle\" behavior\n * that the master spec (§4) and roadmap (§1) declare a non-goal. lurq labels a\n * stack you name; it does not design one. A starting point, not a validator.\n *\n * Honesty over completeness:\n * - A package we can't classify (not in the index AND no category match) is\n * placed in an explicit `Unclassified` bucket — never silently dropped into a\n * default layer. The note lists what couldn't be placed. Partial, not\n * authoritative.\n * - KNOWN LIMITATION — front/back framework ambiguity: the taxonomy has a single\n * `framework` category, so a `framework` package can't be told apart as\n * frontend vs backend from its category alone. BACKEND_FRAMEWORKS is a\n * hand-maintained band-aid that re-routes the common backend frameworks to the\n * Backend layer; it degrades as the ecosystem adds new ones (an unlisted\n * backend framework will be drawn in Presentation). The real fix is a taxonomy\n * change (a distinct backend-framework category or a runtime/target flag on\n * packages), which is out of scope for v1. Documented, not solved.\n */\nimport { inArray } from 'drizzle-orm';\nimport type { Category } from '../core/types';\nimport { inferCategory } from '../search/categoryInference';\nimport type { Database } from '../db/client';\nimport { packages } from '../db/schema';\n\n/** Bucket for packages we cannot place: unknown category, or a category with no\n * real architectural home (e.g. `other`). Rendered, but kept out of the flow. */\nconst UNCLASSIFIED = 'Unclassified';\n\n/** Which architectural layer each category sits in. Categories with no honest\n * architectural home (e.g. `other`) are intentionally absent: layerFor routes\n * anything unmapped to UNCLASSIFIED rather than faking a layer. */\nconst LAYER_OF: Partial<Record<Category, string>> = {\n framework: 'Presentation',\n 'meta-framework': 'Presentation',\n 'ui-component-library': 'Presentation',\n styling: 'Presentation',\n animation: 'Presentation',\n charts: 'Presentation',\n 'state-management': 'Client Logic',\n routing: 'Client Logic',\n forms: 'Client Logic',\n validation: 'Client Logic',\n 'data-fetching': 'Client Logic',\n 'http-client': 'Client Logic',\n i18n: 'Client Logic',\n 'date-time': 'Client Logic',\n utility: 'Client Logic',\n auth: 'Backend',\n orm: 'Data',\n 'database-client': 'Data',\n 'build-tool': 'Tooling',\n bundler: 'Tooling',\n linting: 'Tooling',\n testing: 'Tooling',\n};\n\nconst FLOW_LAYERS = ['Presentation', 'Client Logic', 'Backend', 'Data'];\n\n/** Band-aid for the front/back framework ambiguity (see file header). Category\n * `framework` alone can't distinguish frontend from backend, so these common\n * backend frameworks are re-routed to the Backend layer. Hand-maintained;\n * unlisted backend frameworks will be mis-drawn in Presentation. Not a real fix. */\nconst BACKEND_FRAMEWORKS = new Set([\n 'express',\n 'fastify',\n 'koa',\n 'hono',\n '@nestjs/core',\n '@hapi/hapi',\n]);\n\ninterface Item {\n label: string;\n /** null = could not be classified (not in index, no category match). */\n category: Category | null;\n}\n\nfunction layerFor(item: Item): string {\n if (!item.category) return UNCLASSIFIED;\n if (item.category === 'framework' && BACKEND_FRAMEWORKS.has(item.label)) return 'Backend';\n return LAYER_OF[item.category] ?? UNCLASSIFIED;\n}\n\nfunction nodeId(label: string, i: number): string {\n return `n${i}_${label.replace(/[^a-zA-Z0-9]/g, '_')}`;\n}\n\nexport function buildMermaid(items: Item[]): string {\n const byLayer = new Map<string, Item[]>();\n for (const item of items) {\n const layer = layerFor(item);\n const list = byLayer.get(layer) ?? [];\n list.push(item);\n byLayer.set(layer, list);\n }\n\n const lines = ['flowchart TD', ' user([User])'];\n const ids = new Map<string, string>(); // label → node id\n let counter = 0;\n const repNode = new Map<string, string>(); // layer → first node id\n\n const emitLayer = (layer: string) => {\n const list = byLayer.get(layer);\n if (!list?.length) return;\n lines.push(` subgraph ${layer.replace(/\\s+/g, '_')}[\"${layer}\"]`);\n for (const item of list) {\n const id = nodeId(item.label, counter++);\n ids.set(item.label, id);\n if (!repNode.has(layer)) repNode.set(layer, id);\n // Unclassified nodes carry no category prefix — we don't claim one we lack.\n const text = layer === UNCLASSIFIED ? item.label : `${item.category}: ${item.label}`;\n lines.push(` ${id}[\"${text}\"]`);\n }\n lines.push(' end');\n };\n\n for (const layer of FLOW_LAYERS) emitLayer(layer);\n emitLayer('Tooling');\n emitLayer(UNCLASSIFIED);\n\n // Connect the flow layers that are present, top to bottom.\n const present = FLOW_LAYERS.filter((l) => byLayer.has(l));\n let prev = 'user';\n for (const layer of present) {\n lines.push(` ${prev} --> ${repNode.get(layer)}`);\n prev = repNode.get(layer)!;\n }\n if (byLayer.has('Data')) lines.push(` ${repNode.get('Data')} --> db[(Database)]`);\n\n return lines.join('\\n');\n}\n\nexport interface DiagramInput {\n stack?: string[];\n}\n\nexport async function handleDiagram(\n db: Database,\n input: DiagramInput,\n): Promise<{ mermaid: string; note: string }> {\n if (!input.stack?.length) {\n return {\n mermaid: 'flowchart TD\\n user([User]) --> app[Application]',\n note: 'Provide a `stack` of package names to diagram. lurq labels a stack you choose; it does not infer an architecture from a description.',\n };\n }\n\n const rows = await db\n .select({ name: packages.name, category: packages.category })\n .from(packages)\n .where(inArray(packages.name, input.stack));\n const known = new Map(rows.map((r) => [r.name, r.category]));\n // inferCategory is best-effort on a bare package name (it was built for NL\n // needs); a miss yields null, not a faked category. No silent 'other'.\n const items: Item[] = input.stack.map((name) => ({\n label: name,\n category: known.get(name) ?? inferCategory(name),\n }));\n\n const unclassified = items.filter((i) => layerFor(i) === UNCLASSIFIED).map((i) => i.label);\n const note = unclassified.length\n ? `Reference pattern derived from the provided stack — partial, not authoritative. Could not place ${unclassified.length} package(s): ${unclassified.join(', ')} (not in lurq's index and no category match) — shown under Unclassified, outside the flow.`\n : 'Reference pattern derived from the provided stack. A labeled starting point, not a validated architecture.';\n\n return { mermaid: buildMermaid(items), note };\n}\n","/**\n * MCP server (§12). Exposes recommend / evaluate / compare / verify over stdio.\n * Inputs are validated with zod; outputs are compact JSON text (§12.4).\n */\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { SERVER_NAME, VERSION } from '../core/constants';\nimport { CATEGORIES, type Category } from '../core/types';\nimport { createDb } from '../db/client';\nimport { logger } from '../core/logger';\nimport { handleCompare, handleEvaluate, handleRecommend, handleVerify } from './handlers';\nimport { handleDiagram } from './diagram';\n\nconst categoryEnum = z.enum(CATEGORIES as unknown as [Category, ...Category[]]);\nconst confidenceEnum = z.enum(['proven', 'emerging', 'unproven']);\n\nconst constraintsSchema = z\n .object({\n runtime: z.enum(['browser', 'node', 'both']).optional(),\n license: z.string().optional(),\n maxBundleKb: z.number().positive().optional(),\n minConfidence: confidenceEnum.optional(),\n })\n .optional();\n\n/** Wrap any result object as a compact MCP text response. */\nfunction json(obj: unknown) {\n return { content: [{ type: 'text' as const, text: JSON.stringify(obj) }] };\n}\n\nexport function buildMcpServer(db: ReturnType<typeof createDb>['db']): McpServer {\n const server = new McpServer({ name: SERVER_NAME, version: VERSION });\n\n server.registerTool(\n 'recommend',\n {\n title: 'Recommend packages',\n description:\n 'Recommend the best current npm packages for a described need — fresh, objectively scored, with confidence labels. Call before choosing or hand-rolling a dependency.',\n inputSchema: {\n need: z.string().min(1).describe('Natural-language description of what you need'),\n category: categoryEnum.optional().describe('Optional taxonomy category to restrict to'),\n constraints: constraintsSchema,\n },\n },\n async (args) => json(await handleRecommend(db, args)),\n );\n\n server.registerTool(\n 'evaluate',\n {\n title: 'Evaluate a package',\n description:\n 'Full evidence read for one npm package: scores, signals, advisories, summary, and a usage guide. Fetches & scores on demand if not yet tracked.',\n inputSchema: {\n package: z.string().min(1).describe('npm package name'),\n },\n },\n async (args) => json(await handleEvaluate(db, args)),\n );\n\n server.registerTool(\n 'compare',\n {\n title: 'Compare packages',\n description: 'Side-by-side comparison of 2–5 npm packages, ranked by health score.',\n inputSchema: {\n packages: z.array(z.string().min(1)).min(2).max(5).describe('2–5 npm package names'),\n },\n },\n async (args) => json(await handleCompare(db, args)),\n );\n\n server.registerTool(\n 'verify',\n {\n title: 'Verify a package',\n description:\n 'Confirm an npm package is real, healthy, and not risky before installing — guards against hallucinated or typosquatted dependency names. Checks the live registry.',\n inputSchema: {\n package: z.string().min(1).describe('npm package name to verify'),\n },\n },\n async (args) => json(await handleVerify(db, args)),\n );\n\n server.registerTool(\n 'diagram',\n {\n title: 'Reference architecture diagram',\n description:\n 'Emit a reference-architecture Mermaid diagram for a stack you have already chosen (package names). A labeled starting point keyed by layer — not a validated architecture, and not an architecture designer.',\n inputSchema: {\n stack: z\n .array(z.string())\n .optional()\n .describe('Package names that make up the stack; omit or empty to get usage guidance'),\n },\n },\n async (args) => json(await handleDiagram(db, args)),\n );\n\n return server;\n}\n\nexport async function startMcpServer(): Promise<void> {\n const { db, close } = createDb();\n const server = buildMcpServer(db);\n\n const shutdown = async () => {\n try {\n await close();\n } finally {\n process.exit(0);\n }\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n logger.info(`${SERVER_NAME} MCP server v${VERSION} running on stdio.`);\n}\n","export { runSync, type SyncOptions, type SyncSummary } from './sync';\n","/**\n * Dependency-free formatting helpers for human-facing CLI output. Compact tables\n * and labeled detail views; `--json` paths bypass these entirely.\n */\n\nconst ESC = '\u001b[';\nconst wrap = (code: string, s: string) => `${ESC}${code}m${s}${ESC}0m`;\n\nexport const bold = (s: string) => wrap('1', s);\nexport const dim = (s: string) => wrap('2', s);\nexport const red = (s: string) => wrap('31', s);\nexport const green = (s: string) => wrap('32', s);\nexport const yellow = (s: string) => wrap('33', s);\n\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\u001b\\[[0-9;]*m/g;\nconst width = (s: string) => s.replace(ANSI_RE, '').length;\n\n/** Render a simple aligned table. */\nexport function table(headers: string[], rows: string[][]): string {\n const widths = headers.map((h, i) => Math.max(width(h), ...rows.map((r) => width(r[i] ?? ''))));\n const pad = (s: string, w: number) => s + ' '.repeat(Math.max(0, w - width(s)));\n const line = (cells: string[]) => cells.map((c, i) => pad(c, widths[i]!)).join(' ');\n const out = [bold(line(headers)), dim(widths.map((w) => '─'.repeat(w)).join(' '))];\n for (const r of rows) out.push(line(r));\n return out.join('\\n');\n}\n\n/** Render a labeled key/value detail block. */\nexport function detail(pairs: [string, string][]): string {\n const labelWidth = Math.max(...pairs.map(([k]) => k.length));\n return pairs.map(([k, v]) => `${dim((k + ':').padEnd(labelWidth + 1))} ${v}`).join('\\n');\n}\n\n/** Compact number formatting: 1.2M, 34k, 950. */\nexport function formatNumber(n: number | null | undefined): string {\n if (n == null) return '—';\n if (n >= 1_000_000) return `${Math.round(n / 100_000) / 10}M`;\n if (n >= 1_000) return `${Math.round(n / 100) / 10}k`;\n return String(n);\n}\n\nexport function formatDate(iso: string | null): string {\n return iso ? iso.slice(0, 10) : '—';\n}\n\nexport function formatPercent(fraction: number | null | undefined): string {\n if (fraction == null) return '—';\n const pct = Math.round(fraction * 1000) / 10;\n return `${pct > 0 ? '+' : ''}${pct}%`;\n}\n\n/** Color a confidence label. */\nexport function confidenceLabel(c: string): string {\n if (c === 'proven') return green(c);\n if (c === 'emerging') return yellow(c);\n return red(c);\n}\n","/**\n * Human-facing CLI command implementations (§13). Each reuses the MCP handlers\n * against a DB connection, then renders a compact table/detail view — or raw\n * JSON with `--json`.\n */\nimport { requireConfig } from '../core/config';\nimport { isCategory, type Category, type Confidence } from '../core/types';\nimport { createDb } from '../db/client';\nimport { handleCompare, handleEvaluate, handleRecommend, handleVerify } from '../mcp/handlers';\nimport {\n bold,\n confidenceLabel,\n detail,\n dim,\n formatDate,\n formatNumber,\n formatPercent,\n green,\n red,\n table,\n yellow,\n} from './format';\n\nasync function withDb<T>(fn: (db: ReturnType<typeof createDb>['db']) => Promise<T>): Promise<T> {\n requireConfig(['DATABASE_URL']);\n const handle = createDb();\n try {\n return await fn(handle.db);\n } finally {\n await handle.close();\n }\n}\n\nexport interface RecommendCliOpts {\n category?: string;\n minConfidence?: string;\n json?: boolean;\n}\n\nexport async function runRecommend(need: string, opts: RecommendCliOpts): Promise<void> {\n if (opts.category && !isCategory(opts.category)) {\n throw new Error(`Unknown category \"${opts.category}\".`);\n }\n await withDb(async (db) => {\n const res = await handleRecommend(db, {\n need,\n category: opts.category as Category | undefined,\n constraints: opts.minConfidence\n ? { minConfidence: opts.minConfidence as Confidence }\n : undefined,\n });\n if (opts.json) return console.log(JSON.stringify(res, null, 2));\n if (res.candidates.length === 0) {\n console.log('No matching packages found.');\n return;\n }\n console.log(\n table(\n ['Package', 'Health', 'Confidence', 'Weekly', 'Latest', 'Category'],\n res.candidates.map((c) => [\n c.name,\n String(c.healthScore),\n confidenceLabel(c.confidence),\n formatNumber(c.weeklyDownloads),\n c.latestVersion ?? '—',\n c.category ?? '—',\n ]),\n ),\n );\n console.log(dim(`\\ndata as of ${formatDate(res.dataAsOf)}`));\n });\n}\n\nexport async function runEvaluate(pkg: string, opts: { json?: boolean }): Promise<void> {\n await withDb(async (db) => {\n const res = await handleEvaluate(db, { package: pkg });\n if (opts.json) return console.log(JSON.stringify(res, null, 2));\n if ('tracked' in res) {\n console.log(res.suggestion);\n return;\n }\n console.log(bold(res.name) + (res.category ? dim(` (${res.category})`) : ''));\n const b = res.scoreBreakdown;\n console.log(\n detail([\n ['health', `${res.healthScore} ${confidenceLabel(res.confidence)}`],\n [\n 'breakdown',\n `maint ${b.maintenance} · adopt ${b.adoption} · rel ${b.reliability} · eff ${b.efficiency ?? '—'}`,\n ],\n ['version', res.latestVersion ?? '—'],\n ['weekly dl', `${formatNumber(res.weeklyDownloads)} (${formatPercent(res.downloadGrowth90d)} 90d)`],\n ['scorecard', res.scorecard != null ? String(res.scorecard) : '—'],\n ['bundle', res.bundleMinGzipKb != null ? `${res.bundleMinGzipKb} KB gzip` : '—'],\n ['released', formatDate(res.lastReleaseAt)],\n ['flags', [res.deprecated && 'deprecated', res.archived && 'archived'].filter(Boolean).join(', ') || 'none'],\n ['advisories', res.advisories.length ? res.advisories.map((a) => `${a.severity}`).join(', ') : 'none'],\n ['repo', res.repoUrl ?? '—'],\n ]),\n );\n if (res.summary) console.log('\\n' + res.summary);\n if (res.usageGuide) {\n const g = res.usageGuide;\n console.log(\n '\\n' +\n detail(\n [\n ['what', g.whatItIs],\n ['when', g.whenToUse],\n g.whenNotToUse ? (['when not', g.whenNotToUse] as [string, string]) : null,\n ['fits', g.whereItFits],\n g.howToWireIn ? (['wire-in', g.howToWireIn] as [string, string]) : null,\n ].filter(Boolean) as [string, string][],\n ),\n );\n }\n console.log(dim(`\\ndata as of ${formatDate(res.dataAsOf)}${res.stale ? ' (stale)' : ''}`));\n });\n}\n\nexport async function runCompare(pkgs: string[], opts: { json?: boolean }): Promise<void> {\n await withDb(async (db) => {\n const res = await handleCompare(db, { packages: pkgs });\n if (opts.json) return console.log(JSON.stringify(res, null, 2));\n console.log(\n table(\n ['Package', 'Health', 'Confidence', 'Weekly', '90d', 'Scorecard', 'Released'],\n res.rows.map((r) => [\n r.name,\n String(r.healthScore),\n confidenceLabel(r.confidence),\n formatNumber(r.weeklyDownloads),\n formatPercent(r.downloadGrowth90d),\n r.scorecard != null ? String(r.scorecard) : '—',\n formatDate(r.lastReleaseAt),\n ]),\n ),\n );\n if (res.missing?.length) console.log(dim(`\\nnot found: ${res.missing.join(', ')}`));\n console.log(dim(`data as of ${formatDate(res.dataAsOf)}`));\n });\n}\n\nexport async function runVerify(pkg: string, opts: { json?: boolean }): Promise<void> {\n await withDb(async (db) => {\n const res = await handleVerify(db, { package: pkg });\n if (opts.json) return console.log(JSON.stringify(res, null, 2));\n const verdict = !res.exists\n ? red('✗ NOT FOUND on npm')\n : res.deprecated || res.archived || res.advisoryCount > 0\n ? yellow('⚠ exists, but risky')\n : green('✓ looks safe');\n console.log(`${bold(pkg)} ${verdict}`);\n console.log(\n detail([\n ['version', res.latestVersion ?? '—'],\n ['weekly dl', formatNumber(res.weeklyDownloads)],\n ['confidence', res.confidence ? confidenceLabel(res.confidence) : '—'],\n ['advisories', String(res.advisoryCount)],\n ['risk flags', res.riskFlags.length ? yellow(res.riskFlags.join(', ')) : 'none'],\n ]),\n );\n });\n}\n","/**\n * Locate package-relative resources at runtime. Works in dev (tsx, source under\n * src/) and when published (bundled under dist/), by walking up from this module\n * until a directory containing package.json is found.\n */\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nlet cachedRoot: string | undefined;\n\n/** Absolute path to the installed lurq package root (the dir with package.json). */\nexport function packageRoot(): string {\n if (cachedRoot) return cachedRoot;\n let dir = dirname(fileURLToPath(import.meta.url));\n // Walk up to the filesystem root looking for our package.json.\n for (;;) {\n if (existsSync(join(dir, 'package.json'))) {\n cachedRoot = dir;\n return dir;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n // Fallback: current working directory.\n cachedRoot = process.cwd();\n return cachedRoot;\n}\n\n/** Folder holding generated Drizzle migrations. */\nexport function migrationsDir(): string {\n return join(packageRoot(), 'drizzle');\n}\n\n/** The curated seed list shipped with the package. */\nexport function seedJsonPath(): string {\n return join(packageRoot(), 'src', 'data', 'seed.json');\n}\n","/**\n * Agent skill installer (§14). Registers lurq as an MCP server in supported\n * assistants by MERGING a single `lurq` entry into each agent's config — never\n * overwriting unrelated config — and drops the skill-instructions file.\n *\n * MCP config formats move fast and differ per agent; this writes the current\n * widely-supported shapes and prints exactly what it did + a manual fallback,\n * so a stale path is obvious rather than silent.\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { copyFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { PACKAGE_NAME } from '../core/constants';\nimport { logger } from '../core/logger';\nimport { packageRoot } from '../core/paths';\n\nconst ENV_KEYS = [\n 'DATABASE_URL',\n 'GITHUB_TOKEN',\n 'EMBEDDING_PROVIDER',\n 'EMBEDDING_API_KEY',\n 'EMBEDDING_MODEL',\n 'SUMMARY_PROVIDER',\n 'SUMMARY_API_KEY',\n 'SUMMARY_MODEL',\n] as const;\n\ntype ConfigFormat = 'mcpServers' | 'servers' | 'toml';\n\ninterface AgentSpec {\n id: string;\n label: string;\n format: ConfigFormat;\n /** Absolute config file path. */\n path: string;\n /** Whether this agent appears installed (used by --agent all). */\n detected: boolean;\n}\n\nfunction home(...p: string[]): string {\n return join(homedir(), ...p);\n}\n\nfunction agentSpecs(): AgentSpec[] {\n return [\n {\n id: 'claude-code',\n label: 'Claude Code',\n format: 'mcpServers',\n path: home('.claude.json'),\n detected: existsSync(home('.claude.json')) || existsSync(home('.claude')),\n },\n {\n id: 'cursor',\n label: 'Cursor',\n format: 'mcpServers',\n path: home('.cursor', 'mcp.json'),\n detected: existsSync(home('.cursor')),\n },\n {\n id: 'windsurf',\n label: 'Windsurf',\n format: 'mcpServers',\n path: home('.codeium', 'windsurf', 'mcp_config.json'),\n detected: existsSync(home('.codeium')),\n },\n {\n id: 'copilot',\n label: 'VS Code / GitHub Copilot',\n format: 'servers',\n path: home('Library', 'Application Support', 'Code', 'User', 'mcp.json'),\n detected: existsSync(home('Library', 'Application Support', 'Code', 'User')),\n },\n {\n id: 'codex',\n label: 'OpenAI Codex CLI',\n format: 'toml',\n path: home('.codex', 'config.toml'),\n detected: existsSync(home('.codex')),\n },\n ];\n}\n\nexport const SUPPORTED_AGENTS = ['claude-code', 'cursor', 'windsurf', 'copilot', 'codex'] as const;\n\nfunction collectEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const key of ENV_KEYS) {\n const value = process.env[key];\n if (value) env[key] = value;\n }\n return env;\n}\n\ninterface InstallResult {\n agent: string;\n path: string;\n status: 'installed' | 'skipped' | 'error';\n message?: string;\n}\n\nfunction readJsonObject(path: string): Record<string, any> {\n if (!existsSync(path)) return {};\n const text = readFileSync(path, 'utf8').trim();\n if (!text) return {};\n return JSON.parse(text);\n}\n\nfunction writeJson(path: string, obj: unknown): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(obj, null, 2) + '\\n', 'utf8');\n}\n\n/** The lurq server entry for JSON configs. */\nexport function buildServerEntry(env: Record<string, string>, withType: boolean): Record<string, any> {\n const entry: Record<string, any> = { command: 'npx', args: ['-y', PACKAGE_NAME, 'serve'] };\n if (withType) entry.type = 'stdio';\n if (Object.keys(env).length) entry.env = env;\n return entry;\n}\n\nfunction installJson(spec: AgentSpec, env: Record<string, string>): InstallResult {\n const key = spec.format === 'servers' ? 'servers' : 'mcpServers';\n const config = readJsonObject(spec.path);\n if (typeof config[key] !== 'object' || config[key] === null) config[key] = {};\n config[key].lurq = buildServerEntry(env, spec.format === 'servers');\n writeJson(spec.path, config);\n return { agent: spec.id, path: spec.path, status: 'installed' };\n}\n\n/** Build a TOML block for the Codex config. */\nexport function buildTomlBlock(env: Record<string, string>): string {\n const lines = ['[mcp_servers.lurq]', 'command = \"npx\"', `args = [\"-y\", \"${PACKAGE_NAME}\", \"serve\"]`];\n if (Object.keys(env).length) {\n lines.push('', '[mcp_servers.lurq.env]');\n for (const [k, v] of Object.entries(env)) lines.push(`${k} = ${JSON.stringify(v)}`);\n }\n return lines.join('\\n') + '\\n';\n}\n\nfunction installToml(spec: AgentSpec, env: Record<string, string>): InstallResult {\n const existing = existsSync(spec.path) ? readFileSync(spec.path, 'utf8') : '';\n if (existing.includes('[mcp_servers.lurq]')) {\n return {\n agent: spec.id,\n path: spec.path,\n status: 'skipped',\n message: 'lurq already present; edit manually to change it.',\n };\n }\n mkdirSync(dirname(spec.path), { recursive: true });\n const sep = existing && !existing.endsWith('\\n') ? '\\n\\n' : existing ? '\\n' : '';\n writeFileSync(spec.path, existing + sep + buildTomlBlock(env), 'utf8');\n return { agent: spec.id, path: spec.path, status: 'installed' };\n}\n\nfunction installInstructionsFile(): string | null {\n const src = join(packageRoot(), 'templates', 'skill-instructions.md');\n if (!existsSync(src)) return null;\n const destDir = home('.lurq');\n const dest = join(destDir, 'skill-instructions.md');\n mkdirSync(destDir, { recursive: true });\n copyFileSync(src, dest);\n return dest;\n}\n\nexport interface InstallSkillOptions {\n agent?: string;\n}\n\nexport async function runInstallSkill(opts: InstallSkillOptions): Promise<void> {\n const target = opts.agent ?? 'claude-code';\n const specs = agentSpecs();\n const env = collectEnv();\n\n let selected: AgentSpec[];\n if (target === 'all') {\n selected = specs.filter((s) => s.detected);\n if (selected.length === 0) {\n console.log('No supported agents detected on this machine.');\n return;\n }\n } else {\n const spec = specs.find((s) => s.id === target);\n if (!spec) {\n throw new Error(\n `Unknown agent \"${target}\". Supported: ${SUPPORTED_AGENTS.join(', ')}, all.`,\n );\n }\n selected = [spec];\n }\n\n if (!env.DATABASE_URL) {\n logger.warn(\n 'DATABASE_URL is not set in the current environment — the installed server entry will have no DATABASE_URL. Set it (in .env) and re-run, or edit the config.',\n );\n }\n\n const results: InstallResult[] = [];\n for (const spec of selected) {\n try {\n results.push(spec.format === 'toml' ? installToml(spec, env) : installJson(spec, env));\n } catch (err) {\n results.push({\n agent: spec.id,\n path: spec.path,\n status: 'error',\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const instructionsPath = installInstructionsFile();\n\n // Report.\n console.log('lurq MCP server registration:');\n for (const r of results) {\n const spec = specs.find((s) => s.id === r.agent)!;\n const mark = r.status === 'installed' ? '✓' : r.status === 'skipped' ? '•' : '✗';\n console.log(` ${mark} ${spec.label.padEnd(26)} ${r.path}${r.message ? ` (${r.message})` : ''}`);\n }\n if (instructionsPath) console.log(`\\nSkill instructions written to ${instructionsPath}`);\n console.log('\\nNext steps:');\n console.log(' 1. Ensure DATABASE_URL (and any API keys) are set in the config env above.');\n console.log(' 2. Restart the agent so it picks up the new MCP server.');\n console.log(' 3. Ask it to recommend a library — it should call lurq.');\n}\n","/**\n * Load the curated seed list (§16) into `seed_packages`. Idempotent: re-running\n * upserts category and leaves `added_at` intact for existing rows.\n */\nimport { readFileSync } from 'node:fs';\nimport { sql } from 'drizzle-orm';\nimport { z } from 'zod';\nimport { CATEGORIES, type Category } from '../core/types';\nimport { logger } from '../core/logger';\nimport { seedJsonPath } from '../core/paths';\nimport type { Database } from './client';\nimport { seedPackages } from './schema';\n\nconst SeedEntrySchema = z.object({\n name: z.string().min(1),\n category: z.enum(CATEGORIES as unknown as [Category, ...Category[]]).optional(),\n});\nconst SeedFileSchema = z.array(SeedEntrySchema);\n\nexport interface SeedEntry {\n name: string;\n category?: Category;\n}\n\nexport function loadSeedFile(path = seedJsonPath()): SeedEntry[] {\n const raw = JSON.parse(readFileSync(path, 'utf8'));\n const parsed = SeedFileSchema.parse(raw);\n // De-duplicate by name (first occurrence wins) so a package can't be seeded twice.\n const byName = new Map<string, SeedEntry>();\n for (const entry of parsed) {\n if (!byName.has(entry.name)) byName.set(entry.name, entry);\n }\n return [...byName.values()];\n}\n\nexport async function loadSeedPackages(db: Database, path?: string): Promise<number> {\n const entries = loadSeedFile(path);\n if (entries.length === 0) return 0;\n await db\n .insert(seedPackages)\n .values(entries.map((e) => ({ name: e.name, category: e.category ?? null })))\n .onConflictDoUpdate({\n target: seedPackages.name,\n // Refresh category to the incoming value on conflict (EXCLUDED.category).\n set: { category: sql`excluded.category` },\n });\n logger.info(`Loaded ${entries.length} packages into seed_packages.`);\n return entries.length;\n}\n","/**\n * Schema management for `lurq db migrate` / `lurq db reset`.\n *\n * `migrate` ensures the pgvector extension exists (Drizzle does not create it),\n * applies generated migrations, then loads the curated seed list (§18 M1).\n * `reset` drops the public schema and re-runs migrate — destructive.\n */\nimport { migrate } from 'drizzle-orm/postgres-js/migrator';\nimport { logger } from '../core/logger';\nimport { migrationsDir } from '../core/paths';\nimport { createDb, type DbHandle } from './client';\nimport { loadSeedPackages } from './seed';\n\nasync function ensureVectorExtension(handle: DbHandle): Promise<void> {\n await handle.sql`CREATE EXTENSION IF NOT EXISTS vector`;\n}\n\nexport async function runMigrate(): Promise<void> {\n // A single, non-pooled connection is best for migrations.\n const handle = createDb({ max: 1 });\n try {\n logger.info('Ensuring pgvector extension…');\n await ensureVectorExtension(handle);\n\n logger.info('Applying migrations…');\n await migrate(handle.db, { migrationsFolder: migrationsDir() });\n\n logger.info('Loading seed list…');\n await loadSeedPackages(handle.db);\n\n logger.info('Migration complete.');\n } finally {\n await handle.close();\n }\n}\n\nexport async function runReset(): Promise<void> {\n const handle = createDb({ max: 1 });\n try {\n logger.warn('Dropping schema `public` (destructive)…');\n await handle.sql.unsafe('DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public;');\n // Drizzle tracks applied migrations in its own schema; clear it too.\n await handle.sql`DROP SCHEMA IF EXISTS drizzle CASCADE`;\n } finally {\n await handle.close();\n }\n // Re-apply everything from scratch.\n await runMigrate();\n logger.info('Reset complete.');\n}\n","/**\n * Public library surface for `lurq` when imported as a package.\n * The primary interfaces are the MCP server (`lurq serve`) and the CLI;\n * these exports support embedding and testing.\n */\nexport * from './core/types';\nexport * from './core/constants';\nexport { getConfig, requireConfig, loadEnv, ConfigError } from './core/config';\nexport type { Config } from './core/config';\nexport { logger } from './core/logger';\nexport { buildProgram } from './cli/index';\n","/**\n * CLI command wiring (§13). Built with commander. Each command mirrors an MCP\n * tool or an operational task. Handlers are filled in across milestones M1–M7;\n * the command/option surface here is the final, stable shape.\n *\n * Every command supports `--json` for machine-readable output.\n */\nimport { Command } from 'commander';\nimport { SERVER_NAME, VERSION } from '../core/constants';\n\nexport function buildProgram(): Command {\n const program = new Command();\n\n program\n .name(SERVER_NAME)\n .description(\n 'lurq - a fresh, objectively-scored index of JS/TS packages for AI coding agents.',\n )\n .version(VERSION, '-v, --version', 'output the lurq version');\n\n program\n .command('serve')\n .description('start the MCP server over stdio (for agent integration)')\n .action(async () => {\n const { startMcpServer } = await import('../mcp/server');\n await startMcpServer();\n });\n\n program\n .command('sync')\n .description('run ingestion: refresh scores for the seed list (or one package)')\n .option('--full', 'force a full re-sync, ignoring cache TTLs')\n .option('--package <name>', 'sync a single package by name')\n .option('--json', 'output the run summary as JSON')\n .action(async (opts: { full?: boolean; package?: string; json?: boolean }) => {\n const { runSync } = await import('../pipeline/index');\n const summary = await runSync({ full: opts.full, packageName: opts.package });\n if (opts.json) console.log(JSON.stringify(summary, null, 2));\n if (summary.status === 'failed') process.exitCode = 1;\n });\n\n program\n .command('recommend')\n .argument('<need>', 'natural-language description of what you need')\n .description('recommend the best current packages for a described need')\n .option('--category <category>', 'restrict to a taxonomy category')\n .option('--min-confidence <level>', 'proven | emerging | unproven')\n .option('--json', 'output JSON instead of a table')\n .action(async (need: string, opts: { category?: string; minConfidence?: string; json?: boolean }) => {\n const { runRecommend } = await import('./commands');\n await runRecommend(need, opts);\n });\n\n program\n .command('evaluate')\n .argument('<package>', 'npm package name')\n .description('full evidence read for one package (scores, signals, usage guide)')\n .option('--json', 'output JSON instead of a table')\n .action(async (pkg: string, opts: { json?: boolean }) => {\n const { runEvaluate } = await import('./commands');\n await runEvaluate(pkg, opts);\n });\n\n program\n .command('compare')\n .argument('<packages...>', '2–5 npm package names')\n .description('side-by-side comparison of packages, ranked by health')\n .option('--json', 'output JSON instead of a table')\n .action(async (pkgs: string[], opts: { json?: boolean }) => {\n const { runCompare } = await import('./commands');\n await runCompare(pkgs, opts);\n });\n\n program\n .command('verify')\n .argument('<package>', 'npm package name')\n .description('safety check: is this package real, healthy, and not risky?')\n .option('--json', 'output JSON instead of a table')\n .action(async (pkg: string, opts: { json?: boolean }) => {\n const { runVerify } = await import('./commands');\n await runVerify(pkg, opts);\n });\n\n program\n .command('install-skill')\n .description('register lurq as an MCP server in supported AI assistants')\n .option(\n '--agent <agent>',\n 'claude-code | cursor | copilot | windsurf | codex | all',\n 'claude-code',\n )\n .action(async (opts: { agent?: string }) => {\n const { runInstallSkill } = await import('./installSkill');\n await runInstallSkill(opts);\n });\n\n const db = program.command('db').description('database management');\n db.command('migrate')\n .description('apply database migrations and load the seed list')\n .action(async () => {\n const { runMigrate } = await import('../db/migrate');\n await runMigrate();\n });\n db.command('reset')\n .description('drop and recreate the schema (destructive)')\n .option('--yes', 'skip the confirmation prompt')\n .action(async (opts: { yes?: boolean }) => {\n if (!opts.yes) {\n console.error(\n 'Refusing to reset without confirmation. Re-run with `--yes` to drop and recreate the schema.',\n );\n process.exitCode = 1;\n return;\n }\n const { runReset } = await import('../db/migrate');\n await runReset();\n });\n\n return program;\n}\n"],"mappings":"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","names":["table","sql","cached","attempt","text","json","json","HOST","json","HOST","json","HOST","json","HOST","HOST","text","createHash","text","str","dim","index","eq","sql","median","text","and","eq","isNotNull","sql","sql","DAY_MS","text","z","existsSync","dirname","join","fileURLToPath","existsSync","homedir","dirname","join","path","text","readFileSync","sql","z","path","startMcpServer","runSync","runRecommend","runEvaluate","runCompare","runVerify","runInstallSkill","runMigrate","runReset"]}
@@ -0,0 +1,54 @@
1
+ CREATE TABLE "packages" (
2
+ "id" serial PRIMARY KEY NOT NULL,
3
+ "name" text NOT NULL,
4
+ "ecosystem" text DEFAULT 'npm' NOT NULL,
5
+ "category" text,
6
+ "description" text,
7
+ "summary" text,
8
+ "repo_url" text,
9
+ "homepage" text,
10
+ "latest_version" text,
11
+ "license" text,
12
+ "deprecated" boolean DEFAULT false NOT NULL,
13
+ "archived" boolean DEFAULT false NOT NULL,
14
+ "first_published_at" timestamp with time zone,
15
+ "last_release_at" timestamp with time zone,
16
+ "weekly_downloads" bigint,
17
+ "download_growth_90d" real,
18
+ "dependents_count" integer,
19
+ "stars" integer,
20
+ "open_issues" integer,
21
+ "closed_issues" integer,
22
+ "scorecard" real,
23
+ "bundle_min_gzip_kb" real,
24
+ "advisories" jsonb,
25
+ "health_score" integer,
26
+ "confidence" text,
27
+ "score_breakdown" jsonb,
28
+ "usage_guide" jsonb,
29
+ "embedding" vector(1536),
30
+ "data_as_of" timestamp with time zone,
31
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
32
+ "updated_at" timestamp with time zone DEFAULT now() NOT NULL,
33
+ CONSTRAINT "packages_name_unique" UNIQUE("name")
34
+ );
35
+ --> statement-breakpoint
36
+ CREATE TABLE "seed_packages" (
37
+ "name" text PRIMARY KEY NOT NULL,
38
+ "category" text,
39
+ "added_at" timestamp with time zone DEFAULT now() NOT NULL
40
+ );
41
+ --> statement-breakpoint
42
+ CREATE TABLE "sync_runs" (
43
+ "id" serial PRIMARY KEY NOT NULL,
44
+ "started_at" timestamp with time zone DEFAULT now() NOT NULL,
45
+ "finished_at" timestamp with time zone,
46
+ "packages_seen" integer DEFAULT 0 NOT NULL,
47
+ "packages_updated" integer DEFAULT 0 NOT NULL,
48
+ "errors" jsonb DEFAULT '[]'::jsonb NOT NULL,
49
+ "status" text DEFAULT 'running' NOT NULL
50
+ );
51
+ --> statement-breakpoint
52
+ CREATE INDEX "packages_category_idx" ON "packages" USING btree ("category");--> statement-breakpoint
53
+ CREATE INDEX "packages_health_score_idx" ON "packages" USING btree ("health_score");--> statement-breakpoint
54
+ CREATE INDEX "packages_embedding_idx" ON "packages" USING hnsw ("embedding" vector_cosine_ops);