claude-code-log 1.2.0__tar.gz → 1.4.0__tar.gz
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.
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/.claude/skills/tool-renderer/SKILL.md +27 -1
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/.github/workflows/ci.yml +9 -3
- claude_code_log-1.4.0/.github/workflows/docs.yml +68 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/.gitignore +4 -3
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/CHANGELOG.md +81 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/CLAUDE.md +36 -6
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/CONTRIBUTING.md +72 -8
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/PKG-INFO +31 -4
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/README.md +29 -2
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/cache.py +75 -6
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/cli.py +309 -18
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/converter.py +875 -514
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/dag.py +313 -70
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/factories/__init__.py +21 -0
- claude_code_log-1.4.0/claude_code_log/factories/agent_metadata_factory.py +107 -0
- claude_code_log-1.4.0/claude_code_log/factories/attachment_factory.py +126 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/factories/meta_factory.py +2 -0
- claude_code_log-1.4.0/claude_code_log/factories/priorities.py +46 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/factories/system_factory.py +52 -4
- claude_code_log-1.4.0/claude_code_log/factories/task_notification_factory.py +161 -0
- claude_code_log-1.4.0/claude_code_log/factories/teammate_factory.py +140 -0
- claude_code_log-1.4.0/claude_code_log/factories/tool_factory.py +1612 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/factories/transcript_factory.py +4 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/factories/user_factory.py +129 -3
- claude_code_log-1.4.0/claude_code_log/git_remote.py +343 -0
- claude_code_log-1.4.0/claude_code_log/html/async_formatter.py +175 -0
- claude_code_log-1.4.0/claude_code_log/html/renderer.py +1604 -0
- claude_code_log-1.4.0/claude_code_log/html/system_formatters.py +299 -0
- claude_code_log-1.4.0/claude_code_log/html/teammate_formatter.py +568 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/edit_diff_styles.css +1 -1
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/filter_styles.css +4 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/global_styles.css +88 -2
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/message_styles.css +263 -13
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/project_card_styles.css +32 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/session_nav.html +6 -1
- claude_code_log-1.4.0/claude_code_log/html/templates/components/teammate_styles.css +373 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/timeline.html +23 -3
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/todo_styles.css +19 -0
- claude_code_log-1.4.0/claude_code_log/html/templates/index.html +157 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/transcript.html +81 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/tool_formatters.py +378 -44
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/user_formatters.py +42 -5
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/utils.py +211 -6
- claude_code_log-1.4.0/claude_code_log/json/__init__.py +5 -0
- claude_code_log-1.4.0/claude_code_log/json/renderer.py +225 -0
- claude_code_log-1.4.0/claude_code_log/markdown/renderer.py +2186 -0
- claude_code_log-1.4.0/claude_code_log/markdown_plugins.py +440 -0
- claude_code_log-1.4.0/claude_code_log/migrations/005_session_team_name.sql +14 -0
- claude_code_log-1.4.0/claude_code_log/migrations/006_session_ai_title.sql +14 -0
- claude_code_log-1.4.0/claude_code_log/models.py +2088 -0
- claude_code_log-1.4.0/claude_code_log/plugins.py +371 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/renderer.py +1966 -303
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/tui.py +28 -16
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/utils.py +290 -19
- claude_code_log-1.4.0/dev-docs/agents.md +191 -0
- claude_code_log-1.4.0/dev-docs/application_model.md +458 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/css-classes.md +5 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/dag.md +118 -6
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/implementing-a-tool-renderer.md +54 -0
- claude_code_log-1.2.0/dev-docs/FOLD_STATE_DIAGRAM.md → claude_code_log-1.4.0/dev-docs/message-hierarchy.md +16 -12
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages.md +82 -5
- claude_code_log-1.4.0/dev-docs/plugins.md +741 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/rendering-architecture.md +93 -18
- claude_code_log-1.4.0/dev-docs/teammates.md +978 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/justfile +40 -31
- claude_code_log-1.4.0/mkdocs.yml +87 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/pyproject.toml +21 -2
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/uv.lock +330 -2
- claude_code_log-1.4.0/work/obsidian-friendly-output.md +81 -0
- claude_code_log-1.4.0/work/refactor-reindex-with-ghosting.md +197 -0
- {claude_code_log-1.2.0/dev-docs → claude_code_log-1.4.0/work}/rendering-next.md +3 -36
- claude_code_log-1.4.0/work/simplify-converter-renderer.md +312 -0
- claude_code_log-1.4.0/work/tool-renderer-plugins.md +29 -0
- claude_code_log-1.2.0/.github/workflows/claude.yml +0 -67
- claude_code_log-1.2.0/claude_code_log/factories/tool_factory.py +0 -837
- claude_code_log-1.2.0/claude_code_log/html/renderer.py +0 -716
- claude_code_log-1.2.0/claude_code_log/html/system_formatters.py +0 -141
- claude_code_log-1.2.0/claude_code_log/html/templates/index.html +0 -111
- claude_code_log-1.2.0/claude_code_log/markdown/renderer.py +0 -1010
- claude_code_log-1.2.0/claude_code_log/models.py +0 -1151
- claude_code_log-1.2.0/dev-docs/restoring-archived-sessions.md +0 -105
- claude_code_log-1.2.0/work/phase-c-agent-transcripts.md +0 -87
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/.claude/settings.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/.vscode/settings.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/LICENSE +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/__init__.py +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/factories/assistant_factory.py +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/__init__.py +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/ansi_colors.py +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/assistant_formatters.py +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/renderer_code.py +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/page_nav_styles.css +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/pygments_styles.css +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/search.html +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/search_inline.html +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/search_inline_script.html +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/search_results_panel.html +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/search_styles.css +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/session_nav_styles.css +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/timeline_styles.css +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/timezone_converter.js +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/image_export.py +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/markdown/__init__.py +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/migrations/001_initial_schema.sql +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/migrations/002_html_cache.sql +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/migrations/003_html_pagination.sql +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/migrations/004_html_pagination_variant.sql +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/migrations/__init__.py +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/migrations/runner.py +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/parser.py +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/py.typed +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/renderer_timings.py +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/assistant/assistant.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/assistant/assistant.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/assistant/assistant_sidechain.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/assistant/assistant_sidechain.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/assistant/thinking.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/assistant/thinking.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/file_history_snapshot.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/file_history_snapshot.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/queue_operation.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/queue_operation.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/summary.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/summary.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/system_info.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/system_info.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/AskUserQuestion-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/AskUserQuestion-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/AskUserQuestion-tool_result_error.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/AskUserQuestion-tool_result_error.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/AskUserQuestion-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/AskUserQuestion-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Bash-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Bash-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Bash-tool_result_error.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Bash-tool_result_error.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Bash-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Bash-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/BashOutput-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/BashOutput-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/BashOutput-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/BashOutput-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Edit-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Edit-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Edit-tool_result_error.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Edit-tool_result_error.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Edit-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Edit-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/ExitPlanMode-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/ExitPlanMode-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/ExitPlanMode-tool_result_error.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/ExitPlanMode-tool_result_error.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/ExitPlanMode-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/ExitPlanMode-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Glob-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Glob-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Glob-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Glob-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Grep-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Grep-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Grep-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Grep-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/KillShell-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/KillShell-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/KillShell-tool_result_error.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/KillShell-tool_result_error.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/KillShell-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/KillShell-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/LS-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/LS-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/LS-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/LS-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/MultiEdit-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/MultiEdit-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/MultiEdit-tool_result_error.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/MultiEdit-tool_result_error.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/MultiEdit-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/MultiEdit-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Read-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Read-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Read-tool_result_error.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Read-tool_result_error.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Read-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Read-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Task-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Task-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Task-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Task-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/TodoWrite-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/TodoWrite-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/TodoWrite-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/TodoWrite-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebFetch-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebFetch-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebFetch-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebFetch-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebSearch-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebSearch-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebSearch-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebSearch-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Write-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Write-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Write-tool_result_error.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Write-tool_result_error.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Write-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Write-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/exit_plan_mode-tool_result.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/exit_plan_mode-tool_result.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/exit_plan_mode-tool_use.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/exit_plan_mode-tool_use.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/bash_input.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/bash_input.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/bash_output.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/bash_output.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/command_output.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/command_output.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/image.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/image.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user_command.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user_command.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user_sidechain.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user_sidechain.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user_slash_command.json +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user_slash_command.jsonl +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/mise.toml +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/stubs/pygments/__init__.pyi +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/stubs/pygments/formatter.pyi +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/stubs/pygments/formatters/__init__.pyi +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/stubs/pygments/lexer.pyi +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/stubs/pygments/lexers/__init__.pyi +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/stubs/pygments/util.pyi +0 -0
- {claude_code_log-1.2.0 → claude_code_log-1.4.0}/work/session-state-propagation.md +0 -0
|
@@ -260,6 +260,32 @@ def title_WebSearchInput(self, input: WebSearchInput, message: TemplateMessage)
|
|
|
260
260
|
return self._tool_title(message, "🔎", f'"{input.query}"')
|
|
261
261
|
```
|
|
262
262
|
|
|
263
|
+
### Watch out: the template's wrench-suppression is emoji-range-gated
|
|
264
|
+
|
|
265
|
+
Tool-use messages get a default `🛠️` prefix prepended by
|
|
266
|
+
`templates/transcript.html` *unless* the title already starts with
|
|
267
|
+
an emoji that `html/utils.py::starts_with_emoji` recognises. That
|
|
268
|
+
function whitelists specific Unicode ranges:
|
|
269
|
+
|
|
270
|
+
- `0x2300-0x23FF` Misc Technical (`⏰ ⏳ ⏱️ ⏲️ ⏸ ⏹ ⏺ ⏏` …)
|
|
271
|
+
- `0x2600-0x26FF` Misc Symbols
|
|
272
|
+
- `0x2700-0x27BF` Dingbats
|
|
273
|
+
- `0x1F300-0x1F5FF` Misc Symbols and Pictographs
|
|
274
|
+
- `0x1F600-0x1F64F` Emoticons
|
|
275
|
+
- `0x1F680-0x1F6FF` Transport and Map Symbols
|
|
276
|
+
- `0x1F900-0x1F9FF` Supplemental Symbols
|
|
277
|
+
|
|
278
|
+
If the icon you pass to `_tool_title` falls **outside** these
|
|
279
|
+
ranges, the template will helpfully add a `🛠️` in front of it,
|
|
280
|
+
producing a redundant double-icon title like
|
|
281
|
+
`🛠️ <your-icon> <ToolName>`. Verify by rendering a fixture and
|
|
282
|
+
grepping for `🛠️` co-occurring with your icon, or by checking
|
|
283
|
+
`ord(your_icon)` against the ranges above.
|
|
284
|
+
|
|
285
|
+
If your icon is a real emoji that lives in a Unicode range not
|
|
286
|
+
listed there, **add the range** to `starts_with_emoji` rather than
|
|
287
|
+
picking a different icon.
|
|
288
|
+
|
|
263
289
|
## Step 5: Implement Markdown Renderer
|
|
264
290
|
|
|
265
291
|
In `markdown/renderer.py`:
|
|
@@ -369,7 +395,7 @@ class Test{ToolName}OutputFormatting:
|
|
|
369
395
|
uv run pytest test/test_{toolname}_rendering.py -v
|
|
370
396
|
|
|
371
397
|
# Run full test suite to check for regressions
|
|
372
|
-
uv run pytest -
|
|
398
|
+
uv run pytest -m "not (tui or browser)" -v
|
|
373
399
|
```
|
|
374
400
|
|
|
375
401
|
## Checklist
|
|
@@ -20,6 +20,12 @@ jobs:
|
|
|
20
20
|
|
|
21
21
|
steps:
|
|
22
22
|
- uses: actions/checkout@v4
|
|
23
|
+
with:
|
|
24
|
+
# Full history so test/test_commit_linkifier.py's
|
|
25
|
+
# TestIntegrationLocalRepo can resolve SHAs older than the
|
|
26
|
+
# current tip (`git branch -r --contains` reads local refs
|
|
27
|
+
# only and needs the commits in the object DB).
|
|
28
|
+
fetch-depth: 0
|
|
23
29
|
|
|
24
30
|
- name: Install uv
|
|
25
31
|
uses: astral-sh/setup-uv@v4
|
|
@@ -33,13 +39,13 @@ jobs:
|
|
|
33
39
|
run: uv sync --all-extras --dev && uv run playwright install chromium
|
|
34
40
|
|
|
35
41
|
- name: Run unit tests with coverage
|
|
36
|
-
run: uv run pytest -
|
|
42
|
+
run: uv run pytest -m "not (tui or browser or benchmark)" --cov=claude_code_log --cov-report=xml --cov-report=html --cov-report=term
|
|
37
43
|
|
|
38
44
|
- name: Run TUI tests with coverage append
|
|
39
|
-
run: uv run pytest -
|
|
45
|
+
run: uv run pytest -m tui --cov=claude_code_log --cov-append --cov-report=xml --cov-report=html --cov-report=term
|
|
40
46
|
|
|
41
47
|
- name: Run browser tests with coverage append
|
|
42
|
-
run: uv run pytest -
|
|
48
|
+
run: uv run pytest -m browser --cov=claude_code_log --cov-append --cov-report=xml --cov-report=html --cov-report=term
|
|
43
49
|
|
|
44
50
|
- name: Run benchmark tests with coverage append (primary only)
|
|
45
51
|
if: matrix.is-primary
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
name: Docs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main ]
|
|
8
|
+
|
|
9
|
+
# Allow the deploy job to publish to GitHub Pages.
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
pages: write
|
|
13
|
+
id-token: write
|
|
14
|
+
|
|
15
|
+
# Avoid overlapping deploys; let an in-progress run finish.
|
|
16
|
+
concurrency:
|
|
17
|
+
group: pages
|
|
18
|
+
cancel-in-progress: false
|
|
19
|
+
|
|
20
|
+
env:
|
|
21
|
+
# Silence the Material-for-MkDocs vendor banner about a future MkDocs 2.0.
|
|
22
|
+
DISABLE_MKDOCS_2_WARNING: "true"
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
build:
|
|
26
|
+
runs-on: ubuntu-latest
|
|
27
|
+
steps:
|
|
28
|
+
- uses: actions/checkout@v5
|
|
29
|
+
|
|
30
|
+
- name: Install uv
|
|
31
|
+
uses: astral-sh/setup-uv@v8.2.0
|
|
32
|
+
with:
|
|
33
|
+
enable-cache: true
|
|
34
|
+
|
|
35
|
+
- name: Set up Python
|
|
36
|
+
run: uv python install 3.12
|
|
37
|
+
|
|
38
|
+
- name: Install docs dependencies
|
|
39
|
+
run: uv sync --group docs
|
|
40
|
+
|
|
41
|
+
- name: Build site (strict)
|
|
42
|
+
run: uv run mkdocs build --strict
|
|
43
|
+
|
|
44
|
+
- name: Upload site as artifact (downloadable preview)
|
|
45
|
+
uses: actions/upload-artifact@v7
|
|
46
|
+
with:
|
|
47
|
+
name: site-preview
|
|
48
|
+
path: site
|
|
49
|
+
retention-days: 14
|
|
50
|
+
|
|
51
|
+
- name: Upload Pages artifact
|
|
52
|
+
if: github.ref == 'refs/heads/main'
|
|
53
|
+
uses: actions/upload-pages-artifact@v3
|
|
54
|
+
with:
|
|
55
|
+
path: site
|
|
56
|
+
|
|
57
|
+
deploy:
|
|
58
|
+
# Only publish from main; PRs just run the strict build above.
|
|
59
|
+
if: github.ref == 'refs/heads/main'
|
|
60
|
+
needs: build
|
|
61
|
+
runs-on: ubuntu-latest
|
|
62
|
+
environment:
|
|
63
|
+
name: github-pages
|
|
64
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
65
|
+
steps:
|
|
66
|
+
- name: Deploy to GitHub Pages
|
|
67
|
+
id: deployment
|
|
68
|
+
uses: actions/deploy-pages@v4
|
|
@@ -147,6 +147,8 @@ venv.bak/
|
|
|
147
147
|
|
|
148
148
|
# mkdocs documentation
|
|
149
149
|
/site
|
|
150
|
+
# Locally-generated TUI screenshots (regenerated at build time by gen-files)
|
|
151
|
+
docs/assets/tui/
|
|
150
152
|
|
|
151
153
|
# mypy
|
|
152
154
|
.mypy_cache/
|
|
@@ -187,11 +189,10 @@ test/test_data/*.html
|
|
|
187
189
|
.local.code-workspace
|
|
188
190
|
local.ps1
|
|
189
191
|
|
|
190
|
-
# Generated documentation examples (uploaded to GitHub releases instead)
|
|
191
|
-
docs/claude-code-log-transcript.html
|
|
192
|
-
docs/cache/
|
|
193
192
|
|
|
194
193
|
# Integration test data - exclude generated cache/HTML, keep JSONL files
|
|
195
194
|
test/test_data/real_projects/*/cache/
|
|
196
195
|
test/test_data/real_projects/*/*.html
|
|
197
196
|
test/test_data/real_projects/index.html
|
|
197
|
+
# SQLite cache the CLI drops into a projects dir when run against test data
|
|
198
|
+
claude-code-log-cache.db
|
|
@@ -6,6 +6,87 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
## [1.4.0] - 2026-06-03
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- **Fix sed**
|
|
14
|
+
- **Add MkDocs documentation site with live TUI reference (#197)**
|
|
15
|
+
- **Relax Textual constraint from `==` to `>=` (#196)**
|
|
16
|
+
- **Add `--version` flag to the CLI (#195)**
|
|
17
|
+
- **Fix AskUserQuestion result rendering + highlight chosen options (#180) (#189)**
|
|
18
|
+
- **Derive render_session_id from the SessionTree, not a loop variable (#190)**
|
|
19
|
+
- **Fix collapsible body overlapping preceding content in tool cards (#153) (#187)**
|
|
20
|
+
- **Extract compute_session_data + compute_project_aggregates (C9b) (#188)**
|
|
21
|
+
- **Add C9a characterization tests for session-scan call sites (#186)**
|
|
22
|
+
- **Route converter summary + ai-title extraction through shared helpers (#185)**
|
|
23
|
+
- **status: Wave B fully merged; Wave C kickoff (C8/C9a/C9b stacked, C10 dropped, decisions locked)**
|
|
24
|
+
- **Compute branch preview once from the DAG-line (#184)**
|
|
25
|
+
- **status: #184 fully validated (CI 11/11, CodeRabbit clean) — ready to merge**
|
|
26
|
+
- **docs: keep simplification status note self-contained to project scope**
|
|
27
|
+
- **status: correct #184 state; move GitHub CI/CodeRabbit ops to github guideline**
|
|
28
|
+
- **status: reverse-order stacked-PR lift recipe CONFIRMED on #184**
|
|
29
|
+
- **Factor session-header construction out of _render_messages (#183)**
|
|
30
|
+
- **status: #183/#184 rebased + CodeRabbit forced (#183 clean, #184 2 doc fixes); record @coderabbitai + reverse-order workarounds**
|
|
31
|
+
- **Dedup requestId tokens in pagination cache-miss fallback (#182)**
|
|
32
|
+
- **status: Wave B track complete — opp 7 PR #184 up, all monk-approved; add merge sequence**
|
|
33
|
+
- **status: note stacked-PR CI/CodeRabbit defers to merge-time**
|
|
34
|
+
- **status: opp 1 green (#182, awaiting merge); opp 6 #183 in review; opp 7 in progress**
|
|
35
|
+
- **status: opp 1 -> PR #182 (in review); opp 6 in progress**
|
|
36
|
+
- **Add live-status section to simplification plan**
|
|
37
|
+
- **Add converter/renderer simplification plan**
|
|
38
|
+
- **Move detail-visibility predicate onto MessageContent (#181)**
|
|
39
|
+
- **Sync rendering-architecture.md §5 with the current pipeline (#178)**
|
|
40
|
+
- **Extract inline junction-forward-link block into a named pass (#177)**
|
|
41
|
+
- **Co-locate the away-summary detail rule on AwaySummaryMessage (#176)**
|
|
42
|
+
- **Remove vestigial progress-chain parent repair (#175)**
|
|
43
|
+
- **plugins: dev-docs gaps + public helper API + ToolResult example (Phase 2) (#173)**
|
|
44
|
+
- **Implement unified plugin system from RFC #166 (#169)**
|
|
45
|
+
- **Render Read tool results with pygments via structured payload (closes #170) (#172)**
|
|
46
|
+
- **work/: triage against shipped main (#171)**
|
|
47
|
+
- **Always regenerate projects index so variant-flag toggles refresh links (#168)**
|
|
48
|
+
- **RFC: plugin system (unified message-transformer mechanism) (#166)**
|
|
49
|
+
- **Per-message timestamps in Markdown output (#160) (#165)**
|
|
50
|
+
- **Support non-GitHub forges via static map + `--git-link` fallback (#156) (#164)**
|
|
51
|
+
- **Obsidian-friendly output: --output dir + --expand-paths + --filter-path (#151) (#155)**
|
|
52
|
+
- **Linkify commit SHAs in rendered Markdown + HTML — closes #156 (#161)**
|
|
53
|
+
- **CSS clean-ups (issue #153) (#163)**
|
|
54
|
+
- **Cross-link TaskOutput / TaskUpdate headers back to their spawn (#154) (#158)**
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
## [1.3.0] - 2026-05-14
|
|
58
|
+
|
|
59
|
+
### Changed
|
|
60
|
+
|
|
61
|
+
- **Render ScheduleWakeup and Cron* tools (#148) (#152)**
|
|
62
|
+
- **Render hook attachment entries at FULL detail (#128) (#149)**
|
|
63
|
+
- **Style sidechain filter toggle with dashed border**
|
|
64
|
+
- **scrub_surrogates: handle high surrogate range (CR follow-up) (#150)**
|
|
65
|
+
- **Render the built-in Monitor tool with Task-end backlink (#142) (#147)**
|
|
66
|
+
- **Add support for ai-title and prefer it over legacy summary (#136)**
|
|
67
|
+
- **fix: add errors='replace' to read_text/write_text for Unicode safety (#139) (#146)**
|
|
68
|
+
- **Fix UnicodeEncodeError on JSONL with lone surrogates (#139) (#144)**
|
|
69
|
+
- **Use `--dist=worksteal` to speed up tests + move `-n auto` to config to make it default (#145)**
|
|
70
|
+
- **Fix/prevent dag cycle (#138)**
|
|
71
|
+
- **Render away_summary recap entries (#111) (#141)**
|
|
72
|
+
- **System info cosmetic improvements + chain-pairing fix (#137) (#140)**
|
|
73
|
+
- **dev-docs: introduce application_model.md as entry point, normalize naming, clean work/ (#134)**
|
|
74
|
+
- **export conversations to json (#36)**
|
|
75
|
+
- **Suppress noise in system-info messages (#129) (#133)**
|
|
76
|
+
- **Fix DAG cyclic-children hang and add SIGUSR1 stack dump (#135)**
|
|
77
|
+
- **Support async agents (#90) (#132)**
|
|
78
|
+
- **Robust within-session fork rendering: collapse parallel-tool_use forks, consistent labels (#131)**
|
|
79
|
+
- **Render user content as Markdown with raw fallback toggle (#119)**
|
|
80
|
+
- **Add --detail user-only level (#118)**
|
|
81
|
+
- **Pair Slash Command with User (slash command) (#126) (#127)**
|
|
82
|
+
- **Fold Skill name into tool_use title and drop the params row**
|
|
83
|
+
- **Fold Skill body into its tool_use block (#121)**
|
|
84
|
+
- **docs: add Community Extensions section (#120)**
|
|
85
|
+
- **Support teammates (#91): stitching + session headers + index (PR 3 of 3) (#125)**
|
|
86
|
+
- **Support teammates (#91): rendering (PR 2 of 3) (#122)**
|
|
87
|
+
- **Support teammates (#91): parsing + data model (draft) (#117)**
|
|
88
|
+
|
|
89
|
+
|
|
9
90
|
## [1.2.0] - 2026-04-19
|
|
10
91
|
|
|
11
92
|
### Changed
|
|
@@ -51,26 +51,26 @@ See @CONTRIBUTING.md for detailed development setup, testing, architecture, and
|
|
|
51
51
|
|
|
52
52
|
### Claude-Specific Testing Tips
|
|
53
53
|
|
|
54
|
-
**
|
|
54
|
+
**Config in `pyproject.toml` sets `-n auto --dist=worksteal` so you might need to unset for pdb, etc**
|
|
55
55
|
|
|
56
56
|
```bash
|
|
57
57
|
# Unit tests (fast, recommended for development)
|
|
58
58
|
just test
|
|
59
|
-
# or: uv run pytest -
|
|
59
|
+
# or: uv run pytest -m "not (tui or browser)" -v
|
|
60
60
|
|
|
61
61
|
# TUI tests
|
|
62
62
|
just test-tui
|
|
63
|
-
# or: uv run pytest -
|
|
63
|
+
# or: uv run pytest -m tui
|
|
64
64
|
|
|
65
65
|
# Browser tests
|
|
66
66
|
just test-browser
|
|
67
|
-
# or: uv run pytest -
|
|
67
|
+
# or: uv run pytest -m browser
|
|
68
68
|
|
|
69
69
|
# All tests
|
|
70
70
|
just test-all
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
**Tip:** Add `-x` to stop on first failure (e.g., `uv run pytest -
|
|
73
|
+
**Tip:** Add `-x` to stop on first failure (e.g., `uv run pytest -m "not (tui or browser)" -v -x`).
|
|
74
74
|
|
|
75
75
|
### Code Quality
|
|
76
76
|
|
|
@@ -95,7 +95,37 @@ The interactive timeline is implemented in JavaScript within `claude_code_log/te
|
|
|
95
95
|
|
|
96
96
|
## Architecture
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
Start with [dev-docs/application_model.md](dev-docs/application_model.md)
|
|
99
|
+
— the entry point covering subsystems, data lifecycle, and a glossary,
|
|
100
|
+
with pointers to the deep-dive docs:
|
|
101
|
+
|
|
99
102
|
- [dev-docs/rendering-architecture.md](dev-docs/rendering-architecture.md) - Data flow and rendering pipeline
|
|
100
103
|
- [dev-docs/messages.md](dev-docs/messages.md) - Message type reference
|
|
101
104
|
- [dev-docs/css-classes.md](dev-docs/css-classes.md) - CSS class combinations
|
|
105
|
+
- [dev-docs/dag.md](dev-docs/dag.md) - DAG-based session/fork architecture
|
|
106
|
+
- [dev-docs/agents.md](dev-docs/agents.md) - Sync/async/teammate agent integration
|
|
107
|
+
- [dev-docs/teammates.md](dev-docs/teammates.md) - Teammates feature deep-dive
|
|
108
|
+
- [dev-docs/message-hierarchy.md](dev-docs/message-hierarchy.md) - Fold/unfold state machine
|
|
109
|
+
- [dev-docs/implementing-a-tool-renderer.md](dev-docs/implementing-a-tool-renderer.md) - How-to: add a new tool
|
|
110
|
+
- [dev-docs/plugins.md](dev-docs/plugins.md) - Plugin system reference + author guide
|
|
111
|
+
|
|
112
|
+
User-facing docs live in [docs/](docs/); plans and TODOs live in [work/](work/).
|
|
113
|
+
|
|
114
|
+
A documentation site (MkDocs + Material) is published to GitHub Pages from
|
|
115
|
+
`docs/` + `mkdocs.yml`. The CLI reference is rendered live from Click, and the
|
|
116
|
+
TUI reference (keybindings + screenshots) is auto-generated at build time. See
|
|
117
|
+
the "Documentation Site" section of @CONTRIBUTING.md. Preview with
|
|
118
|
+
`just docs-serve`; strict build with `just docs-build`.
|
|
119
|
+
|
|
120
|
+
### Keeping dev-docs/ in sync
|
|
121
|
+
|
|
122
|
+
`dev-docs/` is **as-built reference** — the code is the authoritative
|
|
123
|
+
source. When a non-trivial change alters behavior, structure, or
|
|
124
|
+
invariants documented in a deep-dive, update the relevant page in
|
|
125
|
+
the same commit (or as a prompt follow-up). If `dev-docs/` and the
|
|
126
|
+
code disagree, the doc is wrong.
|
|
127
|
+
|
|
128
|
+
Typical lifecycle: a feature begins as a spec in `work/`, evolves
|
|
129
|
+
into a WIP scratchpad as the code adapts to reality, then graduates
|
|
130
|
+
into `dev-docs/` (new page or merged into an existing one) once the
|
|
131
|
+
implementation has stabilized.
|
|
@@ -50,7 +50,9 @@ claude_code_log/
|
|
|
50
50
|
|
|
51
51
|
scripts/ # Development utilities
|
|
52
52
|
test/test_data/ # Representative JSONL samples
|
|
53
|
-
dev-docs/ # Architecture documentation
|
|
53
|
+
dev-docs/ # Architecture / dev documentation (start in application_model.md)
|
|
54
|
+
docs/ # User-facing operations docs
|
|
55
|
+
work/ # Plans, TODOs, in-flight design docs
|
|
54
56
|
```
|
|
55
57
|
|
|
56
58
|
## Development Setup
|
|
@@ -94,7 +96,7 @@ The project uses a categorized test system to avoid async event loop conflicts.
|
|
|
94
96
|
```bash
|
|
95
97
|
# Unit tests only (fast, recommended for development)
|
|
96
98
|
just test
|
|
97
|
-
# or: uv run pytest -
|
|
99
|
+
# or: uv run pytest -m "not (tui or browser)" -v
|
|
98
100
|
|
|
99
101
|
# TUI tests (isolated event loop)
|
|
100
102
|
just test-tui
|
|
@@ -114,16 +116,23 @@ just test-cov
|
|
|
114
116
|
Snapshot tests detect unintended HTML output changes using [syrupy](https://github.com/syrupy-project/syrupy):
|
|
115
117
|
|
|
116
118
|
```bash
|
|
117
|
-
# Run snapshot tests
|
|
118
|
-
uv run pytest
|
|
119
|
+
# Run snapshot tests (parallel mode is fine for read-only runs)
|
|
120
|
+
uv run pytest test/test_snapshot_html.py -v
|
|
119
121
|
|
|
120
122
|
# Update snapshots after intentional HTML changes
|
|
121
|
-
|
|
123
|
+
# IMPORTANT: run --snapshot-update with -n0 (see warning below)
|
|
124
|
+
uv run pytest test/test_snapshot_html.py -n0 --snapshot-update
|
|
122
125
|
```
|
|
123
126
|
|
|
127
|
+
> **Warning — don't let `--snapshot-update` run with `-n auto`.** Syrupy
|
|
128
|
+
> and pytest-xdist race when writing snapshot files in parallel: the
|
|
129
|
+
> `.ambr` file ends up truncated (observed: ~6000 lines silently
|
|
130
|
+
> deleted on a single run, leaving the file structurally broken but
|
|
131
|
+
> still passing on next read). Run `--snapshot-update` serially.
|
|
132
|
+
|
|
124
133
|
When snapshot tests fail:
|
|
125
134
|
1. Review the diff to verify changes are intentional
|
|
126
|
-
2. If intentional, run `--snapshot-update` to accept new output
|
|
135
|
+
2. If intentional, run `--snapshot-update` (serially) to accept new output
|
|
127
136
|
3. If unintentional, fix your code and re-run tests
|
|
128
137
|
|
|
129
138
|
### Test Prerequisites
|
|
@@ -151,7 +160,7 @@ Running all tests together can cause "RuntimeError: This event loop is already r
|
|
|
151
160
|
just test-cov
|
|
152
161
|
|
|
153
162
|
# Or manually:
|
|
154
|
-
uv run pytest
|
|
163
|
+
uv run pytest --cov=claude_code_log --cov-report=html --cov-report=term
|
|
155
164
|
```
|
|
156
165
|
|
|
157
166
|
HTML coverage reports are generated in `htmlcov/index.html`.
|
|
@@ -186,9 +195,64 @@ CLAUDE_CODE_LOG_DEBUG_TIMING=1 claude-code-log path/to/file.jsonl
|
|
|
186
195
|
|
|
187
196
|
This outputs detailed timing for each rendering phase. The timing module is in `claude_code_log/renderer_timings.py`.
|
|
188
197
|
|
|
198
|
+
## Diagnosing Hangs
|
|
199
|
+
|
|
200
|
+
If `claude-code-log` appears stuck (100% CPU, no output), send `SIGUSR1` to print the live Python stack to stderr without killing the process:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# In another terminal
|
|
204
|
+
kill -USR1 $(pgrep -f claude-code-log | head -1)
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The handler is installed in `cli.py` via `faulthandler.register(SIGUSR1)`. POSIX-only; no-op on Windows. Unlike `py-spy`, it needs no root and no extra install.
|
|
208
|
+
|
|
209
|
+
## Documentation Site
|
|
210
|
+
|
|
211
|
+
The project publishes a documentation site to GitHub Pages, built with
|
|
212
|
+
[MkDocs](https://www.mkdocs.org/) and the
|
|
213
|
+
[Material](https://squidfunk.github.io/mkdocs-material/) theme. The site
|
|
214
|
+
configuration is `mkdocs.yml`; pages live under `docs/`.
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
# Install docs dependencies
|
|
218
|
+
uv sync --group docs
|
|
219
|
+
|
|
220
|
+
# Live-reload preview at http://127.0.0.1:8000
|
|
221
|
+
just docs-serve
|
|
222
|
+
|
|
223
|
+
# Strict build (fails on broken links/nav — same as CI)
|
|
224
|
+
just docs-build
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Key points:
|
|
228
|
+
|
|
229
|
+
- **CLI reference** (`docs/reference/cli.md`) is rendered live from the Click
|
|
230
|
+
command via the `mkdocs-click` plugin — no manual upkeep.
|
|
231
|
+
- **TUI reference** (`reference/tui.md`) is generated at build time by
|
|
232
|
+
`docs/gen_pages.py` (a `mkdocs-gen-files` script): it introspects the Textual
|
|
233
|
+
`BINDINGS` for the keybindings tables (`scripts/generate_tui_docs.py`) and
|
|
234
|
+
captures SVG screenshots of the running TUI
|
|
235
|
+
(`scripts/generate_tui_screenshots.py`). Both scripts are runnable standalone.
|
|
236
|
+
- **Example output** (`example.md` + `examples/transcript.html`) is rendered at
|
|
237
|
+
build time from a bundled sample project
|
|
238
|
+
(`scripts/generate_example_output.py`, also `just example`) — no private data
|
|
239
|
+
or release asset involved. Generation is fault-tolerant so a render hiccup
|
|
240
|
+
can't block the build.
|
|
241
|
+
- **Development** section surfaces `dev-docs/` (symlinked as `docs/development`).
|
|
242
|
+
`CONTRIBUTING.md` and `CHANGELOG.md` are symlinked in as `docs/contributing.md`
|
|
243
|
+
and `docs/changelog.md`. A build hook (`docs/hooks.py`) rewrites links to repo
|
|
244
|
+
source files (e.g. `../claude_code_log/cli.py`) into GitHub URLs so the strict
|
|
245
|
+
build stays green.
|
|
246
|
+
- Deployment is automated by `.github/workflows/docs.yml`: PRs run a strict
|
|
247
|
+
build; pushes to `main` deploy to Pages. The repo's **Settings → Pages →
|
|
248
|
+
Source** must be set to **GitHub Actions** (one-time).
|
|
249
|
+
|
|
189
250
|
## Architecture
|
|
190
251
|
|
|
191
|
-
|
|
252
|
+
Start with [dev-docs/application_model.md](dev-docs/application_model.md)
|
|
253
|
+
for the system overview (subsystems, data lifecycle, glossary). For
|
|
254
|
+
the rendering pipeline specifically, see
|
|
255
|
+
[dev-docs/rendering-architecture.md](dev-docs/rendering-architecture.md).
|
|
192
256
|
|
|
193
257
|
### Data Flow Overview
|
|
194
258
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-code-log
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.0
|
|
4
4
|
Summary: Convert Claude Code transcript JSONL files to HTML
|
|
5
5
|
Project-URL: Homepage, https://github.com/daaain/claude-code-log
|
|
6
6
|
Project-URL: Issues, https://github.com/daaain/claude-code-log/issues
|
|
@@ -18,7 +18,7 @@ Requires-Dist: mistune>=3.1.4
|
|
|
18
18
|
Requires-Dist: packaging>=25.0
|
|
19
19
|
Requires-Dist: pydantic>=2.12.0
|
|
20
20
|
Requires-Dist: pygments>=2.19.2
|
|
21
|
-
Requires-Dist: textual
|
|
21
|
+
Requires-Dist: textual>=6.5.0
|
|
22
22
|
Requires-Dist: toml>=0.10.2
|
|
23
23
|
Description-Content-Type: text/markdown
|
|
24
24
|
|
|
@@ -40,7 +40,7 @@ TUI demo:
|
|
|
40
40
|
|
|
41
41
|
This tool generates clean, minimalist HTML pages showing user prompts and assistant responses chronologically. It's designed to create a readable log of your Claude Code interactions with support for both individual files and entire project hierarchies.
|
|
42
42
|
|
|
43
|
-
📄 **[View Example HTML Output](https://github.
|
|
43
|
+
📄 **[View Example HTML Output](https://daaain.github.io/claude-code-log/example/)** - A real example generated from a sample of this project's development, regenerated on every docs build
|
|
44
44
|
|
|
45
45
|
## Quickstart
|
|
46
46
|
|
|
@@ -66,7 +66,7 @@ uvx claude-code-log@latest --open-browser
|
|
|
66
66
|
- **Rich Message Types**: Support for user/assistant messages, tool use/results, thinking content, images
|
|
67
67
|
- **System Command Visibility**: Show system commands (like `init`) in expandable details with structured parsing
|
|
68
68
|
- **Markdown Rendering**: Server-side markdown rendering with syntax highlighting using mistune
|
|
69
|
-
- **Detail Levels & Compact Mode**: `--detail full|high|low|minimal` 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
|
|
69
|
+
- **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
|
|
70
70
|
- **Floating Navigation**: Always-available back-to-top button and filter controls
|
|
71
71
|
- **CLI Interface**: Simple command-line tool using Click
|
|
72
72
|
|
|
@@ -180,6 +180,7 @@ claude-code-log /path/to/project --detail low --format md --compact
|
|
|
180
180
|
|
|
181
181
|
`--detail` levels (smallest → largest output):
|
|
182
182
|
|
|
183
|
+
- `user-only` — just user prompts and steering (useful as input to a downstream agent, e.g. building a requirements doc)
|
|
183
184
|
- `minimal` — user + assistant text only
|
|
184
185
|
- `low` — interaction-focused; keeps WebSearch, WebFetch, and Task (agent delegations) as key signals
|
|
185
186
|
- `high` — detailed but cleaned; drops system/hook noise
|
|
@@ -187,6 +188,21 @@ claude-code-log /path/to/project --detail low --format md --compact
|
|
|
187
188
|
|
|
188
189
|
`--compact` merges consecutive same-type sections in Markdown so runs of assistant responses share one heading instead of repeating `### 🤖 Assistant:` for each.
|
|
189
190
|
|
|
191
|
+
### Linking Commit SHAs
|
|
192
|
+
|
|
193
|
+
Plain `7c2e6f6`-shaped tokens in transcript prose get turned into clickable commit links when the SHA is reachable from a local remote-tracking branch. **github.com**, **gitlab.com**, and **bitbucket.org** work out of the box. For self-hosted forges (in-house GitLab, Gitea, Forgejo, …), supply a URL template via `--git-link`:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
# Self-hosted GitLab
|
|
197
|
+
claude-code-log /path/to/transcript --git-link 'https://{host}/{path}/-/commit/{sha}'
|
|
198
|
+
|
|
199
|
+
# Same thing via env var (useful for TUI / repeated invocations)
|
|
200
|
+
export CLAUDE_CODE_LOG_GIT_LINK='https://{host}/{path}/-/commit/{sha}'
|
|
201
|
+
claude-code-log --tui
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Placeholders: `{host}`, `{path}`, `{sha}`. The template fires only when the static map doesn't already know the host, so a mix of GitHub repos + self-hosted GitLab gets correct links from both. SHAs not reachable from any local remote-tracking ref render as plain text — local-only work-in-progress commits never produce broken links.
|
|
205
|
+
|
|
190
206
|
## Project Hierarchy Output
|
|
191
207
|
|
|
192
208
|
When processing all projects, the tool generates:
|
|
@@ -280,6 +296,17 @@ uv run claude-code-log
|
|
|
280
296
|
|
|
281
297
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, testing, and architecture documentation.
|
|
282
298
|
|
|
299
|
+
## Community Extensions
|
|
300
|
+
|
|
301
|
+
Projects built on top of `claude-code-log`:
|
|
302
|
+
|
|
303
|
+
- **[archive-session](https://github.com/lifeinchords/claude-code-skills#archive-session-skill--slash-command--optional-hook)** by [@lifeinchords](https://github.com/lifeinchords). Wraps the CLI as three integration surfaces:
|
|
304
|
+
- a Claude Code [Skill](https://github.com/lifeinchords/claude-code-skills/blob/main/.claude/skills/archive-session/SKILL.md)
|
|
305
|
+
- a Claude Code slash [Command](https://github.com/lifeinchords/claude-code-skills/blob/main/.claude/commands/archive-session.md) `/archive-session` for explicit in-chat invocation
|
|
306
|
+
- a Claude Code PreCompact [Hook](https://github.com/lifeinchords/claude-code-skills/blob/main/.claude/hooks/pre-compact-archive.sh) that auto-archives transcripts and subagent logs right before context compaction
|
|
307
|
+
|
|
308
|
+
Cross-platform (macOS and Windows/MSYS).
|
|
309
|
+
|
|
283
310
|
## TODO
|
|
284
311
|
|
|
285
312
|
- tutorial overlay
|
|
@@ -16,7 +16,7 @@ TUI demo:
|
|
|
16
16
|
|
|
17
17
|
This tool generates clean, minimalist HTML pages showing user prompts and assistant responses chronologically. It's designed to create a readable log of your Claude Code interactions with support for both individual files and entire project hierarchies.
|
|
18
18
|
|
|
19
|
-
📄 **[View Example HTML Output](https://github.
|
|
19
|
+
📄 **[View Example HTML Output](https://daaain.github.io/claude-code-log/example/)** - A real example generated from a sample of this project's development, regenerated on every docs build
|
|
20
20
|
|
|
21
21
|
## Quickstart
|
|
22
22
|
|
|
@@ -42,7 +42,7 @@ uvx claude-code-log@latest --open-browser
|
|
|
42
42
|
- **Rich Message Types**: Support for user/assistant messages, tool use/results, thinking content, images
|
|
43
43
|
- **System Command Visibility**: Show system commands (like `init`) in expandable details with structured parsing
|
|
44
44
|
- **Markdown Rendering**: Server-side markdown rendering with syntax highlighting using mistune
|
|
45
|
-
- **Detail Levels & Compact Mode**: `--detail full|high|low|minimal` 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
|
|
45
|
+
- **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
|
|
46
46
|
- **Floating Navigation**: Always-available back-to-top button and filter controls
|
|
47
47
|
- **CLI Interface**: Simple command-line tool using Click
|
|
48
48
|
|
|
@@ -156,6 +156,7 @@ claude-code-log /path/to/project --detail low --format md --compact
|
|
|
156
156
|
|
|
157
157
|
`--detail` levels (smallest → largest output):
|
|
158
158
|
|
|
159
|
+
- `user-only` — just user prompts and steering (useful as input to a downstream agent, e.g. building a requirements doc)
|
|
159
160
|
- `minimal` — user + assistant text only
|
|
160
161
|
- `low` — interaction-focused; keeps WebSearch, WebFetch, and Task (agent delegations) as key signals
|
|
161
162
|
- `high` — detailed but cleaned; drops system/hook noise
|
|
@@ -163,6 +164,21 @@ claude-code-log /path/to/project --detail low --format md --compact
|
|
|
163
164
|
|
|
164
165
|
`--compact` merges consecutive same-type sections in Markdown so runs of assistant responses share one heading instead of repeating `### 🤖 Assistant:` for each.
|
|
165
166
|
|
|
167
|
+
### Linking Commit SHAs
|
|
168
|
+
|
|
169
|
+
Plain `7c2e6f6`-shaped tokens in transcript prose get turned into clickable commit links when the SHA is reachable from a local remote-tracking branch. **github.com**, **gitlab.com**, and **bitbucket.org** work out of the box. For self-hosted forges (in-house GitLab, Gitea, Forgejo, …), supply a URL template via `--git-link`:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
# Self-hosted GitLab
|
|
173
|
+
claude-code-log /path/to/transcript --git-link 'https://{host}/{path}/-/commit/{sha}'
|
|
174
|
+
|
|
175
|
+
# Same thing via env var (useful for TUI / repeated invocations)
|
|
176
|
+
export CLAUDE_CODE_LOG_GIT_LINK='https://{host}/{path}/-/commit/{sha}'
|
|
177
|
+
claude-code-log --tui
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Placeholders: `{host}`, `{path}`, `{sha}`. The template fires only when the static map doesn't already know the host, so a mix of GitHub repos + self-hosted GitLab gets correct links from both. SHAs not reachable from any local remote-tracking ref render as plain text — local-only work-in-progress commits never produce broken links.
|
|
181
|
+
|
|
166
182
|
## Project Hierarchy Output
|
|
167
183
|
|
|
168
184
|
When processing all projects, the tool generates:
|
|
@@ -256,6 +272,17 @@ uv run claude-code-log
|
|
|
256
272
|
|
|
257
273
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, testing, and architecture documentation.
|
|
258
274
|
|
|
275
|
+
## Community Extensions
|
|
276
|
+
|
|
277
|
+
Projects built on top of `claude-code-log`:
|
|
278
|
+
|
|
279
|
+
- **[archive-session](https://github.com/lifeinchords/claude-code-skills#archive-session-skill--slash-command--optional-hook)** by [@lifeinchords](https://github.com/lifeinchords). Wraps the CLI as three integration surfaces:
|
|
280
|
+
- a Claude Code [Skill](https://github.com/lifeinchords/claude-code-skills/blob/main/.claude/skills/archive-session/SKILL.md)
|
|
281
|
+
- a Claude Code slash [Command](https://github.com/lifeinchords/claude-code-skills/blob/main/.claude/commands/archive-session.md) `/archive-session` for explicit in-chat invocation
|
|
282
|
+
- a Claude Code PreCompact [Hook](https://github.com/lifeinchords/claude-code-skills/blob/main/.claude/hooks/pre-compact-archive.sh) that auto-archives transcripts and subagent logs right before context compaction
|
|
283
|
+
|
|
284
|
+
Cross-platform (macOS and Windows/MSYS).
|
|
285
|
+
|
|
259
286
|
## TODO
|
|
260
287
|
|
|
261
288
|
- tutorial overlay
|