@sleekdesign/ccw25 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +2037 -0
- package/dist/index.d.ts +970 -0
- package/dist/index.js +2117 -0
- package/dist/index.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/loader/index.ts","../src/loader/parser.ts","../src/loader/paths.ts","../src/loader/iterator.ts","../src/metrics/index.ts","../src/pricing/index.ts","../src/pricing/models.ts","../src/types/jsonl.ts","../src/utils/aggregators.ts","../src/metrics/collaboration.ts","../src/utils/dates.ts","../src/metrics/core.ts","../src/metrics/fun.ts","../src/metrics/models.ts","../src/metrics/patterns.ts","../src/metrics/projects.ts","../src/metrics/tools.ts","../src/output/index.ts","../src/output/json.ts","../src/output/templates.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Data loading for Claude Code Wrapped\n */\n\nimport { collectAllEntries, enumerateSessions } from \"./iterator\";\nimport { parseStatsCache } from \"./parser\";\nimport { getClaudePaths } from \"./paths\";\n\nimport type { ResolvedConfig } from \"../types/config\";\nimport type { JSONLEntry, SessionData, StatsCache } from \"../types/jsonl\";\n\nexport {\n collectAllEntries,\n enumerateSessions,\n iterateSessions,\n loadAllSessions,\n loadSession,\n} from \"./iterator\";\nexport { parseJSONLFile, parseJSONLFileAll, parseLine } from \"./parser\";\nexport {\n detectClaudeDir,\n discoverProjects,\n discoverSessionFiles,\n extractProjectPath,\n extractSessionId,\n filterFilesByDate,\n getClaudePaths,\n getFileModTime,\n parseProjectName,\n} from \"./paths\";\n\nexport type { SessionIteratorOptions, SessionMetadata } from \"./iterator\";\nexport type { ParseResult, ParseStats } from \"./parser\";\nexport type { ClaudePaths, ProjectInfo } from \"./paths\";\n\n/**\n * Loaded Claude data ready for analysis\n */\nexport type LoadedData = {\n sessions: Array<SessionData>;\n entries: Array<JSONLEntry & { sessionId: string; projectPath: string }>;\n statsCache: StatsCache | null;\n config: ResolvedConfig;\n};\n\n/**\n * Load all Claude data based on configuration\n */\nexport async function loadClaudeData(\n config: ResolvedConfig\n): Promise<LoadedData> {\n const paths = getClaudePaths(config.baseDir);\n\n // Load stats cache if enabled\n let statsCache: StatsCache | null = null;\n if (config.useStatsCache) {\n const cache = await parseStatsCache(paths.statsCacheFile);\n if (cache && typeof cache.version === \"number\") {\n statsCache = cache as StatsCache;\n }\n }\n\n // Collect all entries from sessions\n const { entries } = await collectAllEntries({\n baseDir: config.baseDir,\n dateRange: config.dateRange,\n projectFilter: config.projectFilter,\n });\n\n // Build session list (without re-loading entries)\n const sessionMetadataList = enumerateSessions({\n baseDir: config.baseDir,\n dateRange: config.dateRange,\n projectFilter: config.projectFilter,\n });\n\n // Group entries by session\n const sessionMap = new Map<string, SessionData>();\n for (const entry of entries) {\n const existing = sessionMap.get(entry.sessionId);\n if (existing) {\n existing.entries.push(entry);\n } else {\n const meta = sessionMetadataList.find(\n (m) => m.sessionId === entry.sessionId\n );\n sessionMap.set(entry.sessionId, {\n sessionId: entry.sessionId,\n projectPath: entry.projectPath,\n filePath: meta?.filePath ?? \"\",\n entries: [entry],\n });\n }\n }\n\n const sessions = Array.from(sessionMap.values());\n\n return {\n sessions,\n entries,\n statsCache,\n config,\n };\n}\n\n/**\n * Resolve configuration with defaults\n */\nexport function resolveConfig(\n config: Partial<ResolvedConfig> = {}\n): ResolvedConfig {\n const now = new Date();\n const year = config.year ?? now.getFullYear();\n\n // Default date range: full year\n const defaultFrom = new Date(year, 0, 1); // Jan 1\n const defaultTo = new Date(year, 11, 31, 23, 59, 59, 999); // Dec 31 23:59:59\n\n return {\n baseDir: config.baseDir ?? getClaudePaths().baseDir,\n year,\n dateRange: config.dateRange ?? {\n from: defaultFrom,\n to: defaultTo,\n },\n projectFilter: config.projectFilter ?? null,\n useStatsCache: config.useStatsCache ?? true,\n };\n}\n","/**\n * JSONL stream parser for Claude Code session files\n */\n\nimport { createReadStream } from \"node:fs\";\nimport { createInterface } from \"node:readline\";\n\nimport type { JSONLEntry } from \"../types/jsonl\";\n\n/**\n * Parse result for a single line\n */\nexport type ParseResult =\n | { success: true; entry: JSONLEntry }\n | { success: false; error: string; line: number };\n\n/**\n * Validate that an object has the expected entry structure\n */\nfunction validateEntry(obj: unknown): obj is JSONLEntry {\n if (typeof obj !== \"object\" || obj === null) {\n return false;\n }\n\n const entry = obj as Record<string, unknown>;\n\n // Must have a type field\n if (typeof entry.type !== \"string\") {\n return false;\n }\n\n // Validate based on type\n switch (entry.type) {\n case \"user\":\n case \"assistant\":\n case \"summary\":\n case \"file-history-snapshot\":\n return true;\n default:\n // Unknown type, but still valid structure\n return true;\n }\n}\n\n/**\n * Parse a single JSONL line\n */\nexport function parseLine(line: string, lineNumber: number): ParseResult {\n const trimmed = line.trim();\n\n // Skip empty lines\n if (trimmed === \"\") {\n return {\n success: false,\n error: \"Empty line\",\n line: lineNumber,\n };\n }\n\n try {\n const parsed = JSON.parse(trimmed);\n\n if (!validateEntry(parsed)) {\n return {\n success: false,\n error: \"Invalid entry structure\",\n line: lineNumber,\n };\n }\n\n return {\n success: true,\n entry: parsed as JSONLEntry,\n };\n } catch (e) {\n return {\n success: false,\n error: e instanceof Error ? e.message : \"Parse error\",\n line: lineNumber,\n };\n }\n}\n\n/**\n * Parsing statistics\n */\nexport type ParseStats = {\n totalLines: number;\n successfulLines: number;\n failedLines: number;\n errors: Array<{ line: number; error: string }>;\n};\n\n/**\n * Parse a JSONL file and yield entries\n */\nexport async function* parseJSONLFile(\n filePath: string\n): AsyncGenerator<JSONLEntry, ParseStats> {\n const stats: ParseStats = {\n totalLines: 0,\n successfulLines: 0,\n failedLines: 0,\n errors: [],\n };\n\n const fileStream = createReadStream(filePath, { encoding: \"utf-8\" });\n const rl = createInterface({\n input: fileStream,\n crlfDelay: Number.POSITIVE_INFINITY,\n });\n\n let lineNumber = 0;\n\n for await (const line of rl) {\n lineNumber += 1;\n stats.totalLines += 1;\n\n const result = parseLine(line, lineNumber);\n\n if (result.success) {\n stats.successfulLines += 1;\n yield result.entry;\n } else {\n stats.failedLines += 1;\n // Only track non-empty line errors (don't spam with empty lines)\n if (result.error !== \"Empty line\") {\n stats.errors.push({\n line: result.line,\n error: result.error,\n });\n }\n }\n }\n\n return stats;\n}\n\n/**\n * Parse a JSONL file and return all entries at once\n */\nexport async function parseJSONLFileAll(\n filePath: string\n): Promise<{ entries: Array<JSONLEntry>; stats: ParseStats }> {\n const entries: Array<JSONLEntry> = [];\n let finalStats: ParseStats = {\n totalLines: 0,\n successfulLines: 0,\n failedLines: 0,\n errors: [],\n };\n\n const generator = parseJSONLFile(filePath);\n\n // biome-ignore lint/correctness/noConstantCondition: async generator pattern\n while (true) {\n const result = await generator.next();\n\n if (result.done) {\n finalStats = result.value;\n break;\n }\n\n entries.push(result.value);\n }\n\n return { entries, stats: finalStats };\n}\n\n/**\n * Parse stats cache JSON file\n */\nexport async function parseStatsCache(\n filePath: string\n): Promise<{ version: number; dailyActivity: Array<unknown> } | null> {\n try {\n const { readFile } = await import(\"node:fs/promises\");\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n","/**\n * Claude data directory detection and path utilities\n */\n\nimport { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join } from \"node:path\";\n\n/** Default Claude Code data directory */\nconst DEFAULT_CLAUDE_DIR = \".claude\";\n\n/** Projects subdirectory name */\nconst PROJECTS_DIR = \"projects\";\n\n/** History file name */\nconst HISTORY_FILE = \"history.jsonl\";\n\n/** Stats cache file name */\nconst STATS_CACHE_FILE = \"stats-cache.json\";\n\n/**\n * Detected Claude paths\n */\nexport type ClaudePaths = {\n baseDir: string;\n projectsDir: string;\n historyFile: string;\n statsCacheFile: string;\n exists: boolean;\n};\n\n/**\n * Detect Claude data directory\n * Checks CLAUDE_CONFIG_DIR env var first, then falls back to ~/.claude\n */\nexport function detectClaudeDir(): string {\n // biome-ignore lint/nursery/noUndeclaredEnvVars: not necessary\n const envDir = process.env.CLAUDE_CONFIG_DIR;\n if (envDir && existsSync(envDir)) {\n return envDir;\n }\n\n const home = homedir();\n return join(home, DEFAULT_CLAUDE_DIR);\n}\n\n/**\n * Get all Claude paths\n */\nexport function getClaudePaths(baseDir?: string): ClaudePaths {\n const resolvedBase = baseDir ?? detectClaudeDir();\n\n const paths: ClaudePaths = {\n baseDir: resolvedBase,\n projectsDir: join(resolvedBase, PROJECTS_DIR),\n historyFile: join(resolvedBase, HISTORY_FILE),\n statsCacheFile: join(resolvedBase, STATS_CACHE_FILE),\n exists: existsSync(resolvedBase),\n };\n\n return paths;\n}\n\n/**\n * Project directory info\n */\nexport type ProjectInfo = {\n path: string;\n displayName: string;\n dirName: string;\n sessionFiles: Array<string>;\n};\n\n/**\n * Parse project name from directory path\n * Converts encoded path like \"-Users-stefanofa-Projects-reweb-sleek\" to \"sleek\"\n */\nexport function parseProjectName(dirName: string): string {\n // Remove leading dash if present\n const cleaned = dirName.startsWith(\"-\") ? dirName.slice(1) : dirName;\n\n // Split by dashes (encoded path separators)\n const parts = cleaned.split(\"-\").filter(Boolean);\n\n // Return last meaningful part (usually the project name)\n if (parts.length === 0) {\n return \"Unknown Project\";\n }\n\n // Get last 1-2 parts for display\n const lastParts = parts.slice(-2);\n\n // If second-to-last is a common parent like \"Projects\", just use last\n const commonParents = [\"projects\", \"repos\", \"code\", \"dev\", \"src\", \"work\"];\n const firstPart = lastParts[0];\n const secondPart = lastParts[1];\n if (\n lastParts.length === 2 &&\n firstPart &&\n secondPart &&\n commonParents.includes(firstPart.toLowerCase())\n ) {\n return secondPart;\n }\n\n return lastParts.join(\"/\");\n}\n\n/**\n * Discover all project directories\n */\nexport function discoverProjects(projectsDir: string): Array<ProjectInfo> {\n if (!existsSync(projectsDir)) {\n return [];\n }\n\n const projects: Array<ProjectInfo> = [];\n\n try {\n const entries = readdirSync(projectsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const projectPath = join(projectsDir, entry.name);\n const sessionFiles = discoverSessionFiles(projectPath);\n\n if (sessionFiles.length > 0) {\n projects.push({\n path: projectPath,\n displayName: parseProjectName(entry.name),\n dirName: entry.name,\n sessionFiles,\n });\n }\n }\n } catch {\n // Directory not readable\n }\n\n return projects;\n}\n\n/**\n * Discover all JSONL session files in a project directory\n */\nexport function discoverSessionFiles(projectPath: string): Array<string> {\n const files: Array<string> = [];\n\n try {\n const entries = readdirSync(projectPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".jsonl\")) {\n files.push(join(projectPath, entry.name));\n }\n }\n } catch {\n // Directory not readable\n }\n\n return files;\n}\n\n/**\n * Extract session ID from file path\n */\nexport function extractSessionId(filePath: string): string {\n const fileName = basename(filePath, \".jsonl\");\n return fileName;\n}\n\n/**\n * Extract project path from session file path\n */\nexport function extractProjectPath(filePath: string): string {\n const projectDir = dirname(filePath);\n return basename(projectDir);\n}\n\n/**\n * Get file modification time\n */\nexport function getFileModTime(filePath: string): Date | null {\n try {\n const stats = statSync(filePath);\n return stats.mtime;\n } catch {\n return null;\n }\n}\n\n/**\n * Filter files by date range based on modification time\n */\nexport function filterFilesByDate(\n files: Array<string>,\n from: Date,\n to: Date\n): Array<string> {\n return files.filter((file) => {\n const modTime = getFileModTime(file);\n if (!modTime) {\n return false;\n }\n\n return modTime >= from && modTime <= to;\n });\n}\n","/**\n * Async iterator for Claude Code sessions\n */\n\nimport { parseJSONLFileAll } from \"./parser\";\nimport {\n discoverProjects,\n extractProjectPath,\n extractSessionId,\n filterFilesByDate,\n getClaudePaths,\n} from \"./paths\";\n\nimport type { JSONLEntry, SessionData } from \"../types/jsonl\";\n\n/**\n * Options for session iteration\n */\nexport type SessionIteratorOptions = {\n baseDir?: string;\n dateRange?: {\n from: Date;\n to: Date;\n };\n projectFilter?: Array<string> | null;\n};\n\n/**\n * Session metadata without entries (for lightweight enumeration)\n */\nexport type SessionMetadata = {\n sessionId: string;\n projectPath: string;\n projectDisplayName: string;\n filePath: string;\n};\n\n/**\n * Enumerate all sessions without loading content\n */\nexport function enumerateSessions(\n options: SessionIteratorOptions = {}\n): Array<SessionMetadata> {\n const paths = getClaudePaths(options.baseDir);\n\n if (!paths.exists) {\n return [];\n }\n\n const projects = discoverProjects(paths.projectsDir);\n const sessions: Array<SessionMetadata> = [];\n\n for (const project of projects) {\n // Apply project filter if specified\n if (options.projectFilter) {\n const matchesFilter = options.projectFilter.some(\n (filter) =>\n project.displayName.toLowerCase().includes(filter.toLowerCase()) ||\n project.dirName.toLowerCase().includes(filter.toLowerCase())\n );\n if (!matchesFilter) {\n continue;\n }\n }\n\n // Filter files by date if specified\n let files = project.sessionFiles;\n if (options.dateRange) {\n files = filterFilesByDate(\n files,\n options.dateRange.from,\n options.dateRange.to\n );\n }\n\n for (const filePath of files) {\n sessions.push({\n sessionId: extractSessionId(filePath),\n projectPath: extractProjectPath(filePath),\n projectDisplayName: project.displayName,\n filePath,\n });\n }\n }\n\n return sessions;\n}\n\n/**\n * Load a single session's entries\n */\nexport async function loadSession(\n metadata: SessionMetadata\n): Promise<SessionData> {\n const { entries } = await parseJSONLFileAll(metadata.filePath);\n\n return {\n sessionId: metadata.sessionId,\n projectPath: metadata.projectPath,\n filePath: metadata.filePath,\n entries,\n };\n}\n\n/**\n * Async generator that yields sessions with their entries\n */\nexport async function* iterateSessions(\n options: SessionIteratorOptions = {}\n): AsyncGenerator<SessionData> {\n const sessionList = enumerateSessions(options);\n\n for (const metadata of sessionList) {\n try {\n const session = await loadSession(metadata);\n\n // Only yield sessions that have entries\n if (session.entries.length > 0) {\n yield session;\n }\n } catch {\n // Skip files that fail to parse\n }\n }\n}\n\n/**\n * Load all sessions at once (convenience function)\n */\nexport async function loadAllSessions(\n options: SessionIteratorOptions = {}\n): Promise<Array<SessionData>> {\n const sessions: Array<SessionData> = [];\n\n for await (const session of iterateSessions(options)) {\n sessions.push(session);\n }\n\n return sessions;\n}\n\n/**\n * Collect all entries from all sessions\n */\nexport async function collectAllEntries(\n options: SessionIteratorOptions = {}\n): Promise<{\n entries: Array<JSONLEntry & { sessionId: string; projectPath: string }>;\n sessionCount: number;\n}> {\n const entries: Array<\n JSONLEntry & { sessionId: string; projectPath: string }\n > = [];\n let sessionCount = 0;\n\n for await (const session of iterateSessions(options)) {\n sessionCount += 1;\n\n for (const entry of session.entries) {\n entries.push({\n ...entry,\n sessionId: session.sessionId,\n projectPath: session.projectPath,\n });\n }\n }\n\n return { entries, sessionCount };\n}\n","/**\n * Metrics calculation for Claude Code Wrapped\n */\n\nimport { calculateCollaborationMetrics } from \"./collaboration\";\nimport { calculateCoreMetrics } from \"./core\";\nimport { calculateFunMetrics } from \"./fun\";\nimport { calculateModelMetrics } from \"./models\";\nimport { calculatePatternMetrics } from \"./patterns\";\nimport { calculateProjectMetrics } from \"./projects\";\nimport { calculateToolMetrics } from \"./tools\";\n\nimport type { JSONLEntry } from \"../types/jsonl\";\nimport type { ClaudeCodeWrappedSummary } from \"../types/metrics\";\n\nexport { calculateCollaborationMetrics } from \"./collaboration\";\nexport { calculateCoreMetrics } from \"./core\";\nexport { calculateFunMetrics } from \"./fun\";\nexport { calculateModelMetrics } from \"./models\";\nexport { calculatePatternMetrics } from \"./patterns\";\nexport { calculateProjectMetrics } from \"./projects\";\nexport { calculateToolMetrics } from \"./tools\";\n\n/**\n * Calculate all metrics from entries\n */\nexport function calculateAllMetrics(\n entries: Array<JSONLEntry & { sessionId: string; projectPath: string }>,\n dateRange: { from: Date; to: Date }\n): ClaudeCodeWrappedSummary {\n const core = calculateCoreMetrics(entries, dateRange);\n const patterns = calculatePatternMetrics(entries);\n const models = calculateModelMetrics(entries);\n const tools = calculateToolMetrics(entries);\n const projects = calculateProjectMetrics(entries);\n const collaboration = calculateCollaborationMetrics(entries);\n const fun = calculateFunMetrics(entries);\n\n return {\n generatedAt: new Date(),\n period: {\n from: dateRange.from,\n to: dateRange.to,\n year: dateRange.from.getFullYear(),\n },\n core,\n patterns,\n models,\n tools,\n projects,\n collaboration,\n fun,\n };\n}\n","/**\n * Cost calculation for Claude Code usage\n */\n\nexport {\n DEFAULT_PRICING,\n getModelDisplayName,\n getModelPricing,\n MODEL_PRICING,\n} from \"./models\";\n\nimport { getModelPricing } from \"./models\";\n\nimport type { TokenUsage } from \"../types/jsonl\";\n\nexport type { ModelPricing } from \"./models\";\n\n/**\n * Cost breakdown by token type\n */\nexport type CostBreakdown = {\n input: number;\n output: number;\n cacheCreation: number;\n cacheRead: number;\n total: number;\n};\n\n/**\n * Calculate cost for token usage\n */\nexport function calculateCost(model: string, usage: TokenUsage): CostBreakdown {\n const pricing = getModelPricing(model);\n\n const inputCost = (usage.input_tokens * pricing.input) / 1_000_000;\n const outputCost = (usage.output_tokens * pricing.output) / 1_000_000;\n const cacheCreationCost =\n ((usage.cache_creation_input_tokens ?? 0) * pricing.cacheWrite) / 1_000_000;\n const cacheReadCost =\n ((usage.cache_read_input_tokens ?? 0) * pricing.cacheRead) / 1_000_000;\n\n return {\n input: inputCost,\n output: outputCost,\n cacheCreation: cacheCreationCost,\n cacheRead: cacheReadCost,\n total: inputCost + outputCost + cacheCreationCost + cacheReadCost,\n };\n}\n\n/**\n * Calculate total tokens from usage\n */\nexport function calculateTotalTokens(usage: TokenUsage): number {\n return (\n usage.input_tokens +\n usage.output_tokens +\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0)\n );\n}\n\n/**\n * Aggregate costs from multiple usages\n */\nexport function aggregateCosts(costs: Array<CostBreakdown>): CostBreakdown {\n return costs.reduce(\n (acc, cost) => ({\n input: acc.input + cost.input,\n output: acc.output + cost.output,\n cacheCreation: acc.cacheCreation + cost.cacheCreation,\n cacheRead: acc.cacheRead + cost.cacheRead,\n total: acc.total + cost.total,\n }),\n { input: 0, output: 0, cacheCreation: 0, cacheRead: 0, total: 0 }\n );\n}\n\n/**\n * Estimate cache savings (what you would have paid without cache)\n */\nexport function estimateCacheSavings(\n model: string,\n cacheReadTokens: number\n): number {\n const pricing = getModelPricing(model);\n\n // Cache read tokens would have been input tokens without caching\n const withoutCache = (cacheReadTokens * pricing.input) / 1_000_000;\n const withCache = (cacheReadTokens * pricing.cacheRead) / 1_000_000;\n\n return withoutCache - withCache;\n}\n","/**\n * Claude model pricing data\n * Prices are per 1 million tokens\n */\n\nexport type ModelPricing = {\n input: number;\n output: number;\n cacheWrite: number;\n cacheRead: number;\n};\n\n/**\n * Pricing data for known Claude models\n * Updated as of December 2025\n */\nexport const MODEL_PRICING: Record<string, ModelPricing> = {\n // Claude 4.5 family\n \"claude-opus-4-5-20251101\": {\n input: 15.0,\n output: 75.0,\n cacheWrite: 18.75,\n cacheRead: 1.5,\n },\n \"claude-sonnet-4-5-20250929\": {\n input: 3.0,\n output: 15.0,\n cacheWrite: 3.75,\n cacheRead: 0.3,\n },\n \"claude-haiku-4-5-20251015\": {\n input: 1.0,\n output: 5.0,\n cacheWrite: 1.25,\n cacheRead: 0.1,\n },\n\n // Claude 4.1 family\n \"claude-opus-4-1-20250805\": {\n input: 15.0,\n output: 75.0,\n cacheWrite: 18.75,\n cacheRead: 1.5,\n },\n\n // Claude 4 family\n \"claude-opus-4-20250514\": {\n input: 15.0,\n output: 75.0,\n cacheWrite: 18.75,\n cacheRead: 1.5,\n },\n \"claude-sonnet-4-20250514\": {\n input: 3.0,\n output: 15.0,\n cacheWrite: 3.75,\n cacheRead: 0.3,\n },\n\n // Claude 3.7 Sonnet (hybrid reasoning)\n \"claude-3-7-sonnet-20250219\": {\n input: 3.0,\n output: 15.0,\n cacheWrite: 3.75,\n cacheRead: 0.3,\n },\n\n // Claude 3.5 family\n \"claude-3-5-sonnet-20241022\": {\n input: 3.0,\n output: 15.0,\n cacheWrite: 3.75,\n cacheRead: 0.3,\n },\n \"claude-3-5-sonnet-20240620\": {\n input: 3.0,\n output: 15.0,\n cacheWrite: 3.75,\n cacheRead: 0.3,\n },\n \"claude-3-5-haiku-20241022\": {\n input: 0.8,\n output: 4.0,\n cacheWrite: 1.0,\n cacheRead: 0.08,\n },\n\n // Claude 3 family\n \"claude-3-opus-20240229\": {\n input: 15.0,\n output: 75.0,\n cacheWrite: 18.75,\n cacheRead: 1.5,\n },\n \"claude-3-sonnet-20240229\": {\n input: 3.0,\n output: 15.0,\n cacheWrite: 3.75,\n cacheRead: 0.3,\n },\n \"claude-3-haiku-20240307\": {\n input: 0.25,\n output: 1.25,\n cacheWrite: 0.3,\n cacheRead: 0.03,\n },\n};\n\n/**\n * Default pricing for unknown models (uses Sonnet pricing as reasonable middle)\n */\nexport const DEFAULT_PRICING: ModelPricing = {\n input: 3.0,\n output: 15.0,\n cacheWrite: 3.75,\n cacheRead: 0.3,\n};\n\n/**\n * Model matching patterns for pricing lookup\n * Order matters: more specific patterns first\n */\nconst PRICING_PATTERNS: Array<{ test: (s: string) => boolean; key: string }> = [\n // Opus\n {\n test: (s) => s.includes(\"opus\") && (s.includes(\"4-5\") || s.includes(\"4.5\")),\n key: \"claude-opus-4-5-20251101\",\n },\n {\n test: (s) => s.includes(\"opus\") && (s.includes(\"4-1\") || s.includes(\"4.1\")),\n key: \"claude-opus-4-1-20250805\",\n },\n {\n test: (s) => s.includes(\"opus\") && s.includes(\"4\"),\n key: \"claude-opus-4-20250514\",\n },\n { test: (s) => s.includes(\"opus\"), key: \"claude-3-opus-20240229\" },\n // Haiku\n {\n test: (s) =>\n s.includes(\"haiku\") && (s.includes(\"4-5\") || s.includes(\"4.5\")),\n key: \"claude-haiku-4-5-20251015\",\n },\n {\n test: (s) =>\n s.includes(\"haiku\") && (s.includes(\"3-5\") || s.includes(\"3.5\")),\n key: \"claude-3-5-haiku-20241022\",\n },\n { test: (s) => s.includes(\"haiku\"), key: \"claude-3-haiku-20240307\" },\n // Sonnet\n {\n test: (s) =>\n s.includes(\"sonnet\") && (s.includes(\"4-5\") || s.includes(\"4.5\")),\n key: \"claude-sonnet-4-5-20250929\",\n },\n {\n test: (s) => s.includes(\"sonnet\") && s.includes(\"4\"),\n key: \"claude-sonnet-4-20250514\",\n },\n {\n test: (s) => s.includes(\"3-7\") || s.includes(\"3.7\"),\n key: \"claude-3-7-sonnet-20250219\",\n },\n { test: (s) => s.includes(\"sonnet\"), key: \"claude-3-5-sonnet-20241022\" },\n];\n\n/**\n * Model display name patterns\n * Order matters: more specific patterns first\n */\nconst DISPLAY_PATTERNS: Array<{ test: (s: string) => boolean; name: string }> =\n [\n // Opus\n {\n test: (s) =>\n s.includes(\"opus\") && (s.includes(\"4-5\") || s.includes(\"4.5\")),\n name: \"Claude Opus 4.5\",\n },\n {\n test: (s) =>\n s.includes(\"opus\") && (s.includes(\"4-1\") || s.includes(\"4.1\")),\n name: \"Claude Opus 4.1\",\n },\n {\n test: (s) => s.includes(\"opus\") && s.includes(\"4\"),\n name: \"Claude Opus 4\",\n },\n { test: (s) => s.includes(\"opus\"), name: \"Claude Opus 3\" },\n // Sonnet\n {\n test: (s) =>\n s.includes(\"sonnet\") && (s.includes(\"4-5\") || s.includes(\"4.5\")),\n name: \"Claude Sonnet 4.5\",\n },\n {\n test: (s) => s.includes(\"sonnet\") && s.includes(\"4\"),\n name: \"Claude Sonnet 4\",\n },\n {\n test: (s) => s.includes(\"3-7\") || s.includes(\"3.7\"),\n name: \"Claude Sonnet 3.7\",\n },\n {\n test: (s) => s.includes(\"3-5\") && s.includes(\"sonnet\"),\n name: \"Claude Sonnet 3.5\",\n },\n { test: (s) => s.includes(\"sonnet\"), name: \"Claude Sonnet\" },\n // Haiku\n {\n test: (s) =>\n s.includes(\"haiku\") && (s.includes(\"4-5\") || s.includes(\"4.5\")),\n name: \"Claude Haiku 4.5\",\n },\n {\n test: (s) => s.includes(\"3-5\") && s.includes(\"haiku\"),\n name: \"Claude Haiku 3.5\",\n },\n { test: (s) => s.includes(\"haiku\"), name: \"Claude Haiku\" },\n ];\n\n/**\n * Get pricing for a model\n */\nexport function getModelPricing(model: string): ModelPricing {\n const exactMatch = MODEL_PRICING[model];\n if (exactMatch) {\n return exactMatch;\n }\n\n const lower = model.toLowerCase();\n for (const pattern of PRICING_PATTERNS) {\n if (pattern.test(lower)) {\n return MODEL_PRICING[pattern.key] ?? DEFAULT_PRICING;\n }\n }\n\n return DEFAULT_PRICING;\n}\n\n/**\n * Get display name for a model\n */\nexport function getModelDisplayName(model: string): string {\n const lower = model.toLowerCase();\n\n for (const pattern of DISPLAY_PATTERNS) {\n if (pattern.test(lower)) {\n return pattern.name;\n }\n }\n\n return model;\n}\n","/**\n * Types for Claude Code JSONL log entries\n */\n\n/** Base fields present on all JSONL entries */\nexport type BaseJSONLEntry = {\n timestamp: string;\n sessionId: string;\n uuid?: string;\n};\n\n/** Token usage structure from assistant messages */\nexport type TokenUsage = {\n input_tokens: number;\n output_tokens: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation?: {\n ephemeral_5m_input_tokens?: number;\n ephemeral_1h_input_tokens?: number;\n };\n service_tier?: \"standard\" | \"priority\";\n};\n\n/** Tool use content block */\nexport type ToolUseContent = {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n};\n\n/** Text content block */\nexport type TextContent = {\n type: \"text\";\n text: string;\n};\n\n/** Thinking content block */\nexport type ThinkingContent = {\n type: \"thinking\";\n thinking: string;\n signature?: string;\n};\n\n/** Content block union */\nexport type ContentBlock = ToolUseContent | TextContent | ThinkingContent;\n\n/** User message entry */\nexport type UserMessageEntry = BaseJSONLEntry & {\n type: \"user\";\n message: {\n role: \"user\";\n content: string;\n };\n version?: string;\n gitBranch?: string;\n cwd?: string;\n parentUuid?: string | null;\n isSidechain?: boolean;\n userType?: string;\n};\n\n/** Assistant message entry */\nexport type AssistantMessageEntry = BaseJSONLEntry & {\n type: \"assistant\";\n message: {\n model: string;\n id?: string;\n type?: \"message\";\n role: \"assistant\";\n content: Array<ContentBlock>;\n stop_reason?: string | null;\n stop_sequence?: string | null;\n usage: TokenUsage;\n };\n requestId?: string;\n parentUuid?: string;\n version?: string;\n gitBranch?: string;\n cwd?: string;\n slug?: string;\n};\n\n/** Session summary entry */\nexport type SummaryEntry = BaseJSONLEntry & {\n type: \"summary\";\n summary: string;\n leafUuid?: string;\n};\n\n/** File history snapshot entry */\nexport type FileHistoryEntry = BaseJSONLEntry & {\n type: \"file-history-snapshot\";\n messageId?: string;\n snapshot?: {\n messageId: string;\n trackedFileBackups: Record<string, unknown>;\n timestamp: string;\n };\n isSnapshotUpdate?: boolean;\n};\n\n/** Union of all JSONL entry types */\nexport type JSONLEntry =\n | UserMessageEntry\n | AssistantMessageEntry\n | SummaryEntry\n | FileHistoryEntry;\n\n/** Type guard for user message entries */\nexport function isUserMessage(entry: JSONLEntry): entry is UserMessageEntry {\n return entry.type === \"user\";\n}\n\n/** Type guard for assistant message entries */\nexport function isAssistantMessage(\n entry: JSONLEntry\n): entry is AssistantMessageEntry {\n return entry.type === \"assistant\";\n}\n\n/** Type guard for summary entries */\nexport function isSummaryEntry(entry: JSONLEntry): entry is SummaryEntry {\n return entry.type === \"summary\";\n}\n\n/** Type guard for file history entries */\nfunction _isFileHistoryEntry(entry: JSONLEntry): entry is FileHistoryEntry {\n return entry.type === \"file-history-snapshot\";\n}\n\n/** Type guard for tool use content */\nexport function isToolUseContent(\n content: ContentBlock\n): content is ToolUseContent {\n return content.type === \"tool_use\";\n}\n\n/** Type guard for text content */\nexport function isTextContent(content: ContentBlock): content is TextContent {\n return content.type === \"text\";\n}\n\n/** Type guard for thinking content */\nexport function isThinkingContent(\n content: ContentBlock\n): content is ThinkingContent {\n return content.type === \"thinking\";\n}\n\n/** Stats cache daily activity entry */\nexport type StatsCacheDailyActivity = {\n date: string;\n messageCount: number;\n sessionCount: number;\n toolCallCount: number;\n};\n\n/** Stats cache structure */\nexport type StatsCache = {\n version: number;\n lastComputedDate: string;\n dailyActivity: Array<StatsCacheDailyActivity>;\n};\n\n/** Session data with parsed entries */\nexport type SessionData = {\n sessionId: string;\n projectPath: string;\n filePath: string;\n entries: Array<JSONLEntry>;\n};\n","/**\n * Statistical aggregation utilities\n */\n\n/**\n * Count occurrences in an array\n */\nfunction _countOccurrences<T>(\n items: Array<T>,\n keyFn: (item: T) => string\n): Map<string, number> {\n const counts = new Map<string, number>();\n\n for (const item of items) {\n const key = keyFn(item);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n\n return counts;\n}\n\n/**\n * Get top N items from a count map\n */\nfunction getTopN(\n counts: Map<string, number>,\n n: number\n): Array<{ key: string; count: number }> {\n return Array.from(counts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, n)\n .map(([key, count]) => ({ key, count }));\n}\n\n/**\n * Find max in a map\n */\nexport function findMax(\n counts: Map<string | number, number>\n): { key: string | number; count: number } | null {\n let maxKey: string | number | null = null;\n let maxCount = 0;\n\n for (const [key, count] of counts) {\n if (count > maxCount) {\n maxKey = key;\n maxCount = count;\n }\n }\n\n if (maxKey === null) {\n return null;\n }\n return { key: maxKey, count: maxCount };\n}\n\n/**\n * Calculate percentage\n */\nexport function calculatePercentage(part: number, total: number): number {\n if (total === 0) {\n return 0;\n }\n return (part / total) * 100;\n}\n\n/**\n * Sum values in an array\n */\nfunction sum(values: Array<number>): number {\n return values.reduce((acc, val) => acc + val, 0);\n}\n\n/**\n * Calculate average\n */\nfunction _average(values: Array<number>): number {\n if (values.length === 0) {\n return 0;\n }\n return sum(values) / values.length;\n}\n\n/**\n * Group items by key\n */\nfunction _groupBy<T>(\n items: Array<T>,\n keyFn: (item: T) => string\n): Map<string, Array<T>> {\n const groups = new Map<string, Array<T>>();\n\n for (const item of items) {\n const key = keyFn(item);\n const existing = groups.get(key);\n if (existing) {\n existing.push(item);\n } else {\n groups.set(key, [item]);\n }\n }\n\n return groups;\n}\n\n/**\n * Sort map entries by value descending\n */\nfunction _sortByValueDesc<K>(map: Map<K, number>): Array<[K, number]> {\n return Array.from(map.entries()).sort((a, b) => b[1] - a[1]);\n}\n\n/**\n * Initialize hourly distribution (0-23)\n */\nexport function initHourlyDistribution(): Map<number, number> {\n const map = new Map<number, number>();\n for (let i = 0; i < 24; i++) {\n map.set(i, 0);\n }\n return map;\n}\n\n/**\n * Initialize weekly distribution (0-6)\n */\nexport function initWeeklyDistribution(): Map<number, number> {\n const map = new Map<number, number>();\n for (let i = 0; i < 7; i++) {\n map.set(i, 0);\n }\n return map;\n}\n\n/**\n * Initialize monthly distribution (0-11)\n */\nexport function initMonthlyDistribution(): Map<number, number> {\n const map = new Map<number, number>();\n for (let i = 0; i < 12; i++) {\n map.set(i, 0);\n }\n return map;\n}\n\n/**\n * Increment value in map\n */\nexport function incrementMap(\n map: Map<number | string, number>,\n key: number | string\n): void {\n map.set(key, (map.get(key) ?? 0) + 1);\n}\n\n/**\n * Extract common words from text for word cloud\n * Filters out stop words and short words\n */\nfunction extractWords(text: string): Array<string> {\n const stopWords = new Set([\n \"a\",\n \"an\",\n \"the\",\n \"and\",\n \"or\",\n \"but\",\n \"in\",\n \"on\",\n \"at\",\n \"to\",\n \"for\",\n \"of\",\n \"with\",\n \"by\",\n \"from\",\n \"as\",\n \"is\",\n \"was\",\n \"are\",\n \"were\",\n \"been\",\n \"be\",\n \"have\",\n \"has\",\n \"had\",\n \"do\",\n \"does\",\n \"did\",\n \"will\",\n \"would\",\n \"could\",\n \"should\",\n \"may\",\n \"might\",\n \"must\",\n \"shall\",\n \"can\",\n \"need\",\n \"this\",\n \"that\",\n \"these\",\n \"those\",\n \"i\",\n \"you\",\n \"he\",\n \"she\",\n \"it\",\n \"we\",\n \"they\",\n \"what\",\n \"which\",\n \"who\",\n \"whom\",\n \"whose\",\n \"where\",\n \"when\",\n \"why\",\n \"how\",\n \"all\",\n \"each\",\n \"every\",\n \"both\",\n \"few\",\n \"more\",\n \"most\",\n \"other\",\n \"some\",\n \"such\",\n \"no\",\n \"nor\",\n \"not\",\n \"only\",\n \"own\",\n \"same\",\n \"so\",\n \"than\",\n \"too\",\n \"very\",\n \"just\",\n \"also\",\n \"now\",\n \"here\",\n ]);\n\n return text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .split(/\\s+/)\n .filter((word) => word.length > 3 && !stopWords.has(word));\n}\n\n/**\n * Build word cloud data from texts\n */\nexport function buildWordCloud(\n texts: Array<string>,\n limit = 50\n): Array<{ word: string; count: number }> {\n const wordCounts = new Map<string, number>();\n\n for (const text of texts) {\n const words = extractWords(text);\n for (const word of words) {\n incrementMap(wordCounts, word);\n }\n }\n\n return getTopN(wordCounts, limit).map(({ key, count }) => ({\n word: key,\n count,\n }));\n}\n","/**\n * Tier 6: AI Collaboration Style\n * How you work with Claude\n */\n\nimport { estimateCacheSavings } from \"../pricing\";\nimport {\n isAssistantMessage,\n isThinkingContent,\n isToolUseContent,\n} from \"../types/jsonl\";\nimport { calculatePercentage } from \"../utils/aggregators\";\n\nimport type { JSONLEntry } from \"../types/jsonl\";\nimport type { CollaborationMetrics } from \"../types/metrics\";\n\n/**\n * Accumulator for building collaboration metrics\n */\nexport type CollaborationAccumulator = {\n totalInputTokens: number;\n totalCacheReadTokens: number;\n totalCacheCreationTokens: number;\n messagesWithThinking: number;\n totalAssistantMessages: number;\n questionsAsked: number;\n plansCreated: number;\n todoItemsCreated: number;\n standardRequests: number;\n priorityRequests: number;\n cacheSavings: number;\n};\n\n/**\n * Create empty accumulator\n */\nfunction createCollaborationAccumulator(): CollaborationAccumulator {\n return {\n totalInputTokens: 0,\n totalCacheReadTokens: 0,\n totalCacheCreationTokens: 0,\n messagesWithThinking: 0,\n totalAssistantMessages: 0,\n questionsAsked: 0,\n plansCreated: 0,\n todoItemsCreated: 0,\n standardRequests: 0,\n priorityRequests: 0,\n cacheSavings: 0,\n };\n}\n\n/**\n * Process a single entry\n */\nfunction processCollaborationEntry(\n acc: CollaborationAccumulator,\n entry: JSONLEntry\n): void {\n if (!isAssistantMessage(entry)) {\n return;\n }\n\n acc.totalAssistantMessages += 1;\n\n const usage = entry.message.usage;\n const model = entry.message.model;\n\n // Track token types\n acc.totalInputTokens += usage.input_tokens;\n acc.totalCacheReadTokens += usage.cache_read_input_tokens ?? 0;\n acc.totalCacheCreationTokens += usage.cache_creation_input_tokens ?? 0;\n\n // Track service tier\n if (usage.service_tier === \"priority\") {\n acc.priorityRequests += 1;\n } else {\n acc.standardRequests += 1;\n }\n\n // Estimate cache savings\n const cacheReadTokens = usage.cache_read_input_tokens ?? 0;\n if (cacheReadTokens > 0) {\n acc.cacheSavings += estimateCacheSavings(model, cacheReadTokens);\n }\n\n // Check for thinking content\n const hasThinking = entry.message.content.some(isThinkingContent);\n if (hasThinking) {\n acc.messagesWithThinking += 1;\n }\n\n // Track tool usage for interactivity metrics\n for (const content of entry.message.content) {\n if (!isToolUseContent(content)) {\n continue;\n }\n\n switch (content.name) {\n case \"AskUserQuestion\":\n acc.questionsAsked += 1;\n break;\n case \"ExitPlanMode\":\n acc.plansCreated += 1;\n break;\n case \"TodoWrite\":\n acc.todoItemsCreated += 1;\n break;\n default:\n break;\n }\n }\n}\n\n/**\n * Finalize collaboration metrics from accumulator\n */\nfunction finalizeCollaborationMetrics(\n acc: CollaborationAccumulator\n): CollaborationMetrics {\n // Cache efficiency calculation\n const totalEffectiveInput = acc.totalInputTokens + acc.totalCacheReadTokens;\n const cacheHitRate =\n totalEffectiveInput > 0\n ? calculatePercentage(acc.totalCacheReadTokens, totalEffectiveInput)\n : 0;\n\n const cacheCreationRate =\n totalEffectiveInput > 0\n ? calculatePercentage(acc.totalCacheCreationTokens, totalEffectiveInput)\n : 0;\n\n // Thinking usage\n const thinkingPercentage =\n acc.totalAssistantMessages > 0\n ? calculatePercentage(\n acc.messagesWithThinking,\n acc.totalAssistantMessages\n )\n : 0;\n\n // Service tier\n const totalRequests = acc.standardRequests + acc.priorityRequests;\n const priorityPercentage =\n totalRequests > 0\n ? calculatePercentage(acc.priorityRequests, totalRequests)\n : 0;\n\n return {\n cacheEfficiency: {\n cacheHitRate,\n cacheCreationRate,\n estimatedSavings: acc.cacheSavings,\n },\n extendedThinking: {\n messagesWithThinking: acc.messagesWithThinking,\n percentageOfTotal: thinkingPercentage,\n },\n interactivity: {\n questionsAsked: acc.questionsAsked,\n plansCreated: acc.plansCreated,\n todoItemsCreated: acc.todoItemsCreated,\n },\n serviceTier: {\n standardRequests: acc.standardRequests,\n priorityRequests: acc.priorityRequests,\n priorityPercentage,\n },\n };\n}\n\n/**\n * Calculate collaboration metrics from entries\n */\nexport function calculateCollaborationMetrics(\n entries: Array<JSONLEntry>\n): CollaborationMetrics {\n const acc = createCollaborationAccumulator();\n\n for (const entry of entries) {\n processCollaborationEntry(acc, entry);\n }\n\n return finalizeCollaborationMetrics(acc);\n}\n","/**\n * Date utility functions for Claude Code Wrapped\n */\n\nconst DAY_NAMES = [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n];\n\nconst MONTH_NAMES = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\n/**\n * Get day name from day number (0-6)\n */\nexport function getDayName(day: number): string {\n return DAY_NAMES[day] ?? \"Unknown\";\n}\n\n/**\n * Get month name from month number (0-11)\n */\nexport function getMonthName(month: number): string {\n return MONTH_NAMES[month] ?? \"Unknown\";\n}\n\n/**\n * Parse ISO timestamp to Date\n */\nexport function parseTimestamp(timestamp: string): Date | null {\n try {\n const date = new Date(timestamp);\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n return date;\n } catch {\n return null;\n }\n}\n\n/**\n * Get date string in YYYY-MM-DD format\n */\nexport function toDateString(date: Date): string {\n const parts = date.toISOString().split(\"T\");\n return parts[0] ?? \"\";\n}\n\n/**\n * Get hour from date (0-23)\n */\nexport function getHour(date: Date): number {\n return date.getHours();\n}\n\n/**\n * Get day of week from date (0-6, 0 = Sunday)\n */\nexport function getDayOfWeek(date: Date): number {\n return date.getDay();\n}\n\n/**\n * Get month from date (0-11)\n */\nexport function getMonth(date: Date): number {\n return date.getMonth();\n}\n\n/**\n * Calculate streak from sorted dates\n */\nexport function calculateStreak(sortedDates: Array<string>): {\n longestStreak: number;\n currentStreak: number;\n} {\n if (sortedDates.length === 0) {\n return { longestStreak: 0, currentStreak: 0 };\n }\n\n // Remove duplicates and sort\n const uniqueDates = [...new Set(sortedDates)].sort();\n\n let longestStreak = 1;\n let currentStreak = 1;\n let tempStreak = 1;\n\n const today = toDateString(new Date());\n const yesterday = toDateString(new Date(Date.now() - 24 * 60 * 60 * 1000));\n\n for (let i = 1; i < uniqueDates.length; i++) {\n const prevDateStr = uniqueDates[i - 1];\n const currDateStr = uniqueDates[i];\n if (!(prevDateStr && currDateStr)) {\n continue;\n }\n const prevDate = new Date(prevDateStr);\n const currDate = new Date(currDateStr);\n\n // Check if dates are consecutive\n const diffDays = Math.round(\n (currDate.getTime() - prevDate.getTime()) / (24 * 60 * 60 * 1000)\n );\n\n if (diffDays === 1) {\n tempStreak += 1;\n longestStreak = Math.max(longestStreak, tempStreak);\n } else {\n tempStreak = 1;\n }\n }\n\n // Calculate current streak (must include today or yesterday)\n const lastDate = uniqueDates.at(-1) ?? \"\";\n if (lastDate === today || lastDate === yesterday) {\n // Count backwards from the last date\n currentStreak = 1;\n for (let i = uniqueDates.length - 2; i >= 0; i--) {\n const currDateStr = uniqueDates[i + 1];\n const prevDateStr = uniqueDates[i];\n if (!(currDateStr && prevDateStr)) {\n break;\n }\n const currDate = new Date(currDateStr);\n const prevDate = new Date(prevDateStr);\n const diffDays = Math.round(\n (currDate.getTime() - prevDate.getTime()) / (24 * 60 * 60 * 1000)\n );\n\n if (diffDays === 1) {\n currentStreak += 1;\n } else {\n break;\n }\n }\n } else {\n currentStreak = 0;\n }\n\n return { longestStreak, currentStreak };\n}\n\n/**\n * Count days in date range\n */\nexport function countDaysInRange(from: Date, to: Date): number {\n const diffTime = Math.abs(to.getTime() - from.getTime());\n return Math.ceil(diffTime / (24 * 60 * 60 * 1000)) + 1;\n}\n\n/**\n * Check if date is within range\n */\nfunction _isDateInRange(date: Date, from: Date, to: Date): boolean {\n return date >= from && date <= to;\n}\n\n/**\n * Get start of day\n */\nfunction _startOfDay(date: Date): Date {\n const result = new Date(date);\n result.setHours(0, 0, 0, 0);\n return result;\n}\n\n/**\n * Get end of day\n */\nfunction _endOfDay(date: Date): Date {\n const result = new Date(date);\n result.setHours(23, 59, 59, 999);\n return result;\n}\n","/**\n * Tier 1: Core Statistics\n * Fundamental usage metrics\n */\n\nimport { aggregateCosts, calculateCost } from \"../pricing\";\nimport { isAssistantMessage, isUserMessage } from \"../types/jsonl\";\nimport {\n calculateStreak,\n countDaysInRange,\n parseTimestamp,\n toDateString,\n} from \"../utils/dates\";\n\nimport type { CostBreakdown } from \"../pricing\";\nimport type { JSONLEntry } from \"../types/jsonl\";\nimport type { CoreMetrics } from \"../types/metrics\";\n\n/**\n * Accumulator for building core metrics incrementally\n */\nexport type CoreMetricsAccumulator = {\n tokens: {\n input: number;\n output: number;\n cacheCreation: number;\n cacheRead: number;\n };\n costs: Array<CostBreakdown>;\n sessionMessages: Map<string, number>;\n sessionProjects: Map<string, string>;\n sessionDates: Map<string, Date>;\n userMessageCount: number;\n assistantMessageCount: number;\n activeDates: Set<string>;\n longestSession: {\n id: string;\n messageCount: number;\n project: string;\n date: Date;\n } | null;\n};\n\n/**\n * Create empty accumulator\n */\nfunction createCoreAccumulator(): CoreMetricsAccumulator {\n return {\n tokens: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },\n costs: [],\n sessionMessages: new Map(),\n sessionProjects: new Map(),\n sessionDates: new Map(),\n userMessageCount: 0,\n assistantMessageCount: 0,\n activeDates: new Set(),\n longestSession: null,\n };\n}\n\n/**\n * Process a single entry\n */\nfunction processCoreEntry(\n acc: CoreMetricsAccumulator,\n entry: JSONLEntry & { sessionId: string; projectPath: string }\n): void {\n // Track session info\n const sessionCount = acc.sessionMessages.get(entry.sessionId) ?? 0;\n acc.sessionMessages.set(entry.sessionId, sessionCount + 1);\n acc.sessionProjects.set(entry.sessionId, entry.projectPath);\n\n // Track active date\n const date = parseTimestamp(entry.timestamp);\n if (date) {\n acc.activeDates.add(toDateString(date));\n\n // Track first date per session\n if (!acc.sessionDates.has(entry.sessionId)) {\n acc.sessionDates.set(entry.sessionId, date);\n }\n }\n\n if (isUserMessage(entry)) {\n acc.userMessageCount += 1;\n }\n\n if (isAssistantMessage(entry)) {\n acc.assistantMessageCount += 1;\n\n const usage = entry.message.usage;\n const model = entry.message.model;\n\n // Accumulate tokens\n acc.tokens.input += usage.input_tokens;\n acc.tokens.output += usage.output_tokens;\n acc.tokens.cacheCreation += usage.cache_creation_input_tokens ?? 0;\n acc.tokens.cacheRead += usage.cache_read_input_tokens ?? 0;\n\n // Calculate cost\n const cost = calculateCost(model, usage);\n acc.costs.push(cost);\n }\n}\n\n/**\n * Finalize core metrics from accumulator\n */\nfunction finalizeCoreMetrics(\n acc: CoreMetricsAccumulator,\n dateRange: { from: Date; to: Date }\n): CoreMetrics {\n // Aggregate costs\n const totalCost = aggregateCosts(acc.costs);\n\n // Find longest session\n let longestSession: CoreMetrics[\"sessions\"][\"longestSession\"] = null;\n let maxMessages = 0;\n\n for (const [sessionId, messageCount] of acc.sessionMessages) {\n if (messageCount > maxMessages) {\n maxMessages = messageCount;\n longestSession = {\n id: sessionId,\n messageCount,\n project: acc.sessionProjects.get(sessionId) ?? \"Unknown\",\n date: acc.sessionDates.get(sessionId) ?? new Date(),\n };\n }\n }\n\n // Calculate streaks\n const sortedDates = Array.from(acc.activeDates).sort();\n const { longestStreak, currentStreak } = calculateStreak(sortedDates);\n\n // Get first and last active days\n const firstDateStr = sortedDates[0];\n const lastDateStr = sortedDates.at(-1);\n const firstActiveDay = firstDateStr ? new Date(firstDateStr) : null;\n const lastActiveDay = lastDateStr ? new Date(lastDateStr) : null;\n\n const totalMessages = acc.userMessageCount + acc.assistantMessageCount;\n const sessionCount = acc.sessionMessages.size;\n\n return {\n totalTokens: {\n input: acc.tokens.input,\n output: acc.tokens.output,\n cacheCreation: acc.tokens.cacheCreation,\n cacheRead: acc.tokens.cacheRead,\n total:\n acc.tokens.input +\n acc.tokens.output +\n acc.tokens.cacheCreation +\n acc.tokens.cacheRead,\n },\n estimatedCost: {\n total: totalCost.total,\n byCategory: {\n input: totalCost.input,\n output: totalCost.output,\n cacheCreation: totalCost.cacheCreation,\n cacheRead: totalCost.cacheRead,\n },\n },\n sessions: {\n total: sessionCount,\n averageMessages: sessionCount > 0 ? totalMessages / sessionCount : 0,\n longestSession,\n },\n messages: {\n total: totalMessages,\n userMessages: acc.userMessageCount,\n assistantMessages: acc.assistantMessageCount,\n averagePerSession: sessionCount > 0 ? totalMessages / sessionCount : 0,\n },\n activity: {\n daysActive: acc.activeDates.size,\n totalDaysInPeriod: countDaysInRange(dateRange.from, dateRange.to),\n longestStreak,\n currentStreak,\n firstActiveDay,\n lastActiveDay,\n },\n };\n}\n\n/**\n * Calculate core metrics from entries\n */\nexport function calculateCoreMetrics(\n entries: Array<JSONLEntry & { sessionId: string; projectPath: string }>,\n dateRange: { from: Date; to: Date }\n): CoreMetrics {\n const acc = createCoreAccumulator();\n\n for (const entry of entries) {\n processCoreEntry(acc, entry);\n }\n\n return finalizeCoreMetrics(acc, dateRange);\n}\n","/**\n * Tier 7: Fun Statistics\n * Interesting tidbits about your usage\n */\n\nimport {\n isAssistantMessage,\n isSummaryEntry,\n isTextContent,\n isUserMessage,\n} from \"../types/jsonl\";\nimport { buildWordCloud } from \"../utils/aggregators\";\nimport { parseTimestamp, toDateString } from \"../utils/dates\";\n\nimport type { JSONLEntry } from \"../types/jsonl\";\nimport type { FunMetrics } from \"../types/metrics\";\n\n/**\n * Daily activity data\n */\ntype DailyActivity = {\n messageCount: number;\n tokensUsed: number;\n};\n\n/**\n * Accumulator for building fun metrics\n */\nexport type FunAccumulator = {\n totalCharacters: number;\n summaries: Array<string>;\n longestResponse: {\n characterCount: number;\n date: Date;\n sessionId: string;\n } | null;\n dailyActivity: Map<string, DailyActivity>;\n versions: Map<string, { count: number; firstSeen: Date }>;\n milestones: Array<{ type: string; date: Date; description: string }>;\n sessionCount: number;\n messageCount: number;\n tokenCount: number;\n};\n\n/**\n * Create empty accumulator\n */\nfunction createFunAccumulator(): FunAccumulator {\n return {\n totalCharacters: 0,\n summaries: [],\n longestResponse: null,\n dailyActivity: new Map(),\n versions: new Map(),\n milestones: [],\n sessionCount: 0,\n messageCount: 0,\n tokenCount: 0,\n };\n}\n\n/**\n * Process a single entry\n */\nfunction processFunEntry(\n acc: FunAccumulator,\n entry: JSONLEntry & { sessionId: string }\n): void {\n const date = parseTimestamp(entry.timestamp);\n const dateStr = date ? toDateString(date) : null;\n\n // Track daily activity\n if (dateStr) {\n const daily = acc.dailyActivity.get(dateStr) ?? {\n messageCount: 0,\n tokensUsed: 0,\n };\n daily.messageCount += 1;\n acc.dailyActivity.set(dateStr, daily);\n }\n\n // Track summaries\n if (isSummaryEntry(entry) && entry.summary) {\n acc.summaries.push(entry.summary);\n }\n\n // Track versions from user messages\n if (isUserMessage(entry) && entry.version) {\n const existing = acc.versions.get(entry.version);\n if (existing) {\n existing.count += 1;\n } else if (date) {\n acc.versions.set(entry.version, { count: 1, firstSeen: date });\n }\n }\n\n // Track assistant messages\n if (isAssistantMessage(entry)) {\n acc.messageCount += 1;\n\n const usage = entry.message.usage;\n const tokens =\n usage.input_tokens +\n usage.output_tokens +\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0);\n\n acc.tokenCount += tokens;\n\n // Update daily tokens\n if (dateStr) {\n const daily = acc.dailyActivity.get(dateStr);\n if (daily) {\n daily.tokensUsed += tokens;\n }\n }\n\n // Count characters in text responses\n let responseChars = 0;\n for (const content of entry.message.content) {\n if (isTextContent(content)) {\n responseChars += content.text.length;\n acc.totalCharacters += content.text.length;\n }\n }\n\n // Track longest response\n if (\n date &&\n responseChars > 0 &&\n (!acc.longestResponse ||\n responseChars > acc.longestResponse.characterCount)\n ) {\n acc.longestResponse = {\n characterCount: responseChars,\n date,\n sessionId: entry.sessionId,\n };\n }\n }\n}\n\n/**\n * Check and add milestones\n */\nfunction checkMilestones(\n acc: FunAccumulator,\n sortedDates: Array<string>\n): Array<{ type: string; date: Date; description: string }> {\n const milestones: Array<{ type: string; date: Date; description: string }> =\n [];\n\n // First session\n const firstDate = sortedDates[0];\n if (firstDate) {\n milestones.push({\n type: \"first_session\",\n date: new Date(firstDate),\n description: \"You started your Claude Code journey\",\n });\n }\n\n // Check cumulative milestones\n let cumulativeMessages = 0;\n let cumulativeTokens = 0;\n\n const milestonesHit = new Set<string>();\n\n for (const dateStr of sortedDates) {\n const daily = acc.dailyActivity.get(dateStr);\n if (!daily) {\n continue;\n }\n\n cumulativeMessages += daily.messageCount;\n cumulativeTokens += daily.tokensUsed;\n\n const date = new Date(dateStr);\n\n // Message milestones\n if (cumulativeMessages >= 100 && !milestonesHit.has(\"100_messages\")) {\n milestonesHit.add(\"100_messages\");\n milestones.push({\n type: \"100_messages\",\n date,\n description: \"You exchanged 100 messages with Claude\",\n });\n }\n if (cumulativeMessages >= 1000 && !milestonesHit.has(\"1000_messages\")) {\n milestonesHit.add(\"1000_messages\");\n milestones.push({\n type: \"1000_messages\",\n date,\n description: \"You reached 1,000 messages!\",\n });\n }\n if (cumulativeMessages >= 10_000 && !milestonesHit.has(\"10000_messages\")) {\n milestonesHit.add(\"10000_messages\");\n milestones.push({\n type: \"10000_messages\",\n date,\n description: \"A true power user: 10,000 messages!\",\n });\n }\n\n // Token milestones\n if (cumulativeTokens >= 1_000_000 && !milestonesHit.has(\"1m_tokens\")) {\n milestonesHit.add(\"1m_tokens\");\n milestones.push({\n type: \"1m_tokens\",\n date,\n description: \"You processed 1 million tokens\",\n });\n }\n if (cumulativeTokens >= 10_000_000 && !milestonesHit.has(\"10m_tokens\")) {\n milestonesHit.add(\"10m_tokens\");\n milestones.push({\n type: \"10m_tokens\",\n date,\n description: \"10 million tokens processed!\",\n });\n }\n }\n\n return milestones;\n}\n\n/**\n * Finalize fun metrics from accumulator\n */\nfunction finalizeFunMetrics(acc: FunAccumulator): FunMetrics {\n // Estimate words (average 5 chars per word)\n const wordsGenerated = Math.round(acc.totalCharacters / 5);\n const equivalentPages = Math.round(wordsGenerated / 250); // ~250 words per page\n\n // Build word cloud from summaries\n const summaryWordCloud = buildWordCloud(acc.summaries, 50);\n\n // Find most active day\n let mostActiveDay: FunMetrics[\"mostActiveDay\"] = null;\n let maxMessages = 0;\n\n for (const [dateStr, data] of acc.dailyActivity) {\n if (data.messageCount > maxMessages) {\n maxMessages = data.messageCount;\n mostActiveDay = {\n date: new Date(dateStr),\n messageCount: data.messageCount,\n tokensUsed: data.tokensUsed,\n };\n }\n }\n\n // Build versions list\n const versions = Array.from(acc.versions.entries())\n .map(([version, data]) => ({\n version,\n messageCount: data.count,\n firstSeen: data.firstSeen,\n }))\n .sort((a, b) => b.messageCount - a.messageCount);\n\n // Check milestones\n const sortedDates = Array.from(acc.dailyActivity.keys()).sort();\n const milestones = checkMilestones(acc, sortedDates);\n\n return {\n charactersGenerated: acc.totalCharacters,\n wordsGenerated,\n equivalentPages,\n summaryWordCloud,\n longestResponse: acc.longestResponse,\n mostActiveDay,\n milestones,\n versions,\n };\n}\n\n/**\n * Calculate fun metrics from entries\n */\nexport function calculateFunMetrics(\n entries: Array<JSONLEntry & { sessionId: string }>\n): FunMetrics {\n const acc = createFunAccumulator();\n\n for (const entry of entries) {\n processFunEntry(acc, entry);\n }\n\n return finalizeFunMetrics(acc);\n}\n","/**\n * Tier 3: Model Usage\n * Which AI models you prefer\n */\n\nimport { calculateCost, getModelDisplayName } from \"../pricing\";\nimport { isAssistantMessage } from \"../types/jsonl\";\nimport { calculatePercentage } from \"../utils/aggregators\";\n\nimport type { JSONLEntry } from \"../types/jsonl\";\nimport type { ModelMetrics } from \"../types/metrics\";\n\n/**\n * Model usage accumulator\n */\ntype ModelData = {\n messageCount: number;\n tokenCount: number;\n cost: number;\n};\n\n/**\n * Accumulator for building model metrics\n */\nexport type ModelAccumulator = {\n models: Map<string, ModelData>;\n};\n\n/**\n * Create empty accumulator\n */\nfunction createModelAccumulator(): ModelAccumulator {\n return {\n models: new Map(),\n };\n}\n\n/**\n * Process a single entry\n */\nfunction processModelEntry(acc: ModelAccumulator, entry: JSONLEntry): void {\n if (!isAssistantMessage(entry)) {\n return;\n }\n\n const model = entry.message.model;\n const usage = entry.message.usage;\n\n const existing = acc.models.get(model) ?? {\n messageCount: 0,\n tokenCount: 0,\n cost: 0,\n };\n\n const cost = calculateCost(model, usage);\n const totalTokens =\n usage.input_tokens +\n usage.output_tokens +\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0);\n\n acc.models.set(model, {\n messageCount: existing.messageCount + 1,\n tokenCount: existing.tokenCount + totalTokens,\n cost: existing.cost + cost.total,\n });\n}\n\n/**\n * Finalize model metrics from accumulator\n */\nfunction finalizeModelMetrics(acc: ModelAccumulator): ModelMetrics {\n const totalMessages = Array.from(acc.models.values()).reduce(\n (sum, m) => sum + m.messageCount,\n 0\n );\n const totalCost = Array.from(acc.models.values()).reduce(\n (sum, m) => sum + m.cost,\n 0\n );\n\n // Build sorted model list\n const modelsUsed = Array.from(acc.models.entries())\n .map(([model, data]) => ({\n model,\n displayName: getModelDisplayName(model),\n messageCount: data.messageCount,\n tokenCount: data.tokenCount,\n cost: data.cost,\n percentage: calculatePercentage(data.messageCount, totalMessages),\n }))\n .sort((a, b) => b.messageCount - a.messageCount);\n\n // Find favorite model\n const topModel = modelsUsed[0];\n const favoriteModel = topModel\n ? {\n model: topModel.model,\n displayName: topModel.displayName,\n messageCount: topModel.messageCount,\n percentage: topModel.percentage,\n }\n : null;\n\n // Build cost breakdown\n const costByModel = Array.from(acc.models.entries())\n .map(([model, data]) => ({\n model,\n displayName: getModelDisplayName(model),\n cost: data.cost,\n percentage: calculatePercentage(data.cost, totalCost),\n }))\n .sort((a, b) => b.cost - a.cost);\n\n return {\n modelsUsed,\n favoriteModel,\n costByModel,\n };\n}\n\n/**\n * Calculate model metrics from entries\n */\nexport function calculateModelMetrics(\n entries: Array<JSONLEntry>\n): ModelMetrics {\n const acc = createModelAccumulator();\n\n for (const entry of entries) {\n processModelEntry(acc, entry);\n }\n\n return finalizeModelMetrics(acc);\n}\n","/**\n * Tier 2: Usage Patterns\n * When and how you use Claude Code\n */\n\nimport {\n findMax,\n incrementMap,\n initHourlyDistribution,\n initMonthlyDistribution,\n initWeeklyDistribution,\n} from \"../utils/aggregators\";\nimport {\n getDayName,\n getDayOfWeek,\n getHour,\n getMonth,\n getMonthName,\n parseTimestamp,\n} from \"../utils/dates\";\n\nimport type { JSONLEntry } from \"../types/jsonl\";\nimport type { PatternMetrics } from \"../types/metrics\";\n\n/**\n * Accumulator for building pattern metrics\n */\nexport type PatternAccumulator = {\n hourly: Map<number, number>;\n weekly: Map<number, number>;\n monthly: Map<number, number>;\n};\n\n/**\n * Create empty accumulator\n */\nfunction createPatternAccumulator(): PatternAccumulator {\n return {\n hourly: initHourlyDistribution(),\n weekly: initWeeklyDistribution(),\n monthly: initMonthlyDistribution(),\n };\n}\n\n/**\n * Process a single entry\n */\nfunction processPatternEntry(acc: PatternAccumulator, entry: JSONLEntry): void {\n const date = parseTimestamp(entry.timestamp);\n if (!date) {\n return;\n }\n\n incrementMap(acc.hourly, getHour(date));\n incrementMap(acc.weekly, getDayOfWeek(date));\n incrementMap(acc.monthly, getMonth(date));\n}\n\n/**\n * Finalize pattern metrics from accumulator\n */\nfunction finalizePatternMetrics(acc: PatternAccumulator): PatternMetrics {\n // Find peaks\n const peakHourData = findMax(acc.hourly);\n const peakDayData = findMax(acc.weekly);\n const peakMonthData = findMax(acc.monthly);\n\n // Build distributions\n const hourlyDistribution = Array.from(acc.hourly.entries())\n .map(([hour, count]) => ({ hour, count }))\n .sort((a, b) => a.hour - b.hour);\n\n const weeklyDistribution = Array.from(acc.weekly.entries())\n .map(([day, count]) => ({ day, dayName: getDayName(day), count }))\n .sort((a, b) => a.day - b.day);\n\n const monthlyDistribution = Array.from(acc.monthly.entries())\n .map(([month, count]) => ({ month, monthName: getMonthName(month), count }))\n .sort((a, b) => a.month - b.month);\n\n return {\n peakHour: {\n hour: typeof peakHourData?.key === \"number\" ? peakHourData.key : 0,\n messageCount: peakHourData?.count ?? 0,\n },\n peakDayOfWeek: {\n day: typeof peakDayData?.key === \"number\" ? peakDayData.key : 0,\n dayName: getDayName(\n typeof peakDayData?.key === \"number\" ? peakDayData.key : 0\n ),\n messageCount: peakDayData?.count ?? 0,\n },\n busiestMonth: {\n month: typeof peakMonthData?.key === \"number\" ? peakMonthData.key : 0,\n monthName: getMonthName(\n typeof peakMonthData?.key === \"number\" ? peakMonthData.key : 0\n ),\n messageCount: peakMonthData?.count ?? 0,\n },\n hourlyDistribution,\n weeklyDistribution,\n monthlyDistribution,\n };\n}\n\n/**\n * Calculate pattern metrics from entries\n */\nexport function calculatePatternMetrics(\n entries: Array<JSONLEntry>\n): PatternMetrics {\n const acc = createPatternAccumulator();\n\n for (const entry of entries) {\n processPatternEntry(acc, entry);\n }\n\n return finalizePatternMetrics(acc);\n}\n","/**\n * Tier 5: Project Insights\n * Where you've been coding\n */\n\nimport { parseProjectName } from \"../loader/paths\";\nimport { isAssistantMessage, isUserMessage } from \"../types/jsonl\";\nimport { calculatePercentage } from \"../utils/aggregators\";\nimport { parseTimestamp } from \"../utils/dates\";\n\nimport type { JSONLEntry } from \"../types/jsonl\";\nimport type { ProjectMetrics } from \"../types/metrics\";\n\n/**\n * Project data accumulator\n */\ntype ProjectData = {\n sessionIds: Set<string>;\n messageCount: number;\n tokenCount: number;\n lastActive: Date | null;\n};\n\n/**\n * Branch data accumulator\n */\ntype BranchData = {\n projectPath: string;\n messageCount: number;\n};\n\n/**\n * Accumulator for building project metrics\n */\nexport type ProjectAccumulator = {\n projects: Map<string, ProjectData>;\n branches: Map<string, BranchData>;\n};\n\n/**\n * Create empty accumulator\n */\nfunction createProjectAccumulator(): ProjectAccumulator {\n return {\n projects: new Map(),\n branches: new Map(),\n };\n}\n\n/**\n * Process a single entry\n */\nfunction processProjectEntry(\n acc: ProjectAccumulator,\n entry: JSONLEntry & { sessionId: string; projectPath: string }\n): void {\n const projectPath = entry.projectPath;\n\n // Get or create project data\n const projectData = acc.projects.get(projectPath) ?? {\n sessionIds: new Set(),\n messageCount: 0,\n tokenCount: 0,\n lastActive: null,\n };\n\n projectData.sessionIds.add(entry.sessionId);\n projectData.messageCount += 1;\n\n // Track last active date\n const date = parseTimestamp(entry.timestamp);\n if (date && (!projectData.lastActive || date > projectData.lastActive)) {\n projectData.lastActive = date;\n }\n\n // Track tokens for assistant messages\n if (isAssistantMessage(entry)) {\n const usage = entry.message.usage;\n projectData.tokenCount +=\n usage.input_tokens +\n usage.output_tokens +\n (usage.cache_creation_input_tokens ?? 0) +\n (usage.cache_read_input_tokens ?? 0);\n }\n\n acc.projects.set(projectPath, projectData);\n\n // Track git branches\n if (isUserMessage(entry) || isAssistantMessage(entry)) {\n const gitBranch = \"gitBranch\" in entry ? entry.gitBranch : undefined;\n if (gitBranch) {\n const branchKey = `${projectPath}:${gitBranch}`;\n const branchData = acc.branches.get(branchKey) ?? {\n projectPath,\n messageCount: 0,\n };\n branchData.messageCount += 1;\n acc.branches.set(branchKey, branchData);\n }\n }\n}\n\n/**\n * Finalize project metrics from accumulator\n */\nfunction finalizeProjectMetrics(acc: ProjectAccumulator): ProjectMetrics {\n const totalMessages = Array.from(acc.projects.values()).reduce(\n (sum, p) => sum + p.messageCount,\n 0\n );\n\n // Build projects list\n const projects = Array.from(acc.projects.entries())\n .map(([path, data]) => ({\n path,\n displayName: parseProjectName(path),\n sessionCount: data.sessionIds.size,\n messageCount: data.messageCount,\n tokenCount: data.tokenCount,\n lastActive: data.lastActive ?? new Date(),\n }))\n .sort((a, b) => b.messageCount - a.messageCount);\n\n // Find top project\n const firstProject = projects[0];\n const topProject = firstProject\n ? {\n path: firstProject.path,\n displayName: firstProject.displayName,\n sessionCount: firstProject.sessionCount,\n messageCount: firstProject.messageCount,\n percentageOfTotal: calculatePercentage(\n firstProject.messageCount,\n totalMessages\n ),\n }\n : null;\n\n // Build branches list\n const branches = Array.from(acc.branches.entries())\n .map(([key, data]) => {\n const branchName = key.split(\":\").slice(1).join(\":\");\n return {\n name: branchName,\n projectPath: data.projectPath,\n messageCount: data.messageCount,\n };\n })\n .sort((a, b) => b.messageCount - a.messageCount);\n\n return {\n projectsWorkedOn: acc.projects.size,\n projects,\n topProject,\n gitBranches: {\n total: acc.branches.size,\n branches: branches.slice(0, 20), // Top 20 branches\n },\n };\n}\n\n/**\n * Calculate project metrics from entries\n */\nexport function calculateProjectMetrics(\n entries: Array<JSONLEntry & { sessionId: string; projectPath: string }>\n): ProjectMetrics {\n const acc = createProjectAccumulator();\n\n for (const entry of entries) {\n processProjectEntry(acc, entry);\n }\n\n return finalizeProjectMetrics(acc);\n}\n","/**\n * Tier 4: Tool Usage (Developer DNA)\n * Your coding assistant preferences\n */\n\nimport { isAssistantMessage, isToolUseContent } from \"../types/jsonl\";\nimport { calculatePercentage } from \"../utils/aggregators\";\n\nimport type { JSONLEntry } from \"../types/jsonl\";\nimport type { DeveloperStyle, ToolMetrics } from \"../types/metrics\";\n\n// Tool categories for developer profile\nconst READING_TOOLS = new Set([\"Read\", \"Glob\", \"Grep\"]);\nconst WRITING_TOOLS = new Set([\"Edit\", \"Write\", \"NotebookEdit\"]);\nconst EXECUTING_TOOLS = new Set([\"Bash\", \"KillShell\", \"TaskOutput\"]);\nconst RESEARCHING_TOOLS = new Set([\"WebFetch\", \"WebSearch\"]);\nconst PLANNING_TOOLS = new Set([\n \"Task\",\n \"TodoWrite\",\n \"TodoRead\",\n \"ExitPlanMode\",\n \"EnterPlanMode\",\n \"AskUserQuestion\",\n]);\n\n/**\n * Accumulator for building tool metrics\n */\nexport type ToolAccumulator = {\n tools: Map<string, number>;\n mcpTools: Map<string, number>;\n subagentTypes: Map<string, number>;\n taskToolCalls: number;\n};\n\n/**\n * Create empty accumulator\n */\nfunction createToolAccumulator(): ToolAccumulator {\n return {\n tools: new Map(),\n mcpTools: new Map(),\n subagentTypes: new Map(),\n taskToolCalls: 0,\n };\n}\n\n/**\n * Check if a tool name is an MCP tool\n */\nfunction isMcpTool(name: string): boolean {\n return name.startsWith(\"mcp__\") || name.includes(\"::\");\n}\n\n/**\n * Parse MCP tool name\n */\nfunction parseMcpTool(name: string): { server: string; tool: string } {\n if (name.startsWith(\"mcp__\")) {\n // Format: mcp__server__tool\n const parts = name.split(\"__\");\n return {\n server: parts[1] ?? \"unknown\",\n tool: parts.slice(2).join(\"__\"),\n };\n }\n if (name.includes(\"::\")) {\n // Format: server::tool\n const [server, ...toolParts] = name.split(\"::\");\n return {\n server: server ?? \"unknown\",\n tool: toolParts.join(\"::\"),\n };\n }\n return { server: \"unknown\", tool: name };\n}\n\n/**\n * Process a single entry\n */\nfunction processToolEntry(acc: ToolAccumulator, entry: JSONLEntry): void {\n if (!isAssistantMessage(entry)) {\n return;\n }\n\n for (const content of entry.message.content) {\n if (!isToolUseContent(content)) {\n continue;\n }\n\n const toolName = content.name;\n\n // Track all tools\n acc.tools.set(toolName, (acc.tools.get(toolName) ?? 0) + 1);\n\n // Track MCP tools separately\n if (isMcpTool(toolName)) {\n acc.mcpTools.set(toolName, (acc.mcpTools.get(toolName) ?? 0) + 1);\n }\n\n // Track Task tool and subagent types\n if (toolName === \"Task\") {\n acc.taskToolCalls += 1;\n\n // Extract subagent type from input\n const input = content.input as Record<string, unknown>;\n const subagentType =\n typeof input.subagent_type === \"string\"\n ? input.subagent_type\n : \"unknown\";\n acc.subagentTypes.set(\n subagentType,\n (acc.subagentTypes.get(subagentType) ?? 0) + 1\n );\n }\n }\n}\n\n/**\n * Determine developer profile style\n */\nfunction determineDeveloperStyle(breakdown: {\n reading: number;\n writing: number;\n executing: number;\n researching: number;\n planning: number;\n}): { style: DeveloperStyle; description: string } {\n const total =\n breakdown.reading +\n breakdown.writing +\n breakdown.executing +\n breakdown.researching +\n breakdown.planning;\n\n if (total === 0) {\n return { style: \"balanced\", description: \"Just getting started\" };\n }\n\n const percentages = {\n reading: (breakdown.reading / total) * 100,\n writing: (breakdown.writing / total) * 100,\n executing: (breakdown.executing / total) * 100,\n researching: (breakdown.researching / total) * 100,\n planning: (breakdown.planning / total) * 100,\n };\n\n // Find dominant style (>40% of tool usage)\n if (percentages.reading > 40) {\n return {\n style: \"reader\",\n description: \"You prefer understanding code before changing it\",\n };\n }\n if (percentages.writing > 40) {\n return {\n style: \"writer\",\n description: \"You dive straight into writing and editing code\",\n };\n }\n if (percentages.executing > 40) {\n return {\n style: \"executor\",\n description: \"You love running commands and scripts\",\n };\n }\n if (percentages.researching > 30) {\n return {\n style: \"researcher\",\n description: \"You gather information before acting\",\n };\n }\n if (percentages.planning > 30) {\n return {\n style: \"planner\",\n description: \"You carefully plan and organize your work\",\n };\n }\n\n return {\n style: \"balanced\",\n description: \"You have a well-rounded approach to coding\",\n };\n}\n\n/**\n * Finalize tool metrics from accumulator\n */\nfunction finalizeToolMetrics(acc: ToolAccumulator): ToolMetrics {\n const totalCalls = Array.from(acc.tools.values()).reduce(\n (sum, count) => sum + count,\n 0\n );\n\n // Build tool distribution\n const toolDistribution = Array.from(acc.tools.entries())\n .map(([tool, count]) => ({\n tool,\n count,\n percentage: calculatePercentage(count, totalCalls),\n }))\n .sort((a, b) => b.count - a.count);\n\n // Top tools with rank\n const topTools = toolDistribution.slice(0, 10).map((item, index) => ({\n tool: item.tool,\n count: item.count,\n rank: index + 1,\n }));\n\n // Subagent usage\n const subagentTypes = Array.from(acc.subagentTypes.entries())\n .map(([type, count]) => ({ type, count }))\n .sort((a, b) => b.count - a.count);\n\n // MCP tools\n const mcpTools = Array.from(acc.mcpTools.entries())\n .map(([name, count]) => {\n const { server, tool } = parseMcpTool(name);\n return { server, tool, count };\n })\n .sort((a, b) => b.count - a.count);\n\n // Calculate style breakdown\n const styleBreakdown = {\n reading: 0,\n writing: 0,\n executing: 0,\n researching: 0,\n planning: 0,\n };\n\n for (const [tool, count] of acc.tools) {\n if (READING_TOOLS.has(tool)) {\n styleBreakdown.reading += count;\n } else if (WRITING_TOOLS.has(tool)) {\n styleBreakdown.writing += count;\n } else if (EXECUTING_TOOLS.has(tool)) {\n styleBreakdown.executing += count;\n } else if (RESEARCHING_TOOLS.has(tool)) {\n styleBreakdown.researching += count;\n } else if (PLANNING_TOOLS.has(tool)) {\n styleBreakdown.planning += count;\n }\n }\n\n const { style, description } = determineDeveloperStyle(styleBreakdown);\n\n return {\n toolCallsTotal: totalCalls,\n toolDistribution,\n topTools,\n subagentUsage: {\n taskToolCalls: acc.taskToolCalls,\n subagentTypes,\n },\n mcpTools,\n developerProfile: {\n primaryStyle: style,\n styleBreakdown,\n description,\n },\n };\n}\n\n/**\n * Calculate tool metrics from entries\n */\nexport function calculateToolMetrics(entries: Array<JSONLEntry>): ToolMetrics {\n const acc = createToolAccumulator();\n\n for (const entry of entries) {\n processToolEntry(acc, entry);\n }\n\n return finalizeToolMetrics(acc);\n}\n","/**\n * Output formatting for Claude Code Wrapped\n */\n\nexport {\n exportAsCompactJSON,\n exportAsJSON,\n exportTierAsJSON,\n} from \"./json\";\nexport {\n generateShortSummary,\n generateWrappedText,\n templates,\n} from \"./templates\";\n\nexport type { ExportMetadata, WrappedExport } from \"./json\";\n","/**\n * JSON export for Claude Code Wrapped\n */\n\nimport type { ClaudeCodeWrappedSummary } from \"../types/metrics\";\n\n/**\n * Export metadata\n */\nexport type ExportMetadata = {\n version: string;\n generatedAt: string;\n generator: string;\n};\n\n/**\n * Full export structure\n */\nexport type WrappedExport = {\n metadata: ExportMetadata;\n summary: ClaudeCodeWrappedSummary;\n};\n\n/**\n * Export summary as JSON\n */\nexport function exportAsJSON(summary: ClaudeCodeWrappedSummary): string {\n const exportData: WrappedExport = {\n metadata: {\n version: \"1.0.0\",\n generatedAt: new Date().toISOString(),\n generator: \"claude-code-wrapped\",\n },\n summary,\n };\n\n return JSON.stringify(exportData, null, 2);\n}\n\n/**\n * Export summary as compact JSON (no formatting)\n */\nexport function exportAsCompactJSON(summary: ClaudeCodeWrappedSummary): string {\n const exportData: WrappedExport = {\n metadata: {\n version: \"1.0.0\",\n generatedAt: new Date().toISOString(),\n generator: \"claude-code-wrapped\",\n },\n summary,\n };\n\n return JSON.stringify(exportData);\n}\n\n/**\n * Export a single tier as JSON\n */\nexport function exportTierAsJSON<K extends keyof ClaudeCodeWrappedSummary>(\n summary: ClaudeCodeWrappedSummary,\n tier: K\n): string {\n return JSON.stringify(\n {\n metadata: {\n version: \"1.0.0\",\n generatedAt: new Date().toISOString(),\n generator: \"claude-code-wrapped\",\n tier,\n },\n data: summary[tier],\n },\n null,\n 2\n );\n}\n","/**\n * Wrapped-style text templates for display\n */\n\nimport type { ClaudeCodeWrappedSummary } from \"../types/metrics\";\n\n/**\n * Format a number with commas\n */\nfunction formatNumber(num: number): string {\n return num.toLocaleString(\"en-US\");\n}\n\n/**\n * Format currency\n */\nfunction formatCurrency(amount: number): string {\n return `$${amount.toFixed(2)}`;\n}\n\n/**\n * Format percentage\n */\nfunction formatPercentage(pct: number): string {\n return `${pct.toFixed(1)}%`;\n}\n\n/**\n * Get time of day description\n */\nfunction getTimeOfDay(hour: number): string {\n if (hour >= 5 && hour < 12) {\n return \"morning person\";\n }\n if (hour >= 12 && hour < 17) {\n return \"afternoon coder\";\n }\n if (hour >= 17 && hour < 21) {\n return \"evening enthusiast\";\n }\n return \"night owl\";\n}\n\n/**\n * Wrapped text templates\n */\nexport const templates = {\n /**\n * Main headline\n */\n headline: (summary: ClaudeCodeWrappedSummary): string =>\n `You had ${formatNumber(summary.core.sessions.total)} coding sessions with Claude in ${summary.period.year}!`,\n\n /**\n * Token statistics\n */\n tokenStats: (summary: ClaudeCodeWrappedSummary): string =>\n `Together, you processed ${formatNumber(summary.core.totalTokens.total)} tokens`,\n\n /**\n * Cost summary\n */\n costSummary: (summary: ClaudeCodeWrappedSummary): string =>\n `Your AI assistant investment: ${formatCurrency(summary.core.estimatedCost.total)}`,\n\n /**\n * Favorite model\n */\n favoriteModel: (summary: ClaudeCodeWrappedSummary): string => {\n if (!summary.models.favoriteModel) {\n return \"You haven't found your favorite model yet\";\n }\n return `Your go-to model was ${summary.models.favoriteModel.displayName} (${formatPercentage(summary.models.favoriteModel.percentage)} of requests)`;\n },\n\n /**\n * Developer profile\n */\n developerProfile: (summary: ClaudeCodeWrappedSummary): string => {\n const profile = summary.tools.developerProfile;\n return `Your developer DNA: ${profile.primaryStyle.charAt(0).toUpperCase() + profile.primaryStyle.slice(1)} - ${profile.description}`;\n },\n\n /**\n * Top tool\n */\n topTool: (summary: ClaudeCodeWrappedSummary): string => {\n const top = summary.tools.topTools[0];\n if (!top) {\n return \"You haven't used any tools yet\";\n }\n return `Your most-used tool: ${top.tool} (${formatNumber(top.count)} times)`;\n },\n\n /**\n * Activity streak\n */\n activityStreak: (summary: ClaudeCodeWrappedSummary): string => {\n const streak = summary.core.activity.longestStreak;\n if (streak <= 1) {\n return \"Start coding with Claude more to build a streak!\";\n }\n return `Your longest coding streak: ${streak} days in a row!`;\n },\n\n /**\n * Peak hour\n */\n peakHour: (summary: ClaudeCodeWrappedSummary): string => {\n const hour = summary.patterns.peakHour.hour;\n const period = hour >= 12 ? \"PM\" : \"AM\";\n let displayHour: number;\n if (hour > 12) {\n displayHour = hour - 12;\n } else if (hour === 0) {\n displayHour = 12;\n } else {\n displayHour = hour;\n }\n const timeType = getTimeOfDay(hour);\n return `You're a ${timeType} - most active at ${displayHour}:00 ${period}`;\n },\n\n /**\n * Busiest day\n */\n busiestDay: (summary: ClaudeCodeWrappedSummary): string =>\n `${summary.patterns.peakDayOfWeek.dayName}s are your coding day`,\n\n /**\n * Top project\n */\n topProject: (summary: ClaudeCodeWrappedSummary): string => {\n if (!summary.projects.topProject) {\n return \"You haven't started any projects yet\";\n }\n return `Your main project: ${summary.projects.topProject.displayName} (${formatPercentage(summary.projects.topProject.percentageOfTotal)} of your time)`;\n },\n\n /**\n * Cache efficiency\n */\n cacheEfficiency: (summary: ClaudeCodeWrappedSummary): string => {\n const savings = summary.collaboration.cacheEfficiency.estimatedSavings;\n if (savings > 0) {\n return `Smart caching saved you an estimated ${formatCurrency(savings)}`;\n }\n return `Cache hit rate: ${formatPercentage(summary.collaboration.cacheEfficiency.cacheHitRate)}`;\n },\n\n /**\n * Words generated\n */\n wordsGenerated: (summary: ClaudeCodeWrappedSummary): string => {\n const words = summary.fun.wordsGenerated;\n const pages = summary.fun.equivalentPages;\n return `Claude wrote ~${formatNumber(words)} words for you - that's ${formatNumber(pages)} pages!`;\n },\n\n /**\n * Most active day\n */\n mostActiveDay: (summary: ClaudeCodeWrappedSummary): string => {\n if (!summary.fun.mostActiveDay) {\n return \"Start coding to find your most active day!\";\n }\n const date = summary.fun.mostActiveDay.date;\n const formatted = date.toLocaleDateString(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n });\n return `Your busiest day was ${formatted} with ${formatNumber(summary.fun.mostActiveDay.messageCount)} messages`;\n },\n};\n\n/**\n * Generate a full wrapped summary text\n */\nexport function generateWrappedText(summary: ClaudeCodeWrappedSummary): string {\n const lines = [\n `Claude Code Wrapped ${summary.period.year}`,\n \"═\".repeat(40),\n \"\",\n templates.headline(summary),\n \"\",\n \"📊 Your Stats\",\n ` • ${templates.tokenStats(summary)}`,\n ` • ${templates.costSummary(summary)}`,\n ` • Days active: ${summary.core.activity.daysActive}`,\n ` • ${templates.activityStreak(summary)}`,\n \"\",\n \"🤖 Your AI Preferences\",\n ` • ${templates.favoriteModel(summary)}`,\n ` • ${templates.developerProfile(summary)}`,\n ` • ${templates.topTool(summary)}`,\n \"\",\n \"⏰ Your Patterns\",\n ` • ${templates.peakHour(summary)}`,\n ` • ${templates.busiestDay(summary)}`,\n \"\",\n \"📁 Your Projects\",\n ` • ${summary.projects.projectsWorkedOn} projects`,\n ` • ${templates.topProject(summary)}`,\n \"\",\n \"✨ Fun Facts\",\n ` • ${templates.wordsGenerated(summary)}`,\n ` • ${templates.mostActiveDay(summary)}`,\n ` • ${templates.cacheEfficiency(summary)}`,\n \"\",\n \"═\".repeat(40),\n `Generated on ${summary.generatedAt.toLocaleDateString()}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generate a short summary (for sharing)\n */\nexport function generateShortSummary(\n summary: ClaudeCodeWrappedSummary\n): string {\n return [\n `🎉 My Claude Code Wrapped ${summary.period.year}`,\n `📊 ${formatNumber(summary.core.sessions.total)} sessions | ${formatNumber(summary.core.totalTokens.total)} tokens`,\n `🤖 Favorite: ${summary.models.favoriteModel?.displayName ?? \"N/A\"}`,\n `🔧 Top tool: ${summary.tools.topTools[0]?.tool ?? \"N/A\"}`,\n `🔥 Longest streak: ${summary.core.activity.longestStreak} days`,\n `💡 Style: ${summary.tools.developerProfile.primaryStyle}`,\n ].join(\"\\n\");\n}\n","/**\n * Claude Code Wrapped\n *\n * Generate Spotify Wrapped-style annual summaries of your Claude Code usage.\n *\n * @example\n * ```typescript\n * import { generateWrappedSummary } from \"claude-code-wrapped\";\n *\n * const result = await generateWrappedSummary({ year: 2025 });\n *\n * console.log(`Sessions: ${result.summary.core.sessions.total}`);\n * console.log(`Cost: $${result.summary.core.estimatedCost.total.toFixed(2)}`);\n * console.log(`Style: ${result.summary.tools.developerProfile.primaryStyle}`);\n * ```\n */\n\nimport { loadClaudeData, resolveConfig } from \"./loader/index\";\nimport { calculateAllMetrics } from \"./metrics/index\";\n\nimport type { LoadedData } from \"./loader/index\";\nimport type {\n ClaudeCodeWrappedConfig,\n ResolvedConfig,\n WrappedError,\n WrappedResult,\n WrappedWarning,\n} from \"./types/config\";\nimport type { ClaudeCodeWrappedSummary } from \"./types/metrics\";\n\n// Re-export submodules for advanced usage\nexport * as loader from \"./loader/index\";\nexport * as metrics from \"./metrics/index\";\nexport * as output from \"./output/index\";\n// Re-export output helpers directly for convenience\nexport {\n exportAsCompactJSON,\n exportAsJSON,\n generateShortSummary,\n generateWrappedText,\n templates,\n} from \"./output/index\";\nexport * as pricing from \"./pricing/index\";\n\nexport type {\n ClaudeCodeWrappedConfig,\n ProcessingStats,\n ResolvedConfig,\n WrappedError,\n WrappedResult,\n WrappedWarning,\n} from \"./types/config\";\nexport type { ClaudeCodeWrappedSummary } from \"./types/metrics\";\n\n/**\n * Generate a complete Claude Code Wrapped summary\n *\n * @param config - Configuration options\n * @returns Wrapped result containing summary, warnings, and stats\n */\nexport async function generateWrappedSummary(\n config: ClaudeCodeWrappedConfig = {}\n): Promise<WrappedResult<ClaudeCodeWrappedSummary>> {\n const startTime = Date.now();\n const warnings: Array<WrappedWarning> = [];\n const errors: Array<WrappedError> = [];\n\n // Resolve configuration\n const resolvedConfig = resolveConfig(config);\n\n // Load data\n let loadedData: LoadedData;\n try {\n loadedData = await loadClaudeData(resolvedConfig);\n } catch (e) {\n errors.push({\n code: \"LOAD_ERROR\",\n message: e instanceof Error ? e.message : \"Failed to load Claude data\",\n fatal: true,\n });\n\n // Return empty summary on fatal error\n return {\n summary: createEmptySummary(resolvedConfig),\n warnings,\n errors,\n stats: {\n filesProcessed: 0,\n filesSkipped: 0,\n entriesProcessed: 0,\n entriesSkipped: 0,\n processingTimeMs: Date.now() - startTime,\n },\n };\n }\n\n // Check for empty data\n if (loadedData.entries.length === 0) {\n warnings.push({\n code: \"NO_DATA\",\n message: \"No Claude Code data found for the specified period\",\n context: {\n baseDir: resolvedConfig.baseDir,\n dateRange: resolvedConfig.dateRange,\n },\n });\n }\n\n // Calculate metrics\n const summary = calculateAllMetrics(\n loadedData.entries,\n resolvedConfig.dateRange\n );\n\n return {\n summary,\n warnings,\n errors,\n stats: {\n filesProcessed: loadedData.sessions.length,\n filesSkipped: 0,\n entriesProcessed: loadedData.entries.length,\n entriesSkipped: 0,\n processingTimeMs: Date.now() - startTime,\n },\n };\n}\n\n/**\n * Create an empty summary for error cases\n */\nfunction createEmptySummary(config: ResolvedConfig): ClaudeCodeWrappedSummary {\n const emptyDate = new Date();\n\n return {\n generatedAt: emptyDate,\n period: {\n from: config.dateRange.from,\n to: config.dateRange.to,\n year: config.year,\n },\n core: {\n totalTokens: {\n input: 0,\n output: 0,\n cacheCreation: 0,\n cacheRead: 0,\n total: 0,\n },\n estimatedCost: {\n total: 0,\n byCategory: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },\n },\n sessions: { total: 0, averageMessages: 0, longestSession: null },\n messages: {\n total: 0,\n userMessages: 0,\n assistantMessages: 0,\n averagePerSession: 0,\n },\n activity: {\n daysActive: 0,\n totalDaysInPeriod: 0,\n longestStreak: 0,\n currentStreak: 0,\n firstActiveDay: null,\n lastActiveDay: null,\n },\n },\n patterns: {\n peakHour: { hour: 0, messageCount: 0 },\n peakDayOfWeek: { day: 0, dayName: \"Sunday\", messageCount: 0 },\n busiestMonth: { month: 0, monthName: \"January\", messageCount: 0 },\n hourlyDistribution: [],\n weeklyDistribution: [],\n monthlyDistribution: [],\n },\n models: {\n modelsUsed: [],\n favoriteModel: null,\n costByModel: [],\n },\n tools: {\n toolCallsTotal: 0,\n toolDistribution: [],\n topTools: [],\n subagentUsage: { taskToolCalls: 0, subagentTypes: [] },\n mcpTools: [],\n developerProfile: {\n primaryStyle: \"balanced\",\n styleBreakdown: {\n reading: 0,\n writing: 0,\n executing: 0,\n researching: 0,\n planning: 0,\n },\n description: \"No data yet\",\n },\n },\n projects: {\n projectsWorkedOn: 0,\n projects: [],\n topProject: null,\n gitBranches: { total: 0, branches: [] },\n },\n collaboration: {\n cacheEfficiency: {\n cacheHitRate: 0,\n cacheCreationRate: 0,\n estimatedSavings: 0,\n },\n extendedThinking: { messagesWithThinking: 0, percentageOfTotal: 0 },\n interactivity: {\n questionsAsked: 0,\n plansCreated: 0,\n todoItemsCreated: 0,\n },\n serviceTier: {\n standardRequests: 0,\n priorityRequests: 0,\n priorityPercentage: 0,\n },\n },\n fun: {\n charactersGenerated: 0,\n wordsGenerated: 0,\n equivalentPages: 0,\n summaryWordCloud: [],\n longestResponse: null,\n mostActiveDay: null,\n milestones: [],\n versions: [],\n },\n };\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sleekdesign/ccw25",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Generate your Claude Code Wrapped 2025 - Spotify Wrapped-style annual summary",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"bin": "./dist/cli.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"keywords": [
|
|
14
|
+
"claude",
|
|
15
|
+
"claude-code",
|
|
16
|
+
"anthropic",
|
|
17
|
+
"ai",
|
|
18
|
+
"usage",
|
|
19
|
+
"analytics",
|
|
20
|
+
"wrapped",
|
|
21
|
+
"statistics"
|
|
22
|
+
],
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/AstraSleek/sleek.git",
|
|
26
|
+
"directory": "packages/claude-code-wrapped"
|
|
27
|
+
},
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"author": "Sleek Team",
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "tsup",
|
|
35
|
+
"check-types": "tsc --noEmit",
|
|
36
|
+
"check-types:watch": "tsc --noEmit --watch"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@sleek/typescript-config": "workspace:*",
|
|
40
|
+
"@types/node": "^22.19.1",
|
|
41
|
+
"tsup": "^8.5.0",
|
|
42
|
+
"typescript": "^5.9.3"
|
|
43
|
+
},
|
|
44
|
+
"exports": {
|
|
45
|
+
".": {
|
|
46
|
+
"import": "./dist/index.js",
|
|
47
|
+
"types": "./dist/index.d.ts"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=18.0.0"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"citty": "^0.1.6"
|
|
55
|
+
}
|
|
56
|
+
}
|