claude-code-log 1.3.0__tar.gz → 1.5.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.
Files changed (243) hide show
  1. claude_code_log-1.5.0/.devbox-foldyard/.gitignore +1 -0
  2. claude_code_log-1.5.0/.devbox-foldyard/foldyard-0.0.1-py3-none-any.whl +0 -0
  3. claude_code_log-1.5.0/.github/workflows/ci.yml +117 -0
  4. claude_code_log-1.5.0/.github/workflows/docs.yml +68 -0
  5. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/.gitignore +4 -3
  6. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/CHANGELOG.md +108 -0
  7. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/CLAUDE.md +7 -0
  8. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/CONTRIBUTING.md +41 -0
  9. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/PKG-INFO +18 -3
  10. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/README.md +16 -1
  11. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/cache.py +273 -37
  12. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/cli.py +485 -13
  13. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/converter.py +1115 -712
  14. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/dag.py +114 -15
  15. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/factories/meta_factory.py +8 -1
  16. claude_code_log-1.5.0/claude_code_log/factories/priorities.py +46 -0
  17. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/factories/system_factory.py +3 -0
  18. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/factories/tool_factory.py +378 -46
  19. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/factories/user_factory.py +25 -0
  20. claude_code_log-1.5.0/claude_code_log/git_remote.py +343 -0
  21. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/__init__.py +4 -0
  22. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/async_formatter.py +2 -2
  23. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/renderer.py +633 -54
  24. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/system_formatters.py +16 -13
  25. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/edit_diff_styles.css +1 -1
  26. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/global_styles.css +16 -2
  27. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/message_styles.css +606 -13
  28. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/project_card_styles.css +32 -0
  29. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/session_nav.html +14 -1
  30. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/session_nav_styles.css +8 -3
  31. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/teammate_styles.css +6 -7
  32. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/timeline.html +28 -6
  33. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/todo_styles.css +19 -0
  34. claude_code_log-1.5.0/claude_code_log/html/templates/index.html +157 -0
  35. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/transcript.html +310 -297
  36. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/tool_formatters.py +812 -89
  37. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/user_formatters.py +154 -1
  38. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/utils.py +315 -25
  39. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/json/renderer.py +16 -4
  40. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/markdown/renderer.py +698 -40
  41. claude_code_log-1.5.0/claude_code_log/markdown_plugins.py +440 -0
  42. claude_code_log-1.5.0/claude_code_log/migrations/007_subagents_fingerprint.sql +16 -0
  43. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/models.py +382 -4
  44. claude_code_log-1.5.0/claude_code_log/plugins.py +409 -0
  45. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/renderer.py +1777 -607
  46. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/utils.py +361 -3
  47. claude_code_log-1.5.0/claude_code_log/workflow.py +661 -0
  48. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/agents.md +182 -4
  49. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/application_model.md +77 -23
  50. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/css-classes.md +4 -1
  51. claude_code_log-1.5.0/dev-docs/dag.md +721 -0
  52. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/implementing-a-tool-renderer.md +61 -0
  53. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/message-hierarchy.md +40 -36
  54. claude_code_log-1.5.0/dev-docs/messages/tools/Artifact-tool_result.json +24 -0
  55. claude_code_log-1.5.0/dev-docs/messages/tools/Artifact-tool_result.jsonl +1 -0
  56. claude_code_log-1.5.0/dev-docs/messages/tools/Artifact-tool_use.json +27 -0
  57. claude_code_log-1.5.0/dev-docs/messages/tools/Artifact-tool_use.jsonl +1 -0
  58. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages.md +40 -1
  59. claude_code_log-1.5.0/dev-docs/plugins.md +818 -0
  60. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/rendering-architecture.md +59 -10
  61. claude_code_log-1.5.0/dev-docs/workflows.md +341 -0
  62. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/justfile +28 -14
  63. claude_code_log-1.5.0/mise.toml +8 -0
  64. claude_code_log-1.5.0/mkdocs.yml +94 -0
  65. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/pyproject.toml +34 -3
  66. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/uv.lock +352 -24
  67. claude_code_log-1.5.0/work/agent-hierarchies-design.md +229 -0
  68. claude_code_log-1.5.0/work/obsidian-friendly-output.md +81 -0
  69. claude_code_log-1.5.0/work/parse-memory-spike.md +140 -0
  70. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/work/rendering-next.md +1 -34
  71. claude_code_log-1.5.0/work/tool-renderer-plugins.md +29 -0
  72. claude_code_log-1.5.0/work/tui-output-fixes.md +75 -0
  73. claude_code_log-1.5.0/work/win-io.md +79 -0
  74. claude_code_log-1.5.0/work/xdist-import-cost.md +133 -0
  75. claude_code_log-1.3.0/.github/workflows/ci.yml +0 -81
  76. claude_code_log-1.3.0/claude_code_log/html/templates/index.html +0 -118
  77. claude_code_log-1.3.0/dev-docs/dag.md +0 -702
  78. claude_code_log-1.3.0/mise.toml +0 -2
  79. claude_code_log-1.3.0/work/async-agents.md +0 -215
  80. claude_code_log-1.3.0/work/refactor-reindex-with-ghosting.md +0 -164
  81. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/.claude/settings.json +0 -0
  82. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/.claude/skills/tool-renderer/SKILL.md +0 -0
  83. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/.vscode/settings.json +0 -0
  84. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/LICENSE +0 -0
  85. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/__init__.py +0 -0
  86. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/factories/__init__.py +0 -0
  87. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/factories/agent_metadata_factory.py +0 -0
  88. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/factories/assistant_factory.py +0 -0
  89. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/factories/attachment_factory.py +0 -0
  90. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/factories/task_notification_factory.py +0 -0
  91. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/factories/teammate_factory.py +0 -0
  92. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/factories/transcript_factory.py +0 -0
  93. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/ansi_colors.py +0 -0
  94. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/assistant_formatters.py +0 -0
  95. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/renderer_code.py +0 -0
  96. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/teammate_formatter.py +0 -0
  97. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/filter_styles.css +0 -0
  98. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/page_nav_styles.css +0 -0
  99. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/pygments_styles.css +0 -0
  100. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/search.html +0 -0
  101. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/search_inline.html +0 -0
  102. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/search_inline_script.html +0 -0
  103. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/search_results_panel.html +0 -0
  104. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/search_styles.css +0 -0
  105. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/timeline_styles.css +0 -0
  106. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/html/templates/components/timezone_converter.js +0 -0
  107. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/image_export.py +0 -0
  108. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/json/__init__.py +0 -0
  109. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/markdown/__init__.py +0 -0
  110. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/migrations/001_initial_schema.sql +0 -0
  111. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/migrations/002_html_cache.sql +0 -0
  112. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/migrations/003_html_pagination.sql +0 -0
  113. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/migrations/004_html_pagination_variant.sql +0 -0
  114. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/migrations/005_session_team_name.sql +0 -0
  115. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/migrations/006_session_ai_title.sql +0 -0
  116. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/migrations/__init__.py +0 -0
  117. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/migrations/runner.py +0 -0
  118. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/parser.py +0 -0
  119. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/py.typed +0 -0
  120. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/renderer_timings.py +0 -0
  121. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/claude_code_log/tui.py +0 -0
  122. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/assistant/assistant.json +0 -0
  123. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/assistant/assistant.jsonl +0 -0
  124. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/assistant/assistant_sidechain.json +0 -0
  125. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/assistant/assistant_sidechain.jsonl +0 -0
  126. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/assistant/thinking.json +0 -0
  127. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/assistant/thinking.jsonl +0 -0
  128. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/system/file_history_snapshot.json +0 -0
  129. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/system/file_history_snapshot.jsonl +0 -0
  130. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/system/queue_operation.json +0 -0
  131. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/system/queue_operation.jsonl +0 -0
  132. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/system/summary.json +0 -0
  133. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/system/summary.jsonl +0 -0
  134. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/system/system_info.json +0 -0
  135. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/system/system_info.jsonl +0 -0
  136. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/AskUserQuestion-tool_result.json +0 -0
  137. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/AskUserQuestion-tool_result.jsonl +0 -0
  138. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/AskUserQuestion-tool_result_error.json +0 -0
  139. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/AskUserQuestion-tool_result_error.jsonl +0 -0
  140. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/AskUserQuestion-tool_use.json +0 -0
  141. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/AskUserQuestion-tool_use.jsonl +0 -0
  142. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Bash-tool_result.json +0 -0
  143. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Bash-tool_result.jsonl +0 -0
  144. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Bash-tool_result_error.json +0 -0
  145. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Bash-tool_result_error.jsonl +0 -0
  146. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Bash-tool_use.json +0 -0
  147. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Bash-tool_use.jsonl +0 -0
  148. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/BashOutput-tool_result.json +0 -0
  149. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/BashOutput-tool_result.jsonl +0 -0
  150. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/BashOutput-tool_use.json +0 -0
  151. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/BashOutput-tool_use.jsonl +0 -0
  152. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Edit-tool_result.json +0 -0
  153. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Edit-tool_result.jsonl +0 -0
  154. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Edit-tool_result_error.json +0 -0
  155. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Edit-tool_result_error.jsonl +0 -0
  156. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Edit-tool_use.json +0 -0
  157. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Edit-tool_use.jsonl +0 -0
  158. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/ExitPlanMode-tool_result.json +0 -0
  159. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/ExitPlanMode-tool_result.jsonl +0 -0
  160. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/ExitPlanMode-tool_result_error.json +0 -0
  161. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/ExitPlanMode-tool_result_error.jsonl +0 -0
  162. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/ExitPlanMode-tool_use.json +0 -0
  163. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/ExitPlanMode-tool_use.jsonl +0 -0
  164. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Glob-tool_result.json +0 -0
  165. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Glob-tool_result.jsonl +0 -0
  166. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Glob-tool_use.json +0 -0
  167. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Glob-tool_use.jsonl +0 -0
  168. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Grep-tool_result.json +0 -0
  169. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Grep-tool_result.jsonl +0 -0
  170. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Grep-tool_use.json +0 -0
  171. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Grep-tool_use.jsonl +0 -0
  172. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/KillShell-tool_result.json +0 -0
  173. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/KillShell-tool_result.jsonl +0 -0
  174. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/KillShell-tool_result_error.json +0 -0
  175. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/KillShell-tool_result_error.jsonl +0 -0
  176. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/KillShell-tool_use.json +0 -0
  177. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/KillShell-tool_use.jsonl +0 -0
  178. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/LS-tool_result.json +0 -0
  179. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/LS-tool_result.jsonl +0 -0
  180. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/LS-tool_use.json +0 -0
  181. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/LS-tool_use.jsonl +0 -0
  182. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/MultiEdit-tool_result.json +0 -0
  183. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/MultiEdit-tool_result.jsonl +0 -0
  184. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/MultiEdit-tool_result_error.json +0 -0
  185. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/MultiEdit-tool_result_error.jsonl +0 -0
  186. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/MultiEdit-tool_use.json +0 -0
  187. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/MultiEdit-tool_use.jsonl +0 -0
  188. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Read-tool_result.json +0 -0
  189. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Read-tool_result.jsonl +0 -0
  190. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Read-tool_result_error.json +0 -0
  191. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Read-tool_result_error.jsonl +0 -0
  192. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Read-tool_use.json +0 -0
  193. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Read-tool_use.jsonl +0 -0
  194. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Task-tool_result.json +0 -0
  195. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Task-tool_result.jsonl +0 -0
  196. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Task-tool_use.json +0 -0
  197. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Task-tool_use.jsonl +0 -0
  198. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/TodoWrite-tool_result.json +0 -0
  199. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/TodoWrite-tool_result.jsonl +0 -0
  200. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/TodoWrite-tool_use.json +0 -0
  201. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/TodoWrite-tool_use.jsonl +0 -0
  202. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/WebFetch-tool_result.json +0 -0
  203. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/WebFetch-tool_result.jsonl +0 -0
  204. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/WebFetch-tool_use.json +0 -0
  205. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/WebFetch-tool_use.jsonl +0 -0
  206. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/WebSearch-tool_result.json +0 -0
  207. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/WebSearch-tool_result.jsonl +0 -0
  208. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/WebSearch-tool_use.json +0 -0
  209. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/WebSearch-tool_use.jsonl +0 -0
  210. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Write-tool_result.json +0 -0
  211. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Write-tool_result.jsonl +0 -0
  212. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Write-tool_result_error.json +0 -0
  213. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Write-tool_result_error.jsonl +0 -0
  214. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Write-tool_use.json +0 -0
  215. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/Write-tool_use.jsonl +0 -0
  216. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/exit_plan_mode-tool_result.json +0 -0
  217. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/exit_plan_mode-tool_result.jsonl +0 -0
  218. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/exit_plan_mode-tool_use.json +0 -0
  219. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/tools/exit_plan_mode-tool_use.jsonl +0 -0
  220. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/bash_input.json +0 -0
  221. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/bash_input.jsonl +0 -0
  222. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/bash_output.json +0 -0
  223. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/bash_output.jsonl +0 -0
  224. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/command_output.json +0 -0
  225. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/command_output.jsonl +0 -0
  226. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/image.json +0 -0
  227. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/image.jsonl +0 -0
  228. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/user.json +0 -0
  229. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/user.jsonl +0 -0
  230. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/user_command.json +0 -0
  231. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/user_command.jsonl +0 -0
  232. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/user_sidechain.json +0 -0
  233. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/user_sidechain.jsonl +0 -0
  234. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/user_slash_command.json +0 -0
  235. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/messages/user/user_slash_command.jsonl +0 -0
  236. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/dev-docs/teammates.md +0 -0
  237. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/stubs/pygments/__init__.pyi +0 -0
  238. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/stubs/pygments/formatter.pyi +0 -0
  239. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/stubs/pygments/formatters/__init__.pyi +0 -0
  240. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/stubs/pygments/lexer.pyi +0 -0
  241. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/stubs/pygments/lexers/__init__.pyi +0 -0
  242. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/stubs/pygments/util.pyi +0 -0
  243. {claude_code_log-1.3.0 → claude_code_log-1.5.0}/work/session-state-propagation.md +0 -0
