{"version":3,"file":"cli.mjs","sources":["../src/parseExports.ts","../src/staticMode.ts","../src/openrouter.ts","../src/freeLlmRouter.ts","../src/aiMode.ts","../src/buildTxtMetadata.ts","../src/buildRuleMdc.ts","../src/version.ts","../src/observability.ts","../src/ui.ts","../src/generate.ts","../src/buildAgentMd.ts","../src/buildSkillMd.ts","../src/skillAiMode.ts","../src/types.ts","../src/skill.ts","../src/audit.ts","../src/dashboard.ts","../src/cli.ts","../src/buildJsonMetadata.ts","../src/agent.ts"],"sourcesContent":["/**\r\n * Resolves the entry file for package metadata extraction.\r\n * Priority: source → module → main → src/index.ts → index.ts\r\n */\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { resolve } from 'node:path';\r\nimport type { PackageJsonLike } from './types.js';\r\n\r\nconst CANDIDATE_ENTRIES = [\r\n  (pkg: PackageJsonLike) => pkg.source,\r\n  (pkg: PackageJsonLike) => pkg.module,\r\n  (pkg: PackageJsonLike) => pkg.main,\r\n] as const;\r\n\r\nconst FALLBACK_PATHS = ['src/index.ts', 'index.ts', 'src/index.js', 'index.js'];\r\n\r\n/**\r\n * Detects the package entry file from package.json and cwd.\r\n * Returns absolute path or null if none found.\r\n */\r\nexport function detectEntryFile(\r\n  packageJson: PackageJsonLike,\r\n  cwd: string\r\n): string | null {\r\n  for (const getField of CANDIDATE_ENTRIES) {\r\n    const value = getField(packageJson);\r\n    if (typeof value === 'string' && value.trim()) {\r\n      const candidate = resolve(cwd, value);\r\n      if (existsSync(candidate)) return candidate;\r\n    }\r\n  }\r\n\r\n  for (const rel of FALLBACK_PATHS) {\r\n    const candidate = resolve(cwd, rel);\r\n    if (existsSync(candidate)) return candidate;\r\n  }\r\n\r\n  return null;\r\n}\r\n","/**\r\n * Static mode: extract exports using ts-morph (AST) — no API calls.\r\n */\r\n\r\nimport { Project } from 'ts-morph';\r\nimport type { ExportsMap } from './types.js';\r\n\r\nconst HOOK_PREFIX = 'use';\r\n\r\nfunction isHookName(name: string): boolean {\r\n  return name.length > HOOK_PREFIX.length && name.startsWith(HOOK_PREFIX);\r\n}\r\n\r\nfunction getJSDocDescription(node: { getJsDocs?(): unknown[] }): string {\r\n  const docs = node.getJsDocs?.() ?? [];\r\n  if (docs.length === 0) return '';\r\n  const first = docs[0] as { getDescription?(): string };\r\n  const desc = first?.getDescription?.();\r\n  return typeof desc === 'string' ? desc.trim() : '';\r\n}\r\n\r\n/**\r\n * Extract structured exports (functions, classes, types) and detect hooks from entry file.\r\n */\r\nexport function extractStaticExports(entryPath: string): ExportsMap {\r\n  const project = new Project({ skipAddingFilesFromTsConfig: true });\r\n  const sourceFile = project.addSourceFileAtPath(entryPath);\r\n  const exports: ExportsMap = {};\r\n\r\n  for (const decl of sourceFile.getExportedDeclarations()) {\r\n    const name = decl[0];\r\n    const nodes = decl[1];\r\n    for (const node of nodes) {\r\n      const kindName = node.getKindName();\r\n\r\n      let type: ExportsMap[string]['type'] = 'type';\r\n      if (kindName.includes('Function') || kindName === 'FunctionDeclaration') {\r\n        type = 'function';\r\n      } else if (kindName.includes('Class') || kindName === 'ClassDeclaration') {\r\n        type = 'class';\r\n      } else if (kindName.includes('Interface') || kindName.includes('TypeAlias')) {\r\n        type = 'type';\r\n      }\r\n\r\n      const description = getJSDocDescription(node as Parameters<typeof getJSDocDescription>[0]);\r\n      const hook = type === 'function' && isHookName(name);\r\n\r\n      if (!exports[name]) {\r\n        exports[name] = { type, description: description || '', hook };\r\n      }\r\n    }\r\n  }\r\n\r\n  return exports;\r\n}\r\n\r\n/**\r\n * Get list of hook names (functions starting with \"use\") from exports map.\r\n */\r\nexport function getHooksFromExports(exports: ExportsMap): string[] {\r\n  return Object.entries(exports)\r\n    .filter(([, meta]) => meta.hook)\r\n    .map(([name]) => name)\r\n    .sort();\r\n}\r\n","/**\n * OpenRouter API client. Supports single-call and multi-step flows with strict validators.\n */\n\nimport type { ExportMeta, ExportsMap } from './types.js';\n\nconst OPENROUTER_URL = 'https://openrouter.ai/api/v1/chat/completions';\n\n/** Thrown when OpenRouter returns a non-OK HTTP status (used for fallback and feedback). */\nexport class OpenRouterHttpError extends Error {\n  readonly status: number;\n\n  constructor(status: number, message: string) {\n    super(message);\n    this.name = 'OpenRouterHttpError';\n    this.status = status;\n  }\n}\n\n/** Map HTTP status to Free LLM Router feedback issue type. */\nexport function issueFromHttpStatus(status: number): 'rate_limited' | 'unavailable' | 'error' {\n  if (status === 429) return 'rate_limited';\n  if (status === 503) return 'unavailable';\n  return 'error';\n}\n\n/** Result of auth/availability check: ok, unauthorized (401), or rate-limited (429). */\nexport type AuthCheckResult = { ok: true } | { ok: false; reason: 'unauthorized' } | { ok: false; reason: 'rate_limited'; message: string };\n\n/**\n * Minimal request to validate API key and model availability.\n * Returns { ok: true }, { ok: false, reason: 'unauthorized' } on 401, or { ok: false, reason: 'rate_limited', message } on 429.\n */\nexport async function checkOpenRouterAuth(apiKey: string, model: string): Promise<AuthCheckResult> {\n  const res = await fetch(OPENROUTER_URL, {\n    method: 'POST',\n    headers: {\n      Authorization: `Bearer ${apiKey}`,\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({\n      model,\n      messages: [{ role: 'user', content: 'x' }],\n      max_tokens: 1,\n    }),\n  });\n  if (res.status === 401) return { ok: false, reason: 'unauthorized' };\n  if (res.status === 429) {\n    const text = await res.text();\n    return { ok: false, reason: 'rate_limited', message: text.slice(0, 400) };\n  }\n  if (!res.ok) {\n    const text = await res.text();\n    throw new OpenRouterHttpError(res.status, `OpenRouter API error ${res.status}: ${text.slice(0, 300)}`);\n  }\n  return { ok: true };\n}\n\n/**\n * Try OpenRouter auth with the first model that succeeds. Stops on 401 (invalid key).\n * Other failures try the next candidate (Free LLM Router free-model list).\n */\nexport async function checkOpenRouterAuthTryModels(\n  apiKey: string,\n  models: string[]\n): Promise<AuthCheckResult> {\n  if (models.length === 0) {\n    return { ok: false, reason: 'rate_limited', message: 'No candidate models from Free LLM Router' };\n  }\n  let last429 = '';\n  for (const model of models) {\n    try {\n      const r = await checkOpenRouterAuth(apiKey, model);\n      if (r.ok) return { ok: true };\n      if (r.reason === 'unauthorized') return r;\n      last429 = r.message;\n    } catch (e) {\n      if (e instanceof OpenRouterHttpError && e.status === 401) {\n        return { ok: false, reason: 'unauthorized' };\n      }\n      last429 = e instanceof Error ? e.message : String(e);\n    }\n  }\n  if (last429) return { ok: false, reason: 'rate_limited', message: last429 };\n  return { ok: false, reason: 'rate_limited', message: 'All candidate models failed auth check' };\n}\n\n/** Token usage from OpenRouter API response. */\nexport interface TokenUsage {\n  prompt_tokens: number;\n  completion_tokens: number;\n  total_tokens: number;\n}\n\nexport interface OpenRouterOptions {\n  apiKey: string;\n  model: string;\n  systemPrompt: string;\n  userContent: string;\n  /** Called with usage from the API response when present (for observability). */\n  onUsage?: (usage: TokenUsage) => void;\n  /** Called with response metadata (usage + sizes) for per-call analytics. */\n  onMeta?: (meta: { usage?: TokenUsage; responseChars: number; rawJsonChars: number }) => void;\n}\n\n/**\n * Strips markdown code fence if present. Handles ```json ... ```, ``` ... ```, and inline text.\n */\nexport function stripMarkdownJson(raw: string): string {\n  let trimmed = raw.trim();\n  // Remove optional leading BOM or whitespace\n  trimmed = trimmed.replace(/^\\uFEFF/, '');\n  // Try: ```json ... ``` or ``` ... ``` (multiline; content may have newlines)\n  const codeBlockMatch = trimmed.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)```/);\n  if (codeBlockMatch) {\n    trimmed = codeBlockMatch[1].trim();\n  }\n  // If still no JSON object, try extracting first { ... } (nested braces)\n  if (!trimmed.startsWith('{')) {\n    const start = trimmed.indexOf('{');\n    if (start !== -1) {\n      let depth = 0;\n      let end = -1;\n      for (let i = start; i < trimmed.length; i++) {\n        if (trimmed[i] === '{') depth++;\n        else if (trimmed[i] === '}') {\n          depth--;\n          if (depth === 0) {\n            end = i;\n            break;\n          }\n        }\n      }\n      if (end !== -1) trimmed = trimmed.slice(start, end + 1);\n    }\n  }\n  return trimmed;\n}\n\nfunction normalizeJsonForParsing(raw: string): string {\n  let s = raw.trim();\n  // Replace “smart quotes” with ASCII quotes (common model formatting issue)\n  s = s.replace(/[“”]/g, '\"').replace(/[‘’]/g, \"'\");\n  // Remove trailing commas in objects/arrays: { \"a\": 1, } or [1,2,]\n  s = s.replace(/,\\s*([}\\]])/g, '$1');\n  return s;\n}\n\nfunction parseJsonWithSmallRepairs(rawJson: string): unknown {\n  const normalized = normalizeJsonForParsing(rawJson);\n  return JSON.parse(normalized) as unknown;\n}\n\n/**\n * Low-level: send request, return parsed JSON (no validation).\n * Throws on HTTP error, missing content, or invalid JSON.\n */\nexport async function callOpenRouterRaw(options: OpenRouterOptions): Promise<unknown> {\n  const { apiKey, model, systemPrompt, userContent } = options;\n\n  const res = await fetch(OPENROUTER_URL, {\n    method: 'POST',\n    headers: {\n      Authorization: `Bearer ${apiKey}`,\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({\n      model,\n      messages: [\n        { role: 'system', content: systemPrompt },\n        { role: 'user', content: userContent },\n      ],\n    }),\n  });\n\n  if (!res.ok) {\n    const text = await res.text();\n    throw new OpenRouterHttpError(res.status, `OpenRouter API error ${res.status}: ${text.slice(0, 500)}`);\n  }\n\n  const data = (await res.json()) as {\n    choices?: Array<{ message?: { content?: string } }>;\n    usage?: { prompt_tokens?: number; completion_tokens?: number; total_tokens?: number };\n  };\n  const content = data?.choices?.[0]?.message?.content;\n  if (typeof content !== 'string') {\n    throw new Error('OpenRouter response missing choices[0].message.content');\n  }\n  const u = data?.usage;\n  const usage: TokenUsage | undefined =\n    u && typeof u.prompt_tokens === 'number' && typeof u.completion_tokens === 'number'\n      ? {\n        prompt_tokens: u.prompt_tokens,\n        completion_tokens: u.completion_tokens,\n        total_tokens: typeof u.total_tokens === 'number' ? u.total_tokens : u.prompt_tokens + u.completion_tokens,\n      }\n      : undefined;\n  if (usage && options.onUsage) options.onUsage(usage);\n\n  const rawJson = stripMarkdownJson(content);\n  if (options.onMeta) {\n    options.onMeta({ usage, responseChars: content.length, rawJsonChars: rawJson.length });\n  }\n  try {\n    return parseJsonWithSmallRepairs(rawJson);\n  } catch {\n    const snippet = rawJson.slice(0, 500);\n    const hint = rawJson.includes('```') ? ' (Response may be in a code block; strip failed.)' : '';\n    throw new Error(\n      'OpenRouter returned invalid JSON.' + hint + ' Raw (first 500 chars): ' + snippet\n    );\n  }\n}\n\n/**\n * Call OpenRouter and validate response with a strict validator. Throws on validation failure.\n */\nexport async function callOpenRouterWithValidator<T>(\n  options: OpenRouterOptions,\n  validate: (parsed: unknown) => T,\n  stepName: string\n): Promise<T> {\n  const parsed = await callOpenRouterRaw(options);\n  try {\n    return validate(parsed);\n  } catch (err) {\n    const msg = err instanceof Error ? err.message : String(err);\n    throw new Error(`[AI step \"${stepName}\"] Validation failed: ${msg}`);\n  }\n}\n\nexport type FreeRouterFeedbackIssue = 'error' | 'rate_limited' | 'unavailable';\n\nexport interface FreeRouterCallFeedback {\n  requestId?: string;\n  onSuccess: (modelId: string) => void;\n  onIssue: (modelId: string, issue: FreeRouterFeedbackIssue, details?: string) => void;\n}\n\n/**\n * Try OpenRouter models in order until one returns valid JSON for the step.\n * Optional feedback hooks for [Free LLM Router](https://freellmrouter.com/docs).\n */\nexport async function callOpenRouterWithValidatorTryModels<T>(\n  base: Omit<OpenRouterOptions, 'model'>,\n  models: string[],\n  validate: (parsed: unknown) => T,\n  stepName: string,\n  feedback?: FreeRouterCallFeedback\n): Promise<{ result: T; modelUsed: string }> {\n  if (models.length === 0) {\n    throw new Error(`[AI step \"${stepName}\"] No OpenRouter models to try`);\n  }\n  let lastError: Error | undefined;\n  for (const model of models) {\n    try {\n      const result = await callOpenRouterWithValidator({ ...base, model }, validate, stepName);\n      feedback?.onSuccess(model);\n      return { result, modelUsed: model };\n    } catch (e) {\n      const details = e instanceof Error ? e.message : String(e);\n      if (e instanceof OpenRouterHttpError) {\n        feedback?.onIssue(model, issueFromHttpStatus(e.status), details);\n      } else {\n        feedback?.onIssue(model, 'error', details);\n      }\n      lastError = e instanceof Error ? e : new Error(String(e));\n    }\n  }\n  throw lastError ?? new Error(`[AI step \"${stepName}\"] All models failed`);\n}\n\n// --- Strict validators for multi-step AI ---\n\nexport interface PackageOverview {\n  summary: string;\n  sideEffects: string[];\n  keywords: string[];\n  frameworks: string[];\n  whenToUse?: string;\n  reasonToUse?: string[];\n  useCases?: string[];\n  documentation?: string;\n  relatedPackages?: string[];\n  extensions?: Record<string, unknown>;\n}\n\nfunction isStringArray(x: unknown): x is string[] {\n  return Array.isArray(x) && x.every((v) => typeof v === 'string');\n}\n\n/**\n * Guardrail: Step 1 response must have summary (string), sideEffects, keywords, frameworks (string[]).\n * Optional: whenToUse, reasonToUse, useCases, documentation, relatedPackages.\n */\nexport function validatePackageOverview(parsed: unknown): PackageOverview {\n  if (parsed === null || typeof parsed !== 'object') {\n    throw new Error('Response must be a JSON object');\n  }\n  const o = parsed as Record<string, unknown>;\n  if (typeof o.summary !== 'string') {\n    throw new Error('Missing or invalid \"summary\" (must be a string)');\n  }\n  if (!isStringArray(o.sideEffects)) {\n    throw new Error('\"sideEffects\" must be an array of strings');\n  }\n  if (!isStringArray(o.keywords)) {\n    throw new Error('\"keywords\" must be an array of strings');\n  }\n  if (!isStringArray(o.frameworks)) {\n    throw new Error('\"frameworks\" must be an array of strings');\n  }\n  const out: PackageOverview = {\n    summary: o.summary.trim(),\n    sideEffects: o.sideEffects,\n    keywords: o.keywords,\n    frameworks: o.frameworks,\n  };\n  if (typeof o.whenToUse === 'string') out.whenToUse = o.whenToUse.trim();\n  if (isStringArray(o.reasonToUse)) out.reasonToUse = o.reasonToUse;\n  if (isStringArray(o.useCases)) out.useCases = o.useCases;\n  if (typeof o.documentation === 'string') out.documentation = o.documentation.trim();\n  if (isStringArray(o.relatedPackages)) out.relatedPackages = o.relatedPackages;\n  if (o.extensions && typeof o.extensions === 'object') out.extensions = o.extensions as Record<string, unknown>;\n  return out;\n}\n\nfunction isExportKind(s: string): s is ExportMeta['type'] {\n  return s === 'function' || s === 'class' || s === 'type';\n}\n\nfunction normalizeExportEntry(name: string, value: unknown): ExportMeta | null {\n  if (value === null || typeof value !== 'object') return null;\n  const v = value as Record<string, unknown>;\n  const type = v.type as string;\n  if (!isExportKind(type)) return null;\n  const description = typeof v.description === 'string' ? v.description : '';\n  const hook = Boolean(v.hook);\n  const base: ExportMeta = { type, description, hook };\n  const optionalKeys = ['params', 'returns', 'sideEffect', 'example'] as const;\n  for (const key of optionalKeys) {\n    const val = v[key];\n    if (typeof val === 'string') (base as Record<string, unknown>)[key] = val;\n    else if (key === 'sideEffect' && typeof val === 'boolean') (base as Record<string, unknown>)[key] = val;\n  }\n  for (const [key, val] of Object.entries(v)) {\n    if (['type', 'description', 'hook', ...optionalKeys].includes(key)) continue;\n    if (val !== undefined && val !== null) (base as Record<string, unknown>)[key] = val;\n  }\n  return base;\n}\n\nexport interface ExportsStepResult {\n  exports: ExportsMap;\n  hooks: string[];\n}\n\n/**\n * Guardrail: Step 2 response must have exports (object) and hooks (string[]). Each export: type, description, hook.\n */\nexport function validateExportsStep(parsed: unknown): ExportsStepResult {\n  if (parsed === null || typeof parsed !== 'object') {\n    throw new Error('Response must be a JSON object');\n  }\n  const o = parsed as Record<string, unknown>;\n  if (o.exports === null || typeof o.exports !== 'object') {\n    throw new Error('Missing or invalid \"exports\" (must be an object)');\n  }\n  const exportsMap: ExportsMap = {};\n  for (const [name, value] of Object.entries(o.exports)) {\n    const entry = normalizeExportEntry(name, value);\n    if (entry) exportsMap[name] = entry;\n  }\n  const hooks = isStringArray(o.hooks) ? o.hooks : [];\n  return { exports: exportsMap, hooks };\n}\n\n/**\n * Validator for \"list export names only\" step. Returns array of export names.\n */\nexport function validateExportNamesList(parsed: unknown): string[] {\n  if (parsed === null || typeof parsed !== 'object') {\n    throw new Error('Response must be a JSON object');\n  }\n  const o = parsed as Record<string, unknown>;\n  if (!isStringArray(o.names)) {\n    throw new Error('Missing or invalid \"names\" (must be an array of strings)');\n  }\n  return o.names;\n}\n","/**\n * [Free LLM Router](https://freellmrouter.com/docs): fetch ranked free OpenRouter model IDs.\n * Uses FREE_LLM_ROUTER_API_KEY. Chat calls still go to OpenRouter with OPEN_ROUTER_API_KEY.\n */\n\nconst API = 'https://freellmrouter.com/api/v1';\n\nexport type FreeRouterUseCase = 'chat' | 'vision' | 'tools' | 'longContext' | 'reasoning';\nexport type FreeRouterSort = 'contextLength' | 'maxOutput' | 'capable' | 'leastIssues' | 'newest';\nexport type FreeRouterCacheMode = 'default' | 'no-store';\nexport type FreeRouterTimeRange = '15m' | '30m' | '1h' | '6h' | '24h' | '7d' | '30d' | 'all';\n\nconst CACHE_TTL_MS = 15 * 60 * 1000;\n\nexport interface GetModelIdsResult {\n  ids: string[];\n  requestId?: string;\n  count?: number;\n}\n\n/** Result of validating a Free LLM Router API key (does not use the model-ID cache). */\nexport type FreeLlmRouterKeyVerifyResult =\n  | { ok: true }\n  | {\n    ok: false;\n    reason: 'missing' | 'unauthorized' | 'bad_response' | 'http_error';\n    message: string;\n  };\n\n/**\n * Check whether a Free LLM Router API key is accepted by the service.\n * Uses `GET /models/ids?topN=1` only; does not read or write the in-process model list cache.\n *\n * @param options.apiKey — If omitted, uses `FREE_LLM_ROUTER_API_KEY` from the environment.\n */\nexport async function verifyFreeLlmRouterApiKey(options?: { apiKey?: string }): Promise<FreeLlmRouterKeyVerifyResult> {\n  const key = (options?.apiKey ?? process.env.FREE_LLM_ROUTER_API_KEY)?.trim();\n  if (!key) {\n    return { ok: false, reason: 'missing', message: 'FREE_LLM_ROUTER_API_KEY is not set' };\n  }\n  try {\n    const res = await fetch(`${API}/models/ids?topN=1`, {\n      headers: { Authorization: `Bearer ${key}` },\n    });\n    if (res.status === 401) {\n      return {\n        ok: false,\n        reason: 'unauthorized',\n        message:\n          'Free LLM Router rejected the key (401). Get a key at https://freellmrouter.com/dashboard?tab=api (docs: https://freellmrouter.com/docs) — it is not OPEN_ROUTER_API_KEY.',\n      };\n    }\n    if (!res.ok) {\n      const text = await res.text();\n      return {\n        ok: false,\n        reason: 'http_error',\n        message: `Free LLM Router API error ${res.status}: ${text.slice(0, 200)}`,\n      };\n    }\n    let body: unknown;\n    try {\n      body = await res.json();\n    } catch {\n      return { ok: false, reason: 'bad_response', message: 'Free LLM Router returned non-JSON' };\n    }\n    const ids = body !== null && typeof body === 'object' && 'ids' in body ? (body as { ids: unknown }).ids : undefined;\n    if (!Array.isArray(ids)) {\n      return { ok: false, reason: 'bad_response', message: 'Free LLM Router response missing ids array' };\n    }\n    return { ok: true };\n  } catch (e) {\n    const msg = e instanceof Error ? e.message : String(e);\n    return { ok: false, reason: 'http_error', message: msg };\n  }\n}\n\ninterface CacheEntry {\n  data: GetModelIdsResult;\n  timestamp: number;\n}\n\nconst cache = new Map<string, CacheEntry>();\n\nfunction routerApiKey(): string | undefined {\n  return process.env.FREE_LLM_ROUTER_API_KEY?.trim() || undefined;\n}\n\n/** Stable cache key regardless of useCase order. */\nfunction cacheKey(\n  useCase: FreeRouterUseCase[] | undefined,\n  sort: FreeRouterSort | undefined,\n  topN: number | undefined,\n  maxErrorRate: number | undefined,\n  timeRange: FreeRouterTimeRange | undefined,\n  myReports: boolean | undefined\n): string {\n  const normalized = useCase ? [...useCase].sort() : undefined;\n  return JSON.stringify({\n    useCase: normalized,\n    sort,\n    topN,\n    maxErrorRate,\n    timeRange,\n    myReports,\n  });\n}\n\n/**\n * Returns ranked free model IDs for OpenRouter. In-process cache (~15 minutes) matches\n * [Free LLM Router](https://freellmrouter.com/docs) SDK behavior.\n */\nexport async function getModelIds(\n  useCase?: FreeRouterUseCase[],\n  sort?: FreeRouterSort,\n  topN?: number,\n  options?: {\n    cache?: FreeRouterCacheMode;\n    maxErrorRate?: number;\n    timeRange?: FreeRouterTimeRange;\n    myReports?: boolean;\n  }\n): Promise<GetModelIdsResult> {\n  const key = routerApiKey();\n  if (!key) {\n    throw new Error(\n      'FREE_LLM_ROUTER_API_KEY is required when using --freellmrouter. Get a key at https://freellmrouter.com/dashboard?tab=api (https://freellmrouter.com/docs)'\n    );\n  }\n\n  const cacheMode = options?.cache ?? 'default';\n  const ck = cacheKey(useCase, sort, topN, options?.maxErrorRate, options?.timeRange, options?.myReports);\n  const cached = cache.get(ck);\n\n  if (cacheMode === 'default' && cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n    return cached.data;\n  }\n\n  try {\n    const params = new URLSearchParams();\n    const normalizedUseCase = useCase ? [...useCase].sort() : undefined;\n    if (normalizedUseCase?.length) params.set('useCase', normalizedUseCase.join(','));\n    if (sort) params.set('sort', sort);\n    if (topN !== undefined) params.set('topN', String(topN));\n    if (options?.maxErrorRate !== undefined) params.set('maxErrorRate', String(options.maxErrorRate));\n    if (options?.timeRange) params.set('timeRange', options.timeRange);\n    if (options?.myReports) params.set('myReports', 'true');\n\n    const url = `${API}/models/ids?${params}`;\n    const res = await fetch(url, {\n      headers: { Authorization: `Bearer ${key}` },\n    });\n    if (!res.ok) {\n      const text = await res.text();\n      if (res.status === 401) {\n        throw new Error(\n          'Free LLM Router rejected FREE_LLM_ROUTER_API_KEY (401). Get a key at https://freellmrouter.com/dashboard?tab=api — it is not OPEN_ROUTER_API_KEY (OpenRouter). Docs: https://freellmrouter.com/docs'\n        );\n      }\n      throw new Error(`Free LLM Router API error ${res.status}: ${text.slice(0, 300)}`);\n    }\n    const body = (await res.json()) as { ids?: unknown; requestId?: string; count?: number };\n    const ids = Array.isArray(body.ids) ? body.ids.filter((x): x is string => typeof x === 'string') : [];\n    const result: GetModelIdsResult = {\n      ids,\n      requestId: typeof body.requestId === 'string' ? body.requestId : undefined,\n      count: typeof body.count === 'number' ? body.count : ids.length,\n    };\n    cache.set(ck, { data: result, timestamp: Date.now() });\n    return result;\n  } catch (err) {\n    if (cached) {\n      if (process.env.NODE_ENV !== 'production') {\n        console.warn('[hayagriva-llm] Free LLM Router request failed, using stale cached model list', err);\n      }\n      return cached.data;\n    }\n    throw err;\n  }\n}\n\n/** Fire-and-forget feedback (does not count toward router quota per docs). */\nexport function reportIssue(\n  modelId: string,\n  issue: 'error' | 'rate_limited' | 'unavailable',\n  requestId?: string,\n  details?: string\n): void {\n  const key = routerApiKey();\n  if (!key) return;\n  fetch(`${API}/models/feedback`, {\n    method: 'POST',\n    headers: {\n      Authorization: `Bearer ${key}`,\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ modelId, issue, requestId, details }),\n  }).catch(() => { });\n}\n\nexport function reportSuccess(modelId: string, requestId?: string, details?: string): void {\n  const key = routerApiKey();\n  if (!key) return;\n  fetch(`${API}/models/feedback`, {\n    method: 'POST',\n    headers: {\n      Authorization: `Bearer ${key}`,\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ modelId, success: true, requestId, details }),\n  }).catch(() => { });\n}\n\nexport function clearFreeLlmRouterCacheForTests(): void {\n  cache.clear();\n}\n","/**\n * AI mode: multipart flow — small calls with progress feedback.\n * 1) Package overview. 2) List export names. 3..N) Export details in batches.\n */\n\nimport { readFileSync } from 'node:fs';\nimport {\n  callOpenRouterWithValidatorTryModels,\n  validatePackageOverview,\n  validateExportsStep,\n  validateExportNamesList,\n  type ExportsStepResult,\n  type TokenUsage,\n  type FreeRouterCallFeedback,\n} from './openrouter.js';\nimport { reportIssue, reportSuccess } from './freeLlmRouter.js';\nimport type { AIRawResponse } from './types.js';\n\nconst BATCH_SIZE = 8;\nconst BATCH_CONTEXT_MAX_CHARS = 24000;\n\nconst STEP_OVERVIEW_PROMPT = `You are a strict metadata generator for Node.js packages. Output ONLY valid JSON, no markdown, no explanation.\n\nTask: Produce a COMPREHENSIVE package-level overview so crawlers and LLMs can understand every use case and reason to use this package. Use the package manifest, optional source, and current llm.package.json (if provided) as reference.\n\nOutput schema — required fields first, then extensions for richer indexing:\n{\n  \"summary\": \"Two to four clear sentences: what the package does, who it is for, and main value. Write so a crawler or developer can immediately understand purpose and scope.\",\n  \"sideEffects\": [\"package-level side effects e.g. patches globals\", \"reads process.env\", \"modifies DOM\"],\n  \"keywords\": [\"broad\", \"search\", \"terms\", \"ecosystem\", \"use-case keywords\", \"e.g. http, validation, react, cli\", \"at least 5-15 terms\"],\n  \"frameworks\": [\"react\", \"vue\", \"node\", \"etc or empty array\"],\n  \"whenToUse\": \"One paragraph: when should a developer choose this package? Describe typical scenarios (e.g. 'Use when building X', 'Choose when you need Y'). Be specific.\",\n  \"reasonToUse\": [\"Reason 1: short bullet\", \"Reason 2: short bullet\", \"Reason 3: ...\", \"at least 3-5 reasons\"],\n  \"useCases\": [\"Concrete scenario 1: e.g. Building a REST API with validation\", \"Scenario 2: ...\", \"at least 3-5 use cases\"],\n  \"documentation\": \"URL to official docs or README, or 'See README' if none\",\n  \"relatedPackages\": [\"npm-package-a\", \"alternative-or-complementary-package\", \"optional; empty array if none\"],\n  \"extensions\": {\n    \"capabilities\": [\"high level capabilities; 5-12 bullets\"],\n    \"configuration\": [\"env vars / config knobs; if unknown: empty array\"],\n    \"limitations\": [\"known limitations or non-goals; empty if none\"],\n    \"security\": [\"security considerations: secrets, network, filesystem, exec; empty if none\"],\n    \"observability\": [\"logs/metrics/telemetry emitted by the package (if any)\"],\n    \"integration\": [\"IDE/tooling integration hints: Cursor, Antigravity, search/indexing\"],\n    \"examples\": [\"short usage examples at package level (not per-export)\"]\n  }\n}\n\nRules: summary 2-4 sentences. All arrays are string arrays only. Be comprehensive so each use case and reason is clear.`;\n\nconst STEP_LIST_NAMES_PROMPT = `You are a strict metadata generator for Node.js packages. Output ONLY valid JSON, no markdown, no explanation.\n\nTask: List the exact names of every exported symbol from the package. Return ONLY the names, no descriptions.\n\nOutput schema:\n{\n  \"names\": [\"exportName1\", \"exportName2\", \"useMyHook\", \"...\"]\n}\n\nRules: \"names\" must be an array of strings. One entry per export. No duplicates.`;\n\nconst STEP_BATCH_PROMPT = `You are a strict metadata generator for Node.js packages. Output ONLY valid JSON, no markdown, no explanation.\n\nTask: For ONLY the export names listed below, return COMPREHENSIVE metadata so crawlers and IDEs understand what each export does, when to use it, and how. Do not add any export not in the list.\n\nOutput schema — every export must have type, description, hook; fill params, returns, example when useful:\n{\n  \"exports\": {\n    \"<exportName>\": {\n      \"type\": \"function\" | \"class\" | \"type\",\n      \"description\": \"Three to five sentences: what it does, when to use it, and main behavior. Be specific so a developer or crawler can understand without reading source.\",\n      \"hook\": false,\n      \"params\": \"Optional: parameter names and types or short signature, e.g. 'options: { key: string }, callback?: () => void'\",\n      \"returns\": \"Optional: return type or one-line description of return value\",\n      \"sideEffect\": false,\n      \"example\": \"Optional: short code snippet or usage, e.g. 'createServer({ port: 3000 })' or \\\\\"import { x } from 'pkg'; x()\\\\\"\",\n      \"stability\": \"Optional: 'stable' | 'experimental' | 'deprecated'\",\n      \"notes\": \"Optional: caveats, gotchas, performance notes\"\n    }\n  },\n  \"hooks\": [\"useX\", \"useY\"]\n}\n\nRules: type must be \"function\", \"class\", or \"type\". hook: true only for names starting with \"use\". Do not add exports not in the list. Provide examples when meaningful.`;\n\nexport interface AiModeInput {\n  packageJsonContent: string;\n  entryPath: string | null;\n  includeSrc: boolean;\n  /** If we can statically determine export names, pass them to avoid an extra AI call. */\n  exportNames?: string[];\n  existingLlmPackageJson?: string;\n}\n\nexport function buildUserContent(input: AiModeInput): string {\n  const { packageJsonContent, entryPath, includeSrc, existingLlmPackageJson, exportNames } = input;\n  let content = 'Package manifest:\\n' + packageJsonContent;\n  if (existingLlmPackageJson) {\n    content += '\\n\\nCurrent llm.package.json (use as reference):\\n' + existingLlmPackageJson;\n  }\n  if (exportNames && exportNames.length > 0) {\n    content += '\\n\\nExport names (from static analysis):\\n' + JSON.stringify(exportNames);\n  }\n  if (includeSrc && entryPath) {\n    try {\n      content += '\\n\\nEntry file source:\\n' + readFileSync(entryPath, 'utf-8');\n    } catch {\n      // omit on read error\n    }\n  }\n  return content;\n}\n\nexport interface AiProgressReport {\n  current: number;\n  total: number;\n  message: string;\n}\n\nexport type AiProgressCallback = (report: AiProgressReport) => void;\n\nexport interface AiCallReport {\n  step: string;\n  model: string;\n  systemPromptChars: number;\n  userContentChars: number;\n  responseChars: number;\n  usage?: TokenUsage;\n  startedAt: string;\n  finishedAt: string;\n  durationMs: number;\n}\n\nexport type AiCallCallback = (report: AiCallReport) => void;\n\n/** When set, OpenRouter model IDs are tried in order (from Free LLM Router). */\nexport interface RunAiModeFreeRouter {\n  modelIds: string[];\n  requestId?: string;\n}\n\nexport interface RunAiModeOptions {\n  freeRouter?: RunAiModeFreeRouter;\n}\n\nfunction modelsForRun(model: string, freeRouter?: RunAiModeFreeRouter): string[] {\n  if (freeRouter?.modelIds && freeRouter.modelIds.length > 0) return freeRouter.modelIds;\n  return [model];\n}\n\nfunction buildFeedback(freeRouter?: RunAiModeFreeRouter): FreeRouterCallFeedback | undefined {\n  if (!freeRouter?.modelIds?.length) return undefined;\n  const { requestId } = freeRouter;\n  return {\n    requestId,\n    onSuccess: (modelId: string) => reportSuccess(modelId, requestId),\n    onIssue: (modelId: string, issue, details) => reportIssue(modelId, issue, requestId, details),\n  };\n}\n\n/**\n * Run AI mode: multipart flow with small calls and progress. Merges all batches.\n */\nfunction addUsage(acc: TokenUsage, u: TokenUsage): void {\n  acc.prompt_tokens += u.prompt_tokens;\n  acc.completion_tokens += u.completion_tokens;\n  acc.total_tokens += u.total_tokens;\n}\n\nexport async function runAiMode(\n  input: AiModeInput,\n  apiKey: string,\n  model: string,\n  onProgress?: AiProgressCallback,\n  onCall?: AiCallCallback,\n  options?: RunAiModeOptions\n): Promise<AIRawResponse> {\n  const userContent = buildUserContent(input);\n  const totalUsage: TokenUsage = { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 };\n  const onUsage = (u: TokenUsage) => addUsage(totalUsage, u);\n  const candidateModels = modelsForRun(model, options?.freeRouter);\n  const feedback = buildFeedback(options?.freeRouter);\n\n  let exportNames = input.exportNames ?? [];\n  if (exportNames.length === 0) {\n    onProgress?.({ current: 0, total: 0, message: 'Preflight: listing export names (AI)' });\n    const namesStart = Date.now();\n    let responseChars = 0;\n    let rawChars = 0;\n    let usage: TokenUsage | undefined;\n    const namesTry = await callOpenRouterWithValidatorTryModels(\n      {\n        apiKey,\n        systemPrompt: STEP_LIST_NAMES_PROMPT,\n        userContent,\n        onUsage,\n        onMeta: (m) => {\n          responseChars = m.responseChars;\n          rawChars = m.rawJsonChars;\n          usage = m.usage;\n        },\n      },\n      candidateModels,\n      validateExportNamesList,\n      'export-names',\n      feedback\n    );\n    exportNames = namesTry.result;\n    const modelUsed = namesTry.modelUsed;\n    onCall?.({\n      step: 'export-names',\n      model: modelUsed,\n      systemPromptChars: STEP_LIST_NAMES_PROMPT.length,\n      userContentChars: userContent.length,\n      responseChars: responseChars || rawChars,\n      usage,\n      startedAt: new Date(namesStart).toISOString(),\n      finishedAt: new Date().toISOString(),\n      durationMs: Date.now() - namesStart,\n    });\n    onProgress?.({\n      current: 0,\n      total: 0,\n      message: `Preflight: export names resolved (${exportNames.length})`,\n    });\n  }\n  const batches: string[][] = [];\n  for (let i = 0; i < exportNames.length; i += BATCH_SIZE) {\n    batches.push(exportNames.slice(i, i + BATCH_SIZE));\n  }\n\n  const totalSteps = 1 + batches.length;\n\n  onProgress?.({ current: 1, total: totalSteps, message: 'Package overview' });\n  const overviewStart = Date.now();\n  let overviewResponseChars = 0;\n  let overviewRawChars = 0;\n  let overviewUsage: TokenUsage | undefined;\n  const overviewTry = await callOpenRouterWithValidatorTryModels(\n    {\n      apiKey,\n      systemPrompt: STEP_OVERVIEW_PROMPT,\n      userContent,\n      onUsage,\n      onMeta: (m) => {\n        overviewResponseChars = m.responseChars;\n        overviewRawChars = m.rawJsonChars;\n        overviewUsage = m.usage;\n      },\n    },\n    candidateModels,\n    validatePackageOverview,\n    'package-overview',\n    feedback\n  );\n  const overview = overviewTry.result;\n  const overviewModel = overviewTry.modelUsed;\n  onCall?.({\n    step: 'package-overview',\n    model: overviewModel,\n    systemPromptChars: STEP_OVERVIEW_PROMPT.length,\n    userContentChars: userContent.length,\n    responseChars: overviewResponseChars || overviewRawChars,\n    usage: overviewUsage,\n    startedAt: new Date(overviewStart).toISOString(),\n    finishedAt: new Date().toISOString(),\n    durationMs: Date.now() - overviewStart,\n  });\n\n  const mergedExports: AIRawResponse['exports'] = {};\n  const mergedHooks: string[] = [];\n\n  if (batches.length === 0) {\n    // nothing else\n  } else {\n    let packageLabel = 'this package';\n    try {\n      const pkg = JSON.parse(input.packageJsonContent) as { name?: string; version?: string };\n      if (pkg.name) packageLabel = `${pkg.name}${pkg.version ? ` @ ${pkg.version}` : ''}`;\n    } catch {\n      // ignore\n    }\n    for (let i = 0; i < batches.length; i++) {\n      const batch = batches[i];\n      const batchNum = i + 1;\n      onProgress?.({\n        current: 2 + i,\n        total: totalSteps,\n        message: `Export details (batch ${batchNum}/${batches.length}, ${batch.length} exports)`,\n      });\n      const baseContext =\n        userContent.length <= BATCH_CONTEXT_MAX_CHARS\n          ? userContent\n          : userContent.slice(0, BATCH_CONTEXT_MAX_CHARS) + '\\n…(context truncated)…';\n      const batchUserContent =\n        `${baseContext}\\n\\n` +\n        `Package: ${packageLabel}\\n\\n` +\n        `Export names to describe (only these):\\n${JSON.stringify(batch)}`;\n      const batchStart = Date.now();\n      let responseChars = 0;\n      let rawChars = 0;\n      let usage: TokenUsage | undefined;\n      const batchTry = await callOpenRouterWithValidatorTryModels<ExportsStepResult>(\n        {\n          apiKey,\n          systemPrompt: STEP_BATCH_PROMPT,\n          userContent: batchUserContent,\n          onUsage,\n          onMeta: (m) => {\n            responseChars = m.responseChars;\n            rawChars = m.rawJsonChars;\n            usage = m.usage;\n          },\n        },\n        candidateModels,\n        validateExportsStep,\n        `exports-batch-${batchNum}`,\n        feedback\n      );\n      const result = batchTry.result;\n      const batchModel = batchTry.modelUsed;\n      onCall?.({\n        step: `exports-batch-${batchNum}`,\n        model: batchModel,\n        systemPromptChars: STEP_BATCH_PROMPT.length,\n        userContentChars: batchUserContent.length,\n        responseChars: responseChars || rawChars,\n        usage,\n        startedAt: new Date(batchStart).toISOString(),\n        finishedAt: new Date().toISOString(),\n        durationMs: Date.now() - batchStart,\n      });\n      Object.assign(mergedExports, result.exports);\n      for (const h of result.hooks) {\n        if (!mergedHooks.includes(h)) mergedHooks.push(h);\n      }\n    }\n  }\n\n  return {\n    summary: overview.summary,\n    sideEffects: overview.sideEffects,\n    keywords: overview.keywords,\n    frameworks: overview.frameworks,\n    whenToUse: overview.whenToUse,\n    reasonToUse: overview.reasonToUse,\n    useCases: overview.useCases,\n    documentation: overview.documentation,\n    relatedPackages: overview.relatedPackages,\n    extensions: overview.extensions,\n    exports: mergedExports,\n    hooks: mergedHooks,\n    usage: totalUsage.total_tokens > 0 ? totalUsage : undefined,\n    inputChars: userContent.length,\n    batches: { size: BATCH_SIZE, batchCount: batches.length },\n  };\n}\n","/**\n * Build llm.package.txt — LLM-optimized text summary. Includes extended fields for search/IDE.\n */\n\nimport type { LLMPackageJson, ExportMeta } from './types.js';\n\nfunction isStringArray(x: unknown): x is string[] {\n  return Array.isArray(x) && x.every((v) => typeof v === 'string');\n}\n\nfunction stringifyWithLimit(value: unknown, limitChars = 20000): string {\n  const s = JSON.stringify(value, null, 2) ?? '';\n  if (s.length <= limitChars) return s;\n  return s.slice(0, limitChars) + '\\n…(truncated)…';\n}\n\nfunction formatExportLine(name: string, info: ExportMeta): string {\n  const parts: string[] = [name];\n  if (info.hook) parts.push('(Hook)');\n  if (info.description) parts.push(':', info.description);\n  if (info.params) parts.push('— params:', info.params);\n  if (info.returns) parts.push('— returns:', info.returns);\n  if (info.sideEffect) parts.push('— side effect');\n  if (info.example) parts.push('— e.g.', info.example);\n  return '- ' + parts.join(' ');\n}\n\n/** Consistent section order for crawler-friendly llm.package.txt. */\nexport function buildTxtMetadata(meta: LLMPackageJson): string {\n  const lines: string[] = [\n    `Package: ${meta.name}`,\n    `Version: ${meta.version}`,\n    '',\n    'Description:',\n    meta.description || '(none)',\n    '',\n  ];\n\n  if (meta.summary) {\n    lines.push('Summary:', meta.summary, '');\n  }\n\n  if (meta.whenToUse) {\n    lines.push('When to use:', meta.whenToUse, '');\n  }\n\n  if (meta.reasonToUse && meta.reasonToUse.length > 0) {\n    lines.push('Reason to use:');\n    for (const r of meta.reasonToUse) lines.push('- ' + r);\n    lines.push('');\n  }\n\n  if (meta.useCases && meta.useCases.length > 0) {\n    lines.push('Use cases:');\n    for (const u of meta.useCases) lines.push('- ' + u);\n    lines.push('');\n  }\n\n  if (meta.sideEffects && meta.sideEffects.length > 0) {\n    lines.push('Side effects:');\n    for (const s of meta.sideEffects) lines.push('- ' + s);\n    lines.push('');\n  }\n\n  if (meta.keywords && meta.keywords.length > 0) {\n    lines.push('Keywords:', meta.keywords.join(', '), '');\n  }\n\n  if (meta.documentation) {\n    lines.push('', 'Documentation:', meta.documentation, '');\n  }\n\n  if (meta.relatedPackages && meta.relatedPackages.length > 0) {\n    lines.push('Related packages:', meta.relatedPackages.join(', '), '');\n  }\n\n  if (meta.extensions && typeof meta.extensions === 'object') {\n    const ext = meta.extensions as Record<string, unknown>;\n    const capabilities = ext.capabilities;\n    const configuration = ext.configuration;\n    const limitations = ext.limitations;\n    const security = ext.security;\n    const observability = ext.observability;\n    const integration = ext.integration;\n    const examples = ext.examples;\n\n    if (isStringArray(capabilities) && capabilities.length > 0) {\n      lines.push('Capabilities:');\n      for (const c of capabilities) lines.push('- ' + c);\n      lines.push('');\n    }\n    if (isStringArray(configuration) && configuration.length > 0) {\n      lines.push('Configuration:');\n      for (const c of configuration) lines.push('- ' + c);\n      lines.push('');\n    }\n    if (isStringArray(integration) && integration.length > 0) {\n      lines.push('Integration:');\n      for (const c of integration) lines.push('- ' + c);\n      lines.push('');\n    }\n    if (isStringArray(observability) && observability.length > 0) {\n      lines.push('Observability:');\n      for (const c of observability) lines.push('- ' + c);\n      lines.push('');\n    }\n    if (isStringArray(security) && security.length > 0) {\n      lines.push('Security notes:');\n      for (const c of security) lines.push('- ' + c);\n      lines.push('');\n    }\n    if (isStringArray(limitations) && limitations.length > 0) {\n      lines.push('Limitations / non-goals:');\n      for (const c of limitations) lines.push('- ' + c);\n      lines.push('');\n    }\n    if (isStringArray(examples) && examples.length > 0) {\n      lines.push('Examples:');\n      for (const c of examples) lines.push('- ' + c);\n      lines.push('');\n    }\n\n    // Always include raw extensions JSON for crawlers/LLMs (bounded).\n    lines.push('Extensions (JSON):');\n    lines.push(stringifyWithLimit(ext));\n    lines.push('');\n  }\n\n  lines.push('Exports:');\n  for (const [name, info] of Object.entries(meta.exports).sort(([a], [b]) => a.localeCompare(b))) {\n    lines.push(formatExportLine(name, info));\n  }\n\n  if (meta.hooks.length > 0) {\n    lines.push('', 'Hooks:');\n    for (const h of meta.hooks) lines.push('- ' + h);\n  }\n\n  if (meta.frameworks && meta.frameworks.length > 0) {\n    lines.push('', 'Frameworks:', meta.frameworks.join(', '));\n  }\n\n  return lines.join('\\n').trimEnd() + '\\n';\n}\n","/**\r\n * Build a Cursor rule (.mdc) file from LLM package metadata.\r\n * The rule gives the IDE/AI project-specific context (exports, use cases, conventions).\r\n */\r\n\r\nimport type { LLMPackageJson, ExportMeta } from './types.js';\r\n\r\nfunction isStringArray(x: unknown): x is string[] {\r\n  return Array.isArray(x) && x.every((v) => typeof v === 'string');\r\n}\r\n\r\nfunction formatExport(name: string, info: ExportMeta): string {\r\n  const parts = [name];\r\n  if (info.hook) parts.push('(Hook)');\r\n  if (info.description) parts.push('—', info.description);\r\n  if (info.params) parts.push('Params:', info.params);\r\n  if (info.returns) parts.push('Returns:', info.returns);\r\n  if (info.example) parts.push('Example:', info.example);\r\n  return '- **' + parts[0] + '**' + (parts.length > 1 ? ': ' + parts.slice(1).join(' ') : '');\r\n}\r\n\r\n/**\r\n * Build the body of a .mdc rule: project context for Cursor/AI.\r\n */\r\nexport function buildRuleMdcContent(meta: LLMPackageJson): string {\r\n  const lines: string[] = [];\r\n\r\n  const desc = meta.summary ?? meta.description ?? `Package ${meta.name}.`;\r\n  lines.push('## Project context', '');\r\n  lines.push(desc, '');\r\n\r\n  if (meta.whenToUse) {\r\n    lines.push('### When to use', '', meta.whenToUse, '');\r\n  }\r\n\r\n  if (meta.reasonToUse && meta.reasonToUse.length > 0) {\r\n    lines.push('### Reasons to use', '');\r\n    for (const r of meta.reasonToUse) lines.push('- ' + r);\r\n    lines.push('');\r\n  }\r\n\r\n  if (meta.useCases && meta.useCases.length > 0) {\r\n    lines.push('### Use cases', '');\r\n    for (const u of meta.useCases) lines.push('- ' + u);\r\n    lines.push('');\r\n  }\r\n\r\n  if (meta.keywords && meta.keywords.length > 0) {\r\n    lines.push('### Keywords', '', meta.keywords.join(', '), '');\r\n  }\r\n\r\n  if (meta.frameworks && meta.frameworks.length > 0) {\r\n    lines.push('### Frameworks', '', meta.frameworks.join(', '), '');\r\n  }\r\n\r\n  if (meta.sideEffects && meta.sideEffects.length > 0) {\r\n    lines.push('### Side effects', '');\r\n    for (const s of meta.sideEffects) lines.push('- ' + s);\r\n    lines.push('');\r\n  }\r\n\r\n  const exportEntries = Object.entries(meta.exports).sort(([a], [b]) => a.localeCompare(b));\r\n  if (exportEntries.length > 0) {\r\n    lines.push('### Exports', '');\r\n    for (const [name, info] of exportEntries) {\r\n      lines.push(formatExport(name, info));\r\n    }\r\n    lines.push('');\r\n  }\r\n\r\n  if (meta.hooks && meta.hooks.length > 0) {\r\n    lines.push('### Hooks', '', meta.hooks.join(', '), '');\r\n  }\r\n\r\n  if (meta.documentation) {\r\n    lines.push('### Documentation', '', meta.documentation, '');\r\n  }\r\n\r\n  if (meta.relatedPackages && meta.relatedPackages.length > 0) {\r\n    lines.push('### Related packages', '', meta.relatedPackages.join(', '), '');\r\n  }\r\n\r\n  const ext = meta.extensions;\r\n  if (ext && typeof ext === 'object') {\r\n    const capabilities = ext.capabilities;\r\n    const integration = ext.integration;\r\n    if (isStringArray(capabilities) && capabilities.length > 0) {\r\n      lines.push('### Capabilities', '');\r\n      for (const c of capabilities) lines.push('- ' + c);\r\n      lines.push('');\r\n    }\r\n    if (isStringArray(integration) && integration.length > 0) {\r\n      lines.push('### Integration (IDE/tooling)', '');\r\n      for (const i of integration) lines.push('- ' + i);\r\n      lines.push('');\r\n    }\r\n  }\r\n\r\n  lines.push('---', '');\r\n  lines.push(`*Generated by ${meta.generatedBy} (mode: ${meta.mode}). Use \\`llm.package.json\\` / \\`llm.package.txt\\` for full metadata.*`);\r\n\r\n  return lines.join('\\n').trimEnd() + '\\n';\r\n}\r\n\r\n/**\r\n * Build full .mdc file with optional frontmatter (description, globs).\r\n */\r\nexport function buildRuleMdc(meta: LLMPackageJson, options?: { globs?: string[] }): string {\r\n  const description = meta.summary ?? meta.description ?? `Context for ${meta.name}`;\r\n  const body = buildRuleMdcContent(meta);\r\n\r\n  const globs = options?.globs ?? ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.mjs', '**/*.cjs'];\r\n  const frontmatter = [\r\n    '---',\r\n    `description: \"${description.replace(/\"/g, '\\\\\"')}\"`,\r\n    `globs: ${JSON.stringify(globs)}`,\r\n    '---',\r\n    '',\r\n  ].join('\\n');\r\n\r\n  return frontmatter + body;\r\n}\r\n","import { readFileSync } from 'node:fs';\r\nimport { resolve, dirname } from 'node:path';\r\nimport { fileURLToPath } from 'node:url';\r\n\r\nexport function getVersion(): string {\r\n  try {\r\n    const __dirname = dirname(fileURLToPath(import.meta.url));\r\n    const pkgPath = resolve(__dirname, '..', 'package.json');\r\n    const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { version?: string };\r\n    return pkg.version ?? '0.0.0';\r\n  } catch {\r\n    return '0.0.0';\r\n  }\r\n}\r\n","import { mkdirSync, writeFileSync, appendFileSync, existsSync, readFileSync } from 'node:fs';\r\nimport { resolve } from 'node:path';\r\nimport { randomUUID } from 'node:crypto';\r\n\r\nexport const OBS_DIRNAME = '.hayagriva-llm';\r\nexport const RUNS_JSONL = 'runs.jsonl';\r\nexport const LAST_RUN_JSON = 'last-run.json';\r\n\r\nexport interface AiCallAnalytics {\r\n  step: string;\r\n  startedAt: string;\r\n  finishedAt: string;\r\n  durationMs: number;\r\n  model: string;\r\n  systemPromptChars: number;\r\n  userContentChars: number;\r\n  responseChars: number;\r\n  usage?: {\r\n    prompt_tokens: number;\r\n    completion_tokens: number;\r\n    total_tokens: number;\r\n  };\r\n}\r\n\r\nexport interface GenerateRunAnalytics {\r\n  id: string;\r\n  command: 'generate';\r\n  cwd: string;\r\n  startedAt: string;\r\n  finishedAt?: string;\r\n  durationMs?: number;\r\n  ok?: boolean;\r\n  error?: { message: string };\r\n\r\n  node: { version: string; platform: string; arch: string };\r\n\r\n  package: {\r\n    name: string;\r\n    version: string;\r\n    description?: string;\r\n    entryPath: string | null;\r\n  };\r\n\r\n  flags: {\r\n    mode: 'static' | 'ai';\r\n    includeSrc: boolean;\r\n    verbose: boolean;\r\n    apiKeyProvided: boolean;\r\n    model: string;\r\n    freeLlmRouter?: boolean;\r\n  };\r\n\r\n  outputs?: {\r\n    jsonPath: string;\r\n    txtPath: string;\r\n    action: 'created' | 'updated';\r\n  };\r\n\r\n  ai?: {\r\n    calls: AiCallAnalytics[];\r\n    totals?: {\r\n      prompt_tokens: number;\r\n      completion_tokens: number;\r\n      total_tokens: number;\r\n    };\r\n    inputChars?: number;\r\n    batches?: { size: number; batchCount: number };\r\n  };\r\n}\r\n\r\nexport function ensureObsDir(cwd: string): string {\r\n  const dir = resolve(cwd, OBS_DIRNAME);\r\n  if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\r\n  return dir;\r\n}\r\n\r\nexport function newRunId(): string {\r\n  return randomUUID();\r\n}\r\n\r\nexport function writeLastRun(cwd: string, run: GenerateRunAnalytics): void {\r\n  const dir = ensureObsDir(cwd);\r\n  writeFileSync(resolve(dir, LAST_RUN_JSON), JSON.stringify(run, null, 2) + '\\n', 'utf-8');\r\n}\r\n\r\nexport function appendRunJsonl(cwd: string, run: GenerateRunAnalytics): void {\r\n  const dir = ensureObsDir(cwd);\r\n  appendFileSync(resolve(dir, RUNS_JSONL), JSON.stringify(run) + '\\n', 'utf-8');\r\n}\r\n\r\nexport function readRuns(cwd: string, max = 500): GenerateRunAnalytics[] {\r\n  const dir = ensureObsDir(cwd);\r\n  const p = resolve(dir, RUNS_JSONL);\r\n  if (!existsSync(p)) return [];\r\n  const raw = readFileSync(p, 'utf-8');\r\n  const lines = raw.split(/\\r?\\n/).filter(Boolean);\r\n  const slice = lines.length > max ? lines.slice(lines.length - max) : lines;\r\n  const out: GenerateRunAnalytics[] = [];\r\n  for (const line of slice) {\r\n    try {\r\n      const v = JSON.parse(line) as GenerateRunAnalytics;\r\n      if (v && typeof v === 'object' && v.command === 'generate') out.push(v);\r\n    } catch {\r\n      // skip corrupted lines\r\n    }\r\n  }\r\n  return out;\r\n}\r\n\r\n","/**\n * Colorful CLI UI: ANSI colors, circle progress graph, auth and step feedback.\n */\n\nconst reset = '\\u001b[0m';\nconst bold = '\\u001b[1m';\nconst dim = '\\u001b[2m';\nconst green = '\\u001b[32m';\nconst red = '\\u001b[31m';\nconst yellow = '\\u001b[33m';\nconst blue = '\\u001b[34m';\nconst magenta = '\\u001b[35m';\nconst cyan = '\\u001b[36m';\n\nconst filled = '●';\nconst empty = '○';\n\n/**\n * Build a circle-style progress bar: done filled, (total - done) empty.\n * Color: filled = cyan, empty = dim.\n */\nexport function circleProgress(done: number, total: number): string {\n  if (total <= 0) return `${dim}[${empty}]${reset}`;\n  const n = Math.min(12, Math.max(1, total)); // cap segments for display\n  const filledCount = total <= n ? done : Math.round((done / total) * n);\n  const filledSegments = filledCount;\n  const emptySegments = n - filledSegments;\n  const a = cyan + filled.repeat(Math.max(0, filledSegments)) + reset;\n  const b = dim + empty.repeat(Math.max(0, emptySegments)) + reset;\n  return `${dim}[${reset}${a}${b}${dim}]${reset}`;\n}\n\n/**\n * Print \"Auth: checking...\" in yellow.\n */\nexport function printAuthChecking(): void {\n  console.error(`${yellow}${bold}🔐 Auth:${reset} ${yellow}checking...${reset}`);\n}\n\n/**\n * Print \"Auth: ✓ successful\" in green.\n */\nexport function printAuthSuccess(): void {\n  console.error(`${green}${bold}🔐 Auth:${reset} ${green}✓ successful${reset}`);\n}\n\n/**\n * Print \"Auth: ✗ failed\" in red with optional message.\n */\nexport function printAuthFailure(message?: string): void {\n  console.error(`${red}${bold}🔐 Auth:${reset} ${red}✗ failed${reset}` + (message ? ` ${dim}(${message})${reset}` : ''));\n}\n\n/**\n * Print \"Rate limited (429)\" in yellow with hint to retry or use another model.\n */\nexport function printRateLimited(message?: string): void {\n  console.error(`${yellow}${bold}⚠ Rate limited:${reset} ${yellow}model temporarily rate-limited (429)${reset}` + (message ? `\\n  ${dim}${message.slice(0, 300)}${reset}` : ''));\n  console.error(`${dim}  Tip: Retry later, or set OPEN_ROUTER_MODEL to another model (e.g. openai/gpt-3.5-turbo), or add your provider key at https://openrouter.ai/settings/integrations${reset}`);\n}\n\n/**\n * Print one step with circle graph: \"  Step X/Y: message    [●●●○○] X/Y\"\n */\nexport function printStep(current: number, total: number, message: string): void {\n  const circle = circleProgress(current, total);\n  const stepLabel =\n    current <= 0 || total <= 0 ? `${magenta}Preflight${reset}` : `${blue}Step ${current}/${total}${reset}`;\n  const msg = `${cyan}${message}${reset}`;\n  const countLabel =\n    current <= 0 || total <= 0 ? `${dim}${reset}` : `${dim}${current}/${total} done${reset}`;\n  console.error(`  ${stepLabel}  ${msg}  ${circle}  ${countLabel}`.trimEnd());\n}\n\n/**\n * Print AI mode header (colorful).\n */\nexport function printAiModeHeader(): void {\n  console.error(`${magenta}${bold}AI mode:${reset} ${dim}multiple small calls (overview → names → batched details)${reset}`);\n}\n\n/**\n * Print \"AI steps done.\" in green.\n */\nexport function printAiStepsDone(): void {\n  console.error(`  ${green}✓ AI steps done.${reset}`);\n}\n","/**\n * Main orchestration: load package.json, detect entry, run mode, write outputs.\n */\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { detectEntryFile } from './parseExports.js';\nimport { extractStaticExports, getHooksFromExports } from './staticMode.js';\nimport { runAiMode } from './aiMode.js';\nimport { buildJsonMetadata } from './buildJsonMetadata.js';\nimport { buildTxtMetadata } from './buildTxtMetadata.js';\nimport { buildRuleMdc } from './buildRuleMdc.js';\nimport { getVersion } from './version.js';\nimport { checkOpenRouterAuth, checkOpenRouterAuthTryModels } from './openrouter.js';\nimport { getModelIds } from './freeLlmRouter.js';\nimport { appendRunJsonl, newRunId, writeLastRun, type AiCallAnalytics, type GenerateRunAnalytics } from './observability.js';\nimport {\n  printAuthChecking,\n  printAuthSuccess,\n  printAuthFailure,\n  printRateLimited,\n  printAiModeHeader,\n  printStep,\n  printAiStepsDone,\n} from './ui.js';\nimport type { GenerateOptions, PackageJsonLike, ExportsMap } from './types.js';\nimport type { AIRawResponse, LLMPackageJson } from './types.js';\n\nconst PKG_NAME = 'hayagriva-llm';\n\nfunction loadExistingMeta(jsonPath: string): LLMPackageJson | null {\n  if (!existsSync(jsonPath)) return null;\n  try {\n    const raw = readFileSync(jsonPath, 'utf-8');\n    const data = JSON.parse(raw) as unknown;\n    if (data === null || typeof data !== 'object') return null;\n    return data as LLMPackageJson;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Merge new metadata with existing: new content wins for known sections;\n * existing content is preserved when new omits optional keys.\n */\nfunction mergeWithExisting(newMeta: LLMPackageJson, existing: LLMPackageJson): LLMPackageJson {\n  const merged: LLMPackageJson = { ...(existing as LLMPackageJson), ...(newMeta as LLMPackageJson) };\n  const a = existing.extensions;\n  const b = newMeta.extensions;\n  if (a && typeof a === 'object' && b && typeof b === 'object') {\n    merged.extensions = { ...(a as Record<string, unknown>), ...(b as Record<string, unknown>) };\n  }\n  return merged;\n}\n\nconst KNOWN_AI_KEYS = new Set([\n  'exports', 'hooks', 'frameworks', 'summary', 'sideEffects', 'keywords',\n  'whenToUse', 'reasonToUse', 'useCases', 'documentation', 'relatedPackages',\n  'extensions',\n  // observability-only keys (never written into llm.package.json)\n  'usage', 'inputChars', 'batches',\n]);\n\nfunction getExtrasFromAIResponse(result: AIRawResponse): Record<string, unknown> {\n  const extras: Record<string, unknown> = {};\n  for (const [key, value] of Object.entries(result)) {\n    if (KNOWN_AI_KEYS.has(key) || value === undefined || value === null) continue;\n    extras[key] = value;\n  }\n  return extras;\n}\n\nfunction loadPackageJson(cwd: string): PackageJsonLike {\n  const path = resolve(cwd, 'package.json');\n  if (!existsSync(path)) {\n    throw new Error(\n      `No package.json found at ${path}. Run this command from your package root (where package.json lives).`\n    );\n  }\n  try {\n    const raw = readFileSync(path, 'utf-8');\n    return JSON.parse(raw) as PackageJsonLike;\n  } catch (e) {\n    const err = e instanceof Error ? e : new Error(String(e));\n    throw new Error(`Failed to load package.json at ${path}: ${err.message}`);\n  }\n}\n\n/** Safe filename slug from package name for .mdc rule file. */\nfunction ruleFilenameFromPackageName(name: string): string {\n  const slug = name.replace(/@/g, '').replace(/[^a-z0-9-]/gi, '-').replace(/-+/g, '-').replace(/^-|-$/g, '') || 'project';\n  return `${slug}.mdc`;\n}\n\nexport async function generate(cwd: string, options: GenerateOptions): Promise<void> {\n  const { mode, apiKey, model, includeSrc, verbose, generateRule, freeLlmRouter } = options;\n  const log = verbose ? (msg: string) => console.error('[hayagriva-llm]', msg) : () => { };\n\n  const jsonPath = resolve(cwd, 'llm.package.json');\n  const txtPath = resolve(cwd, 'llm.package.txt');\n  const existing = loadExistingMeta(jsonPath);\n  if (existing) log('Using existing llm.package.json as reference');\n\n  const run: GenerateRunAnalytics = {\n    id: newRunId(),\n    command: 'generate',\n    cwd,\n    startedAt: new Date().toISOString(),\n    node: { version: process.version, platform: process.platform, arch: process.arch },\n    package: { name: 'unknown', version: '0.0.0', entryPath: null },\n    flags: {\n      mode,\n      includeSrc: Boolean(includeSrc),\n      verbose: Boolean(verbose),\n      apiKeyProvided: Boolean(apiKey && apiKey.trim() !== ''),\n      model,\n      ...(freeLlmRouter ? { freeLlmRouter: true } : {}),\n    },\n  };\n\n  log('Loading package.json');\n  const packageJson = loadPackageJson(cwd);\n  run.package = {\n    name: packageJson.name ?? 'unknown',\n    version: packageJson.version ?? '0.0.0',\n    description: typeof packageJson.description === 'string' ? packageJson.description : undefined,\n    entryPath: null,\n  };\n\n  log('Detecting entry file');\n  const entryPath = detectEntryFile(packageJson, cwd);\n  run.package.entryPath = entryPath;\n  if (!entryPath) {\n    log('No entry file found; exports will be empty in static mode.');\n  } else {\n    log('Entry: ' + entryPath);\n  }\n\n  let exports: ExportsMap;\n  let hooks: string[];\n  let frameworks: string[] = [];\n  let summary: string | undefined;\n  let sideEffects: string[] | undefined;\n  let keywords: string[] | undefined;\n  let whenToUse: string | undefined;\n  let reasonToUse: string[] | undefined;\n  let useCases: string[] | undefined;\n  let documentation: string | undefined;\n  let relatedPackages: string[] | undefined;\n  let extensions: Record<string, unknown> | undefined;\n  let extras: Record<string, unknown> = {};\n\n  try {\n    if (mode === 'static') {\n      if (entryPath) {\n        exports = extractStaticExports(entryPath);\n        hooks = getHooksFromExports(exports);\n      } else {\n        exports = {};\n        hooks = [];\n      }\n    } else {\n      const key = apiKey ?? process.env.OPEN_ROUTER_API_KEY ?? process.env.OPENROUTER_API_KEY;\n      if (!key || key.trim() === '') {\n        throw new Error('AI mode requires --api-key or OPEN_ROUTER_API_KEY (or OPENROUTER_API_KEY)');\n      }\n      let freeRouterModelIds: string[] | undefined;\n      let freeRouterRequestId: string | undefined;\n      if (freeLlmRouter) {\n        log('Fetching free model list from Free LLM Router (cached ~15m in-process)');\n        const { ids, requestId } = await getModelIds(['chat'], 'capable', 25);\n        if (!ids.length) {\n          throw new Error(\n            'Free LLM Router returned no models; check FREE_LLM_ROUTER_API_KEY (get a key: https://freellmrouter.com/dashboard?tab=api) and https://freellmrouter.com/docs'\n          );\n        }\n        freeRouterModelIds = ids;\n        freeRouterRequestId = requestId;\n        if (verbose) {\n          log(`Free LLM Router: ${ids.length} candidate model(s), requestId=${requestId ?? 'n/a'}`);\n        }\n      }\n      printAiModeHeader();\n      printAuthChecking();\n      let authResult: Awaited<ReturnType<typeof checkOpenRouterAuth>>;\n      try {\n        authResult = freeRouterModelIds?.length\n          ? await checkOpenRouterAuthTryModels(key.trim(), freeRouterModelIds)\n          : await checkOpenRouterAuth(key.trim(), model);\n      } catch (e) {\n        printAuthFailure(e instanceof Error ? e.message : String(e));\n        throw e;\n      }\n      if (!authResult.ok) {\n        if (authResult.reason === 'rate_limited') {\n          printRateLimited(authResult.message);\n          throw new Error(\n            freeRouterModelIds?.length\n              ? 'OpenRouter: all Free LLM Router candidate models failed or were rate-limited (429). Retry later.'\n              : 'OpenRouter model rate-limited (429). Retry later or use another model (OPEN_ROUTER_MODEL).'\n          );\n        }\n        printAuthFailure('invalid or unauthorized API key');\n        throw new Error('OpenRouter API key invalid or unauthorized (401)');\n      }\n      printAuthSuccess();\n\n      // Prefer local export discovery so step counts are stable and we reduce AI overhead.\n      let exportNames: string[] = [];\n      if (entryPath) {\n        try {\n          const staticExports = extractStaticExports(entryPath);\n          exportNames = Object.keys(staticExports);\n        } catch {\n          exportNames = [];\n        }\n      }\n\n      const onProgress = (report: { current: number; total: number; message: string }) => {\n        printStep(report.current, report.total, report.message);\n      };\n\n      const aiCalls: AiCallAnalytics[] = [];\n\n      const result = await runAiMode(\n        {\n          packageJsonContent: JSON.stringify(packageJson, null, 2),\n          entryPath,\n          includeSrc,\n          exportNames,\n          existingLlmPackageJson: existing ? JSON.stringify(existing, null, 2) : undefined,\n        },\n        key.trim(),\n        model,\n        onProgress,\n        (c) => {\n          aiCalls.push({\n            step: c.step,\n            startedAt: c.startedAt,\n            finishedAt: c.finishedAt,\n            durationMs: c.durationMs,\n            model: c.model,\n            systemPromptChars: c.systemPromptChars,\n            userContentChars: c.userContentChars,\n            responseChars: c.responseChars,\n            usage: c.usage,\n          });\n        },\n        freeRouterModelIds?.length\n          ? { freeRouter: { modelIds: freeRouterModelIds, requestId: freeRouterRequestId } }\n          : undefined\n      );\n      printAiStepsDone();\n\n      run.ai = {\n        calls: aiCalls,\n        totals: result.usage,\n        inputChars: result.inputChars,\n        batches: result.batches,\n      };\n\n      exports = result.exports;\n      hooks = result.hooks ?? [];\n      frameworks = result.frameworks ?? [];\n      summary = result.summary;\n      sideEffects = result.sideEffects;\n      keywords = result.keywords;\n      whenToUse = result.whenToUse;\n      reasonToUse = result.reasonToUse;\n      useCases = result.useCases;\n      documentation = result.documentation;\n      relatedPackages = result.relatedPackages;\n      extensions = typeof result.extensions === 'object' && result.extensions ? (result.extensions as Record<string, unknown>) : undefined;\n      extras = getExtrasFromAIResponse(result);\n    }\n  } catch (e) {\n    run.ok = false;\n    run.finishedAt = new Date().toISOString();\n    run.durationMs = Date.now() - Date.parse(run.startedAt);\n    run.error = { message: e instanceof Error ? e.message : String(e) };\n    writeLastRun(cwd, run);\n    appendRunJsonl(cwd, run);\n    throw e;\n  }\n\n  const generatedBy = `${PKG_NAME}@${getVersion()}`;\n  const meta = buildJsonMetadata({\n    packageJson,\n    exports,\n    hooks,\n    frameworks,\n    mode,\n    generatedBy,\n    summary,\n    sideEffects,\n    keywords,\n    whenToUse,\n    reasonToUse,\n    useCases,\n    documentation,\n    relatedPackages,\n    extensions,\n    extras: Object.keys(extras).length > 0 ? extras : undefined,\n  });\n\n  const finalMeta = existing ? mergeWithExisting(meta, existing) : meta;\n\n  writeFileSync(jsonPath, JSON.stringify(finalMeta, null, 2) + '\\n', 'utf-8');\n  writeFileSync(txtPath, buildTxtMetadata(finalMeta), 'utf-8');\n\n  let rulePath: string | undefined;\n  if (generateRule) {\n    const rulesDir = resolve(cwd, '.cursor', 'rules');\n    if (!existsSync(rulesDir)) mkdirSync(rulesDir, { recursive: true });\n    const ruleFile = ruleFilenameFromPackageName(finalMeta.name);\n    rulePath = resolve(rulesDir, ruleFile);\n    writeFileSync(rulePath, buildRuleMdc(finalMeta), 'utf-8');\n  }\n\n  // Always print outcome so user sees feedback even without --verbose\n  if (existing) {\n    console.log('Updated llm.package.json (merged with existing)');\n    console.log('Updated llm.package.txt');\n  } else {\n    console.log('Created llm.package.json');\n    console.log('Created llm.package.txt');\n  }\n  if (rulePath) console.log('Created ' + rulePath);\n  log('Paths: ' + jsonPath + ', ' + txtPath + (rulePath ? ', ' + rulePath : ''));\n\n  run.ok = true;\n  run.finishedAt = new Date().toISOString();\n  run.durationMs = Date.now() - Date.parse(run.startedAt);\n  run.outputs = { jsonPath, txtPath, action: existing ? 'updated' : 'created' };\n  writeLastRun(cwd, run);\n  appendRunJsonl(cwd, run);\n\n  console.log(`Dashboard: run \"hayagriva-llm dashboard\" (serves ${resolve(cwd, '.hayagriva-llm')})`);\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { LLMPackageJson, PackageJsonLike } from './types.js';\nimport { getVersion } from './version.js';\n\nfunction safeReadJson<T>(path: string): T | null {\n  if (!existsSync(path)) return null;\n  try {\n    return JSON.parse(readFileSync(path, 'utf-8')) as T;\n  } catch {\n    return null;\n  }\n}\n\nfunction getRepoPackageJson(cwd: string): PackageJsonLike | null {\n  return safeReadJson<PackageJsonLike>(resolve(cwd, 'package.json'));\n}\n\nfunction getLlmPackageJson(cwd: string): LLMPackageJson | null {\n  return safeReadJson<LLMPackageJson>(resolve(cwd, 'llm.package.json'));\n}\n\nfunction bullets(items: string[] | undefined): string[] {\n  if (!items || items.length === 0) return ['- (none)'];\n  return items.map((x) => `- ${x}`);\n}\n\nfunction codeBlock(lines: string[]): string[] {\n  return ['```', ...lines, '```'];\n}\n\nfunction formatExports(meta: LLMPackageJson | null): string[] {\n  if (!meta) {\n    return [\n      '- (not available — run `hayagriva-llm generate` to create `llm.package.json`, then re-run this command)',\n    ];\n  }\n  const entries = Object.entries(meta.exports ?? {}).sort(([a], [b]) => a.localeCompare(b));\n  if (entries.length === 0) return ['- (none detected)'];\n\n  const lines: string[] = [];\n  for (const [name, info] of entries) {\n    const tag = info.hook ? ' (hook)' : '';\n    const desc = typeof info.description === 'string' && info.description.trim() ? ` — ${info.description.trim()}` : '';\n    lines.push(`- \\`${name}\\`${tag}${desc}`);\n  }\n  return lines;\n}\n\nexport function buildAgentMd(cwd: string): string {\n  const pkg = getRepoPackageJson(cwd);\n  const llm = getLlmPackageJson(cwd);\n\n  const name = llm?.name ?? pkg?.name ?? 'this project';\n  const version = llm?.version ?? pkg?.version;\n  const description =\n    llm?.summary ??\n    (typeof pkg?.description === 'string' ? pkg.description : undefined) ??\n    (llm?.description ? llm.description : undefined) ??\n    '';\n\n  const generatedBy = `hayagriva-llm@${getVersion()}`;\n\n  const out: string[] = [];\n  out.push('# AGENT.md', '');\n\n  out.push('## Purpose', '');\n  out.push(`This file gives coding agents a reliable, repo-specific operating manual for **${name}**.`, '');\n  if (description) out.push(description, '');\n\n  out.push('## Quickstart', '');\n  out.push(...codeBlock(['npm install', 'npm test', 'npm run lint', 'npm run build']), '');\n\n  out.push('## Common commands', '');\n  out.push('- **Generate LLM metadata**:', '');\n  out.push(...codeBlock(['npx hayagriva-llm generate', '# or', 'hayagriva-llm generate']), '');\n  out.push('- **Start local dashboard**:', '');\n  out.push(...codeBlock(['npx hayagriva-llm dashboard', '# or', 'hayagriva-llm dashboard --port 4177']), '');\n  out.push('- **Generate this file**:', '');\n  out.push(...codeBlock(['npx hayagriva-llm agent', '# or', 'hayagriva-llm agent']), '');\n  out.push('- **Generate Cursor Agent Skill** (OpenRouter; overwrites existing):', '');\n  out.push(\n    ...codeBlock([\n      'hayagriva-llm generateskill',\n      '# or',\n      'hayagriva-llm skill --generateskill',\n    ]),\n    ''\n  );\n  out.push('- **Skill template (no API)**:', '');\n  out.push(...codeBlock(['hayagriva-llm skill --mode static']), '');\n\n  out.push('## Project snapshot', '');\n  out.push(`- **name**: ${name}`);\n  if (version) out.push(`- **version**: ${version}`);\n  if (pkg?.type) out.push(`- **module type**: ${String(pkg.type)}`);\n  if (pkg?.main) out.push(`- **main**: ${String(pkg.main)}`);\n  if (pkg?.module) out.push(`- **module**: ${String(pkg.module)}`);\n  if (pkg?.source) out.push(`- **source**: ${String(pkg.source)}`);\n  out.push('');\n\n  out.push('## Package behavior (from llm.package.json)', '');\n  out.push('- **mode used to generate llm metadata**:', `  - ${llm?.mode ?? '(unknown)'}`);\n  out.push('- **frameworks**:', ...bullets(llm?.frameworks), '');\n  out.push('- **hooks**:', ...bullets(llm?.hooks), '');\n  out.push('- **side effects**:', ...bullets(llm?.sideEffects), '');\n  out.push('- **keywords**:', ...bullets(llm?.keywords), '');\n\n  out.push('## API surface (exports)', '');\n  out.push(...formatExports(llm), '');\n\n  out.push('## Repo map (expected)', '');\n  out.push('- **`src/`**: CLI + generation logic');\n  out.push('- **`test/`**: Vitest tests');\n  out.push('- **`website/`**: Docusaurus docs');\n  out.push('- **`dist/`**: build output (published)');\n  out.push('');\n\n  out.push('## Agent workflow', '');\n  out.push('- **Understand intent**: read `README.md`, then relevant source under `src/`.');\n  out.push('- **Prefer small, safe changes**: keep public CLI behavior stable.');\n  out.push(\n    '- **Follow existing patterns**: ESM, `commander`, `ts-morph` for static mode, OpenRouter only in AI mode; optional `--freellmrouter` + `FREE_LLM_ROUTER_API_KEY` for ranked free models.'\n  );\n  out.push('- **After edits**: run lint/tests/build locally if you are allowed in your environment.');\n  out.push('');\n\n  out.push('## Conventions', '');\n  out.push('- **Node**: 18+');\n  out.push('- **Module system**: ESM (`\"type\": \"module\"`)');\n  out.push('- **CLI**: `src/cli.ts` with `commander`');\n  out.push(\n    '- **Generated artifacts**: `llm.package.json`, `llm.package.txt`, optional `.cursor/rules/*.mdc`, optional `.cursor/skills/*/SKILL.md`'\n  );\n  out.push('');\n\n  out.push('## Release & publishing notes', '');\n  out.push('- `npm publish` runs lint/tests/build via `prepublishOnly`.');\n  out.push('- Only `dist/` is published (see `files` in `package.json`).');\n  out.push('');\n\n  out.push('## Troubleshooting', '');\n  out.push('- **AI mode auth errors**: set `OPEN_ROUTER_API_KEY` (or pass `--api-key`).');\n  out.push('- **No exports found**: ensure your `package.json` entry/exports points to the right file.');\n  out.push('- **Rule generation**: pass `--rule` to `generate` to write `.cursor/rules/<pkg>.mdc`.');\n  out.push(\n    '- **Skill generation**: run `hayagriva-llm generateskill` (needs `OPEN_ROUTER_API_KEY`) or `hayagriva-llm skill --mode static` for a local template.'\n  );\n  out.push('');\n\n  out.push('---', '');\n  out.push(`*Generated by ${generatedBy} on ${new Date().toISOString()}.*`, '');\n\n  return out.join('\\n');\n}\n\n","/**\n * Build Cursor / Claude Agent Skill files (SKILL.md) from a simple, user-editable template.\n */\n\nexport interface SkillTemplateInput {\n  /** YAML frontmatter name (lowercase, hyphens). */\n  name: string;\n  /** Markdown H1 title. */\n  title: string;\n  /** Frontmatter description (third person, trigger terms). */\n  description: string;\n  instructions: string[];\n  workflowSteps: string[];\n  examples: string[];\n  resources: string[];\n  /** Optional freeform block the user can extend. */\n  userNotes?: string;\n}\n\nconst EDIT_HINT =\n  '<!-- hayagriva-llm: edit the sections below. Safe to change headings, bullets, and add files in this skill folder. -->';\n\nfunction bulletLines(items: string[]): string[] {\n  if (items.length === 0) return ['- (add your own)'];\n  return items.map((item) => `- ${item}`);\n}\n\nfunction numberedLines(items: string[]): string[] {\n  if (items.length === 0) return ['1. (add your own)'];\n  return items.map((item, i) => `${i + 1}. ${item}`);\n}\n\n/**\n * Render SKILL.md body from structured sections (mutable template for the user).\n */\nexport function buildSkillMdContent(input: SkillTemplateInput): string {\n  const lines: string[] = [\n    '---',\n    `name: ${input.name}`,\n    `description: ${JSON.stringify(input.description.trim())}`,\n    '---',\n    '',\n    `# ${input.title}`,\n    '',\n    EDIT_HINT,\n    '',\n    '## Instructions',\n    '',\n    ...bulletLines(input.instructions),\n    '',\n    '## Workflow',\n    '',\n    ...numberedLines(input.workflowSteps),\n    '',\n    '## Examples',\n    '',\n    ...bulletLines(input.examples),\n    '',\n    '## Additional resources',\n    '',\n    ...bulletLines(input.resources),\n    '',\n    '## Your notes',\n    '',\n    input.userNotes?.trim()\n      ? input.userNotes.trim()\n      : '<!-- Add project-specific conventions, links, or constraints here. -->',\n    '',\n  ];\n  return lines.join('\\n');\n}\n\nexport function slugifySkillName(raw: string): string {\n  const slug = raw\n    .toLowerCase()\n    .replace(/@/g, '')\n    .replace(/[^a-z0-9]+/g, '-')\n    .replace(/-+/g, '-')\n    .replace(/^-|-$/g, '');\n  return (slug || 'project-skill').slice(0, 64);\n}\n\nexport function validateSkillName(name: string): void {\n  if (!name || name.length > 64) {\n    throw new Error('Skill name must be 1–64 characters.');\n  }\n  if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name)) {\n    throw new Error(\n      'Skill name must use lowercase letters, numbers, and hyphens only (e.g. my-package-workflow).'\n    );\n  }\n}\n","/**\n * AI mode for skill generation: single OpenRouter call with strict JSON validation.\n */\n\nimport {\n  callOpenRouterWithValidator,\n  callOpenRouterWithValidatorTryModels,\n  type FreeRouterCallFeedback,\n} from './openrouter.js';\nimport type { SkillTemplateInput } from './buildSkillMd.js';\n\nexport interface SkillAiContext {\n  packageJson: string;\n  llmPackageJson?: string;\n  readmeExcerpt?: string;\n  brief?: string;\n}\n\nexport type SkillAiResult = SkillTemplateInput;\n\nfunction isStringArray(x: unknown): x is string[] {\n  return Array.isArray(x) && x.every((v) => typeof v === 'string');\n}\n\nexport function validateSkillAiResponse(parsed: unknown): SkillAiResult {\n  if (parsed === null || typeof parsed !== 'object') {\n    throw new Error('Response must be a JSON object');\n  }\n  const o = parsed as Record<string, unknown>;\n  if (typeof o.name !== 'string') throw new Error('Missing or invalid \"name\" (must be a string)');\n  if (typeof o.title !== 'string') throw new Error('Missing or invalid \"title\" (must be a string)');\n  if (typeof o.description !== 'string') {\n    throw new Error('Missing or invalid \"description\" (must be a string)');\n  }\n  if (!isStringArray(o.instructions)) throw new Error('\"instructions\" must be an array of strings');\n  if (!isStringArray(o.workflowSteps)) throw new Error('\"workflowSteps\" must be an array of strings');\n  if (!isStringArray(o.examples)) throw new Error('\"examples\" must be an array of strings');\n  if (!isStringArray(o.resources)) throw new Error('\"resources\" must be an array of strings');\n\n  const out: SkillAiResult = {\n    name: (o.name as string).trim(),\n    title: (o.title as string).trim(),\n    description: (o.description as string).trim(),\n    instructions: o.instructions.map((s) => s.trim()).filter(Boolean),\n    workflowSteps: o.workflowSteps.map((s) => s.trim()).filter(Boolean),\n    examples: o.examples.map((s) => s.trim()).filter(Boolean),\n    resources: o.resources.map((s) => s.trim()).filter(Boolean),\n  };\n  if (typeof o.userNotes === 'string' && o.userNotes.trim()) {\n    out.userNotes = o.userNotes.trim();\n  }\n  return out;\n}\n\nconst SKILL_AI_SYSTEM = `You are a strict generator for Cursor Agent Skills (SKILL.md). Output ONLY valid JSON, no markdown fences, no explanation.\n\nTask: Produce one skill definition for the given project context and user brief.\n\nOutput schema:\n{\n  \"name\": \"lowercase-hyphen-slug-max-64-chars\",\n  \"title\": \"Human-readable skill title\",\n  \"description\": \"Third-person description: what the skill does AND when to use it (trigger terms). Max ~500 chars.\",\n  \"instructions\": [\"3-8 concise imperative bullets for the agent\"],\n  \"workflowSteps\": [\"3-6 numbered workflow steps as plain strings (no numbers in text)\"],\n  \"examples\": [\"1-3 concrete example scenarios\"],\n  \"resources\": [\"0-4 optional links or filenames like reference.md\"],\n  \"userNotes\": \"Optional short paragraph for project-specific notes\"\n}\n\nRules:\n- \"name\" must match ^[a-z0-9]+(-[a-z0-9]+)*$\n- Description must be third person (not \"I\" or \"you can\")\n- Be specific to the project; avoid generic filler\n- Keep arrays non-empty except resources may be []`;\n\nexport async function runSkillAiMode(\n  context: SkillAiContext,\n  apiKey: string,\n  model: string,\n  freeRouter?: { modelIds: string[]; feedback?: FreeRouterCallFeedback }\n): Promise<SkillAiResult> {\n  const parts = [\n    '## package.json',\n    context.packageJson,\n  ];\n  if (context.llmPackageJson) {\n    parts.push('', '## llm.package.json', context.llmPackageJson);\n  }\n  if (context.readmeExcerpt) {\n    parts.push('', '## README (excerpt)', context.readmeExcerpt);\n  }\n  if (context.brief?.trim()) {\n    parts.push('', '## User brief', context.brief.trim());\n  }\n\n  const base = {\n    apiKey,\n    systemPrompt: SKILL_AI_SYSTEM,\n    userContent: parts.join('\\n'),\n  };\n\n  if (freeRouter?.modelIds.length) {\n    const { result } = await callOpenRouterWithValidatorTryModels(\n      base,\n      freeRouter.modelIds,\n      validateSkillAiResponse,\n      'skill',\n      freeRouter.feedback\n    );\n    return result;\n  }\n\n  return callOpenRouterWithValidator({ ...base, model }, validateSkillAiResponse, 'skill');\n}\n","/**\n * Core types for hayagriva-llm metadata generation.\n * Extensible for AI/adapters: extra fields are preserved.\n */\n\nexport type ExportKind = 'function' | 'class' | 'type';\n\n/** Core export fields; AI/adapters may add more (params, returns, sideEffect, etc.). */\nexport interface ExportMeta {\n  type: ExportKind;\n  description: string;\n  hook: boolean;\n  /** Optional: for IDE/search (e.g. param names, signature). */\n  params?: string;\n  /** Optional: return type or one-liner. */\n  returns?: string;\n  /** Optional: true if has side effects (IO, mutates state). */\n  sideEffect?: boolean;\n  /** Optional: example usage or snippet. */\n  example?: string;\n  [key: string]: unknown;\n}\n\nexport interface ExportsMap {\n  [name: string]: ExportMeta;\n}\n\n/** Extended metadata for IDE/indexing and crawlers (Cursor, Antigravity, etc.). */\nexport interface LLMPackageJson {\n  name: string;\n  version: string;\n  description: string;\n  /** One-paragraph summary for search/context (AI mode). */\n  summary?: string;\n  /** Side effects at package level (e.g. \"patches globals\", \"reads env\"). */\n  sideEffects?: string[];\n  /** Search/keyword hints. */\n  keywords?: string[];\n  /** When to use this package (one paragraph; AI mode). */\n  whenToUse?: string;\n  /** Reasons to use (bullet-style; AI mode). */\n  reasonToUse?: string[];\n  /** Concrete use cases / scenarios (AI mode). */\n  useCases?: string[];\n  /** Documentation URL or short note (AI mode). */\n  documentation?: string;\n  /** Related packages (AI mode). */\n  relatedPackages?: string[];\n  /** Optional extensibility container for additional crawler/IDE metadata (AI mode). */\n  extensions?: Record<string, unknown>;\n  exports: ExportsMap;\n  hooks: string[];\n  frameworks: string[];\n  generatedBy: string;\n  mode: 'static' | 'ai';\n  /** Preserve any extra fields from AI/adapters so structure doesn't break. */\n  [key: string]: unknown;\n}\n\nexport interface PackageJsonLike {\n  name?: string;\n  version?: string;\n  description?: string;\n  main?: string;\n  module?: string;\n  source?: string;\n  [key: string]: unknown;\n}\n\nexport interface GenerateOptions {\n  mode: 'static' | 'ai';\n  apiKey?: string;\n  model: string;\n  includeSrc: boolean;\n  verbose: boolean;\n  /** If true, also write a Cursor rule .mdc file to .cursor/rules/ */\n  generateRule?: boolean;\n  /**\n   * Use [Free LLM Router](https://freellmrouter.com/docs) to pick ranked free OpenRouter models.\n   * Requires FREE_LLM_ROUTER_API_KEY; chat requests still use OpenRouter with OPEN_ROUTER_API_KEY.\n   */\n  freeLlmRouter?: boolean;\n}\n\n/** AI response: only exports required; rest optional and extensible. */\nexport interface AIRawResponse {\n  exports: Record<string, ExportMeta>;\n  hooks?: string[];\n  frameworks?: string[];\n  summary?: string;\n  sideEffects?: string[];\n  keywords?: string[];\n  whenToUse?: string;\n  reasonToUse?: string[];\n  useCases?: string[];\n  documentation?: string;\n  relatedPackages?: string[];\n  extensions?: Record<string, unknown>;\n  /** Optional: token usage from provider (for observability only). */\n  usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n  /** Optional: size of input (chars) for observability. */\n  inputChars?: number;\n  /** Optional: batching details for observability. */\n  batches?: { size: number; batchCount: number };\n  [key: string]: unknown;\n}\n\nexport const DEFAULT_MODEL = 'openai/gpt-4o-mini';\n","/**\n * Generate Cursor / Claude Agent Skills (SKILL.md) with static template or single AI call.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { resolve } from 'node:path';\nimport {\n  buildSkillMdContent,\n  slugifySkillName,\n  validateSkillName,\n  type SkillTemplateInput,\n} from './buildSkillMd.js';\nimport { runSkillAiMode } from './skillAiMode.js';\nimport {\n  checkOpenRouterAuth,\n  checkOpenRouterAuthTryModels,\n} from './openrouter.js';\nimport { getModelIds } from './freeLlmRouter.js';\nimport type { LLMPackageJson, PackageJsonLike } from './types.js';\nimport {\n  printAiModeHeader,\n  printAuthChecking,\n  printAuthFailure,\n  printAuthSuccess,\n  printRateLimited,\n  printStep,\n} from './ui.js';\nimport { DEFAULT_MODEL } from './types.js';\n\nexport type SkillScope = 'project' | 'personal';\nexport type SkillMode = 'static' | 'ai';\n\n/**\n * Default brief for --generateskill / generateskill when --brief is omitted.\n */\nexport function defaultSkillBrief(pkg: PackageJsonLike, meta: LLMPackageJson | null): string {\n  const fromMeta = meta?.summary?.trim() || meta?.description?.trim();\n  if (fromMeta) return fromMeta;\n  const fromPkg = typeof pkg.description === 'string' ? pkg.description.trim() : '';\n  if (fromPkg) return fromPkg;\n  const name = pkg.name ?? 'this project';\n  return `Help agents work effectively with ${name}.`;\n}\n\nexport interface GenerateSkillOptions {\n  name?: string;\n  brief?: string;\n  mode: SkillMode;\n  scope: SkillScope;\n  force?: boolean;\n  apiKey?: string;\n  model: string;\n  verbose?: boolean;\n  freeLlmRouter?: boolean;\n}\n\nfunction loadPackageJson(cwd: string): PackageJsonLike {\n  const path = resolve(cwd, 'package.json');\n  if (!existsSync(path)) {\n    throw new Error(`No package.json found at ${path}. Run from your package root.`);\n  }\n  try {\n    return JSON.parse(readFileSync(path, 'utf-8')) as PackageJsonLike;\n  } catch (e) {\n    const err = e instanceof Error ? e.message : String(e);\n    throw new Error(`Failed to load package.json: ${err}`);\n  }\n}\n\nfunction loadLlmPackageJson(cwd: string): LLMPackageJson | null {\n  const path = resolve(cwd, 'llm.package.json');\n  if (!existsSync(path)) return null;\n  try {\n    return JSON.parse(readFileSync(path, 'utf-8')) as LLMPackageJson;\n  } catch {\n    return null;\n  }\n}\n\nfunction readmeExcerpt(cwd: string, maxChars = 4000): string | undefined {\n  const path = resolve(cwd, 'README.md');\n  if (!existsSync(path)) return undefined;\n  try {\n    const raw = readFileSync(path, 'utf-8');\n    return raw.length > maxChars ? raw.slice(0, maxChars) + '\\n…' : raw;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction resolveSkillDir(cwd: string, scope: SkillScope, name: string): string {\n  if (scope === 'personal') {\n    return resolve(homedir(), '.cursor', 'skills', name);\n  }\n  return resolve(cwd, '.cursor', 'skills', name);\n}\n\n/**\n * Build skill content locally from package metadata (no API).\n */\nexport function buildStaticSkillTemplate(\n  pkg: PackageJsonLike,\n  meta: LLMPackageJson | null,\n  opts?: { name?: string; brief?: string; cwd?: string }\n): SkillTemplateInput {\n  const root = opts?.cwd ?? process.cwd();\n  const pkgName = pkg.name ?? 'project';\n  const name = slugifySkillName(opts?.name?.trim() || pkgName);\n  const desc = meta?.summary ?? meta?.description ?? pkg.description ?? `Workflows for ${pkgName}.`;\n  const title = opts?.brief?.trim()\n    ? opts.brief.trim().replace(/\\.$/, '')\n    : `${pkgName} workflow`;\n\n  const useCases = meta?.useCases ?? [];\n  const reasons = meta?.reasonToUse ?? [];\n  const keywords = meta?.keywords ?? [];\n\n  const instructions: string[] = [\n    `Follow project conventions for ${pkgName}.`,\n    ...(useCases.slice(0, 3).map((u) => `Apply when: ${u}`)),\n    ...(reasons.slice(0, 2).map((r) => `Prefer: ${r}`)),\n    'Edit this SKILL.md to match your team standards.',\n  ];\n\n  const workflowSteps: string[] = [\n    'Read package.json and llm.package.json (if present) for context.',\n    'Identify the user goal and constraints from their message.',\n    'Make the smallest change that solves the task.',\n    'Verify behavior (tests or manual check) before finishing.',\n  ];\n\n  const exportNames = meta ? Object.keys(meta.exports).slice(0, 5) : [];\n  const examples: string[] = [\n    ...(exportNames.length\n      ? [`Use exports like ${exportNames.map((n) => `\\`${n}\\``).join(', ')} when relevant.`]\n      : []),\n    opts?.brief?.trim()\n      ? `User asks: \"${opts.brief.trim()}\" — follow the workflow above.`\n      : `User asks for help with ${pkgName} — use package metadata and source.`,\n  ];\n\n  const resources: string[] = [\n    ...(existsSync(resolve(root, 'llm.package.json')) ? ['llm.package.json'] : []),\n    ...(existsSync(resolve(root, 'AGENT.md')) ? ['AGENT.md'] : []),\n    'README.md',\n  ];\n\n  const triggerTerms = keywords.slice(0, 8).join(', ');\n  const description = [\n    desc,\n    triggerTerms ? `Use when working with ${triggerTerms}.` : '',\n    opts?.brief?.trim() ? `Triggers: ${opts.brief.trim()}.` : '',\n  ]\n    .filter(Boolean)\n    .join(' ');\n\n  return {\n    name,\n    title,\n    description,\n    instructions,\n    workflowSteps,\n    examples,\n    resources,\n    userNotes: '<!-- Add team-specific rules, links, or scripts here. -->',\n  };\n}\n\nexport async function generateSkill(\n  cwd: string,\n  options: GenerateSkillOptions\n): Promise<{ path: string; action: 'created' | 'updated'; mode: SkillMode }> {\n  const log = options.verbose ? (msg: string) => console.error('[hayagriva-llm skill]', msg) : () => {};\n\n  const pkg = loadPackageJson(cwd);\n  const meta = loadLlmPackageJson(cwd);\n  const brief = options.brief?.trim() || defaultSkillBrief(pkg, meta);\n  let template: SkillTemplateInput;\n\n  if (options.mode === 'ai') {\n    const key =\n      options.apiKey ?? process.env.OPEN_ROUTER_API_KEY ?? process.env.OPENROUTER_API_KEY;\n    if (!key?.trim()) {\n      throw new Error(\n        'OpenRouter API key required. Set OPEN_ROUTER_API_KEY in .env or pass --api-key. ' +\n          'Get a key: https://openrouter.ai/keys — then run: hayagriva-llm generateskill'\n      );\n    }\n\n    let freeRouterModelIds: string[] | undefined;\n    if (options.freeLlmRouter) {\n      log('Fetching free models from Free LLM Router');\n      const { ids } = await getModelIds(['chat'], 'capable', 25);\n      if (!ids.length) {\n        throw new Error('Free LLM Router returned no models; check FREE_LLM_ROUTER_API_KEY');\n      }\n      freeRouterModelIds = ids;\n    }\n\n    printAiModeHeader();\n    printAuthChecking();\n    const authResult = freeRouterModelIds?.length\n      ? await checkOpenRouterAuthTryModels(key.trim(), freeRouterModelIds)\n      : await checkOpenRouterAuth(key.trim(), options.model);\n    if (!authResult.ok) {\n      if (authResult.reason === 'rate_limited') {\n        printRateLimited(authResult.message);\n        throw new Error('OpenRouter rate-limited (429). Retry later or use another model.');\n      }\n      printAuthFailure('invalid or unauthorized API key');\n      throw new Error('OpenRouter API key invalid or unauthorized (401)');\n    }\n    printAuthSuccess();\n    printStep(1, 1, 'Generating skill content (single AI call)');\n\n    template = await runSkillAiMode(\n      {\n        packageJson: JSON.stringify(pkg, null, 2),\n        llmPackageJson: meta ? JSON.stringify(meta, null, 2) : undefined,\n        readmeExcerpt: readmeExcerpt(cwd),\n        brief,\n      },\n      key.trim(),\n      options.model,\n      freeRouterModelIds?.length ? { modelIds: freeRouterModelIds } : undefined\n    );\n\n    if (options.name?.trim()) {\n      template.name = slugifySkillName(options.name);\n    }\n  } else {\n    template = buildStaticSkillTemplate(pkg, meta, {\n      name: options.name,\n      brief,\n      cwd,\n    });\n    log('Built static skill template from package metadata');\n  }\n\n  validateSkillName(template.name);\n\n  const skillDir = resolveSkillDir(cwd, options.scope, template.name);\n  const skillPath = resolve(skillDir, 'SKILL.md');\n  const existed = existsSync(skillPath);\n\n  if (existed && !options.force) {\n    throw new Error(\n      `Refusing to overwrite ${skillPath}. Re-run with --force to overwrite.`\n    );\n  }\n\n  if (!existsSync(skillDir)) {\n    mkdirSync(skillDir, { recursive: true });\n  }\n\n  const content = buildSkillMdContent(template);\n  writeFileSync(skillPath, content, 'utf-8');\n\n  return { path: skillPath, action: existed ? 'updated' : 'created', mode: options.mode };\n}\n\nexport { DEFAULT_MODEL };\n","/**\n * AI Readiness Audit — scans a JS/TS package directory and produces a\n * weighted score (0-100) with colourful CLI output.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join, extname } from 'node:path';\n\n/* ── ANSI helpers ─────────────────────────────────────────────────────── */\n\nconst R   = '\\u001b[0m';\nconst B   = '\\u001b[1m';\nconst DIM = '\\u001b[2m';\nconst UL  = '\\u001b[4m';\nconst RED    = '\\u001b[31m';\nconst GRN    = '\\u001b[32m';\nconst YEL    = '\\u001b[33m';\nconst BLU    = '\\u001b[34m';\nconst MAG    = '\\u001b[35m';\nconst CYN    = '\\u001b[36m';\nconst WHT    = '\\u001b[37m';\nconst BG_GRN = '\\u001b[42m';\nconst BG_YEL = '\\u001b[43m';\nconst BG_RED = '\\u001b[41m';\n\n/* ── Types ────────────────────────────────────────────────────────────── */\n\nexport interface CheckResult {\n  label: string;\n  passed: boolean;\n  weight: number;\n}\n\nexport interface AuditResult {\n  score: number;\n  maxScore: number;\n  normalizedScore: number;\n  passed: CheckResult[];\n  failed: CheckResult[];\n  extras: ExtraDetection[];\n}\n\n/* ── Helpers ──────────────────────────────────────────────────────────── */\n\nfunction fileExists(cwd: string, ...segments: string[]): boolean {\n  return existsSync(join(cwd, ...segments));\n}\n\nfunction dirExists(cwd: string, ...segments: string[]): boolean {\n  const p = join(cwd, ...segments);\n  return existsSync(p) && statSync(p).isDirectory();\n}\n\nfunction readJson(cwd: string, file: string): Record<string, unknown> | null {\n  const p = join(cwd, file);\n  if (!existsSync(p)) return null;\n  try {\n    return JSON.parse(readFileSync(p, 'utf-8')) as Record<string, unknown>;\n  } catch {\n    return null;\n  }\n}\n\n/** Recursively collect source files (js/ts/jsx/tsx) up to a depth limit. */\nfunction collectSourceFiles(dir: string, depth = 3): string[] {\n  if (depth <= 0 || !existsSync(dir)) return [];\n  const results: string[] = [];\n  for (const entry of readdirSync(dir, { withFileTypes: true })) {\n    if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist') continue;\n    const full = join(dir, entry.name);\n    if (entry.isDirectory()) {\n      results.push(...collectSourceFiles(full, depth - 1));\n    } else if (['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'].includes(extname(entry.name))) {\n      results.push(full);\n    }\n  }\n  return results;\n}\n\nfunction sourceContains(cwd: string, pattern: RegExp, maxFiles = 200): boolean {\n  const files = collectSourceFiles(join(cwd, 'src')).slice(0, maxFiles);\n  for (const f of files) {\n    try {\n      if (pattern.test(readFileSync(f, 'utf-8'))) return true;\n    } catch { /* skip unreadable */ }\n  }\n  return false;\n}\n\n/* ── Individual checks ───────────────────────────────────────────────── */\n\nfunction checkReadme(cwd: string): CheckResult {\n  const passed = fileExists(cwd, 'README.md') || fileExists(cwd, 'readme.md') || fileExists(cwd, 'Readme.md');\n  return { label: 'README exists', passed, weight: 10 };\n}\n\nfunction checkTypeScript(cwd: string): CheckResult {\n  const pkg = readJson(cwd, 'package.json');\n  const hasTypesField = pkg !== null && ('types' in pkg || 'typings' in pkg);\n  const hasTsConfig = fileExists(cwd, 'tsconfig.json');\n  const hasDtsFiles = collectSourceFiles(cwd, 2).some(f => f.endsWith('.d.ts'));\n  const passed = hasTypesField || hasTsConfig || hasDtsFiles;\n  return { label: 'TypeScript declarations found', passed, weight: 10 };\n}\n\nfunction checkJsDoc(cwd: string): CheckResult {\n  const passed = sourceContains(cwd, /\\/\\*\\*[\\s\\S]*?\\*\\//);\n  return { label: 'JSDoc comments present', passed, weight: 10 };\n}\n\nfunction checkExamples(cwd: string): CheckResult {\n  const passed = dirExists(cwd, 'examples') || dirExists(cwd, 'example');\n  return { label: 'Structured examples detected', passed, weight: 10 };\n}\n\nfunction checkExportsField(cwd: string): CheckResult {\n  const pkg = readJson(cwd, 'package.json');\n  const passed = pkg !== null && 'exports' in pkg;\n  return { label: 'Package exports defined', passed, weight: 10 };\n}\n\nfunction checkLlmPackageJson(cwd: string): CheckResult {\n  const passed = fileExists(cwd, 'llm.package.json');\n  return { label: 'llm.package.json found', passed, weight: 25 };\n}\n\nfunction checkPromptTemplates(cwd: string): CheckResult {\n  const hasDir = dirExists(cwd, 'prompts') || dirExists(cwd, 'prompt-templates');\n  const hasInstructions = fileExists(cwd, 'llm.instructions.txt');\n  const hasPromptFiles = collectSourceFiles(cwd, 2).some(f => /prompt/i.test(f));\n  const passed = hasDir || hasInstructions || hasPromptFiles;\n  return { label: 'Prompt templates found', passed, weight: 10 };\n}\n\nfunction checkSecurityMeta(cwd: string): CheckResult {\n  const llmPkg = readJson(cwd, 'llm.package.json');\n  const hasSafetyInMeta = llmPkg !== null && ('safety' in llmPkg || 'security' in llmPkg || 'sideEffects' in llmPkg);\n  const hasSecurityMd = fileExists(cwd, 'SECURITY.md') || fileExists(cwd, 'security.md');\n  const passed = hasSafetyInMeta || hasSecurityMd;\n  return { label: 'AI safety / security metadata present', passed, weight: 15 };\n}\n\n/* ── Extra informational detections (not scored, enriches report) ───── */\n\nexport interface ExtraDetection { label: string; found: boolean }\n\nfunction detectExtras(cwd: string): ExtraDetection[] {\n  const pkg = readJson(cwd, 'package.json');\n  return [\n    { label: 'package.json found',       found: pkg !== null },\n    { label: 'types field in package.json', found: pkg !== null && ('types' in pkg || 'typings' in pkg) },\n    { label: 'docs folder exists',        found: dirExists(cwd, 'docs') },\n    { label: 'llm.instructions.txt exists', found: fileExists(cwd, 'llm.instructions.txt') },\n    { label: 'MCP config detected',       found: fileExists(cwd, 'mcp.json') || fileExists(cwd, '.mcp.json') || (pkg !== null && 'mcp' in pkg) },\n    { label: 'AI usage examples',         found: dirExists(cwd, 'examples') && collectSourceFiles(join(cwd, 'examples'), 1).some(f => /ai|llm|agent|chat/i.test(f)) },\n  ];\n}\n\n/* ── Score bar rendering ─────────────────────────────────────────────── */\n\nfunction scoreBar(score: number): string {\n  const width = 30;\n  const filled = Math.round((score / 100) * width);\n  const unfilled = width - filled;\n\n  let barColor: string;\n  if (score >= 70) barColor = GRN;\n  else if (score >= 40) barColor = YEL;\n  else barColor = RED;\n\n  const bar = barColor + '█'.repeat(filled) + DIM + '░'.repeat(unfilled) + R;\n  return `  ${bar}  ${B}${barColor}${score}${R}${DIM}/100${R}`;\n}\n\nfunction scoreBadge(score: number): string {\n  let bg: string, label: string;\n  if (score >= 80) { bg = BG_GRN; label = ' EXCELLENT '; }\n  else if (score >= 60) { bg = BG_YEL; label = '   GOOD    '; }\n  else if (score >= 40) { bg = BG_YEL; label = '   FAIR    '; }\n  else { bg = BG_RED; label = '   POOR    '; }\n  return `${bg}${B}${WHT}${label}${R}`;\n}\n\n/* ── Main audit ──────────────────────────────────────────────────────── */\n\nexport function computeAudit(cwd: string): AuditResult {\n  const checks: CheckResult[] = [\n    checkReadme(cwd),\n    checkTypeScript(cwd),\n    checkJsDoc(cwd),\n    checkExamples(cwd),\n    checkExportsField(cwd),\n    checkLlmPackageJson(cwd),\n    checkPromptTemplates(cwd),\n    checkSecurityMeta(cwd),\n  ];\n\n  const extras = detectExtras(cwd).filter(e => e.found);\n\n  const maxScore = checks.reduce((sum, c) => sum + c.weight, 0);\n  const rawScore = checks.reduce((sum, c) => sum + (c.passed ? c.weight : 0), 0);\n  const normalizedScore = Math.round((rawScore / maxScore) * 100);\n\n  return {\n    score: rawScore,\n    maxScore,\n    normalizedScore,\n    passed: checks.filter(c => c.passed),\n    failed: checks.filter(c => !c.passed),\n    extras,\n  };\n}\n\nexport function runAudit(cwd: string): void {\n  const divider  = `${DIM}${'━'.repeat(52)}${R}`;\n  const thinLine = `${DIM}${'─'.repeat(52)}${R}`;\n\n  const { normalizedScore: score, passed, failed, extras } = computeAudit(cwd);\n\n  /* Header */\n  console.log('');\n  console.log(divider);\n  console.log(`${B}${MAG}  ⚡  Hayagriva AI Audit${R}`);\n  console.log(divider);\n  console.log('');\n\n  /* Score */\n  console.log(`  ${B}${CYN}AI Readiness Score${R}    ${scoreBadge(score)}`);\n  console.log('');\n  console.log(scoreBar(score));\n  console.log('');\n\n  /* Passed checks */\n  if (passed.length > 0) {\n    console.log(thinLine);\n    console.log(`  ${B}${GRN}Passed${R}`);\n    console.log(thinLine);\n    for (const c of passed) {\n      const weightTag = `${DIM}(+${c.weight})${R}`;\n      console.log(`  ${GRN}${B}✓${R} ${GRN}${c.label}${R}  ${weightTag}`);\n    }\n    console.log('');\n  }\n\n  /* Failed checks */\n  if (failed.length > 0) {\n    console.log(thinLine);\n    console.log(`  ${B}${RED}Missing${R}`);\n    console.log(thinLine);\n    for (const c of failed) {\n      const weightTag = `${DIM}${RED}(-${c.weight})${R}`;\n      console.log(`  ${RED}${B}✗${R} ${RED}${c.label}${R}  ${weightTag}`);\n    }\n    console.log('');\n  }\n\n  /* Extra detections */\n  if (extras.length > 0) {\n    console.log(thinLine);\n    console.log(`  ${B}${BLU}Additional Detections${R}`);\n    console.log(thinLine);\n    for (const e of extras) {\n      console.log(`  ${CYN}●${R} ${DIM}${e.label}${R}`);\n    }\n    console.log('');\n  }\n\n  /* Recommendations */\n  if (failed.length > 0) {\n    console.log(thinLine);\n    console.log(`  ${B}${YEL}Recommendations${R}`);\n    console.log(thinLine);\n    const recs = buildRecommendations(failed);\n    for (const rec of recs) {\n      console.log(`  ${YEL}→${R} ${rec}`);\n    }\n    console.log('');\n  }\n\n  /* Footer */\n  console.log(divider);\n  console.log(`  ${DIM}Scanned: ${UL}${cwd}${R}`);\n  console.log(`  ${DIM}Powered by ${MAG}hayagriva-llm${R}`);\n  console.log(divider);\n  console.log('');\n}\n\n/* ── Recommendation builder ──────────────────────────────────────────── */\n\nfunction buildRecommendations(failed: CheckResult[]): string[] {\n  const map: Record<string, string> = {\n    'README exists':                          'Add a README.md with package overview and usage instructions',\n    'TypeScript declarations found':          'Add TypeScript declarations or a tsconfig.json',\n    'JSDoc comments present':                 'Add JSDoc comments to your exported functions and classes',\n    'Structured examples detected':           'Create an examples/ folder with usage snippets',\n    'Package exports defined':                'Add an \"exports\" field to package.json',\n    'llm.package.json found':                 'Run `hayagriva-llm generate` to create llm.package.json',\n    'Prompt templates found':                 'Add prompt templates or an llm.instructions.txt file',\n    'AI safety / security metadata present':  'Add safety/security metadata (SECURITY.md or sideEffects in llm.package.json)',\n  };\n\n  return failed.map(c => map[c.label] ?? `Address: ${c.label}`);\n}\n","import { createServer, type ServerResponse } from 'node:http';\r\nimport { resolve } from 'node:path';\r\nimport { ensureObsDir, readRuns, type GenerateRunAnalytics, LAST_RUN_JSON, OBS_DIRNAME } from './observability.js';\r\nimport { existsSync, readFileSync } from 'node:fs';\r\n\r\nfunction json(res: ServerResponse, status: number, body: unknown): void {\r\n  res.statusCode = status;\r\n  res.setHeader('Content-Type', 'application/json; charset=utf-8');\r\n  res.end(JSON.stringify(body, null, 2));\r\n}\r\n\r\nfunction html(res: ServerResponse, status: number, body: string): void {\r\n  res.statusCode = status;\r\n  res.setHeader('Content-Type', 'text/html; charset=utf-8');\r\n  res.end(body);\r\n}\r\n\r\nfunction buildSummary(runs: GenerateRunAnalytics[]) {\r\n  const total = runs.length;\r\n  const ok = runs.filter((r) => r.ok).length;\r\n  const failed = runs.filter((r) => r.ok === false).length;\r\n  const durations = runs.map((r) => r.durationMs).filter((v): v is number => typeof v === 'number');\r\n  const avgDurationMs = durations.length ? Math.round(durations.reduce((a, b) => a + b, 0) / durations.length) : 0;\r\n  const totalTokens = runs\r\n    .map((r) => r.ai?.totals?.total_tokens)\r\n    .filter((v): v is number => typeof v === 'number')\r\n    .reduce((a, b) => a + b, 0);\r\n  return { total, ok, failed, avgDurationMs, totalTokens };\r\n}\r\n\r\nfunction pageTemplate(cwd: string): string {\r\n  const obsPath = resolve(cwd, OBS_DIRNAME);\r\n  return `<!doctype html>\r\n<html>\r\n  <head>\r\n    <meta charset=\"utf-8\" />\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\r\n    <title>hayagriva-llm — Observability Dashboard</title>\r\n    <style>\r\n      :root { color-scheme: dark; }\r\n      body { margin: 0; font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Arial; background: #0b1020; color: #e7ecff; }\r\n      header { padding: 16px 20px; border-bottom: 1px solid rgba(255,255,255,0.08); background: rgba(255,255,255,0.02); }\r\n      header h1 { margin: 0; font-size: 16px; font-weight: 700; }\r\n      header p { margin: 6px 0 0; font-size: 12px; opacity: 0.8; }\r\n      main { display: grid; grid-template-columns: 380px 1fr; gap: 14px; padding: 14px; }\r\n      @media (max-width: 900px) { main { grid-template-columns: 1fr; } }\r\n      .card { border: 1px solid rgba(255,255,255,0.08); border-radius: 12px; background: rgba(255,255,255,0.03); overflow: hidden; }\r\n      .card h2 { margin: 0; padding: 12px 14px; font-size: 13px; border-bottom: 1px solid rgba(255,255,255,0.08); }\r\n      .card .content { padding: 12px 14px; }\r\n      .kpi { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; }\r\n      .kpi .box { padding: 10px 12px; border-radius: 10px; background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.06); }\r\n      .kpi .label { font-size: 11px; opacity: 0.75; }\r\n      .kpi .value { margin-top: 4px; font-size: 16px; font-weight: 800; }\r\n      table { width: 100%; border-collapse: collapse; font-size: 12px; }\r\n      th, td { padding: 9px 8px; border-bottom: 1px solid rgba(255,255,255,0.06); vertical-align: top; }\r\n      th { text-align: left; font-size: 11px; opacity: 0.8; }\r\n      tr { cursor: pointer; }\r\n      tr:hover { background: rgba(255,255,255,0.03); }\r\n      code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, \"Liberation Mono\", monospace; font-size: 12px; }\r\n      .pill { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 11px; border: 1px solid rgba(255,255,255,0.10); }\r\n      .ok { background: rgba(40, 208, 148, 0.18); color: #b6ffdf; }\r\n      .fail { background: rgba(255, 82, 82, 0.16); color: #ffd0d0; }\r\n      pre { margin: 0; white-space: pre-wrap; word-break: break-word; font-size: 12px; line-height: 1.35; }\r\n      .muted { opacity: 0.75; }\r\n      .row { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }\r\n      .spacer { height: 8px; }\r\n      .btn { background: rgba(255,255,255,0.06); color: #e7ecff; border: 1px solid rgba(255,255,255,0.10); border-radius: 10px; padding: 8px 10px; cursor: pointer; }\r\n      .btn:hover { background: rgba(255,255,255,0.09); }\r\n    </style>\r\n  </head>\r\n  <body>\r\n    <header>\r\n      <h1>hayagriva-llm — Observability Dashboard</h1>\r\n      <p class=\"muted\">Data: <code>${obsPath}</code></p>\r\n    </header>\r\n    <main>\r\n      <section class=\"card\">\r\n        <h2>Summary</h2>\r\n        <div class=\"content\">\r\n          <div class=\"kpi\" id=\"kpi\"></div>\r\n          <div class=\"spacer\"></div>\r\n          <div class=\"row\">\r\n            <button class=\"btn\" id=\"refresh\">Refresh</button>\r\n            <button class=\"btn\" id=\"openLast\">Open last run JSON</button>\r\n          </div>\r\n        </div>\r\n      </section>\r\n      <section class=\"card\">\r\n        <h2>Runs</h2>\r\n        <div class=\"content\">\r\n          <table>\r\n            <thead>\r\n              <tr>\r\n                <th>Status</th>\r\n                <th>When</th>\r\n                <th>Mode</th>\r\n                <th>Model</th>\r\n                <th>Duration</th>\r\n                <th>Tokens</th>\r\n              </tr>\r\n            </thead>\r\n            <tbody id=\"runs\"></tbody>\r\n          </table>\r\n        </div>\r\n      </section>\r\n      <section class=\"card\" style=\"grid-column: 1 / -1;\">\r\n        <h2>Run details</h2>\r\n        <div class=\"content\">\r\n          <div class=\"muted\">Click a row above to inspect a run.</div>\r\n          <div class=\"spacer\"></div>\r\n          <pre id=\"details\"></pre>\r\n        </div>\r\n      </section>\r\n    </main>\r\n    <script>\r\n      const fmt = (ms) => typeof ms === 'number' ? (ms < 1000 ? ms + 'ms' : (ms/1000).toFixed(2) + 's') : '—';\r\n      const byId = (id) => document.getElementById(id);\r\n      const setKPIs = (s) => {\r\n        const kpi = byId('kpi');\r\n        kpi.innerHTML = '';\r\n        const items = [\r\n          ['Runs', s.total],\r\n          ['OK', s.ok],\r\n          ['Failed', s.failed],\r\n          ['Avg duration', fmt(s.avgDurationMs)],\r\n          ['Total tokens', s.totalTokens ?? 0],\r\n          ['Last refresh', new Date().toLocaleTimeString()],\r\n        ];\r\n        for (const [label, value] of items) {\r\n          const div = document.createElement('div');\r\n          div.className = 'box';\r\n          div.innerHTML = '<div class=\"label\">' + label + '</div><div class=\"value\">' + value + '</div>';\r\n          kpi.appendChild(div);\r\n        }\r\n      };\r\n      const setRuns = (runs) => {\r\n        const tbody = byId('runs');\r\n        tbody.innerHTML = '';\r\n        for (const r of runs.slice().reverse()) {\r\n          const tr = document.createElement('tr');\r\n          const ok = r.ok === true;\r\n          const status = ok ? '<span class=\"pill ok\">OK</span>' : (r.ok === false ? '<span class=\"pill fail\">FAIL</span>' : '<span class=\"pill\">—</span>');\r\n          const when = r.startedAt ? new Date(r.startedAt).toLocaleString() : '—';\r\n          const mode = r.flags?.mode ?? '—';\r\n          const model = r.flags?.model ?? '—';\r\n          const dur = fmt(r.durationMs);\r\n          const tokens = r.ai?.totals?.total_tokens ?? '—';\r\n          tr.innerHTML = '<td>' + status + '</td><td>' + when + '</td><td><code>' + mode + '</code></td><td><code>' + model + '</code></td><td>' + dur + '</td><td>' + tokens + '</td>';\r\n          tr.addEventListener('click', () => {\r\n            byId('details').textContent = JSON.stringify(r, null, 2);\r\n          });\r\n          tbody.appendChild(tr);\r\n        }\r\n      };\r\n      async function refresh() {\r\n        const [runsRes, summaryRes] = await Promise.all([fetch('/api/runs'), fetch('/api/summary')]);\r\n        const runs = await runsRes.json();\r\n        const summary = await summaryRes.json();\r\n        setKPIs(summary);\r\n        setRuns(runs);\r\n      }\r\n      byId('refresh').addEventListener('click', refresh);\r\n      byId('openLast').addEventListener('click', async () => {\r\n        const res = await fetch('/api/last-run');\r\n        const data = await res.json();\r\n        byId('details').textContent = JSON.stringify(data, null, 2);\r\n      });\r\n      refresh();\r\n    </script>\r\n  </body>\r\n</html>`;\r\n}\r\n\r\nexport async function startDashboardServer(cwd: string, port: number): Promise<{ url: string }> {\r\n  ensureObsDir(cwd);\r\n\r\n  const server = createServer((req, res) => {\r\n    try {\r\n      const url = new URL(req.url ?? '/', 'http://localhost');\r\n      if (url.pathname === '/' || url.pathname === '/index.html') {\r\n        return html(res, 200, pageTemplate(cwd));\r\n      }\r\n      if (url.pathname === '/api/runs') {\r\n        return json(res, 200, readRuns(cwd, 800));\r\n      }\r\n      if (url.pathname === '/api/summary') {\r\n        const runs = readRuns(cwd, 800);\r\n        return json(res, 200, buildSummary(runs));\r\n      }\r\n      if (url.pathname === '/api/last-run') {\r\n        const obsDir = ensureObsDir(cwd);\r\n        const p = resolve(obsDir, LAST_RUN_JSON);\r\n        if (existsSync(p)) {\r\n          try {\r\n            return json(res, 200, JSON.parse(readFileSync(p, 'utf-8')));\r\n          } catch {\r\n            return json(res, 200, { error: 'Failed to parse last-run.json' });\r\n          }\r\n        }\r\n        return json(res, 200, { error: 'No last run yet' });\r\n      }\r\n      res.statusCode = 404;\r\n      res.setHeader('Content-Type', 'text/plain; charset=utf-8');\r\n      res.end('Not Found');\r\n    } catch (e) {\r\n      return json(res, 500, { error: e instanceof Error ? e.message : String(e) });\r\n    }\r\n  });\r\n\r\n  await new Promise<void>((resolvePromise, rejectPromise) => {\r\n    server.on('error', rejectPromise);\r\n    server.listen(port, '127.0.0.1', () => resolvePromise());\r\n  });\r\n\r\n  const url = `http://127.0.0.1:${port}/`;\r\n  return { url };\r\n}\r\n\r\n","#!/usr/bin/env node\n\n/**\n * hayagriva-llm — Structured LLM metadata for Node.js packages.\n * Generates llm.package.json and llm.package.txt.\n */\nimport 'dotenv/config';\n\nimport { Command } from 'commander';\nimport { generate } from './generate.js';\nimport { generateAgentMd } from './agent.js';\nimport { generateSkill, DEFAULT_MODEL as SKILL_DEFAULT_MODEL } from './skill.js';\nimport { runAudit } from './audit.js';\nimport { getVersion } from './version.js';\nimport { DEFAULT_MODEL } from './types.js';\nimport { startDashboardServer } from './dashboard.js';\n\n/** Defer exit one tick so libuv can finish closing handles after failed fetch (avoids some Windows UV_HANDLE_CLOSING assertions). */\nfunction exitAfterCleanup(code: number): void {\n  setImmediate(() => {\n    process.exit(code);\n  });\n}\n\nconst program = new Command();\n\nprogram\n  .name('hayagriva-llm')\n  .description('Generate llm.package.json and llm.package.txt for npm packages')\n  .version(getVersion());\n\nprogram\n  .command('generate')\n  .description('Generate LLM metadata files')\n  .option(\n    '--mode <type>',\n    'Extraction mode: \"static\" (ts-morph) or \"ai\" (OpenRouter)',\n    'static'\n  )\n  .option('--api-key <key>', 'OpenRouter API key (required for ai mode)')\n  .option('--model <name>', 'OpenRouter model (ai mode)', DEFAULT_MODEL)\n  .option('--include-src', 'Include full source in AI prompt (ai mode)')\n  .option('--verbose', 'Debug logging')\n  .option(\n    '--freellmrouter',\n    'Use Free LLM Router for ranked free OpenRouter models (needs FREE_LLM_ROUTER_API_KEY; implies AI mode)'\n  )\n  .option('--rule', 'Also generate a Cursor rule .mdc file in .cursor/rules/')\n  .action(async (opts: {\n    mode: string;\n    apiKey?: string;\n    model: string;\n    includeSrc: boolean;\n    verbose: boolean;\n    rule?: boolean;\n    freellmrouter?: boolean;\n  }) => {\n    const mode = opts.mode === 'ai' || Boolean(opts.freellmrouter) ? 'ai' : 'static';\n    const model = process.env.OPEN_ROUTER_MODEL || process.env.HAYAGRIVA_LLM_MODEL || opts.model;\n    try {\n      await generate(process.cwd(), {\n        mode,\n        apiKey: opts.apiKey,\n        model,\n        includeSrc: Boolean(opts.includeSrc),\n        verbose: Boolean(opts.verbose),\n        generateRule: Boolean(opts.rule),\n        freeLlmRouter: Boolean(opts.freellmrouter),\n      });\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      console.error('Error:', message);\n      exitAfterCleanup(1);\n    }\n  });\n\nprogram\n  .command('agent')\n  .description('Generate AGENT.md (operating manual for coding agents)')\n  .option('--out <file>', 'Output filename', 'AGENT.md')\n  .option('--force', 'Overwrite existing file')\n  .action(async (opts: { out: string; force?: boolean }) => {\n    try {\n      const result = generateAgentMd(process.cwd(), { outFile: opts.out, force: Boolean(opts.force) });\n      console.log(`${result.action === 'created' ? 'Created' : 'Updated'} ${result.path}`);\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      console.error('Error:', message);\n      exitAfterCleanup(1);\n    }\n  });\n\nprogram\n  .command('dashboard')\n  .description('Start local observability dashboard (reads .hayagriva-llm/)')\n  .option('--port <port>', 'Port to bind (localhost)', '4177')\n  .action(async (opts: { port: string }) => {\n    const port = Number(opts.port);\n    if (!Number.isFinite(port) || port <= 0) {\n      console.error('Error: --port must be a valid number');\n      exitAfterCleanup(1);\n      return;\n    }\n    try {\n      const { url } = await startDashboardServer(process.cwd(), port);\n      console.log('Dashboard running at:', url);\n      console.log('Press Ctrl+C to stop.');\n    } catch (err) {\n      const message = err instanceof Error ? err.message : String(err);\n      console.error('Error:', message);\n      exitAfterCleanup(1);\n    }\n  });\n\nprogram\n  .command('audit')\n  .description('Scan the current project and generate an AI Readiness Score report')\n  .option('--dir <path>', 'Directory to audit (defaults to cwd)')\n  .action((opts: { dir?: string }) => {\n    const target = opts.dir ?? process.cwd();\n    runAudit(target);\n  });\n\ntype SkillCliOpts = {\n  name?: string;\n  brief?: string;\n  mode?: string;\n  scope: string;\n  force?: boolean;\n  generateskill?: boolean;\n  apiKey?: string;\n  model: string;\n  verbose: boolean;\n  freellmrouter?: boolean;\n};\n\nfunction addSkillSharedOptions(cmd: Command): Command {\n  return cmd\n    .option('--name <slug>', 'Skill folder name (default: slug from package name)')\n    .option('--brief <text>', 'What the skill should help with (optional; uses package description if omitted)')\n    .option(\n      '--scope <where>',\n      'Where to write: \"project\" (.cursor/skills/) or \"personal\" (~/.cursor/skills/)',\n      'project'\n    )\n    .option('--api-key <key>', 'OpenRouter API key (or set OPEN_ROUTER_API_KEY in .env)')\n    .option('--model <name>', 'OpenRouter model', SKILL_DEFAULT_MODEL)\n    .option('--verbose', 'Debug logging')\n    .option(\n      '--freellmrouter',\n      'Use Free LLM Router for ranked free OpenRouter models (needs FREE_LLM_ROUTER_API_KEY)'\n    );\n}\n\nasync function runSkillCommand(opts: SkillCliOpts): Promise<void> {\n  const quick = Boolean(opts.generateskill);\n  const mode =\n    quick || opts.mode === 'ai' || Boolean(opts.freellmrouter) ? 'ai' : 'static';\n  const scope = opts.scope === 'personal' ? 'personal' : 'project';\n  const model =\n    process.env.OPEN_ROUTER_MODEL || process.env.HAYAGRIVA_LLM_MODEL || opts.model;\n  const result = await generateSkill(process.cwd(), {\n    name: opts.name,\n    brief: opts.brief,\n    mode,\n    scope,\n    force: quick || Boolean(opts.force),\n    apiKey: opts.apiKey,\n    model,\n    verbose: Boolean(opts.verbose),\n    freeLlmRouter: Boolean(opts.freellmrouter),\n  });\n  console.log(\n    `${result.action === 'created' ? 'Created' : 'Updated'} ${result.path} (${result.mode} mode)`\n  );\n  if (quick) {\n    console.log('Tip: customize SKILL.md under the hayagriva-llm comment.');\n  } else {\n    console.log('Edit SKILL.md sections under the hayagriva-llm comment to customize.');\n  }\n}\n\nfunction skillAction(opts: SkillCliOpts): void {\n  runSkillCommand(opts).catch((err) => {\n    const message = err instanceof Error ? err.message : String(err);\n    console.error('Error:', message);\n    exitAfterCleanup(1);\n  });\n}\n\naddSkillSharedOptions(\n  program\n    .command('generateskill')\n    .description(\n      'Dead simple: AI-generate SKILL.md via OpenRouter (overwrites existing). Set OPEN_ROUTER_API_KEY in .env'\n    )\n).action((opts: Omit<SkillCliOpts, 'generateskill' | 'mode'>) => {\n  skillAction({ ...opts, generateskill: true, mode: 'ai' });\n});\n\naddSkillSharedOptions(\n  program\n    .command('skill')\n    .description('Generate a Cursor/Claude Agent Skill (SKILL.md) from a mutable template')\n    .option(\n      '--generateskill',\n      'Shortcut: OpenRouter AI + overwrite existing (same as hayagriva-llm generateskill)'\n    )\n    .option(\n      '--mode <type>',\n      'Generation mode: \"static\" (local template) or \"ai\" (single OpenRouter call)',\n      'static'\n    )\n    .option('--force', 'Overwrite existing SKILL.md')\n).action((opts: SkillCliOpts) => {\n  skillAction(opts);\n});\n\nprogram.parse();\n","/**\n * Build llm.package.json structure. Supports extended AI fields and pass-through extras.\n */\n\nimport type { LLMPackageJson, ExportsMap, PackageJsonLike } from './types.js';\n\nexport interface JsonMetadataInput {\n  packageJson: PackageJsonLike;\n  exports: ExportsMap;\n  hooks: string[];\n  frameworks: string[];\n  mode: 'static' | 'ai';\n  generatedBy: string;\n  /** From AI or static extension. */\n  summary?: string;\n  sideEffects?: string[];\n  keywords?: string[];\n  whenToUse?: string;\n  reasonToUse?: string[];\n  useCases?: string[];\n  documentation?: string;\n  relatedPackages?: string[];\n  extensions?: Record<string, unknown>;\n  /** Any extra keys (e.g. from AI adapter) to preserve. */\n  extras?: Record<string, unknown>;\n}\n\nexport function buildJsonMetadata(input: JsonMetadataInput): LLMPackageJson {\n  const {\n    packageJson,\n    exports,\n    hooks,\n    frameworks,\n    mode,\n    generatedBy,\n    summary,\n    sideEffects,\n    keywords,\n    whenToUse,\n    reasonToUse,\n    useCases,\n    documentation,\n    relatedPackages,\n    extensions,\n    extras = {},\n  } = input;\n\n  const base: LLMPackageJson = {\n    name: packageJson.name ?? 'unknown',\n    version: packageJson.version ?? '0.0.0',\n    description: typeof packageJson.description === 'string' ? packageJson.description : '',\n    exports,\n    hooks,\n    frameworks,\n    generatedBy,\n    mode,\n  };\n\n  if (summary !== undefined) base.summary = summary;\n  if (sideEffects !== undefined) base.sideEffects = sideEffects;\n  if (keywords !== undefined) base.keywords = keywords;\n  if (whenToUse !== undefined) base.whenToUse = whenToUse;\n  if (reasonToUse !== undefined) base.reasonToUse = reasonToUse;\n  if (useCases !== undefined) base.useCases = useCases;\n  if (documentation !== undefined) base.documentation = documentation;\n  if (relatedPackages !== undefined) base.relatedPackages = relatedPackages;\n  if (extensions !== undefined) base.extensions = extensions;\n\n  for (const [key, value] of Object.entries(extras)) {\n    if (value !== undefined && value !== null && !(key in base)) {\n      (base as Record<string, unknown>)[key] = value;\n    }\n  }\n\n  return base;\n}\n","import { existsSync, writeFileSync } from 'node:fs';\r\nimport { resolve } from 'node:path';\r\nimport { buildAgentMd } from './buildAgentMd.js';\r\n\r\nexport function generateAgentMd(\r\n  cwd: string,\r\n  options?: { outFile?: string; force?: boolean }\r\n): { path: string; action: 'created' | 'updated' } {\r\n  const file = options?.outFile?.trim() ? options.outFile.trim() : 'AGENT.md';\r\n  const path = resolve(cwd, file);\r\n  const existed = existsSync(path);\r\n  if (existed && !options?.force) {\r\n    throw new Error(`Refusing to overwrite existing ${file}. Re-run with --force to overwrite.`);\r\n  }\r\n  const content = buildAgentMd(cwd);\r\n  writeFileSync(path, content, 'utf-8');\r\n  return { path, action: existed ? 'updated' : 'created' };\r\n}\r\n\r\n"],"names":["CANDIDATE_ENTRIES","pkg","source","module","main","FALLBACK_PATHS","isHookName","name","length","HOOK_PREFIX","startsWith","getJSDocDescription","node","_node$getJsDocs","docs","getJsDocs","first","desc","getDescription","trim","extractStaticExports","entryPath","_step","exports","_iterator","_createForOfIteratorHelperLoose","Project","skipAddingFilesFromTsConfig","addSourceFileAtPath","getExportedDeclarations","done","_step2","decl","value","_iterator2","kindName","getKindName","type","includes","description","hook","_iteratorSymbol","Symbol","iterator","pact","state","s","_Pact","o","_settle","v","then","bind","observer","prototype","onFulfilled","onRejected","result","this","callback","e","_this","_isSettledPact","thenable","_forOf","target","body","check","step","reject","_cycle","next","_fixup","TypeError","values","i","push","array","_forTo","callOpenRouterWithValidatorTryModels","base","models","validate","stepName","feedback","_exit5","lastError","_temp0","_result7","Error","_temp9","model","_catch","Promise","resolve","callOpenRouterWithValidator","_extends","_result$modelUsed","onSuccess","modelUsed","status","details","message","String","OpenRouterHttpError","onIssue","options","callOpenRouterRaw","parsed","err","msg","fetch","OPENROUTER_URL","method","headers","Authorization","apiKey","JSON","stringify","messages","role","content","systemPrompt","userContent","res","_temp8","_result5","json","data","_data$choices","choices","u","usage","prompt_tokens","completion_tokens","total_tokens","undefined","onUsage","rawJson","raw","trimmed","codeBlockMatch","replace","match","start","indexOf","depth","end","slice","stripMarkdownJson","onMeta","responseChars","rawJsonChars","normalized","parse","parseJsonWithSmallRepairs","_unused","snippet","hint","_temp7","ok","text","checkOpenRouterAuthTryModels","_exit3","_temp6","_result4","last429","reason","_temp5","checkOpenRouterAuth","r","_ok$reason","max_tokens","_exit","_temp4","_result","_temp","_result2","_temp3","_ok$reason$message","_Error","call","_wrapNativeSuper","isStringArray","x","Array","isArray","every","validatePackageOverview","summary","sideEffects","keywords","frameworks","out","whenToUse","reasonToUse","useCases","documentation","relatedPackages","extensions","normalizeExportEntry","Boolean","optionalKeys","_i","_optionalKeys","key","val","_i2","_Object$entries","Object","entries","_Object$entries$_i","concat","validateExportsStep","exportsMap","_i3","_Object$entries2","_Object$entries2$_i","entry","hooks","validateExportNamesList","names","getModelIds","useCase","sort","topN","_options$cache","routerApiKey","cacheMode","cache","ck","maxErrorRate","timeRange","myReports","cacheKey","cached","get","Date","now","timestamp","CACHE_TTL_MS","params","URLSearchParams","normalizedUseCase","set","join","API","_result3","ids","filter","requestId","count","process","env","NODE_ENV","console","warn","Map","_process$env$FREE_LLM","FREE_LLM_ROUTER_API_KEY","formatExportLine","info","parts","returns","sideEffect","example","formatExport","getVersion","_pkg$version","__dirname","dirname","fileURLToPath","url","pkgPath","readFileSync","version","OBS_DIRNAME","RUNS_JSONL","LAST_RUN_JSON","ensureObsDir","cwd","dir","existsSync","mkdirSync","recursive","writeLastRun","run","writeFileSync","appendRunJsonl","appendFileSync","readRuns","max","p","lines","split","line","command","reset","bold","dim","green","red","yellow","cyan","printAuthChecking","error","printAuthSuccess","printAuthFailure","printRateLimited","printStep","current","total","circle","n","Math","min","filledCount","round","emptySegments","a","repeat","b","circleProgress","stepLabel","magenta","blue","countLabel","trimEnd","printAiModeHeader","KNOWN_AI_KEYS","Set","safeReadJson","path","bullets","items","map","codeBlock","EDIT_HINT","bulletLines","item","slugifySkillName","toLowerCase","validateSkillAiResponse","title","instructions","workflowSteps","examples","resources","userNotes","DEFAULT_MODEL","readmeExcerpt","maxChars","_unused2","R","B","DIM","RED","GRN","YEL","BG_YEL","fileExists","apply","arguments","dirExists","statSync","isDirectory","readJson","file","collectSourceFiles","results","readdirSync","withFileTypes","full","extname","checkReadme","label","passed","weight","checkTypeScript","hasTypesField","hasTsConfig","hasDtsFiles","some","f","endsWith","checkJsDoc","pattern","maxFiles","test","sourceContains","checkExamples","checkExportsField","checkLlmPackageJson","checkPromptTemplates","hasDir","hasInstructions","hasPromptFiles","checkSecurityMeta","llmPkg","hasSafetyInMeta","hasSecurityMd","statusCode","setHeader","exitAfterCleanup","code","setImmediate","exit","program","Command","addSkillSharedOptions","cmd","option","SKILL_DEFAULT_MODEL","skillAction","opts","quick","generateskill","mode","freellmrouter","scope","OPEN_ROUTER_MODEL","HAYAGRIVA_LLM_MODEL","_options$brief","template","validateSkillName","skillDir","homedir","resolveSkillDir","skillPath","existed","force","input","_input$userNotes","action","log","verbose","loadPackageJson","meta","loadLlmPackageJson","brief","_meta$summary","_meta$description","_pkg$name","defaultSkillBrief","_ref3","_options$apiKey","freeRouterModelIds","_temp2","_freeRouterModelIds","authResult","_freeRouterModelIds2","context","freeRouter","_context$brief","packageJson","llmPackageJson","modelIds","_ref","runSkillAiMode","_runSkillAiMode","_options$name","OPEN_ROUTER_API_KEY","OPENROUTER_API_KEY","freeLlmRouter","_ref4","_opts$cwd","_pkg$name2","_opts$name","_ref2","_meta$summary2","_opts$brief","_meta$useCases","_meta$reasonToUse","_meta$keywords","_opts$brief2","_opts$brief3","root","pkgName","reasons","exportNames","keys","triggerTerms","buildStaticSkillTemplate","generateSkill","runSkillCommand","_packageJson$name","_packageJson$version","rulePath","generatedBy","PKG_NAME","_input$extras","extras","buildJsonMetadata","finalMeta","existing","newMeta","merged","mergeWithExisting","jsonPath","txtPath","_step3","_iterator3","ext","capabilities","configuration","limitations","security","observability","integration","_step4","_iterator4","_step5","_iterator5","_step6","_iterator6","_step7","_iterator7","_step8","_iterator8","_iterator9","_step9","_iterator0","_step0","limitChars","_JSON$stringify","stringifyWithLimit","_iterator1","_step1","localeCompare","_step1$value","_step10","_iterator10","buildTxtMetadata","generateRule","rulesDir","ruleFile","exportEntries","_step4$value","buildRuleMdcContent","buildRuleMdc","finishedAt","toISOString","durationMs","startedAt","outputs","includeSrc","loadExistingMeta","id","randomUUID","platform","arch","package","flags","apiKeyProvided","getField","candidate","detectEntryFile","freeRouterRequestId","staticExports","aiCalls","onProgress","onCall","_input$exportNames","batches","totalSteps","overviewUsage","overviewStart","overviewResponseChars","overviewRawChars","m","candidateModels","overviewTry","overview","mergedExports","mergedHooks","totalUsage","inputChars","size","batchCount","systemPromptChars","STEP_OVERVIEW_PROMPT","userContentChars","packageLabel","packageJsonContent","batch","batchNum","batchUserContent","baseContext","batchStart","rawChars","batchTry","STEP_BATCH_PROMPT","assign","h","existingLlmPackageJson","buildUserContent","acc","addUsage","modelsForRun","_freeRouter$modelIds","modelId","success","reportSuccess","issue","reportIssue","buildFeedback","namesStart","namesTry","STEP_LIST_NAMES_PROMPT","runAiMode","report","c","_result$hooks","_result$frameworks","ai","calls","totals","has","getExtrasFromAIResponse","_freeRouterModelIds3","_checkOpenRouterAuthT","getHooksFromExports","generate","rule","_options$outFile","outFile","_llm$name","_llm$version","_ref5","_llm$summary","_llm$mode","getRepoPackageJson","llm","getLlmPackageJson","_meta$exports","_step$value","tag","formatExports","buildAgentMd","generateAgentMd","port","Number","isFinite","server","createServer","req","_req$url","URL","pathname","html","obsPath","pageTemplate","runs","failed","avgDurationMs","durations","reduce","totalTokens","_r$ai","obsDir","resolvePromise","rejectPromise","on","listen","startDashboardServer","_opts$dir","divider","thinLine","_computeAudit","checks","found","detectExtras","maxScore","sum","rawScore","score","normalizedScore","computeAudit","bg","scoreBadge","barColor","filled","unfilled","scoreBar","weightTag","recs","_map$c$label","buildRecommendations","runAudit"],"mappings":"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"}