Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ This tool processes Claude Code transcript files (stored as JSONL) and generates
- **Runtime Message Filtering**: JavaScript-powered filtering to show/hide message types
- **Interactive Timeline**: vis-timeline visualization with click-to-scroll navigation
- **Date Range Filtering**: Filter messages using natural language (e.g., "today", "yesterday")
- **Markdown Rendering**: Server-side markdown with syntax highlighting using mistune
- **Markdown Rendering**: Server-side markdown with syntax highlighting using wenmode

## Usage

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ The project uses:
- Textual for Terminal User Interface
- Pydantic for data modeling and validation
- Jinja2 for HTML template rendering
- mistune for Markdown rendering
- wenmode for Markdown rendering
- dateparser for natural language date parsing

### Dependency Management
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ uvx claude-code-log@latest --open-browser
- **Date Range Filtering**: Filter messages by date range using natural language (e.g., "today", "yesterday", "last week")
- **Rich Message Types**: Support for user/assistant messages, tool use/results, thinking content, images
- **System Command Visibility**: Show system commands (like `init`) in expandable details with structured parsing
- **Markdown Rendering**: Server-side markdown rendering with syntax highlighting using mistune
- **Markdown Rendering**: Server-side markdown rendering with syntax highlighting using wenmode
- **Detail Levels & Compact Mode**: `--detail full|high|low|minimal|user-only` filters by verbosity and `--compact` merges repeated section headings — pairs well with `--format md` to feed past conversations back to an LLM for analysis or experience building
- **Floating Navigation**: Always-available back-to-top button and filter controls
- **CLI Interface**: Simple command-line tool using Click
Expand Down Expand Up @@ -231,7 +231,7 @@ When processing all projects, the tool generates:
- **Session Navigation**: Interactive table of contents with session summaries and timestamp ranges
- **Token Usage Display**: Individual message and session-level token consumption tracking
- **Syntax Highlighting**: Code blocks properly formatted with markdown rendering
- **Markdown Support**: Server-side rendering with mistune including:
- **Markdown Support**: Server-side rendering with wenmode including:
- Headers, lists, emphasis, strikethrough
- Code blocks and inline code
- Links, images, and tables
Expand Down
6 changes: 3 additions & 3 deletions claude_code_log/html/renderer.py
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,7 @@ class HtmlRenderer(Renderer):
# v1 contract: ``format_html`` MUST return a real string. The
# absence of the method on a plugin class drives the fallback —
# ``_dispatch_format`` (overridden below) synthesizes HTML from
# the class-side ``format_markdown`` via mistune when only the
# the class-side ``format_markdown`` via wenmode when only the
# Markdown side is implemented. There is no None-as-sentinel.
_class_dispatch_format: str = "html"

Expand All @@ -322,7 +322,7 @@ def _dispatch_format(self, obj: Any, message: "TemplateMessage") -> str:
verbatim. The return MUST be a real string (no None sentinel).
2. Class defines ``format_markdown`` (but not ``format_html``)
in its ``__dict__`` → synthesize HTML by rendering the
Markdown via mistune, wrapped in ``<div class="markdown">``
Markdown via wenmode, wrapped in ``<div class="markdown">``
so theme rules scoped under ``.markdown`` fire. By
definition the synthesized output is Markdown-derived, so
the wrap is automatic — plugin authors don't need
Expand Down Expand Up @@ -1692,7 +1692,7 @@ def generate(
from ..git_remote import canonical_cwd_from_messages, render_with_repo_context

# Bind the per-render canonical repo cwd for the SHA-link
# plugin (issue #156). The mistune renderers themselves are
# plugin (issue #156). The wenmode renderers themselves are
# cached singletons; the resolver reads the cwd from a
# ContextVar so different transcripts can scope to different
# repos without cache invalidation.
Expand Down
17 changes: 16 additions & 1 deletion claude_code_log/html/templates/components/global_styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,22 @@ pre {
display: block;
}

/* Blockquotes in any rendered Markdown (mistune otherwise emits an
/* Footnotes: wenmode emits a GitHub-style "Footnotes" heading for
* screen readers; keep it out of the visual flow like GitHub does. */
.markdown .sr-only,
.user-md .sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip-path: inset(50%);
white-space: nowrap;
border: 0;
}

/* Blockquotes in any rendered Markdown (wenmode otherwise emits an
* unstyled <blockquote> indistinguishable from surrounding text).
* `.markdown` covers every rendered-Markdown surface — assistant text,
* thinking, tool results, teammate messages, system output; `.user-md`
Expand Down
Loading
Loading