@djangocfg/seo 2.1.50 → 2.1.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +82 -5
- package/dist/cli.mjs.map +1 -1
- package/dist/crawler/index.mjs +16 -0
- package/dist/crawler/index.mjs.map +1 -1
- package/dist/index.mjs +75 -0
- package/dist/index.mjs.map +1 -1
- package/dist/reports/index.mjs +59 -0
- package/dist/reports/index.mjs.map +1 -1
- package/dist/routes/index.mjs +7 -5
- package/dist/routes/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/crawler/robots-parser.ts +26 -0
- package/src/reports/claude-context.ts +61 -0
- package/src/routes/analyzer.ts +17 -10
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/google-console/auth.ts","../src/google-console/client.ts","../src/google-console/analyzer.ts","../src/crawler/crawler.ts","../src/crawler/robots-parser.ts","../src/crawler/sitemap-validator.ts","../src/link-checker/index.ts","../src/reports/json-report.ts","../src/reports/markdown-report.ts","../src/reports/split-report.ts","../src/reports/claude-context.ts","../src/reports/generator.ts","../src/routes/scanner.ts","../src/routes/analyzer.ts","../src/cli/types.ts","../src/cli/commands/audit.ts","../src/cli/commands/routes.ts","../src/utils/index.ts","../src/cli/commands/inspect.ts","../src/cli/commands/crawl.ts","../src/cli/commands/links.ts","../src/cli/commands/robots.ts","../src/cli/commands/sitemap.ts","../src/content/scanner.ts","../src/content/link-checker.ts","../src/content/link-fixer.ts","../src/content/sitemap-generator.ts","../src/cli/commands/content.ts","../src/cli/index.ts"],"names":["consola","chalk","config","existsSync","readFileSync","resolve","hash","pLimit","path","load","getSiteUrl","result","url","severityOrder","generateMarkdownReport","formatCategory","readdirSync","rmSync","join","mkdirSync","writeFileSync","fs","isAssetLink","relative","applyFixes"],"mappings":"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","file":"cli.mjs","sourcesContent":["/**\n * @djangocfg/seo - Configuration\n * Environment detection and URL management\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport consola from 'consola';\nimport chalk from 'chalk';\n\nexport interface EnvConfig {\n prod: string | undefined;\n dev: string | undefined;\n}\n\nexport interface SeoConfig {\n env: EnvConfig;\n cwd: string;\n}\n\nconst config: SeoConfig = {\n env: {\n prod: undefined,\n dev: undefined,\n },\n cwd: process.cwd(),\n};\n\n/**\n * Parse a .env file and return key-value pairs\n */\nexport function parseEnvFile(filePath: string): Record<string, string> {\n const content = readFileSync(filePath, 'utf-8');\n const vars: Record<string, string> = {};\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n\n // Remove quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n\n vars[key] = value;\n }\n\n return vars;\n}\n\n/**\n * Load .env files from the current working directory\n */\nexport function loadEnvFiles(cwd?: string): EnvConfig {\n const workDir = cwd || process.cwd();\n config.cwd = workDir;\n\n // Load .env.production\n const prodEnvPath = resolve(workDir, '.env.production');\n if (existsSync(prodEnvPath)) {\n const vars = parseEnvFile(prodEnvPath);\n config.env.prod = vars.NEXT_PUBLIC_SITE_URL || vars.SITE_URL;\n }\n\n // Load .env.development\n const devEnvPath = resolve(workDir, '.env.development');\n if (existsSync(devEnvPath)) {\n const vars = parseEnvFile(devEnvPath);\n config.env.dev = vars.NEXT_PUBLIC_SITE_URL || vars.SITE_URL;\n }\n\n // Fallback to .env.local or .env\n if (!config.env.prod && !config.env.dev) {\n for (const envFile of ['.env.local', '.env']) {\n const envPath = resolve(workDir, envFile);\n if (existsSync(envPath)) {\n const vars = parseEnvFile(envPath);\n const url = vars.NEXT_PUBLIC_SITE_URL || vars.SITE_URL;\n if (url) {\n config.env.prod = url;\n break;\n }\n }\n }\n }\n\n return config.env;\n}\n\n/**\n * Get the loaded environment configuration\n */\nexport function getEnvConfig(): EnvConfig {\n return config.env;\n}\n\n/**\n * Get site URL based on options and environment\n */\nexport function getSiteUrl(options: {\n site?: string;\n env?: string;\n}): string {\n // Explicit --site flag takes priority\n if (options.site) {\n return options.site;\n }\n\n // Use --env flag or default to 'prod'\n const env = options.env || 'prod';\n const isProd = env === 'prod' || env === 'production';\n\n // Get URL from loaded env files\n const url = isProd ? config.env.prod : config.env.dev;\n\n if (url) {\n const envLabel = isProd ? 'production' : 'development';\n consola.info(`Using ${chalk.cyan(envLabel)} URL: ${chalk.bold(url)}`);\n return url;\n }\n\n // Fallback to process.env (already loaded or from shell)\n const fallbackUrl =\n process.env.NEXT_PUBLIC_SITE_URL ||\n process.env.SITE_URL ||\n process.env.BASE_URL;\n\n if (fallbackUrl) {\n consola.info(`Using URL from environment: ${fallbackUrl}`);\n return fallbackUrl;\n }\n\n // Show available options if no URL found\n console.log('');\n consola.error('No site URL found!');\n console.log('');\n if (config.env.prod || config.env.dev) {\n consola.info('Available environments:');\n if (config.env.prod) consola.log(` ${chalk.green('prod')}: ${config.env.prod}`);\n if (config.env.dev) consola.log(` ${chalk.yellow('dev')}: ${config.env.dev}`);\n console.log('');\n consola.info(`Use ${chalk.cyan('--env prod')} or ${chalk.cyan('--env dev')} to select`);\n } else {\n consola.info('Create .env.production or .env.development with NEXT_PUBLIC_SITE_URL');\n consola.info('Or use --site https://example.com');\n }\n process.exit(1);\n}\n\n/**\n * Print detected environment info\n */\nexport function printEnvInfo(): void {\n console.log('');\n consola.info('Environment configuration:');\n if (config.env.prod) {\n consola.log(` ${chalk.green('prod')}: ${config.env.prod}`);\n }\n if (config.env.dev) {\n consola.log(` ${chalk.yellow('dev')}: ${config.env.dev}`);\n }\n if (!config.env.prod && !config.env.dev) {\n consola.warn(' No .env files found');\n }\n}\n\n/** Default Google service account key filename */\nconst GSC_KEY_FILENAME = 'gsc-key.json';\n\n/**\n * Find Google service account key file\n * Searches in current directory for gsc-key.json\n */\nexport function findGoogleServiceAccount(explicitPath?: string): string | undefined {\n // Explicit path takes priority\n if (explicitPath) {\n const resolved = resolve(config.cwd, explicitPath);\n if (existsSync(resolved)) {\n return resolved;\n }\n consola.warn(`Service account file not found: ${explicitPath}`);\n return undefined;\n }\n\n // Auto-detect in current directory\n const defaultPath = resolve(config.cwd, GSC_KEY_FILENAME);\n if (existsSync(defaultPath)) {\n consola.info(`Found Google service account: ${chalk.cyan(GSC_KEY_FILENAME)}`);\n return defaultPath;\n }\n\n return undefined;\n}\n\n/**\n * Get Google service account key filename for hints\n */\nexport function getGscKeyFilename(): string {\n return GSC_KEY_FILENAME;\n}\n","/**\n * @djangocfg/seo - Google Console Authentication\n * Service Account authentication for Google Search Console API\n */\n\nimport { JWT } from 'google-auth-library';\nimport { readFileSync, existsSync } from 'node:fs';\nimport consola from 'consola';\nimport type { GoogleConsoleConfig } from '../types/index.js';\n\nconst SCOPES = [\n 'https://www.googleapis.com/auth/webmasters.readonly',\n 'https://www.googleapis.com/auth/webmasters',\n];\n\nexport interface ServiceAccountCredentials {\n client_email: string;\n private_key: string;\n project_id?: string;\n}\n\n/**\n * Load service account credentials from file or config\n */\nexport function loadCredentials(config: GoogleConsoleConfig): ServiceAccountCredentials {\n if (config.serviceAccountJson) {\n return config.serviceAccountJson;\n }\n\n if (config.serviceAccountPath) {\n if (!existsSync(config.serviceAccountPath)) {\n throw new Error(`Service account file not found: ${config.serviceAccountPath}`);\n }\n\n const content = readFileSync(config.serviceAccountPath, 'utf-8');\n return JSON.parse(content) as ServiceAccountCredentials;\n }\n\n // Try to load from environment variable\n const envJson = process.env.GOOGLE_SERVICE_ACCOUNT_JSON;\n if (envJson) {\n return JSON.parse(envJson) as ServiceAccountCredentials;\n }\n\n // Try default path\n const defaultPath = './service_account.json';\n if (existsSync(defaultPath)) {\n const content = readFileSync(defaultPath, 'utf-8');\n return JSON.parse(content) as ServiceAccountCredentials;\n }\n\n throw new Error(\n 'No service account credentials found. Provide serviceAccountPath, serviceAccountJson, or set GOOGLE_SERVICE_ACCOUNT_JSON env variable.'\n );\n}\n\n/**\n * Create authenticated JWT client\n */\nexport function createAuthClient(config: GoogleConsoleConfig): JWT {\n const credentials = loadCredentials(config);\n\n const auth = new JWT({\n email: credentials.client_email,\n key: credentials.private_key,\n scopes: SCOPES,\n });\n\n // Store email for later display\n (auth as any)._serviceAccountEmail = credentials.client_email;\n\n return auth;\n}\n\n/**\n * Verify authentication is working\n */\nexport async function verifyAuth(auth: JWT, siteUrl?: string): Promise<boolean> {\n const email = (auth as any)._serviceAccountEmail || auth.email;\n\n try {\n await auth.authorize();\n consola.success('Google Search Console authentication verified');\n consola.info(`Service account: ${email}`);\n\n // Build GSC users URL with domain\n if (siteUrl) {\n const domain = new URL(siteUrl).hostname;\n const gscUrl = `https://search.google.com/search-console/users?resource_id=sc-domain%3A${domain}`;\n consola.info(`Ensure this email has Full access in GSC: ${gscUrl}`);\n }\n\n return true;\n } catch (error) {\n consola.error('Authentication failed');\n consola.info(`Service account email: ${email}`);\n consola.info('Make sure this email is added to GSC with Full access');\n return false;\n }\n}\n","/**\n * @djangocfg/seo - Google Search Console Client\n * Main client for interacting with Google Search Console API\n */\n\nimport { searchconsole, type searchconsole_v1 } from '@googleapis/searchconsole';\nimport type { JWT } from 'google-auth-library';\nimport consola from 'consola';\nimport pLimit from 'p-limit';\nimport pRetry from 'p-retry';\nimport { createAuthClient, verifyAuth } from './auth.js';\nimport type {\n GoogleConsoleConfig,\n UrlInspectionResult,\n CoverageState,\n IndexingState,\n IndexingVerdict,\n RobotsTxtState,\n PageFetchState,\n} from '../types/index.js';\n\nexport class GoogleConsoleClient {\n private auth: JWT;\n private searchconsole: searchconsole_v1.Searchconsole;\n private siteUrl: string;\n private gscSiteUrl: string; // Format for GSC API (may be sc-domain:xxx)\n private limit = pLimit(2); // Max 2 concurrent requests (Cloudflare-friendly)\n private requestDelay = 500; // Delay between requests in ms\n\n constructor(config: GoogleConsoleConfig) {\n this.auth = createAuthClient(config);\n this.searchconsole = searchconsole({ version: 'v1', auth: this.auth });\n this.siteUrl = config.siteUrl;\n\n // Support both URL prefix and domain property formats\n // If gscSiteUrl provided, use it; otherwise try domain property format\n if (config.gscSiteUrl) {\n this.gscSiteUrl = config.gscSiteUrl;\n } else {\n // Default to domain property format (most common)\n const domain = new URL(config.siteUrl).hostname;\n this.gscSiteUrl = `sc-domain:${domain}`;\n }\n\n consola.debug(`GSC site URL: ${this.gscSiteUrl}`);\n }\n\n /**\n * Delay helper for rate limiting\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Verify the client is authenticated\n */\n async verify(): Promise<boolean> {\n return verifyAuth(this.auth, this.siteUrl);\n }\n\n /**\n * List all sites in Search Console\n */\n async listSites(): Promise<string[]> {\n try {\n const response = await this.searchconsole.sites.list();\n return response.data.siteEntry?.map((site) => site.siteUrl || '') || [];\n } catch (error) {\n consola.error('Failed to list sites:', error);\n throw error;\n }\n }\n\n /**\n * Inspect a single URL\n */\n async inspectUrl(url: string): Promise<UrlInspectionResult> {\n return this.limit(async () => {\n return pRetry(\n async () => {\n const response = await this.searchconsole.urlInspection.index.inspect({\n requestBody: {\n inspectionUrl: url,\n siteUrl: this.gscSiteUrl,\n languageCode: 'en-US',\n },\n });\n\n const result = response.data.inspectionResult;\n\n if (!result?.indexStatusResult) {\n throw new Error(`No inspection result for URL: ${url}`);\n }\n\n return this.mapInspectionResult(url, result);\n },\n {\n retries: 2,\n minTimeout: 2000,\n maxTimeout: 10000,\n factor: 2, // Exponential backoff\n onFailedAttempt: (ctx) => {\n // Only log on final failure to reduce noise\n if (ctx.retriesLeft === 0) {\n consola.warn(`Failed: ${url}`);\n }\n },\n }\n );\n });\n }\n\n /**\n * Inspect multiple URLs in batch\n * Stops early if too many consecutive errors (likely rate limiting)\n */\n async inspectUrls(urls: string[]): Promise<UrlInspectionResult[]> {\n consola.info(`Inspecting ${urls.length} URLs...`);\n\n const results: UrlInspectionResult[] = [];\n const errors: Array<{ url: string; error: Error }> = [];\n let consecutiveErrors = 0;\n const maxConsecutiveErrors = 3; // Stop after 3 consecutive failures\n\n // Process URLs sequentially with delay to avoid rate limiting\n for (const url of urls) {\n try {\n const result = await this.inspectUrl(url);\n results.push(result);\n consecutiveErrors = 0; // Reset on success\n // Add delay between requests\n await this.delay(this.requestDelay);\n } catch (error) {\n const err = error as Error;\n errors.push({ url, error: err });\n consecutiveErrors++;\n\n // Early exit on consecutive errors (likely rate limiting or auth issue)\n if (consecutiveErrors >= maxConsecutiveErrors) {\n console.log('');\n consola.error(`Stopping after ${maxConsecutiveErrors} consecutive failures`);\n this.showRateLimitHelp();\n break;\n }\n }\n }\n\n if (errors.length > 0 && consecutiveErrors < maxConsecutiveErrors) {\n consola.warn(`Failed to inspect ${errors.length} URLs`);\n }\n\n if (results.length > 0) {\n consola.success(`Successfully inspected ${results.length}/${urls.length} URLs`);\n } else if (errors.length > 0) {\n consola.warn('No URLs were successfully inspected');\n }\n\n return results;\n }\n\n /**\n * Show help message for rate limiting issues\n */\n private showRateLimitHelp(): void {\n consola.info('Possible causes:');\n consola.info(' 1. Google API quota exceeded (2000 requests/day)');\n consola.info(' 2. Cloudflare blocking Google\\'s crawler');\n consola.info(' 3. Service account not added to GSC');\n console.log('');\n consola.info('Solutions:');\n consola.info(' • Check GSC access: https://search.google.com/search-console/users');\n console.log('');\n consola.info(' • Cloudflare WAF rule to allow Googlebot:');\n consola.info(' 1. Dashboard → Security → WAF → Custom rules → Create rule');\n consola.info(' 2. Name: \"Allow Googlebot\"');\n consola.info(' 3. Field: \"Known Bots\" | Operator: \"equals\" | Value: \"true\"');\n consola.info(' 4. Or click \"Edit expression\" and paste: (cf.client.bot)');\n consola.info(' 5. Action: Skip → check all rules');\n consola.info(' 6. Deploy');\n consola.info(' Docs: https://developers.cloudflare.com/waf/custom-rules/use-cases/allow-traffic-from-verified-bots/');\n console.log('');\n }\n\n /**\n * Get search analytics data\n */\n async getSearchAnalytics(\n options: {\n startDate: string;\n endDate: string;\n dimensions?: ('query' | 'page' | 'country' | 'device' | 'date')[];\n rowLimit?: number;\n }\n ): Promise<searchconsole_v1.Schema$ApiDataRow[]> {\n try {\n const response = await this.searchconsole.searchanalytics.query({\n siteUrl: this.gscSiteUrl,\n requestBody: {\n startDate: options.startDate,\n endDate: options.endDate,\n dimensions: options.dimensions || ['page'],\n rowLimit: options.rowLimit || 1000,\n },\n });\n\n return response.data.rows || [];\n } catch (error) {\n consola.error('Failed to get search analytics:', error);\n throw error;\n }\n }\n\n /**\n * Get list of sitemaps\n */\n async getSitemaps(): Promise<searchconsole_v1.Schema$WmxSitemap[]> {\n try {\n const response = await this.searchconsole.sitemaps.list({\n siteUrl: this.gscSiteUrl,\n });\n\n return response.data.sitemap || [];\n } catch (error) {\n consola.error('Failed to get sitemaps:', error);\n throw error;\n }\n }\n\n /**\n * Map API response to our types\n */\n private mapInspectionResult(\n url: string,\n result: searchconsole_v1.Schema$UrlInspectionResult\n ): UrlInspectionResult {\n const indexStatus = result.indexStatusResult!;\n\n return {\n url,\n inspectionResultLink: result.inspectionResultLink || undefined,\n indexStatusResult: {\n verdict: (indexStatus.verdict as IndexingVerdict) || 'VERDICT_UNSPECIFIED',\n coverageState: (indexStatus.coverageState as CoverageState) || 'COVERAGE_STATE_UNSPECIFIED',\n indexingState: (indexStatus.indexingState as IndexingState) || 'INDEXING_STATE_UNSPECIFIED',\n robotsTxtState: (indexStatus.robotsTxtState as RobotsTxtState) || 'ROBOTS_TXT_STATE_UNSPECIFIED',\n pageFetchState: (indexStatus.pageFetchState as PageFetchState) || 'PAGE_FETCH_STATE_UNSPECIFIED',\n lastCrawlTime: indexStatus.lastCrawlTime || undefined,\n crawledAs: indexStatus.crawledAs as 'DESKTOP' | 'MOBILE' | undefined,\n googleCanonical: indexStatus.googleCanonical || undefined,\n userCanonical: indexStatus.userCanonical || undefined,\n sitemap: indexStatus.sitemap || undefined,\n referringUrls: indexStatus.referringUrls || undefined,\n },\n mobileUsabilityResult: result.mobileUsabilityResult\n ? {\n verdict: (result.mobileUsabilityResult.verdict as IndexingVerdict) || 'VERDICT_UNSPECIFIED',\n issues: result.mobileUsabilityResult.issues?.map((issue) => ({\n issueType: issue.issueType || 'UNKNOWN',\n message: issue.message || '',\n })),\n }\n : undefined,\n richResultsResult: result.richResultsResult\n ? {\n verdict: (result.richResultsResult.verdict as IndexingVerdict) || 'VERDICT_UNSPECIFIED',\n detectedItems: result.richResultsResult.detectedItems?.map((item) => ({\n richResultType: item.richResultType || 'UNKNOWN',\n items: item.items?.map((i) => ({\n name: i.name || '',\n issues: i.issues?.map((issue) => ({\n issueMessage: issue.issueMessage || '',\n severity: (issue.severity as 'ERROR' | 'WARNING') || 'WARNING',\n })),\n })),\n })),\n }\n : undefined,\n };\n }\n}\n","/**\n * @djangocfg/seo - Google Console Analyzer\n * Analyze URL inspection results and detect SEO issues\n */\n\nimport type {\n UrlInspectionResult,\n SeoIssue,\n IssueSeverity,\n IssueCategory,\n} from '../types/index.js';\n\n/**\n * Analyze URL inspection results and extract SEO issues\n */\nexport function analyzeInspectionResults(results: UrlInspectionResult[]): SeoIssue[] {\n const issues: SeoIssue[] = [];\n\n for (const result of results) {\n issues.push(...analyzeUrlInspection(result));\n }\n\n return issues.sort((a, b) => severityOrder(a.severity) - severityOrder(b.severity));\n}\n\nfunction analyzeUrlInspection(result: UrlInspectionResult): SeoIssue[] {\n const issues: SeoIssue[] = [];\n const { indexStatusResult, mobileUsabilityResult, richResultsResult } = result;\n\n // Indexing Issues\n switch (indexStatusResult.coverageState) {\n case 'CRAWLED_CURRENTLY_NOT_INDEXED':\n issues.push({\n id: `crawled-not-indexed-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'error',\n title: 'Page crawled but not indexed',\n description:\n 'Google crawled this page but decided not to index it. This often indicates low content quality or duplicate content.',\n recommendation:\n 'Improve content quality, ensure uniqueness, add more valuable information, and check for duplicate content issues.',\n detectedAt: new Date().toISOString(),\n metadata: { coverageState: indexStatusResult.coverageState },\n });\n break;\n\n case 'DISCOVERED_CURRENTLY_NOT_INDEXED':\n issues.push({\n id: `discovered-not-indexed-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'warning',\n title: 'Page discovered but not crawled',\n description:\n 'Google discovered this URL but has not crawled it yet. This may indicate crawl budget issues or low priority.',\n recommendation:\n 'Improve internal linking to this page, submit URL through Google Search Console, or add to sitemap.',\n detectedAt: new Date().toISOString(),\n metadata: { coverageState: indexStatusResult.coverageState },\n });\n break;\n\n case 'DUPLICATE_WITHOUT_USER_SELECTED_CANONICAL':\n issues.push({\n id: `duplicate-no-canonical-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'warning',\n title: 'Duplicate page without canonical',\n description:\n 'This page is considered a duplicate but no canonical URL has been specified. Google chose a canonical for you.',\n recommendation:\n 'Add a canonical tag pointing to the preferred version of this page.',\n detectedAt: new Date().toISOString(),\n metadata: {\n coverageState: indexStatusResult.coverageState,\n googleCanonical: indexStatusResult.googleCanonical,\n },\n });\n break;\n\n case 'DUPLICATE_GOOGLE_CHOSE_DIFFERENT_CANONICAL':\n issues.push({\n id: `canonical-mismatch-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'warning',\n title: 'Google chose different canonical',\n description:\n 'You specified a canonical URL, but Google chose a different one. This may cause indexing issues.',\n recommendation:\n 'Review canonical tags and ensure they point to the correct URL. Check for duplicate content.',\n detectedAt: new Date().toISOString(),\n metadata: {\n coverageState: indexStatusResult.coverageState,\n userCanonical: indexStatusResult.userCanonical,\n googleCanonical: indexStatusResult.googleCanonical,\n },\n });\n break;\n }\n\n // Indexing State Issues\n switch (indexStatusResult.indexingState) {\n case 'BLOCKED_BY_META_TAG':\n issues.push({\n id: `blocked-meta-noindex-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'error',\n title: 'Blocked by noindex meta tag',\n description: 'This page has a noindex meta tag preventing it from being indexed.',\n recommendation:\n 'Remove the noindex meta tag if you want this page to be indexed. If intentional, no action needed.',\n detectedAt: new Date().toISOString(),\n metadata: { indexingState: indexStatusResult.indexingState },\n });\n break;\n\n case 'BLOCKED_BY_HTTP_HEADER':\n issues.push({\n id: `blocked-http-header-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'error',\n title: 'Blocked by X-Robots-Tag header',\n description: 'This page has a noindex directive in the X-Robots-Tag HTTP header.',\n recommendation:\n 'Remove the X-Robots-Tag: noindex header if you want this page to be indexed.',\n detectedAt: new Date().toISOString(),\n metadata: { indexingState: indexStatusResult.indexingState },\n });\n break;\n\n case 'BLOCKED_BY_ROBOTS_TXT':\n issues.push({\n id: `blocked-robots-txt-${hash(result.url)}`,\n url: result.url,\n category: 'crawling',\n severity: 'error',\n title: 'Blocked by robots.txt',\n description: 'This page is blocked from crawling by robots.txt rules.',\n recommendation:\n 'Update robots.txt to allow crawling if you want this page to be indexed.',\n detectedAt: new Date().toISOString(),\n metadata: { indexingState: indexStatusResult.indexingState },\n });\n break;\n }\n\n // Page Fetch Issues\n switch (indexStatusResult.pageFetchState) {\n case 'SOFT_404':\n issues.push({\n id: `soft-404-${hash(result.url)}`,\n url: result.url,\n category: 'technical',\n severity: 'error',\n title: 'Soft 404 error',\n description:\n 'This page returns a 200 status but Google detected it as a 404 page (empty or low-value content).',\n recommendation:\n 'Either return a proper 404 status code or add meaningful content to this page.',\n detectedAt: new Date().toISOString(),\n metadata: { pageFetchState: indexStatusResult.pageFetchState },\n });\n break;\n\n case 'NOT_FOUND':\n issues.push({\n id: `404-error-${hash(result.url)}`,\n url: result.url,\n category: 'technical',\n severity: 'error',\n title: '404 Not Found',\n description: 'This page returns a 404 error.',\n recommendation:\n 'Either restore the page content or set up a redirect to a relevant page.',\n detectedAt: new Date().toISOString(),\n metadata: { pageFetchState: indexStatusResult.pageFetchState },\n });\n break;\n\n case 'SERVER_ERROR':\n issues.push({\n id: `server-error-${hash(result.url)}`,\n url: result.url,\n category: 'technical',\n severity: 'critical',\n title: 'Server error (5xx)',\n description: 'This page returns a server error when Google tries to crawl it.',\n recommendation:\n 'Fix the server-side error. Check server logs for details.',\n detectedAt: new Date().toISOString(),\n metadata: { pageFetchState: indexStatusResult.pageFetchState },\n });\n break;\n\n case 'REDIRECT_ERROR':\n issues.push({\n id: `redirect-error-${hash(result.url)}`,\n url: result.url,\n category: 'technical',\n severity: 'error',\n title: 'Redirect error',\n description:\n 'There is a redirect issue with this page (redirect loop, too many redirects, or invalid redirect).',\n recommendation:\n 'Fix the redirect chain. Ensure redirects point to valid, accessible pages.',\n detectedAt: new Date().toISOString(),\n metadata: { pageFetchState: indexStatusResult.pageFetchState },\n });\n break;\n\n case 'ACCESS_DENIED':\n case 'ACCESS_FORBIDDEN':\n issues.push({\n id: `access-denied-${hash(result.url)}`,\n url: result.url,\n category: 'technical',\n severity: 'error',\n title: 'Access denied (401/403)',\n description: 'Google cannot access this page due to authentication requirements.',\n recommendation:\n 'Ensure the page is publicly accessible without authentication for Googlebot.',\n detectedAt: new Date().toISOString(),\n metadata: { pageFetchState: indexStatusResult.pageFetchState },\n });\n break;\n }\n\n // Mobile Usability Issues\n if (mobileUsabilityResult?.verdict === 'FAIL' && mobileUsabilityResult.issues) {\n for (const issue of mobileUsabilityResult.issues) {\n issues.push({\n id: `mobile-${issue.issueType}-${hash(result.url)}`,\n url: result.url,\n category: 'mobile',\n severity: 'warning',\n title: `Mobile usability: ${formatIssueType(issue.issueType)}`,\n description: issue.message || 'Mobile usability issue detected.',\n recommendation: getMobileRecommendation(issue.issueType),\n detectedAt: new Date().toISOString(),\n metadata: { issueType: issue.issueType },\n });\n }\n }\n\n // Rich Results Issues\n if (richResultsResult?.verdict === 'FAIL' && richResultsResult.detectedItems) {\n for (const item of richResultsResult.detectedItems) {\n for (const i of item.items || []) {\n for (const issueDetail of i.issues || []) {\n issues.push({\n id: `rich-result-${item.richResultType}-${hash(result.url)}`,\n url: result.url,\n category: 'structured-data',\n severity: issueDetail.severity === 'ERROR' ? 'error' : 'warning',\n title: `${item.richResultType}: ${i.name}`,\n description: issueDetail.issueMessage,\n recommendation:\n 'Fix the structured data markup according to Google guidelines.',\n detectedAt: new Date().toISOString(),\n metadata: { richResultType: item.richResultType },\n });\n }\n }\n }\n }\n\n return issues;\n}\n\nfunction severityOrder(severity: IssueSeverity): number {\n const order: Record<IssueSeverity, number> = {\n critical: 0,\n error: 1,\n warning: 2,\n info: 3,\n };\n return order[severity];\n}\n\nfunction hash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n}\n\nfunction formatIssueType(type: string): string {\n return type\n .replace(/_/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction getMobileRecommendation(issueType: string): string {\n const recommendations: Record<string, string> = {\n MOBILE_FRIENDLY_RULE_USES_INCOMPATIBLE_PLUGINS:\n 'Remove Flash or other incompatible plugins. Use HTML5 alternatives.',\n MOBILE_FRIENDLY_RULE_CONFIGURE_VIEWPORT:\n 'Add a viewport meta tag: <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">',\n MOBILE_FRIENDLY_RULE_CONTENT_NOT_SIZED_TO_VIEWPORT:\n 'Ensure content width fits the viewport. Use responsive CSS.',\n MOBILE_FRIENDLY_RULE_TAP_TARGETS_TOO_SMALL:\n 'Increase the size of touch targets (buttons, links) to at least 48x48 pixels.',\n MOBILE_FRIENDLY_RULE_TEXT_TOO_SMALL:\n 'Use at least 16px font size for body text.',\n };\n\n return recommendations[issueType] || 'Fix the mobile usability issue according to Google guidelines.';\n}\n","/**\n * @djangocfg/seo - Site Crawler\n * Internal site crawler for SEO analysis\n */\n\nimport { load } from 'cheerio';\nimport pLimit from 'p-limit';\nimport consola from 'consola';\nimport type { CrawlResult, CrawlerConfig, SeoIssue } from '../types/index.js';\n\nconst DEFAULT_CONFIG: Required<CrawlerConfig> = {\n maxPages: 100,\n maxDepth: 3,\n concurrency: 5,\n timeout: 30000,\n userAgent: 'DjangoCFG-SEO-Crawler/1.0 (+https://djangocfg.com/bot)',\n respectRobotsTxt: true,\n includePatterns: [],\n excludePatterns: [\n '/api/',\n '/admin/',\n '/_next/',\n '/static/',\n '.pdf',\n '.jpg',\n '.png',\n '.gif',\n '.svg',\n '.css',\n '.js',\n ],\n};\n\nexport class SiteCrawler {\n private config: Required<CrawlerConfig>;\n private baseUrl: URL;\n private visited = new Set<string>();\n private queue: Array<{ url: string; depth: number }> = [];\n private results: CrawlResult[] = [];\n private limit: ReturnType<typeof pLimit>;\n\n constructor(siteUrl: string, config?: CrawlerConfig) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.baseUrl = new URL(siteUrl);\n this.limit = pLimit(this.config.concurrency);\n }\n\n /**\n * Start crawling the site\n */\n async crawl(): Promise<CrawlResult[]> {\n consola.info(`Starting crawl of ${this.baseUrl.origin}`);\n consola.info(`Config: maxPages=${this.config.maxPages}, maxDepth=${this.config.maxDepth}`);\n\n this.queue.push({ url: this.baseUrl.href, depth: 0 });\n\n while (this.queue.length > 0 && this.results.length < this.config.maxPages) {\n const batch = this.queue.splice(0, this.config.concurrency);\n\n const promises = batch.map(({ url, depth }) =>\n this.limit(() => this.crawlPage(url, depth))\n );\n\n await Promise.all(promises);\n }\n\n consola.success(`Crawl complete. Crawled ${this.results.length} pages.`);\n return this.results;\n }\n\n /**\n * Crawl a single page\n */\n private async crawlPage(url: string, depth: number): Promise<void> {\n const normalizedUrl = this.normalizeUrl(url);\n\n if (this.visited.has(normalizedUrl)) return;\n if (this.shouldExclude(normalizedUrl)) return;\n\n this.visited.add(normalizedUrl);\n\n const startTime = Date.now();\n const result: CrawlResult = {\n url: normalizedUrl,\n statusCode: 0,\n links: { internal: [], external: [] },\n images: [],\n loadTime: 0,\n errors: [],\n warnings: [],\n crawledAt: new Date().toISOString(),\n };\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n const response = await fetch(normalizedUrl, {\n headers: {\n 'User-Agent': this.config.userAgent,\n Accept: 'text/html,application/xhtml+xml',\n },\n signal: controller.signal,\n redirect: 'follow',\n });\n\n // TTFB = time from request start to first response headers\n result.ttfb = Date.now() - startTime;\n\n clearTimeout(timeoutId);\n\n result.statusCode = response.status;\n result.contentType = response.headers.get('content-type') || undefined;\n result.contentLength = Number(response.headers.get('content-length')) || undefined;\n\n if (response.ok && result.contentType?.includes('text/html')) {\n const html = await response.text();\n this.parseHtml(html, result, normalizedUrl, depth);\n } else if (!response.ok) {\n result.errors.push(`HTTP ${response.status}: ${response.statusText}`);\n }\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n result.errors.push('Request timeout');\n } else {\n result.errors.push(error.message);\n }\n }\n }\n\n result.loadTime = Date.now() - startTime;\n this.results.push(result);\n\n consola.debug(`Crawled: ${normalizedUrl} (${result.statusCode}) - ${result.loadTime}ms`);\n }\n\n /**\n * Parse HTML and extract SEO-relevant data\n */\n private parseHtml(html: string, result: CrawlResult, pageUrl: string, depth: number): void {\n const $ = load(html);\n\n // Title\n result.title = $('title').first().text().trim() || undefined;\n if (!result.title) {\n result.warnings.push('Missing title tag');\n } else if (result.title.length > 60) {\n result.warnings.push(`Title too long (${result.title.length} chars, recommended: <60)`);\n }\n\n // Meta description\n result.metaDescription =\n $('meta[name=\"description\"]').attr('content')?.trim() || undefined;\n if (!result.metaDescription) {\n result.warnings.push('Missing meta description');\n } else if (result.metaDescription.length > 160) {\n result.warnings.push(\n `Meta description too long (${result.metaDescription.length} chars, recommended: <160)`\n );\n }\n\n // Meta robots\n result.metaRobots = $('meta[name=\"robots\"]').attr('content')?.trim() || undefined;\n const xRobots = $('meta[http-equiv=\"X-Robots-Tag\"]').attr('content')?.trim();\n if (xRobots) {\n result.metaRobots = result.metaRobots ? `${result.metaRobots}, ${xRobots}` : xRobots;\n }\n\n // Canonical\n result.canonicalUrl = $('link[rel=\"canonical\"]').attr('href')?.trim() || undefined;\n if (!result.canonicalUrl) {\n result.warnings.push('Missing canonical tag');\n }\n\n // Headings\n result.h1 = $('h1')\n .map((_, el) => $(el).text().trim())\n .get();\n result.h2 = $('h2')\n .map((_, el) => $(el).text().trim())\n .get();\n\n if (result.h1.length === 0) {\n result.warnings.push('Missing H1 tag');\n } else if (result.h1.length > 1) {\n result.warnings.push(`Multiple H1 tags (${result.h1.length})`);\n }\n\n // Links\n $('a[href]').each((_, el) => {\n const href = $(el).attr('href');\n if (!href) return;\n\n try {\n const linkUrl = new URL(href, pageUrl);\n\n if (linkUrl.hostname === this.baseUrl.hostname) {\n const internalUrl = this.normalizeUrl(linkUrl.href);\n result.links.internal.push(internalUrl);\n\n // Add to crawl queue\n if (depth < this.config.maxDepth && !this.visited.has(internalUrl)) {\n this.queue.push({ url: internalUrl, depth: depth + 1 });\n }\n } else {\n result.links.external.push(linkUrl.href);\n }\n } catch {\n // Invalid URL, skip\n }\n });\n\n // Images\n $('img').each((_, el) => {\n const src = $(el).attr('src');\n const alt = $(el).attr('alt');\n\n if (src) {\n result.images.push({\n src,\n alt,\n hasAlt: alt !== undefined && alt.trim().length > 0,\n });\n }\n });\n\n const imagesWithoutAlt = result.images.filter((img) => !img.hasAlt);\n if (imagesWithoutAlt.length > 0) {\n result.warnings.push(`${imagesWithoutAlt.length} images without alt text`);\n }\n }\n\n /**\n * Normalize URL for deduplication\n */\n private normalizeUrl(url: string): string {\n try {\n const parsed = new URL(url, this.baseUrl.href);\n // Remove trailing slash, hash, and sort query params\n parsed.hash = '';\n let pathname = parsed.pathname;\n if (pathname.endsWith('/') && pathname !== '/') {\n pathname = pathname.slice(0, -1);\n }\n parsed.pathname = pathname;\n return parsed.href;\n } catch {\n return url;\n }\n }\n\n /**\n * Check if URL should be excluded\n */\n private shouldExclude(url: string): boolean {\n // Check include patterns first\n if (this.config.includePatterns.length > 0) {\n const included = this.config.includePatterns.some((pattern) =>\n url.includes(pattern)\n );\n if (!included) return true;\n }\n\n // Check exclude patterns\n return this.config.excludePatterns.some((pattern) => url.includes(pattern));\n }\n}\n\n/**\n * Analyze crawl results for SEO issues\n */\nexport function analyzeCrawlResults(results: CrawlResult[]): SeoIssue[] {\n const issues: SeoIssue[] = [];\n\n for (const result of results) {\n // HTTP errors\n if (result.statusCode >= 400) {\n issues.push({\n id: `http-error-${hash(result.url)}`,\n url: result.url,\n category: 'technical',\n severity: result.statusCode >= 500 ? 'critical' : 'error',\n title: `HTTP ${result.statusCode} error`,\n description: `Page returns ${result.statusCode} status code.`,\n recommendation:\n result.statusCode === 404\n ? 'Either restore the content or set up a redirect.'\n : 'Fix the server error and ensure the page is accessible.',\n detectedAt: result.crawledAt,\n metadata: { statusCode: result.statusCode },\n });\n }\n\n // Missing title\n if (!result.title && result.statusCode === 200) {\n issues.push({\n id: `missing-title-${hash(result.url)}`,\n url: result.url,\n category: 'content',\n severity: 'error',\n title: 'Missing title tag',\n description: 'This page does not have a title tag.',\n recommendation: 'Add a unique, descriptive title tag (50-60 characters).',\n detectedAt: result.crawledAt,\n });\n }\n\n // Missing meta description\n if (!result.metaDescription && result.statusCode === 200) {\n issues.push({\n id: `missing-meta-desc-${hash(result.url)}`,\n url: result.url,\n category: 'content',\n severity: 'warning',\n title: 'Missing meta description',\n description: 'This page does not have a meta description.',\n recommendation: 'Add a unique meta description (120-160 characters).',\n detectedAt: result.crawledAt,\n });\n }\n\n // Missing H1\n if (result.h1 && result.h1.length === 0 && result.statusCode === 200) {\n issues.push({\n id: `missing-h1-${hash(result.url)}`,\n url: result.url,\n category: 'content',\n severity: 'warning',\n title: 'Missing H1 heading',\n description: 'This page does not have an H1 heading.',\n recommendation: 'Add a single H1 heading that describes the page content.',\n detectedAt: result.crawledAt,\n });\n }\n\n // Multiple H1s\n if (result.h1 && result.h1.length > 1) {\n issues.push({\n id: `multiple-h1-${hash(result.url)}`,\n url: result.url,\n category: 'content',\n severity: 'warning',\n title: 'Multiple H1 headings',\n description: `This page has ${result.h1.length} H1 headings.`,\n recommendation: 'Use only one H1 heading per page.',\n detectedAt: result.crawledAt,\n metadata: { h1Count: result.h1.length },\n });\n }\n\n // Images without alt\n const imagesWithoutAlt = result.images.filter((img) => !img.hasAlt);\n if (imagesWithoutAlt.length > 0) {\n issues.push({\n id: `images-no-alt-${hash(result.url)}`,\n url: result.url,\n category: 'content',\n severity: 'info',\n title: 'Images without alt text',\n description: `${imagesWithoutAlt.length} images are missing alt text.`,\n recommendation: 'Add descriptive alt text to all images for accessibility and SEO.',\n detectedAt: result.crawledAt,\n metadata: { count: imagesWithoutAlt.length },\n });\n }\n\n // Slow load time (> 3s)\n if (result.loadTime > 3000) {\n issues.push({\n id: `slow-page-${hash(result.url)}`,\n url: result.url,\n category: 'performance',\n severity: result.loadTime > 5000 ? 'error' : 'warning',\n title: 'Slow page load time',\n description: `Page took ${result.loadTime}ms to load.`,\n recommendation: 'Optimize page load time. Target under 3 seconds.',\n detectedAt: result.crawledAt,\n metadata: { loadTime: result.loadTime },\n });\n }\n\n // Slow TTFB (> 800ms)\n if (result.ttfb && result.ttfb > 800) {\n issues.push({\n id: `slow-ttfb-${hash(result.url)}`,\n url: result.url,\n category: 'performance',\n severity: result.ttfb > 1500 ? 'error' : 'warning',\n title: 'Slow Time to First Byte',\n description: `TTFB is ${result.ttfb}ms. Server responded slowly.`,\n recommendation: 'Optimize server response. Target TTFB under 800ms. Consider CDN, caching, or server upgrades.',\n detectedAt: result.crawledAt,\n metadata: { ttfb: result.ttfb },\n });\n }\n\n // Noindex check\n if (result.metaRobots?.includes('noindex')) {\n issues.push({\n id: `noindex-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'info',\n title: 'Page marked as noindex',\n description: 'This page has a noindex directive.',\n recommendation: 'Verify this is intentional. Remove noindex if the page should be indexed.',\n detectedAt: result.crawledAt,\n metadata: { metaRobots: result.metaRobots },\n });\n }\n }\n\n return issues;\n}\n\nfunction hash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n}\n","/**\n * @djangocfg/seo - Robots.txt Parser\n * Parse and analyze robots.txt files\n */\n\nimport robotsParser from 'robots-parser';\nimport consola from 'consola';\nimport type { SeoIssue } from '../types/index.js';\n\nexport interface RobotsAnalysis {\n exists: boolean;\n content?: string;\n sitemaps: string[];\n allowedPaths: string[];\n disallowedPaths: string[];\n crawlDelay?: number;\n issues: SeoIssue[];\n}\n\n/**\n * Fetch and parse robots.txt for a site\n */\nexport async function analyzeRobotsTxt(siteUrl: string): Promise<RobotsAnalysis> {\n const robotsUrl = new URL('/robots.txt', siteUrl).href;\n\n const analysis: RobotsAnalysis = {\n exists: false,\n sitemaps: [],\n allowedPaths: [],\n disallowedPaths: [],\n issues: [],\n };\n\n try {\n const response = await fetch(robotsUrl);\n\n if (!response.ok) {\n analysis.issues.push({\n id: 'missing-robots-txt',\n url: robotsUrl,\n category: 'technical',\n severity: 'warning',\n title: 'Missing robots.txt',\n description: `No robots.txt file found (HTTP ${response.status}).`,\n recommendation: 'Create a robots.txt file to control crawler access.',\n detectedAt: new Date().toISOString(),\n });\n return analysis;\n }\n\n analysis.exists = true;\n analysis.content = await response.text();\n\n // Parse robots.txt\n const robots = robotsParser(robotsUrl, analysis.content);\n\n // Extract sitemaps\n analysis.sitemaps = robots.getSitemaps();\n\n if (analysis.sitemaps.length === 0) {\n analysis.issues.push({\n id: 'no-sitemap-in-robots',\n url: robotsUrl,\n category: 'technical',\n severity: 'info',\n title: 'No sitemap in robots.txt',\n description: 'No sitemap URL is declared in robots.txt.',\n recommendation: 'Add a Sitemap directive pointing to your XML sitemap.',\n detectedAt: new Date().toISOString(),\n });\n }\n\n // Parse rules (simplified extraction)\n const lines = analysis.content.split('\\n');\n let currentUserAgent = '*';\n\n for (const line of lines) {\n const trimmed = line.trim().toLowerCase();\n\n if (trimmed.startsWith('user-agent:')) {\n currentUserAgent = trimmed.replace('user-agent:', '').trim();\n } else if (trimmed.startsWith('disallow:')) {\n const path = line.trim().replace(/disallow:/i, '').trim();\n if (path) {\n analysis.disallowedPaths.push(path);\n }\n } else if (trimmed.startsWith('allow:')) {\n const path = line.trim().replace(/allow:/i, '').trim();\n if (path) {\n analysis.allowedPaths.push(path);\n }\n } else if (trimmed.startsWith('crawl-delay:')) {\n const delay = parseInt(trimmed.replace('crawl-delay:', '').trim(), 10);\n if (!isNaN(delay)) {\n analysis.crawlDelay = delay;\n }\n }\n }\n\n // Check for blocking important paths\n const importantPaths = ['/', '/sitemap.xml'];\n for (const path of importantPaths) {\n if (!robots.isAllowed(new URL(path, siteUrl).href, 'Googlebot')) {\n analysis.issues.push({\n id: `blocked-important-path-${path.replace(/\\//g, '-')}`,\n url: siteUrl,\n category: 'crawling',\n severity: 'error',\n title: `Important path blocked: ${path}`,\n description: `The path ${path} is blocked in robots.txt.`,\n recommendation: `Ensure ${path} is accessible to search engines.`,\n detectedAt: new Date().toISOString(),\n metadata: { path },\n });\n }\n }\n\n // Check for excessively restrictive rules\n if (analysis.disallowedPaths.includes('/')) {\n analysis.issues.push({\n id: 'all-blocked',\n url: robotsUrl,\n category: 'crawling',\n severity: 'critical',\n title: 'Entire site blocked',\n description: 'robots.txt blocks access to the entire site (Disallow: /).',\n recommendation: 'Remove or modify this rule if you want your site to be indexed.',\n detectedAt: new Date().toISOString(),\n });\n }\n\n consola.debug(`Analyzed robots.txt: ${analysis.disallowedPaths.length} disallow rules`);\n } catch (error) {\n consola.error('Failed to fetch robots.txt:', error);\n analysis.issues.push({\n id: 'robots-txt-error',\n url: robotsUrl,\n category: 'technical',\n severity: 'warning',\n title: 'Failed to fetch robots.txt',\n description: `Error fetching robots.txt: ${error instanceof Error ? error.message : 'Unknown error'}`,\n recommendation: 'Ensure robots.txt is accessible.',\n detectedAt: new Date().toISOString(),\n });\n }\n\n return analysis;\n}\n\n/**\n * Check if a URL is allowed by robots.txt\n */\nexport async function isUrlAllowed(\n siteUrl: string,\n url: string,\n userAgent = 'Googlebot'\n): Promise<boolean> {\n const robotsUrl = new URL('/robots.txt', siteUrl).href;\n\n try {\n const response = await fetch(robotsUrl);\n if (!response.ok) return true; // No robots.txt = allow all\n\n const content = await response.text();\n const robots = robotsParser(robotsUrl, content);\n\n return robots.isAllowed(url, userAgent) ?? true;\n } catch {\n return true; // Error fetching = allow\n }\n}\n","/**\n * @djangocfg/seo - Sitemap Validator\n * Validate XML sitemaps\n */\n\nimport { load } from 'cheerio';\nimport consola from 'consola';\nimport type { SeoIssue } from '../types/index.js';\n\nexport interface SitemapAnalysis {\n url: string;\n exists: boolean;\n type: 'sitemap' | 'sitemap-index' | 'unknown';\n urls: string[];\n childSitemaps: string[];\n lastmod?: string;\n issues: SeoIssue[];\n}\n\n/**\n * Analyze a sitemap URL\n */\nexport async function analyzeSitemap(sitemapUrl: string): Promise<SitemapAnalysis> {\n const analysis: SitemapAnalysis = {\n url: sitemapUrl,\n exists: false,\n type: 'unknown',\n urls: [],\n childSitemaps: [],\n issues: [],\n };\n\n try {\n const response = await fetch(sitemapUrl, {\n headers: {\n Accept: 'application/xml, text/xml, */*',\n },\n });\n\n if (!response.ok) {\n analysis.issues.push({\n id: `sitemap-not-found-${hash(sitemapUrl)}`,\n url: sitemapUrl,\n category: 'technical',\n severity: 'error',\n title: 'Sitemap not accessible',\n description: `Sitemap returned HTTP ${response.status}.`,\n recommendation: 'Ensure the sitemap URL is correct and accessible.',\n detectedAt: new Date().toISOString(),\n metadata: { statusCode: response.status },\n });\n return analysis;\n }\n\n analysis.exists = true;\n const content = await response.text();\n\n // Check content type\n const contentType = response.headers.get('content-type') || '';\n if (!contentType.includes('xml') && !content.trim().startsWith('<?xml')) {\n analysis.issues.push({\n id: `sitemap-not-xml-${hash(sitemapUrl)}`,\n url: sitemapUrl,\n category: 'technical',\n severity: 'warning',\n title: 'Sitemap is not XML',\n description: 'The sitemap does not have an XML content type.',\n recommendation: 'Ensure sitemap is served with Content-Type: application/xml.',\n detectedAt: new Date().toISOString(),\n metadata: { contentType },\n });\n }\n\n // Parse XML\n const $ = load(content, { xmlMode: true });\n\n // Check if it's a sitemap index\n const sitemapIndex = $('sitemapindex');\n if (sitemapIndex.length > 0) {\n analysis.type = 'sitemap-index';\n\n $('sitemap').each((_, el) => {\n const loc = $('loc', el).text().trim();\n if (loc) {\n analysis.childSitemaps.push(loc);\n }\n });\n\n consola.debug(`Sitemap index contains ${analysis.childSitemaps.length} sitemaps`);\n } else {\n analysis.type = 'sitemap';\n\n $('url').each((_, el) => {\n const loc = $('loc', el).text().trim();\n if (loc) {\n analysis.urls.push(loc);\n }\n });\n\n const lastmod = $('url lastmod').first().text().trim();\n if (lastmod) {\n analysis.lastmod = lastmod;\n }\n\n consola.debug(`Sitemap contains ${analysis.urls.length} URLs`);\n }\n\n // Validate sitemap content\n if (analysis.type === 'sitemap' && analysis.urls.length === 0) {\n analysis.issues.push({\n id: `sitemap-empty-${hash(sitemapUrl)}`,\n url: sitemapUrl,\n category: 'technical',\n severity: 'warning',\n title: 'Sitemap is empty',\n description: 'The sitemap contains no URLs.',\n recommendation: 'Add URLs to your sitemap or remove it if not needed.',\n detectedAt: new Date().toISOString(),\n });\n }\n\n // Check for too many URLs (Google limit is 50,000)\n if (analysis.urls.length > 50000) {\n analysis.issues.push({\n id: `sitemap-too-large-${hash(sitemapUrl)}`,\n url: sitemapUrl,\n category: 'technical',\n severity: 'error',\n title: 'Sitemap exceeds URL limit',\n description: `Sitemap contains ${analysis.urls.length} URLs. Maximum is 50,000.`,\n recommendation: 'Split the sitemap into multiple files using a sitemap index.',\n detectedAt: new Date().toISOString(),\n metadata: { urlCount: analysis.urls.length },\n });\n }\n\n // Check file size (Google limit is 50MB uncompressed)\n const sizeInMB = new Blob([content]).size / (1024 * 1024);\n if (sizeInMB > 50) {\n analysis.issues.push({\n id: `sitemap-too-large-size-${hash(sitemapUrl)}`,\n url: sitemapUrl,\n category: 'technical',\n severity: 'error',\n title: 'Sitemap exceeds size limit',\n description: `Sitemap is ${sizeInMB.toFixed(2)}MB. Maximum is 50MB.`,\n recommendation: 'Split the sitemap or compress it.',\n detectedAt: new Date().toISOString(),\n metadata: { sizeMB: sizeInMB },\n });\n }\n } catch (error) {\n consola.error('Failed to analyze sitemap:', error);\n analysis.issues.push({\n id: `sitemap-error-${hash(sitemapUrl)}`,\n url: sitemapUrl,\n category: 'technical',\n severity: 'error',\n title: 'Failed to parse sitemap',\n description: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n recommendation: 'Check sitemap validity using Google Search Console.',\n detectedAt: new Date().toISOString(),\n });\n }\n\n return analysis;\n}\n\n/**\n * Recursively analyze a sitemap and all its children\n */\nexport async function analyzeAllSitemaps(\n sitemapUrl: string,\n maxDepth = 3\n): Promise<SitemapAnalysis[]> {\n const results: SitemapAnalysis[] = [];\n const visited = new Set<string>();\n\n async function analyze(url: string, depth: number): Promise<void> {\n if (depth > maxDepth || visited.has(url)) return;\n visited.add(url);\n\n const analysis = await analyzeSitemap(url);\n results.push(analysis);\n\n // Recursively analyze child sitemaps\n for (const childUrl of analysis.childSitemaps) {\n await analyze(childUrl, depth + 1);\n }\n }\n\n await analyze(sitemapUrl, 0);\n return results;\n}\n\nfunction hash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n}\n","#!/usr/bin/env node\n\n/**\n * @djangocfg/seo - Link Checker\n *\n * Smart link checker using linkinator with proper error handling,\n * timeout management, and filtering of problematic URLs.\n *\n * @example\n * ```typescript\n * import { checkLinks } from '@djangocfg/seo/link-checker';\n *\n * const result = await checkLinks({\n * url: 'https://example.com',\n * timeout: 60000,\n * });\n * ```\n *\n * @example CLI\n * ```bash\n * djangocfg-seo links --site https://example.com\n * # or\n * djangocfg-seo links # Interactive mode\n * ```\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport * as linkinator from 'linkinator';\nimport { dirname } from 'node:path';\nimport chalk from 'chalk';\nimport type { CheckOptions } from 'linkinator';\nimport type { SeoIssue } from '../types/index.js';\n\nexport interface CheckLinksOptions {\n /** Base URL to check (defaults to NEXT_PUBLIC_SITE_URL env variable) */\n url?: string;\n /** Timeout in milliseconds (default: 60000) */\n timeout?: number;\n /** URLs to skip (regex pattern) */\n skipPattern?: string;\n /** Show only broken links (default: true) */\n showOnlyBroken?: boolean;\n /** Maximum number of concurrent requests (default: 50) */\n concurrency?: number;\n /** Output file path for report (optional) */\n outputFile?: string;\n /** Report format: 'json', 'markdown', 'text' (default: 'text') */\n reportFormat?: 'json' | 'markdown' | 'text';\n /** Verbose logging (default: true) */\n verbose?: boolean;\n}\n\nconst DEFAULT_SKIP_PATTERN = [\n 'github.com',\n 'twitter.com',\n 'linkedin.com',\n 'x.com',\n '127.0.0.1',\n 'localhost:[0-9]+',\n 'api\\\\.localhost',\n 'demo\\\\.localhost',\n 'cdn-cgi', // Cloudflare email protection\n 'mailto:', // Email links\n 'tel:', // Phone links\n 'javascript:', // JavaScript links\n].join('|');\n\nexport interface BrokenLink {\n url: string;\n status: number | string;\n reason?: string;\n isExternal: boolean;\n sourceUrl?: string;\n}\n\nexport interface CheckLinksResult {\n success: boolean;\n broken: number;\n total: number;\n errors: BrokenLink[];\n /** Internal broken links (same domain) */\n internalErrors: BrokenLink[];\n /** External broken links (different domain) */\n externalErrors: BrokenLink[];\n url: string;\n timestamp: string;\n duration?: number;\n}\n\n/**\n * Get site URL from options or environment variable\n */\nfunction getSiteUrl(options: CheckLinksOptions): string {\n if (options.url) {\n return options.url;\n }\n\n // Try environment variables\n const envUrl =\n process.env.NEXT_PUBLIC_SITE_URL ||\n process.env.SITE_URL ||\n process.env.BASE_URL;\n\n if (envUrl) {\n return envUrl;\n }\n\n throw new Error(\n 'URL is required. Provide it via options.url or set NEXT_PUBLIC_SITE_URL environment variable.'\n );\n}\n\n/**\n * Check if URL is external (different domain)\n */\nfunction isExternalUrl(linkUrl: string, baseUrl: string): boolean {\n try {\n const link = new URL(linkUrl);\n const base = new URL(baseUrl);\n return link.hostname !== base.hostname;\n } catch {\n return true;\n }\n}\n\n/**\n * Check all links on a website\n */\nexport async function checkLinks(options: CheckLinksOptions): Promise<CheckLinksResult> {\n const url = getSiteUrl(options);\n const {\n timeout = 60000,\n skipPattern = DEFAULT_SKIP_PATTERN,\n showOnlyBroken = true,\n concurrency = 50,\n outputFile,\n reportFormat = 'text',\n verbose = true,\n } = options;\n\n const startTime = Date.now();\n\n if (verbose) {\n console.log(chalk.cyan(`\\n🔍 Starting link check for: ${chalk.bold(url)}`));\n console.log(chalk.dim(` Timeout: ${timeout}ms | Concurrency: ${concurrency}`));\n console.log('');\n }\n\n const skipRegex = new RegExp(skipPattern);\n\n const checkOptions: CheckOptions = {\n path: url,\n recurse: true,\n timeout,\n concurrency,\n linksToSkip: (link: string) => {\n return Promise.resolve(skipRegex.test(link));\n },\n };\n\n const broken: BrokenLink[] = [];\n const internalErrors: BrokenLink[] = [];\n const externalErrors: BrokenLink[] = [];\n let total = 0;\n\n try {\n const results = await linkinator.check(checkOptions);\n\n for (const result of results.links) {\n total++;\n const status = result.status || 0;\n const isExternal = isExternalUrl(result.url, url);\n\n if (status < 200 || status >= 400 || result.state === 'BROKEN') {\n const statusValue = status || 'TIMEOUT';\n\n // Skip TIMEOUT errors on external URLs (rate limiting, slow servers)\n if (statusValue === 'TIMEOUT' && isExternal) {\n continue;\n }\n\n const brokenLink: BrokenLink = {\n url: result.url,\n status: statusValue,\n reason: result.state === 'BROKEN' ? 'BROKEN' : undefined,\n isExternal,\n sourceUrl: result.parent,\n };\n\n broken.push(brokenLink);\n\n if (isExternal) {\n externalErrors.push(brokenLink);\n } else {\n internalErrors.push(brokenLink);\n }\n }\n }\n\n const success = internalErrors.length === 0;\n\n if (!showOnlyBroken || broken.length > 0) {\n if (success && externalErrors.length === 0) {\n console.log(`✅ All links are valid!`);\n console.log(` Checked ${total} links.`);\n } else {\n // Show internal errors first (more important)\n if (internalErrors.length > 0) {\n console.log(chalk.red(`❌ Found ${internalErrors.length} broken internal links:`));\n for (const { url: linkUrl, status, reason } of internalErrors.slice(0, 20)) {\n console.log(` [${status}] ${linkUrl}${reason ? ` (${reason})` : ''}`);\n }\n if (internalErrors.length > 20) {\n console.log(chalk.dim(` ... and ${internalErrors.length - 20} more`));\n }\n }\n\n // Show external errors (less critical)\n if (externalErrors.length > 0) {\n console.log('');\n console.log(chalk.yellow(`⚠️ Found ${externalErrors.length} broken external links:`));\n for (const { url: linkUrl, status } of externalErrors.slice(0, 10)) {\n console.log(` [${status}] ${linkUrl}`);\n }\n if (externalErrors.length > 10) {\n console.log(chalk.dim(` ... and ${externalErrors.length - 10} more`));\n }\n }\n }\n }\n\n const duration = Date.now() - startTime;\n const result: CheckLinksResult = {\n success,\n broken: broken.length,\n total,\n errors: broken,\n internalErrors,\n externalErrors,\n url,\n timestamp: new Date().toISOString(),\n duration,\n };\n\n if (outputFile) {\n await saveReport(result, outputFile, reportFormat);\n console.log(chalk.green(`\\n📄 Report saved to: ${chalk.cyan(outputFile)}`));\n }\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorName = error instanceof Error ? error.name : 'UnknownError';\n\n if (\n errorMessage.includes('timeout') ||\n errorMessage.includes('TimeoutError') ||\n errorName === 'TimeoutError' ||\n errorMessage.includes('aborted')\n ) {\n console.warn(chalk.yellow(`⚠️ Some links timed out after ${timeout}ms`));\n console.warn(chalk.dim(` This is normal for slow or protected URLs.`));\n if (total > 0) {\n console.warn(chalk.dim(` Checked ${total} links before timeout.`));\n }\n\n if (broken.length > 0) {\n console.log(chalk.red(`\\n❌ Found ${broken.length} broken links:`));\n for (const { url, status, reason } of broken) {\n const statusColor =\n typeof status === 'number' && status >= 500 ? chalk.red : chalk.yellow;\n console.log(\n ` ${statusColor(`[${status}]`)} ${chalk.cyan(url)}${reason ? chalk.dim(` (${reason})`) : ''}`\n );\n }\n }\n } else {\n console.error(chalk.red(`❌ Error checking links: ${errorMessage}`));\n }\n\n const duration = Date.now() - startTime;\n const result: CheckLinksResult = {\n success: internalErrors.length === 0 && total > 0,\n broken: broken.length,\n total,\n errors: broken,\n internalErrors,\n externalErrors,\n url,\n timestamp: new Date().toISOString(),\n duration,\n };\n\n if (outputFile) {\n try {\n await saveReport(result, outputFile, reportFormat);\n console.log(chalk.green(`\\n📄 Report saved to: ${chalk.cyan(outputFile)}`));\n } catch (saveError) {\n console.warn(\n chalk.yellow(\n `\\n⚠️ Failed to save report: ${saveError instanceof Error ? saveError.message : String(saveError)}`\n )\n );\n }\n }\n\n return result;\n }\n}\n\n/**\n * Convert link check results to SEO issues\n * Separates internal (critical) from external (warning) issues\n */\nexport function linkResultsToSeoIssues(result: CheckLinksResult): SeoIssue[] {\n const issues: SeoIssue[] = [];\n\n // Internal broken links are more critical\n for (const error of result.internalErrors) {\n issues.push({\n id: `broken-internal-link-${hash(error.url)}`,\n url: error.url,\n category: 'technical' as const,\n severity: typeof error.status === 'number' && error.status >= 500 ? 'critical' as const : 'error' as const,\n title: `Broken internal link: ${error.status}`,\n description: `Internal link returned ${error.status} status${error.reason ? ` (${error.reason})` : ''}.`,\n recommendation: 'Fix the internal link. This affects user experience and SEO.',\n detectedAt: result.timestamp,\n metadata: {\n status: error.status,\n reason: error.reason,\n sourceUrl: error.sourceUrl || result.url,\n isExternal: false,\n },\n });\n }\n\n // External broken links are warnings\n for (const error of result.externalErrors) {\n issues.push({\n id: `broken-external-link-${hash(error.url)}`,\n url: error.url,\n category: 'technical' as const,\n severity: 'warning' as const,\n title: `Broken external link: ${error.status}`,\n description: `External link returned ${error.status} status.`,\n recommendation: 'Consider removing or updating the external link.',\n detectedAt: result.timestamp,\n metadata: {\n status: error.status,\n reason: error.reason,\n sourceUrl: error.sourceUrl || result.url,\n isExternal: true,\n },\n });\n }\n\n return issues;\n}\n\nasync function saveReport(\n result: CheckLinksResult,\n filePath: string,\n format: 'json' | 'markdown' | 'text'\n): Promise<void> {\n const dir = dirname(filePath);\n if (dir !== '.') {\n await mkdir(dir, { recursive: true });\n }\n\n let content: string;\n\n switch (format) {\n case 'json':\n content = JSON.stringify(result, null, 2);\n break;\n\n case 'markdown':\n content = generateMarkdownReport(result);\n break;\n\n case 'text':\n default:\n content = generateTextReport(result);\n break;\n }\n\n await writeFile(filePath, content, 'utf-8');\n}\n\nfunction generateMarkdownReport(result: CheckLinksResult): string {\n const lines: string[] = [];\n\n lines.push('# Link Check Report');\n lines.push('');\n lines.push(`**URL:** ${result.url}`);\n lines.push(`**Timestamp:** ${result.timestamp}`);\n if (result.duration) {\n lines.push(`**Duration:** ${(result.duration / 1000).toFixed(2)}s`);\n }\n lines.push('');\n lines.push(\n `**Status:** ${result.success ? '✅ All links valid' : '❌ Broken links found'}`\n );\n lines.push(`**Total links:** ${result.total}`);\n lines.push(`**Broken links:** ${result.broken}`);\n lines.push('');\n\n if (result.errors.length > 0) {\n lines.push('## Broken Links');\n lines.push('');\n lines.push('| Status | URL | Reason |');\n lines.push('|--------|-----|--------|');\n for (const { url, status, reason } of result.errors) {\n lines.push(`| ${status} | ${url} | ${reason || '-'} |`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction generateTextReport(result: CheckLinksResult): string {\n const lines: string[] = [];\n\n lines.push('Link Check Report');\n lines.push('='.repeat(50));\n lines.push(`URL: ${result.url}`);\n lines.push(`Timestamp: ${result.timestamp}`);\n if (result.duration) {\n lines.push(`Duration: ${(result.duration / 1000).toFixed(2)}s`);\n }\n lines.push('');\n lines.push(\n `Status: ${result.success ? '✅ All links valid' : '❌ Broken links found'}`\n );\n lines.push(`Total links: ${result.total}`);\n lines.push(`Broken links: ${result.broken}`);\n lines.push('');\n\n if (result.errors.length > 0) {\n lines.push('Broken Links:');\n lines.push('-'.repeat(50));\n for (const { url, status, reason } of result.errors) {\n lines.push(`[${status}] ${url}${reason ? ` (${reason})` : ''}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction hash(str: string): string {\n let h = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n h = (h << 5) - h + char;\n h = h & h;\n }\n return Math.abs(h).toString(36);\n}\n","/**\n * @djangocfg/seo - JSON Report Generator\n * Generate AI-friendly JSON reports\n */\n\nimport type {\n SeoReport,\n SeoIssue,\n UrlInspectionResult,\n CrawlResult,\n ReportSummary,\n Recommendation,\n IssueCategory,\n IssueSeverity,\n} from '../types/index.js';\n\nexport interface JsonReportOptions {\n includeRawData?: boolean;\n prettyPrint?: boolean;\n /** Maximum URLs to include per issue group (default: 10) */\n maxUrlsPerIssue?: number;\n}\n\n/**\n * Generate a comprehensive JSON report\n */\nexport function generateJsonReport(\n siteUrl: string,\n data: {\n issues: SeoIssue[];\n urlInspections?: UrlInspectionResult[];\n crawlResults?: CrawlResult[];\n },\n options: JsonReportOptions = {}\n): SeoReport {\n const { issues, urlInspections = [], crawlResults = [] } = data;\n const maxUrlsPerIssue = options.maxUrlsPerIssue ?? 10;\n\n // Limit issues to maxUrlsPerIssue per title group\n const limitedIssues = limitIssuesByTitle(issues, maxUrlsPerIssue);\n\n const report: SeoReport = {\n id: generateReportId(),\n siteUrl,\n generatedAt: new Date().toISOString(),\n summary: generateSummary(issues, urlInspections, crawlResults), // Use original for accurate counts\n issues: sortIssues(limitedIssues),\n urlInspections: options.includeRawData ? urlInspections.slice(0, 100) : [],\n crawlResults: options.includeRawData ? crawlResults.slice(0, 100) : [],\n recommendations: generateRecommendations(issues, maxUrlsPerIssue),\n };\n\n return report;\n}\n\n/**\n * Limit issues to maxUrls per issue title group\n */\nfunction limitIssuesByTitle(issues: SeoIssue[], maxUrls: number): SeoIssue[] {\n const byTitle = new Map<string, SeoIssue[]>();\n\n for (const issue of issues) {\n const existing = byTitle.get(issue.title) || [];\n existing.push(issue);\n byTitle.set(issue.title, existing);\n }\n\n const limited: SeoIssue[] = [];\n for (const [, group] of byTitle) {\n const sorted = group.sort((a, b) => {\n const severityOrder = { critical: 0, error: 1, warning: 2, info: 3 };\n return severityOrder[a.severity] - severityOrder[b.severity];\n });\n limited.push(...sorted.slice(0, maxUrls));\n }\n\n return limited;\n}\n\n/**\n * Generate report summary\n */\nfunction generateSummary(\n issues: SeoIssue[],\n urlInspections: UrlInspectionResult[],\n crawlResults: CrawlResult[]\n): ReportSummary {\n const totalUrls = Math.max(\n urlInspections.length,\n crawlResults.length,\n new Set(issues.map((i) => i.url)).size\n );\n\n const indexedUrls = urlInspections.filter(\n (r) => r.indexStatusResult.coverageState === 'SUBMITTED_AND_INDEXED'\n ).length;\n\n const notIndexedUrls = urlInspections.filter(\n (r) =>\n r.indexStatusResult.coverageState === 'NOT_INDEXED' ||\n r.indexStatusResult.coverageState === 'CRAWLED_CURRENTLY_NOT_INDEXED' ||\n r.indexStatusResult.coverageState === 'DISCOVERED_CURRENTLY_NOT_INDEXED'\n ).length;\n\n const issuesByCategory = issues.reduce(\n (acc, issue) => {\n acc[issue.category] = (acc[issue.category] || 0) + 1;\n return acc;\n },\n {} as Record<IssueCategory, number>\n );\n\n const issuesBySeverity = issues.reduce(\n (acc, issue) => {\n acc[issue.severity] = (acc[issue.severity] || 0) + 1;\n return acc;\n },\n {} as Record<IssueSeverity, number>\n );\n\n // Calculate health score (0-100)\n const healthScore = calculateHealthScore(issues, totalUrls);\n\n return {\n totalUrls,\n indexedUrls,\n notIndexedUrls,\n issuesByCategory,\n issuesBySeverity,\n healthScore,\n };\n}\n\n/**\n * Calculate overall SEO health score\n */\nfunction calculateHealthScore(issues: SeoIssue[], totalUrls: number): number {\n if (totalUrls === 0) return 100;\n\n const severityWeights: Record<IssueSeverity, number> = {\n critical: 10,\n error: 5,\n warning: 2,\n info: 0.5,\n };\n\n const totalPenalty = issues.reduce(\n (sum, issue) => sum + severityWeights[issue.severity],\n 0\n );\n\n // Max penalty per URL is 20 points\n const maxPenalty = totalUrls * 20;\n const penaltyRatio = Math.min(totalPenalty / maxPenalty, 1);\n\n return Math.round((1 - penaltyRatio) * 100);\n}\n\n/**\n * Generate prioritized recommendations\n */\nfunction generateRecommendations(issues: SeoIssue[], maxUrls: number = 10): Recommendation[] {\n const recommendations: Recommendation[] = [];\n const issueGroups = new Map<string, SeoIssue[]>();\n\n // Group issues by title (similar issues)\n for (const issue of issues) {\n const key = `${issue.category}:${issue.title}`;\n if (!issueGroups.has(key)) {\n issueGroups.set(key, []);\n }\n issueGroups.get(key)!.push(issue);\n }\n\n // Create recommendations for each group\n for (const [, groupedIssues] of issueGroups) {\n const firstIssue = groupedIssues[0];\n if (!firstIssue) continue;\n const severity = firstIssue.severity;\n\n const priority: 1 | 2 | 3 | 4 | 5 =\n severity === 'critical'\n ? 1\n : severity === 'error'\n ? 2\n : severity === 'warning'\n ? 3\n : 4;\n\n const impact: 'high' | 'medium' | 'low' =\n priority <= 2 ? 'high' : priority === 3 ? 'medium' : 'low';\n\n const allUrls = groupedIssues.map((i) => i.url);\n const totalCount = allUrls.length;\n const limitedUrls = allUrls.slice(0, maxUrls);\n\n recommendations.push({\n priority,\n category: firstIssue.category,\n title: firstIssue.title,\n description: totalCount > maxUrls\n ? `${firstIssue.description} (showing ${maxUrls} of ${totalCount} URLs)`\n : firstIssue.description,\n affectedUrls: limitedUrls,\n estimatedImpact: impact,\n actionItems: [firstIssue.recommendation],\n });\n }\n\n // Sort by priority\n return recommendations.sort((a, b) => a.priority - b.priority);\n}\n\n/**\n * Sort issues by severity and category\n */\nfunction sortIssues(issues: SeoIssue[]): SeoIssue[] {\n const severityOrder: Record<IssueSeverity, number> = {\n critical: 0,\n error: 1,\n warning: 2,\n info: 3,\n };\n\n return [...issues].sort((a, b) => {\n const severityDiff = severityOrder[a.severity] - severityOrder[b.severity];\n if (severityDiff !== 0) return severityDiff;\n return a.category.localeCompare(b.category);\n });\n}\n\n/**\n * Generate unique report ID\n */\nfunction generateReportId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `seo-report-${timestamp}-${random}`;\n}\n\n/**\n * Export report as JSON string\n */\nexport function exportJsonReport(report: SeoReport, pretty = true): string {\n return JSON.stringify(report, null, pretty ? 2 : 0);\n}\n\n/**\n * Generate AI-optimized schema for the report\n * This schema helps AI understand the report structure\n */\nexport const AI_REPORT_SCHEMA = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n title: 'SEO Report',\n description: 'AI-friendly SEO analysis report with issues and recommendations',\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Unique report identifier' },\n siteUrl: { type: 'string', description: 'Analyzed site URL' },\n generatedAt: { type: 'string', format: 'date-time' },\n summary: {\n type: 'object',\n description: 'Quick overview of SEO health',\n properties: {\n totalUrls: { type: 'number' },\n indexedUrls: { type: 'number' },\n notIndexedUrls: { type: 'number' },\n healthScore: {\n type: 'number',\n minimum: 0,\n maximum: 100,\n description: '0-100 score, higher is better',\n },\n },\n },\n issues: {\n type: 'array',\n description: 'List of detected SEO issues sorted by severity',\n items: {\n type: 'object',\n properties: {\n severity: {\n type: 'string',\n enum: ['critical', 'error', 'warning', 'info'],\n },\n category: {\n type: 'string',\n enum: [\n 'indexing',\n 'crawling',\n 'content',\n 'technical',\n 'mobile',\n 'performance',\n 'structured-data',\n 'security',\n ],\n },\n title: { type: 'string' },\n description: { type: 'string' },\n recommendation: { type: 'string' },\n url: { type: 'string' },\n },\n },\n },\n recommendations: {\n type: 'array',\n description: 'Prioritized action items',\n items: {\n type: 'object',\n properties: {\n priority: { type: 'number', minimum: 1, maximum: 5 },\n title: { type: 'string' },\n affectedUrls: { type: 'array', items: { type: 'string' } },\n actionItems: { type: 'array', items: { type: 'string' } },\n },\n },\n },\n },\n};\n","/**\n * @djangocfg/seo - Markdown Report Generator\n * Generate human-readable Markdown reports\n */\n\nimport type { SeoReport, SeoIssue, IssueSeverity, IssueCategory } from '../types/index.js';\n\nexport interface MarkdownReportOptions {\n includeRawIssues?: boolean;\n includeUrls?: boolean;\n maxUrlsPerIssue?: number;\n}\n\n/**\n * Generate a Markdown report from SEO data\n */\nexport function generateMarkdownReport(\n report: SeoReport,\n options: MarkdownReportOptions = {}\n): string {\n const { includeRawIssues = true, includeUrls = true, maxUrlsPerIssue = 10 } = options;\n\n const lines: string[] = [];\n\n // Header\n lines.push(`# SEO Analysis Report`);\n lines.push('');\n lines.push(`**Site:** ${report.siteUrl}`);\n lines.push(`**Generated:** ${new Date(report.generatedAt).toLocaleString()}`);\n lines.push(`**Report ID:** ${report.id}`);\n lines.push('');\n\n // Summary\n lines.push('## Summary');\n lines.push('');\n lines.push(`| Metric | Value |`);\n lines.push(`|--------|-------|`);\n lines.push(`| Health Score | ${getHealthScoreEmoji(report.summary.healthScore)} **${report.summary.healthScore}/100** |`);\n lines.push(`| Total URLs | ${report.summary.totalUrls} |`);\n lines.push(`| Indexed URLs | ${report.summary.indexedUrls} |`);\n lines.push(`| Not Indexed | ${report.summary.notIndexedUrls} |`);\n lines.push('');\n\n // Issues by Severity\n lines.push('### Issues by Severity');\n lines.push('');\n const severities: IssueSeverity[] = ['critical', 'error', 'warning', 'info'];\n for (const severity of severities) {\n const count = report.summary.issuesBySeverity[severity] || 0;\n lines.push(`- ${getSeverityEmoji(severity)} **${capitalize(severity)}:** ${count}`);\n }\n lines.push('');\n\n // Issues by Category\n lines.push('### Issues by Category');\n lines.push('');\n const categories = Object.entries(report.summary.issuesByCategory).sort(\n ([, a], [, b]) => b - a\n );\n for (const [category, count] of categories) {\n lines.push(`- ${getCategoryEmoji(category as IssueCategory)} **${formatCategory(category)}:** ${count}`);\n }\n lines.push('');\n\n // Recommendations\n lines.push('## Prioritized Recommendations');\n lines.push('');\n\n for (const rec of report.recommendations) {\n lines.push(`### ${getPriorityEmoji(rec.priority)} Priority ${rec.priority}: ${rec.title}`);\n lines.push('');\n lines.push(`**Category:** ${formatCategory(rec.category)}`);\n lines.push(`**Impact:** ${capitalize(rec.estimatedImpact)}`);\n lines.push(`**Affected URLs:** ${rec.affectedUrls.length}`);\n lines.push('');\n lines.push(`${rec.description}`);\n lines.push('');\n lines.push('**Action Items:**');\n for (const action of rec.actionItems) {\n lines.push(`- ${action}`);\n }\n lines.push('');\n\n if (includeUrls && rec.affectedUrls.length > 0) {\n const urlsToShow = rec.affectedUrls.slice(0, maxUrlsPerIssue);\n lines.push('<details>');\n lines.push(`<summary>Affected URLs (${rec.affectedUrls.length})</summary>`);\n lines.push('');\n for (const url of urlsToShow) {\n lines.push(`- ${url}`);\n }\n if (rec.affectedUrls.length > maxUrlsPerIssue) {\n lines.push(`- ... and ${rec.affectedUrls.length - maxUrlsPerIssue} more`);\n }\n lines.push('</details>');\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n }\n\n // Detailed Issues\n if (includeRawIssues) {\n lines.push('## All Issues');\n lines.push('');\n\n const issuesByCategory = groupBy(report.issues, 'category');\n\n for (const [category, issues] of Object.entries(issuesByCategory)) {\n lines.push(`### ${getCategoryEmoji(category as IssueCategory)} ${formatCategory(category)}`);\n lines.push('');\n\n for (const issue of issues) {\n lines.push(\n `#### ${getSeverityEmoji(issue.severity)} ${issue.title}`\n );\n lines.push('');\n lines.push(`**URL:** \\`${issue.url}\\``);\n lines.push(`**Severity:** ${capitalize(issue.severity)}`);\n lines.push('');\n lines.push(issue.description);\n lines.push('');\n lines.push(`**Recommendation:** ${issue.recommendation}`);\n lines.push('');\n }\n }\n }\n\n // Footer\n lines.push('---');\n lines.push('');\n lines.push('*Report generated by [@djangocfg/seo](https://djangocfg.com)*');\n lines.push('');\n lines.push('> This report is designed to be processed by AI assistants for automated SEO improvements.');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate a concise summary for AI consumption\n */\nexport function generateAiSummary(report: SeoReport): string {\n const lines: string[] = [];\n\n lines.push('# SEO Report Summary for AI Processing');\n lines.push('');\n lines.push('## Context');\n lines.push(`Site: ${report.siteUrl}`);\n lines.push(`Health Score: ${report.summary.healthScore}/100`);\n lines.push(`Critical Issues: ${report.summary.issuesBySeverity.critical || 0}`);\n lines.push(`Errors: ${report.summary.issuesBySeverity.error || 0}`);\n lines.push(`Warnings: ${report.summary.issuesBySeverity.warning || 0}`);\n lines.push('');\n lines.push('## Top Priority Actions');\n lines.push('');\n\n const topRecommendations = report.recommendations.slice(0, 5);\n for (let i = 0; i < topRecommendations.length; i++) {\n const rec = topRecommendations[i];\n if (!rec) continue;\n lines.push(`${i + 1}. **${rec.title}** (${rec.affectedUrls.length} URLs)`);\n lines.push(` - ${rec.actionItems[0]}`);\n }\n\n lines.push('');\n lines.push('## Issue Categories');\n lines.push('');\n\n const sortedCategories = Object.entries(report.summary.issuesByCategory)\n .sort(([, a], [, b]) => b - a);\n\n for (const [category, count] of sortedCategories) {\n lines.push(`- ${formatCategory(category)}: ${count} issues`);\n }\n\n return lines.join('\\n');\n}\n\n// Helper functions\nfunction getSeverityEmoji(severity: IssueSeverity): string {\n const emojis: Record<IssueSeverity, string> = {\n critical: '🔴',\n error: '🟠',\n warning: '🟡',\n info: '🔵',\n };\n return emojis[severity];\n}\n\nfunction getCategoryEmoji(category: IssueCategory): string {\n const emojis: Record<IssueCategory, string> = {\n indexing: '📑',\n crawling: '🕷️',\n content: '📝',\n technical: '⚙️',\n mobile: '📱',\n performance: '⚡',\n 'structured-data': '🏷️',\n security: '🔒',\n };\n return emojis[category] || '📋';\n}\n\nfunction getPriorityEmoji(priority: number): string {\n const emojis: Record<number, string> = {\n 1: '🚨',\n 2: '⚠️',\n 3: '📌',\n 4: '💡',\n 5: 'ℹ️',\n };\n return emojis[priority] || '📋';\n}\n\nfunction getHealthScoreEmoji(score: number): string {\n if (score >= 90) return '🟢';\n if (score >= 70) return '🟡';\n if (score >= 50) return '🟠';\n return '🔴';\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction formatCategory(category: string): string {\n return category\n .split('-')\n .map(capitalize)\n .join(' ');\n}\n\nfunction groupBy<T>(array: T[], key: keyof T): Record<string, T[]> {\n return array.reduce(\n (acc, item) => {\n const groupKey = String(item[key]);\n if (!acc[groupKey]) {\n acc[groupKey] = [];\n }\n acc[groupKey].push(item);\n return acc;\n },\n {} as Record<string, T[]>\n );\n}\n","/**\n * @djangocfg/seo - Split Report Generator\n * Generates AI-friendly split reports (max 1000 lines each)\n */\n\nimport { writeFileSync, mkdirSync, existsSync, rmSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SeoReport, SeoIssue, IssueCategory, IssueSeverity } from '../types/index.js';\n\nconst MAX_LINES = 1000;\n\nexport interface SplitReportOptions {\n outputDir: string;\n /** Clear output directory before generating */\n clearOutputDir?: boolean;\n}\n\nexport interface SplitReportResult {\n indexFile: string;\n categoryFiles: string[];\n totalFiles: number;\n}\n\n/**\n * Generate split reports for AI processing\n */\nexport function generateSplitReports(\n report: SeoReport,\n options: SplitReportOptions\n): SplitReportResult {\n const { outputDir, clearOutputDir = true } = options;\n\n // Clear output directory\n if (clearOutputDir && existsSync(outputDir)) {\n const files = readdirSync(outputDir);\n for (const file of files) {\n if (file.startsWith('seo-') && file.endsWith('.md')) {\n rmSync(join(outputDir, file), { force: true });\n }\n }\n }\n\n // Ensure output directory exists\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);\n const siteName = new URL(report.siteUrl).hostname.replace(/\\./g, '-');\n const prefix = `seo-${siteName}-${timestamp}`;\n\n const categoryFiles: string[] = [];\n\n // Group issues by category\n const issuesByCategory = groupIssuesByCategory(report.issues);\n const categories = Object.keys(issuesByCategory) as IssueCategory[];\n\n // Generate category files\n for (const category of categories) {\n const issues = issuesByCategory[category] || [];\n if (issues.length === 0) continue;\n\n const chunks = splitIntoChunks(issues, category);\n\n for (let i = 0; i < chunks.length; i++) {\n const suffix = chunks.length > 1 ? `-${i + 1}` : '';\n const filename = `${prefix}-${category}${suffix}.md`;\n const filepath = join(outputDir, filename);\n\n const chunk = chunks[i];\n if (!chunk) continue;\n const content = generateCategoryFile(report.siteUrl, category, chunk, {\n part: chunks.length > 1 ? i + 1 : undefined,\n totalParts: chunks.length > 1 ? chunks.length : undefined,\n });\n\n writeFileSync(filepath, content, 'utf-8');\n categoryFiles.push(filename);\n }\n }\n\n // Generate index file\n const indexFilename = `${prefix}-index.md`;\n const indexFilepath = join(outputDir, indexFilename);\n const indexContent = generateIndexFile(report, categoryFiles);\n writeFileSync(indexFilepath, indexContent, 'utf-8');\n\n return {\n indexFile: indexFilename,\n categoryFiles,\n totalFiles: categoryFiles.length + 1,\n };\n}\n\n/**\n * Generate compact index file\n */\nfunction generateIndexFile(report: SeoReport, categoryFiles: string[]): string {\n const lines: string[] = [];\n\n lines.push('# SEO Report Index');\n lines.push('');\n lines.push(`Site: ${report.siteUrl}`);\n lines.push(`Score: ${report.summary.healthScore}/100`);\n lines.push(`Date: ${report.generatedAt.slice(0, 10)}`);\n lines.push('');\n\n // Severity counts\n lines.push('## Issues');\n lines.push('');\n lines.push('| Severity | Count |');\n lines.push('|----------|-------|');\n const severities: IssueSeverity[] = ['critical', 'error', 'warning', 'info'];\n for (const sev of severities) {\n const count = report.summary.issuesBySeverity[sev] || 0;\n if (count > 0) {\n lines.push(`| ${sev} | ${count} |`);\n }\n }\n lines.push('');\n\n // Top 10 recommendations (compact)\n lines.push('## Actions');\n lines.push('');\n const topRecs = report.recommendations.slice(0, 10);\n for (let i = 0; i < topRecs.length; i++) {\n const rec = topRecs[i];\n if (!rec) continue;\n lines.push(`${i + 1}. **${rec.title}** (${rec.affectedUrls.length})`);\n lines.push(` ${rec.actionItems[0]}`);\n }\n lines.push('');\n\n // File index\n lines.push('## Files');\n lines.push('');\n for (const file of categoryFiles) {\n lines.push(`- [${file}](./${file})`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate compact category file\n */\nfunction generateCategoryFile(\n siteUrl: string,\n category: IssueCategory,\n issues: SeoIssue[],\n opts: { part?: number; totalParts?: number }\n): string {\n const lines: string[] = [];\n const partStr = opts.part ? ` (Part ${opts.part}/${opts.totalParts})` : '';\n\n lines.push(`# ${formatCategory(category)}${partStr}`);\n lines.push('');\n lines.push(`Site: ${siteUrl}`);\n lines.push(`Issues: ${issues.length}`);\n lines.push('');\n\n // Group by title for compact display\n const byTitle = new Map<string, SeoIssue[]>();\n for (const issue of issues) {\n const group = byTitle.get(issue.title) || [];\n group.push(issue);\n byTitle.set(issue.title, group);\n }\n\n for (const [title, groupIssues] of byTitle) {\n const first = groupIssues[0];\n if (!first) continue;\n\n lines.push(`## ${title}`);\n lines.push('');\n lines.push(`Severity: ${first.severity}`);\n lines.push(`Count: ${groupIssues.length}`);\n lines.push('');\n lines.push(`> ${first.recommendation}`);\n lines.push('');\n\n // Compact URL list\n lines.push('URLs:');\n for (const issue of groupIssues.slice(0, 20)) {\n lines.push(`- ${issue.url}`);\n }\n if (groupIssues.length > 20) {\n lines.push(`- ... +${groupIssues.length - 20} more`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Split issues into chunks that fit within MAX_LINES\n */\nfunction splitIntoChunks(issues: SeoIssue[], category: IssueCategory): SeoIssue[][] {\n // Estimate lines per issue group (title + severity + recommendation + URLs)\n const byTitle = new Map<string, SeoIssue[]>();\n for (const issue of issues) {\n const group = byTitle.get(issue.title) || [];\n group.push(issue);\n byTitle.set(issue.title, group);\n }\n\n const chunks: SeoIssue[][] = [];\n let currentChunk: SeoIssue[] = [];\n let currentLines = 10; // Header overhead\n\n for (const [, groupIssues] of byTitle) {\n // Estimate: 6 lines header + min(20, count) URLs + 2 spacing\n const urlCount = Math.min(20, groupIssues.length);\n const groupLines = 8 + urlCount;\n\n if (currentLines + groupLines > MAX_LINES && currentChunk.length > 0) {\n chunks.push(currentChunk);\n currentChunk = [];\n currentLines = 10;\n }\n\n currentChunk.push(...groupIssues);\n currentLines += groupLines;\n }\n\n if (currentChunk.length > 0) {\n chunks.push(currentChunk);\n }\n\n return chunks.length > 0 ? chunks : [[]];\n}\n\nfunction groupIssuesByCategory(issues: SeoIssue[]): Record<IssueCategory, SeoIssue[]> {\n const result: Partial<Record<IssueCategory, SeoIssue[]>> = {};\n\n for (const issue of issues) {\n if (!result[issue.category]) {\n result[issue.category] = [];\n }\n result[issue.category]!.push(issue);\n }\n\n return result as Record<IssueCategory, SeoIssue[]>;\n}\n\nfunction formatCategory(category: string): string {\n return category\n .split('-')\n .map(s => s.charAt(0).toUpperCase() + s.slice(1))\n .join(' ');\n}\n","/**\n * @djangocfg/seo - CLAUDE.md Generator\n * Generates AI context file with package docs and current audit state\n */\n\nimport type { SeoReport } from '../types/index.js';\n\n/**\n * Generate CLAUDE.md content for AI context\n */\nexport function generateClaudeContext(report: SeoReport): string {\n const lines: string[] = [];\n\n // Package docs (static)\n lines.push('# @djangocfg/seo');\n lines.push('');\n lines.push('SEO audit toolkit. Generates AI-optimized split reports (max 1000 lines each).');\n lines.push('');\n lines.push('## Commands');\n lines.push('');\n lines.push('```bash');\n lines.push('# Audit (HTTP-based, crawls live site)');\n lines.push('pnpm seo:audit # Full audit (split reports)');\n lines.push('pnpm seo:audit --env dev # Audit local dev');\n lines.push('pnpm seo:audit --format all # All formats');\n lines.push('');\n lines.push('# Content (file-based, scans MDX/content/)');\n lines.push('pnpm exec djangocfg-seo content check # Check MDX links');\n lines.push('pnpm exec djangocfg-seo content fix # Show fixable links');\n lines.push('pnpm exec djangocfg-seo content fix --fix # Apply fixes');\n lines.push('pnpm exec djangocfg-seo content sitemap # Generate sitemap.ts');\n lines.push('```');\n lines.push('');\n lines.push('## Options');\n lines.push('');\n lines.push('- `--env, -e` - prod (default) or dev');\n lines.push('- `--site, -s` - Site URL (overrides env)');\n lines.push('- `--output, -o` - Output directory');\n lines.push('- `--format, -f` - split (default), json, markdown, ai-summary, all');\n lines.push('- `--max-pages` - Max pages (default: 100)');\n lines.push('- `--service-account` - Google service account JSON path');\n lines.push('- `--content-dir` - Content directory (default: content/)');\n lines.push('- `--base-path` - Base URL path for docs (default: /docs)');\n lines.push('');\n lines.push('## Reports');\n lines.push('');\n lines.push('- `seo-*-index.md` - Summary + links to categories');\n lines.push('- `seo-*-technical.md` - Broken links, sitemap issues');\n lines.push('- `seo-*-content.md` - H1, meta, title issues');\n lines.push('- `seo-*-performance.md` - Load time, TTFB issues');\n lines.push('- `seo-ai-summary-*.md` - Quick overview');\n lines.push('');\n\n // Issue types - important for AI to understand priorities\n lines.push('## Issue Severity');\n lines.push('');\n lines.push('- **critical** - Blocks indexing (fix immediately)');\n lines.push('- **error** - SEO problems (high priority)');\n lines.push('- **warning** - Recommendations (medium priority)');\n lines.push('- **info** - Best practices (low priority)');\n lines.push('');\n lines.push('## Issue Categories');\n lines.push('');\n lines.push('- **technical** - Broken links, sitemap, robots.txt');\n lines.push('- **content** - Missing H1, meta description, title');\n lines.push('- **indexing** - Not indexed, crawl errors from GSC');\n lines.push('- **performance** - Slow load time (>3s), high TTFB (>800ms)');\n lines.push('');\n\n // Routes info\n lines.push('## Routes Scanner');\n lines.push('');\n lines.push('Scans Next.js App Router `app/` directory. Handles:');\n lines.push('- Route groups `(group)` - ignored in URL');\n lines.push('- Dynamic `[slug]` - shown as `:slug`');\n lines.push('- Catch-all `[...slug]` - shown as `:...slug`');\n lines.push('- Parallel `@folder` - skipped');\n lines.push('- Private `_folder` - skipped');\n lines.push('');\n\n // Link guidelines\n lines.push('## Link Guidelines');\n lines.push('');\n lines.push('### Nextra/MDX Projects (content/)');\n lines.push('');\n lines.push('For non-index files (e.g., `overview.mdx`):');\n lines.push('- **Sibling file**: `../sibling` (one level up)');\n lines.push('- **Other section**: `/docs/full/path` (absolute)');\n lines.push('- **AVOID**: `./sibling` (browser adds filename to path!)');\n lines.push('- **AVOID**: `../../deep/path` (hard to maintain)');\n lines.push('');\n lines.push('For index files (e.g., `index.mdx`):');\n lines.push('- **Child file**: `./child` works correctly');\n lines.push('- **Sibling folder**: `../sibling/` or absolute');\n lines.push('');\n lines.push('### Next.js App Router Projects');\n lines.push('');\n lines.push('Use declarative routes from `_routes/`:');\n lines.push('```typescript');\n lines.push('import { routes } from \"@/app/_routes\";');\n lines.push('<Link href={routes.dashboard.machines}>Machines</Link>');\n lines.push('```');\n lines.push('');\n lines.push('Benefits: type-safe, refactor-friendly, centralized.');\n lines.push('');\n\n // Current audit state (dynamic)\n lines.push('---');\n lines.push('');\n lines.push('## Current Audit');\n lines.push('');\n lines.push(`Site: ${report.siteUrl}`);\n lines.push(`Score: ${report.summary.healthScore}/100`);\n lines.push(`Date: ${report.generatedAt.slice(0, 10)}`);\n lines.push('');\n\n // Issue summary\n lines.push('### Issues');\n lines.push('');\n const { critical = 0, error = 0, warning = 0, info = 0 } = report.summary.issuesBySeverity;\n if (critical > 0) lines.push(`- Critical: ${critical}`);\n if (error > 0) lines.push(`- Error: ${error}`);\n if (warning > 0) lines.push(`- Warning: ${warning}`);\n if (info > 0) lines.push(`- Info: ${info}`);\n lines.push('');\n\n // Top 5 actions\n lines.push('### Top Actions');\n lines.push('');\n const topRecs = report.recommendations.slice(0, 5);\n for (let i = 0; i < topRecs.length; i++) {\n const rec = topRecs[i];\n if (!rec) continue;\n lines.push(`${i + 1}. **${rec.title}** (${rec.affectedUrls.length} URLs)`);\n }\n lines.push('');\n\n // Report files in this directory\n lines.push('### Report Files');\n lines.push('');\n lines.push('See split reports in this directory:');\n lines.push('- `seo-*-index.md` - Start here');\n lines.push('- `seo-*-technical.md` - Technical issues');\n lines.push('- `seo-*-content.md` - Content issues');\n lines.push('- `seo-*-performance.md` - Performance issues');\n lines.push('');\n\n return lines.join('\\n');\n}\n","/**\n * @djangocfg/seo - Report Generator\n * Main report generation orchestrator\n */\n\nimport { writeFileSync, mkdirSync, existsSync, rmSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport consola from 'consola';\nimport { generateJsonReport, exportJsonReport } from './json-report.js';\nimport { generateMarkdownReport, generateAiSummary } from './markdown-report.js';\nimport { generateSplitReports } from './split-report.js';\nimport { generateClaudeContext } from './claude-context.js';\nimport type {\n SeoReport,\n SeoIssue,\n UrlInspectionResult,\n CrawlResult,\n IssueCategory,\n IssueSeverity,\n} from '../types/index.js';\n\nexport interface ReportGeneratorOptions {\n outputDir: string;\n formats: ('json' | 'markdown' | 'ai-summary' | 'split')[];\n includeRawData?: boolean;\n timestamp?: boolean;\n /** Clear output directory before generating reports */\n clearOutputDir?: boolean;\n /** Maximum URLs to show per issue group (default: 10) */\n maxUrlsPerIssue?: number;\n}\n\nexport interface GeneratedReports {\n report: SeoReport;\n files: {\n json?: string;\n markdown?: string;\n aiSummary?: string;\n split?: {\n index: string;\n categories: string[];\n };\n };\n}\n\n/**\n * Generate and save SEO reports\n */\nexport async function generateAndSaveReports(\n siteUrl: string,\n data: {\n issues: SeoIssue[];\n urlInspections?: UrlInspectionResult[];\n crawlResults?: CrawlResult[];\n },\n options: ReportGeneratorOptions\n): Promise<GeneratedReports> {\n const {\n outputDir,\n formats,\n includeRawData = false,\n timestamp = true,\n clearOutputDir = true,\n maxUrlsPerIssue = 10,\n } = options;\n\n // Clear output directory if requested\n if (clearOutputDir && existsSync(outputDir)) {\n try {\n const files = readdirSync(outputDir);\n for (const file of files) {\n if (file.startsWith('seo-')) {\n rmSync(join(outputDir, file), { force: true });\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n // Ensure output directory exists\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Generate the report\n const report = generateJsonReport(siteUrl, data, { includeRawData, maxUrlsPerIssue });\n\n const result: GeneratedReports = {\n report,\n files: {},\n };\n\n // Generate timestamp for filenames\n const ts = timestamp\n ? `-${new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19)}`\n : '';\n const siteName = new URL(siteUrl).hostname.replace(/\\./g, '-');\n\n // Generate JSON report\n if (formats.includes('json')) {\n const filename = `seo-report-${siteName}${ts}.json`;\n const filepath = join(outputDir, filename);\n const content = exportJsonReport(report, true);\n writeFileSync(filepath, content, 'utf-8');\n result.files.json = filepath;\n consola.success(`JSON report saved: ${filepath}`);\n }\n\n // Generate Markdown report\n if (formats.includes('markdown')) {\n const filename = `seo-report-${siteName}${ts}.md`;\n const filepath = join(outputDir, filename);\n const content = generateMarkdownReport(report, {\n includeRawIssues: true,\n includeUrls: true,\n });\n writeFileSync(filepath, content, 'utf-8');\n result.files.markdown = filepath;\n consola.success(`Markdown report saved: ${filepath}`);\n }\n\n // Generate AI summary\n if (formats.includes('ai-summary')) {\n const filename = `seo-ai-summary-${siteName}${ts}.md`;\n const filepath = join(outputDir, filename);\n const content = generateAiSummary(report);\n writeFileSync(filepath, content, 'utf-8');\n result.files.aiSummary = filepath;\n consola.success(`AI summary saved: ${filepath}`);\n }\n\n // Generate split reports (AI-optimized, max 1000 lines each)\n if (formats.includes('split')) {\n const splitResult = generateSplitReports(report, {\n outputDir,\n clearOutputDir: false, // Already cleared above\n });\n result.files.split = {\n index: join(outputDir, splitResult.indexFile),\n categories: splitResult.categoryFiles.map(f => join(outputDir, f)),\n };\n consola.success(`Split reports saved: ${splitResult.totalFiles} files (index + ${splitResult.categoryFiles.length} categories)`);\n }\n\n // Always generate CLAUDE.md for AI context\n const claudeContent = generateClaudeContext(report);\n const claudeFilepath = join(outputDir, 'CLAUDE.md');\n writeFileSync(claudeFilepath, claudeContent, 'utf-8');\n consola.success(`AI context saved: ${claudeFilepath}`);\n\n return result;\n}\n\n/**\n * Print report summary to console\n */\nexport function printReportSummary(report: SeoReport): void {\n consola.box(\n `SEO Report: ${report.siteUrl}\\n` +\n `Health Score: ${report.summary.healthScore}/100\\n` +\n `Total URLs: ${report.summary.totalUrls}\\n` +\n `Indexed: ${report.summary.indexedUrls} | Not Indexed: ${report.summary.notIndexedUrls}\\n` +\n `Issues: ${report.issues.length}`\n );\n\n if (report.summary.issuesBySeverity.critical) {\n consola.error(`Critical issues: ${report.summary.issuesBySeverity.critical}`);\n }\n if (report.summary.issuesBySeverity.error) {\n consola.warn(`Errors: ${report.summary.issuesBySeverity.error}`);\n }\n if (report.summary.issuesBySeverity.warning) {\n consola.info(`Warnings: ${report.summary.issuesBySeverity.warning}`);\n }\n\n consola.log('');\n consola.info('Top recommendations:');\n for (const rec of report.recommendations.slice(0, 3)) {\n consola.log(` ${rec.priority}. ${rec.title} (${rec.affectedUrls.length} URLs)`);\n }\n}\n\n/**\n * Merge multiple reports into one\n */\nexport function mergeReports(reports: SeoReport[]): SeoReport {\n if (reports.length === 0) {\n throw new Error('Cannot merge empty reports array');\n }\n\n const merged: SeoReport = {\n id: `merged-${Date.now().toString(36)}`,\n siteUrl: reports.map((r) => r.siteUrl).join(', '),\n generatedAt: new Date().toISOString(),\n summary: {\n totalUrls: reports.reduce((sum, r) => sum + r.summary.totalUrls, 0),\n indexedUrls: reports.reduce((sum, r) => sum + r.summary.indexedUrls, 0),\n notIndexedUrls: reports.reduce((sum, r) => sum + r.summary.notIndexedUrls, 0),\n issuesByCategory: {} as any,\n issuesBySeverity: {} as any,\n healthScore: Math.round(\n reports.reduce((sum, r) => sum + r.summary.healthScore, 0) / reports.length\n ),\n },\n issues: reports.flatMap((r) => r.issues),\n urlInspections: reports.flatMap((r) => r.urlInspections),\n crawlResults: reports.flatMap((r) => r.crawlResults),\n recommendations: [],\n };\n\n // Merge issue counts\n for (const report of reports) {\n for (const [category, count] of Object.entries(report.summary.issuesByCategory)) {\n const cat = category as IssueCategory;\n merged.summary.issuesByCategory[cat] =\n (merged.summary.issuesByCategory[cat] || 0) + count;\n }\n for (const [severity, count] of Object.entries(report.summary.issuesBySeverity)) {\n const sev = severity as IssueSeverity;\n merged.summary.issuesBySeverity[sev] =\n (merged.summary.issuesBySeverity[sev] || 0) + count;\n }\n }\n\n // Merge and deduplicate recommendations\n const recMap = new Map<string, typeof merged.recommendations[0]>();\n for (const report of reports) {\n for (const rec of report.recommendations) {\n const key = `${rec.category}:${rec.title}`;\n if (recMap.has(key)) {\n const existing = recMap.get(key)!;\n existing.affectedUrls.push(...rec.affectedUrls);\n } else {\n recMap.set(key, { ...rec, affectedUrls: [...rec.affectedUrls] });\n }\n }\n }\n merged.recommendations = Array.from(recMap.values()).sort(\n (a, b) => a.priority - b.priority\n );\n\n return merged;\n}\n","/**\n * @djangocfg/seo - Next.js App Router Scanner\n * Scans app/ directory to extract all routes\n */\n\nimport { readdirSync, statSync, existsSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\nexport interface RouteInfo {\n /** Route path (e.g., /blog/[slug]) */\n path: string;\n /** File path relative to app/ */\n filePath: string;\n /** Route type */\n type: 'page' | 'api' | 'layout' | 'loading' | 'error';\n /** Is dynamic route */\n isDynamic: boolean;\n /** Dynamic segments (e.g., ['slug', '...path']) */\n dynamicSegments: string[];\n /** Is catch-all route */\n isCatchAll: boolean;\n /** Is optional catch-all route */\n isOptionalCatchAll: boolean;\n /** Route group (if any) */\n routeGroup?: string;\n}\n\nexport interface ScanResult {\n /** All discovered routes */\n routes: RouteInfo[];\n /** Static routes (no dynamic segments) */\n staticRoutes: RouteInfo[];\n /** Dynamic routes (with [param]) */\n dynamicRoutes: RouteInfo[];\n /** API routes */\n apiRoutes: RouteInfo[];\n /** App directory path */\n appDir: string;\n}\n\nexport interface ScanOptions {\n /** Path to app directory */\n appDir?: string;\n /** Include API routes */\n includeApi?: boolean;\n /** Include layouts, loading, error pages */\n includeSpecial?: boolean;\n}\n\nconst PAGE_FILES = ['page.tsx', 'page.ts', 'page.jsx', 'page.js'];\nconst ROUTE_FILES = ['route.tsx', 'route.ts', 'route.jsx', 'route.js'];\nconst SPECIAL_FILES = ['layout', 'loading', 'error', 'not-found', 'template'];\n\n/**\n * Find app directory by searching common locations\n */\nexport function findAppDir(startDir: string = process.cwd()): string | null {\n const candidates = [\n join(startDir, 'app'),\n join(startDir, 'src', 'app'),\n ];\n\n for (const dir of candidates) {\n if (existsSync(dir) && statSync(dir).isDirectory()) {\n return dir;\n }\n }\n\n return null;\n}\n\n/**\n * Scan Next.js app directory for routes\n */\nexport function scanRoutes(options: ScanOptions = {}): ScanResult {\n const {\n appDir = findAppDir() || './app',\n includeApi = true,\n includeSpecial = false,\n } = options;\n\n if (!existsSync(appDir)) {\n throw new Error(`App directory not found: ${appDir}`);\n }\n\n const routes: RouteInfo[] = [];\n\n scanDirectory(appDir, '', routes, { includeApi, includeSpecial });\n\n return {\n routes,\n staticRoutes: routes.filter(r => !r.isDynamic && r.type === 'page'),\n dynamicRoutes: routes.filter(r => r.isDynamic && r.type === 'page'),\n apiRoutes: routes.filter(r => r.type === 'api'),\n appDir,\n };\n}\n\nfunction scanDirectory(\n dir: string,\n routePath: string,\n routes: RouteInfo[],\n options: { includeApi: boolean; includeSpecial: boolean }\n): void {\n let entries: string[];\n\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n\n let stat;\n try {\n stat = statSync(fullPath);\n } catch {\n continue;\n }\n\n if (stat.isDirectory()) {\n // Skip private folders\n if (entry.startsWith('_') || entry.startsWith('.')) continue;\n\n // Handle route groups (folder)\n if (entry.startsWith('(') && entry.endsWith(')')) {\n // Route groups don't add to URL path\n scanDirectory(fullPath, routePath, routes, options);\n continue;\n }\n\n // Handle parallel routes @folder\n if (entry.startsWith('@')) {\n // Parallel routes don't add to URL path\n scanDirectory(fullPath, routePath, routes, options);\n continue;\n }\n\n // Handle intercepting routes (.)folder, (..)folder, (...)folder\n if (entry.startsWith('(') && !entry.endsWith(')')) {\n continue; // Skip intercepting routes for now\n }\n\n // Build new route path\n const segment = processSegment(entry);\n const newRoutePath = routePath + '/' + segment.urlSegment;\n\n scanDirectory(fullPath, newRoutePath, routes, options);\n } else if (stat.isFile()) {\n // Check for page files\n if (PAGE_FILES.includes(entry)) {\n const route = createRouteInfo(routePath || '/', dir, 'page');\n routes.push(route);\n }\n\n // Check for API route files\n if (options.includeApi && ROUTE_FILES.includes(entry)) {\n const route = createRouteInfo(routePath || '/', dir, 'api');\n routes.push(route);\n }\n\n // Check for special files\n if (options.includeSpecial) {\n const baseName = entry.replace(/\\.(tsx?|jsx?|js)$/, '');\n if (SPECIAL_FILES.includes(baseName)) {\n const route = createRouteInfo(routePath || '/', dir, baseName as RouteInfo['type']);\n routes.push(route);\n }\n }\n }\n }\n}\n\ninterface SegmentInfo {\n urlSegment: string;\n isDynamic: boolean;\n paramName?: string;\n isCatchAll: boolean;\n isOptionalCatchAll: boolean;\n}\n\nfunction processSegment(segment: string): SegmentInfo {\n // Optional catch-all: [[...slug]]\n if (segment.startsWith('[[...') && segment.endsWith(']]')) {\n const paramName = segment.slice(5, -2);\n return {\n urlSegment: segment,\n isDynamic: true,\n paramName,\n isCatchAll: true,\n isOptionalCatchAll: true,\n };\n }\n\n // Catch-all: [...slug]\n if (segment.startsWith('[...') && segment.endsWith(']')) {\n const paramName = segment.slice(4, -1);\n return {\n urlSegment: segment,\n isDynamic: true,\n paramName,\n isCatchAll: true,\n isOptionalCatchAll: false,\n };\n }\n\n // Dynamic: [slug]\n if (segment.startsWith('[') && segment.endsWith(']')) {\n const paramName = segment.slice(1, -1);\n return {\n urlSegment: segment,\n isDynamic: true,\n paramName,\n isCatchAll: false,\n isOptionalCatchAll: false,\n };\n }\n\n // Static segment\n return {\n urlSegment: segment,\n isDynamic: false,\n isCatchAll: false,\n isOptionalCatchAll: false,\n };\n}\n\nfunction createRouteInfo(path: string, filePath: string, type: RouteInfo['type']): RouteInfo {\n const segments = path.split('/').filter(Boolean);\n const dynamicSegments: string[] = [];\n let isDynamic = false;\n let isCatchAll = false;\n let isOptionalCatchAll = false;\n\n for (const segment of segments) {\n const info = processSegment(segment);\n if (info.isDynamic) {\n isDynamic = true;\n if (info.paramName) {\n dynamicSegments.push(info.paramName);\n }\n if (info.isCatchAll) isCatchAll = true;\n if (info.isOptionalCatchAll) isOptionalCatchAll = true;\n }\n }\n\n // Extract route group from path\n let routeGroup: string | undefined;\n const groupMatch = filePath.match(/\\(([^)]+)\\)/);\n if (groupMatch) {\n routeGroup = groupMatch[1];\n }\n\n return {\n path: path || '/',\n filePath,\n type,\n isDynamic,\n dynamicSegments,\n isCatchAll,\n isOptionalCatchAll,\n routeGroup,\n };\n}\n\n/**\n * Convert route path to URL (replace dynamic segments with example values)\n */\nexport function routeToUrl(route: RouteInfo, params?: Record<string, string>): string {\n let url = route.path;\n\n for (const segment of route.dynamicSegments) {\n const value = params?.[segment] || `{${segment}}`;\n\n // Handle different dynamic segment types\n if (route.isOptionalCatchAll) {\n url = url.replace(`[[...${segment}]]`, value);\n } else if (route.isCatchAll) {\n url = url.replace(`[...${segment}]`, value);\n } else {\n url = url.replace(`[${segment}]`, value);\n }\n }\n\n return url;\n}\n\n/**\n * Get static routes as URLs (ready to check)\n */\nexport function getStaticUrls(scanResult: ScanResult, baseUrl: string): string[] {\n return scanResult.staticRoutes.map(route => {\n const url = new URL(route.path, baseUrl);\n return url.href;\n });\n}\n","/**\n * @djangocfg/seo - Routes Analyzer\n * Compare routes with sitemap and verify accessibility\n */\n\nimport pLimit from 'p-limit';\nimport type { ScanResult, RouteInfo } from './scanner.js';\nimport type { SeoIssue } from '../types/index.js';\n\nexport interface SitemapUrl {\n loc: string;\n lastmod?: string;\n changefreq?: string;\n priority?: string;\n}\n\nexport interface RouteComparisonResult {\n /** Routes found in app/ */\n appRoutes: RouteInfo[];\n /** URLs found in sitemap */\n sitemapUrls: string[];\n /** Static routes missing from sitemap */\n missingFromSitemap: RouteInfo[];\n /** Sitemap URLs that don't match any route */\n extraInSitemap: string[];\n /** Matching routes */\n matching: RouteInfo[];\n}\n\nexport interface RouteVerificationResult {\n /** Route being verified */\n route: RouteInfo;\n /** Full URL */\n url: string;\n /** HTTP status code */\n statusCode: number;\n /** Is accessible (2xx) */\n isAccessible: boolean;\n /** Error message if failed */\n error?: string;\n /** Response time in ms */\n responseTime: number;\n}\n\nexport interface VerifyOptions {\n /** Base URL (e.g., http://localhost:3000) */\n baseUrl: string;\n /** Request timeout in ms */\n timeout?: number;\n /** Max concurrent requests */\n concurrency?: number;\n /** Only verify static routes */\n staticOnly?: boolean;\n}\n\n/**\n * Compare routes with sitemap URLs\n */\nexport function compareWithSitemap(\n scanResult: ScanResult,\n sitemapUrls: string[],\n baseUrl: string\n): RouteComparisonResult {\n const appRoutes = scanResult.routes.filter(r => r.type === 'page');\n\n // Normalize sitemap URLs to paths\n const sitemapPaths = new Set(\n sitemapUrls.map(url => {\n try {\n return new URL(url).pathname;\n } catch {\n return url;\n }\n })\n );\n\n // Find static routes missing from sitemap\n const missingFromSitemap: RouteInfo[] = [];\n const matching: RouteInfo[] = [];\n\n for (const route of scanResult.staticRoutes) {\n const path = route.path === '/' ? '/' : route.path;\n // Check with and without trailing slash\n if (sitemapPaths.has(path) || sitemapPaths.has(path + '/') || sitemapPaths.has(path.replace(/\\/$/, ''))) {\n matching.push(route);\n } else {\n missingFromSitemap.push(route);\n }\n }\n\n // Find sitemap URLs that don't match any static route\n const staticPaths = new Set(scanResult.staticRoutes.map(r => r.path));\n const dynamicPatterns = scanResult.dynamicRoutes.map(r => routeToRegex(r.path));\n\n const extraInSitemap: string[] = [];\n for (const path of sitemapPaths) {\n // Skip if matches static route\n if (staticPaths.has(path) || staticPaths.has(path + '/') || staticPaths.has(path.replace(/\\/$/, ''))) {\n continue;\n }\n\n // Skip if matches dynamic route pattern\n const matchesDynamic = dynamicPatterns.some(regex => regex.test(path));\n if (matchesDynamic) continue;\n\n extraInSitemap.push(path);\n }\n\n return {\n appRoutes,\n sitemapUrls,\n missingFromSitemap,\n extraInSitemap,\n matching,\n };\n}\n\n/**\n * Convert route path to regex for matching\n */\nfunction routeToRegex(routePath: string): RegExp {\n let pattern = routePath\n // Escape special regex chars except [ ]\n .replace(/[.+?^${}()|\\\\]/g, '\\\\$&')\n // Optional catch-all: [[...slug]] matches zero or more segments\n .replace(/\\[\\[\\.\\.\\.([^\\]]+)\\]\\]/g, '(?:/.*)?')\n // Catch-all: [...slug] matches one or more segments\n .replace(/\\[\\.\\.\\.([^\\]]+)\\]/g, '/.+')\n // Dynamic: [slug] matches one segment\n .replace(/\\[([^\\]]+)\\]/g, '/[^/]+');\n\n // Handle trailing slash optionally\n pattern = `^${pattern}/?$`;\n\n return new RegExp(pattern);\n}\n\n/**\n * Verify routes are accessible\n */\nexport async function verifyRoutes(\n scanResult: ScanResult,\n options: VerifyOptions\n): Promise<RouteVerificationResult[]> {\n const {\n baseUrl,\n timeout = 10000,\n concurrency = 5,\n staticOnly = true,\n } = options;\n\n const routes = staticOnly ? scanResult.staticRoutes : scanResult.routes.filter(r => r.type === 'page');\n const limit = pLimit(concurrency);\n\n const results = await Promise.all(\n routes.map(route =>\n limit(async () => {\n const url = new URL(route.path, baseUrl).href;\n const startTime = Date.now();\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(url, {\n method: 'HEAD',\n signal: controller.signal,\n redirect: 'follow',\n });\n\n clearTimeout(timeoutId);\n\n return {\n route,\n url,\n statusCode: response.status,\n isAccessible: response.status >= 200 && response.status < 400,\n responseTime: Date.now() - startTime,\n };\n } catch (error) {\n return {\n route,\n url,\n statusCode: 0,\n isAccessible: false,\n error: (error as Error).message,\n responseTime: Date.now() - startTime,\n };\n }\n })\n )\n );\n\n return results;\n}\n\n/**\n * Analyze routes and generate SEO issues\n */\nexport function analyzeRoutes(\n scanResult: ScanResult,\n comparison?: RouteComparisonResult,\n verification?: RouteVerificationResult[]\n): SeoIssue[] {\n const issues: SeoIssue[] = [];\n const now = new Date().toISOString();\n\n // Issue: Static routes missing from sitemap\n if (comparison && comparison.missingFromSitemap.length > 0) {\n for (const route of comparison.missingFromSitemap) {\n issues.push({\n id: `route-missing-sitemap-${route.path}`,\n category: 'indexing',\n severity: 'warning',\n title: 'Route missing from sitemap',\n description: `Static route ${route.path} is not in sitemap.xml`,\n url: route.path,\n recommendation: 'Add this route to your sitemap for better indexing',\n detectedAt: now,\n });\n }\n }\n\n // Issue: Sitemap URLs that don't match routes (potential dead links)\n if (comparison && comparison.extraInSitemap.length > 0) {\n for (const path of comparison.extraInSitemap.slice(0, 20)) {\n issues.push({\n id: `sitemap-orphan-${path}`,\n category: 'indexing',\n severity: 'info',\n title: 'Sitemap URL without matching route',\n description: `URL ${path} in sitemap doesn't match any app/ route`,\n url: path,\n recommendation: 'Verify this URL is still valid or remove from sitemap',\n detectedAt: now,\n });\n }\n }\n\n // Issue: Inaccessible routes\n if (verification) {\n for (const result of verification) {\n if (!result.isAccessible) {\n issues.push({\n id: `route-inaccessible-${result.route.path}`,\n category: 'technical',\n severity: result.statusCode === 404 ? 'error' : 'warning',\n title: `Route returns ${result.statusCode || 'error'}`,\n description: result.error || `Route ${result.route.path} returned status ${result.statusCode}`,\n url: result.url,\n recommendation: 'Fix the route or remove it from app/',\n detectedAt: now,\n });\n }\n }\n }\n\n // Issue: Too many dynamic routes (SEO concern)\n if (scanResult.dynamicRoutes.length > scanResult.staticRoutes.length * 2) {\n issues.push({\n id: 'too-many-dynamic-routes',\n category: 'content',\n severity: 'info',\n title: 'High ratio of dynamic routes',\n description: `${scanResult.dynamicRoutes.length} dynamic vs ${scanResult.staticRoutes.length} static routes`,\n url: '/',\n recommendation: 'Ensure dynamic routes have proper generateStaticParams for SSG',\n detectedAt: now,\n });\n }\n\n return issues;\n}\n\n/**\n * Generate routes summary\n */\nexport function generateRoutesSummary(\n scanResult: ScanResult,\n comparison?: RouteComparisonResult,\n verification?: RouteVerificationResult[]\n): string {\n const lines: string[] = [];\n\n lines.push('## Routes Summary');\n lines.push('');\n lines.push(`Total routes: ${scanResult.routes.length}`);\n lines.push(`├── Static: ${scanResult.staticRoutes.length}`);\n lines.push(`├── Dynamic: ${scanResult.dynamicRoutes.length}`);\n lines.push(`└── API: ${scanResult.apiRoutes.length}`);\n lines.push('');\n\n if (comparison) {\n lines.push('### Sitemap Comparison');\n lines.push('');\n lines.push(`Sitemap URLs: ${comparison.sitemapUrls.length}`);\n lines.push(`├── Matching: ${comparison.matching.length}`);\n lines.push(`├── Missing from sitemap: ${comparison.missingFromSitemap.length}`);\n lines.push(`└── Extra in sitemap: ${comparison.extraInSitemap.length}`);\n lines.push('');\n }\n\n if (verification) {\n const accessible = verification.filter(r => r.isAccessible).length;\n const broken = verification.filter(r => !r.isAccessible);\n\n lines.push('### Route Verification');\n lines.push('');\n lines.push(`Accessible: ${accessible}/${verification.length}`);\n\n if (broken.length > 0) {\n lines.push('');\n lines.push('Broken routes:');\n for (const r of broken.slice(0, 10)) {\n lines.push(` - ${r.route.path} → ${r.statusCode || r.error}`);\n }\n if (broken.length > 10) {\n lines.push(` - ... +${broken.length - 10} more`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * CLI Types and Options\n */\n\nexport interface CliOptions {\n env: string;\n site?: string;\n output: string;\n urls?: string;\n 'max-pages': string;\n 'max-depth': string;\n timeout: string;\n concurrency: string;\n format: string;\n 'service-account'?: string;\n 'app-dir'?: string;\n 'content-dir'?: string;\n 'base-path'?: string;\n check?: boolean;\n verify?: boolean;\n fix?: boolean;\n help?: boolean;\n version?: boolean;\n /** Positional arguments */\n _?: string[];\n}\n\nexport type ReportFormat = 'json' | 'markdown' | 'ai-summary' | 'split';\n\nexport function parseFormats(format: string): ReportFormat[] {\n if (format === 'all') {\n return ['json', 'markdown', 'ai-summary', 'split'];\n }\n\n if (format === 'split') {\n return ['ai-summary', 'split'];\n }\n\n return format.split(',').map((f) => f.trim()) as ReportFormat[];\n}\n","/**\n * Audit Command - Full SEO audit\n */\n\nimport consola from 'consola';\nimport chalk from 'chalk';\nimport { getSiteUrl, findGoogleServiceAccount, getGscKeyFilename } from '../../config.js';\nimport { GoogleConsoleClient, analyzeInspectionResults } from '../../google-console/index.js';\nimport { SiteCrawler, analyzeCrawlResults, analyzeRobotsTxt, analyzeAllSitemaps, analyzeSitemap } from '../../crawler/index.js';\nimport { checkLinks, linkResultsToSeoIssues } from '../../link-checker/index.js';\nimport { generateAndSaveReports, printReportSummary } from '../../reports/index.js';\nimport { scanRoutes, findAppDir, compareWithSitemap, analyzeRoutes } from '../../routes/index.js';\nimport type { SeoIssue, UrlInspectionResult, CrawlResult } from '../../types/index.js';\nimport { parseFormats, type CliOptions } from '../types.js';\n\ninterface StepResult {\n name: string;\n issues: SeoIssue[];\n meta?: Record<string, any>;\n error?: string;\n}\n\nexport async function runAudit(options: CliOptions) {\n const siteUrl = getSiteUrl(options);\n const startTime = Date.now();\n\n console.log('');\n consola.box(`${chalk.bold('SEO Audit')}\\n${siteUrl}`);\n\n // Auto-detect or use explicit service account\n const serviceAccountPath = findGoogleServiceAccount(options['service-account']);\n const hasGsc = !!serviceAccountPath;\n\n // Auto-detect app directory for routes\n const appDir = options['app-dir'] || findAppDir();\n const hasRoutes = !!appDir;\n\n // Show hints\n if (!serviceAccountPath) {\n const keyFile = getGscKeyFilename();\n console.log('');\n consola.info(chalk.dim('GSC not configured. Save service account as ' + chalk.cyan(keyFile) + ' for indexing data.'));\n }\n\n const allIssues: SeoIssue[] = [];\n const allInspections: UrlInspectionResult[] = [];\n const allCrawlResults: CrawlResult[] = [];\n const results: StepResult[] = [];\n let collectedSitemapUrls: string[] = [];\n\n // Progress tracking: robots + sitemap + crawl + links + (routes?) + (gsc?)\n let totalSteps = 4;\n if (hasRoutes) totalSteps++;\n if (hasGsc) totalSteps++;\n let completedSteps = 0;\n const errors: string[] = [];\n\n const updateProgress = (step: string, status: 'running' | 'done' | 'error') => {\n const bar = '█'.repeat(completedSteps) + '░'.repeat(totalSteps - completedSteps);\n const pct = Math.round((completedSteps / totalSteps) * 100);\n if (status === 'running') {\n process.stdout.write(`\\r${chalk.cyan('▸')} ${bar} ${pct}% ${chalk.dim(step)}`);\n } else if (status === 'done') {\n completedSteps++;\n const newBar = '█'.repeat(completedSteps) + '░'.repeat(totalSteps - completedSteps);\n const newPct = Math.round((completedSteps / totalSteps) * 100);\n process.stdout.write(`\\r${chalk.green('✓')} ${newBar} ${newPct}% ${chalk.dim(step)}${' '.repeat(20)}\\n`);\n } else {\n process.stdout.write(`\\r${chalk.red('✗')} ${bar} ${pct}% ${chalk.dim(step)}${' '.repeat(20)}\\n`);\n }\n };\n\n // Phase 1: robots.txt (needed for sitemap URLs)\n console.log('');\n let sitemapUrls: string[] = [];\n updateProgress('robots.txt', 'running');\n try {\n const analysis = await analyzeRobotsTxt(siteUrl);\n sitemapUrls = analysis.sitemaps;\n results.push({ name: 'robots.txt', issues: analysis.issues, meta: { exists: analysis.exists } });\n allIssues.push(...analysis.issues);\n updateProgress('robots.txt', 'done');\n } catch (e) {\n errors.push(`robots.txt: ${(e as Error).message}`);\n updateProgress('robots.txt', 'error');\n }\n\n // Phase 2: Parallel execution (Sitemap + Crawl + Links)\n const parallelTasks = await Promise.allSettled([\n // Sitemap\n (async () => {\n updateProgress('Sitemap', 'running');\n const issues: SeoIssue[] = [];\n const sitemapsToCheck = sitemapUrls.length > 0\n ? sitemapUrls\n : [new URL('/sitemap.xml', siteUrl).href];\n\n let totalUrls = 0;\n for (const smUrl of sitemapsToCheck) {\n const analyses = await analyzeAllSitemaps(smUrl);\n for (const a of analyses) {\n issues.push(...a.issues);\n totalUrls += a.urls.length;\n // Collect URLs for routes comparison\n collectedSitemapUrls.push(...a.urls.map(u => u.loc));\n }\n }\n updateProgress('Sitemap', 'done');\n return { name: 'Sitemap', issues, meta: { urls: totalUrls } };\n })(),\n\n // Crawl\n (async () => {\n updateProgress('Crawl', 'running');\n const crawler = new SiteCrawler(siteUrl, {\n maxPages: parseInt(options['max-pages'], 10),\n maxDepth: parseInt(options['max-depth'], 10),\n });\n const crawlResults = await crawler.crawl();\n allCrawlResults.push(...crawlResults);\n const issues = analyzeCrawlResults(crawlResults);\n updateProgress('Crawl', 'done');\n return { name: 'Crawl', issues, meta: { pages: crawlResults.length } };\n })(),\n\n // Links\n (async () => {\n updateProgress('Links', 'running');\n const result = await checkLinks({\n url: siteUrl,\n timeout: parseInt(options.timeout, 10),\n concurrency: parseInt(options.concurrency, 10),\n verbose: false,\n });\n const issues = linkResultsToSeoIssues(result);\n updateProgress('Links', 'done');\n return { name: 'Links', issues, meta: { total: result.total, broken: result.broken } };\n })(),\n ]);\n\n // Collect parallel results\n for (const task of parallelTasks) {\n if (task.status === 'fulfilled') {\n results.push(task.value);\n allIssues.push(...task.value.issues);\n } else {\n errors.push(task.reason?.message || 'Unknown error');\n }\n }\n\n // Phase 3: Routes (needs sitemap URLs from parallel phase)\n if (hasRoutes && appDir) {\n updateProgress('Routes', 'running');\n try {\n const scanResult = scanRoutes({ appDir });\n const comparison = compareWithSitemap(scanResult, collectedSitemapUrls, siteUrl);\n const issues = analyzeRoutes(scanResult, comparison);\n\n results.push({\n name: 'Routes',\n issues,\n meta: {\n static: scanResult.staticRoutes.length,\n dynamic: scanResult.dynamicRoutes.length,\n missing: comparison.missingFromSitemap.length,\n },\n });\n allIssues.push(...issues);\n updateProgress('Routes', 'done');\n } catch (e) {\n errors.push(`Routes: ${(e as Error).message}`);\n updateProgress('Routes', 'error');\n }\n }\n\n // Phase 4: GSC (needs crawl results)\n if (hasGsc) {\n updateProgress('GSC', 'running');\n try {\n const client = new GoogleConsoleClient({\n siteUrl,\n serviceAccountPath,\n });\n\n const isAuth = await client.verify();\n if (isAuth) {\n const urlsToInspect = allCrawlResults\n .filter((r) => r.statusCode === 200)\n .slice(0, 50)\n .map((r) => r.url);\n\n const inspections = await client.inspectUrls(urlsToInspect);\n allInspections.push(...inspections);\n const issues = analyzeInspectionResults(inspections);\n results.push({ name: 'GSC', issues, meta: { inspected: inspections.length } });\n allIssues.push(...issues);\n } else {\n results.push({ name: 'GSC', issues: [], meta: { skipped: true } });\n }\n updateProgress('GSC', 'done');\n } catch (e) {\n errors.push(`GSC: ${(e as Error).message}`);\n updateProgress('GSC', 'error');\n }\n }\n\n // Show errors if any\n if (errors.length > 0) {\n console.log('');\n for (const err of errors) {\n consola.error(err);\n }\n }\n\n // Summary table\n console.log('');\n consola.log(chalk.bold('Results:'));\n for (const r of results) {\n const issueStr = r.issues.length > 0 ? chalk.yellow(`${r.issues.length} issues`) : chalk.green('OK');\n const metaStr = r.meta ? chalk.dim(` (${Object.entries(r.meta).map(([k, v]) => `${k}: ${v}`).join(', ')})`) : '';\n consola.log(` ${r.name}: ${issueStr}${metaStr}`);\n }\n\n // Generate reports\n console.log('');\n consola.start('Generating reports...');\n\n const formats = parseFormats(options.format);\n const { report, files } = await generateAndSaveReports(\n siteUrl,\n {\n issues: allIssues,\n urlInspections: allInspections,\n crawlResults: allCrawlResults,\n },\n {\n outputDir: options.output,\n formats,\n includeRawData: true,\n }\n );\n\n // Summary\n const duration = ((Date.now() - startTime) / 1000).toFixed(1);\n console.log('');\n printReportSummary(report);\n\n console.log('');\n consola.info(`Reports saved to: ${chalk.cyan(options.output)}`);\n if (files.json) consola.log(` ${chalk.dim('→')} ${files.json}`);\n if (files.markdown) consola.log(` ${chalk.dim('→')} ${files.markdown}`);\n if (files.aiSummary) consola.log(` ${chalk.dim('→')} ${files.aiSummary}`);\n if (files.split) {\n consola.log(` ${chalk.dim('→')} ${files.split.index} ${chalk.dim('(index)')}`);\n consola.log(` ${chalk.dim('→')} ${files.split.categories.length} category files`);\n }\n\n console.log('');\n consola.success(`Audit completed in ${duration}s`);\n}\n","/**\n * Routes Command - Scan app/ directory\n */\n\nimport consola from 'consola';\nimport chalk from 'chalk';\nimport { getSiteUrl } from '../../config.js';\nimport { analyzeSitemap } from '../../crawler/index.js';\nimport { scanRoutes, findAppDir, compareWithSitemap, verifyRoutes, generateRoutesSummary } from '../../routes/index.js';\nimport type { CliOptions } from '../types.js';\n\nexport async function runRoutes(options: CliOptions) {\n const siteUrl = getSiteUrl(options);\n const appDir = options['app-dir'] || findAppDir();\n\n if (!appDir) {\n consola.error('Could not find app/ directory. Use --app-dir to specify path.');\n process.exit(1);\n }\n\n console.log('');\n consola.box(`${chalk.bold('Routes Scanner')}\\n${appDir}`);\n\n // Scan routes\n consola.start('Scanning app/ directory...');\n const scanResult = scanRoutes({ appDir });\n\n consola.success(`Found ${scanResult.routes.length} routes`);\n console.log(` ├── Static: ${scanResult.staticRoutes.length}`);\n console.log(` ├── Dynamic: ${scanResult.dynamicRoutes.length}`);\n console.log(` └── API: ${scanResult.apiRoutes.length}`);\n\n // Show routes\n if (scanResult.staticRoutes.length > 0) {\n console.log('');\n consola.info('Static routes:');\n for (const route of scanResult.staticRoutes.slice(0, 20)) {\n console.log(` ${chalk.green('→')} ${route.path}`);\n }\n if (scanResult.staticRoutes.length > 20) {\n console.log(` ${chalk.dim(`... +${scanResult.staticRoutes.length - 20} more`)}`);\n }\n }\n\n if (scanResult.dynamicRoutes.length > 0) {\n console.log('');\n consola.info('Dynamic routes:');\n for (const route of scanResult.dynamicRoutes.slice(0, 10)) {\n const params = route.dynamicSegments.join(', ');\n console.log(` ${chalk.yellow('→')} ${route.path} ${chalk.dim(`[${params}]`)}`);\n }\n if (scanResult.dynamicRoutes.length > 10) {\n console.log(` ${chalk.dim(`... +${scanResult.dynamicRoutes.length - 10} more`)}`);\n }\n }\n\n // Compare with sitemap (--check flag)\n if (options.check) {\n console.log('');\n consola.start('Loading sitemap...');\n\n try {\n const sitemapUrl = new URL('/sitemap.xml', siteUrl).href;\n const sitemap = await analyzeSitemap(sitemapUrl);\n const sitemapUrls = sitemap.urls.map(u => u.loc);\n\n consola.success(`Loaded ${sitemapUrls.length} URLs from sitemap`);\n\n const comparison = compareWithSitemap(scanResult, sitemapUrls, siteUrl);\n\n console.log('');\n consola.info('Sitemap comparison:');\n console.log(` ├── Matching: ${comparison.matching.length}`);\n console.log(` ├── Missing from sitemap: ${chalk.yellow(String(comparison.missingFromSitemap.length))}`);\n console.log(` └── Extra in sitemap: ${comparison.extraInSitemap.length}`);\n\n if (comparison.missingFromSitemap.length > 0) {\n console.log('');\n consola.warn('Routes missing from sitemap:');\n for (const route of comparison.missingFromSitemap.slice(0, 10)) {\n console.log(` ${chalk.red('✗')} ${route.path}`);\n }\n if (comparison.missingFromSitemap.length > 10) {\n console.log(` ${chalk.dim(`... +${comparison.missingFromSitemap.length - 10} more`)}`);\n }\n }\n } catch (error) {\n consola.error(`Failed to load sitemap: ${(error as Error).message}`);\n }\n }\n\n // Verify routes (--verify flag)\n if (options.verify) {\n console.log('');\n consola.start('Verifying routes...');\n\n const verification = await verifyRoutes(scanResult, {\n baseUrl: siteUrl,\n timeout: parseInt(options.timeout, 10),\n concurrency: 5,\n staticOnly: true,\n });\n\n const accessible = verification.filter(r => r.isAccessible);\n const broken = verification.filter(r => !r.isAccessible);\n\n consola.success(`Verified ${verification.length} routes`);\n console.log(` ├── Accessible: ${chalk.green(String(accessible.length))}`);\n console.log(` └── Broken: ${chalk.red(String(broken.length))}`);\n\n if (broken.length > 0) {\n console.log('');\n consola.error('Broken routes:');\n for (const r of broken.slice(0, 10)) {\n console.log(` ${chalk.red('✗')} ${r.route.path} → ${r.statusCode || r.error}`);\n }\n if (broken.length > 10) {\n console.log(` ${chalk.dim(`... +${broken.length - 10} more`)}`);\n }\n }\n }\n\n // Summary\n console.log('');\n console.log(generateRoutesSummary(scanResult));\n}\n","/**\n * @djangocfg/seo - Utilities\n * Shared utility functions\n */\n\nimport { readFileSync, existsSync } from 'node:fs';\n\n/**\n * Load URLs from a file (one URL per line)\n */\nexport function loadUrlsFromFile(filePath: string): string[] {\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const content = readFileSync(filePath, 'utf-8');\n return content\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('#'));\n}\n\n/**\n * Extract URLs from sitemap XML content\n */\nexport function extractUrlsFromSitemap(xmlContent: string): string[] {\n const urls: string[] = [];\n const locRegex = /<loc>([^<]+)<\\/loc>/g;\n let match;\n\n while ((match = locRegex.exec(xmlContent)) !== null) {\n if (match[1]) {\n urls.push(match[1].trim());\n }\n }\n\n return urls;\n}\n\n/**\n * Normalize URL for comparison\n */\nexport function normalizeUrl(url: string, baseUrl?: string): string {\n try {\n const parsed = new URL(url, baseUrl);\n parsed.hash = '';\n // Remove trailing slash\n if (parsed.pathname.endsWith('/') && parsed.pathname !== '/') {\n parsed.pathname = parsed.pathname.slice(0, -1);\n }\n return parsed.href;\n } catch {\n return url;\n }\n}\n\n/**\n * Check if URL belongs to the same domain\n */\nexport function isSameDomain(url: string, baseUrl: string): boolean {\n try {\n const urlHost = new URL(url).hostname;\n const baseHost = new URL(baseUrl).hostname;\n return urlHost === baseHost;\n } catch {\n return false;\n }\n}\n\n/**\n * Format bytes to human readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${units[i]}`;\n}\n\n/**\n * Format milliseconds to human readable string\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.floor(ms / 60000)}m ${Math.round((ms % 60000) / 1000)}s`;\n}\n\n/**\n * Simple hash function for generating IDs\n */\nexport function hash(str: string): string {\n let h = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n h = (h << 5) - h + char;\n h = h & h;\n }\n return Math.abs(h).toString(36);\n}\n\n/**\n * Chunk array into smaller arrays\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: {\n retries?: number;\n minTimeout?: number;\n maxTimeout?: number;\n factor?: number;\n } = {}\n): Promise<T> {\n const { retries = 3, minTimeout = 1000, maxTimeout = 30000, factor = 2 } = options;\n\n let lastError: Error | undefined;\n let timeout = minTimeout;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < retries) {\n await sleep(timeout);\n timeout = Math.min(timeout * factor, maxTimeout);\n }\n }\n }\n\n throw lastError;\n}\n","/**\n * Inspect Command - GSC URL inspection\n */\n\nimport consola from 'consola';\nimport { getSiteUrl } from '../../config.js';\nimport { GoogleConsoleClient, analyzeInspectionResults } from '../../google-console/index.js';\nimport { generateAndSaveReports } from '../../reports/index.js';\nimport { loadUrlsFromFile } from '../../utils/index.js';\nimport { parseFormats, type CliOptions } from '../types.js';\n\nexport async function runInspect(options: CliOptions) {\n const siteUrl = getSiteUrl(options);\n\n consola.start('Starting URL inspection via Google Search Console');\n\n const client = new GoogleConsoleClient({\n siteUrl,\n serviceAccountPath: options['service-account'],\n });\n\n const isAuth = await client.verify();\n if (!isAuth) {\n consola.error('Failed to authenticate with Google Search Console');\n process.exit(1);\n }\n\n let urls: string[];\n\n if (options.urls) {\n urls = loadUrlsFromFile(options.urls);\n consola.info(`Loaded ${urls.length} URLs from ${options.urls}`);\n } else {\n consola.info('Fetching URLs from search analytics...');\n const today = new Date();\n const startDate = new Date(today.getTime() - 30 * 24 * 60 * 60 * 1000);\n\n const rows = await client.getSearchAnalytics({\n startDate: startDate.toISOString().split('T')[0] as string,\n endDate: today.toISOString().split('T')[0] as string,\n dimensions: ['page'],\n rowLimit: 100,\n });\n\n urls = rows.map((row) => row.keys?.[0] || '').filter(Boolean);\n consola.info(`Found ${urls.length} URLs from search analytics`);\n }\n\n const results = await client.inspectUrls(urls);\n const issues = analyzeInspectionResults(results);\n\n consola.info(`Found ${issues.length} issues`);\n\n const formats = parseFormats(options.format);\n await generateAndSaveReports(siteUrl, { issues, urlInspections: results }, {\n outputDir: options.output,\n formats,\n includeRawData: true,\n });\n}\n","/**\n * Crawl Command - Site crawler\n */\n\nimport consola from 'consola';\nimport { getSiteUrl } from '../../config.js';\nimport { SiteCrawler, analyzeCrawlResults } from '../../crawler/index.js';\nimport { generateAndSaveReports } from '../../reports/index.js';\nimport { parseFormats, type CliOptions } from '../types.js';\n\nexport async function runCrawl(options: CliOptions) {\n const siteUrl = getSiteUrl(options);\n\n consola.start(`Starting crawl of ${siteUrl}`);\n\n const crawler = new SiteCrawler(siteUrl, {\n maxPages: parseInt(options['max-pages'], 10),\n maxDepth: parseInt(options['max-depth'], 10),\n });\n\n const crawlResults = await crawler.crawl();\n const issues = analyzeCrawlResults(crawlResults);\n\n consola.info(`Found ${issues.length} issues from ${crawlResults.length} pages`);\n\n const formats = parseFormats(options.format);\n await generateAndSaveReports(siteUrl, { issues, crawlResults }, {\n outputDir: options.output,\n formats,\n includeRawData: true,\n });\n}\n","/**\n * Links Command - Broken link checker\n */\n\nimport consola from 'consola';\nimport { getSiteUrl } from '../../config.js';\nimport { checkLinks, linkResultsToSeoIssues } from '../../link-checker/index.js';\nimport { generateAndSaveReports } from '../../reports/index.js';\nimport { parseFormats, type CliOptions } from '../types.js';\n\nexport async function runLinks(options: CliOptions) {\n const siteUrl = getSiteUrl(options);\n\n consola.start(`Checking links on ${siteUrl}`);\n\n const result = await checkLinks({\n url: siteUrl,\n timeout: parseInt(options.timeout, 10),\n concurrency: parseInt(options.concurrency, 10),\n verbose: true,\n });\n\n if (result.success) {\n consola.success(`All ${result.total} links are valid!`);\n } else {\n consola.error(`Found ${result.broken} broken links out of ${result.total}`);\n\n // Generate report if output specified\n if (options.output !== './seo-reports' || result.broken > 0) {\n const issues = linkResultsToSeoIssues(result);\n const formats = parseFormats(options.format);\n await generateAndSaveReports(siteUrl, { issues }, {\n outputDir: options.output,\n formats,\n includeRawData: false,\n });\n }\n }\n\n process.exit(result.success ? 0 : 1);\n}\n","/**\n * Robots Command - robots.txt analyzer\n */\n\nimport consola from 'consola';\nimport { getSiteUrl } from '../../config.js';\nimport { analyzeRobotsTxt } from '../../crawler/index.js';\nimport type { CliOptions } from '../types.js';\n\nexport async function runRobots(options: CliOptions) {\n const siteUrl = getSiteUrl(options);\n\n consola.start(`Analyzing robots.txt for ${siteUrl}`);\n\n const analysis = await analyzeRobotsTxt(siteUrl);\n\n if (analysis.exists) {\n consola.success('robots.txt found');\n consola.info(`Sitemaps: ${analysis.sitemaps.length}`);\n consola.info(`Disallow rules: ${analysis.disallowedPaths.length}`);\n consola.info(`Allow rules: ${analysis.allowedPaths.length}`);\n\n if (analysis.crawlDelay) {\n consola.info(`Crawl-delay: ${analysis.crawlDelay}`);\n }\n\n if (analysis.issues.length > 0) {\n consola.warn(`Issues found: ${analysis.issues.length}`);\n for (const issue of analysis.issues) {\n consola.log(` - [${issue.severity}] ${issue.title}`);\n }\n }\n } else {\n consola.warn('robots.txt not found');\n }\n}\n","/**\n * Sitemap Command - Sitemap validator\n */\n\nimport consola from 'consola';\nimport { getSiteUrl } from '../../config.js';\nimport { analyzeAllSitemaps } from '../../crawler/index.js';\nimport type { CliOptions } from '../types.js';\n\nexport async function runSitemap(options: CliOptions) {\n let sitemapUrl = getSiteUrl(options);\n\n if (!sitemapUrl.endsWith('.xml')) {\n sitemapUrl = new URL('/sitemap.xml', sitemapUrl).href;\n }\n\n consola.start(`Validating sitemap: ${sitemapUrl}`);\n\n const analyses = await analyzeAllSitemaps(sitemapUrl);\n\n let totalUrls = 0;\n let totalIssues = 0;\n\n for (const analysis of analyses) {\n if (analysis.exists) {\n consola.success(`${analysis.url}`);\n consola.info(` Type: ${analysis.type}`);\n\n if (analysis.type === 'sitemap') {\n consola.info(` URLs: ${analysis.urls.length}`);\n totalUrls += analysis.urls.length;\n } else {\n consola.info(` Child sitemaps: ${analysis.childSitemaps.length}`);\n }\n\n if (analysis.issues.length > 0) {\n totalIssues += analysis.issues.length;\n for (const issue of analysis.issues) {\n consola.warn(` [${issue.severity}] ${issue.title}`);\n }\n }\n } else {\n consola.error(`${analysis.url} - Not found`);\n }\n }\n\n consola.box(`Total URLs: ${totalUrls}\\nTotal Issues: ${totalIssues}`);\n}\n","/**\n * Content scanner for MDX/Nextra projects\n * Scans content/ and app/ directories for files\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport type { ContentConfig, FileInfo, ContentScanResult, DEFAULT_CONFIG } from './types.js';\n\n/**\n * Detect project type based on directory structure\n */\nexport function detectProjectType(cwd: string): 'nextra' | 'nextjs' | 'unknown' {\n const contentDir = path.join(cwd, 'content');\n const appDir = path.join(cwd, 'app');\n\n if (fs.existsSync(contentDir)) {\n // Check for _meta.ts files (Nextra indicator)\n if (hasMetaFiles(contentDir)) {\n return 'nextra';\n }\n }\n\n if (fs.existsSync(appDir)) {\n return 'nextjs';\n }\n\n return 'unknown';\n}\n\n/**\n * Check if directory contains _meta.ts files (Nextra pattern)\n */\nexport function hasMetaFiles(dir: string): boolean {\n if (!fs.existsSync(dir)) return false;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name === '_meta.ts' || entry.name === '_meta.tsx') {\n return true;\n }\n if (entry.isDirectory() && !entry.name.startsWith('.')) {\n const subDir = path.join(dir, entry.name);\n if (hasMetaFiles(subDir)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Scan project and return content information\n */\nexport function scanProject(cwd: string, config?: Partial<ContentConfig>): ContentScanResult {\n const contentDir = path.join(cwd, config?.contentDir || 'content');\n const appDir = path.join(cwd, config?.appDir || 'app');\n const extensions = config?.extensions || ['.mdx', '.md'];\n\n const hasContent = fs.existsSync(contentDir);\n const hasApp = fs.existsSync(appDir);\n const projectType = detectProjectType(cwd);\n\n const mdxFiles = hasContent ? getAllFiles(contentDir, extensions) : [];\n const pageFiles = hasApp ? getPageFiles(appDir) : [];\n\n return {\n projectType,\n hasContent,\n hasApp,\n mdxFiles,\n pageFiles,\n };\n}\n\n/**\n * Get all files with given extensions recursively\n */\nexport function getAllFiles(dir: string, extensions: string[], files: string[] = []): string[] {\n if (!fs.existsSync(dir)) return files;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n getAllFiles(fullPath, extensions, files);\n }\n } else {\n const ext = path.extname(entry.name).toLowerCase();\n if (extensions.includes(ext)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\n/**\n * Get all MDX files in content directory\n */\nexport function getAllMdxFiles(contentDir: string): string[] {\n return getAllFiles(contentDir, ['.mdx', '.md']);\n}\n\n/**\n * Get all page.tsx files in app directory\n */\nexport function getPageFiles(appDir: string): string[] {\n const pages: string[] = [];\n\n function scan(dir: string) {\n if (!fs.existsSync(dir)) return;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n // Skip special directories\n if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue;\n\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Skip route groups for page detection but still scan them\n scan(fullPath);\n } else if (entry.name === 'page.tsx' || entry.name === 'page.ts') {\n pages.push(fullPath);\n }\n }\n }\n\n scan(appDir);\n return pages;\n}\n\n/**\n * Get file info for link resolution\n */\nexport function getFileInfo(filePath: string, contentDir: string): FileInfo {\n const relativePath = path.relative(contentDir, filePath);\n const parsed = path.parse(relativePath);\n const isIndex = parsed.name === 'index';\n const folder = parsed.dir || '';\n\n return {\n fullPath: filePath,\n relativePath,\n isIndex,\n folder,\n name: parsed.name,\n };\n}\n\n/**\n * Check if a path exists as MDX file or directory with index\n */\nexport function pathExists(docsPath: string, contentDir: string): boolean {\n const cleanPath = docsPath.replace(/\\/$/, '').replace(/^\\//, '');\n\n const candidates = [\n path.join(contentDir, cleanPath + '.mdx'),\n path.join(contentDir, cleanPath + '.md'),\n path.join(contentDir, cleanPath, 'index.mdx'),\n path.join(contentDir, cleanPath, 'index.md'),\n ];\n\n return candidates.some(p => fs.existsSync(p));\n}\n\n/**\n * Find content directory, looking in common locations\n */\nexport function findContentDir(cwd: string): string | null {\n const candidates = [\n path.join(cwd, 'content'),\n path.join(cwd, 'docs'),\n path.join(cwd, 'pages', 'docs'),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\n/**\n * Find app directory\n */\nexport function findAppDir(cwd: string): string | null {\n const appDir = path.join(cwd, 'app');\n return fs.existsSync(appDir) ? appDir : null;\n}\n","/**\n * Link checker for MDX documentation\n * Checks all internal links in content/ folder and verifies pages exist\n * Properly handles Nextra's routing behavior for relative links\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport type {\n ContentConfig,\n ExtractedLink,\n BrokenLink,\n LinkCheckResult,\n LinkType,\n DEFAULT_CONFIG,\n} from './types.js';\nimport { getAllMdxFiles, getFileInfo, pathExists } from './scanner.js';\n\n// Link patterns for MDX files (handles optional #anchor)\nconst LINK_PATTERNS: { regex: RegExp; type: LinkType }[] = [\n // Absolute links: [text](/docs/path)\n { regex: /\\]\\(\\/docs\\/([^)#\\s\"]+)/g, type: 'absolute' },\n { regex: /href=\"\\/docs\\/([^\"#]+)\"/g, type: 'absolute' },\n { regex: /to=\"\\/docs\\/([^\"#]+)\"/g, type: 'absolute' },\n // Dot-slash relative: [text](./path)\n { regex: /\\]\\(\\.\\/([^)#\\s\"]+)(?:#[^)]*)?\\)/g, type: 'dotslash' },\n { regex: /href=\"\\.\\/([^\"#]+)\"/g, type: 'dotslash' },\n // Parent relative: [text](../path)\n { regex: /\\]\\(\\.\\.\\/([^)#\\s\"]+)(?:#[^)]*)?\\)/g, type: 'parent' },\n { regex: /href=\"\\.\\.\\/([^\"#]+)\"/g, type: 'parent' },\n // Simple relative (no prefix): [text](path)\n { regex: /\\]\\((?!\\/|http|#|\\.|\\[)([a-zA-Z][^)#\\s\"]*)(?:#[^)]*)?\\)/g, type: 'simple' },\n { regex: /href=\"(?!\\/|http|#|\\.)([a-zA-Z][^\"#]*)\"/g, type: 'simple' },\n];\n\n/**\n * Check if link points to an asset file\n */\nfunction isAssetLink(linkPath: string, assetExtensions: string[]): boolean {\n return assetExtensions.some(ext => linkPath.toLowerCase().endsWith(ext));\n}\n\n/**\n * Resolve a link to an absolute docs path\n * Mimics how Nextra/browser resolves links\n */\nfunction resolveLink(\n fromFilePath: string,\n linkPath: string,\n linkType: LinkType,\n contentDir: string\n): string {\n if (linkType === 'absolute') {\n return linkPath;\n }\n\n const { isIndex, folder: sourceFolder, name: fileName } = getFileInfo(fromFilePath, contentDir);\n const sourceParts = sourceFolder ? sourceFolder.split('/') : [];\n\n if (linkType === 'dotslash' || linkType === 'simple') {\n // ./ or simple relative\n if (isIndex) {\n // index.mdx at /foo/ -> ./bar resolves to /foo/bar\n return sourceFolder ? `${sourceFolder}/${linkPath}` : linkPath;\n } else {\n // page.mdx at /foo/page -> ./bar resolves to /foo/page/bar (browser behavior!)\n return sourceFolder ? `${sourceFolder}/${fileName}/${linkPath}` : `${fileName}/${linkPath}`;\n }\n }\n\n if (linkType === 'parent') {\n // ../bar\n if (isIndex) {\n // index.mdx at /foo/ -> ../bar resolves to /bar (go up from foo)\n const newParts = [...sourceParts];\n newParts.pop();\n return newParts.length ? `${newParts.join('/')}/${linkPath}` : linkPath;\n } else {\n // page.mdx at /foo/page -> ../bar resolves to /foo/bar\n return sourceParts.length ? `${sourceParts.join('/')}/${linkPath}` : linkPath;\n }\n }\n\n return linkPath;\n}\n\n/**\n * Extract all links from a file\n */\nfunction extractLinks(\n filePath: string,\n contentDir: string,\n assetExtensions: string[]\n): ExtractedLink[] {\n const content = fs.readFileSync(filePath, 'utf-8');\n const links: ExtractedLink[] = [];\n\n for (const { regex, type } of LINK_PATTERNS) {\n regex.lastIndex = 0;\n let match;\n while ((match = regex.exec(content)) !== null) {\n const rawLink = match[1];\n if (!rawLink) continue;\n\n // Skip asset links\n if (isAssetLink(rawLink, assetExtensions)) continue;\n\n const resolved = resolveLink(filePath, rawLink, type, contentDir);\n links.push({\n raw: rawLink,\n resolved,\n type,\n line: content.substring(0, match.index).split('\\n').length,\n });\n }\n }\n\n return links;\n}\n\n/**\n * Check all links in content directory\n */\nexport function checkContentLinks(\n contentDir: string,\n config?: Partial<ContentConfig>\n): LinkCheckResult {\n const assetExtensions = config?.assetExtensions || [\n '.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico', '.pdf', '.zip', '.tar', '.gz'\n ];\n const basePath = config?.basePath || '/docs';\n\n const files = getAllMdxFiles(contentDir);\n const brokenLinks: BrokenLink[] = [];\n const checkedLinks = new Map<string, boolean>();\n\n for (const file of files) {\n const links = extractLinks(file, contentDir, assetExtensions);\n const relativePath = path.relative(contentDir, file);\n\n for (const link of links) {\n // Check if we've already verified this path\n if (!checkedLinks.has(link.resolved)) {\n checkedLinks.set(link.resolved, pathExists(link.resolved, contentDir));\n }\n\n if (!checkedLinks.get(link.resolved)) {\n brokenLinks.push({\n file: relativePath,\n link: `${basePath}/${link.resolved}`,\n type: link.type,\n raw: link.raw,\n line: link.line,\n });\n }\n }\n }\n\n return {\n filesChecked: files.length,\n uniqueLinks: checkedLinks.size,\n brokenLinks,\n success: brokenLinks.length === 0,\n };\n}\n\n/**\n * Group broken links by file for display\n */\nexport function groupBrokenLinksByFile(\n brokenLinks: BrokenLink[]\n): Map<string, BrokenLink[]> {\n const byFile = new Map<string, BrokenLink[]>();\n\n for (const link of brokenLinks) {\n const existing = byFile.get(link.file) || [];\n existing.push(link);\n byFile.set(link.file, existing);\n }\n\n return byFile;\n}\n","/**\n * Link fixer for MDX documentation\n * Converts absolute /docs/ links to relative when appropriate\n *\n * Nextra routing rules:\n * - index.mdx at /foo/ -> ./bar resolves to /foo/bar ✓\n * - page.mdx at /foo/page -> ./bar resolves to /foo/page/bar ✗ (browser behavior)\n *\n * So for non-index files linking to siblings, we need ../sibling\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport type { ContentConfig, LinkFix, LinkFixResult, FixLinksResult } from './types.js';\nimport { getAllMdxFiles, getFileInfo, pathExists } from './scanner.js';\n\n/**\n * Check if link points to an asset file\n */\nfunction isAssetLink(linkPath: string, assetExtensions: string[]): boolean {\n return assetExtensions.some(ext => linkPath.toLowerCase().endsWith(ext));\n}\n\n/**\n * Calculate relative path from source to target, respecting Nextra routing\n * Returns null if can't be relative (target is outside source's scope)\n */\nfunction calculateRelativePath(\n sourceFile: string,\n targetDocsPath: string,\n contentDir: string\n): string | null {\n const { isIndex, folder: sourceFolder } = getFileInfo(sourceFile, contentDir);\n const targetPath = targetDocsPath.replace(/^\\//, '');\n\n // Split paths into parts\n const sourceParts = sourceFolder ? sourceFolder.split('/') : [];\n const targetParts = targetPath.split('/');\n\n // Find common prefix\n let commonLength = 0;\n for (let i = 0; i < Math.min(sourceParts.length, targetParts.length); i++) {\n if (sourceParts[i] === targetParts[i]) {\n commonLength++;\n } else {\n break;\n }\n }\n\n // For index files: can use ./ for same folder or subfolders\n // For non-index files: need to go up first with ../\n\n if (isIndex) {\n // index.mdx at /foo/ can use ./bar for /foo/bar\n if (targetPath.startsWith(sourceFolder + '/') || sourceFolder === '') {\n const relative = sourceFolder ? targetPath.slice(sourceFolder.length + 1) : targetPath;\n return './' + relative;\n }\n // Target is outside - need ../\n const upsNeeded = sourceParts.length - commonLength;\n const downs = targetParts.slice(commonLength);\n if (upsNeeded <= 1) {\n return '../'.repeat(upsNeeded) + downs.join('/');\n }\n return null; // Too far up, keep absolute\n } else {\n // Non-index file at /foo/page needs ../bar for /foo/bar (sibling)\n // and ./bar would go to /foo/page/bar which is wrong\n\n if (targetPath.startsWith(sourceFolder + '/') || sourceFolder === '') {\n // Same folder - target is sibling\n const relative = sourceFolder ? targetPath.slice(sourceFolder.length + 1) : targetPath;\n if (!relative.includes('/')) {\n // Sibling file\n return '../' + relative;\n }\n // Subfolder of same folder\n return '../' + relative;\n }\n\n // Different folder\n const upsNeeded = sourceParts.length - commonLength + 1; // +1 because non-index\n const downs = targetParts.slice(commonLength);\n if (upsNeeded <= 2) {\n return '../'.repeat(upsNeeded) + downs.join('/');\n }\n return null; // Too far, keep absolute\n }\n}\n\n/**\n * Process a single file and find fixable links\n */\nfunction processFile(\n filePath: string,\n contentDir: string,\n assetExtensions: string[]\n): LinkFix[] {\n const content = fs.readFileSync(filePath, 'utf-8');\n const fixes: LinkFix[] = [];\n\n const patterns = [\n { regex: /(\\]\\()\\/docs\\/([^)#\\s\"]+)(\\))/g },\n { regex: /(href=\")\\/docs\\/([^\"#]+)(\")/g },\n ];\n\n for (const { regex } of patterns) {\n regex.lastIndex = 0;\n let match;\n\n while ((match = regex.exec(content)) !== null) {\n const targetPath = match[2];\n if (!targetPath) continue;\n\n // Skip assets\n if (isAssetLink(targetPath, assetExtensions)) continue;\n\n // Skip if target doesn't exist\n if (!pathExists(targetPath, contentDir)) continue;\n\n const relativePath = calculateRelativePath(filePath, targetPath, contentDir);\n\n if (relativePath) {\n fixes.push({\n from: `/docs/${targetPath}`,\n to: relativePath,\n line: content.substring(0, match.index).split('\\n').length,\n });\n }\n }\n }\n\n return fixes;\n}\n\n/**\n * Apply fixes to a file\n */\nfunction applyFixes(filePath: string, fixes: LinkFix[]): void {\n let content = fs.readFileSync(filePath, 'utf-8');\n\n for (const { from, to } of fixes) {\n content = content.split(from).join(to);\n }\n\n fs.writeFileSync(filePath, content, 'utf-8');\n}\n\n/**\n * Fix absolute links to relative in content directory\n */\nexport function fixContentLinks(\n contentDir: string,\n options: { apply?: boolean; config?: Partial<ContentConfig> } = {}\n): FixLinksResult {\n const { apply = false, config } = options;\n const assetExtensions = config?.assetExtensions || [\n '.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico', '.pdf'\n ];\n\n const files = getAllMdxFiles(contentDir);\n let totalChanges = 0;\n const fileChanges: LinkFixResult[] = [];\n\n for (const file of files) {\n const fixes = processFile(file, contentDir, assetExtensions);\n\n if (fixes.length > 0) {\n const relativePath = path.relative(contentDir, file);\n fileChanges.push({\n file: relativePath,\n fullPath: file,\n fixes,\n });\n totalChanges += fixes.length;\n\n if (apply) {\n applyFixes(file, fixes);\n }\n }\n }\n\n return {\n totalChanges,\n fileChanges,\n applied: apply,\n };\n}\n","/**\n * Universal Sitemap Generator for Next.js App Router projects\n * Supports both Nextra (MDX content) and standard Next.js projects\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport type { SitemapItem, SitemapData, ContentConfig } from './types.js';\nimport { scanRoutes, type RouteInfo } from '../routes/scanner.js';\nimport { detectProjectType } from './scanner.js';\n\n/**\n * Dynamically import _meta.ts file (Nextra pattern)\n */\nasync function getMeta(dir: string): Promise<Record<string, unknown>> {\n const metaPath = path.join(dir, '_meta.ts');\n if (!fs.existsSync(metaPath)) return {};\n\n try {\n const meta = await import(metaPath);\n return meta.default || {};\n } catch {\n // Fallback: try to parse with regex for simple cases\n try {\n const content = fs.readFileSync(metaPath, 'utf-8');\n const matches = content.matchAll(/'([^']+)':\\s*['\"]([^'\"]+)['\"]/g);\n const result: Record<string, string> = {};\n for (const match of matches) {\n const key = match[1];\n const value = match[2];\n if (key && value) {\n result[key] = value;\n }\n }\n return result;\n } catch {\n return {};\n }\n }\n}\n\n/**\n * Get title from meta object\n */\nfunction getTitleFromMeta(key: string, meta: Record<string, unknown>): string {\n const value = meta[key];\n if (!value) return key;\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && 'title' in value) {\n return String((value as { title: unknown }).title);\n }\n return key;\n}\n\n/**\n * Scan Nextra content directory recursively\n */\nasync function scanContent(\n dir: string,\n baseUrl: string = '/docs'\n): Promise<SitemapItem[]> {\n const items: SitemapItem[] = [];\n\n if (!fs.existsSync(dir)) return items;\n\n const meta = await getMeta(dir);\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n // Build file map\n const fileMap = new Map<string, fs.Dirent>();\n for (const entry of entries) {\n const key = entry.name.replace(/\\.mdx?$/, '');\n fileMap.set(key, entry);\n }\n\n // Process meta keys first to preserve order\n const metaKeys = Object.keys(meta);\n for (const key of metaKeys) {\n const entry = fileMap.get(key);\n if (!entry) continue;\n\n fileMap.delete(key);\n const fullPath = path.join(dir, entry.name);\n const itemPath = path.join(baseUrl, key).replace(/\\\\/g, '/');\n\n if (entry.isDirectory()) {\n const children = await scanContent(fullPath, itemPath);\n items.push({\n title: getTitleFromMeta(key, meta),\n path: itemPath,\n children: children.length > 0 ? children : undefined,\n });\n } else if (entry.isFile() && (entry.name.endsWith('.md') || entry.name.endsWith('.mdx'))) {\n if (entry.name !== 'index.mdx' && entry.name !== 'index.md') {\n items.push({\n title: getTitleFromMeta(key, meta),\n path: itemPath,\n });\n }\n }\n }\n\n // Process remaining entries not in meta\n for (const [key, entry] of fileMap.entries()) {\n if (key.startsWith('_') || key.startsWith('.')) continue;\n\n const fullPath = path.join(dir, entry.name);\n const itemPath = path.join(baseUrl, key).replace(/\\\\/g, '/');\n\n if (entry.isDirectory()) {\n const children = await scanContent(fullPath, itemPath);\n items.push({\n title: key,\n path: itemPath,\n children: children.length > 0 ? children : undefined,\n });\n } else if (entry.isFile() && (entry.name.endsWith('.md') || entry.name.endsWith('.mdx'))) {\n if (entry.name !== 'index.mdx' && entry.name !== 'index.md') {\n items.push({\n title: key,\n path: itemPath,\n });\n }\n }\n }\n\n return items;\n}\n\n/**\n * Convert route path to title\n */\nfunction routeToTitle(routePath: string): string {\n const segment = routePath.split('/').filter(Boolean).pop() || 'Home';\n // Skip dynamic segments\n if (segment.startsWith('[')) return segment;\n // Capitalize and replace hyphens\n return segment\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Convert routes to sitemap items (tree structure)\n * Uses existing routes/scanner.ts for universal Next.js support\n */\nfunction routesToSitemapItems(routes: RouteInfo[]): SitemapItem[] {\n // Build tree from flat routes\n const root: Map<string, SitemapItem> = new Map();\n const items: SitemapItem[] = [];\n\n // Sort routes by path depth\n const sortedRoutes = [...routes]\n .filter(r => r.type === 'page' && !r.isDynamic) // Only static pages\n .sort((a, b) => a.path.split('/').length - b.path.split('/').length);\n\n for (const route of sortedRoutes) {\n const segments = route.path.split('/').filter(Boolean);\n\n if (segments.length === 0) {\n // Root path\n items.push({\n title: 'Home',\n path: '/',\n });\n continue;\n }\n\n // Find or create parent\n let currentPath = '';\n let parentChildren: SitemapItem[] = items;\n\n for (let i = 0; i < segments.length - 1; i++) {\n currentPath += '/' + segments[i];\n let parent = root.get(currentPath);\n\n if (!parent) {\n parent = {\n title: routeToTitle(currentPath),\n path: currentPath,\n children: [],\n };\n root.set(currentPath, parent);\n parentChildren.push(parent);\n }\n\n parentChildren = parent.children || (parent.children = []);\n }\n\n // Add current item\n const item: SitemapItem = {\n title: routeToTitle(route.path),\n path: route.path,\n };\n parentChildren.push(item);\n }\n\n return items;\n}\n\n/**\n * Generate sitemap data from project\n * Auto-detects project type (Nextra vs standard Next.js)\n */\nexport async function generateSitemapData(\n cwd: string,\n config?: Partial<ContentConfig>\n): Promise<SitemapData> {\n const projectType = detectProjectType(cwd);\n const contentDir = path.join(cwd, config?.contentDir || 'content');\n const appDir = path.join(cwd, config?.appDir || 'app');\n const basePath = config?.basePath || '/docs';\n\n let docsItems: SitemapItem[] = [];\n let appItems: SitemapItem[] = [];\n\n // Scan content/ for Nextra projects\n if (projectType === 'nextra' && fs.existsSync(contentDir)) {\n docsItems = await scanContent(contentDir, basePath);\n }\n\n // Scan app/ using routes scanner (universal)\n if (fs.existsSync(appDir)) {\n try {\n const scanResult = scanRoutes({ appDir, includeApi: false });\n appItems = routesToSitemapItems(scanResult.routes);\n } catch {\n // Fallback to simple scan if routes scanner fails\n appItems = [];\n }\n }\n\n return {\n app: appItems,\n docs: docsItems,\n };\n}\n\n/**\n * Generate TypeScript file content\n */\nfunction generateTsContent(data: SitemapData): string {\n return `\n// This file is auto-generated by @djangocfg/seo\n// Do not edit manually\n\nexport interface SitemapItem {\n title: string;\n path: string;\n children?: SitemapItem[];\n}\n\nexport const sitemap: { app: SitemapItem[], docs: SitemapItem[] } = ${JSON.stringify(data, null, 2)};\n`;\n}\n\n/**\n * Generate and save sitemap file\n */\nexport async function generateSitemap(\n cwd: string,\n options: {\n output?: string;\n config?: Partial<ContentConfig>;\n } = {}\n): Promise<{ outputPath: string; data: SitemapData }> {\n const output = options.output || 'app/_core/sitemap.ts';\n const outputPath = path.join(cwd, output);\n\n // Generate data\n const data = await generateSitemapData(cwd, options.config);\n\n // Ensure output directory exists\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Write file\n const content = generateTsContent(data);\n fs.writeFileSync(outputPath, content);\n\n return { outputPath, data };\n}\n\n/**\n * Flatten sitemap items to list of paths\n */\nexport function flattenSitemap(items: SitemapItem[]): string[] {\n const paths: string[] = [];\n\n function traverse(item: SitemapItem) {\n paths.push(item.path);\n if (item.children) {\n for (const child of item.children) {\n traverse(child);\n }\n }\n }\n\n for (const item of items) {\n traverse(item);\n }\n\n return paths;\n}\n\n/**\n * Count total items in sitemap\n */\nexport function countSitemapItems(data: SitemapData): { app: number; docs: number; total: number } {\n const appPaths = flattenSitemap(data.app);\n const docsPaths = flattenSitemap(data.docs);\n\n return {\n app: appPaths.length,\n docs: docsPaths.length,\n total: appPaths.length + docsPaths.length,\n };\n}\n","/**\n * Content Command - MDX/Nextra content tools\n * Subcommands: check, fix, sitemap\n */\n\nimport consola from 'consola';\nimport chalk from 'chalk';\nimport path from 'path';\nimport {\n checkContentLinks,\n groupBrokenLinksByFile,\n fixContentLinks,\n generateSitemap,\n countSitemapItems,\n detectProjectType,\n findContentDir,\n} from '../../content/index.js';\nimport type { CliOptions } from '../types.js';\n\nconst CONTENT_HELP = `\n${chalk.bold('Content Commands')} - MDX/Nextra content tools\n\n${chalk.bold('Usage:')}\n djangocfg-seo content <subcommand> [options]\n\n${chalk.bold('Subcommands:')}\n check Check links in content/ directory\n fix Fix absolute links to relative\n sitemap Generate sitemap.ts from content/\n\n${chalk.bold('Options:')}\n --content-dir <path> Content directory (default: content/)\n --output <path> Output file for sitemap (default: app/_core/sitemap.ts)\n --fix Apply fixes (for 'fix' subcommand)\n --base-path <path> Base URL path (default: /docs)\n\n${chalk.bold('Examples:')}\n djangocfg-seo content check\n djangocfg-seo content fix --fix\n djangocfg-seo content sitemap --output app/_core/sitemap.ts\n`;\n\nexport async function runContent(options: CliOptions) {\n const subcommand = options._[1]; // content <subcommand>\n\n if (!subcommand || subcommand === 'help') {\n console.log(CONTENT_HELP);\n return;\n }\n\n const cwd = process.cwd();\n const contentDir = options['content-dir']\n ? path.resolve(cwd, options['content-dir'])\n : findContentDir(cwd);\n\n if (!contentDir && subcommand !== 'sitemap') {\n consola.error('Could not find content/ directory. Use --content-dir to specify path.');\n process.exit(1);\n }\n\n // Detect project type\n const projectType = detectProjectType(cwd);\n console.log('');\n consola.box(`${chalk.bold('Content Tools')}\\nProject: ${projectType}\\nPath: ${contentDir || cwd}`);\n\n switch (subcommand) {\n case 'check':\n await runCheck(contentDir!, options);\n break;\n case 'fix':\n await runFix(contentDir!, options);\n break;\n case 'sitemap':\n await runSitemapGenerate(cwd, options);\n break;\n default:\n consola.error(`Unknown subcommand: ${subcommand}`);\n console.log(CONTENT_HELP);\n process.exit(1);\n }\n}\n\n/**\n * Check links in content directory\n */\nasync function runCheck(contentDir: string, options: CliOptions) {\n consola.start('Checking links in content/ folder...');\n\n const basePath = options['base-path'] || '/docs';\n const result = checkContentLinks(contentDir, { basePath });\n\n if (result.success) {\n console.log('');\n consola.success('All links are valid!');\n console.log(` Checked ${result.filesChecked} files, ${result.uniqueLinks} unique links.`);\n return;\n }\n\n console.log('');\n consola.error(`Found ${result.brokenLinks.length} broken links:`);\n console.log('');\n\n const byFile = groupBrokenLinksByFile(result.brokenLinks);\n\n for (const [file, links] of byFile) {\n console.log(`${chalk.cyan('📄')} ${file}`);\n for (const link of links) {\n console.log(` L${link.line}: ${chalk.red('✗')} ${link.link} ${chalk.dim(`(${link.type}: \"${link.raw}\")`)}`);\n }\n console.log('');\n }\n\n console.log(`${chalk.bold('Summary:')} ${result.brokenLinks.length} broken links in ${byFile.size} files`);\n console.log(` Checked ${result.filesChecked} files, ${result.uniqueLinks} unique links.`);\n\n process.exit(1);\n}\n\n/**\n * Fix absolute links to relative\n */\nasync function runFix(contentDir: string, options: CliOptions) {\n const applyFixes = options.fix === true;\n\n consola.start(applyFixes ? 'Fixing links...' : 'Checking for absolute links that can be relative...');\n\n const result = fixContentLinks(contentDir, { apply: applyFixes });\n\n if (result.totalChanges === 0) {\n console.log('');\n consola.success('No absolute links that can be converted to relative.');\n return;\n }\n\n console.log('');\n console.log(`Found ${result.totalChanges} links that can be relative:`);\n console.log('');\n\n for (const { file, fixes } of result.fileChanges) {\n console.log(`${chalk.cyan('📄')} ${file}`);\n for (const { from, to, line } of fixes) {\n console.log(` L${line}: ${from} ${chalk.yellow('→')} ${to}`);\n }\n console.log('');\n }\n\n if (applyFixes) {\n consola.success(`Fixed ${result.totalChanges} links in ${result.fileChanges.length} files.`);\n } else {\n console.log(`${chalk.yellow('💡')} Run with --fix to apply changes:`);\n console.log(` djangocfg-seo content fix --fix`);\n }\n}\n\n/**\n * Generate sitemap.ts\n */\nasync function runSitemapGenerate(cwd: string, options: CliOptions) {\n consola.start('Generating sitemap...');\n\n // Use specific sitemap output, not the report output directory\n // Check if output ends with .ts (sitemap file) or use default\n const rawOutput = options.output;\n const output = rawOutput?.endsWith('.ts') ? rawOutput : 'app/_core/sitemap.ts';\n const contentDir = options['content-dir'] || 'content';\n const basePath = options['base-path'] || '/docs';\n\n const { outputPath, data } = await generateSitemap(cwd, {\n output,\n config: { contentDir, basePath },\n });\n\n const counts = countSitemapItems(data);\n\n console.log('');\n consola.success(`Sitemap generated at ${outputPath}`);\n console.log(` ├── App pages: ${counts.app}`);\n console.log(` ├── Doc pages: ${counts.docs}`);\n console.log(` └── Total: ${counts.total}`);\n}\n","#!/usr/bin/env node\n\n/**\n * @djangocfg/seo - CLI Tool\n */\n\nimport { parseArgs } from 'node:util';\nimport consola from 'consola';\nimport chalk from 'chalk';\nimport { loadEnvFiles } from '../config.js';\nimport { runAudit, runRoutes, runInspect, runCrawl, runLinks, runRobots, runSitemap, runContent } from './commands/index.js';\nimport type { CliOptions } from './types.js';\n\nloadEnvFiles();\n\nconst VERSION = '1.0.0';\n\nconst HELP = `\n${chalk.bold('@djangocfg/seo')} - SEO Analysis Tool v${VERSION}\n\n${chalk.bold('Usage:')}\n djangocfg-seo <command> [options]\n\n${chalk.bold('Commands:')}\n audit Full SEO audit (robots + sitemap + crawl + links)\n routes Scan app/ directory and compare with sitemap\n content MDX content tools (check, fix, sitemap)\n crawl Crawl site and analyze SEO issues\n links Check all links for broken links\n robots Analyze robots.txt\n sitemap Validate sitemap\n inspect Inspect URLs via Google Search Console API\n\n${chalk.bold('Options:')}\n --env, -e Environment: prod (default) or dev\n --site, -s Site URL (overrides env detection)\n --output, -o Output directory for reports\n --format, -f Report format: split (default), json, markdown, ai-summary, all\n --max-pages Maximum pages to crawl (default: 100)\n --max-depth Maximum crawl depth (default: 3)\n --timeout Request timeout in ms (default: 60000)\n --concurrency Max concurrent requests (default: 50)\n --service-account Path to Google service account JSON\n --app-dir Path to app/ directory (for routes command)\n --content-dir Path to content/ directory (for content command)\n --base-path Base URL path for docs (default: /docs)\n --check Compare routes with sitemap\n --verify Verify routes are accessible\n --fix Apply fixes (for content fix command)\n --help, -h Show this help\n --version, -v Show version\n\n${chalk.bold('Examples:')}\n ${chalk.dim('# Full SEO audit')}\n djangocfg-seo audit\n\n ${chalk.dim('# Scan app routes and compare with sitemap')}\n djangocfg-seo routes --check\n\n ${chalk.dim('# Check links on production')}\n djangocfg-seo links\n\n ${chalk.dim('# Check MDX content links')}\n djangocfg-seo content check\n\n ${chalk.dim('# Fix absolute links to relative')}\n djangocfg-seo content fix --fix\n\n ${chalk.dim('# Generate sitemap.ts from content')}\n djangocfg-seo content sitemap\n`;\n\nasync function main() {\n const { values, positionals } = parseArgs({\n allowPositionals: true,\n options: {\n env: { type: 'string', short: 'e', default: 'prod' },\n site: { type: 'string', short: 's' },\n output: { type: 'string', short: 'o', default: './seo-reports' },\n urls: { type: 'string', short: 'u' },\n 'max-pages': { type: 'string', default: '100' },\n 'max-depth': { type: 'string', default: '3' },\n timeout: { type: 'string', default: '60000' },\n concurrency: { type: 'string', default: '50' },\n format: { type: 'string', short: 'f', default: 'split' },\n 'service-account': { type: 'string' },\n 'app-dir': { type: 'string' },\n 'content-dir': { type: 'string' },\n 'base-path': { type: 'string' },\n check: { type: 'boolean' },\n verify: { type: 'boolean' },\n fix: { type: 'boolean' },\n help: { type: 'boolean', short: 'h' },\n version: { type: 'boolean', short: 'v' },\n },\n });\n\n if (values.version) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (values.help || positionals.length === 0) {\n console.log(HELP);\n process.exit(0);\n }\n\n const command = positionals[0];\n const options = { ...values, _: positionals } as unknown as CliOptions;\n\n try {\n switch (command) {\n case 'audit':\n case 'report':\n await runAudit(options);\n break;\n case 'routes':\n await runRoutes(options);\n break;\n case 'inspect':\n await runInspect(options);\n break;\n case 'crawl':\n await runCrawl(options);\n break;\n case 'links':\n await runLinks(options);\n break;\n case 'robots':\n await runRobots(options);\n break;\n case 'sitemap':\n await runSitemap(options);\n break;\n case 'content':\n await runContent(options);\n break;\n default:\n consola.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exit(1);\n }\n } catch (error) {\n consola.error(error);\n process.exit(1);\n }\n}\n\nmain().catch(consola.error);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/google-console/auth.ts","../src/google-console/client.ts","../src/google-console/analyzer.ts","../src/crawler/crawler.ts","../src/crawler/robots-parser.ts","../src/crawler/sitemap-validator.ts","../src/link-checker/index.ts","../src/reports/json-report.ts","../src/reports/markdown-report.ts","../src/reports/split-report.ts","../src/reports/claude-context.ts","../src/reports/generator.ts","../src/routes/scanner.ts","../src/routes/analyzer.ts","../src/cli/types.ts","../src/cli/commands/audit.ts","../src/cli/commands/routes.ts","../src/utils/index.ts","../src/cli/commands/inspect.ts","../src/cli/commands/crawl.ts","../src/cli/commands/links.ts","../src/cli/commands/robots.ts","../src/cli/commands/sitemap.ts","../src/content/scanner.ts","../src/content/link-checker.ts","../src/content/link-fixer.ts","../src/content/sitemap-generator.ts","../src/cli/commands/content.ts","../src/cli/index.ts"],"names":["consola","chalk","config","existsSync","readFileSync","resolve","hash","pLimit","path","load","getSiteUrl","result","url","severityOrder","generateMarkdownReport","formatCategory","readdirSync","rmSync","join","mkdirSync","writeFileSync","fs","isAssetLink","relative","applyFixes"],"mappings":"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","file":"cli.mjs","sourcesContent":["/**\n * @djangocfg/seo - Configuration\n * Environment detection and URL management\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport consola from 'consola';\nimport chalk from 'chalk';\n\nexport interface EnvConfig {\n prod: string | undefined;\n dev: string | undefined;\n}\n\nexport interface SeoConfig {\n env: EnvConfig;\n cwd: string;\n}\n\nconst config: SeoConfig = {\n env: {\n prod: undefined,\n dev: undefined,\n },\n cwd: process.cwd(),\n};\n\n/**\n * Parse a .env file and return key-value pairs\n */\nexport function parseEnvFile(filePath: string): Record<string, string> {\n const content = readFileSync(filePath, 'utf-8');\n const vars: Record<string, string> = {};\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n\n // Remove quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n\n vars[key] = value;\n }\n\n return vars;\n}\n\n/**\n * Load .env files from the current working directory\n */\nexport function loadEnvFiles(cwd?: string): EnvConfig {\n const workDir = cwd || process.cwd();\n config.cwd = workDir;\n\n // Load .env.production\n const prodEnvPath = resolve(workDir, '.env.production');\n if (existsSync(prodEnvPath)) {\n const vars = parseEnvFile(prodEnvPath);\n config.env.prod = vars.NEXT_PUBLIC_SITE_URL || vars.SITE_URL;\n }\n\n // Load .env.development\n const devEnvPath = resolve(workDir, '.env.development');\n if (existsSync(devEnvPath)) {\n const vars = parseEnvFile(devEnvPath);\n config.env.dev = vars.NEXT_PUBLIC_SITE_URL || vars.SITE_URL;\n }\n\n // Fallback to .env.local or .env\n if (!config.env.prod && !config.env.dev) {\n for (const envFile of ['.env.local', '.env']) {\n const envPath = resolve(workDir, envFile);\n if (existsSync(envPath)) {\n const vars = parseEnvFile(envPath);\n const url = vars.NEXT_PUBLIC_SITE_URL || vars.SITE_URL;\n if (url) {\n config.env.prod = url;\n break;\n }\n }\n }\n }\n\n return config.env;\n}\n\n/**\n * Get the loaded environment configuration\n */\nexport function getEnvConfig(): EnvConfig {\n return config.env;\n}\n\n/**\n * Get site URL based on options and environment\n */\nexport function getSiteUrl(options: {\n site?: string;\n env?: string;\n}): string {\n // Explicit --site flag takes priority\n if (options.site) {\n return options.site;\n }\n\n // Use --env flag or default to 'prod'\n const env = options.env || 'prod';\n const isProd = env === 'prod' || env === 'production';\n\n // Get URL from loaded env files\n const url = isProd ? config.env.prod : config.env.dev;\n\n if (url) {\n const envLabel = isProd ? 'production' : 'development';\n consola.info(`Using ${chalk.cyan(envLabel)} URL: ${chalk.bold(url)}`);\n return url;\n }\n\n // Fallback to process.env (already loaded or from shell)\n const fallbackUrl =\n process.env.NEXT_PUBLIC_SITE_URL ||\n process.env.SITE_URL ||\n process.env.BASE_URL;\n\n if (fallbackUrl) {\n consola.info(`Using URL from environment: ${fallbackUrl}`);\n return fallbackUrl;\n }\n\n // Show available options if no URL found\n console.log('');\n consola.error('No site URL found!');\n console.log('');\n if (config.env.prod || config.env.dev) {\n consola.info('Available environments:');\n if (config.env.prod) consola.log(` ${chalk.green('prod')}: ${config.env.prod}`);\n if (config.env.dev) consola.log(` ${chalk.yellow('dev')}: ${config.env.dev}`);\n console.log('');\n consola.info(`Use ${chalk.cyan('--env prod')} or ${chalk.cyan('--env dev')} to select`);\n } else {\n consola.info('Create .env.production or .env.development with NEXT_PUBLIC_SITE_URL');\n consola.info('Or use --site https://example.com');\n }\n process.exit(1);\n}\n\n/**\n * Print detected environment info\n */\nexport function printEnvInfo(): void {\n console.log('');\n consola.info('Environment configuration:');\n if (config.env.prod) {\n consola.log(` ${chalk.green('prod')}: ${config.env.prod}`);\n }\n if (config.env.dev) {\n consola.log(` ${chalk.yellow('dev')}: ${config.env.dev}`);\n }\n if (!config.env.prod && !config.env.dev) {\n consola.warn(' No .env files found');\n }\n}\n\n/** Default Google service account key filename */\nconst GSC_KEY_FILENAME = 'gsc-key.json';\n\n/**\n * Find Google service account key file\n * Searches in current directory for gsc-key.json\n */\nexport function findGoogleServiceAccount(explicitPath?: string): string | undefined {\n // Explicit path takes priority\n if (explicitPath) {\n const resolved = resolve(config.cwd, explicitPath);\n if (existsSync(resolved)) {\n return resolved;\n }\n consola.warn(`Service account file not found: ${explicitPath}`);\n return undefined;\n }\n\n // Auto-detect in current directory\n const defaultPath = resolve(config.cwd, GSC_KEY_FILENAME);\n if (existsSync(defaultPath)) {\n consola.info(`Found Google service account: ${chalk.cyan(GSC_KEY_FILENAME)}`);\n return defaultPath;\n }\n\n return undefined;\n}\n\n/**\n * Get Google service account key filename for hints\n */\nexport function getGscKeyFilename(): string {\n return GSC_KEY_FILENAME;\n}\n","/**\n * @djangocfg/seo - Google Console Authentication\n * Service Account authentication for Google Search Console API\n */\n\nimport { JWT } from 'google-auth-library';\nimport { readFileSync, existsSync } from 'node:fs';\nimport consola from 'consola';\nimport type { GoogleConsoleConfig } from '../types/index.js';\n\nconst SCOPES = [\n 'https://www.googleapis.com/auth/webmasters.readonly',\n 'https://www.googleapis.com/auth/webmasters',\n];\n\nexport interface ServiceAccountCredentials {\n client_email: string;\n private_key: string;\n project_id?: string;\n}\n\n/**\n * Load service account credentials from file or config\n */\nexport function loadCredentials(config: GoogleConsoleConfig): ServiceAccountCredentials {\n if (config.serviceAccountJson) {\n return config.serviceAccountJson;\n }\n\n if (config.serviceAccountPath) {\n if (!existsSync(config.serviceAccountPath)) {\n throw new Error(`Service account file not found: ${config.serviceAccountPath}`);\n }\n\n const content = readFileSync(config.serviceAccountPath, 'utf-8');\n return JSON.parse(content) as ServiceAccountCredentials;\n }\n\n // Try to load from environment variable\n const envJson = process.env.GOOGLE_SERVICE_ACCOUNT_JSON;\n if (envJson) {\n return JSON.parse(envJson) as ServiceAccountCredentials;\n }\n\n // Try default path\n const defaultPath = './service_account.json';\n if (existsSync(defaultPath)) {\n const content = readFileSync(defaultPath, 'utf-8');\n return JSON.parse(content) as ServiceAccountCredentials;\n }\n\n throw new Error(\n 'No service account credentials found. Provide serviceAccountPath, serviceAccountJson, or set GOOGLE_SERVICE_ACCOUNT_JSON env variable.'\n );\n}\n\n/**\n * Create authenticated JWT client\n */\nexport function createAuthClient(config: GoogleConsoleConfig): JWT {\n const credentials = loadCredentials(config);\n\n const auth = new JWT({\n email: credentials.client_email,\n key: credentials.private_key,\n scopes: SCOPES,\n });\n\n // Store email for later display\n (auth as any)._serviceAccountEmail = credentials.client_email;\n\n return auth;\n}\n\n/**\n * Verify authentication is working\n */\nexport async function verifyAuth(auth: JWT, siteUrl?: string): Promise<boolean> {\n const email = (auth as any)._serviceAccountEmail || auth.email;\n\n try {\n await auth.authorize();\n consola.success('Google Search Console authentication verified');\n consola.info(`Service account: ${email}`);\n\n // Build GSC users URL with domain\n if (siteUrl) {\n const domain = new URL(siteUrl).hostname;\n const gscUrl = `https://search.google.com/search-console/users?resource_id=sc-domain%3A${domain}`;\n consola.info(`Ensure this email has Full access in GSC: ${gscUrl}`);\n }\n\n return true;\n } catch (error) {\n consola.error('Authentication failed');\n consola.info(`Service account email: ${email}`);\n consola.info('Make sure this email is added to GSC with Full access');\n return false;\n }\n}\n","/**\n * @djangocfg/seo - Google Search Console Client\n * Main client for interacting with Google Search Console API\n */\n\nimport { searchconsole, type searchconsole_v1 } from '@googleapis/searchconsole';\nimport type { JWT } from 'google-auth-library';\nimport consola from 'consola';\nimport pLimit from 'p-limit';\nimport pRetry from 'p-retry';\nimport { createAuthClient, verifyAuth } from './auth.js';\nimport type {\n GoogleConsoleConfig,\n UrlInspectionResult,\n CoverageState,\n IndexingState,\n IndexingVerdict,\n RobotsTxtState,\n PageFetchState,\n} from '../types/index.js';\n\nexport class GoogleConsoleClient {\n private auth: JWT;\n private searchconsole: searchconsole_v1.Searchconsole;\n private siteUrl: string;\n private gscSiteUrl: string; // Format for GSC API (may be sc-domain:xxx)\n private limit = pLimit(2); // Max 2 concurrent requests (Cloudflare-friendly)\n private requestDelay = 500; // Delay between requests in ms\n\n constructor(config: GoogleConsoleConfig) {\n this.auth = createAuthClient(config);\n this.searchconsole = searchconsole({ version: 'v1', auth: this.auth });\n this.siteUrl = config.siteUrl;\n\n // Support both URL prefix and domain property formats\n // If gscSiteUrl provided, use it; otherwise try domain property format\n if (config.gscSiteUrl) {\n this.gscSiteUrl = config.gscSiteUrl;\n } else {\n // Default to domain property format (most common)\n const domain = new URL(config.siteUrl).hostname;\n this.gscSiteUrl = `sc-domain:${domain}`;\n }\n\n consola.debug(`GSC site URL: ${this.gscSiteUrl}`);\n }\n\n /**\n * Delay helper for rate limiting\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * Verify the client is authenticated\n */\n async verify(): Promise<boolean> {\n return verifyAuth(this.auth, this.siteUrl);\n }\n\n /**\n * List all sites in Search Console\n */\n async listSites(): Promise<string[]> {\n try {\n const response = await this.searchconsole.sites.list();\n return response.data.siteEntry?.map((site) => site.siteUrl || '') || [];\n } catch (error) {\n consola.error('Failed to list sites:', error);\n throw error;\n }\n }\n\n /**\n * Inspect a single URL\n */\n async inspectUrl(url: string): Promise<UrlInspectionResult> {\n return this.limit(async () => {\n return pRetry(\n async () => {\n const response = await this.searchconsole.urlInspection.index.inspect({\n requestBody: {\n inspectionUrl: url,\n siteUrl: this.gscSiteUrl,\n languageCode: 'en-US',\n },\n });\n\n const result = response.data.inspectionResult;\n\n if (!result?.indexStatusResult) {\n throw new Error(`No inspection result for URL: ${url}`);\n }\n\n return this.mapInspectionResult(url, result);\n },\n {\n retries: 2,\n minTimeout: 2000,\n maxTimeout: 10000,\n factor: 2, // Exponential backoff\n onFailedAttempt: (ctx) => {\n // Only log on final failure to reduce noise\n if (ctx.retriesLeft === 0) {\n consola.warn(`Failed: ${url}`);\n }\n },\n }\n );\n });\n }\n\n /**\n * Inspect multiple URLs in batch\n * Stops early if too many consecutive errors (likely rate limiting)\n */\n async inspectUrls(urls: string[]): Promise<UrlInspectionResult[]> {\n consola.info(`Inspecting ${urls.length} URLs...`);\n\n const results: UrlInspectionResult[] = [];\n const errors: Array<{ url: string; error: Error }> = [];\n let consecutiveErrors = 0;\n const maxConsecutiveErrors = 3; // Stop after 3 consecutive failures\n\n // Process URLs sequentially with delay to avoid rate limiting\n for (const url of urls) {\n try {\n const result = await this.inspectUrl(url);\n results.push(result);\n consecutiveErrors = 0; // Reset on success\n // Add delay between requests\n await this.delay(this.requestDelay);\n } catch (error) {\n const err = error as Error;\n errors.push({ url, error: err });\n consecutiveErrors++;\n\n // Early exit on consecutive errors (likely rate limiting or auth issue)\n if (consecutiveErrors >= maxConsecutiveErrors) {\n console.log('');\n consola.error(`Stopping after ${maxConsecutiveErrors} consecutive failures`);\n this.showRateLimitHelp();\n break;\n }\n }\n }\n\n if (errors.length > 0 && consecutiveErrors < maxConsecutiveErrors) {\n consola.warn(`Failed to inspect ${errors.length} URLs`);\n }\n\n if (results.length > 0) {\n consola.success(`Successfully inspected ${results.length}/${urls.length} URLs`);\n } else if (errors.length > 0) {\n consola.warn('No URLs were successfully inspected');\n }\n\n return results;\n }\n\n /**\n * Show help message for rate limiting issues\n */\n private showRateLimitHelp(): void {\n consola.info('Possible causes:');\n consola.info(' 1. Google API quota exceeded (2000 requests/day)');\n consola.info(' 2. Cloudflare blocking Google\\'s crawler');\n consola.info(' 3. Service account not added to GSC');\n console.log('');\n consola.info('Solutions:');\n consola.info(' • Check GSC access: https://search.google.com/search-console/users');\n console.log('');\n consola.info(' • Cloudflare WAF rule to allow Googlebot:');\n consola.info(' 1. Dashboard → Security → WAF → Custom rules → Create rule');\n consola.info(' 2. Name: \"Allow Googlebot\"');\n consola.info(' 3. Field: \"Known Bots\" | Operator: \"equals\" | Value: \"true\"');\n consola.info(' 4. Or click \"Edit expression\" and paste: (cf.client.bot)');\n consola.info(' 5. Action: Skip → check all rules');\n consola.info(' 6. Deploy');\n consola.info(' Docs: https://developers.cloudflare.com/waf/custom-rules/use-cases/allow-traffic-from-verified-bots/');\n console.log('');\n }\n\n /**\n * Get search analytics data\n */\n async getSearchAnalytics(\n options: {\n startDate: string;\n endDate: string;\n dimensions?: ('query' | 'page' | 'country' | 'device' | 'date')[];\n rowLimit?: number;\n }\n ): Promise<searchconsole_v1.Schema$ApiDataRow[]> {\n try {\n const response = await this.searchconsole.searchanalytics.query({\n siteUrl: this.gscSiteUrl,\n requestBody: {\n startDate: options.startDate,\n endDate: options.endDate,\n dimensions: options.dimensions || ['page'],\n rowLimit: options.rowLimit || 1000,\n },\n });\n\n return response.data.rows || [];\n } catch (error) {\n consola.error('Failed to get search analytics:', error);\n throw error;\n }\n }\n\n /**\n * Get list of sitemaps\n */\n async getSitemaps(): Promise<searchconsole_v1.Schema$WmxSitemap[]> {\n try {\n const response = await this.searchconsole.sitemaps.list({\n siteUrl: this.gscSiteUrl,\n });\n\n return response.data.sitemap || [];\n } catch (error) {\n consola.error('Failed to get sitemaps:', error);\n throw error;\n }\n }\n\n /**\n * Map API response to our types\n */\n private mapInspectionResult(\n url: string,\n result: searchconsole_v1.Schema$UrlInspectionResult\n ): UrlInspectionResult {\n const indexStatus = result.indexStatusResult!;\n\n return {\n url,\n inspectionResultLink: result.inspectionResultLink || undefined,\n indexStatusResult: {\n verdict: (indexStatus.verdict as IndexingVerdict) || 'VERDICT_UNSPECIFIED',\n coverageState: (indexStatus.coverageState as CoverageState) || 'COVERAGE_STATE_UNSPECIFIED',\n indexingState: (indexStatus.indexingState as IndexingState) || 'INDEXING_STATE_UNSPECIFIED',\n robotsTxtState: (indexStatus.robotsTxtState as RobotsTxtState) || 'ROBOTS_TXT_STATE_UNSPECIFIED',\n pageFetchState: (indexStatus.pageFetchState as PageFetchState) || 'PAGE_FETCH_STATE_UNSPECIFIED',\n lastCrawlTime: indexStatus.lastCrawlTime || undefined,\n crawledAs: indexStatus.crawledAs as 'DESKTOP' | 'MOBILE' | undefined,\n googleCanonical: indexStatus.googleCanonical || undefined,\n userCanonical: indexStatus.userCanonical || undefined,\n sitemap: indexStatus.sitemap || undefined,\n referringUrls: indexStatus.referringUrls || undefined,\n },\n mobileUsabilityResult: result.mobileUsabilityResult\n ? {\n verdict: (result.mobileUsabilityResult.verdict as IndexingVerdict) || 'VERDICT_UNSPECIFIED',\n issues: result.mobileUsabilityResult.issues?.map((issue) => ({\n issueType: issue.issueType || 'UNKNOWN',\n message: issue.message || '',\n })),\n }\n : undefined,\n richResultsResult: result.richResultsResult\n ? {\n verdict: (result.richResultsResult.verdict as IndexingVerdict) || 'VERDICT_UNSPECIFIED',\n detectedItems: result.richResultsResult.detectedItems?.map((item) => ({\n richResultType: item.richResultType || 'UNKNOWN',\n items: item.items?.map((i) => ({\n name: i.name || '',\n issues: i.issues?.map((issue) => ({\n issueMessage: issue.issueMessage || '',\n severity: (issue.severity as 'ERROR' | 'WARNING') || 'WARNING',\n })),\n })),\n })),\n }\n : undefined,\n };\n }\n}\n","/**\n * @djangocfg/seo - Google Console Analyzer\n * Analyze URL inspection results and detect SEO issues\n */\n\nimport type {\n UrlInspectionResult,\n SeoIssue,\n IssueSeverity,\n IssueCategory,\n} from '../types/index.js';\n\n/**\n * Analyze URL inspection results and extract SEO issues\n */\nexport function analyzeInspectionResults(results: UrlInspectionResult[]): SeoIssue[] {\n const issues: SeoIssue[] = [];\n\n for (const result of results) {\n issues.push(...analyzeUrlInspection(result));\n }\n\n return issues.sort((a, b) => severityOrder(a.severity) - severityOrder(b.severity));\n}\n\nfunction analyzeUrlInspection(result: UrlInspectionResult): SeoIssue[] {\n const issues: SeoIssue[] = [];\n const { indexStatusResult, mobileUsabilityResult, richResultsResult } = result;\n\n // Indexing Issues\n switch (indexStatusResult.coverageState) {\n case 'CRAWLED_CURRENTLY_NOT_INDEXED':\n issues.push({\n id: `crawled-not-indexed-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'error',\n title: 'Page crawled but not indexed',\n description:\n 'Google crawled this page but decided not to index it. This often indicates low content quality or duplicate content.',\n recommendation:\n 'Improve content quality, ensure uniqueness, add more valuable information, and check for duplicate content issues.',\n detectedAt: new Date().toISOString(),\n metadata: { coverageState: indexStatusResult.coverageState },\n });\n break;\n\n case 'DISCOVERED_CURRENTLY_NOT_INDEXED':\n issues.push({\n id: `discovered-not-indexed-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'warning',\n title: 'Page discovered but not crawled',\n description:\n 'Google discovered this URL but has not crawled it yet. This may indicate crawl budget issues or low priority.',\n recommendation:\n 'Improve internal linking to this page, submit URL through Google Search Console, or add to sitemap.',\n detectedAt: new Date().toISOString(),\n metadata: { coverageState: indexStatusResult.coverageState },\n });\n break;\n\n case 'DUPLICATE_WITHOUT_USER_SELECTED_CANONICAL':\n issues.push({\n id: `duplicate-no-canonical-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'warning',\n title: 'Duplicate page without canonical',\n description:\n 'This page is considered a duplicate but no canonical URL has been specified. Google chose a canonical for you.',\n recommendation:\n 'Add a canonical tag pointing to the preferred version of this page.',\n detectedAt: new Date().toISOString(),\n metadata: {\n coverageState: indexStatusResult.coverageState,\n googleCanonical: indexStatusResult.googleCanonical,\n },\n });\n break;\n\n case 'DUPLICATE_GOOGLE_CHOSE_DIFFERENT_CANONICAL':\n issues.push({\n id: `canonical-mismatch-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'warning',\n title: 'Google chose different canonical',\n description:\n 'You specified a canonical URL, but Google chose a different one. This may cause indexing issues.',\n recommendation:\n 'Review canonical tags and ensure they point to the correct URL. Check for duplicate content.',\n detectedAt: new Date().toISOString(),\n metadata: {\n coverageState: indexStatusResult.coverageState,\n userCanonical: indexStatusResult.userCanonical,\n googleCanonical: indexStatusResult.googleCanonical,\n },\n });\n break;\n }\n\n // Indexing State Issues\n switch (indexStatusResult.indexingState) {\n case 'BLOCKED_BY_META_TAG':\n issues.push({\n id: `blocked-meta-noindex-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'error',\n title: 'Blocked by noindex meta tag',\n description: 'This page has a noindex meta tag preventing it from being indexed.',\n recommendation:\n 'Remove the noindex meta tag if you want this page to be indexed. If intentional, no action needed.',\n detectedAt: new Date().toISOString(),\n metadata: { indexingState: indexStatusResult.indexingState },\n });\n break;\n\n case 'BLOCKED_BY_HTTP_HEADER':\n issues.push({\n id: `blocked-http-header-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'error',\n title: 'Blocked by X-Robots-Tag header',\n description: 'This page has a noindex directive in the X-Robots-Tag HTTP header.',\n recommendation:\n 'Remove the X-Robots-Tag: noindex header if you want this page to be indexed.',\n detectedAt: new Date().toISOString(),\n metadata: { indexingState: indexStatusResult.indexingState },\n });\n break;\n\n case 'BLOCKED_BY_ROBOTS_TXT':\n issues.push({\n id: `blocked-robots-txt-${hash(result.url)}`,\n url: result.url,\n category: 'crawling',\n severity: 'error',\n title: 'Blocked by robots.txt',\n description: 'This page is blocked from crawling by robots.txt rules.',\n recommendation:\n 'Update robots.txt to allow crawling if you want this page to be indexed.',\n detectedAt: new Date().toISOString(),\n metadata: { indexingState: indexStatusResult.indexingState },\n });\n break;\n }\n\n // Page Fetch Issues\n switch (indexStatusResult.pageFetchState) {\n case 'SOFT_404':\n issues.push({\n id: `soft-404-${hash(result.url)}`,\n url: result.url,\n category: 'technical',\n severity: 'error',\n title: 'Soft 404 error',\n description:\n 'This page returns a 200 status but Google detected it as a 404 page (empty or low-value content).',\n recommendation:\n 'Either return a proper 404 status code or add meaningful content to this page.',\n detectedAt: new Date().toISOString(),\n metadata: { pageFetchState: indexStatusResult.pageFetchState },\n });\n break;\n\n case 'NOT_FOUND':\n issues.push({\n id: `404-error-${hash(result.url)}`,\n url: result.url,\n category: 'technical',\n severity: 'error',\n title: '404 Not Found',\n description: 'This page returns a 404 error.',\n recommendation:\n 'Either restore the page content or set up a redirect to a relevant page.',\n detectedAt: new Date().toISOString(),\n metadata: { pageFetchState: indexStatusResult.pageFetchState },\n });\n break;\n\n case 'SERVER_ERROR':\n issues.push({\n id: `server-error-${hash(result.url)}`,\n url: result.url,\n category: 'technical',\n severity: 'critical',\n title: 'Server error (5xx)',\n description: 'This page returns a server error when Google tries to crawl it.',\n recommendation:\n 'Fix the server-side error. Check server logs for details.',\n detectedAt: new Date().toISOString(),\n metadata: { pageFetchState: indexStatusResult.pageFetchState },\n });\n break;\n\n case 'REDIRECT_ERROR':\n issues.push({\n id: `redirect-error-${hash(result.url)}`,\n url: result.url,\n category: 'technical',\n severity: 'error',\n title: 'Redirect error',\n description:\n 'There is a redirect issue with this page (redirect loop, too many redirects, or invalid redirect).',\n recommendation:\n 'Fix the redirect chain. Ensure redirects point to valid, accessible pages.',\n detectedAt: new Date().toISOString(),\n metadata: { pageFetchState: indexStatusResult.pageFetchState },\n });\n break;\n\n case 'ACCESS_DENIED':\n case 'ACCESS_FORBIDDEN':\n issues.push({\n id: `access-denied-${hash(result.url)}`,\n url: result.url,\n category: 'technical',\n severity: 'error',\n title: 'Access denied (401/403)',\n description: 'Google cannot access this page due to authentication requirements.',\n recommendation:\n 'Ensure the page is publicly accessible without authentication for Googlebot.',\n detectedAt: new Date().toISOString(),\n metadata: { pageFetchState: indexStatusResult.pageFetchState },\n });\n break;\n }\n\n // Mobile Usability Issues\n if (mobileUsabilityResult?.verdict === 'FAIL' && mobileUsabilityResult.issues) {\n for (const issue of mobileUsabilityResult.issues) {\n issues.push({\n id: `mobile-${issue.issueType}-${hash(result.url)}`,\n url: result.url,\n category: 'mobile',\n severity: 'warning',\n title: `Mobile usability: ${formatIssueType(issue.issueType)}`,\n description: issue.message || 'Mobile usability issue detected.',\n recommendation: getMobileRecommendation(issue.issueType),\n detectedAt: new Date().toISOString(),\n metadata: { issueType: issue.issueType },\n });\n }\n }\n\n // Rich Results Issues\n if (richResultsResult?.verdict === 'FAIL' && richResultsResult.detectedItems) {\n for (const item of richResultsResult.detectedItems) {\n for (const i of item.items || []) {\n for (const issueDetail of i.issues || []) {\n issues.push({\n id: `rich-result-${item.richResultType}-${hash(result.url)}`,\n url: result.url,\n category: 'structured-data',\n severity: issueDetail.severity === 'ERROR' ? 'error' : 'warning',\n title: `${item.richResultType}: ${i.name}`,\n description: issueDetail.issueMessage,\n recommendation:\n 'Fix the structured data markup according to Google guidelines.',\n detectedAt: new Date().toISOString(),\n metadata: { richResultType: item.richResultType },\n });\n }\n }\n }\n }\n\n return issues;\n}\n\nfunction severityOrder(severity: IssueSeverity): number {\n const order: Record<IssueSeverity, number> = {\n critical: 0,\n error: 1,\n warning: 2,\n info: 3,\n };\n return order[severity];\n}\n\nfunction hash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n}\n\nfunction formatIssueType(type: string): string {\n return type\n .replace(/_/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction getMobileRecommendation(issueType: string): string {\n const recommendations: Record<string, string> = {\n MOBILE_FRIENDLY_RULE_USES_INCOMPATIBLE_PLUGINS:\n 'Remove Flash or other incompatible plugins. Use HTML5 alternatives.',\n MOBILE_FRIENDLY_RULE_CONFIGURE_VIEWPORT:\n 'Add a viewport meta tag: <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">',\n MOBILE_FRIENDLY_RULE_CONTENT_NOT_SIZED_TO_VIEWPORT:\n 'Ensure content width fits the viewport. Use responsive CSS.',\n MOBILE_FRIENDLY_RULE_TAP_TARGETS_TOO_SMALL:\n 'Increase the size of touch targets (buttons, links) to at least 48x48 pixels.',\n MOBILE_FRIENDLY_RULE_TEXT_TOO_SMALL:\n 'Use at least 16px font size for body text.',\n };\n\n return recommendations[issueType] || 'Fix the mobile usability issue according to Google guidelines.';\n}\n","/**\n * @djangocfg/seo - Site Crawler\n * Internal site crawler for SEO analysis\n */\n\nimport { load } from 'cheerio';\nimport pLimit from 'p-limit';\nimport consola from 'consola';\nimport type { CrawlResult, CrawlerConfig, SeoIssue } from '../types/index.js';\n\nconst DEFAULT_CONFIG: Required<CrawlerConfig> = {\n maxPages: 100,\n maxDepth: 3,\n concurrency: 5,\n timeout: 30000,\n userAgent: 'DjangoCFG-SEO-Crawler/1.0 (+https://djangocfg.com/bot)',\n respectRobotsTxt: true,\n includePatterns: [],\n excludePatterns: [\n '/api/',\n '/admin/',\n '/_next/',\n '/static/',\n '.pdf',\n '.jpg',\n '.png',\n '.gif',\n '.svg',\n '.css',\n '.js',\n ],\n};\n\nexport class SiteCrawler {\n private config: Required<CrawlerConfig>;\n private baseUrl: URL;\n private visited = new Set<string>();\n private queue: Array<{ url: string; depth: number }> = [];\n private results: CrawlResult[] = [];\n private limit: ReturnType<typeof pLimit>;\n\n constructor(siteUrl: string, config?: CrawlerConfig) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.baseUrl = new URL(siteUrl);\n this.limit = pLimit(this.config.concurrency);\n }\n\n /**\n * Start crawling the site\n */\n async crawl(): Promise<CrawlResult[]> {\n consola.info(`Starting crawl of ${this.baseUrl.origin}`);\n consola.info(`Config: maxPages=${this.config.maxPages}, maxDepth=${this.config.maxDepth}`);\n\n this.queue.push({ url: this.baseUrl.href, depth: 0 });\n\n while (this.queue.length > 0 && this.results.length < this.config.maxPages) {\n const batch = this.queue.splice(0, this.config.concurrency);\n\n const promises = batch.map(({ url, depth }) =>\n this.limit(() => this.crawlPage(url, depth))\n );\n\n await Promise.all(promises);\n }\n\n consola.success(`Crawl complete. Crawled ${this.results.length} pages.`);\n return this.results;\n }\n\n /**\n * Crawl a single page\n */\n private async crawlPage(url: string, depth: number): Promise<void> {\n const normalizedUrl = this.normalizeUrl(url);\n\n if (this.visited.has(normalizedUrl)) return;\n if (this.shouldExclude(normalizedUrl)) return;\n\n this.visited.add(normalizedUrl);\n\n const startTime = Date.now();\n const result: CrawlResult = {\n url: normalizedUrl,\n statusCode: 0,\n links: { internal: [], external: [] },\n images: [],\n loadTime: 0,\n errors: [],\n warnings: [],\n crawledAt: new Date().toISOString(),\n };\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n const response = await fetch(normalizedUrl, {\n headers: {\n 'User-Agent': this.config.userAgent,\n Accept: 'text/html,application/xhtml+xml',\n },\n signal: controller.signal,\n redirect: 'follow',\n });\n\n // TTFB = time from request start to first response headers\n result.ttfb = Date.now() - startTime;\n\n clearTimeout(timeoutId);\n\n result.statusCode = response.status;\n result.contentType = response.headers.get('content-type') || undefined;\n result.contentLength = Number(response.headers.get('content-length')) || undefined;\n\n if (response.ok && result.contentType?.includes('text/html')) {\n const html = await response.text();\n this.parseHtml(html, result, normalizedUrl, depth);\n } else if (!response.ok) {\n result.errors.push(`HTTP ${response.status}: ${response.statusText}`);\n }\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n result.errors.push('Request timeout');\n } else {\n result.errors.push(error.message);\n }\n }\n }\n\n result.loadTime = Date.now() - startTime;\n this.results.push(result);\n\n consola.debug(`Crawled: ${normalizedUrl} (${result.statusCode}) - ${result.loadTime}ms`);\n }\n\n /**\n * Parse HTML and extract SEO-relevant data\n */\n private parseHtml(html: string, result: CrawlResult, pageUrl: string, depth: number): void {\n const $ = load(html);\n\n // Title\n result.title = $('title').first().text().trim() || undefined;\n if (!result.title) {\n result.warnings.push('Missing title tag');\n } else if (result.title.length > 60) {\n result.warnings.push(`Title too long (${result.title.length} chars, recommended: <60)`);\n }\n\n // Meta description\n result.metaDescription =\n $('meta[name=\"description\"]').attr('content')?.trim() || undefined;\n if (!result.metaDescription) {\n result.warnings.push('Missing meta description');\n } else if (result.metaDescription.length > 160) {\n result.warnings.push(\n `Meta description too long (${result.metaDescription.length} chars, recommended: <160)`\n );\n }\n\n // Meta robots\n result.metaRobots = $('meta[name=\"robots\"]').attr('content')?.trim() || undefined;\n const xRobots = $('meta[http-equiv=\"X-Robots-Tag\"]').attr('content')?.trim();\n if (xRobots) {\n result.metaRobots = result.metaRobots ? `${result.metaRobots}, ${xRobots}` : xRobots;\n }\n\n // Canonical\n result.canonicalUrl = $('link[rel=\"canonical\"]').attr('href')?.trim() || undefined;\n if (!result.canonicalUrl) {\n result.warnings.push('Missing canonical tag');\n }\n\n // Headings\n result.h1 = $('h1')\n .map((_, el) => $(el).text().trim())\n .get();\n result.h2 = $('h2')\n .map((_, el) => $(el).text().trim())\n .get();\n\n if (result.h1.length === 0) {\n result.warnings.push('Missing H1 tag');\n } else if (result.h1.length > 1) {\n result.warnings.push(`Multiple H1 tags (${result.h1.length})`);\n }\n\n // Links\n $('a[href]').each((_, el) => {\n const href = $(el).attr('href');\n if (!href) return;\n\n try {\n const linkUrl = new URL(href, pageUrl);\n\n if (linkUrl.hostname === this.baseUrl.hostname) {\n const internalUrl = this.normalizeUrl(linkUrl.href);\n result.links.internal.push(internalUrl);\n\n // Add to crawl queue\n if (depth < this.config.maxDepth && !this.visited.has(internalUrl)) {\n this.queue.push({ url: internalUrl, depth: depth + 1 });\n }\n } else {\n result.links.external.push(linkUrl.href);\n }\n } catch {\n // Invalid URL, skip\n }\n });\n\n // Images\n $('img').each((_, el) => {\n const src = $(el).attr('src');\n const alt = $(el).attr('alt');\n\n if (src) {\n result.images.push({\n src,\n alt,\n hasAlt: alt !== undefined && alt.trim().length > 0,\n });\n }\n });\n\n const imagesWithoutAlt = result.images.filter((img) => !img.hasAlt);\n if (imagesWithoutAlt.length > 0) {\n result.warnings.push(`${imagesWithoutAlt.length} images without alt text`);\n }\n }\n\n /**\n * Normalize URL for deduplication\n */\n private normalizeUrl(url: string): string {\n try {\n const parsed = new URL(url, this.baseUrl.href);\n // Remove trailing slash, hash, and sort query params\n parsed.hash = '';\n let pathname = parsed.pathname;\n if (pathname.endsWith('/') && pathname !== '/') {\n pathname = pathname.slice(0, -1);\n }\n parsed.pathname = pathname;\n return parsed.href;\n } catch {\n return url;\n }\n }\n\n /**\n * Check if URL should be excluded\n */\n private shouldExclude(url: string): boolean {\n // Check include patterns first\n if (this.config.includePatterns.length > 0) {\n const included = this.config.includePatterns.some((pattern) =>\n url.includes(pattern)\n );\n if (!included) return true;\n }\n\n // Check exclude patterns\n return this.config.excludePatterns.some((pattern) => url.includes(pattern));\n }\n}\n\n/**\n * Analyze crawl results for SEO issues\n */\nexport function analyzeCrawlResults(results: CrawlResult[]): SeoIssue[] {\n const issues: SeoIssue[] = [];\n\n for (const result of results) {\n // HTTP errors\n if (result.statusCode >= 400) {\n issues.push({\n id: `http-error-${hash(result.url)}`,\n url: result.url,\n category: 'technical',\n severity: result.statusCode >= 500 ? 'critical' : 'error',\n title: `HTTP ${result.statusCode} error`,\n description: `Page returns ${result.statusCode} status code.`,\n recommendation:\n result.statusCode === 404\n ? 'Either restore the content or set up a redirect.'\n : 'Fix the server error and ensure the page is accessible.',\n detectedAt: result.crawledAt,\n metadata: { statusCode: result.statusCode },\n });\n }\n\n // Missing title\n if (!result.title && result.statusCode === 200) {\n issues.push({\n id: `missing-title-${hash(result.url)}`,\n url: result.url,\n category: 'content',\n severity: 'error',\n title: 'Missing title tag',\n description: 'This page does not have a title tag.',\n recommendation: 'Add a unique, descriptive title tag (50-60 characters).',\n detectedAt: result.crawledAt,\n });\n }\n\n // Missing meta description\n if (!result.metaDescription && result.statusCode === 200) {\n issues.push({\n id: `missing-meta-desc-${hash(result.url)}`,\n url: result.url,\n category: 'content',\n severity: 'warning',\n title: 'Missing meta description',\n description: 'This page does not have a meta description.',\n recommendation: 'Add a unique meta description (120-160 characters).',\n detectedAt: result.crawledAt,\n });\n }\n\n // Missing H1\n if (result.h1 && result.h1.length === 0 && result.statusCode === 200) {\n issues.push({\n id: `missing-h1-${hash(result.url)}`,\n url: result.url,\n category: 'content',\n severity: 'warning',\n title: 'Missing H1 heading',\n description: 'This page does not have an H1 heading.',\n recommendation: 'Add a single H1 heading that describes the page content.',\n detectedAt: result.crawledAt,\n });\n }\n\n // Multiple H1s\n if (result.h1 && result.h1.length > 1) {\n issues.push({\n id: `multiple-h1-${hash(result.url)}`,\n url: result.url,\n category: 'content',\n severity: 'warning',\n title: 'Multiple H1 headings',\n description: `This page has ${result.h1.length} H1 headings.`,\n recommendation: 'Use only one H1 heading per page.',\n detectedAt: result.crawledAt,\n metadata: { h1Count: result.h1.length },\n });\n }\n\n // Images without alt\n const imagesWithoutAlt = result.images.filter((img) => !img.hasAlt);\n if (imagesWithoutAlt.length > 0) {\n issues.push({\n id: `images-no-alt-${hash(result.url)}`,\n url: result.url,\n category: 'content',\n severity: 'info',\n title: 'Images without alt text',\n description: `${imagesWithoutAlt.length} images are missing alt text.`,\n recommendation: 'Add descriptive alt text to all images for accessibility and SEO.',\n detectedAt: result.crawledAt,\n metadata: { count: imagesWithoutAlt.length },\n });\n }\n\n // Slow load time (> 3s)\n if (result.loadTime > 3000) {\n issues.push({\n id: `slow-page-${hash(result.url)}`,\n url: result.url,\n category: 'performance',\n severity: result.loadTime > 5000 ? 'error' : 'warning',\n title: 'Slow page load time',\n description: `Page took ${result.loadTime}ms to load.`,\n recommendation: 'Optimize page load time. Target under 3 seconds.',\n detectedAt: result.crawledAt,\n metadata: { loadTime: result.loadTime },\n });\n }\n\n // Slow TTFB (> 800ms)\n if (result.ttfb && result.ttfb > 800) {\n issues.push({\n id: `slow-ttfb-${hash(result.url)}`,\n url: result.url,\n category: 'performance',\n severity: result.ttfb > 1500 ? 'error' : 'warning',\n title: 'Slow Time to First Byte',\n description: `TTFB is ${result.ttfb}ms. Server responded slowly.`,\n recommendation: 'Optimize server response. Target TTFB under 800ms. Consider CDN, caching, or server upgrades.',\n detectedAt: result.crawledAt,\n metadata: { ttfb: result.ttfb },\n });\n }\n\n // Noindex check\n if (result.metaRobots?.includes('noindex')) {\n issues.push({\n id: `noindex-${hash(result.url)}`,\n url: result.url,\n category: 'indexing',\n severity: 'info',\n title: 'Page marked as noindex',\n description: 'This page has a noindex directive.',\n recommendation: 'Verify this is intentional. Remove noindex if the page should be indexed.',\n detectedAt: result.crawledAt,\n metadata: { metaRobots: result.metaRobots },\n });\n }\n }\n\n return issues;\n}\n\nfunction hash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n}\n","/**\n * @djangocfg/seo - Robots.txt Parser\n * Parse and analyze robots.txt files\n */\n\nimport robotsParser from 'robots-parser';\nimport consola from 'consola';\nimport type { SeoIssue } from '../types/index.js';\n\nexport interface RobotsAnalysis {\n exists: boolean;\n content?: string;\n sitemaps: string[];\n allowedPaths: string[];\n disallowedPaths: string[];\n crawlDelay?: number;\n issues: SeoIssue[];\n}\n\n/**\n * Fetch and parse robots.txt for a site\n */\nexport async function analyzeRobotsTxt(siteUrl: string): Promise<RobotsAnalysis> {\n const robotsUrl = new URL('/robots.txt', siteUrl).href;\n\n const analysis: RobotsAnalysis = {\n exists: false,\n sitemaps: [],\n allowedPaths: [],\n disallowedPaths: [],\n issues: [],\n };\n\n try {\n const response = await fetch(robotsUrl);\n\n if (!response.ok) {\n analysis.issues.push({\n id: 'missing-robots-txt',\n url: robotsUrl,\n category: 'technical',\n severity: 'warning',\n title: 'Missing robots.txt',\n description: `No robots.txt file found (HTTP ${response.status}).`,\n recommendation: 'Create a robots.txt file to control crawler access.',\n detectedAt: new Date().toISOString(),\n });\n return analysis;\n }\n\n analysis.exists = true;\n analysis.content = await response.text();\n\n // Check for Cloudflare managed robots.txt override\n if (\n analysis.content.includes('content-signal') ||\n analysis.content.includes('Content-Signal') ||\n analysis.content.includes('ai-input') ||\n analysis.content.includes('ai-train')\n ) {\n analysis.issues.push({\n id: 'cloudflare-managed-robots',\n url: robotsUrl,\n category: 'technical',\n severity: 'warning',\n title: 'Cloudflare managed robots.txt detected',\n description:\n 'Your robots.txt is being overwritten by Cloudflare\\'s \"Content Signals Policy\". ' +\n 'Your app/robots.ts file is not being served.',\n recommendation:\n 'Disable in Cloudflare Dashboard: Security → Settings → \"Manage your robots.txt\" → Set to \"Off\".',\n detectedAt: new Date().toISOString(),\n metadata: {\n cloudflareFeature: 'Managed robots.txt',\n docsUrl: 'https://developers.cloudflare.com/bots/additional-configurations/managed-robots-txt/',\n },\n });\n }\n\n // Parse robots.txt\n const robots = robotsParser(robotsUrl, analysis.content);\n\n // Extract sitemaps\n analysis.sitemaps = robots.getSitemaps();\n\n if (analysis.sitemaps.length === 0) {\n analysis.issues.push({\n id: 'no-sitemap-in-robots',\n url: robotsUrl,\n category: 'technical',\n severity: 'info',\n title: 'No sitemap in robots.txt',\n description: 'No sitemap URL is declared in robots.txt.',\n recommendation: 'Add a Sitemap directive pointing to your XML sitemap.',\n detectedAt: new Date().toISOString(),\n });\n }\n\n // Parse rules (simplified extraction)\n const lines = analysis.content.split('\\n');\n let currentUserAgent = '*';\n\n for (const line of lines) {\n const trimmed = line.trim().toLowerCase();\n\n if (trimmed.startsWith('user-agent:')) {\n currentUserAgent = trimmed.replace('user-agent:', '').trim();\n } else if (trimmed.startsWith('disallow:')) {\n const path = line.trim().replace(/disallow:/i, '').trim();\n if (path) {\n analysis.disallowedPaths.push(path);\n }\n } else if (trimmed.startsWith('allow:')) {\n const path = line.trim().replace(/allow:/i, '').trim();\n if (path) {\n analysis.allowedPaths.push(path);\n }\n } else if (trimmed.startsWith('crawl-delay:')) {\n const delay = parseInt(trimmed.replace('crawl-delay:', '').trim(), 10);\n if (!isNaN(delay)) {\n analysis.crawlDelay = delay;\n }\n }\n }\n\n // Check for blocking important paths\n const importantPaths = ['/', '/sitemap.xml'];\n for (const path of importantPaths) {\n if (!robots.isAllowed(new URL(path, siteUrl).href, 'Googlebot')) {\n analysis.issues.push({\n id: `blocked-important-path-${path.replace(/\\//g, '-')}`,\n url: siteUrl,\n category: 'crawling',\n severity: 'error',\n title: `Important path blocked: ${path}`,\n description: `The path ${path} is blocked in robots.txt.`,\n recommendation: `Ensure ${path} is accessible to search engines.`,\n detectedAt: new Date().toISOString(),\n metadata: { path },\n });\n }\n }\n\n // Check for excessively restrictive rules\n if (analysis.disallowedPaths.includes('/')) {\n analysis.issues.push({\n id: 'all-blocked',\n url: robotsUrl,\n category: 'crawling',\n severity: 'critical',\n title: 'Entire site blocked',\n description: 'robots.txt blocks access to the entire site (Disallow: /).',\n recommendation: 'Remove or modify this rule if you want your site to be indexed.',\n detectedAt: new Date().toISOString(),\n });\n }\n\n consola.debug(`Analyzed robots.txt: ${analysis.disallowedPaths.length} disallow rules`);\n } catch (error) {\n consola.error('Failed to fetch robots.txt:', error);\n analysis.issues.push({\n id: 'robots-txt-error',\n url: robotsUrl,\n category: 'technical',\n severity: 'warning',\n title: 'Failed to fetch robots.txt',\n description: `Error fetching robots.txt: ${error instanceof Error ? error.message : 'Unknown error'}`,\n recommendation: 'Ensure robots.txt is accessible.',\n detectedAt: new Date().toISOString(),\n });\n }\n\n return analysis;\n}\n\n/**\n * Check if a URL is allowed by robots.txt\n */\nexport async function isUrlAllowed(\n siteUrl: string,\n url: string,\n userAgent = 'Googlebot'\n): Promise<boolean> {\n const robotsUrl = new URL('/robots.txt', siteUrl).href;\n\n try {\n const response = await fetch(robotsUrl);\n if (!response.ok) return true; // No robots.txt = allow all\n\n const content = await response.text();\n const robots = robotsParser(robotsUrl, content);\n\n return robots.isAllowed(url, userAgent) ?? true;\n } catch {\n return true; // Error fetching = allow\n }\n}\n","/**\n * @djangocfg/seo - Sitemap Validator\n * Validate XML sitemaps\n */\n\nimport { load } from 'cheerio';\nimport consola from 'consola';\nimport type { SeoIssue } from '../types/index.js';\n\nexport interface SitemapAnalysis {\n url: string;\n exists: boolean;\n type: 'sitemap' | 'sitemap-index' | 'unknown';\n urls: string[];\n childSitemaps: string[];\n lastmod?: string;\n issues: SeoIssue[];\n}\n\n/**\n * Analyze a sitemap URL\n */\nexport async function analyzeSitemap(sitemapUrl: string): Promise<SitemapAnalysis> {\n const analysis: SitemapAnalysis = {\n url: sitemapUrl,\n exists: false,\n type: 'unknown',\n urls: [],\n childSitemaps: [],\n issues: [],\n };\n\n try {\n const response = await fetch(sitemapUrl, {\n headers: {\n Accept: 'application/xml, text/xml, */*',\n },\n });\n\n if (!response.ok) {\n analysis.issues.push({\n id: `sitemap-not-found-${hash(sitemapUrl)}`,\n url: sitemapUrl,\n category: 'technical',\n severity: 'error',\n title: 'Sitemap not accessible',\n description: `Sitemap returned HTTP ${response.status}.`,\n recommendation: 'Ensure the sitemap URL is correct and accessible.',\n detectedAt: new Date().toISOString(),\n metadata: { statusCode: response.status },\n });\n return analysis;\n }\n\n analysis.exists = true;\n const content = await response.text();\n\n // Check content type\n const contentType = response.headers.get('content-type') || '';\n if (!contentType.includes('xml') && !content.trim().startsWith('<?xml')) {\n analysis.issues.push({\n id: `sitemap-not-xml-${hash(sitemapUrl)}`,\n url: sitemapUrl,\n category: 'technical',\n severity: 'warning',\n title: 'Sitemap is not XML',\n description: 'The sitemap does not have an XML content type.',\n recommendation: 'Ensure sitemap is served with Content-Type: application/xml.',\n detectedAt: new Date().toISOString(),\n metadata: { contentType },\n });\n }\n\n // Parse XML\n const $ = load(content, { xmlMode: true });\n\n // Check if it's a sitemap index\n const sitemapIndex = $('sitemapindex');\n if (sitemapIndex.length > 0) {\n analysis.type = 'sitemap-index';\n\n $('sitemap').each((_, el) => {\n const loc = $('loc', el).text().trim();\n if (loc) {\n analysis.childSitemaps.push(loc);\n }\n });\n\n consola.debug(`Sitemap index contains ${analysis.childSitemaps.length} sitemaps`);\n } else {\n analysis.type = 'sitemap';\n\n $('url').each((_, el) => {\n const loc = $('loc', el).text().trim();\n if (loc) {\n analysis.urls.push(loc);\n }\n });\n\n const lastmod = $('url lastmod').first().text().trim();\n if (lastmod) {\n analysis.lastmod = lastmod;\n }\n\n consola.debug(`Sitemap contains ${analysis.urls.length} URLs`);\n }\n\n // Validate sitemap content\n if (analysis.type === 'sitemap' && analysis.urls.length === 0) {\n analysis.issues.push({\n id: `sitemap-empty-${hash(sitemapUrl)}`,\n url: sitemapUrl,\n category: 'technical',\n severity: 'warning',\n title: 'Sitemap is empty',\n description: 'The sitemap contains no URLs.',\n recommendation: 'Add URLs to your sitemap or remove it if not needed.',\n detectedAt: new Date().toISOString(),\n });\n }\n\n // Check for too many URLs (Google limit is 50,000)\n if (analysis.urls.length > 50000) {\n analysis.issues.push({\n id: `sitemap-too-large-${hash(sitemapUrl)}`,\n url: sitemapUrl,\n category: 'technical',\n severity: 'error',\n title: 'Sitemap exceeds URL limit',\n description: `Sitemap contains ${analysis.urls.length} URLs. Maximum is 50,000.`,\n recommendation: 'Split the sitemap into multiple files using a sitemap index.',\n detectedAt: new Date().toISOString(),\n metadata: { urlCount: analysis.urls.length },\n });\n }\n\n // Check file size (Google limit is 50MB uncompressed)\n const sizeInMB = new Blob([content]).size / (1024 * 1024);\n if (sizeInMB > 50) {\n analysis.issues.push({\n id: `sitemap-too-large-size-${hash(sitemapUrl)}`,\n url: sitemapUrl,\n category: 'technical',\n severity: 'error',\n title: 'Sitemap exceeds size limit',\n description: `Sitemap is ${sizeInMB.toFixed(2)}MB. Maximum is 50MB.`,\n recommendation: 'Split the sitemap or compress it.',\n detectedAt: new Date().toISOString(),\n metadata: { sizeMB: sizeInMB },\n });\n }\n } catch (error) {\n consola.error('Failed to analyze sitemap:', error);\n analysis.issues.push({\n id: `sitemap-error-${hash(sitemapUrl)}`,\n url: sitemapUrl,\n category: 'technical',\n severity: 'error',\n title: 'Failed to parse sitemap',\n description: `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n recommendation: 'Check sitemap validity using Google Search Console.',\n detectedAt: new Date().toISOString(),\n });\n }\n\n return analysis;\n}\n\n/**\n * Recursively analyze a sitemap and all its children\n */\nexport async function analyzeAllSitemaps(\n sitemapUrl: string,\n maxDepth = 3\n): Promise<SitemapAnalysis[]> {\n const results: SitemapAnalysis[] = [];\n const visited = new Set<string>();\n\n async function analyze(url: string, depth: number): Promise<void> {\n if (depth > maxDepth || visited.has(url)) return;\n visited.add(url);\n\n const analysis = await analyzeSitemap(url);\n results.push(analysis);\n\n // Recursively analyze child sitemaps\n for (const childUrl of analysis.childSitemaps) {\n await analyze(childUrl, depth + 1);\n }\n }\n\n await analyze(sitemapUrl, 0);\n return results;\n}\n\nfunction hash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n return Math.abs(hash).toString(36);\n}\n","#!/usr/bin/env node\n\n/**\n * @djangocfg/seo - Link Checker\n *\n * Smart link checker using linkinator with proper error handling,\n * timeout management, and filtering of problematic URLs.\n *\n * @example\n * ```typescript\n * import { checkLinks } from '@djangocfg/seo/link-checker';\n *\n * const result = await checkLinks({\n * url: 'https://example.com',\n * timeout: 60000,\n * });\n * ```\n *\n * @example CLI\n * ```bash\n * djangocfg-seo links --site https://example.com\n * # or\n * djangocfg-seo links # Interactive mode\n * ```\n */\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport * as linkinator from 'linkinator';\nimport { dirname } from 'node:path';\nimport chalk from 'chalk';\nimport type { CheckOptions } from 'linkinator';\nimport type { SeoIssue } from '../types/index.js';\n\nexport interface CheckLinksOptions {\n /** Base URL to check (defaults to NEXT_PUBLIC_SITE_URL env variable) */\n url?: string;\n /** Timeout in milliseconds (default: 60000) */\n timeout?: number;\n /** URLs to skip (regex pattern) */\n skipPattern?: string;\n /** Show only broken links (default: true) */\n showOnlyBroken?: boolean;\n /** Maximum number of concurrent requests (default: 50) */\n concurrency?: number;\n /** Output file path for report (optional) */\n outputFile?: string;\n /** Report format: 'json', 'markdown', 'text' (default: 'text') */\n reportFormat?: 'json' | 'markdown' | 'text';\n /** Verbose logging (default: true) */\n verbose?: boolean;\n}\n\nconst DEFAULT_SKIP_PATTERN = [\n 'github.com',\n 'twitter.com',\n 'linkedin.com',\n 'x.com',\n '127.0.0.1',\n 'localhost:[0-9]+',\n 'api\\\\.localhost',\n 'demo\\\\.localhost',\n 'cdn-cgi', // Cloudflare email protection\n 'mailto:', // Email links\n 'tel:', // Phone links\n 'javascript:', // JavaScript links\n].join('|');\n\nexport interface BrokenLink {\n url: string;\n status: number | string;\n reason?: string;\n isExternal: boolean;\n sourceUrl?: string;\n}\n\nexport interface CheckLinksResult {\n success: boolean;\n broken: number;\n total: number;\n errors: BrokenLink[];\n /** Internal broken links (same domain) */\n internalErrors: BrokenLink[];\n /** External broken links (different domain) */\n externalErrors: BrokenLink[];\n url: string;\n timestamp: string;\n duration?: number;\n}\n\n/**\n * Get site URL from options or environment variable\n */\nfunction getSiteUrl(options: CheckLinksOptions): string {\n if (options.url) {\n return options.url;\n }\n\n // Try environment variables\n const envUrl =\n process.env.NEXT_PUBLIC_SITE_URL ||\n process.env.SITE_URL ||\n process.env.BASE_URL;\n\n if (envUrl) {\n return envUrl;\n }\n\n throw new Error(\n 'URL is required. Provide it via options.url or set NEXT_PUBLIC_SITE_URL environment variable.'\n );\n}\n\n/**\n * Check if URL is external (different domain)\n */\nfunction isExternalUrl(linkUrl: string, baseUrl: string): boolean {\n try {\n const link = new URL(linkUrl);\n const base = new URL(baseUrl);\n return link.hostname !== base.hostname;\n } catch {\n return true;\n }\n}\n\n/**\n * Check all links on a website\n */\nexport async function checkLinks(options: CheckLinksOptions): Promise<CheckLinksResult> {\n const url = getSiteUrl(options);\n const {\n timeout = 60000,\n skipPattern = DEFAULT_SKIP_PATTERN,\n showOnlyBroken = true,\n concurrency = 50,\n outputFile,\n reportFormat = 'text',\n verbose = true,\n } = options;\n\n const startTime = Date.now();\n\n if (verbose) {\n console.log(chalk.cyan(`\\n🔍 Starting link check for: ${chalk.bold(url)}`));\n console.log(chalk.dim(` Timeout: ${timeout}ms | Concurrency: ${concurrency}`));\n console.log('');\n }\n\n const skipRegex = new RegExp(skipPattern);\n\n const checkOptions: CheckOptions = {\n path: url,\n recurse: true,\n timeout,\n concurrency,\n linksToSkip: (link: string) => {\n return Promise.resolve(skipRegex.test(link));\n },\n };\n\n const broken: BrokenLink[] = [];\n const internalErrors: BrokenLink[] = [];\n const externalErrors: BrokenLink[] = [];\n let total = 0;\n\n try {\n const results = await linkinator.check(checkOptions);\n\n for (const result of results.links) {\n total++;\n const status = result.status || 0;\n const isExternal = isExternalUrl(result.url, url);\n\n if (status < 200 || status >= 400 || result.state === 'BROKEN') {\n const statusValue = status || 'TIMEOUT';\n\n // Skip TIMEOUT errors on external URLs (rate limiting, slow servers)\n if (statusValue === 'TIMEOUT' && isExternal) {\n continue;\n }\n\n const brokenLink: BrokenLink = {\n url: result.url,\n status: statusValue,\n reason: result.state === 'BROKEN' ? 'BROKEN' : undefined,\n isExternal,\n sourceUrl: result.parent,\n };\n\n broken.push(brokenLink);\n\n if (isExternal) {\n externalErrors.push(brokenLink);\n } else {\n internalErrors.push(brokenLink);\n }\n }\n }\n\n const success = internalErrors.length === 0;\n\n if (!showOnlyBroken || broken.length > 0) {\n if (success && externalErrors.length === 0) {\n console.log(`✅ All links are valid!`);\n console.log(` Checked ${total} links.`);\n } else {\n // Show internal errors first (more important)\n if (internalErrors.length > 0) {\n console.log(chalk.red(`❌ Found ${internalErrors.length} broken internal links:`));\n for (const { url: linkUrl, status, reason } of internalErrors.slice(0, 20)) {\n console.log(` [${status}] ${linkUrl}${reason ? ` (${reason})` : ''}`);\n }\n if (internalErrors.length > 20) {\n console.log(chalk.dim(` ... and ${internalErrors.length - 20} more`));\n }\n }\n\n // Show external errors (less critical)\n if (externalErrors.length > 0) {\n console.log('');\n console.log(chalk.yellow(`⚠️ Found ${externalErrors.length} broken external links:`));\n for (const { url: linkUrl, status } of externalErrors.slice(0, 10)) {\n console.log(` [${status}] ${linkUrl}`);\n }\n if (externalErrors.length > 10) {\n console.log(chalk.dim(` ... and ${externalErrors.length - 10} more`));\n }\n }\n }\n }\n\n const duration = Date.now() - startTime;\n const result: CheckLinksResult = {\n success,\n broken: broken.length,\n total,\n errors: broken,\n internalErrors,\n externalErrors,\n url,\n timestamp: new Date().toISOString(),\n duration,\n };\n\n if (outputFile) {\n await saveReport(result, outputFile, reportFormat);\n console.log(chalk.green(`\\n📄 Report saved to: ${chalk.cyan(outputFile)}`));\n }\n\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorName = error instanceof Error ? error.name : 'UnknownError';\n\n if (\n errorMessage.includes('timeout') ||\n errorMessage.includes('TimeoutError') ||\n errorName === 'TimeoutError' ||\n errorMessage.includes('aborted')\n ) {\n console.warn(chalk.yellow(`⚠️ Some links timed out after ${timeout}ms`));\n console.warn(chalk.dim(` This is normal for slow or protected URLs.`));\n if (total > 0) {\n console.warn(chalk.dim(` Checked ${total} links before timeout.`));\n }\n\n if (broken.length > 0) {\n console.log(chalk.red(`\\n❌ Found ${broken.length} broken links:`));\n for (const { url, status, reason } of broken) {\n const statusColor =\n typeof status === 'number' && status >= 500 ? chalk.red : chalk.yellow;\n console.log(\n ` ${statusColor(`[${status}]`)} ${chalk.cyan(url)}${reason ? chalk.dim(` (${reason})`) : ''}`\n );\n }\n }\n } else {\n console.error(chalk.red(`❌ Error checking links: ${errorMessage}`));\n }\n\n const duration = Date.now() - startTime;\n const result: CheckLinksResult = {\n success: internalErrors.length === 0 && total > 0,\n broken: broken.length,\n total,\n errors: broken,\n internalErrors,\n externalErrors,\n url,\n timestamp: new Date().toISOString(),\n duration,\n };\n\n if (outputFile) {\n try {\n await saveReport(result, outputFile, reportFormat);\n console.log(chalk.green(`\\n📄 Report saved to: ${chalk.cyan(outputFile)}`));\n } catch (saveError) {\n console.warn(\n chalk.yellow(\n `\\n⚠️ Failed to save report: ${saveError instanceof Error ? saveError.message : String(saveError)}`\n )\n );\n }\n }\n\n return result;\n }\n}\n\n/**\n * Convert link check results to SEO issues\n * Separates internal (critical) from external (warning) issues\n */\nexport function linkResultsToSeoIssues(result: CheckLinksResult): SeoIssue[] {\n const issues: SeoIssue[] = [];\n\n // Internal broken links are more critical\n for (const error of result.internalErrors) {\n issues.push({\n id: `broken-internal-link-${hash(error.url)}`,\n url: error.url,\n category: 'technical' as const,\n severity: typeof error.status === 'number' && error.status >= 500 ? 'critical' as const : 'error' as const,\n title: `Broken internal link: ${error.status}`,\n description: `Internal link returned ${error.status} status${error.reason ? ` (${error.reason})` : ''}.`,\n recommendation: 'Fix the internal link. This affects user experience and SEO.',\n detectedAt: result.timestamp,\n metadata: {\n status: error.status,\n reason: error.reason,\n sourceUrl: error.sourceUrl || result.url,\n isExternal: false,\n },\n });\n }\n\n // External broken links are warnings\n for (const error of result.externalErrors) {\n issues.push({\n id: `broken-external-link-${hash(error.url)}`,\n url: error.url,\n category: 'technical' as const,\n severity: 'warning' as const,\n title: `Broken external link: ${error.status}`,\n description: `External link returned ${error.status} status.`,\n recommendation: 'Consider removing or updating the external link.',\n detectedAt: result.timestamp,\n metadata: {\n status: error.status,\n reason: error.reason,\n sourceUrl: error.sourceUrl || result.url,\n isExternal: true,\n },\n });\n }\n\n return issues;\n}\n\nasync function saveReport(\n result: CheckLinksResult,\n filePath: string,\n format: 'json' | 'markdown' | 'text'\n): Promise<void> {\n const dir = dirname(filePath);\n if (dir !== '.') {\n await mkdir(dir, { recursive: true });\n }\n\n let content: string;\n\n switch (format) {\n case 'json':\n content = JSON.stringify(result, null, 2);\n break;\n\n case 'markdown':\n content = generateMarkdownReport(result);\n break;\n\n case 'text':\n default:\n content = generateTextReport(result);\n break;\n }\n\n await writeFile(filePath, content, 'utf-8');\n}\n\nfunction generateMarkdownReport(result: CheckLinksResult): string {\n const lines: string[] = [];\n\n lines.push('# Link Check Report');\n lines.push('');\n lines.push(`**URL:** ${result.url}`);\n lines.push(`**Timestamp:** ${result.timestamp}`);\n if (result.duration) {\n lines.push(`**Duration:** ${(result.duration / 1000).toFixed(2)}s`);\n }\n lines.push('');\n lines.push(\n `**Status:** ${result.success ? '✅ All links valid' : '❌ Broken links found'}`\n );\n lines.push(`**Total links:** ${result.total}`);\n lines.push(`**Broken links:** ${result.broken}`);\n lines.push('');\n\n if (result.errors.length > 0) {\n lines.push('## Broken Links');\n lines.push('');\n lines.push('| Status | URL | Reason |');\n lines.push('|--------|-----|--------|');\n for (const { url, status, reason } of result.errors) {\n lines.push(`| ${status} | ${url} | ${reason || '-'} |`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction generateTextReport(result: CheckLinksResult): string {\n const lines: string[] = [];\n\n lines.push('Link Check Report');\n lines.push('='.repeat(50));\n lines.push(`URL: ${result.url}`);\n lines.push(`Timestamp: ${result.timestamp}`);\n if (result.duration) {\n lines.push(`Duration: ${(result.duration / 1000).toFixed(2)}s`);\n }\n lines.push('');\n lines.push(\n `Status: ${result.success ? '✅ All links valid' : '❌ Broken links found'}`\n );\n lines.push(`Total links: ${result.total}`);\n lines.push(`Broken links: ${result.broken}`);\n lines.push('');\n\n if (result.errors.length > 0) {\n lines.push('Broken Links:');\n lines.push('-'.repeat(50));\n for (const { url, status, reason } of result.errors) {\n lines.push(`[${status}] ${url}${reason ? ` (${reason})` : ''}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nfunction hash(str: string): string {\n let h = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n h = (h << 5) - h + char;\n h = h & h;\n }\n return Math.abs(h).toString(36);\n}\n","/**\n * @djangocfg/seo - JSON Report Generator\n * Generate AI-friendly JSON reports\n */\n\nimport type {\n SeoReport,\n SeoIssue,\n UrlInspectionResult,\n CrawlResult,\n ReportSummary,\n Recommendation,\n IssueCategory,\n IssueSeverity,\n} from '../types/index.js';\n\nexport interface JsonReportOptions {\n includeRawData?: boolean;\n prettyPrint?: boolean;\n /** Maximum URLs to include per issue group (default: 10) */\n maxUrlsPerIssue?: number;\n}\n\n/**\n * Generate a comprehensive JSON report\n */\nexport function generateJsonReport(\n siteUrl: string,\n data: {\n issues: SeoIssue[];\n urlInspections?: UrlInspectionResult[];\n crawlResults?: CrawlResult[];\n },\n options: JsonReportOptions = {}\n): SeoReport {\n const { issues, urlInspections = [], crawlResults = [] } = data;\n const maxUrlsPerIssue = options.maxUrlsPerIssue ?? 10;\n\n // Limit issues to maxUrlsPerIssue per title group\n const limitedIssues = limitIssuesByTitle(issues, maxUrlsPerIssue);\n\n const report: SeoReport = {\n id: generateReportId(),\n siteUrl,\n generatedAt: new Date().toISOString(),\n summary: generateSummary(issues, urlInspections, crawlResults), // Use original for accurate counts\n issues: sortIssues(limitedIssues),\n urlInspections: options.includeRawData ? urlInspections.slice(0, 100) : [],\n crawlResults: options.includeRawData ? crawlResults.slice(0, 100) : [],\n recommendations: generateRecommendations(issues, maxUrlsPerIssue),\n };\n\n return report;\n}\n\n/**\n * Limit issues to maxUrls per issue title group\n */\nfunction limitIssuesByTitle(issues: SeoIssue[], maxUrls: number): SeoIssue[] {\n const byTitle = new Map<string, SeoIssue[]>();\n\n for (const issue of issues) {\n const existing = byTitle.get(issue.title) || [];\n existing.push(issue);\n byTitle.set(issue.title, existing);\n }\n\n const limited: SeoIssue[] = [];\n for (const [, group] of byTitle) {\n const sorted = group.sort((a, b) => {\n const severityOrder = { critical: 0, error: 1, warning: 2, info: 3 };\n return severityOrder[a.severity] - severityOrder[b.severity];\n });\n limited.push(...sorted.slice(0, maxUrls));\n }\n\n return limited;\n}\n\n/**\n * Generate report summary\n */\nfunction generateSummary(\n issues: SeoIssue[],\n urlInspections: UrlInspectionResult[],\n crawlResults: CrawlResult[]\n): ReportSummary {\n const totalUrls = Math.max(\n urlInspections.length,\n crawlResults.length,\n new Set(issues.map((i) => i.url)).size\n );\n\n const indexedUrls = urlInspections.filter(\n (r) => r.indexStatusResult.coverageState === 'SUBMITTED_AND_INDEXED'\n ).length;\n\n const notIndexedUrls = urlInspections.filter(\n (r) =>\n r.indexStatusResult.coverageState === 'NOT_INDEXED' ||\n r.indexStatusResult.coverageState === 'CRAWLED_CURRENTLY_NOT_INDEXED' ||\n r.indexStatusResult.coverageState === 'DISCOVERED_CURRENTLY_NOT_INDEXED'\n ).length;\n\n const issuesByCategory = issues.reduce(\n (acc, issue) => {\n acc[issue.category] = (acc[issue.category] || 0) + 1;\n return acc;\n },\n {} as Record<IssueCategory, number>\n );\n\n const issuesBySeverity = issues.reduce(\n (acc, issue) => {\n acc[issue.severity] = (acc[issue.severity] || 0) + 1;\n return acc;\n },\n {} as Record<IssueSeverity, number>\n );\n\n // Calculate health score (0-100)\n const healthScore = calculateHealthScore(issues, totalUrls);\n\n return {\n totalUrls,\n indexedUrls,\n notIndexedUrls,\n issuesByCategory,\n issuesBySeverity,\n healthScore,\n };\n}\n\n/**\n * Calculate overall SEO health score\n */\nfunction calculateHealthScore(issues: SeoIssue[], totalUrls: number): number {\n if (totalUrls === 0) return 100;\n\n const severityWeights: Record<IssueSeverity, number> = {\n critical: 10,\n error: 5,\n warning: 2,\n info: 0.5,\n };\n\n const totalPenalty = issues.reduce(\n (sum, issue) => sum + severityWeights[issue.severity],\n 0\n );\n\n // Max penalty per URL is 20 points\n const maxPenalty = totalUrls * 20;\n const penaltyRatio = Math.min(totalPenalty / maxPenalty, 1);\n\n return Math.round((1 - penaltyRatio) * 100);\n}\n\n/**\n * Generate prioritized recommendations\n */\nfunction generateRecommendations(issues: SeoIssue[], maxUrls: number = 10): Recommendation[] {\n const recommendations: Recommendation[] = [];\n const issueGroups = new Map<string, SeoIssue[]>();\n\n // Group issues by title (similar issues)\n for (const issue of issues) {\n const key = `${issue.category}:${issue.title}`;\n if (!issueGroups.has(key)) {\n issueGroups.set(key, []);\n }\n issueGroups.get(key)!.push(issue);\n }\n\n // Create recommendations for each group\n for (const [, groupedIssues] of issueGroups) {\n const firstIssue = groupedIssues[0];\n if (!firstIssue) continue;\n const severity = firstIssue.severity;\n\n const priority: 1 | 2 | 3 | 4 | 5 =\n severity === 'critical'\n ? 1\n : severity === 'error'\n ? 2\n : severity === 'warning'\n ? 3\n : 4;\n\n const impact: 'high' | 'medium' | 'low' =\n priority <= 2 ? 'high' : priority === 3 ? 'medium' : 'low';\n\n const allUrls = groupedIssues.map((i) => i.url);\n const totalCount = allUrls.length;\n const limitedUrls = allUrls.slice(0, maxUrls);\n\n recommendations.push({\n priority,\n category: firstIssue.category,\n title: firstIssue.title,\n description: totalCount > maxUrls\n ? `${firstIssue.description} (showing ${maxUrls} of ${totalCount} URLs)`\n : firstIssue.description,\n affectedUrls: limitedUrls,\n estimatedImpact: impact,\n actionItems: [firstIssue.recommendation],\n });\n }\n\n // Sort by priority\n return recommendations.sort((a, b) => a.priority - b.priority);\n}\n\n/**\n * Sort issues by severity and category\n */\nfunction sortIssues(issues: SeoIssue[]): SeoIssue[] {\n const severityOrder: Record<IssueSeverity, number> = {\n critical: 0,\n error: 1,\n warning: 2,\n info: 3,\n };\n\n return [...issues].sort((a, b) => {\n const severityDiff = severityOrder[a.severity] - severityOrder[b.severity];\n if (severityDiff !== 0) return severityDiff;\n return a.category.localeCompare(b.category);\n });\n}\n\n/**\n * Generate unique report ID\n */\nfunction generateReportId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `seo-report-${timestamp}-${random}`;\n}\n\n/**\n * Export report as JSON string\n */\nexport function exportJsonReport(report: SeoReport, pretty = true): string {\n return JSON.stringify(report, null, pretty ? 2 : 0);\n}\n\n/**\n * Generate AI-optimized schema for the report\n * This schema helps AI understand the report structure\n */\nexport const AI_REPORT_SCHEMA = {\n $schema: 'http://json-schema.org/draft-07/schema#',\n title: 'SEO Report',\n description: 'AI-friendly SEO analysis report with issues and recommendations',\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Unique report identifier' },\n siteUrl: { type: 'string', description: 'Analyzed site URL' },\n generatedAt: { type: 'string', format: 'date-time' },\n summary: {\n type: 'object',\n description: 'Quick overview of SEO health',\n properties: {\n totalUrls: { type: 'number' },\n indexedUrls: { type: 'number' },\n notIndexedUrls: { type: 'number' },\n healthScore: {\n type: 'number',\n minimum: 0,\n maximum: 100,\n description: '0-100 score, higher is better',\n },\n },\n },\n issues: {\n type: 'array',\n description: 'List of detected SEO issues sorted by severity',\n items: {\n type: 'object',\n properties: {\n severity: {\n type: 'string',\n enum: ['critical', 'error', 'warning', 'info'],\n },\n category: {\n type: 'string',\n enum: [\n 'indexing',\n 'crawling',\n 'content',\n 'technical',\n 'mobile',\n 'performance',\n 'structured-data',\n 'security',\n ],\n },\n title: { type: 'string' },\n description: { type: 'string' },\n recommendation: { type: 'string' },\n url: { type: 'string' },\n },\n },\n },\n recommendations: {\n type: 'array',\n description: 'Prioritized action items',\n items: {\n type: 'object',\n properties: {\n priority: { type: 'number', minimum: 1, maximum: 5 },\n title: { type: 'string' },\n affectedUrls: { type: 'array', items: { type: 'string' } },\n actionItems: { type: 'array', items: { type: 'string' } },\n },\n },\n },\n },\n};\n","/**\n * @djangocfg/seo - Markdown Report Generator\n * Generate human-readable Markdown reports\n */\n\nimport type { SeoReport, SeoIssue, IssueSeverity, IssueCategory } from '../types/index.js';\n\nexport interface MarkdownReportOptions {\n includeRawIssues?: boolean;\n includeUrls?: boolean;\n maxUrlsPerIssue?: number;\n}\n\n/**\n * Generate a Markdown report from SEO data\n */\nexport function generateMarkdownReport(\n report: SeoReport,\n options: MarkdownReportOptions = {}\n): string {\n const { includeRawIssues = true, includeUrls = true, maxUrlsPerIssue = 10 } = options;\n\n const lines: string[] = [];\n\n // Header\n lines.push(`# SEO Analysis Report`);\n lines.push('');\n lines.push(`**Site:** ${report.siteUrl}`);\n lines.push(`**Generated:** ${new Date(report.generatedAt).toLocaleString()}`);\n lines.push(`**Report ID:** ${report.id}`);\n lines.push('');\n\n // Summary\n lines.push('## Summary');\n lines.push('');\n lines.push(`| Metric | Value |`);\n lines.push(`|--------|-------|`);\n lines.push(`| Health Score | ${getHealthScoreEmoji(report.summary.healthScore)} **${report.summary.healthScore}/100** |`);\n lines.push(`| Total URLs | ${report.summary.totalUrls} |`);\n lines.push(`| Indexed URLs | ${report.summary.indexedUrls} |`);\n lines.push(`| Not Indexed | ${report.summary.notIndexedUrls} |`);\n lines.push('');\n\n // Issues by Severity\n lines.push('### Issues by Severity');\n lines.push('');\n const severities: IssueSeverity[] = ['critical', 'error', 'warning', 'info'];\n for (const severity of severities) {\n const count = report.summary.issuesBySeverity[severity] || 0;\n lines.push(`- ${getSeverityEmoji(severity)} **${capitalize(severity)}:** ${count}`);\n }\n lines.push('');\n\n // Issues by Category\n lines.push('### Issues by Category');\n lines.push('');\n const categories = Object.entries(report.summary.issuesByCategory).sort(\n ([, a], [, b]) => b - a\n );\n for (const [category, count] of categories) {\n lines.push(`- ${getCategoryEmoji(category as IssueCategory)} **${formatCategory(category)}:** ${count}`);\n }\n lines.push('');\n\n // Recommendations\n lines.push('## Prioritized Recommendations');\n lines.push('');\n\n for (const rec of report.recommendations) {\n lines.push(`### ${getPriorityEmoji(rec.priority)} Priority ${rec.priority}: ${rec.title}`);\n lines.push('');\n lines.push(`**Category:** ${formatCategory(rec.category)}`);\n lines.push(`**Impact:** ${capitalize(rec.estimatedImpact)}`);\n lines.push(`**Affected URLs:** ${rec.affectedUrls.length}`);\n lines.push('');\n lines.push(`${rec.description}`);\n lines.push('');\n lines.push('**Action Items:**');\n for (const action of rec.actionItems) {\n lines.push(`- ${action}`);\n }\n lines.push('');\n\n if (includeUrls && rec.affectedUrls.length > 0) {\n const urlsToShow = rec.affectedUrls.slice(0, maxUrlsPerIssue);\n lines.push('<details>');\n lines.push(`<summary>Affected URLs (${rec.affectedUrls.length})</summary>`);\n lines.push('');\n for (const url of urlsToShow) {\n lines.push(`- ${url}`);\n }\n if (rec.affectedUrls.length > maxUrlsPerIssue) {\n lines.push(`- ... and ${rec.affectedUrls.length - maxUrlsPerIssue} more`);\n }\n lines.push('</details>');\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n }\n\n // Detailed Issues\n if (includeRawIssues) {\n lines.push('## All Issues');\n lines.push('');\n\n const issuesByCategory = groupBy(report.issues, 'category');\n\n for (const [category, issues] of Object.entries(issuesByCategory)) {\n lines.push(`### ${getCategoryEmoji(category as IssueCategory)} ${formatCategory(category)}`);\n lines.push('');\n\n for (const issue of issues) {\n lines.push(\n `#### ${getSeverityEmoji(issue.severity)} ${issue.title}`\n );\n lines.push('');\n lines.push(`**URL:** \\`${issue.url}\\``);\n lines.push(`**Severity:** ${capitalize(issue.severity)}`);\n lines.push('');\n lines.push(issue.description);\n lines.push('');\n lines.push(`**Recommendation:** ${issue.recommendation}`);\n lines.push('');\n }\n }\n }\n\n // Footer\n lines.push('---');\n lines.push('');\n lines.push('*Report generated by [@djangocfg/seo](https://djangocfg.com)*');\n lines.push('');\n lines.push('> This report is designed to be processed by AI assistants for automated SEO improvements.');\n\n return lines.join('\\n');\n}\n\n/**\n * Generate a concise summary for AI consumption\n */\nexport function generateAiSummary(report: SeoReport): string {\n const lines: string[] = [];\n\n lines.push('# SEO Report Summary for AI Processing');\n lines.push('');\n lines.push('## Context');\n lines.push(`Site: ${report.siteUrl}`);\n lines.push(`Health Score: ${report.summary.healthScore}/100`);\n lines.push(`Critical Issues: ${report.summary.issuesBySeverity.critical || 0}`);\n lines.push(`Errors: ${report.summary.issuesBySeverity.error || 0}`);\n lines.push(`Warnings: ${report.summary.issuesBySeverity.warning || 0}`);\n lines.push('');\n lines.push('## Top Priority Actions');\n lines.push('');\n\n const topRecommendations = report.recommendations.slice(0, 5);\n for (let i = 0; i < topRecommendations.length; i++) {\n const rec = topRecommendations[i];\n if (!rec) continue;\n lines.push(`${i + 1}. **${rec.title}** (${rec.affectedUrls.length} URLs)`);\n lines.push(` - ${rec.actionItems[0]}`);\n }\n\n lines.push('');\n lines.push('## Issue Categories');\n lines.push('');\n\n const sortedCategories = Object.entries(report.summary.issuesByCategory)\n .sort(([, a], [, b]) => b - a);\n\n for (const [category, count] of sortedCategories) {\n lines.push(`- ${formatCategory(category)}: ${count} issues`);\n }\n\n return lines.join('\\n');\n}\n\n// Helper functions\nfunction getSeverityEmoji(severity: IssueSeverity): string {\n const emojis: Record<IssueSeverity, string> = {\n critical: '🔴',\n error: '🟠',\n warning: '🟡',\n info: '🔵',\n };\n return emojis[severity];\n}\n\nfunction getCategoryEmoji(category: IssueCategory): string {\n const emojis: Record<IssueCategory, string> = {\n indexing: '📑',\n crawling: '🕷️',\n content: '📝',\n technical: '⚙️',\n mobile: '📱',\n performance: '⚡',\n 'structured-data': '🏷️',\n security: '🔒',\n };\n return emojis[category] || '📋';\n}\n\nfunction getPriorityEmoji(priority: number): string {\n const emojis: Record<number, string> = {\n 1: '🚨',\n 2: '⚠️',\n 3: '📌',\n 4: '💡',\n 5: 'ℹ️',\n };\n return emojis[priority] || '📋';\n}\n\nfunction getHealthScoreEmoji(score: number): string {\n if (score >= 90) return '🟢';\n if (score >= 70) return '🟡';\n if (score >= 50) return '🟠';\n return '🔴';\n}\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction formatCategory(category: string): string {\n return category\n .split('-')\n .map(capitalize)\n .join(' ');\n}\n\nfunction groupBy<T>(array: T[], key: keyof T): Record<string, T[]> {\n return array.reduce(\n (acc, item) => {\n const groupKey = String(item[key]);\n if (!acc[groupKey]) {\n acc[groupKey] = [];\n }\n acc[groupKey].push(item);\n return acc;\n },\n {} as Record<string, T[]>\n );\n}\n","/**\n * @djangocfg/seo - Split Report Generator\n * Generates AI-friendly split reports (max 1000 lines each)\n */\n\nimport { writeFileSync, mkdirSync, existsSync, rmSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SeoReport, SeoIssue, IssueCategory, IssueSeverity } from '../types/index.js';\n\nconst MAX_LINES = 1000;\n\nexport interface SplitReportOptions {\n outputDir: string;\n /** Clear output directory before generating */\n clearOutputDir?: boolean;\n}\n\nexport interface SplitReportResult {\n indexFile: string;\n categoryFiles: string[];\n totalFiles: number;\n}\n\n/**\n * Generate split reports for AI processing\n */\nexport function generateSplitReports(\n report: SeoReport,\n options: SplitReportOptions\n): SplitReportResult {\n const { outputDir, clearOutputDir = true } = options;\n\n // Clear output directory\n if (clearOutputDir && existsSync(outputDir)) {\n const files = readdirSync(outputDir);\n for (const file of files) {\n if (file.startsWith('seo-') && file.endsWith('.md')) {\n rmSync(join(outputDir, file), { force: true });\n }\n }\n }\n\n // Ensure output directory exists\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);\n const siteName = new URL(report.siteUrl).hostname.replace(/\\./g, '-');\n const prefix = `seo-${siteName}-${timestamp}`;\n\n const categoryFiles: string[] = [];\n\n // Group issues by category\n const issuesByCategory = groupIssuesByCategory(report.issues);\n const categories = Object.keys(issuesByCategory) as IssueCategory[];\n\n // Generate category files\n for (const category of categories) {\n const issues = issuesByCategory[category] || [];\n if (issues.length === 0) continue;\n\n const chunks = splitIntoChunks(issues, category);\n\n for (let i = 0; i < chunks.length; i++) {\n const suffix = chunks.length > 1 ? `-${i + 1}` : '';\n const filename = `${prefix}-${category}${suffix}.md`;\n const filepath = join(outputDir, filename);\n\n const chunk = chunks[i];\n if (!chunk) continue;\n const content = generateCategoryFile(report.siteUrl, category, chunk, {\n part: chunks.length > 1 ? i + 1 : undefined,\n totalParts: chunks.length > 1 ? chunks.length : undefined,\n });\n\n writeFileSync(filepath, content, 'utf-8');\n categoryFiles.push(filename);\n }\n }\n\n // Generate index file\n const indexFilename = `${prefix}-index.md`;\n const indexFilepath = join(outputDir, indexFilename);\n const indexContent = generateIndexFile(report, categoryFiles);\n writeFileSync(indexFilepath, indexContent, 'utf-8');\n\n return {\n indexFile: indexFilename,\n categoryFiles,\n totalFiles: categoryFiles.length + 1,\n };\n}\n\n/**\n * Generate compact index file\n */\nfunction generateIndexFile(report: SeoReport, categoryFiles: string[]): string {\n const lines: string[] = [];\n\n lines.push('# SEO Report Index');\n lines.push('');\n lines.push(`Site: ${report.siteUrl}`);\n lines.push(`Score: ${report.summary.healthScore}/100`);\n lines.push(`Date: ${report.generatedAt.slice(0, 10)}`);\n lines.push('');\n\n // Severity counts\n lines.push('## Issues');\n lines.push('');\n lines.push('| Severity | Count |');\n lines.push('|----------|-------|');\n const severities: IssueSeverity[] = ['critical', 'error', 'warning', 'info'];\n for (const sev of severities) {\n const count = report.summary.issuesBySeverity[sev] || 0;\n if (count > 0) {\n lines.push(`| ${sev} | ${count} |`);\n }\n }\n lines.push('');\n\n // Top 10 recommendations (compact)\n lines.push('## Actions');\n lines.push('');\n const topRecs = report.recommendations.slice(0, 10);\n for (let i = 0; i < topRecs.length; i++) {\n const rec = topRecs[i];\n if (!rec) continue;\n lines.push(`${i + 1}. **${rec.title}** (${rec.affectedUrls.length})`);\n lines.push(` ${rec.actionItems[0]}`);\n }\n lines.push('');\n\n // File index\n lines.push('## Files');\n lines.push('');\n for (const file of categoryFiles) {\n lines.push(`- [${file}](./${file})`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate compact category file\n */\nfunction generateCategoryFile(\n siteUrl: string,\n category: IssueCategory,\n issues: SeoIssue[],\n opts: { part?: number; totalParts?: number }\n): string {\n const lines: string[] = [];\n const partStr = opts.part ? ` (Part ${opts.part}/${opts.totalParts})` : '';\n\n lines.push(`# ${formatCategory(category)}${partStr}`);\n lines.push('');\n lines.push(`Site: ${siteUrl}`);\n lines.push(`Issues: ${issues.length}`);\n lines.push('');\n\n // Group by title for compact display\n const byTitle = new Map<string, SeoIssue[]>();\n for (const issue of issues) {\n const group = byTitle.get(issue.title) || [];\n group.push(issue);\n byTitle.set(issue.title, group);\n }\n\n for (const [title, groupIssues] of byTitle) {\n const first = groupIssues[0];\n if (!first) continue;\n\n lines.push(`## ${title}`);\n lines.push('');\n lines.push(`Severity: ${first.severity}`);\n lines.push(`Count: ${groupIssues.length}`);\n lines.push('');\n lines.push(`> ${first.recommendation}`);\n lines.push('');\n\n // Compact URL list\n lines.push('URLs:');\n for (const issue of groupIssues.slice(0, 20)) {\n lines.push(`- ${issue.url}`);\n }\n if (groupIssues.length > 20) {\n lines.push(`- ... +${groupIssues.length - 20} more`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Split issues into chunks that fit within MAX_LINES\n */\nfunction splitIntoChunks(issues: SeoIssue[], category: IssueCategory): SeoIssue[][] {\n // Estimate lines per issue group (title + severity + recommendation + URLs)\n const byTitle = new Map<string, SeoIssue[]>();\n for (const issue of issues) {\n const group = byTitle.get(issue.title) || [];\n group.push(issue);\n byTitle.set(issue.title, group);\n }\n\n const chunks: SeoIssue[][] = [];\n let currentChunk: SeoIssue[] = [];\n let currentLines = 10; // Header overhead\n\n for (const [, groupIssues] of byTitle) {\n // Estimate: 6 lines header + min(20, count) URLs + 2 spacing\n const urlCount = Math.min(20, groupIssues.length);\n const groupLines = 8 + urlCount;\n\n if (currentLines + groupLines > MAX_LINES && currentChunk.length > 0) {\n chunks.push(currentChunk);\n currentChunk = [];\n currentLines = 10;\n }\n\n currentChunk.push(...groupIssues);\n currentLines += groupLines;\n }\n\n if (currentChunk.length > 0) {\n chunks.push(currentChunk);\n }\n\n return chunks.length > 0 ? chunks : [[]];\n}\n\nfunction groupIssuesByCategory(issues: SeoIssue[]): Record<IssueCategory, SeoIssue[]> {\n const result: Partial<Record<IssueCategory, SeoIssue[]>> = {};\n\n for (const issue of issues) {\n if (!result[issue.category]) {\n result[issue.category] = [];\n }\n result[issue.category]!.push(issue);\n }\n\n return result as Record<IssueCategory, SeoIssue[]>;\n}\n\nfunction formatCategory(category: string): string {\n return category\n .split('-')\n .map(s => s.charAt(0).toUpperCase() + s.slice(1))\n .join(' ');\n}\n","/**\n * @djangocfg/seo - CLAUDE.md Generator\n * Generates AI context file with package docs and current audit state\n */\n\nimport type { SeoReport } from '../types/index.js';\n\n/**\n * Generate CLAUDE.md content for AI context\n */\nexport function generateClaudeContext(report: SeoReport): string {\n const lines: string[] = [];\n\n // Package docs (static)\n lines.push('# @djangocfg/seo');\n lines.push('');\n lines.push('SEO audit toolkit. Generates AI-optimized split reports (max 1000 lines each).');\n lines.push('');\n lines.push('## Commands');\n lines.push('');\n lines.push('```bash');\n lines.push('# Audit (HTTP-based, crawls live site)');\n lines.push('pnpm seo:audit # Full audit (split reports)');\n lines.push('pnpm seo:audit --env dev # Audit local dev');\n lines.push('pnpm seo:audit --format all # All formats');\n lines.push('');\n lines.push('# Content (file-based, scans MDX/content/)');\n lines.push('pnpm exec djangocfg-seo content check # Check MDX links');\n lines.push('pnpm exec djangocfg-seo content fix # Show fixable links');\n lines.push('pnpm exec djangocfg-seo content fix --fix # Apply fixes');\n lines.push('pnpm exec djangocfg-seo content sitemap # Generate sitemap.ts');\n lines.push('```');\n lines.push('');\n lines.push('## Options');\n lines.push('');\n lines.push('- `--env, -e` - prod (default) or dev');\n lines.push('- `--site, -s` - Site URL (overrides env)');\n lines.push('- `--output, -o` - Output directory');\n lines.push('- `--format, -f` - split (default), json, markdown, ai-summary, all');\n lines.push('- `--max-pages` - Max pages (default: 100)');\n lines.push('- `--service-account` - Google service account JSON path');\n lines.push('- `--content-dir` - Content directory (default: content/)');\n lines.push('- `--base-path` - Base URL path for docs (default: /docs)');\n lines.push('');\n lines.push('## Reports');\n lines.push('');\n lines.push('- `seo-*-index.md` - Summary + links to categories');\n lines.push('- `seo-*-technical.md` - Broken links, sitemap issues');\n lines.push('- `seo-*-content.md` - H1, meta, title issues');\n lines.push('- `seo-*-performance.md` - Load time, TTFB issues');\n lines.push('- `seo-ai-summary-*.md` - Quick overview');\n lines.push('');\n\n // Issue types - important for AI to understand priorities\n lines.push('## Issue Severity');\n lines.push('');\n lines.push('- **critical** - Blocks indexing (fix immediately)');\n lines.push('- **error** - SEO problems (high priority)');\n lines.push('- **warning** - Recommendations (medium priority)');\n lines.push('- **info** - Best practices (low priority)');\n lines.push('');\n lines.push('## Issue Categories');\n lines.push('');\n lines.push('- **technical** - Broken links, sitemap, robots.txt');\n lines.push('- **content** - Missing H1, meta description, title');\n lines.push('- **indexing** - Not indexed, crawl errors from GSC');\n lines.push('- **performance** - Slow load time (>3s), high TTFB (>800ms)');\n lines.push('');\n\n // Routes info\n lines.push('## Routes Scanner');\n lines.push('');\n lines.push('Scans Next.js App Router `app/` directory. Handles:');\n lines.push('- Route groups `(group)` - ignored in URL');\n lines.push('- Dynamic `[slug]` - shown as `:slug`');\n lines.push('- Catch-all `[...slug]` - shown as `:...slug`');\n lines.push('- Parallel `@folder` - skipped');\n lines.push('- Private `_folder` - skipped');\n lines.push('');\n\n // SEO files setup\n lines.push('## SEO Files (Next.js App Router)');\n lines.push('');\n lines.push('**Required files in `app/`:**');\n lines.push('');\n lines.push('### sitemap.xml/route.ts');\n lines.push('```typescript');\n lines.push(\"import { createSitemapHandler } from '@djangocfg/nextjs/sitemap';\");\n lines.push('');\n lines.push('export const dynamic = \"force-static\";');\n lines.push('export const { GET } = createSitemapHandler({');\n lines.push(' siteUrl,');\n lines.push(' staticPages: [');\n lines.push(' { loc: \"/\", priority: 1.0, changefreq: \"daily\" },');\n lines.push(' { loc: \"/about\", priority: 0.8 },');\n lines.push(' ],');\n lines.push(' dynamicPages: async () => fetchPagesFromAPI(),');\n lines.push('});');\n lines.push('```');\n lines.push('');\n lines.push('### robots.ts');\n lines.push('```typescript');\n lines.push(\"import type { MetadataRoute } from 'next';\");\n lines.push('');\n lines.push('export default function robots(): MetadataRoute.Robots {');\n lines.push(' return {');\n lines.push(' rules: { userAgent: \"*\", allow: \"/\" },');\n lines.push(' sitemap: `${siteUrl}/sitemap.xml`,');\n lines.push(' };');\n lines.push('}');\n lines.push('```');\n lines.push('');\n lines.push('### Cloudflare Override');\n lines.push('');\n lines.push('If robots.txt shows \"Content-Signal\" or \"ai-train\" — Cloudflare is overriding your file.');\n lines.push('**Fix:** Dashboard → Security → Settings → \"Manage your robots.txt\" → Set to \"Off\"');\n lines.push('');\n lines.push('### Declarative Routes with SEO');\n lines.push('');\n lines.push('Create `app/_routes/` with SEO metadata for sitemap:');\n lines.push('```typescript');\n lines.push(\"import { defineRoute } from '@djangocfg/nextjs/navigation';\");\n lines.push('');\n lines.push(\"export const home = defineRoute('/', {\");\n lines.push(\" label: 'Home',\");\n lines.push(' protected: false,');\n lines.push(' priority: 1.0, // Sitemap priority 0.0-1.0');\n lines.push(\" changefreq: 'daily', // always|hourly|daily|weekly|monthly|yearly|never\");\n lines.push(' noindex: false, // Exclude from sitemap');\n lines.push('});');\n lines.push('');\n lines.push('export const staticRoutes = [home, about, contact];');\n lines.push('```');\n lines.push('');\n lines.push('Then in `sitemap.xml/route.ts`:');\n lines.push('```typescript');\n lines.push(\"import { routes } from '@/app/_routes';\");\n lines.push('routes.getAllStaticRoutes().filter(r => !r.metadata.noindex)');\n lines.push('```');\n lines.push('');\n\n // Link guidelines\n lines.push('## Link Guidelines');\n lines.push('');\n lines.push('### Nextra/MDX Projects (content/)');\n lines.push('');\n lines.push('For non-index files (e.g., `overview.mdx`):');\n lines.push('- **Sibling file**: `../sibling` (one level up)');\n lines.push('- **Other section**: `/docs/full/path` (absolute)');\n lines.push('- **AVOID**: `./sibling` (browser adds filename to path!)');\n lines.push('- **AVOID**: `../../deep/path` (hard to maintain)');\n lines.push('');\n lines.push('For index files (e.g., `index.mdx`):');\n lines.push('- **Child file**: `./child` works correctly');\n lines.push('- **Sibling folder**: `../sibling/` or absolute');\n lines.push('');\n lines.push('### Next.js App Router Projects');\n lines.push('');\n lines.push('Use declarative routes from `_routes/`:');\n lines.push('```typescript');\n lines.push('import { routes } from \"@/app/_routes\";');\n lines.push('<Link href={routes.dashboard.machines}>Machines</Link>');\n lines.push('```');\n lines.push('');\n lines.push('Benefits: type-safe, refactor-friendly, centralized.');\n lines.push('');\n\n // Current audit state (dynamic)\n lines.push('---');\n lines.push('');\n lines.push('## Current Audit');\n lines.push('');\n lines.push(`Site: ${report.siteUrl}`);\n lines.push(`Score: ${report.summary.healthScore}/100`);\n lines.push(`Date: ${report.generatedAt.slice(0, 10)}`);\n lines.push('');\n\n // Issue summary\n lines.push('### Issues');\n lines.push('');\n const { critical = 0, error = 0, warning = 0, info = 0 } = report.summary.issuesBySeverity;\n if (critical > 0) lines.push(`- Critical: ${critical}`);\n if (error > 0) lines.push(`- Error: ${error}`);\n if (warning > 0) lines.push(`- Warning: ${warning}`);\n if (info > 0) lines.push(`- Info: ${info}`);\n lines.push('');\n\n // Top 5 actions\n lines.push('### Top Actions');\n lines.push('');\n const topRecs = report.recommendations.slice(0, 5);\n for (let i = 0; i < topRecs.length; i++) {\n const rec = topRecs[i];\n if (!rec) continue;\n lines.push(`${i + 1}. **${rec.title}** (${rec.affectedUrls.length} URLs)`);\n }\n lines.push('');\n\n // Report files in this directory\n lines.push('### Report Files');\n lines.push('');\n lines.push('See split reports in this directory:');\n lines.push('- `seo-*-index.md` - Start here');\n lines.push('- `seo-*-technical.md` - Technical issues');\n lines.push('- `seo-*-content.md` - Content issues');\n lines.push('- `seo-*-performance.md` - Performance issues');\n lines.push('');\n\n return lines.join('\\n');\n}\n","/**\n * @djangocfg/seo - Report Generator\n * Main report generation orchestrator\n */\n\nimport { writeFileSync, mkdirSync, existsSync, rmSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport consola from 'consola';\nimport { generateJsonReport, exportJsonReport } from './json-report.js';\nimport { generateMarkdownReport, generateAiSummary } from './markdown-report.js';\nimport { generateSplitReports } from './split-report.js';\nimport { generateClaudeContext } from './claude-context.js';\nimport type {\n SeoReport,\n SeoIssue,\n UrlInspectionResult,\n CrawlResult,\n IssueCategory,\n IssueSeverity,\n} from '../types/index.js';\n\nexport interface ReportGeneratorOptions {\n outputDir: string;\n formats: ('json' | 'markdown' | 'ai-summary' | 'split')[];\n includeRawData?: boolean;\n timestamp?: boolean;\n /** Clear output directory before generating reports */\n clearOutputDir?: boolean;\n /** Maximum URLs to show per issue group (default: 10) */\n maxUrlsPerIssue?: number;\n}\n\nexport interface GeneratedReports {\n report: SeoReport;\n files: {\n json?: string;\n markdown?: string;\n aiSummary?: string;\n split?: {\n index: string;\n categories: string[];\n };\n };\n}\n\n/**\n * Generate and save SEO reports\n */\nexport async function generateAndSaveReports(\n siteUrl: string,\n data: {\n issues: SeoIssue[];\n urlInspections?: UrlInspectionResult[];\n crawlResults?: CrawlResult[];\n },\n options: ReportGeneratorOptions\n): Promise<GeneratedReports> {\n const {\n outputDir,\n formats,\n includeRawData = false,\n timestamp = true,\n clearOutputDir = true,\n maxUrlsPerIssue = 10,\n } = options;\n\n // Clear output directory if requested\n if (clearOutputDir && existsSync(outputDir)) {\n try {\n const files = readdirSync(outputDir);\n for (const file of files) {\n if (file.startsWith('seo-')) {\n rmSync(join(outputDir, file), { force: true });\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n // Ensure output directory exists\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Generate the report\n const report = generateJsonReport(siteUrl, data, { includeRawData, maxUrlsPerIssue });\n\n const result: GeneratedReports = {\n report,\n files: {},\n };\n\n // Generate timestamp for filenames\n const ts = timestamp\n ? `-${new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19)}`\n : '';\n const siteName = new URL(siteUrl).hostname.replace(/\\./g, '-');\n\n // Generate JSON report\n if (formats.includes('json')) {\n const filename = `seo-report-${siteName}${ts}.json`;\n const filepath = join(outputDir, filename);\n const content = exportJsonReport(report, true);\n writeFileSync(filepath, content, 'utf-8');\n result.files.json = filepath;\n consola.success(`JSON report saved: ${filepath}`);\n }\n\n // Generate Markdown report\n if (formats.includes('markdown')) {\n const filename = `seo-report-${siteName}${ts}.md`;\n const filepath = join(outputDir, filename);\n const content = generateMarkdownReport(report, {\n includeRawIssues: true,\n includeUrls: true,\n });\n writeFileSync(filepath, content, 'utf-8');\n result.files.markdown = filepath;\n consola.success(`Markdown report saved: ${filepath}`);\n }\n\n // Generate AI summary\n if (formats.includes('ai-summary')) {\n const filename = `seo-ai-summary-${siteName}${ts}.md`;\n const filepath = join(outputDir, filename);\n const content = generateAiSummary(report);\n writeFileSync(filepath, content, 'utf-8');\n result.files.aiSummary = filepath;\n consola.success(`AI summary saved: ${filepath}`);\n }\n\n // Generate split reports (AI-optimized, max 1000 lines each)\n if (formats.includes('split')) {\n const splitResult = generateSplitReports(report, {\n outputDir,\n clearOutputDir: false, // Already cleared above\n });\n result.files.split = {\n index: join(outputDir, splitResult.indexFile),\n categories: splitResult.categoryFiles.map(f => join(outputDir, f)),\n };\n consola.success(`Split reports saved: ${splitResult.totalFiles} files (index + ${splitResult.categoryFiles.length} categories)`);\n }\n\n // Always generate CLAUDE.md for AI context\n const claudeContent = generateClaudeContext(report);\n const claudeFilepath = join(outputDir, 'CLAUDE.md');\n writeFileSync(claudeFilepath, claudeContent, 'utf-8');\n consola.success(`AI context saved: ${claudeFilepath}`);\n\n return result;\n}\n\n/**\n * Print report summary to console\n */\nexport function printReportSummary(report: SeoReport): void {\n consola.box(\n `SEO Report: ${report.siteUrl}\\n` +\n `Health Score: ${report.summary.healthScore}/100\\n` +\n `Total URLs: ${report.summary.totalUrls}\\n` +\n `Indexed: ${report.summary.indexedUrls} | Not Indexed: ${report.summary.notIndexedUrls}\\n` +\n `Issues: ${report.issues.length}`\n );\n\n if (report.summary.issuesBySeverity.critical) {\n consola.error(`Critical issues: ${report.summary.issuesBySeverity.critical}`);\n }\n if (report.summary.issuesBySeverity.error) {\n consola.warn(`Errors: ${report.summary.issuesBySeverity.error}`);\n }\n if (report.summary.issuesBySeverity.warning) {\n consola.info(`Warnings: ${report.summary.issuesBySeverity.warning}`);\n }\n\n consola.log('');\n consola.info('Top recommendations:');\n for (const rec of report.recommendations.slice(0, 3)) {\n consola.log(` ${rec.priority}. ${rec.title} (${rec.affectedUrls.length} URLs)`);\n }\n}\n\n/**\n * Merge multiple reports into one\n */\nexport function mergeReports(reports: SeoReport[]): SeoReport {\n if (reports.length === 0) {\n throw new Error('Cannot merge empty reports array');\n }\n\n const merged: SeoReport = {\n id: `merged-${Date.now().toString(36)}`,\n siteUrl: reports.map((r) => r.siteUrl).join(', '),\n generatedAt: new Date().toISOString(),\n summary: {\n totalUrls: reports.reduce((sum, r) => sum + r.summary.totalUrls, 0),\n indexedUrls: reports.reduce((sum, r) => sum + r.summary.indexedUrls, 0),\n notIndexedUrls: reports.reduce((sum, r) => sum + r.summary.notIndexedUrls, 0),\n issuesByCategory: {} as any,\n issuesBySeverity: {} as any,\n healthScore: Math.round(\n reports.reduce((sum, r) => sum + r.summary.healthScore, 0) / reports.length\n ),\n },\n issues: reports.flatMap((r) => r.issues),\n urlInspections: reports.flatMap((r) => r.urlInspections),\n crawlResults: reports.flatMap((r) => r.crawlResults),\n recommendations: [],\n };\n\n // Merge issue counts\n for (const report of reports) {\n for (const [category, count] of Object.entries(report.summary.issuesByCategory)) {\n const cat = category as IssueCategory;\n merged.summary.issuesByCategory[cat] =\n (merged.summary.issuesByCategory[cat] || 0) + count;\n }\n for (const [severity, count] of Object.entries(report.summary.issuesBySeverity)) {\n const sev = severity as IssueSeverity;\n merged.summary.issuesBySeverity[sev] =\n (merged.summary.issuesBySeverity[sev] || 0) + count;\n }\n }\n\n // Merge and deduplicate recommendations\n const recMap = new Map<string, typeof merged.recommendations[0]>();\n for (const report of reports) {\n for (const rec of report.recommendations) {\n const key = `${rec.category}:${rec.title}`;\n if (recMap.has(key)) {\n const existing = recMap.get(key)!;\n existing.affectedUrls.push(...rec.affectedUrls);\n } else {\n recMap.set(key, { ...rec, affectedUrls: [...rec.affectedUrls] });\n }\n }\n }\n merged.recommendations = Array.from(recMap.values()).sort(\n (a, b) => a.priority - b.priority\n );\n\n return merged;\n}\n","/**\n * @djangocfg/seo - Next.js App Router Scanner\n * Scans app/ directory to extract all routes\n */\n\nimport { readdirSync, statSync, existsSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\nexport interface RouteInfo {\n /** Route path (e.g., /blog/[slug]) */\n path: string;\n /** File path relative to app/ */\n filePath: string;\n /** Route type */\n type: 'page' | 'api' | 'layout' | 'loading' | 'error';\n /** Is dynamic route */\n isDynamic: boolean;\n /** Dynamic segments (e.g., ['slug', '...path']) */\n dynamicSegments: string[];\n /** Is catch-all route */\n isCatchAll: boolean;\n /** Is optional catch-all route */\n isOptionalCatchAll: boolean;\n /** Route group (if any) */\n routeGroup?: string;\n}\n\nexport interface ScanResult {\n /** All discovered routes */\n routes: RouteInfo[];\n /** Static routes (no dynamic segments) */\n staticRoutes: RouteInfo[];\n /** Dynamic routes (with [param]) */\n dynamicRoutes: RouteInfo[];\n /** API routes */\n apiRoutes: RouteInfo[];\n /** App directory path */\n appDir: string;\n}\n\nexport interface ScanOptions {\n /** Path to app directory */\n appDir?: string;\n /** Include API routes */\n includeApi?: boolean;\n /** Include layouts, loading, error pages */\n includeSpecial?: boolean;\n}\n\nconst PAGE_FILES = ['page.tsx', 'page.ts', 'page.jsx', 'page.js'];\nconst ROUTE_FILES = ['route.tsx', 'route.ts', 'route.jsx', 'route.js'];\nconst SPECIAL_FILES = ['layout', 'loading', 'error', 'not-found', 'template'];\n\n/**\n * Find app directory by searching common locations\n */\nexport function findAppDir(startDir: string = process.cwd()): string | null {\n const candidates = [\n join(startDir, 'app'),\n join(startDir, 'src', 'app'),\n ];\n\n for (const dir of candidates) {\n if (existsSync(dir) && statSync(dir).isDirectory()) {\n return dir;\n }\n }\n\n return null;\n}\n\n/**\n * Scan Next.js app directory for routes\n */\nexport function scanRoutes(options: ScanOptions = {}): ScanResult {\n const {\n appDir = findAppDir() || './app',\n includeApi = true,\n includeSpecial = false,\n } = options;\n\n if (!existsSync(appDir)) {\n throw new Error(`App directory not found: ${appDir}`);\n }\n\n const routes: RouteInfo[] = [];\n\n scanDirectory(appDir, '', routes, { includeApi, includeSpecial });\n\n return {\n routes,\n staticRoutes: routes.filter(r => !r.isDynamic && r.type === 'page'),\n dynamicRoutes: routes.filter(r => r.isDynamic && r.type === 'page'),\n apiRoutes: routes.filter(r => r.type === 'api'),\n appDir,\n };\n}\n\nfunction scanDirectory(\n dir: string,\n routePath: string,\n routes: RouteInfo[],\n options: { includeApi: boolean; includeSpecial: boolean }\n): void {\n let entries: string[];\n\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n\n let stat;\n try {\n stat = statSync(fullPath);\n } catch {\n continue;\n }\n\n if (stat.isDirectory()) {\n // Skip private folders\n if (entry.startsWith('_') || entry.startsWith('.')) continue;\n\n // Handle route groups (folder)\n if (entry.startsWith('(') && entry.endsWith(')')) {\n // Route groups don't add to URL path\n scanDirectory(fullPath, routePath, routes, options);\n continue;\n }\n\n // Handle parallel routes @folder\n if (entry.startsWith('@')) {\n // Parallel routes don't add to URL path\n scanDirectory(fullPath, routePath, routes, options);\n continue;\n }\n\n // Handle intercepting routes (.)folder, (..)folder, (...)folder\n if (entry.startsWith('(') && !entry.endsWith(')')) {\n continue; // Skip intercepting routes for now\n }\n\n // Build new route path\n const segment = processSegment(entry);\n const newRoutePath = routePath + '/' + segment.urlSegment;\n\n scanDirectory(fullPath, newRoutePath, routes, options);\n } else if (stat.isFile()) {\n // Check for page files\n if (PAGE_FILES.includes(entry)) {\n const route = createRouteInfo(routePath || '/', dir, 'page');\n routes.push(route);\n }\n\n // Check for API route files\n if (options.includeApi && ROUTE_FILES.includes(entry)) {\n const route = createRouteInfo(routePath || '/', dir, 'api');\n routes.push(route);\n }\n\n // Check for special files\n if (options.includeSpecial) {\n const baseName = entry.replace(/\\.(tsx?|jsx?|js)$/, '');\n if (SPECIAL_FILES.includes(baseName)) {\n const route = createRouteInfo(routePath || '/', dir, baseName as RouteInfo['type']);\n routes.push(route);\n }\n }\n }\n }\n}\n\ninterface SegmentInfo {\n urlSegment: string;\n isDynamic: boolean;\n paramName?: string;\n isCatchAll: boolean;\n isOptionalCatchAll: boolean;\n}\n\nfunction processSegment(segment: string): SegmentInfo {\n // Optional catch-all: [[...slug]]\n if (segment.startsWith('[[...') && segment.endsWith(']]')) {\n const paramName = segment.slice(5, -2);\n return {\n urlSegment: segment,\n isDynamic: true,\n paramName,\n isCatchAll: true,\n isOptionalCatchAll: true,\n };\n }\n\n // Catch-all: [...slug]\n if (segment.startsWith('[...') && segment.endsWith(']')) {\n const paramName = segment.slice(4, -1);\n return {\n urlSegment: segment,\n isDynamic: true,\n paramName,\n isCatchAll: true,\n isOptionalCatchAll: false,\n };\n }\n\n // Dynamic: [slug]\n if (segment.startsWith('[') && segment.endsWith(']')) {\n const paramName = segment.slice(1, -1);\n return {\n urlSegment: segment,\n isDynamic: true,\n paramName,\n isCatchAll: false,\n isOptionalCatchAll: false,\n };\n }\n\n // Static segment\n return {\n urlSegment: segment,\n isDynamic: false,\n isCatchAll: false,\n isOptionalCatchAll: false,\n };\n}\n\nfunction createRouteInfo(path: string, filePath: string, type: RouteInfo['type']): RouteInfo {\n const segments = path.split('/').filter(Boolean);\n const dynamicSegments: string[] = [];\n let isDynamic = false;\n let isCatchAll = false;\n let isOptionalCatchAll = false;\n\n for (const segment of segments) {\n const info = processSegment(segment);\n if (info.isDynamic) {\n isDynamic = true;\n if (info.paramName) {\n dynamicSegments.push(info.paramName);\n }\n if (info.isCatchAll) isCatchAll = true;\n if (info.isOptionalCatchAll) isOptionalCatchAll = true;\n }\n }\n\n // Extract route group from path\n let routeGroup: string | undefined;\n const groupMatch = filePath.match(/\\(([^)]+)\\)/);\n if (groupMatch) {\n routeGroup = groupMatch[1];\n }\n\n return {\n path: path || '/',\n filePath,\n type,\n isDynamic,\n dynamicSegments,\n isCatchAll,\n isOptionalCatchAll,\n routeGroup,\n };\n}\n\n/**\n * Convert route path to URL (replace dynamic segments with example values)\n */\nexport function routeToUrl(route: RouteInfo, params?: Record<string, string>): string {\n let url = route.path;\n\n for (const segment of route.dynamicSegments) {\n const value = params?.[segment] || `{${segment}}`;\n\n // Handle different dynamic segment types\n if (route.isOptionalCatchAll) {\n url = url.replace(`[[...${segment}]]`, value);\n } else if (route.isCatchAll) {\n url = url.replace(`[...${segment}]`, value);\n } else {\n url = url.replace(`[${segment}]`, value);\n }\n }\n\n return url;\n}\n\n/**\n * Get static routes as URLs (ready to check)\n */\nexport function getStaticUrls(scanResult: ScanResult, baseUrl: string): string[] {\n return scanResult.staticRoutes.map(route => {\n const url = new URL(route.path, baseUrl);\n return url.href;\n });\n}\n","/**\n * @djangocfg/seo - Routes Analyzer\n * Compare routes with sitemap and verify accessibility\n */\n\nimport pLimit from 'p-limit';\nimport type { ScanResult, RouteInfo } from './scanner.js';\nimport type { SeoIssue } from '../types/index.js';\n\nexport interface SitemapUrl {\n loc: string;\n lastmod?: string;\n changefreq?: string;\n priority?: string;\n}\n\nexport interface RouteComparisonResult {\n /** Routes found in app/ */\n appRoutes: RouteInfo[];\n /** URLs found in sitemap */\n sitemapUrls: string[];\n /** Static routes missing from sitemap */\n missingFromSitemap: RouteInfo[];\n /** Sitemap URLs that don't match any route */\n extraInSitemap: string[];\n /** Matching routes */\n matching: RouteInfo[];\n}\n\nexport interface RouteVerificationResult {\n /** Route being verified */\n route: RouteInfo;\n /** Full URL */\n url: string;\n /** HTTP status code */\n statusCode: number;\n /** Is accessible (2xx) */\n isAccessible: boolean;\n /** Error message if failed */\n error?: string;\n /** Response time in ms */\n responseTime: number;\n}\n\nexport interface VerifyOptions {\n /** Base URL (e.g., http://localhost:3000) */\n baseUrl: string;\n /** Request timeout in ms */\n timeout?: number;\n /** Max concurrent requests */\n concurrency?: number;\n /** Only verify static routes */\n staticOnly?: boolean;\n}\n\n/**\n * Compare routes with sitemap URLs\n */\nexport function compareWithSitemap(\n scanResult: ScanResult,\n sitemapUrls: string[],\n baseUrl: string\n): RouteComparisonResult {\n const appRoutes = scanResult.routes.filter(r => r.type === 'page');\n\n // Normalize sitemap URLs to paths\n const sitemapPaths = new Set(\n sitemapUrls\n .filter(url => url)\n .map(url => {\n try {\n return new URL(url).pathname;\n } catch {\n return url;\n }\n })\n .filter(Boolean)\n );\n\n // Find static routes missing from sitemap\n const missingFromSitemap: RouteInfo[] = [];\n const matching: RouteInfo[] = [];\n\n for (const route of scanResult.staticRoutes) {\n const path = route.path || '/';\n // Check with and without trailing slash\n if (sitemapPaths.has(path) || sitemapPaths.has(path + '/') || sitemapPaths.has(path.replace(/\\/$/, ''))) {\n matching.push(route);\n } else {\n missingFromSitemap.push(route);\n }\n }\n\n // Find sitemap URLs that don't match any static route\n const staticPaths = new Set(scanResult.staticRoutes.map(r => r.path).filter(Boolean));\n const dynamicPatterns = scanResult.dynamicRoutes\n .filter(r => r.path)\n .map(r => routeToRegex(r.path));\n\n const extraInSitemap: string[] = [];\n for (const path of sitemapPaths) {\n if (!path) continue;\n // Skip if matches static route\n if (staticPaths.has(path) || staticPaths.has(path + '/') || staticPaths.has(path.replace(/\\/$/, ''))) {\n continue;\n }\n\n // Skip if matches dynamic route pattern\n const matchesDynamic = dynamicPatterns.some(regex => regex.test(path));\n if (matchesDynamic) continue;\n\n extraInSitemap.push(path);\n }\n\n return {\n appRoutes,\n sitemapUrls,\n missingFromSitemap,\n extraInSitemap,\n matching,\n };\n}\n\n/**\n * Convert route path to regex for matching\n */\nfunction routeToRegex(routePath: string): RegExp {\n if (!routePath) return /^$/;\n let pattern = routePath\n // Escape special regex chars except [ ]\n .replace(/[.+?^${}()|\\\\]/g, '\\\\$&')\n // Optional catch-all: [[...slug]] matches zero or more segments\n .replace(/\\[\\[\\.\\.\\.([^\\]]+)\\]\\]/g, '(?:/.*)?')\n // Catch-all: [...slug] matches one or more segments\n .replace(/\\[\\.\\.\\.([^\\]]+)\\]/g, '/.+')\n // Dynamic: [slug] matches one segment\n .replace(/\\[([^\\]]+)\\]/g, '/[^/]+');\n\n // Handle trailing slash optionally\n pattern = `^${pattern}/?$`;\n\n return new RegExp(pattern);\n}\n\n/**\n * Verify routes are accessible\n */\nexport async function verifyRoutes(\n scanResult: ScanResult,\n options: VerifyOptions\n): Promise<RouteVerificationResult[]> {\n const {\n baseUrl,\n timeout = 10000,\n concurrency = 5,\n staticOnly = true,\n } = options;\n\n const routes = staticOnly ? scanResult.staticRoutes : scanResult.routes.filter(r => r.type === 'page');\n const limit = pLimit(concurrency);\n\n const results = await Promise.all(\n routes.map(route =>\n limit(async () => {\n const url = new URL(route.path, baseUrl).href;\n const startTime = Date.now();\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(url, {\n method: 'HEAD',\n signal: controller.signal,\n redirect: 'follow',\n });\n\n clearTimeout(timeoutId);\n\n return {\n route,\n url,\n statusCode: response.status,\n isAccessible: response.status >= 200 && response.status < 400,\n responseTime: Date.now() - startTime,\n };\n } catch (error) {\n return {\n route,\n url,\n statusCode: 0,\n isAccessible: false,\n error: (error as Error).message,\n responseTime: Date.now() - startTime,\n };\n }\n })\n )\n );\n\n return results;\n}\n\n/**\n * Analyze routes and generate SEO issues\n */\nexport function analyzeRoutes(\n scanResult: ScanResult,\n comparison?: RouteComparisonResult,\n verification?: RouteVerificationResult[]\n): SeoIssue[] {\n const issues: SeoIssue[] = [];\n const now = new Date().toISOString();\n\n // Issue: Static routes missing from sitemap\n if (comparison && comparison.missingFromSitemap.length > 0) {\n for (const route of comparison.missingFromSitemap) {\n issues.push({\n id: `route-missing-sitemap-${route.path}`,\n category: 'indexing',\n severity: 'warning',\n title: 'Route missing from sitemap',\n description: `Static route ${route.path} is not in sitemap.xml`,\n url: route.path,\n recommendation: 'Add this route to your sitemap for better indexing',\n detectedAt: now,\n });\n }\n }\n\n // Issue: Sitemap URLs that don't match routes (potential dead links)\n if (comparison && comparison.extraInSitemap.length > 0) {\n for (const path of comparison.extraInSitemap.slice(0, 20)) {\n issues.push({\n id: `sitemap-orphan-${path}`,\n category: 'indexing',\n severity: 'info',\n title: 'Sitemap URL without matching route',\n description: `URL ${path} in sitemap doesn't match any app/ route`,\n url: path,\n recommendation: 'Verify this URL is still valid or remove from sitemap',\n detectedAt: now,\n });\n }\n }\n\n // Issue: Inaccessible routes\n if (verification) {\n for (const result of verification) {\n if (!result.isAccessible) {\n issues.push({\n id: `route-inaccessible-${result.route.path}`,\n category: 'technical',\n severity: result.statusCode === 404 ? 'error' : 'warning',\n title: `Route returns ${result.statusCode || 'error'}`,\n description: result.error || `Route ${result.route.path} returned status ${result.statusCode}`,\n url: result.url,\n recommendation: 'Fix the route or remove it from app/',\n detectedAt: now,\n });\n }\n }\n }\n\n // Issue: Too many dynamic routes (SEO concern)\n if (scanResult.dynamicRoutes.length > scanResult.staticRoutes.length * 2) {\n issues.push({\n id: 'too-many-dynamic-routes',\n category: 'content',\n severity: 'info',\n title: 'High ratio of dynamic routes',\n description: `${scanResult.dynamicRoutes.length} dynamic vs ${scanResult.staticRoutes.length} static routes`,\n url: '/',\n recommendation: 'Ensure dynamic routes have proper generateStaticParams for SSG',\n detectedAt: now,\n });\n }\n\n return issues;\n}\n\n/**\n * Generate routes summary\n */\nexport function generateRoutesSummary(\n scanResult: ScanResult,\n comparison?: RouteComparisonResult,\n verification?: RouteVerificationResult[]\n): string {\n const lines: string[] = [];\n\n lines.push('## Routes Summary');\n lines.push('');\n lines.push(`Total routes: ${scanResult.routes.length}`);\n lines.push(`├── Static: ${scanResult.staticRoutes.length}`);\n lines.push(`├── Dynamic: ${scanResult.dynamicRoutes.length}`);\n lines.push(`└── API: ${scanResult.apiRoutes.length}`);\n lines.push('');\n\n if (comparison) {\n lines.push('### Sitemap Comparison');\n lines.push('');\n lines.push(`Sitemap URLs: ${comparison.sitemapUrls.length}`);\n lines.push(`├── Matching: ${comparison.matching.length}`);\n lines.push(`├── Missing from sitemap: ${comparison.missingFromSitemap.length}`);\n lines.push(`└── Extra in sitemap: ${comparison.extraInSitemap.length}`);\n lines.push('');\n }\n\n if (verification) {\n const accessible = verification.filter(r => r.isAccessible).length;\n const broken = verification.filter(r => !r.isAccessible);\n\n lines.push('### Route Verification');\n lines.push('');\n lines.push(`Accessible: ${accessible}/${verification.length}`);\n\n if (broken.length > 0) {\n lines.push('');\n lines.push('Broken routes:');\n for (const r of broken.slice(0, 10)) {\n lines.push(` - ${r.route.path} → ${r.statusCode || r.error}`);\n }\n if (broken.length > 10) {\n lines.push(` - ... +${broken.length - 10} more`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * CLI Types and Options\n */\n\nexport interface CliOptions {\n env: string;\n site?: string;\n output: string;\n urls?: string;\n 'max-pages': string;\n 'max-depth': string;\n timeout: string;\n concurrency: string;\n format: string;\n 'service-account'?: string;\n 'app-dir'?: string;\n 'content-dir'?: string;\n 'base-path'?: string;\n check?: boolean;\n verify?: boolean;\n fix?: boolean;\n help?: boolean;\n version?: boolean;\n /** Positional arguments */\n _?: string[];\n}\n\nexport type ReportFormat = 'json' | 'markdown' | 'ai-summary' | 'split';\n\nexport function parseFormats(format: string): ReportFormat[] {\n if (format === 'all') {\n return ['json', 'markdown', 'ai-summary', 'split'];\n }\n\n if (format === 'split') {\n return ['ai-summary', 'split'];\n }\n\n return format.split(',').map((f) => f.trim()) as ReportFormat[];\n}\n","/**\n * Audit Command - Full SEO audit\n */\n\nimport consola from 'consola';\nimport chalk from 'chalk';\nimport { getSiteUrl, findGoogleServiceAccount, getGscKeyFilename } from '../../config.js';\nimport { GoogleConsoleClient, analyzeInspectionResults } from '../../google-console/index.js';\nimport { SiteCrawler, analyzeCrawlResults, analyzeRobotsTxt, analyzeAllSitemaps, analyzeSitemap } from '../../crawler/index.js';\nimport { checkLinks, linkResultsToSeoIssues } from '../../link-checker/index.js';\nimport { generateAndSaveReports, printReportSummary } from '../../reports/index.js';\nimport { scanRoutes, findAppDir, compareWithSitemap, analyzeRoutes } from '../../routes/index.js';\nimport type { SeoIssue, UrlInspectionResult, CrawlResult } from '../../types/index.js';\nimport { parseFormats, type CliOptions } from '../types.js';\n\ninterface StepResult {\n name: string;\n issues: SeoIssue[];\n meta?: Record<string, any>;\n error?: string;\n}\n\nexport async function runAudit(options: CliOptions) {\n const siteUrl = getSiteUrl(options);\n const startTime = Date.now();\n\n console.log('');\n consola.box(`${chalk.bold('SEO Audit')}\\n${siteUrl}`);\n\n // Auto-detect or use explicit service account\n const serviceAccountPath = findGoogleServiceAccount(options['service-account']);\n const hasGsc = !!serviceAccountPath;\n\n // Auto-detect app directory for routes\n const appDir = options['app-dir'] || findAppDir();\n const hasRoutes = !!appDir;\n\n // Show hints\n if (!serviceAccountPath) {\n const keyFile = getGscKeyFilename();\n console.log('');\n consola.info(chalk.dim('GSC not configured. Save service account as ' + chalk.cyan(keyFile) + ' for indexing data.'));\n }\n\n const allIssues: SeoIssue[] = [];\n const allInspections: UrlInspectionResult[] = [];\n const allCrawlResults: CrawlResult[] = [];\n const results: StepResult[] = [];\n let collectedSitemapUrls: string[] = [];\n\n // Progress tracking: robots + sitemap + crawl + links + (routes?) + (gsc?)\n let totalSteps = 4;\n if (hasRoutes) totalSteps++;\n if (hasGsc) totalSteps++;\n let completedSteps = 0;\n const errors: string[] = [];\n\n const updateProgress = (step: string, status: 'running' | 'done' | 'error') => {\n const bar = '█'.repeat(completedSteps) + '░'.repeat(totalSteps - completedSteps);\n const pct = Math.round((completedSteps / totalSteps) * 100);\n if (status === 'running') {\n process.stdout.write(`\\r${chalk.cyan('▸')} ${bar} ${pct}% ${chalk.dim(step)}`);\n } else if (status === 'done') {\n completedSteps++;\n const newBar = '█'.repeat(completedSteps) + '░'.repeat(totalSteps - completedSteps);\n const newPct = Math.round((completedSteps / totalSteps) * 100);\n process.stdout.write(`\\r${chalk.green('✓')} ${newBar} ${newPct}% ${chalk.dim(step)}${' '.repeat(20)}\\n`);\n } else {\n process.stdout.write(`\\r${chalk.red('✗')} ${bar} ${pct}% ${chalk.dim(step)}${' '.repeat(20)}\\n`);\n }\n };\n\n // Phase 1: robots.txt (needed for sitemap URLs)\n console.log('');\n let sitemapUrls: string[] = [];\n updateProgress('robots.txt', 'running');\n try {\n const analysis = await analyzeRobotsTxt(siteUrl);\n sitemapUrls = analysis.sitemaps;\n results.push({ name: 'robots.txt', issues: analysis.issues, meta: { exists: analysis.exists } });\n allIssues.push(...analysis.issues);\n updateProgress('robots.txt', 'done');\n } catch (e) {\n errors.push(`robots.txt: ${(e as Error).message}`);\n updateProgress('robots.txt', 'error');\n }\n\n // Phase 2: Parallel execution (Sitemap + Crawl + Links)\n const parallelTasks = await Promise.allSettled([\n // Sitemap\n (async () => {\n updateProgress('Sitemap', 'running');\n const issues: SeoIssue[] = [];\n const sitemapsToCheck = sitemapUrls.length > 0\n ? sitemapUrls\n : [new URL('/sitemap.xml', siteUrl).href];\n\n let totalUrls = 0;\n for (const smUrl of sitemapsToCheck) {\n const analyses = await analyzeAllSitemaps(smUrl);\n for (const a of analyses) {\n issues.push(...a.issues);\n totalUrls += a.urls.length;\n // Collect URLs for routes comparison\n collectedSitemapUrls.push(...a.urls.map(u => u.loc));\n }\n }\n updateProgress('Sitemap', 'done');\n return { name: 'Sitemap', issues, meta: { urls: totalUrls } };\n })(),\n\n // Crawl\n (async () => {\n updateProgress('Crawl', 'running');\n const crawler = new SiteCrawler(siteUrl, {\n maxPages: parseInt(options['max-pages'], 10),\n maxDepth: parseInt(options['max-depth'], 10),\n });\n const crawlResults = await crawler.crawl();\n allCrawlResults.push(...crawlResults);\n const issues = analyzeCrawlResults(crawlResults);\n updateProgress('Crawl', 'done');\n return { name: 'Crawl', issues, meta: { pages: crawlResults.length } };\n })(),\n\n // Links\n (async () => {\n updateProgress('Links', 'running');\n const result = await checkLinks({\n url: siteUrl,\n timeout: parseInt(options.timeout, 10),\n concurrency: parseInt(options.concurrency, 10),\n verbose: false,\n });\n const issues = linkResultsToSeoIssues(result);\n updateProgress('Links', 'done');\n return { name: 'Links', issues, meta: { total: result.total, broken: result.broken } };\n })(),\n ]);\n\n // Collect parallel results\n for (const task of parallelTasks) {\n if (task.status === 'fulfilled') {\n results.push(task.value);\n allIssues.push(...task.value.issues);\n } else {\n errors.push(task.reason?.message || 'Unknown error');\n }\n }\n\n // Phase 3: Routes (needs sitemap URLs from parallel phase)\n if (hasRoutes && appDir) {\n updateProgress('Routes', 'running');\n try {\n const scanResult = scanRoutes({ appDir });\n const comparison = compareWithSitemap(scanResult, collectedSitemapUrls, siteUrl);\n const issues = analyzeRoutes(scanResult, comparison);\n\n results.push({\n name: 'Routes',\n issues,\n meta: {\n static: scanResult.staticRoutes.length,\n dynamic: scanResult.dynamicRoutes.length,\n missing: comparison.missingFromSitemap.length,\n },\n });\n allIssues.push(...issues);\n updateProgress('Routes', 'done');\n } catch (e) {\n errors.push(`Routes: ${(e as Error).message}`);\n updateProgress('Routes', 'error');\n }\n }\n\n // Phase 4: GSC (needs crawl results)\n if (hasGsc) {\n updateProgress('GSC', 'running');\n try {\n const client = new GoogleConsoleClient({\n siteUrl,\n serviceAccountPath,\n });\n\n const isAuth = await client.verify();\n if (isAuth) {\n const urlsToInspect = allCrawlResults\n .filter((r) => r.statusCode === 200)\n .slice(0, 50)\n .map((r) => r.url);\n\n const inspections = await client.inspectUrls(urlsToInspect);\n allInspections.push(...inspections);\n const issues = analyzeInspectionResults(inspections);\n results.push({ name: 'GSC', issues, meta: { inspected: inspections.length } });\n allIssues.push(...issues);\n } else {\n results.push({ name: 'GSC', issues: [], meta: { skipped: true } });\n }\n updateProgress('GSC', 'done');\n } catch (e) {\n errors.push(`GSC: ${(e as Error).message}`);\n updateProgress('GSC', 'error');\n }\n }\n\n // Show errors if any\n if (errors.length > 0) {\n console.log('');\n for (const err of errors) {\n consola.error(err);\n }\n }\n\n // Summary table\n console.log('');\n consola.log(chalk.bold('Results:'));\n for (const r of results) {\n const issueStr = r.issues.length > 0 ? chalk.yellow(`${r.issues.length} issues`) : chalk.green('OK');\n const metaStr = r.meta ? chalk.dim(` (${Object.entries(r.meta).map(([k, v]) => `${k}: ${v}`).join(', ')})`) : '';\n consola.log(` ${r.name}: ${issueStr}${metaStr}`);\n }\n\n // Generate reports\n console.log('');\n consola.start('Generating reports...');\n\n const formats = parseFormats(options.format);\n const { report, files } = await generateAndSaveReports(\n siteUrl,\n {\n issues: allIssues,\n urlInspections: allInspections,\n crawlResults: allCrawlResults,\n },\n {\n outputDir: options.output,\n formats,\n includeRawData: true,\n }\n );\n\n // Summary\n const duration = ((Date.now() - startTime) / 1000).toFixed(1);\n console.log('');\n printReportSummary(report);\n\n console.log('');\n consola.info(`Reports saved to: ${chalk.cyan(options.output)}`);\n if (files.json) consola.log(` ${chalk.dim('→')} ${files.json}`);\n if (files.markdown) consola.log(` ${chalk.dim('→')} ${files.markdown}`);\n if (files.aiSummary) consola.log(` ${chalk.dim('→')} ${files.aiSummary}`);\n if (files.split) {\n consola.log(` ${chalk.dim('→')} ${files.split.index} ${chalk.dim('(index)')}`);\n consola.log(` ${chalk.dim('→')} ${files.split.categories.length} category files`);\n }\n\n console.log('');\n consola.success(`Audit completed in ${duration}s`);\n}\n","/**\n * Routes Command - Scan app/ directory\n */\n\nimport consola from 'consola';\nimport chalk from 'chalk';\nimport { getSiteUrl } from '../../config.js';\nimport { analyzeSitemap } from '../../crawler/index.js';\nimport { scanRoutes, findAppDir, compareWithSitemap, verifyRoutes, generateRoutesSummary } from '../../routes/index.js';\nimport type { CliOptions } from '../types.js';\n\nexport async function runRoutes(options: CliOptions) {\n const siteUrl = getSiteUrl(options);\n const appDir = options['app-dir'] || findAppDir();\n\n if (!appDir) {\n consola.error('Could not find app/ directory. Use --app-dir to specify path.');\n process.exit(1);\n }\n\n console.log('');\n consola.box(`${chalk.bold('Routes Scanner')}\\n${appDir}`);\n\n // Scan routes\n consola.start('Scanning app/ directory...');\n const scanResult = scanRoutes({ appDir });\n\n consola.success(`Found ${scanResult.routes.length} routes`);\n console.log(` ├── Static: ${scanResult.staticRoutes.length}`);\n console.log(` ├── Dynamic: ${scanResult.dynamicRoutes.length}`);\n console.log(` └── API: ${scanResult.apiRoutes.length}`);\n\n // Show routes\n if (scanResult.staticRoutes.length > 0) {\n console.log('');\n consola.info('Static routes:');\n for (const route of scanResult.staticRoutes.slice(0, 20)) {\n console.log(` ${chalk.green('→')} ${route.path}`);\n }\n if (scanResult.staticRoutes.length > 20) {\n console.log(` ${chalk.dim(`... +${scanResult.staticRoutes.length - 20} more`)}`);\n }\n }\n\n if (scanResult.dynamicRoutes.length > 0) {\n console.log('');\n consola.info('Dynamic routes:');\n for (const route of scanResult.dynamicRoutes.slice(0, 10)) {\n const params = route.dynamicSegments.join(', ');\n console.log(` ${chalk.yellow('→')} ${route.path} ${chalk.dim(`[${params}]`)}`);\n }\n if (scanResult.dynamicRoutes.length > 10) {\n console.log(` ${chalk.dim(`... +${scanResult.dynamicRoutes.length - 10} more`)}`);\n }\n }\n\n // Compare with sitemap (--check flag)\n if (options.check) {\n console.log('');\n consola.start('Loading sitemap...');\n\n try {\n const sitemapUrl = new URL('/sitemap.xml', siteUrl).href;\n const sitemap = await analyzeSitemap(sitemapUrl);\n const sitemapUrls = sitemap.urls.map(u => u.loc);\n\n consola.success(`Loaded ${sitemapUrls.length} URLs from sitemap`);\n\n const comparison = compareWithSitemap(scanResult, sitemapUrls, siteUrl);\n\n console.log('');\n consola.info('Sitemap comparison:');\n console.log(` ├── Matching: ${comparison.matching.length}`);\n console.log(` ├── Missing from sitemap: ${chalk.yellow(String(comparison.missingFromSitemap.length))}`);\n console.log(` └── Extra in sitemap: ${comparison.extraInSitemap.length}`);\n\n if (comparison.missingFromSitemap.length > 0) {\n console.log('');\n consola.warn('Routes missing from sitemap:');\n for (const route of comparison.missingFromSitemap.slice(0, 10)) {\n console.log(` ${chalk.red('✗')} ${route.path}`);\n }\n if (comparison.missingFromSitemap.length > 10) {\n console.log(` ${chalk.dim(`... +${comparison.missingFromSitemap.length - 10} more`)}`);\n }\n }\n } catch (error) {\n consola.error(`Failed to load sitemap: ${(error as Error).message}`);\n }\n }\n\n // Verify routes (--verify flag)\n if (options.verify) {\n console.log('');\n consola.start('Verifying routes...');\n\n const verification = await verifyRoutes(scanResult, {\n baseUrl: siteUrl,\n timeout: parseInt(options.timeout, 10),\n concurrency: 5,\n staticOnly: true,\n });\n\n const accessible = verification.filter(r => r.isAccessible);\n const broken = verification.filter(r => !r.isAccessible);\n\n consola.success(`Verified ${verification.length} routes`);\n console.log(` ├── Accessible: ${chalk.green(String(accessible.length))}`);\n console.log(` └── Broken: ${chalk.red(String(broken.length))}`);\n\n if (broken.length > 0) {\n console.log('');\n consola.error('Broken routes:');\n for (const r of broken.slice(0, 10)) {\n console.log(` ${chalk.red('✗')} ${r.route.path} → ${r.statusCode || r.error}`);\n }\n if (broken.length > 10) {\n console.log(` ${chalk.dim(`... +${broken.length - 10} more`)}`);\n }\n }\n }\n\n // Summary\n console.log('');\n console.log(generateRoutesSummary(scanResult));\n}\n","/**\n * @djangocfg/seo - Utilities\n * Shared utility functions\n */\n\nimport { readFileSync, existsSync } from 'node:fs';\n\n/**\n * Load URLs from a file (one URL per line)\n */\nexport function loadUrlsFromFile(filePath: string): string[] {\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n\n const content = readFileSync(filePath, 'utf-8');\n return content\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line && !line.startsWith('#'));\n}\n\n/**\n * Extract URLs from sitemap XML content\n */\nexport function extractUrlsFromSitemap(xmlContent: string): string[] {\n const urls: string[] = [];\n const locRegex = /<loc>([^<]+)<\\/loc>/g;\n let match;\n\n while ((match = locRegex.exec(xmlContent)) !== null) {\n if (match[1]) {\n urls.push(match[1].trim());\n }\n }\n\n return urls;\n}\n\n/**\n * Normalize URL for comparison\n */\nexport function normalizeUrl(url: string, baseUrl?: string): string {\n try {\n const parsed = new URL(url, baseUrl);\n parsed.hash = '';\n // Remove trailing slash\n if (parsed.pathname.endsWith('/') && parsed.pathname !== '/') {\n parsed.pathname = parsed.pathname.slice(0, -1);\n }\n return parsed.href;\n } catch {\n return url;\n }\n}\n\n/**\n * Check if URL belongs to the same domain\n */\nexport function isSameDomain(url: string, baseUrl: string): boolean {\n try {\n const urlHost = new URL(url).hostname;\n const baseHost = new URL(baseUrl).hostname;\n return urlHost === baseHost;\n } catch {\n return false;\n }\n}\n\n/**\n * Format bytes to human readable string\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${units[i]}`;\n}\n\n/**\n * Format milliseconds to human readable string\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\n return `${Math.floor(ms / 60000)}m ${Math.round((ms % 60000) / 1000)}s`;\n}\n\n/**\n * Simple hash function for generating IDs\n */\nexport function hash(str: string): string {\n let h = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n h = (h << 5) - h + char;\n h = h & h;\n }\n return Math.abs(h).toString(36);\n}\n\n/**\n * Chunk array into smaller arrays\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: {\n retries?: number;\n minTimeout?: number;\n maxTimeout?: number;\n factor?: number;\n } = {}\n): Promise<T> {\n const { retries = 3, minTimeout = 1000, maxTimeout = 30000, factor = 2 } = options;\n\n let lastError: Error | undefined;\n let timeout = minTimeout;\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < retries) {\n await sleep(timeout);\n timeout = Math.min(timeout * factor, maxTimeout);\n }\n }\n }\n\n throw lastError;\n}\n","/**\n * Inspect Command - GSC URL inspection\n */\n\nimport consola from 'consola';\nimport { getSiteUrl } from '../../config.js';\nimport { GoogleConsoleClient, analyzeInspectionResults } from '../../google-console/index.js';\nimport { generateAndSaveReports } from '../../reports/index.js';\nimport { loadUrlsFromFile } from '../../utils/index.js';\nimport { parseFormats, type CliOptions } from '../types.js';\n\nexport async function runInspect(options: CliOptions) {\n const siteUrl = getSiteUrl(options);\n\n consola.start('Starting URL inspection via Google Search Console');\n\n const client = new GoogleConsoleClient({\n siteUrl,\n serviceAccountPath: options['service-account'],\n });\n\n const isAuth = await client.verify();\n if (!isAuth) {\n consola.error('Failed to authenticate with Google Search Console');\n process.exit(1);\n }\n\n let urls: string[];\n\n if (options.urls) {\n urls = loadUrlsFromFile(options.urls);\n consola.info(`Loaded ${urls.length} URLs from ${options.urls}`);\n } else {\n consola.info('Fetching URLs from search analytics...');\n const today = new Date();\n const startDate = new Date(today.getTime() - 30 * 24 * 60 * 60 * 1000);\n\n const rows = await client.getSearchAnalytics({\n startDate: startDate.toISOString().split('T')[0] as string,\n endDate: today.toISOString().split('T')[0] as string,\n dimensions: ['page'],\n rowLimit: 100,\n });\n\n urls = rows.map((row) => row.keys?.[0] || '').filter(Boolean);\n consola.info(`Found ${urls.length} URLs from search analytics`);\n }\n\n const results = await client.inspectUrls(urls);\n const issues = analyzeInspectionResults(results);\n\n consola.info(`Found ${issues.length} issues`);\n\n const formats = parseFormats(options.format);\n await generateAndSaveReports(siteUrl, { issues, urlInspections: results }, {\n outputDir: options.output,\n formats,\n includeRawData: true,\n });\n}\n","/**\n * Crawl Command - Site crawler\n */\n\nimport consola from 'consola';\nimport { getSiteUrl } from '../../config.js';\nimport { SiteCrawler, analyzeCrawlResults } from '../../crawler/index.js';\nimport { generateAndSaveReports } from '../../reports/index.js';\nimport { parseFormats, type CliOptions } from '../types.js';\n\nexport async function runCrawl(options: CliOptions) {\n const siteUrl = getSiteUrl(options);\n\n consola.start(`Starting crawl of ${siteUrl}`);\n\n const crawler = new SiteCrawler(siteUrl, {\n maxPages: parseInt(options['max-pages'], 10),\n maxDepth: parseInt(options['max-depth'], 10),\n });\n\n const crawlResults = await crawler.crawl();\n const issues = analyzeCrawlResults(crawlResults);\n\n consola.info(`Found ${issues.length} issues from ${crawlResults.length} pages`);\n\n const formats = parseFormats(options.format);\n await generateAndSaveReports(siteUrl, { issues, crawlResults }, {\n outputDir: options.output,\n formats,\n includeRawData: true,\n });\n}\n","/**\n * Links Command - Broken link checker\n */\n\nimport consola from 'consola';\nimport { getSiteUrl } from '../../config.js';\nimport { checkLinks, linkResultsToSeoIssues } from '../../link-checker/index.js';\nimport { generateAndSaveReports } from '../../reports/index.js';\nimport { parseFormats, type CliOptions } from '../types.js';\n\nexport async function runLinks(options: CliOptions) {\n const siteUrl = getSiteUrl(options);\n\n consola.start(`Checking links on ${siteUrl}`);\n\n const result = await checkLinks({\n url: siteUrl,\n timeout: parseInt(options.timeout, 10),\n concurrency: parseInt(options.concurrency, 10),\n verbose: true,\n });\n\n if (result.success) {\n consola.success(`All ${result.total} links are valid!`);\n } else {\n consola.error(`Found ${result.broken} broken links out of ${result.total}`);\n\n // Generate report if output specified\n if (options.output !== './seo-reports' || result.broken > 0) {\n const issues = linkResultsToSeoIssues(result);\n const formats = parseFormats(options.format);\n await generateAndSaveReports(siteUrl, { issues }, {\n outputDir: options.output,\n formats,\n includeRawData: false,\n });\n }\n }\n\n process.exit(result.success ? 0 : 1);\n}\n","/**\n * Robots Command - robots.txt analyzer\n */\n\nimport consola from 'consola';\nimport { getSiteUrl } from '../../config.js';\nimport { analyzeRobotsTxt } from '../../crawler/index.js';\nimport type { CliOptions } from '../types.js';\n\nexport async function runRobots(options: CliOptions) {\n const siteUrl = getSiteUrl(options);\n\n consola.start(`Analyzing robots.txt for ${siteUrl}`);\n\n const analysis = await analyzeRobotsTxt(siteUrl);\n\n if (analysis.exists) {\n consola.success('robots.txt found');\n consola.info(`Sitemaps: ${analysis.sitemaps.length}`);\n consola.info(`Disallow rules: ${analysis.disallowedPaths.length}`);\n consola.info(`Allow rules: ${analysis.allowedPaths.length}`);\n\n if (analysis.crawlDelay) {\n consola.info(`Crawl-delay: ${analysis.crawlDelay}`);\n }\n\n if (analysis.issues.length > 0) {\n consola.warn(`Issues found: ${analysis.issues.length}`);\n for (const issue of analysis.issues) {\n consola.log(` - [${issue.severity}] ${issue.title}`);\n }\n }\n } else {\n consola.warn('robots.txt not found');\n }\n}\n","/**\n * Sitemap Command - Sitemap validator\n */\n\nimport consola from 'consola';\nimport { getSiteUrl } from '../../config.js';\nimport { analyzeAllSitemaps } from '../../crawler/index.js';\nimport type { CliOptions } from '../types.js';\n\nexport async function runSitemap(options: CliOptions) {\n let sitemapUrl = getSiteUrl(options);\n\n if (!sitemapUrl.endsWith('.xml')) {\n sitemapUrl = new URL('/sitemap.xml', sitemapUrl).href;\n }\n\n consola.start(`Validating sitemap: ${sitemapUrl}`);\n\n const analyses = await analyzeAllSitemaps(sitemapUrl);\n\n let totalUrls = 0;\n let totalIssues = 0;\n\n for (const analysis of analyses) {\n if (analysis.exists) {\n consola.success(`${analysis.url}`);\n consola.info(` Type: ${analysis.type}`);\n\n if (analysis.type === 'sitemap') {\n consola.info(` URLs: ${analysis.urls.length}`);\n totalUrls += analysis.urls.length;\n } else {\n consola.info(` Child sitemaps: ${analysis.childSitemaps.length}`);\n }\n\n if (analysis.issues.length > 0) {\n totalIssues += analysis.issues.length;\n for (const issue of analysis.issues) {\n consola.warn(` [${issue.severity}] ${issue.title}`);\n }\n }\n } else {\n consola.error(`${analysis.url} - Not found`);\n }\n }\n\n consola.box(`Total URLs: ${totalUrls}\\nTotal Issues: ${totalIssues}`);\n}\n","/**\n * Content scanner for MDX/Nextra projects\n * Scans content/ and app/ directories for files\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport type { ContentConfig, FileInfo, ContentScanResult, DEFAULT_CONFIG } from './types.js';\n\n/**\n * Detect project type based on directory structure\n */\nexport function detectProjectType(cwd: string): 'nextra' | 'nextjs' | 'unknown' {\n const contentDir = path.join(cwd, 'content');\n const appDir = path.join(cwd, 'app');\n\n if (fs.existsSync(contentDir)) {\n // Check for _meta.ts files (Nextra indicator)\n if (hasMetaFiles(contentDir)) {\n return 'nextra';\n }\n }\n\n if (fs.existsSync(appDir)) {\n return 'nextjs';\n }\n\n return 'unknown';\n}\n\n/**\n * Check if directory contains _meta.ts files (Nextra pattern)\n */\nexport function hasMetaFiles(dir: string): boolean {\n if (!fs.existsSync(dir)) return false;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name === '_meta.ts' || entry.name === '_meta.tsx') {\n return true;\n }\n if (entry.isDirectory() && !entry.name.startsWith('.')) {\n const subDir = path.join(dir, entry.name);\n if (hasMetaFiles(subDir)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * Scan project and return content information\n */\nexport function scanProject(cwd: string, config?: Partial<ContentConfig>): ContentScanResult {\n const contentDir = path.join(cwd, config?.contentDir || 'content');\n const appDir = path.join(cwd, config?.appDir || 'app');\n const extensions = config?.extensions || ['.mdx', '.md'];\n\n const hasContent = fs.existsSync(contentDir);\n const hasApp = fs.existsSync(appDir);\n const projectType = detectProjectType(cwd);\n\n const mdxFiles = hasContent ? getAllFiles(contentDir, extensions) : [];\n const pageFiles = hasApp ? getPageFiles(appDir) : [];\n\n return {\n projectType,\n hasContent,\n hasApp,\n mdxFiles,\n pageFiles,\n };\n}\n\n/**\n * Get all files with given extensions recursively\n */\nexport function getAllFiles(dir: string, extensions: string[], files: string[] = []): string[] {\n if (!fs.existsSync(dir)) return files;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n getAllFiles(fullPath, extensions, files);\n }\n } else {\n const ext = path.extname(entry.name).toLowerCase();\n if (extensions.includes(ext)) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\n/**\n * Get all MDX files in content directory\n */\nexport function getAllMdxFiles(contentDir: string): string[] {\n return getAllFiles(contentDir, ['.mdx', '.md']);\n}\n\n/**\n * Get all page.tsx files in app directory\n */\nexport function getPageFiles(appDir: string): string[] {\n const pages: string[] = [];\n\n function scan(dir: string) {\n if (!fs.existsSync(dir)) return;\n\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n // Skip special directories\n if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue;\n\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Skip route groups for page detection but still scan them\n scan(fullPath);\n } else if (entry.name === 'page.tsx' || entry.name === 'page.ts') {\n pages.push(fullPath);\n }\n }\n }\n\n scan(appDir);\n return pages;\n}\n\n/**\n * Get file info for link resolution\n */\nexport function getFileInfo(filePath: string, contentDir: string): FileInfo {\n const relativePath = path.relative(contentDir, filePath);\n const parsed = path.parse(relativePath);\n const isIndex = parsed.name === 'index';\n const folder = parsed.dir || '';\n\n return {\n fullPath: filePath,\n relativePath,\n isIndex,\n folder,\n name: parsed.name,\n };\n}\n\n/**\n * Check if a path exists as MDX file or directory with index\n */\nexport function pathExists(docsPath: string, contentDir: string): boolean {\n const cleanPath = docsPath.replace(/\\/$/, '').replace(/^\\//, '');\n\n const candidates = [\n path.join(contentDir, cleanPath + '.mdx'),\n path.join(contentDir, cleanPath + '.md'),\n path.join(contentDir, cleanPath, 'index.mdx'),\n path.join(contentDir, cleanPath, 'index.md'),\n ];\n\n return candidates.some(p => fs.existsSync(p));\n}\n\n/**\n * Find content directory, looking in common locations\n */\nexport function findContentDir(cwd: string): string | null {\n const candidates = [\n path.join(cwd, 'content'),\n path.join(cwd, 'docs'),\n path.join(cwd, 'pages', 'docs'),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\n/**\n * Find app directory\n */\nexport function findAppDir(cwd: string): string | null {\n const appDir = path.join(cwd, 'app');\n return fs.existsSync(appDir) ? appDir : null;\n}\n","/**\n * Link checker for MDX documentation\n * Checks all internal links in content/ folder and verifies pages exist\n * Properly handles Nextra's routing behavior for relative links\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport type {\n ContentConfig,\n ExtractedLink,\n BrokenLink,\n LinkCheckResult,\n LinkType,\n DEFAULT_CONFIG,\n} from './types.js';\nimport { getAllMdxFiles, getFileInfo, pathExists } from './scanner.js';\n\n// Link patterns for MDX files (handles optional #anchor)\nconst LINK_PATTERNS: { regex: RegExp; type: LinkType }[] = [\n // Absolute links: [text](/docs/path)\n { regex: /\\]\\(\\/docs\\/([^)#\\s\"]+)/g, type: 'absolute' },\n { regex: /href=\"\\/docs\\/([^\"#]+)\"/g, type: 'absolute' },\n { regex: /to=\"\\/docs\\/([^\"#]+)\"/g, type: 'absolute' },\n // Dot-slash relative: [text](./path)\n { regex: /\\]\\(\\.\\/([^)#\\s\"]+)(?:#[^)]*)?\\)/g, type: 'dotslash' },\n { regex: /href=\"\\.\\/([^\"#]+)\"/g, type: 'dotslash' },\n // Parent relative: [text](../path)\n { regex: /\\]\\(\\.\\.\\/([^)#\\s\"]+)(?:#[^)]*)?\\)/g, type: 'parent' },\n { regex: /href=\"\\.\\.\\/([^\"#]+)\"/g, type: 'parent' },\n // Simple relative (no prefix): [text](path)\n { regex: /\\]\\((?!\\/|http|#|\\.|\\[)([a-zA-Z][^)#\\s\"]*)(?:#[^)]*)?\\)/g, type: 'simple' },\n { regex: /href=\"(?!\\/|http|#|\\.)([a-zA-Z][^\"#]*)\"/g, type: 'simple' },\n];\n\n/**\n * Check if link points to an asset file\n */\nfunction isAssetLink(linkPath: string, assetExtensions: string[]): boolean {\n return assetExtensions.some(ext => linkPath.toLowerCase().endsWith(ext));\n}\n\n/**\n * Resolve a link to an absolute docs path\n * Mimics how Nextra/browser resolves links\n */\nfunction resolveLink(\n fromFilePath: string,\n linkPath: string,\n linkType: LinkType,\n contentDir: string\n): string {\n if (linkType === 'absolute') {\n return linkPath;\n }\n\n const { isIndex, folder: sourceFolder, name: fileName } = getFileInfo(fromFilePath, contentDir);\n const sourceParts = sourceFolder ? sourceFolder.split('/') : [];\n\n if (linkType === 'dotslash' || linkType === 'simple') {\n // ./ or simple relative\n if (isIndex) {\n // index.mdx at /foo/ -> ./bar resolves to /foo/bar\n return sourceFolder ? `${sourceFolder}/${linkPath}` : linkPath;\n } else {\n // page.mdx at /foo/page -> ./bar resolves to /foo/page/bar (browser behavior!)\n return sourceFolder ? `${sourceFolder}/${fileName}/${linkPath}` : `${fileName}/${linkPath}`;\n }\n }\n\n if (linkType === 'parent') {\n // ../bar\n if (isIndex) {\n // index.mdx at /foo/ -> ../bar resolves to /bar (go up from foo)\n const newParts = [...sourceParts];\n newParts.pop();\n return newParts.length ? `${newParts.join('/')}/${linkPath}` : linkPath;\n } else {\n // page.mdx at /foo/page -> ../bar resolves to /foo/bar\n return sourceParts.length ? `${sourceParts.join('/')}/${linkPath}` : linkPath;\n }\n }\n\n return linkPath;\n}\n\n/**\n * Extract all links from a file\n */\nfunction extractLinks(\n filePath: string,\n contentDir: string,\n assetExtensions: string[]\n): ExtractedLink[] {\n const content = fs.readFileSync(filePath, 'utf-8');\n const links: ExtractedLink[] = [];\n\n for (const { regex, type } of LINK_PATTERNS) {\n regex.lastIndex = 0;\n let match;\n while ((match = regex.exec(content)) !== null) {\n const rawLink = match[1];\n if (!rawLink) continue;\n\n // Skip asset links\n if (isAssetLink(rawLink, assetExtensions)) continue;\n\n const resolved = resolveLink(filePath, rawLink, type, contentDir);\n links.push({\n raw: rawLink,\n resolved,\n type,\n line: content.substring(0, match.index).split('\\n').length,\n });\n }\n }\n\n return links;\n}\n\n/**\n * Check all links in content directory\n */\nexport function checkContentLinks(\n contentDir: string,\n config?: Partial<ContentConfig>\n): LinkCheckResult {\n const assetExtensions = config?.assetExtensions || [\n '.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico', '.pdf', '.zip', '.tar', '.gz'\n ];\n const basePath = config?.basePath || '/docs';\n\n const files = getAllMdxFiles(contentDir);\n const brokenLinks: BrokenLink[] = [];\n const checkedLinks = new Map<string, boolean>();\n\n for (const file of files) {\n const links = extractLinks(file, contentDir, assetExtensions);\n const relativePath = path.relative(contentDir, file);\n\n for (const link of links) {\n // Check if we've already verified this path\n if (!checkedLinks.has(link.resolved)) {\n checkedLinks.set(link.resolved, pathExists(link.resolved, contentDir));\n }\n\n if (!checkedLinks.get(link.resolved)) {\n brokenLinks.push({\n file: relativePath,\n link: `${basePath}/${link.resolved}`,\n type: link.type,\n raw: link.raw,\n line: link.line,\n });\n }\n }\n }\n\n return {\n filesChecked: files.length,\n uniqueLinks: checkedLinks.size,\n brokenLinks,\n success: brokenLinks.length === 0,\n };\n}\n\n/**\n * Group broken links by file for display\n */\nexport function groupBrokenLinksByFile(\n brokenLinks: BrokenLink[]\n): Map<string, BrokenLink[]> {\n const byFile = new Map<string, BrokenLink[]>();\n\n for (const link of brokenLinks) {\n const existing = byFile.get(link.file) || [];\n existing.push(link);\n byFile.set(link.file, existing);\n }\n\n return byFile;\n}\n","/**\n * Link fixer for MDX documentation\n * Converts absolute /docs/ links to relative when appropriate\n *\n * Nextra routing rules:\n * - index.mdx at /foo/ -> ./bar resolves to /foo/bar ✓\n * - page.mdx at /foo/page -> ./bar resolves to /foo/page/bar ✗ (browser behavior)\n *\n * So for non-index files linking to siblings, we need ../sibling\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport type { ContentConfig, LinkFix, LinkFixResult, FixLinksResult } from './types.js';\nimport { getAllMdxFiles, getFileInfo, pathExists } from './scanner.js';\n\n/**\n * Check if link points to an asset file\n */\nfunction isAssetLink(linkPath: string, assetExtensions: string[]): boolean {\n return assetExtensions.some(ext => linkPath.toLowerCase().endsWith(ext));\n}\n\n/**\n * Calculate relative path from source to target, respecting Nextra routing\n * Returns null if can't be relative (target is outside source's scope)\n */\nfunction calculateRelativePath(\n sourceFile: string,\n targetDocsPath: string,\n contentDir: string\n): string | null {\n const { isIndex, folder: sourceFolder } = getFileInfo(sourceFile, contentDir);\n const targetPath = targetDocsPath.replace(/^\\//, '');\n\n // Split paths into parts\n const sourceParts = sourceFolder ? sourceFolder.split('/') : [];\n const targetParts = targetPath.split('/');\n\n // Find common prefix\n let commonLength = 0;\n for (let i = 0; i < Math.min(sourceParts.length, targetParts.length); i++) {\n if (sourceParts[i] === targetParts[i]) {\n commonLength++;\n } else {\n break;\n }\n }\n\n // For index files: can use ./ for same folder or subfolders\n // For non-index files: need to go up first with ../\n\n if (isIndex) {\n // index.mdx at /foo/ can use ./bar for /foo/bar\n if (targetPath.startsWith(sourceFolder + '/') || sourceFolder === '') {\n const relative = sourceFolder ? targetPath.slice(sourceFolder.length + 1) : targetPath;\n return './' + relative;\n }\n // Target is outside - need ../\n const upsNeeded = sourceParts.length - commonLength;\n const downs = targetParts.slice(commonLength);\n if (upsNeeded <= 1) {\n return '../'.repeat(upsNeeded) + downs.join('/');\n }\n return null; // Too far up, keep absolute\n } else {\n // Non-index file at /foo/page needs ../bar for /foo/bar (sibling)\n // and ./bar would go to /foo/page/bar which is wrong\n\n if (targetPath.startsWith(sourceFolder + '/') || sourceFolder === '') {\n // Same folder - target is sibling\n const relative = sourceFolder ? targetPath.slice(sourceFolder.length + 1) : targetPath;\n if (!relative.includes('/')) {\n // Sibling file\n return '../' + relative;\n }\n // Subfolder of same folder\n return '../' + relative;\n }\n\n // Different folder\n const upsNeeded = sourceParts.length - commonLength + 1; // +1 because non-index\n const downs = targetParts.slice(commonLength);\n if (upsNeeded <= 2) {\n return '../'.repeat(upsNeeded) + downs.join('/');\n }\n return null; // Too far, keep absolute\n }\n}\n\n/**\n * Process a single file and find fixable links\n */\nfunction processFile(\n filePath: string,\n contentDir: string,\n assetExtensions: string[]\n): LinkFix[] {\n const content = fs.readFileSync(filePath, 'utf-8');\n const fixes: LinkFix[] = [];\n\n const patterns = [\n { regex: /(\\]\\()\\/docs\\/([^)#\\s\"]+)(\\))/g },\n { regex: /(href=\")\\/docs\\/([^\"#]+)(\")/g },\n ];\n\n for (const { regex } of patterns) {\n regex.lastIndex = 0;\n let match;\n\n while ((match = regex.exec(content)) !== null) {\n const targetPath = match[2];\n if (!targetPath) continue;\n\n // Skip assets\n if (isAssetLink(targetPath, assetExtensions)) continue;\n\n // Skip if target doesn't exist\n if (!pathExists(targetPath, contentDir)) continue;\n\n const relativePath = calculateRelativePath(filePath, targetPath, contentDir);\n\n if (relativePath) {\n fixes.push({\n from: `/docs/${targetPath}`,\n to: relativePath,\n line: content.substring(0, match.index).split('\\n').length,\n });\n }\n }\n }\n\n return fixes;\n}\n\n/**\n * Apply fixes to a file\n */\nfunction applyFixes(filePath: string, fixes: LinkFix[]): void {\n let content = fs.readFileSync(filePath, 'utf-8');\n\n for (const { from, to } of fixes) {\n content = content.split(from).join(to);\n }\n\n fs.writeFileSync(filePath, content, 'utf-8');\n}\n\n/**\n * Fix absolute links to relative in content directory\n */\nexport function fixContentLinks(\n contentDir: string,\n options: { apply?: boolean; config?: Partial<ContentConfig> } = {}\n): FixLinksResult {\n const { apply = false, config } = options;\n const assetExtensions = config?.assetExtensions || [\n '.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico', '.pdf'\n ];\n\n const files = getAllMdxFiles(contentDir);\n let totalChanges = 0;\n const fileChanges: LinkFixResult[] = [];\n\n for (const file of files) {\n const fixes = processFile(file, contentDir, assetExtensions);\n\n if (fixes.length > 0) {\n const relativePath = path.relative(contentDir, file);\n fileChanges.push({\n file: relativePath,\n fullPath: file,\n fixes,\n });\n totalChanges += fixes.length;\n\n if (apply) {\n applyFixes(file, fixes);\n }\n }\n }\n\n return {\n totalChanges,\n fileChanges,\n applied: apply,\n };\n}\n","/**\n * Universal Sitemap Generator for Next.js App Router projects\n * Supports both Nextra (MDX content) and standard Next.js projects\n */\n\nimport fs from 'fs';\nimport path from 'path';\nimport type { SitemapItem, SitemapData, ContentConfig } from './types.js';\nimport { scanRoutes, type RouteInfo } from '../routes/scanner.js';\nimport { detectProjectType } from './scanner.js';\n\n/**\n * Dynamically import _meta.ts file (Nextra pattern)\n */\nasync function getMeta(dir: string): Promise<Record<string, unknown>> {\n const metaPath = path.join(dir, '_meta.ts');\n if (!fs.existsSync(metaPath)) return {};\n\n try {\n const meta = await import(metaPath);\n return meta.default || {};\n } catch {\n // Fallback: try to parse with regex for simple cases\n try {\n const content = fs.readFileSync(metaPath, 'utf-8');\n const matches = content.matchAll(/'([^']+)':\\s*['\"]([^'\"]+)['\"]/g);\n const result: Record<string, string> = {};\n for (const match of matches) {\n const key = match[1];\n const value = match[2];\n if (key && value) {\n result[key] = value;\n }\n }\n return result;\n } catch {\n return {};\n }\n }\n}\n\n/**\n * Get title from meta object\n */\nfunction getTitleFromMeta(key: string, meta: Record<string, unknown>): string {\n const value = meta[key];\n if (!value) return key;\n if (typeof value === 'string') return value;\n if (typeof value === 'object' && value !== null && 'title' in value) {\n return String((value as { title: unknown }).title);\n }\n return key;\n}\n\n/**\n * Scan Nextra content directory recursively\n */\nasync function scanContent(\n dir: string,\n baseUrl: string = '/docs'\n): Promise<SitemapItem[]> {\n const items: SitemapItem[] = [];\n\n if (!fs.existsSync(dir)) return items;\n\n const meta = await getMeta(dir);\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n // Build file map\n const fileMap = new Map<string, fs.Dirent>();\n for (const entry of entries) {\n const key = entry.name.replace(/\\.mdx?$/, '');\n fileMap.set(key, entry);\n }\n\n // Process meta keys first to preserve order\n const metaKeys = Object.keys(meta);\n for (const key of metaKeys) {\n const entry = fileMap.get(key);\n if (!entry) continue;\n\n fileMap.delete(key);\n const fullPath = path.join(dir, entry.name);\n const itemPath = path.join(baseUrl, key).replace(/\\\\/g, '/');\n\n if (entry.isDirectory()) {\n const children = await scanContent(fullPath, itemPath);\n items.push({\n title: getTitleFromMeta(key, meta),\n path: itemPath,\n children: children.length > 0 ? children : undefined,\n });\n } else if (entry.isFile() && (entry.name.endsWith('.md') || entry.name.endsWith('.mdx'))) {\n if (entry.name !== 'index.mdx' && entry.name !== 'index.md') {\n items.push({\n title: getTitleFromMeta(key, meta),\n path: itemPath,\n });\n }\n }\n }\n\n // Process remaining entries not in meta\n for (const [key, entry] of fileMap.entries()) {\n if (key.startsWith('_') || key.startsWith('.')) continue;\n\n const fullPath = path.join(dir, entry.name);\n const itemPath = path.join(baseUrl, key).replace(/\\\\/g, '/');\n\n if (entry.isDirectory()) {\n const children = await scanContent(fullPath, itemPath);\n items.push({\n title: key,\n path: itemPath,\n children: children.length > 0 ? children : undefined,\n });\n } else if (entry.isFile() && (entry.name.endsWith('.md') || entry.name.endsWith('.mdx'))) {\n if (entry.name !== 'index.mdx' && entry.name !== 'index.md') {\n items.push({\n title: key,\n path: itemPath,\n });\n }\n }\n }\n\n return items;\n}\n\n/**\n * Convert route path to title\n */\nfunction routeToTitle(routePath: string): string {\n const segment = routePath.split('/').filter(Boolean).pop() || 'Home';\n // Skip dynamic segments\n if (segment.startsWith('[')) return segment;\n // Capitalize and replace hyphens\n return segment\n .split('-')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Convert routes to sitemap items (tree structure)\n * Uses existing routes/scanner.ts for universal Next.js support\n */\nfunction routesToSitemapItems(routes: RouteInfo[]): SitemapItem[] {\n // Build tree from flat routes\n const root: Map<string, SitemapItem> = new Map();\n const items: SitemapItem[] = [];\n\n // Sort routes by path depth\n const sortedRoutes = [...routes]\n .filter(r => r.type === 'page' && !r.isDynamic) // Only static pages\n .sort((a, b) => a.path.split('/').length - b.path.split('/').length);\n\n for (const route of sortedRoutes) {\n const segments = route.path.split('/').filter(Boolean);\n\n if (segments.length === 0) {\n // Root path\n items.push({\n title: 'Home',\n path: '/',\n });\n continue;\n }\n\n // Find or create parent\n let currentPath = '';\n let parentChildren: SitemapItem[] = items;\n\n for (let i = 0; i < segments.length - 1; i++) {\n currentPath += '/' + segments[i];\n let parent = root.get(currentPath);\n\n if (!parent) {\n parent = {\n title: routeToTitle(currentPath),\n path: currentPath,\n children: [],\n };\n root.set(currentPath, parent);\n parentChildren.push(parent);\n }\n\n parentChildren = parent.children || (parent.children = []);\n }\n\n // Add current item\n const item: SitemapItem = {\n title: routeToTitle(route.path),\n path: route.path,\n };\n parentChildren.push(item);\n }\n\n return items;\n}\n\n/**\n * Generate sitemap data from project\n * Auto-detects project type (Nextra vs standard Next.js)\n */\nexport async function generateSitemapData(\n cwd: string,\n config?: Partial<ContentConfig>\n): Promise<SitemapData> {\n const projectType = detectProjectType(cwd);\n const contentDir = path.join(cwd, config?.contentDir || 'content');\n const appDir = path.join(cwd, config?.appDir || 'app');\n const basePath = config?.basePath || '/docs';\n\n let docsItems: SitemapItem[] = [];\n let appItems: SitemapItem[] = [];\n\n // Scan content/ for Nextra projects\n if (projectType === 'nextra' && fs.existsSync(contentDir)) {\n docsItems = await scanContent(contentDir, basePath);\n }\n\n // Scan app/ using routes scanner (universal)\n if (fs.existsSync(appDir)) {\n try {\n const scanResult = scanRoutes({ appDir, includeApi: false });\n appItems = routesToSitemapItems(scanResult.routes);\n } catch {\n // Fallback to simple scan if routes scanner fails\n appItems = [];\n }\n }\n\n return {\n app: appItems,\n docs: docsItems,\n };\n}\n\n/**\n * Generate TypeScript file content\n */\nfunction generateTsContent(data: SitemapData): string {\n return `\n// This file is auto-generated by @djangocfg/seo\n// Do not edit manually\n\nexport interface SitemapItem {\n title: string;\n path: string;\n children?: SitemapItem[];\n}\n\nexport const sitemap: { app: SitemapItem[], docs: SitemapItem[] } = ${JSON.stringify(data, null, 2)};\n`;\n}\n\n/**\n * Generate and save sitemap file\n */\nexport async function generateSitemap(\n cwd: string,\n options: {\n output?: string;\n config?: Partial<ContentConfig>;\n } = {}\n): Promise<{ outputPath: string; data: SitemapData }> {\n const output = options.output || 'app/_core/sitemap.ts';\n const outputPath = path.join(cwd, output);\n\n // Generate data\n const data = await generateSitemapData(cwd, options.config);\n\n // Ensure output directory exists\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n // Write file\n const content = generateTsContent(data);\n fs.writeFileSync(outputPath, content);\n\n return { outputPath, data };\n}\n\n/**\n * Flatten sitemap items to list of paths\n */\nexport function flattenSitemap(items: SitemapItem[]): string[] {\n const paths: string[] = [];\n\n function traverse(item: SitemapItem) {\n paths.push(item.path);\n if (item.children) {\n for (const child of item.children) {\n traverse(child);\n }\n }\n }\n\n for (const item of items) {\n traverse(item);\n }\n\n return paths;\n}\n\n/**\n * Count total items in sitemap\n */\nexport function countSitemapItems(data: SitemapData): { app: number; docs: number; total: number } {\n const appPaths = flattenSitemap(data.app);\n const docsPaths = flattenSitemap(data.docs);\n\n return {\n app: appPaths.length,\n docs: docsPaths.length,\n total: appPaths.length + docsPaths.length,\n };\n}\n","/**\n * Content Command - MDX/Nextra content tools\n * Subcommands: check, fix, sitemap\n */\n\nimport consola from 'consola';\nimport chalk from 'chalk';\nimport path from 'path';\nimport {\n checkContentLinks,\n groupBrokenLinksByFile,\n fixContentLinks,\n generateSitemap,\n countSitemapItems,\n detectProjectType,\n findContentDir,\n} from '../../content/index.js';\nimport type { CliOptions } from '../types.js';\n\nconst CONTENT_HELP = `\n${chalk.bold('Content Commands')} - MDX/Nextra content tools\n\n${chalk.bold('Usage:')}\n djangocfg-seo content <subcommand> [options]\n\n${chalk.bold('Subcommands:')}\n check Check links in content/ directory\n fix Fix absolute links to relative\n sitemap Generate sitemap.ts from content/\n\n${chalk.bold('Options:')}\n --content-dir <path> Content directory (default: content/)\n --output <path> Output file for sitemap (default: app/_core/sitemap.ts)\n --fix Apply fixes (for 'fix' subcommand)\n --base-path <path> Base URL path (default: /docs)\n\n${chalk.bold('Examples:')}\n djangocfg-seo content check\n djangocfg-seo content fix --fix\n djangocfg-seo content sitemap --output app/_core/sitemap.ts\n`;\n\nexport async function runContent(options: CliOptions) {\n const subcommand = options._[1]; // content <subcommand>\n\n if (!subcommand || subcommand === 'help') {\n console.log(CONTENT_HELP);\n return;\n }\n\n const cwd = process.cwd();\n const contentDir = options['content-dir']\n ? path.resolve(cwd, options['content-dir'])\n : findContentDir(cwd);\n\n if (!contentDir && subcommand !== 'sitemap') {\n consola.error('Could not find content/ directory. Use --content-dir to specify path.');\n process.exit(1);\n }\n\n // Detect project type\n const projectType = detectProjectType(cwd);\n console.log('');\n consola.box(`${chalk.bold('Content Tools')}\\nProject: ${projectType}\\nPath: ${contentDir || cwd}`);\n\n switch (subcommand) {\n case 'check':\n await runCheck(contentDir!, options);\n break;\n case 'fix':\n await runFix(contentDir!, options);\n break;\n case 'sitemap':\n await runSitemapGenerate(cwd, options);\n break;\n default:\n consola.error(`Unknown subcommand: ${subcommand}`);\n console.log(CONTENT_HELP);\n process.exit(1);\n }\n}\n\n/**\n * Check links in content directory\n */\nasync function runCheck(contentDir: string, options: CliOptions) {\n consola.start('Checking links in content/ folder...');\n\n const basePath = options['base-path'] || '/docs';\n const result = checkContentLinks(contentDir, { basePath });\n\n if (result.success) {\n console.log('');\n consola.success('All links are valid!');\n console.log(` Checked ${result.filesChecked} files, ${result.uniqueLinks} unique links.`);\n return;\n }\n\n console.log('');\n consola.error(`Found ${result.brokenLinks.length} broken links:`);\n console.log('');\n\n const byFile = groupBrokenLinksByFile(result.brokenLinks);\n\n for (const [file, links] of byFile) {\n console.log(`${chalk.cyan('📄')} ${file}`);\n for (const link of links) {\n console.log(` L${link.line}: ${chalk.red('✗')} ${link.link} ${chalk.dim(`(${link.type}: \"${link.raw}\")`)}`);\n }\n console.log('');\n }\n\n console.log(`${chalk.bold('Summary:')} ${result.brokenLinks.length} broken links in ${byFile.size} files`);\n console.log(` Checked ${result.filesChecked} files, ${result.uniqueLinks} unique links.`);\n\n process.exit(1);\n}\n\n/**\n * Fix absolute links to relative\n */\nasync function runFix(contentDir: string, options: CliOptions) {\n const applyFixes = options.fix === true;\n\n consola.start(applyFixes ? 'Fixing links...' : 'Checking for absolute links that can be relative...');\n\n const result = fixContentLinks(contentDir, { apply: applyFixes });\n\n if (result.totalChanges === 0) {\n console.log('');\n consola.success('No absolute links that can be converted to relative.');\n return;\n }\n\n console.log('');\n console.log(`Found ${result.totalChanges} links that can be relative:`);\n console.log('');\n\n for (const { file, fixes } of result.fileChanges) {\n console.log(`${chalk.cyan('📄')} ${file}`);\n for (const { from, to, line } of fixes) {\n console.log(` L${line}: ${from} ${chalk.yellow('→')} ${to}`);\n }\n console.log('');\n }\n\n if (applyFixes) {\n consola.success(`Fixed ${result.totalChanges} links in ${result.fileChanges.length} files.`);\n } else {\n console.log(`${chalk.yellow('💡')} Run with --fix to apply changes:`);\n console.log(` djangocfg-seo content fix --fix`);\n }\n}\n\n/**\n * Generate sitemap.ts\n */\nasync function runSitemapGenerate(cwd: string, options: CliOptions) {\n consola.start('Generating sitemap...');\n\n // Use specific sitemap output, not the report output directory\n // Check if output ends with .ts (sitemap file) or use default\n const rawOutput = options.output;\n const output = rawOutput?.endsWith('.ts') ? rawOutput : 'app/_core/sitemap.ts';\n const contentDir = options['content-dir'] || 'content';\n const basePath = options['base-path'] || '/docs';\n\n const { outputPath, data } = await generateSitemap(cwd, {\n output,\n config: { contentDir, basePath },\n });\n\n const counts = countSitemapItems(data);\n\n console.log('');\n consola.success(`Sitemap generated at ${outputPath}`);\n console.log(` ├── App pages: ${counts.app}`);\n console.log(` ├── Doc pages: ${counts.docs}`);\n console.log(` └── Total: ${counts.total}`);\n}\n","#!/usr/bin/env node\n\n/**\n * @djangocfg/seo - CLI Tool\n */\n\nimport { parseArgs } from 'node:util';\nimport consola from 'consola';\nimport chalk from 'chalk';\nimport { loadEnvFiles } from '../config.js';\nimport { runAudit, runRoutes, runInspect, runCrawl, runLinks, runRobots, runSitemap, runContent } from './commands/index.js';\nimport type { CliOptions } from './types.js';\n\nloadEnvFiles();\n\nconst VERSION = '1.0.0';\n\nconst HELP = `\n${chalk.bold('@djangocfg/seo')} - SEO Analysis Tool v${VERSION}\n\n${chalk.bold('Usage:')}\n djangocfg-seo <command> [options]\n\n${chalk.bold('Commands:')}\n audit Full SEO audit (robots + sitemap + crawl + links)\n routes Scan app/ directory and compare with sitemap\n content MDX content tools (check, fix, sitemap)\n crawl Crawl site and analyze SEO issues\n links Check all links for broken links\n robots Analyze robots.txt\n sitemap Validate sitemap\n inspect Inspect URLs via Google Search Console API\n\n${chalk.bold('Options:')}\n --env, -e Environment: prod (default) or dev\n --site, -s Site URL (overrides env detection)\n --output, -o Output directory for reports\n --format, -f Report format: split (default), json, markdown, ai-summary, all\n --max-pages Maximum pages to crawl (default: 100)\n --max-depth Maximum crawl depth (default: 3)\n --timeout Request timeout in ms (default: 60000)\n --concurrency Max concurrent requests (default: 50)\n --service-account Path to Google service account JSON\n --app-dir Path to app/ directory (for routes command)\n --content-dir Path to content/ directory (for content command)\n --base-path Base URL path for docs (default: /docs)\n --check Compare routes with sitemap\n --verify Verify routes are accessible\n --fix Apply fixes (for content fix command)\n --help, -h Show this help\n --version, -v Show version\n\n${chalk.bold('Examples:')}\n ${chalk.dim('# Full SEO audit')}\n djangocfg-seo audit\n\n ${chalk.dim('# Scan app routes and compare with sitemap')}\n djangocfg-seo routes --check\n\n ${chalk.dim('# Check links on production')}\n djangocfg-seo links\n\n ${chalk.dim('# Check MDX content links')}\n djangocfg-seo content check\n\n ${chalk.dim('# Fix absolute links to relative')}\n djangocfg-seo content fix --fix\n\n ${chalk.dim('# Generate sitemap.ts from content')}\n djangocfg-seo content sitemap\n`;\n\nasync function main() {\n const { values, positionals } = parseArgs({\n allowPositionals: true,\n options: {\n env: { type: 'string', short: 'e', default: 'prod' },\n site: { type: 'string', short: 's' },\n output: { type: 'string', short: 'o', default: './seo-reports' },\n urls: { type: 'string', short: 'u' },\n 'max-pages': { type: 'string', default: '100' },\n 'max-depth': { type: 'string', default: '3' },\n timeout: { type: 'string', default: '60000' },\n concurrency: { type: 'string', default: '50' },\n format: { type: 'string', short: 'f', default: 'split' },\n 'service-account': { type: 'string' },\n 'app-dir': { type: 'string' },\n 'content-dir': { type: 'string' },\n 'base-path': { type: 'string' },\n check: { type: 'boolean' },\n verify: { type: 'boolean' },\n fix: { type: 'boolean' },\n help: { type: 'boolean', short: 'h' },\n version: { type: 'boolean', short: 'v' },\n },\n });\n\n if (values.version) {\n console.log(VERSION);\n process.exit(0);\n }\n\n if (values.help || positionals.length === 0) {\n console.log(HELP);\n process.exit(0);\n }\n\n const command = positionals[0];\n const options = { ...values, _: positionals } as unknown as CliOptions;\n\n try {\n switch (command) {\n case 'audit':\n case 'report':\n await runAudit(options);\n break;\n case 'routes':\n await runRoutes(options);\n break;\n case 'inspect':\n await runInspect(options);\n break;\n case 'crawl':\n await runCrawl(options);\n break;\n case 'links':\n await runLinks(options);\n break;\n case 'robots':\n await runRobots(options);\n break;\n case 'sitemap':\n await runSitemap(options);\n break;\n case 'content':\n await runContent(options);\n break;\n default:\n consola.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exit(1);\n }\n } catch (error) {\n consola.error(error);\n process.exit(1);\n }\n}\n\nmain().catch(consola.error);\n"]}
|