@@ -0,0 +1,117 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ${{ matrix.os }}
12
+ strategy:
13
+ matrix:
14
+ os: ["ubuntu-latest", "windows-latest"]
15
+ python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
16
+ include:
17
+ - os: "ubuntu-latest"
18
+ python-version: "3.12"
19
+ is-primary: true
20
+
21
+ env:
22
+ # Collect coverage only on the primary job: it is the only one that
23
+ # uploads the reports and feeds the PR comment, while --cov costs
24
+ # ~65% extra pytest wall time (worst on Windows). Windows-only
25
+ # covered lines measured at 5 (diffing covered lines per file,
26
+ # Windows vs the primary artifact): the SIGUSR1 no-op return and the
27
+ # drive-letter branch of convert_project_path_to_claude_dir, both in
28
+ # cli.py. Those were never in the published report (non-primary
29
+ # coverage was computed and discarded), so this changes nothing.
30
+ COV: ${{ matrix.is-primary && '--cov=claude_code_log --cov-report=xml --cov-report=html --cov-report=term' || '' }}
31
+ COV_APPEND: ${{ matrix.is-primary && '--cov=claude_code_log --cov-append --cov-report=xml --cov-report=html --cov-report=term' || '' }}
32
+
33
+ steps:
34
+ - uses: actions/checkout@v4
35
+ with:
36
+ # Full history so test/test_commit_linkifier.py's
37
+ # TestIntegrationLocalRepo can resolve SHAs older than the
38
+ # current tip (`git branch -r --contains` reads local refs
39
+ # only and needs the commits in the object DB).
40
+ fetch-depth: 0
41
+
42
+ - name: Move TEMP to the workspace disk (Windows)
43
+ # On windows runners TMP/TEMP default to the C: OS disk, whose
44
+ # throttled I/O dominates this tmp-heavy suite; RUNNER_TEMP lives on
45
+ # the same disk as the workspace (D:). Measured via A/B experiment
46
+ # (run 28715118956): this redirect alone took the unit selection from
47
+ # 555s mean to 150s — parity with ubuntu (~161s). Defender is NOT the
48
+ # culprit: real-time protection is already off on current images
49
+ # (exclusions/disable measured as no-ops), and a ReFS dev drive
50
+ # (~296s) was dominated by this redirect. Details: work/win-io.md
51
+ if: runner.os == 'Windows'
52
+ shell: pwsh
53
+ run: |
54
+ "TMP=$env:RUNNER_TEMP" >> $env:GITHUB_ENV
55
+ "TEMP=$env:RUNNER_TEMP" >> $env:GITHUB_ENV
56
+
57
+ - name: Install uv
58
+ uses: astral-sh/setup-uv@v4
59
+ with:
60
+ enable-cache: true
61
+
62
+ - name: Set up Python ${{ matrix.python-version }}
63
+ run: uv python install ${{ matrix.python-version }}
64
+
65
+ - name: Install dependencies
66
+ run: uv sync --all-extras --dev && uv run playwright install chromium
67
+
68
+ - name: Run unit tests (coverage on primary only)
69
+ # -p no:playwright: unit tests don't use the browser fixtures; skipping the
70
+ # plugin avoids a ~1s playwright import per xdist worker, which Windows pays
71
+ # per spawned worker. See work/xdist-import-cost.md.
72
+ run: uv run pytest -p no:playwright -m "not (tui or browser or benchmark)" ${{ env.COV }}
73
+
74
+ - name: Run TUI tests (coverage append on primary only)
75
+ run: uv run pytest -m tui ${{ env.COV_APPEND }}
76
+
77
+ - name: Run browser tests (coverage append on primary only)
78
+ run: uv run pytest -m browser ${{ env.COV_APPEND }}
79
+
80
+ - name: Run benchmark tests with coverage append (primary only)
81
+ if: matrix.is-primary
82
+ env:
83
+ CLAUDE_CODE_LOG_DEBUG_TIMING: "1"
84
+ run: uv run pytest -m benchmark ${{ env.COV_APPEND }} -v
85
+
86
+ - name: Upload coverage HTML report as artifact
87
+ uses: actions/upload-artifact@v4
88
+ if: matrix.is-primary
89
+ with:
90
+ name: coverage-report-html
91
+ path: htmlcov/
92
+ retention-days: 30
93
+
94
+ - name: Upload coverage XML as artifact
95
+ uses: actions/upload-artifact@v4
96
+ if: matrix.is-primary
97
+ with:
98
+ name: coverage-report-xml
99
+ path: coverage.xml
100
+ retention-days: 30
101
+
102
+ - name: Coverage comment (PR only)
103
+ if: github.event_name == 'pull_request' && matrix.is-primary
104
+ uses: py-cov-action/python-coverage-comment-action@v3
105
+ with:
106
+ GITHUB_TOKEN: ${{ github.token }}
107
+ MINIMUM_GREEN: 75
108
+ MINIMUM_ORANGE: 60
109
+
110
+ - name: Run linting
111
+ run: uv run ruff check
112
+
113
+ - name: Run formatting check
114
+ run: uv run ruff format --check
115
+
116
+ - name: Run type checking
117
+ run: uv run pyright
@@ -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,114 @@ 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.5.0] - 2026-07-09
10
+
11
+ ### Changed
12
+
13
+ - **Filter <local-command-caveat>-wrapped caveat messages (Claude Code ≥ ~2.1) (#269)**
14
+ - **Fix perpetual re-regeneration of projects with up-to-date caches (#268)**
15
+ - **Fix ty possibly-missing-attribute warnings in tests (#267)**
16
+ - **Speed up cache freshness checks on large archives (#266)**
17
+ - **ci: move TMP/TEMP to the workspace disk on Windows runners**
18
+ - **perf(cov): use sys.monitoring coverage core (COVERAGE_CORE=sysmon equivalent)**
19
+ - **ci: collect coverage only on the primary matrix job**
20
+ - **Improve Artifact tool look&feel: label-linked result, lean tool use (#262) (#263)**
21
+ - **Remap dangling parent refs when dedup drops a distinct DAG node (#259) (#261)**
22
+ - **Render the Artifact tool (deploy HTML/MD page → claude.ai URL) (#257) (#260)**
23
+ - **Handle the full variety of Workflow invocation shapes (#174 follow-up) (#258)**
24
+ - **Regenerate a --no-cache directory when a source .jsonl grows (#254) (#256)**
25
+ - **Regenerate single-file output when its source grows; fix success-message accuracy (#221 follow-up) (#253)**
26
+ - **Surface the model each agent ran on, once per agent context (#246) (#252)**
27
+ - **feat: use nicer glyphs for fold/unfold controls (#247) (#255)**
28
+ - **Escape raw HTML in assistant/tool content to fix XSS (#245)**
29
+ - **Warn that --output / --format are ignored under --tui (#220) (#241)**
30
+ - **Speed up the SQLite metadata-cache build (connection reuse + synchronous=NORMAL) (#251)**
31
+ - **Cut pytest-xdist per-worker import cost on Windows unit runs (#250)**
32
+ - **Speed up integration-test fixtures on Windows (shrink copied transcripts; skip symlink tests when unavailable) (#249)**
33
+ - **Stream output to stdout: support -o - / /dev/stdout (#223 part 2) (#239)**
34
+ - **Keep fork points visible when their host message is detail-filtered (#233 follow-up) (#240)**
35
+ - **Explicit --output: always regenerate, infer format from suffix, fix stdout hang (#221, #222, #223 part 1) (#237)**
36
+ - **Connect fork-point and branch headers to their anchor message (#238)**
37
+ - **Anchor fork points whose node is an unrendered system message (#236)**
38
+ - **Render Read/Write of any Markdown file as Markdown, not Pygments (#232) (#234)**
39
+ - **Generic tool results: render structured content items (#227) (#235)**
40
+ - **Nested agent hierarchies: visual layer (#213, part 2 — WIP) (#219)**
41
+ - **Render nested sub-agent hierarchies (#213) (#218)**
42
+ - **Build(deps): bump pygments from 2.19.2 to 2.20.0 (#228)**
43
+ - **Build(deps): bump requests from 2.32.5 to 2.33.0 (#229)**
44
+ - **Build(deps-dev): bump pytest from 9.0.1 to 9.0.3 (#230)**
45
+ - **Build(deps): bump idna from 3.11 to 3.15 (#231)**
46
+ - **Side-channel prompt rendering + params-fold UX and accessibility (#174 follow-up) (#217)**
47
+ - **Polish the workflow run tree + dev-docs sync (#174 follow-up) (#215)**
48
+ - **Hybrid JSON/Markdown rendering for tool params tables (#216)**
49
+ - **Linearize assistant-continuation tool-flow forks instead of branching (#214)**
50
+ - **Enrich fork-point and branch nav labels with message summaries (#179 follow-up) (#212)**
51
+ - **Render dynamic-workflow run tree on the nested DOM (#174 PR3) (#210)**
52
+ - **Keep recaps visible at all detail levels; add --no-recaps (#179) (#209)**
53
+ - **Dedupe "unrecognized message type" warnings per file (#211)**
54
+ - **work/: delete the completed converter/renderer simplification plans (#208)**
55
+ - **Flag auto-memory interactions: 🧠 titles + memory filter (#192) (#204)**
56
+ - **Phase 3: single-axis collapse — delete pre-render _filter_by_detail (#206)**
57
+ - **Render Workflow tool-input (JS) + async-result JSON bodies (#174 PR2) (#205)**
58
+ - **Phase 2 of ghosting epic: detail-filter ghosts in place; drop _reindex_filtered_context (#194)**
59
+ - **Parse dynamic-Workflow runs into WorkflowRun models (#174 PR1) (#203)**
60
+ - **Bump mistune from 3.1.4 to 3.2.1 (#202)**
61
+ - **Bump gitpython from 3.1.45 to 3.1.50 (#200)**
62
+ - **Exclude docs/ from ty type-checking (#201)**
63
+ - **Render message tree as nested DOM (PR0 for #174) (#191)**
64
+ - **Bump urllib3 from 2.5.0 to 2.7.0 (#199)**
65
+ - **Ghost-aware ctx.messages; skill-fold uses None slots (ghosting epic Phase 1) (#193)**
66
+ - **Merge pull request #198 from daaain/fix-linux-release**
67
+
68
+
69
+ ## [1.4.0] - 2026-06-03
70
+
71
+ ### Changed
72
+
73
+ - **Fix sed**
74
+ - **Add MkDocs documentation site with live TUI reference (#197)**
75
+ - **Relax Textual constraint from `==` to `>=` (#196)**
76
+ - **Add `--version` flag to the CLI (#195)**
77
+ - **Fix AskUserQuestion result rendering + highlight chosen options (#180) (#189)**
78
+ - **Derive render_session_id from the SessionTree, not a loop variable (#190)**
79
+ - **Fix collapsible body overlapping preceding content in tool cards (#153) (#187)**
80
+ - **Extract compute_session_data + compute_project_aggregates (C9b) (#188)**
81
+ - **Add C9a characterization tests for session-scan call sites (#186)**
82
+ - **Route converter summary + ai-title extraction through shared helpers (#185)**
83
+ - **status: Wave B fully merged; Wave C kickoff (C8/C9a/C9b stacked, C10 dropped, decisions locked)**
84
+ - **Compute branch preview once from the DAG-line (#184)**
85
+ - **status: #184 fully validated (CI 11/11, CodeRabbit clean) — ready to merge**
86
+ - **docs: keep simplification status note self-contained to project scope**
87
+ - **status: correct #184 state; move GitHub CI/CodeRabbit ops to github guideline**
88
+ - **status: reverse-order stacked-PR lift recipe CONFIRMED on #184**
89
+ - **Factor session-header construction out of _render_messages (#183)**
90
+ - **status: #183/#184 rebased + CodeRabbit forced (#183 clean, #184 2 doc fixes); record @coderabbitai + reverse-order workarounds**
91
+ - **Dedup requestId tokens in pagination cache-miss fallback (#182)**
92
+ - **status: Wave B track complete — opp 7 PR #184 up, all monk-approved; add merge sequence**
93
+ - **status: note stacked-PR CI/CodeRabbit defers to merge-time**
94
+ - **status: opp 1 green (#182, awaiting merge); opp 6 #183 in review; opp 7 in progress**
95
+ - **status: opp 1 -> PR #182 (in review); opp 6 in progress**
96
+ - **Add live-status section to simplification plan**
97
+ - **Add converter/renderer simplification plan**
98
+ - **Move detail-visibility predicate onto MessageContent (#181)**
99
+ - **Sync rendering-architecture.md §5 with the current pipeline (#178)**
100
+ - **Extract inline junction-forward-link block into a named pass (#177)**
101
+ - **Co-locate the away-summary detail rule on AwaySummaryMessage (#176)**
102
+ - **Remove vestigial progress-chain parent repair (#175)**
103
+ - **plugins: dev-docs gaps + public helper API + ToolResult example (Phase 2) (#173)**
104
+ - **Implement unified plugin system from RFC #166 (#169)**
105
+ - **Render Read tool results with pygments via structured payload (closes #170) (#172)**
106
+ - **work/: triage against shipped main (#171)**
107
+ - **Always regenerate projects index so variant-flag toggles refresh links (#168)**
108
+ - **RFC: plugin system (unified message-transformer mechanism) (#166)**
109
+ - **Per-message timestamps in Markdown output (#160) (#165)**
110
+ - **Support non-GitHub forges via static map + `--git-link` fallback (#156) (#164)**
111
+ - **Obsidian-friendly output: --output dir + --expand-paths + --filter-path (#151) (#155)**
112
+ - **Linkify commit SHAs in rendered Markdown + HTML — closes #156 (#161)**
113
+ - **CSS clean-ups (issue #153) (#163)**
114
+ - **Cross-link TaskOutput / TaskUpdate headers back to their spawn (#154) (#158)**
115
+
116
+
9
117
  ## [1.3.0] - 2026-05-14
10
118
 
11
119
  ### Changed
@@ -107,9 +107,16 @@ with pointers to the deep-dive docs:
107
107
  - [dev-docs/teammates.md](dev-docs/teammates.md) - Teammates feature deep-dive
108
108
  - [dev-docs/message-hierarchy.md](dev-docs/message-hierarchy.md) - Fold/unfold state machine
109
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
110
111
 
111
112
  User-facing docs live in [docs/](docs/); plans and TODOs live in [work/](work/).
112
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
+
113
120
  ### Keeping dev-docs/ in sync
114
121
 
115
122
  `dev-docs/` is **as-built reference** — the code is the authoritative
@@ -206,6 +206,47 @@ kill -USR1 $(pgrep -f claude-code-log | head -1)
206
206
 
207
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
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
+
209
250
  ## Architecture
210
251
 
211
252
  Start with [dev-docs/application_model.md](dev-docs/application_model.md)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-log
3
- Version: 1.3.0
3
+ Version: 1.5.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==6.5.0
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.com/daaain/claude-code-log/releases/latest/download/claude-code-log-transcript.html)** - Download a real example generated from this project's development (large file, ~100 MB)
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
 
@@ -188,6 +188,21 @@ claude-code-log /path/to/project --detail low --format md --compact
188
188
 
189
189
  `--compact` merges consecutive same-type sections in Markdown so runs of assistant responses share one heading instead of repeating `### 🤖 Assistant:` for each.
190
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
+
191
206
  ## Project Hierarchy Output
192
207
 
193
208
  When processing all projects, the tool generates:
@@ -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.com/daaain/claude-code-log/releases/latest/download/claude-code-log-transcript.html)** - Download a real example generated from this project's development (large file, ~100 MB)
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
 
@@ -164,6 +164,21 @@ claude-code-log /path/to/project --detail low --format md --compact
164
164
 
165
165
  `--compact` merges consecutive same-type sections in Markdown so runs of assistant responses share one heading instead of repeating `### 🤖 Assistant:` for each.
166
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
+
167
182
  ## Project Hierarchy Output
168
183
 
169
184
  When processing all projects, the tool generates: