commits
- Increase Layout max-width from 5xl to 1050px
- Remove redundant max-w-3xl constraint from ProjectList
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add explicit type annotations for props and state
- Use consistent type imports
- Fix strict boolean expressions in conditionals
- Add proper error handling in async operations
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Remove unnecessary async from synchronous functions
- Use nullish coalescing for defaults
- Add explicit type annotations
- Fix strict boolean expressions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add explicit null/undefined checks
- Filter null values from project name arrays
- Use String() for template literal number interpolation
- Remove unnecessary async from synchronous functions
- Add proper error type handling in catch blocks
- Add DailySummaryParsed interface to replace any
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add explicit null checks and type guards
- Use nullish coalescing (??) instead of logical OR (||)
- Fix floating promises with proper await/void handling
- Remove invalid generateObject options (mode, maxTokens)
- Add type annotations for parsed JSON values
- Use consistent type imports
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use consistent type imports
- Fix array type syntax (T[] instead of Array<T>)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add eslint.config.mjs with strict TypeScript rules
- Add .prettierrc for consistent formatting
- Update package.json with ESLint/Prettier dependencies
- Update tsconfig.json for ESLint compatibility
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ready_to_ship: Rocket icon, teal color
- ignore: EyeOff icon, slate color
Updates stale projects filter to exclude these new statuses.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Updates validStatuses array to include 'ignore' and 'ready_to_ship'.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Extends ProjectStatus type with two new statuses:
- ready_to_ship: for projects that are complete but not yet deployed
- ignore: for projects that should be hidden from normal views
Also removes duplicate ProjectStatus definition.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Old format (pre-October 2025) has user/assistant messages at top level
with type 'message' rather than wrapped in response_item. Adds handler
to parse these and populate userMessages/assistantMessages correctly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Old format uses 'input_text' and 'output_text' content types instead of
'text'. This caused all message text to be silently dropped, resulting
in empty/generic summaries.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Old format (pre-October 2025) uses 'message' and 'function_call' at the
top level rather than wrapped in response_item.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The API handler was hardcoding '30' as fallback, overriding the
365 default in getDays(). Now only passes limit if explicitly provided.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- codex-detector: Extract cwd from environment_context message for old format
- codex-reader: Handle old format session meta without type field
- codex-reader: Handle top-level function_call entries with embedded apply_patch
- codex-reader: Skip timestamp tracking for entries without timestamps
Old format differences:
- First line: {id, timestamp, git} instead of {type:'session_meta', payload:{...}}
- No timestamps on individual entries
- apply_patch embedded in shell command heredoc
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add SessionSource type and update SessionFile interface
- Add SessionSource discriminator type ('claude' | 'codex')
- Move SessionFile interface to types.ts with source field
- Export findGitRoot() for reuse by codex-detector
- Add findAllSessions() to merge Claude and Codex sessions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add Codex CLI session support
- Add codex-detector.ts to discover sessions in ~/.codex/sessions/
- Add codex-reader.ts to parse Codex JSONL format
- Map Codex tools to Claude equivalents (apply_patch→Edit, shell_command→Bash)
- Handle both function_call and custom_tool_call payload types
- Extract file paths from apply_patch unified diff format
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add source column to session_summaries table
- Add migration to add source column (defaults to 'claude')
- Update saveSessionSummary() to accept and store source
- Track whether session came from Claude Code or Codex CLI
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Dispatch to correct parser based on session source
- Import parseCodexSessionFile from codex-reader
- Check sessionFile.source to dispatch to Claude or Codex parser
- Pass source to saveSessionSummary for database tracking
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Make verbose output default for process command
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Consolidate dev server into single bun dev command
- Add scripts/dev.ts to run API and Vite together
- Update package.json dev script
- Properly handle process cleanup on SIGINT/SIGTERM
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Restore tools display in ProjectCard component
- Add tools aggregation to useMemo hook
- Add Tools section with purple styling
- Import Wrench icon from lucide-react
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Update documentation for Codex CLI support
- Update CLAUDE.md with multi-source architecture details
- Add gotcha about Codex function_call vs custom_tool_call types
- Update README.md to mention both Claude Code and Codex CLI
- Document session locations and project unification
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Fix PR review issues
- getSessionStats now uses findAllSessions() to include Codex sessions
- upsertProjectFromSession: total_sessions calculated from actual session count (fixes --force inflation)
- upsertProjectFromSession: first_session_date now uses MIN on conflict
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Features:
- Filter tabs by status (shipped, in_progress, abandoned, etc.)
- Inline status dropdown to change project status
- Stale project detection (in_progress 30+ days)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
GET /api/projects - list all projects with optional status filter
PATCH /api/projects/status - update project status
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Two issues fixed:
1. Hidden folder encoding: Claude encodes /. as -- (e.g., /.cache becomes
--cache). The decoder now handles this correctly.
2. Deleted project fallback: When the original project folder no longer
exists, filesystem probing fails. Now falls back to reading the cwd
from the session file itself, which always has the correct path.
This fixes projects like "pdf-to-markdown" being incorrectly decoded as
"markdown" when the folder /.cache/pdf-to-markdown was deleted.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Document the Haiku double-encoding gotcha and recovery function
- Add regenerate command to command reference
- Note that process now auto-regenerates affected daily summaries
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously, daily summaries were only generated for dates without any
summary. If new sessions were processed for a date that already had a
summary, the summary would become stale.
Now the process command tracks which dates had new sessions and
regenerates summaries for those dates, ensuring the daily view
stays up to date.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Haiku sometimes returns double-encoded JSON where the entire response
is wrapped in a string literal with escaped quotes. This caused sessions
to show "Session details unavailable" even when valid data was returned.
Added tryRecoverMalformedResponse() that extracts valid summary data
from the error object by unescaping and regex-parsing the fields.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Sessions ending before 3am now count toward the previous day, aligning
with typical sleep schedules. This prevents late-night work from being
split across two days.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Merge session details into unified project cards (no more per-session breakdown)
- Remove SessionItem component (orphaned)
- Adjust daily brag prompt to keep 3-5 significant items per project
- Bump concurrency from 5 to 10 for faster processing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Parse isNew flags from brag summary JSON and pass to ProjectCard components.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add isNewProject() and getNewProjectsForDate() DB queries
- Integrate new project detection into brag summary pipeline
- Strip date prefixes from src/tries/ project names at source
- Add isNew flag to daily summary projects for UI display
- Update CLAUDE.md with monorepo path and summary quality docs
Projects in src/tries/ often have date prefixes (2025-12-15-todo-app)
which the LLM would shorten. Now handled at the source instead of
fuzzy matching in the summarizer.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use mode: 'tool' to force proper structured output via tool calling
- Simplify prompts to focus on capabilities, not code artifacts
- Add scope (frontend/backend) to summaries
- Aggressively consolidate related changes into single features
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Classify files as frontend/backend based on path patterns.
Include simplified scope (frontend, backend, or both) in transcript
for LLM to use when framing summaries.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Process sessions in batches of 5 concurrently instead of sequentially.
Results are collected first, then displayed grouped by project.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Claude's path encoding is lossy (/ becomes -), so we can't tell if
"taper-calculator-apps-web" means a project with dashes or nested
directories.
New approach:
- Try interpretations from right to left (literal dashes first)
- Probe filesystem to find which path actually exists
- Use git root as canonical project name for monorepo subdirs
This correctly handles both:
- drink-reminder-native → keeps dashes (project name has dashes)
- taper-calculator/apps/web → merges to taper-calculator (monorepo)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Explicitly tell the LLM to never mention reading/exploring as
accomplishments. Focus on what was BUILT, FIXED, or CHANGED.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Skip exploration-only sessions (Read/Grep/Glob) since reading code
is not an accomplishment. Only sessions with Write/Edit/NotebookEdit/
MultiEdit are included in the worklog.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Limit project summaries to 5-10 words
- Preserve exact project names (don't rename ~ to "misc research")
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use uuid instead of message.id for deduplication (streaming chunks share message.id)
- Store rawInput on ToolUse for file path extraction
- Lead transcript with FILES CREATED/EDITED summary
- This ensures implementation work is captured, not just exploration
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Reduce padding and margins in DayView, Layout, ProjectCard, SessionItem
- Add react-grab script to index.html for dev HMR
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Parse structured JSON from generateObject output
- Display as list with bold project names
- Fallback to plain text for legacy summaries
- Copy button exports readable text format
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Group days by month with headers
- Group within months by week with divider labels
- Show relative dates (Today, Yesterday, This Week, Last Week)
- Highlight today's entry with blue icon
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace generateText + JSON parsing with generateObject
- Add Zod schemas for session and daily summaries
- Daily summaries now return structured JSON for rendering
- More reliable than regex parsing of LLM text output
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Pre-filter sessions by file modification time for faster processing
- Smart empty session detection: keep if Edit/Write used (quick fixes)
- Post-LLM filtering for "no work" summaries
- Require 3+ tool calls OR 5+ messages for non-edit sessions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add -d/--date flag for single day filtering (supports 'today', 'yesterday')
- Add -w/--week flag for week filtering (supports 'thisweek', 'lastweek')
- Add 'regenerate' command to regenerate daily summaries
- Use --force with regenerate to redo all summaries
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Components:
- Layout: Header with stats and refresh button
- DayList: Calendar view of days with sessions
- DayView: Day detail with projects and sessions
- BragSummary: Shareable daily summary with copy button
- ProjectCard: Expandable project with sessions
- SessionItem: Session details with accomplishments
Light mode design with Tailwind CSS.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Bun.serve() for static files and API
- API endpoints: /api/days, /api/days/:date, /api/stats, /api/refresh
- SPA fallback for React router
- Refresh endpoint triggers background processing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add explicit null/undefined checks
- Filter null values from project name arrays
- Use String() for template literal number interpolation
- Remove unnecessary async from synchronous functions
- Add proper error type handling in catch blocks
- Add DailySummaryParsed interface to replace any
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add explicit null checks and type guards
- Use nullish coalescing (??) instead of logical OR (||)
- Fix floating promises with proper await/void handling
- Remove invalid generateObject options (mode, maxTokens)
- Add type annotations for parsed JSON values
- Use consistent type imports
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add eslint.config.mjs with strict TypeScript rules
- Add .prettierrc for consistent formatting
- Update package.json with ESLint/Prettier dependencies
- Update tsconfig.json for ESLint compatibility
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Extends ProjectStatus type with two new statuses:
- ready_to_ship: for projects that are complete but not yet deployed
- ignore: for projects that should be hidden from normal views
Also removes duplicate ProjectStatus definition.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Old format (pre-October 2025) has user/assistant messages at top level
with type 'message' rather than wrapped in response_item. Adds handler
to parse these and populate userMessages/assistantMessages correctly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- codex-detector: Extract cwd from environment_context message for old format
- codex-reader: Handle old format session meta without type field
- codex-reader: Handle top-level function_call entries with embedded apply_patch
- codex-reader: Skip timestamp tracking for entries without timestamps
Old format differences:
- First line: {id, timestamp, git} instead of {type:'session_meta', payload:{...}}
- No timestamps on individual entries
- apply_patch embedded in shell command heredoc
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add SessionSource type and update SessionFile interface
- Add SessionSource discriminator type ('claude' | 'codex')
- Move SessionFile interface to types.ts with source field
- Export findGitRoot() for reuse by codex-detector
- Add findAllSessions() to merge Claude and Codex sessions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add Codex CLI session support
- Add codex-detector.ts to discover sessions in ~/.codex/sessions/
- Add codex-reader.ts to parse Codex JSONL format
- Map Codex tools to Claude equivalents (apply_patch→Edit, shell_command→Bash)
- Handle both function_call and custom_tool_call payload types
- Extract file paths from apply_patch unified diff format
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Add source column to session_summaries table
- Add migration to add source column (defaults to 'claude')
- Update saveSessionSummary() to accept and store source
- Track whether session came from Claude Code or Codex CLI
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Dispatch to correct parser based on session source
- Import parseCodexSessionFile from codex-reader
- Check sessionFile.source to dispatch to Claude or Codex parser
- Pass source to saveSessionSummary for database tracking
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Make verbose output default for process command
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Consolidate dev server into single bun dev command
- Add scripts/dev.ts to run API and Vite together
- Update package.json dev script
- Properly handle process cleanup on SIGINT/SIGTERM
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Restore tools display in ProjectCard component
- Add tools aggregation to useMemo hook
- Add Tools section with purple styling
- Import Wrench icon from lucide-react
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Update documentation for Codex CLI support
- Update CLAUDE.md with multi-source architecture details
- Add gotcha about Codex function_call vs custom_tool_call types
- Update README.md to mention both Claude Code and Codex CLI
- Document session locations and project unification
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Fix PR review issues
- getSessionStats now uses findAllSessions() to include Codex sessions
- upsertProjectFromSession: total_sessions calculated from actual session count (fixes --force inflation)
- upsertProjectFromSession: first_session_date now uses MIN on conflict
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Two issues fixed:
1. Hidden folder encoding: Claude encodes /. as -- (e.g., /.cache becomes
--cache). The decoder now handles this correctly.
2. Deleted project fallback: When the original project folder no longer
exists, filesystem probing fails. Now falls back to reading the cwd
from the session file itself, which always has the correct path.
This fixes projects like "pdf-to-markdown" being incorrectly decoded as
"markdown" when the folder /.cache/pdf-to-markdown was deleted.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously, daily summaries were only generated for dates without any
summary. If new sessions were processed for a date that already had a
summary, the summary would become stale.
Now the process command tracks which dates had new sessions and
regenerates summaries for those dates, ensuring the daily view
stays up to date.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Haiku sometimes returns double-encoded JSON where the entire response
is wrapped in a string literal with escaped quotes. This caused sessions
to show "Session details unavailable" even when valid data was returned.
Added tryRecoverMalformedResponse() that extracts valid summary data
from the error object by unescaping and regex-parsing the fields.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Merge session details into unified project cards (no more per-session breakdown)
- Remove SessionItem component (orphaned)
- Adjust daily brag prompt to keep 3-5 significant items per project
- Bump concurrency from 5 to 10 for faster processing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add isNewProject() and getNewProjectsForDate() DB queries
- Integrate new project detection into brag summary pipeline
- Strip date prefixes from src/tries/ project names at source
- Add isNew flag to daily summary projects for UI display
- Update CLAUDE.md with monorepo path and summary quality docs
Projects in src/tries/ often have date prefixes (2025-12-15-todo-app)
which the LLM would shorten. Now handled at the source instead of
fuzzy matching in the summarizer.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use mode: 'tool' to force proper structured output via tool calling
- Simplify prompts to focus on capabilities, not code artifacts
- Add scope (frontend/backend) to summaries
- Aggressively consolidate related changes into single features
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Claude's path encoding is lossy (/ becomes -), so we can't tell if
"taper-calculator-apps-web" means a project with dashes or nested
directories.
New approach:
- Try interpretations from right to left (literal dashes first)
- Probe filesystem to find which path actually exists
- Use git root as canonical project name for monorepo subdirs
This correctly handles both:
- drink-reminder-native → keeps dashes (project name has dashes)
- taper-calculator/apps/web → merges to taper-calculator (monorepo)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use uuid instead of message.id for deduplication (streaming chunks share message.id)
- Store rawInput on ToolUse for file path extraction
- Lead transcript with FILES CREATED/EDITED summary
- This ensures implementation work is captured, not just exploration
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Group days by month with headers
- Group within months by week with divider labels
- Show relative dates (Today, Yesterday, This Week, Last Week)
- Highlight today's entry with blue icon
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace generateText + JSON parsing with generateObject
- Add Zod schemas for session and daily summaries
- Daily summaries now return structured JSON for rendering
- More reliable than regex parsing of LLM text output
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Pre-filter sessions by file modification time for faster processing
- Smart empty session detection: keep if Edit/Write used (quick fixes)
- Post-LLM filtering for "no work" summaries
- Require 3+ tool calls OR 5+ messages for non-edit sessions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add -d/--date flag for single day filtering (supports 'today', 'yesterday')
- Add -w/--week flag for week filtering (supports 'thisweek', 'lastweek')
- Add 'regenerate' command to regenerate daily summaries
- Use --force with regenerate to redo all summaries
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Components:
- Layout: Header with stats and refresh button
- DayList: Calendar view of days with sessions
- DayView: Day detail with projects and sessions
- BragSummary: Shareable daily summary with copy button
- ProjectCard: Expandable project with sessions
- SessionItem: Session details with accomplishments
Light mode design with Tailwind CSS.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Bun.serve() for static files and API
- API endpoints: /api/days, /api/days/:date, /api/stats, /api/refresh
- SPA fallback for React router
- Refresh endpoint triggers background processing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>