{"version":3,"sources":["../src/formatters/formatter.ts","../src/config/default.ts","../src/config/manager.ts","../src/services/ai/index.ts","../src/services/metadata/extractor.ts","../src/utils/cache.ts","../src/services/github/scraper.ts","../src/index.ts"],"names":["chalk","language","table","path","os","fs","defaultConfig","createOpenAI","generateText","axios","cheerio","cheerio2"],"mappings":"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","file":"index.cjs","sourcesContent":["import chalk from 'chalk'\nimport { table } from 'table'\n\nimport { Repository } from '../types/github'\nimport { Metadata } from '../types/metadata'\nimport { FormatOptions } from '../types/output'\nimport { createTerminalLink } from '../utils/tools'\n\n/**\n * formatter output\n * @param repositories repositories\n * @param options options\n * @returns formatted string\n */\nexport function formatOutput(repositories: Repository[], options: FormatOptions): string {\n  switch (options.format) {\n    case 'json':\n      return formatJson(repositories)\n    case 'markdown':\n      return formatMarkdown(repositories, options)\n    case 'table':\n    default:\n      return formatTable(repositories, options)\n  }\n}\n\n/**\n * format metadata output\n * @param metadata metadata\n * @param options options\n * @returns formatted string\n */\nexport function formatMetadataOutput(metadata: Metadata, options: FormatOptions): string {\n  switch (options.format) {\n    case 'json':\n      return formatMetadataJson(metadata)\n    case 'markdown':\n      return formatMetadataMarkdown(metadata)\n    case 'table':\n    default:\n      return formatMetadataTable(metadata, options)\n  }\n}\n\n/**\n * format to JSON\n * @param repositories repositories\n * @returns JSON string\n */\nfunction formatJson(repositories: Repository[]): string {\n  return JSON.stringify(repositories, null, 2)\n}\n\n/**\n * format metadata to JSON\n * @param metadata metadata\n * @returns JSON string\n */\nfunction formatMetadataJson(metadata: Metadata): string {\n  const outputMetadata = { ...metadata }\n  delete outputMetadata.contentPreview\n\n  return JSON.stringify(outputMetadata, null, 2)\n}\n\n/**\n * Format the output as a table\n * @param repositories\n * @param options\n * @returns\n */\nfunction formatTable(repositories: Repository[], options: FormatOptions): string {\n  const { colorEnabled, period, language } = options\n\n  const header = [\n    colorEnabled ? chalk.bold('#') : '#',\n    colorEnabled ? chalk.bold('Repository') : 'Repository',\n    colorEnabled ? chalk.bold('Description') : 'Description',\n    colorEnabled ? chalk.bold('Language') : 'Language',\n    colorEnabled ? chalk.bold('Stars') : 'Stars',\n    colorEnabled ? chalk.bold('New Stars') : 'New Stars',\n    colorEnabled ? chalk.bold('Forks') : 'Forks'\n  ]\n\n  // Prepare data rows\n  const rows = repositories.map((repo) => {\n    const repoText = `${repo.author || ''}/${repo.name}`\n    const repoName = colorEnabled ? chalk.blue(repoText) : repoText\n\n    const truncatedRepoName = truncate(repoName, 28)\n    const description = repo.description ? truncate(repo.description, 43) : ''\n    const language = repo.language ? truncate(repo.language, 10) : '-'\n\n    const stars = formatNumber(repo.stars)\n    const starsInPeriod = colorEnabled\n      ? chalk.green(`+${formatNumber(repo.starsInPeriod || 0)}`)\n      : `+${formatNumber(repo.starsInPeriod || 0)}`\n\n    return [\n      repo.rank.toString(),\n      truncatedRepoName,\n      description,\n      language,\n      stars,\n      starsInPeriod,\n      formatNumber(repo.forks)\n    ]\n  })\n\n  // generate table\n  const data = [header, ...rows]\n  const config = {\n    border: {\n      topBody: '─',\n      topJoin: '┬',\n      topLeft: '┌',\n      topRight: '┐',\n      bottomBody: '─',\n      bottomJoin: '┴',\n      bottomLeft: '└',\n      bottomRight: '┘',\n      bodyLeft: '│',\n      bodyRight: '│',\n      bodyJoin: '│',\n      joinBody: '─',\n      joinLeft: '├',\n      joinRight: '┤',\n      joinJoin: '┼'\n    },\n    columns: {\n      0: { width: 3 },\n      1: { width: 30 },\n      2: { width: 45 },\n      3: { width: 12 },\n      4: { width: 8 },\n      5: { width: 12 },\n      6: { width: 8 }\n    },\n    columnDefault: {\n      wrapWord: true,\n      truncate: 100\n    }\n  }\n\n  const title = colorEnabled\n    ? chalk.yellow(\n        `🔥 GitHub Trending Repositories${language ? ` (${language})` : ''} - ${getPeriodText(\n          period\n        )}`\n      )\n    : `GitHub Trending Repositories${language ? ` (${language})` : ''} - ${getPeriodText(period)}`\n\n  return `\\n${title}\\n\\n${table(data, config)}\\n`\n}\n\n/**\n * format metadata to table\n * @param metadata metadata\n * @param options options\n * @returns table string\n */\nfunction formatMetadataTable(metadata: Metadata, options: FormatOptions): string {\n  const { colorEnabled } = options\n\n  // prepare table data\n  const rows: string[][] = []\n\n  // add basic information\n  rows.push([colorEnabled ? chalk.bold('URL') : 'URL', metadata.url])\n\n  rows.push([colorEnabled ? chalk.bold('Title') : 'Title', metadata.title || 'No Title'])\n\n  rows.push([\n    colorEnabled ? chalk.bold('Description') : 'Description',\n    truncate(metadata.description || 'No Description', 100)\n  ])\n\n  // add other valid information\n  if (metadata.author) {\n    rows.push([colorEnabled ? chalk.bold('Author') : 'Author', metadata.author])\n  }\n\n  if (metadata.publisher) {\n    rows.push([colorEnabled ? chalk.bold('Publisher') : 'Publisher', metadata.publisher])\n  }\n\n  if (metadata.language) {\n    rows.push([colorEnabled ? chalk.bold('Language') : 'Language', metadata.language])\n  }\n\n  if (metadata.type) {\n    rows.push([colorEnabled ? chalk.bold('Type') : 'Type', metadata.type])\n  }\n\n  if (metadata.published) {\n    rows.push([\n      colorEnabled ? chalk.bold('Published') : 'Published',\n      metadata.published.toISOString().split('T')[0]\n    ])\n  }\n\n  if (metadata.modified) {\n    rows.push([\n      colorEnabled ? chalk.bold('Modified') : 'Modified',\n      metadata.modified.toISOString().split('T')[0]\n    ])\n  }\n\n  if (metadata.keywords && metadata.keywords.length) {\n    rows.push([colorEnabled ? chalk.bold('Keywords') : 'Keywords', metadata.keywords.join(', ')])\n  }\n\n  if (metadata.tags && metadata.tags.length) {\n    rows.push([colorEnabled ? chalk.bold('Tags') : 'Tags', metadata.tags.join(', ')])\n  }\n\n  // Add AI enhanced information\n  if (metadata.aiSummary) {\n    rows.push([colorEnabled ? chalk.bold('AI Summary') : 'AI Summary', metadata.aiSummary])\n  }\n\n  if (metadata.category && metadata.category.length) {\n    rows.push([colorEnabled ? chalk.bold('Category') : 'Category', metadata.category.join(', ')])\n  }\n\n  if (metadata.readingTime) {\n    rows.push([\n      colorEnabled ? chalk.bold('Reading Time') : 'Reading Time',\n      ` ${metadata.readingTime} minutes`\n    ])\n  }\n\n  if (metadata.keyPoints && metadata.keyPoints.length) {\n    const keyPointsText = metadata.keyPoints\n      .map((point, index) => `${index + 1}. ${point}`)\n      .join('\\n')\n\n    rows.push([colorEnabled ? chalk.bold('Key Points') : 'Key Points', keyPointsText])\n  }\n\n  // generate table\n  const title = colorEnabled ? chalk.yellow('📄 URL Metadata Analysis') : 'URL Metadata Analysis'\n\n  return `\\n${title}\\n\\n${table(rows)}\\n`\n}\n\n/**\n * format to markdown\n * @param repositories repositories\n * @param options options\n * @returns markdown string\n */\nfunction formatMarkdown(repositories: Repository[], options: FormatOptions): string {\n  const { period, language } = options\n\n  // title\n  let md = `# 🔥 GitHub Trending Repositories${language ? ` (${language})` : ''} - ${getPeriodText(\n    period\n  )}\\n\\n`\n\n  repositories.forEach((repo) => {\n    md += `## ${repo.rank}. [${repo.author || ''}/${repo.name}](${repo.url})\\n\\n`\n\n    if (repo.description) {\n      md += `${repo.description}\\n\\n`\n    }\n\n    md += `- **Language:** ${repo.language || 'Not Specified'}\\n`\n    md += `- **⭐ Stars:** ${formatNumber(repo.stars)} (New: +${formatNumber(\n      repo.starsInPeriod || 0\n    )})\\n`\n    md += `- **🍴 Forks:** ${formatNumber(repo.forks)}\\n`\n\n    // Add AI enhanced content (if available)\n    if (repo.aiSummary) {\n      md += `\\n### AI Analysis Summary\\n\\n${repo.aiSummary}\\n`\n    }\n\n    if (repo.keyFeatures && repo.keyFeatures.length > 0) {\n      md += '\\n### Key Features\\n\\n'\n      repo.keyFeatures.forEach((feature) => {\n        md += `- ${feature}\\n`\n      })\n    }\n\n    if (repo.useCases && repo.useCases.length > 0) {\n      md += '\\n### Use Cases\\n\\n'\n      repo.useCases.forEach((useCase) => {\n        md += `- ${useCase}\\n`\n      })\n    }\n\n    md += '\\n---\\n\\n'\n  })\n\n  return md\n}\n\n/**\n * Format metadata to Markdown\n * @param metadata metadata object\n * @returns Markdown string\n */\nfunction formatMetadataMarkdown(metadata: Metadata): string {\n  // Title\n  let md = '# URL Metadata Analysis\\n\\n'\n\n  // Basic information\n  md += '## Basic Information\\n\\n'\n  md += `- **URL:** ${metadata.url}\\n`\n  md += `- **Title:** ${metadata.title || 'No Title'}\\n`\n  md += `- **Description:** ${metadata.description || 'No Description'}\\n`\n\n  if (metadata.author) {\n    md += `- **Author:** ${metadata.author}\\n`\n  }\n\n  if (metadata.publisher) {\n    md += `- **Publisher:** ${metadata.publisher}\\n`\n  }\n\n  if (metadata.language) {\n    md += `- **Language:** ${metadata.language}\\n`\n  }\n\n  if (metadata.type) {\n    md += `- **Type:** ${metadata.type}\\n`\n  }\n\n  if (metadata.published) {\n    md += `- **Published Date:** ${metadata.published.toISOString().split('T')[0]}\\n`\n  }\n\n  if (metadata.modified) {\n    md += `- **Modified Date:** ${metadata.modified.toISOString().split('T')[0]}\\n`\n  }\n\n  // Keywords and tags\n  if (metadata.keywords && metadata.keywords.length) {\n    md += '\\n## Keywords\\n\\n'\n    md += metadata.keywords.join(', ') + '\\n'\n  }\n\n  if (metadata.tags && metadata.tags.length) {\n    md += '\\n## Tags\\n\\n'\n    md += metadata.tags.join(', ') + '\\n'\n  }\n\n  // AI enhanced information\n  if (metadata.aiSummary || (metadata.keyPoints && metadata.keyPoints.length)) {\n    md += '\\n## AI Analysis\\n\\n'\n\n    if (metadata.aiSummary) {\n      md += `### Summary\\n\\n${metadata.aiSummary}\\n\\n`\n    }\n\n    if (metadata.category) {\n      md += `**Category:** ${metadata.category}\\n\\n`\n    }\n\n    if (metadata.readingTime) {\n      md += `**Estimated Reading Time:** About ${metadata.readingTime} minutes\\n\\n`\n    }\n\n    if (metadata.keyPoints && metadata.keyPoints.length) {\n      md += '### Key Points\\n\\n'\n      metadata.keyPoints.forEach((point, index) => {\n        md += `${index + 1}. ${point}\\n`\n      })\n    }\n  }\n\n  // Available images\n  if (metadata.image || metadata.icon) {\n    md += '\\n## Images\\n\\n'\n\n    if (metadata.image) {\n      md += `- **Main Image:** ${metadata.image}\\n`\n    }\n\n    if (metadata.icon) {\n      md += `- **Icon:** ${metadata.icon}\\n`\n    }\n  }\n\n  return md\n}\n\n/**\n * Get period text\n * @param period period\n * @returns period text\n */\nfunction getPeriodText(period: string): string {\n  switch (period) {\n    case 'daily':\n      return 'Today'\n    case 'weekly':\n      return 'This Week'\n    case 'monthly':\n      return 'This Month'\n    default:\n      return period\n  }\n}\n\n/**\n * Format number\n * @param num number\n * @returns formatted string\n */\nfunction formatNumber(num: number): string {\n  if (num >= 1000) {\n    return (num / 1000).toFixed(1) + 'k'\n  }\n  return num.toString()\n}\n\n/**\n * Truncate text\n * @param text text\n * @param maxLength maximum length\n * @returns truncated text\n */\nfunction truncate(text: string, maxLength: number): string {\n  if (!text || typeof text !== 'string') return String(text || '')\n\n  const stripAnsi = (str: string) => str.replace(/\\u001b\\[[0-9;]*m/g, '')\n  const actualLength = stripAnsi(text).length\n\n  if (actualLength <= maxLength) return text\n\n  if (text.includes('\\u001b[')) {\n    const plainText = stripAnsi(text)\n    const truncatedPlain = plainText.substring(0, maxLength - 3) + '...'\n\n    const colorStart = text.match(/^(\\u001b\\[[0-9;]*m)/)?.[1] || ''\n    const colorEnd = text.match(/(\\u001b\\[[0-9;]*m)$/)?.[1] || ''\n\n    if (colorStart) {\n      return colorStart + truncatedPlain + (colorEnd || '\\u001b[0m')\n    }\n  }\n\n  return text.slice(0, maxLength - 3) + '...'\n}\n","import { Config } from '@/types/config'\n\n/**\n * default config\n */\nexport const defaultConfig: Config = {\n  github: {\n    defaultPeriod: 'daily',\n    defaultLimit: 25\n  },\n  output: {\n    defaultFormat: 'table',\n    colorEnabled: true\n  },\n  ai: {\n    enabled: false,\n    defaultModel: 'gpt-4o-mini',\n    summaryLength: 'medium'\n  },\n  cache: {\n    enabled: true,\n    ttl: 3600, // 1 hour\n    maxSize: 100\n  }\n}\n","import fs from 'fs'\nimport os from 'os'\nimport path from 'path'\n\nimport { Config, ConfigOptions } from '@/types/config'\n\nimport { defaultConfig } from './default'\n\n/**\n * Config Manager\n */\nexport class ConfigManager {\n  private config: Config\n  private configPath: string\n\n  constructor(options?: ConfigOptions) {\n    this.configPath = options?.configPath || path.join(os.homedir(), '.gh-explorer', 'config.json')\n    this.config = this.loadConfig()\n  }\n\n  getConfig(): Config {\n    return this.config\n  }\n\n  private loadConfig(): Config {\n    try {\n      if (fs.existsSync(this.configPath)) {\n        const userConfig = JSON.parse(fs.readFileSync(this.configPath, 'utf-8'))\n        return this.mergeConfig(defaultConfig, userConfig)\n      }\n    } catch (error) {\n      console.error(\n        `load config file failed: ${error instanceof Error ? error.message : String(error)}`\n      )\n    }\n\n    return { ...defaultConfig }\n  }\n\n  private mergeConfig(defaultConfig: Config, userConfig: Partial<Config>): Config {\n    const mergedConfig = { ...defaultConfig }\n\n    if (userConfig.github) {\n      mergedConfig.github = {\n        ...mergedConfig.github,\n        ...userConfig.github\n      }\n    }\n\n    if (userConfig.output) {\n      mergedConfig.output = {\n        ...mergedConfig.output,\n        ...userConfig.output\n      }\n    }\n\n    if (userConfig.ai) {\n      mergedConfig.ai = {\n        ...mergedConfig.ai,\n        ...userConfig.ai\n      }\n    }\n\n    if (userConfig.cache) {\n      mergedConfig.cache = {\n        ...mergedConfig.cache,\n        ...userConfig.cache\n      }\n    }\n\n    return mergedConfig\n  }\n}\n\nconst configManager = new ConfigManager()\n\nexport function getConfig(): Config {\n  return configManager.getConfig()\n}\n","import { generateText } from 'ai'\nimport { createOpenAI } from '@ai-sdk/openai'\nimport { getConfig } from '@/config/manager'\nimport { Repository } from '@/types/github'\nimport { Metadata, MetadataEnrichOptions } from '@/types/metadata'\nimport { AIAnalysisResult } from '@/types/ai'\nimport chalk from 'chalk'\n\n/**\n * Create AI provider\n * Create OpenAI client based on configuration\n */\nexport function createAIProvider(model: string = 'gpt-4o-mini') {\n  const config = getConfig()\n\n  if (!config.ai?.enabled) {\n    throw new Error(\n      'AI features are not enabled. Run `gh-explorer config set ai.enabled true` to enable.'\n    )\n  }\n\n  if (!config.ai?.apiKey) {\n    throw new Error(\n      'AI API Key not configured. Run `gh-explorer config set ai.apiKey YOUR_API_KEY` to configure.'\n    )\n  }\n\n  const options: Record<string, string> = {\n    apiKey: config.ai.apiKey\n  }\n\n  if (config.ai.baseURL) {\n    options.baseURL = config.ai.baseURL\n  }\n\n  return createOpenAI({\n    apiKey: config.ai.apiKey,\n    baseURL: config.ai.baseURL\n  })(model)\n}\n\n/**\n * Generate text using AI\n * @param prompt The prompt text\n * @param systemPrompt System prompt\n * @param model Model name\n */\nexport async function generateAIText(\n  prompt: string,\n  systemPrompt: string = 'You are an expert technical analyst. Provide concise, objective, and accurate analysis following the requested format exactly.',\n  model: string = 'gpt-4o-mini'\n): Promise<string> {\n  try {\n    const aiModel = createAIProvider(model)\n\n    const { text } = await generateText({\n      model: aiModel,\n      system: systemPrompt,\n      prompt: prompt\n    })\n\n    return text\n  } catch (error) {\n    // Provide friendly error messages\n    if ((error as Error).message.includes('API Key')) {\n      console.error(\n        '\\n' + chalk.red('× AI API Configuration Error:') + ' ' + (error as Error).message\n      )\n      console.error(chalk.blue('Tip: Use these commands to configure and enable AI:'))\n      console.error('  gh-explorer config set ai.apiKey YOUR_API_KEY')\n      console.error('  gh-explorer config set ai.enabled true\\n')\n    } else if ((error as Error).message.includes('not enabled')) {\n      console.error(\n        '\\n' + chalk.yellow('! AI Features Not Enabled:') + ' ' + (error as Error).message\n      )\n      console.error(chalk.blue('Tip: Use this command to enable AI:'))\n      console.error('  gh-explorer config set ai.enabled true\\n')\n    } else {\n      console.error(`AI generation failed: ${(error as Error).message}`)\n    }\n\n    throw error\n  }\n}\n\n/**\n * Create metadata prompt with specified summary length\n * @param metadata Metadata\n * @param summaryLength Summary length\n * @returns Prompt string\n */\nfunction createMetadataPromptWithLength(metadata: Metadata, summaryLength: string): string {\n  const lengthDescription =\n    summaryLength === 'short'\n      ? 'within 50 words'\n      : summaryLength === 'medium'\n      ? 'within 100 words'\n      : 'within 200 words'\n\n  let prompt = `\n  Please analyze the following webpage metadata and provide a concise analysis:\n  \n  URL: ${metadata.url}\n  Title: ${metadata.title || 'No title'}\n  Description: ${metadata.description || 'No description'}\n  `\n\n  if (metadata.author) {\n    prompt += `Author: ${metadata.author}\\n`\n  }\n\n  if (metadata.type) {\n    prompt += `Type: ${metadata.type}\\n`\n  }\n\n  if (metadata.contentPreview) {\n    prompt += `Content preview: ${metadata.contentPreview.slice(0, 1000)}...\\n`\n  }\n\n  prompt += `\n  Please provide the following in JSON format:\n  1. aiSummary: Content summary ${lengthDescription}\n  2. keyPoints: 3-5 key points of the content (array)\n  3. category: Array of content categories (1-5 items)\n  `\n\n  return prompt\n}\n\n/**\n * Create repository prompt with specified summary length\n * @param repo Repository object\n * @param summaryLength Summary length\n * @returns Prompt string\n */\nfunction createRepoPromptWithLength(repo: Repository, summaryLength: string): string {\n  const lengthDescription =\n    summaryLength === 'short'\n      ? 'within 50 words'\n      : summaryLength === 'medium'\n      ? 'within 100 words'\n      : 'within 200 words'\n\n  return `\n  Please analyze the following GitHub repository information and provide a concise analysis:\n  Repository: ${repo.author}/${repo.name}\n  Description: ${repo.description || 'No description'}\n  Language: ${repo.language || 'Unknown'}\n  Stars: ${repo.stars}\n  New stars this period: ${repo.starsInPeriod}\n  \n  Please provide the following in JSON format:\n  1. aiSummary: Repository summary ${lengthDescription}\n  2. keyPoints: Key points about this repository (array)\n  3. category: Array of repository categories (1-5 items)\n  `\n}\n\n/**\n * Parse AI response\n * @param text Response text from AI\n * @returns Parsed AI result\n */\nfunction parseAIResponse(text: string): Partial<AIAnalysisResult> {\n  try {\n    // Try to extract JSON from response\n    const jsonMatch = text.match(/```json\\n([\\s\\S]*?)\\n```/) || text.match(/({[\\s\\S]*?})/)\n\n    let result\n    if (jsonMatch && jsonMatch[1]) {\n      result = JSON.parse(jsonMatch[1])\n    } else {\n      // Try to parse entire response\n      result = JSON.parse(text.trim())\n    }\n\n    // 确保 category 是数组\n    if (result.category && !Array.isArray(result.category)) {\n      result.category = [result.category]\n    }\n\n    return result\n  } catch (error) {\n    console.error('Failed to parse AI response:', error)\n\n    // Return basic structure on failure\n    return {\n      aiSummary: 'Could not parse AI response',\n      keyPoints: [],\n      category: []\n    }\n  }\n}\n\n/**\n * Enrich metadata using AI\n * @param metadata Original metadata\n * @param options AI enrichment options\n * @returns Enriched metadata\n */\nexport async function enrichMetadataWithAI(\n  metadata: Metadata,\n  options: MetadataEnrichOptions\n): Promise<Metadata> {\n  const config = getConfig()\n\n  if (!config.ai.enabled) {\n    return metadata\n  }\n\n  try {\n    const prompt = createMetadataPromptWithLength(metadata, options.summaryLength)\n    const aiText = await generateAIText(prompt)\n    const enrichedData = parseAIResponse(aiText)\n\n    return {\n      ...metadata,\n      ...enrichedData\n    }\n  } catch (error) {\n    console.error(`AI enrichment failed: ${(error as Error).message}`)\n    return metadata\n  }\n}\n\n/**\n * Enrich repositories with AI\n * @param repositories Repository list\n * @param options AI enrichment options\n * @returns Enriched repository list\n */\nexport async function enrichWithAI(\n  repositories: Repository[],\n  options: MetadataEnrichOptions\n): Promise<Repository[]> {\n  const config = getConfig()\n\n  if (!config.ai.enabled) {\n    return repositories\n  }\n\n  const enrichPromises = repositories.map(async (repo) => {\n    try {\n      const prompt = createRepoPromptWithLength(repo, options.summaryLength)\n\n      const aiText = await generateAIText(prompt)\n      const enrichedData = parseAIResponse(aiText)\n\n      return {\n        ...repo,\n        ...enrichedData\n      }\n    } catch (error) {\n      console.error(\n        `AI enrichment failed for repository ${repo.author}/${repo.name}: ${\n          (error as Error).message\n        }`\n      )\n      return repo\n    }\n  })\n\n  return Promise.all(enrichPromises)\n}\n","import axios from 'axios'\nimport * as cheerio from 'cheerio'\n\nimport { Metadata, ExtractionOptions } from '../../types/metadata'\n\n/**\n * Extract metadata from URL\n * @param url URL address\n * @param options Extraction options\n * @returns Promise<Metadata> Metadata object\n */\nexport async function extractMetadata(url: string, options: ExtractionOptions): Promise<Metadata> {\n  try {\n    // Get page content\n    const pageContent = await getPageContent(url, options.timeout)\n\n    // Parse metadata\n    const metadata = parseMetadata(url, pageContent, options)\n\n    return metadata\n  } catch (error) {\n    throw new Error(`Failed to extract metadata: ${(error as Error).message}`)\n  }\n}\n\n/**\n * Get page content\n * @param url URL address\n * @param timeout Timeout in milliseconds\n * @returns Promise<string> Page HTML content\n */\nexport async function getPageContent(url: string, timeout = 30000): Promise<string> {\n  try {\n    const response = await axios.get(url, {\n      headers: {\n        'User-Agent': 'gh-explorer-cli/1.0',\n        Accept: 'text/html,application/xhtml+xml,application/xml'\n      },\n      timeout\n    })\n\n    return response.data\n  } catch (error) {\n    if (axios.isAxiosError(error) && error.response) {\n      throw new Error(`Failed to get content: HTTP status code ${error.response.status}`)\n    }\n    throw new Error(`Failed to get content: ${(error as Error).message}`)\n  }\n}\n\n/**\n * Parse HTML to extract metadata\n * @param url Original URL\n * @param html HTML content\n * @param options Extraction options\n * @returns Metadata object\n */\nfunction parseMetadata(url: string, html: string, options: ExtractionOptions): Metadata {\n  // Create initial metadata object\n  const metadata: Metadata = {\n    url,\n    title: '',\n    description: ''\n  }\n\n  // Load HTML\n  const $ = cheerio.load(html)\n\n  // Extract basic metadata\n  metadata.title = $('title').text().trim() || ''\n  metadata.description =\n    $('meta[name=\"description\"]').attr('content') ||\n    $('meta[property=\"og:description\"]').attr('content') ||\n    ''\n\n  // Extract other basic metadata\n  metadata.author =\n    $('meta[name=\"author\"]').attr('content') ||\n    $('meta[property=\"article:author\"]').attr('content') ||\n    undefined\n\n  metadata.publisher = $('meta[property=\"og:site_name\"]').attr('content') || undefined\n\n  metadata.type = $('meta[property=\"og:type\"]').attr('content') || undefined\n\n  // Extract images (if needed)\n  if (options.includeImages) {\n    metadata.image =\n      $('meta[property=\"og:image\"]').attr('content') ||\n      $('meta[name=\"twitter:image\"]').attr('content') ||\n      undefined\n\n    // Extract website icon\n    const iconLink =\n      $('link[rel=\"icon\"]').attr('href') || $('link[rel=\"shortcut icon\"]').attr('href')\n\n    if (iconLink) {\n      // Handle relative URLs\n      metadata.icon = iconLink.startsWith('http') ? iconLink : new URL(iconLink, url).toString()\n    }\n  }\n\n  // Extract keywords and tags\n  const keywords = $('meta[name=\"keywords\"]').attr('content')\n  if (keywords) {\n    metadata.keywords = keywords.split(',').map((k) => k.trim())\n  }\n\n  // Extract language\n  metadata.language = $('html').attr('lang') || undefined\n\n  // Extract date information\n  const publishedTime = $('meta[property=\"article:published_time\"]').attr('content')\n  if (publishedTime) {\n    metadata.published = new Date(publishedTime)\n  }\n\n  const modifiedTime = $('meta[property=\"article:modified_time\"]').attr('content')\n  if (modifiedTime) {\n    metadata.modified = new Date(modifiedTime)\n  }\n\n  // Deep analysis (when depth is 'deep')\n  if (options.depth === 'deep') {\n    // Extract more content and structure information...\n    extractDeepMetadata($, metadata)\n  }\n\n  return metadata\n}\n\n/**\n * Perform deep metadata extraction\n * @param $ Cheerio instance\n * @param metadata Metadata object\n */\nfunction extractDeepMetadata($: cheerio.CheerioAPI, metadata: Metadata): void {\n  // Extract main content text (for AI analysis)\n  const contentText: string[] = []\n\n  // Try to find the main content area\n  const mainContent = $('article, main, .content, #content, .article')\n\n  if (mainContent.length > 0) {\n    // Has explicit content area\n    mainContent.find('p, h1, h2, h3, h4, h5, h6').each((_, element) => {\n      const text = $(element).text().trim()\n      if (text) contentText.push(text)\n    })\n  } else {\n    // No explicit content area, try to get all paragraphs on the page\n    $('p').each((_, element) => {\n      const text = $(element).text().trim()\n      if (text && text.length > 40) contentText.push(text) // Only get meaningful paragraphs\n    })\n  }\n\n  // Limit content length to avoid excessive length\n  metadata.contentPreview = contentText.join(' ').slice(0, 5000)\n\n  // Try to extract tags or categories\n  const tags: string[] = []\n  $('a[rel=\"tag\"], .tags a, .categories a, .topics a').each((_, element) => {\n    const tag = $(element).text().trim()\n    if (tag) tags.push(tag)\n  })\n\n  if (tags.length > 0) {\n    metadata.tags = tags\n  }\n}\n","interface CacheItem {\n  data: any\n  expiry: number\n}\n\n// Memory cache\nconst memoryCache: Map<string, CacheItem> = new Map()\n\n// Default cache configuration\nconst DEFAULT_TTL = 3600 // 1 hour\nconst DEFAULT_MAX_SIZE = 100\n\nexport class Cache {\n  private enabled: boolean\n  private maxSize: number\n\n  constructor(enabled = true, maxSize = DEFAULT_MAX_SIZE) {\n    this.enabled = enabled\n    this.maxSize = maxSize\n  }\n\n  /**\n   * Get data from cache\n   * @param key Cache key\n   * @returns Cached data or null\n   */\n  get(key: string): any | null {\n    if (!this.enabled) return null\n\n    const item = memoryCache.get(key)\n    if (!item) return null\n\n    // Check if expired\n    if (Date.now() > item.expiry) {\n      memoryCache.delete(key)\n      return null\n    }\n\n    return item.data\n  }\n\n  /**\n   * Store data to cache\n   * @param key Cache key\n   * @param data Cache data\n   * @param ttlSeconds Cache time-to-live (seconds)\n   */\n  set(key: string, data: any, ttlSeconds = DEFAULT_TTL): void {\n    if (!this.enabled) return\n\n    // Calculate expiry time\n    const expiry = Date.now() + ttlSeconds * 1000\n\n    // Save to cache\n    memoryCache.set(key, { data, expiry })\n\n    // Clean up excess cache items\n    if (memoryCache.size > this.maxSize) {\n      this.prune()\n    }\n  }\n\n  /**\n   * Clear all cache\n   */\n  clear(): void {\n    memoryCache.clear()\n  }\n\n  /**\n   * Clean expired cache\n   */\n  private prune(): void {\n    // If cache size doesn't exceed limit, no cleanup needed\n    if (memoryCache.size <= this.maxSize) return\n\n    // Get all cache entries, sorted by expiry time\n    const entries = Array.from(memoryCache.entries()).sort((a, b) => a[1].expiry - b[1].expiry)\n\n    // Calculate number of entries to delete\n    const deleteCount = memoryCache.size - this.maxSize\n\n    // Delete entries that expire earliest\n    for (let i = 0; i < deleteCount; i++) {\n      memoryCache.delete(entries[i][0])\n    }\n  }\n}\n\n// Export default instance\nexport const cache = new Cache()\n\n// Convenience functions\nexport function cacheGet(key: string): any | null {\n  return cache.get(key)\n}\n\nexport function cacheSet(key: string, data: any, ttlSeconds = DEFAULT_TTL): void {\n  cache.set(key, data, ttlSeconds)\n}\n\nexport function clearCache(): void {\n  cache.clear()\n}\n","import axios from 'axios'\nimport * as cheerio from 'cheerio'\n\nimport { Repository, TrendOptions } from '../../types/github'\nimport { cacheGet, cacheSet } from '../../utils/cache'\n\n/**\n * Get GitHub trending repositories\n * @param options Trending options\n * @returns Promise<Repository[]> Trending repositories list\n */\nexport async function getTrendingRepos(options: TrendOptions): Promise<Repository[]> {\n  const { language, since = 'daily' } = options\n\n  const cacheKey = `trending:${language || 'all'}:${since}`\n\n  const cachedData = cacheGet(cacheKey)\n\n  if (cachedData) {\n    return cachedData as Repository[]\n  }\n\n  let url = 'https://github.com/trending'\n  if (language) {\n    url += `/${encodeURIComponent(language)}`\n  }\n  url += `?since=${since}`\n\n  try {\n    const response = await axios.get(url, {\n      headers: {\n        'User-Agent': 'gh-explorer-cli'\n      }\n    })\n\n    const repositories = parseGitHubTrendingHtml(response.data)\n\n    cacheSet(cacheKey, repositories, 3600)\n\n    return repositories\n  } catch (error) {\n    throw new Error(`获取趋势仓库失败: ${error instanceof Error ? error.message : String(error)}`)\n  }\n}\n\n/**\n * Parse GitHub trending page HTML\n * @param html HTML Content\n * @returns Repository[] Repository list\n */\nfunction parseGitHubTrendingHtml(html: string): Repository[] {\n  const $ = cheerio.load(html)\n  const repositories: Repository[] = []\n\n  $('article.Box-row').each((index, element) => {\n    const titleElement = $(element).find('h2.h3 a')\n    const relativeUrl = titleElement.attr('href') || ''\n    const [author, name] = relativeUrl.substring(1).split('/')\n\n    const description = $(element).find('p').text().trim()\n\n    const languageElement = $(element).find('[itemprop=\"programmingLanguage\"]')\n    const language = languageElement.text().trim()\n\n    const languageColorElement = $(element).find('.repo-language-color')\n    const languageColor = languageColorElement\n      .attr('style')\n      ?.replace('background-color:', '')\n      .trim()\n\n    const starsElement = $(element).find('a[href$=\"/stargazers\"]')\n    const stars = parseNumber(starsElement.text().trim())\n\n    const forksElement = $(element).find('a[href$=\"/forks\"]')\n    const forks = parseNumber(forksElement.text().trim())\n\n    const starsInPeriodElement = $(element).find('.d-inline-block.float-sm-right')\n    const starsInPeriodText = starsInPeriodElement.text().trim()\n    const starsInPeriod = parseNumber(\n      starsInPeriodText.replace(/\\s+stars\\s+today|this\\s+week|this\\s+month/, '')\n    )\n\n    const avatarElement = $(element).find('img.avatar')\n    const avatar = avatarElement.attr('src')\n\n    repositories.push({\n      name,\n      author,\n      rank: index + 1,\n      url: `https://github.com${relativeUrl}`,\n      description,\n      language,\n      languageColor,\n      stars,\n      forks,\n      starsInPeriod,\n      avatar\n    })\n  })\n\n  return repositories\n}\n\n/**\n * Parse number string\n * @param text Number string\n * @returns Number\n */\nfunction parseNumber(text: string): number {\n  if (!text) return 0\n\n  if (text.includes('k')) {\n    return parseFloat(text.replace('k', '')) * 1000\n  }\n\n  return parseInt(text.replace(/,/g, ''), 10) || 0\n}\n","/**\n * GhExplorer - GitHub trending analysis tool\n */\n\n// Import services and types\nimport { formatOutput } from './formatters/formatter'\nimport { enrichMetadataWithAI, enrichWithAI } from './services/ai'\nimport { extractMetadata } from './services/metadata/extractor'\nimport { getTrendingRepos } from './services/github/scraper'\nimport { Repository, TrendOptions } from './types/github'\nimport { OutputFormat } from './types/index'\nimport { Metadata, ExtractionOptions, MetadataEnrichOptions } from './types/metadata'\n\n// Export types and services\nexport { Metadata, ExtractionOptions, MetadataEnrichOptions } from './types/metadata'\nexport { TrendOptions, OutputFormat } from './types/index'\nexport { Repository } from './types/github'\nexport { enrichMetadataWithAI, enrichWithAI } from './services/ai'\nexport { extractMetadata } from './services/metadata/extractor'\nexport { formatOutput, formatMetadataOutput } from './formatters/formatter'\nexport { getTrendingRepos } from './services/github/scraper'\n\n/**\n * Get GitHub trending repositories data\n * @param options Trend options\n * @returns Promise<Repository[]> Trending repositories data\n */\nexport async function ghExplorer(options: TrendOptions = {}): Promise<Repository[]> {\n  return getTrendingRepos(options)\n}\n\n/**\n * Get and format GitHub trending repositories data\n * @param options Trend options\n * @param format Output format\n * @returns Promise<string> Formatted trending data\n */\nexport async function ghExplorerFormatted(\n  options: TrendOptions = {},\n  format: OutputFormat = 'json'\n): Promise<string> {\n  const repositories = await getTrendingRepos(options)\n\n  return formatOutput(repositories, {\n    format,\n    colorEnabled: true,\n    period: options.since || 'daily',\n    language: options.language\n  })\n}\n\n/**\n * Analyze URL metadata\n * @param url URL address\n * @param options Extraction options\n * @returns Promise<Metadata> Metadata object\n */\nexport async function urlMetadata(\n  url: string,\n  options: Partial<ExtractionOptions> = {}\n): Promise<Metadata> {\n  const extractionOptions: ExtractionOptions = {\n    depth: options.depth || 'normal',\n    includeImages: options.includeImages !== undefined ? options.includeImages : true,\n    timeout: options.timeout || 30000\n  }\n\n  return extractMetadata(url, extractionOptions)\n}\n\n/**\n * Analyze URL metadata and use AI to enhance\n * @param url URL address\n * @param extractOptions Extraction options\n * @param enrichOptions AI enrichment options\n * @returns Promise<Metadata> Enriched metadata object\n */\nexport async function urlMetadataEnriched(\n  url: string,\n  extractOptions: Partial<ExtractionOptions> = {},\n  enrichOptions: Partial<MetadataEnrichOptions> = {}\n): Promise<Metadata> {\n  const metadata = await urlMetadata(url, extractOptions)\n\n  const metadataEnrichOptions: MetadataEnrichOptions = {\n    summaryLength: enrichOptions.summaryLength || 'medium'\n  }\n\n  return enrichMetadataWithAI(metadata, metadataEnrichOptions)\n}\n\n/**\n * Get GitHub trending repositories with AI enhancement\n * @param options Trend options\n * @param enrichOptions AI enrichment options\n * @returns Promise<Repository[]> Enhanced trending repositories data\n */\nexport async function ghExplorerEnriched(\n  options: TrendOptions = {},\n  enrichOptions: Partial<MetadataEnrichOptions> = {}\n): Promise<Repository[]> {\n  const repositories = await getTrendingRepos(options)\n\n  const aiOptions: MetadataEnrichOptions = {\n    summaryLength: enrichOptions.summaryLength || 'medium'\n  }\n\n  return enrichWithAI(repositories, aiOptions)\n}\n"]}