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.
Files changed (234) hide show
  1. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/.claude/skills/tool-renderer/SKILL.md +27 -1
  2. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/.github/workflows/ci.yml +9 -3
  3. claude_code_log-1.4.0/.github/workflows/docs.yml +68 -0
  4. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/.gitignore +4 -3
  5. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/CHANGELOG.md +81 -0
  6. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/CLAUDE.md +36 -6
  7. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/CONTRIBUTING.md +72 -8
  8. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/PKG-INFO +31 -4
  9. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/README.md +29 -2
  10. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/cache.py +75 -6
  11. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/cli.py +309 -18
  12. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/converter.py +875 -514
  13. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/dag.py +313 -70
  14. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/factories/__init__.py +21 -0
  15. claude_code_log-1.4.0/claude_code_log/factories/agent_metadata_factory.py +107 -0
  16. claude_code_log-1.4.0/claude_code_log/factories/attachment_factory.py +126 -0
  17. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/factories/meta_factory.py +2 -0
  18. claude_code_log-1.4.0/claude_code_log/factories/priorities.py +46 -0
  19. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/factories/system_factory.py +52 -4
  20. claude_code_log-1.4.0/claude_code_log/factories/task_notification_factory.py +161 -0
  21. claude_code_log-1.4.0/claude_code_log/factories/teammate_factory.py +140 -0
  22. claude_code_log-1.4.0/claude_code_log/factories/tool_factory.py +1612 -0
  23. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/factories/transcript_factory.py +4 -0
  24. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/factories/user_factory.py +129 -3
  25. claude_code_log-1.4.0/claude_code_log/git_remote.py +343 -0
  26. claude_code_log-1.4.0/claude_code_log/html/async_formatter.py +175 -0
  27. claude_code_log-1.4.0/claude_code_log/html/renderer.py +1604 -0
  28. claude_code_log-1.4.0/claude_code_log/html/system_formatters.py +299 -0
  29. claude_code_log-1.4.0/claude_code_log/html/teammate_formatter.py +568 -0
  30. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/edit_diff_styles.css +1 -1
  31. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/filter_styles.css +4 -0
  32. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/global_styles.css +88 -2
  33. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/message_styles.css +263 -13
  34. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/project_card_styles.css +32 -0
  35. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/session_nav.html +6 -1
  36. claude_code_log-1.4.0/claude_code_log/html/templates/components/teammate_styles.css +373 -0
  37. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/timeline.html +23 -3
  38. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/todo_styles.css +19 -0
  39. claude_code_log-1.4.0/claude_code_log/html/templates/index.html +157 -0
  40. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/transcript.html +81 -0
  41. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/tool_formatters.py +378 -44
  42. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/user_formatters.py +42 -5
  43. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/utils.py +211 -6
  44. claude_code_log-1.4.0/claude_code_log/json/__init__.py +5 -0
  45. claude_code_log-1.4.0/claude_code_log/json/renderer.py +225 -0
  46. claude_code_log-1.4.0/claude_code_log/markdown/renderer.py +2186 -0
  47. claude_code_log-1.4.0/claude_code_log/markdown_plugins.py +440 -0
  48. claude_code_log-1.4.0/claude_code_log/migrations/005_session_team_name.sql +14 -0
  49. claude_code_log-1.4.0/claude_code_log/migrations/006_session_ai_title.sql +14 -0
  50. claude_code_log-1.4.0/claude_code_log/models.py +2088 -0
  51. claude_code_log-1.4.0/claude_code_log/plugins.py +371 -0
  52. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/renderer.py +1966 -303
  53. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/tui.py +28 -16
  54. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/utils.py +290 -19
  55. claude_code_log-1.4.0/dev-docs/agents.md +191 -0
  56. claude_code_log-1.4.0/dev-docs/application_model.md +458 -0
  57. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/css-classes.md +5 -0
  58. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/dag.md +118 -6
  59. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/implementing-a-tool-renderer.md +54 -0
  60. 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
  61. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages.md +82 -5
  62. claude_code_log-1.4.0/dev-docs/plugins.md +741 -0
  63. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/rendering-architecture.md +93 -18
  64. claude_code_log-1.4.0/dev-docs/teammates.md +978 -0
  65. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/justfile +40 -31
  66. claude_code_log-1.4.0/mkdocs.yml +87 -0
  67. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/pyproject.toml +21 -2
  68. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/uv.lock +330 -2
  69. claude_code_log-1.4.0/work/obsidian-friendly-output.md +81 -0
  70. claude_code_log-1.4.0/work/refactor-reindex-with-ghosting.md +197 -0
  71. {claude_code_log-1.2.0/dev-docs → claude_code_log-1.4.0/work}/rendering-next.md +3 -36
  72. claude_code_log-1.4.0/work/simplify-converter-renderer.md +312 -0
  73. claude_code_log-1.4.0/work/tool-renderer-plugins.md +29 -0
  74. claude_code_log-1.2.0/.github/workflows/claude.yml +0 -67
  75. claude_code_log-1.2.0/claude_code_log/factories/tool_factory.py +0 -837
  76. claude_code_log-1.2.0/claude_code_log/html/renderer.py +0 -716
  77. claude_code_log-1.2.0/claude_code_log/html/system_formatters.py +0 -141
  78. claude_code_log-1.2.0/claude_code_log/html/templates/index.html +0 -111
  79. claude_code_log-1.2.0/claude_code_log/markdown/renderer.py +0 -1010
  80. claude_code_log-1.2.0/claude_code_log/models.py +0 -1151
  81. claude_code_log-1.2.0/dev-docs/restoring-archived-sessions.md +0 -105
  82. claude_code_log-1.2.0/work/phase-c-agent-transcripts.md +0 -87
  83. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/.claude/settings.json +0 -0
  84. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/.vscode/settings.json +0 -0
  85. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/LICENSE +0 -0
  86. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/__init__.py +0 -0
  87. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/factories/assistant_factory.py +0 -0
  88. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/__init__.py +0 -0
  89. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/ansi_colors.py +0 -0
  90. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/assistant_formatters.py +0 -0
  91. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/renderer_code.py +0 -0
  92. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/page_nav_styles.css +0 -0
  93. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/pygments_styles.css +0 -0
  94. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/search.html +0 -0
  95. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/search_inline.html +0 -0
  96. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/search_inline_script.html +0 -0
  97. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/search_results_panel.html +0 -0
  98. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/search_styles.css +0 -0
  99. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/session_nav_styles.css +0 -0
  100. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/timeline_styles.css +0 -0
  101. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/html/templates/components/timezone_converter.js +0 -0
  102. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/image_export.py +0 -0
  103. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/markdown/__init__.py +0 -0
  104. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/migrations/001_initial_schema.sql +0 -0
  105. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/migrations/002_html_cache.sql +0 -0
  106. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/migrations/003_html_pagination.sql +0 -0
  107. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/migrations/004_html_pagination_variant.sql +0 -0
  108. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/migrations/__init__.py +0 -0
  109. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/migrations/runner.py +0 -0
  110. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/parser.py +0 -0
  111. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/py.typed +0 -0
  112. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/claude_code_log/renderer_timings.py +0 -0
  113. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/assistant/assistant.json +0 -0
  114. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/assistant/assistant.jsonl +0 -0
  115. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/assistant/assistant_sidechain.json +0 -0
  116. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/assistant/assistant_sidechain.jsonl +0 -0
  117. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/assistant/thinking.json +0 -0
  118. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/assistant/thinking.jsonl +0 -0
  119. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/file_history_snapshot.json +0 -0
  120. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/file_history_snapshot.jsonl +0 -0
  121. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/queue_operation.json +0 -0
  122. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/queue_operation.jsonl +0 -0
  123. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/summary.json +0 -0
  124. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/summary.jsonl +0 -0
  125. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/system_info.json +0 -0
  126. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/system/system_info.jsonl +0 -0
  127. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/AskUserQuestion-tool_result.json +0 -0
  128. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/AskUserQuestion-tool_result.jsonl +0 -0
  129. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/AskUserQuestion-tool_result_error.json +0 -0
  130. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/AskUserQuestion-tool_result_error.jsonl +0 -0
  131. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/AskUserQuestion-tool_use.json +0 -0
  132. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/AskUserQuestion-tool_use.jsonl +0 -0
  133. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Bash-tool_result.json +0 -0
  134. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Bash-tool_result.jsonl +0 -0
  135. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Bash-tool_result_error.json +0 -0
  136. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Bash-tool_result_error.jsonl +0 -0
  137. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Bash-tool_use.json +0 -0
  138. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Bash-tool_use.jsonl +0 -0
  139. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/BashOutput-tool_result.json +0 -0
  140. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/BashOutput-tool_result.jsonl +0 -0
  141. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/BashOutput-tool_use.json +0 -0
  142. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/BashOutput-tool_use.jsonl +0 -0
  143. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Edit-tool_result.json +0 -0
  144. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Edit-tool_result.jsonl +0 -0
  145. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Edit-tool_result_error.json +0 -0
  146. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Edit-tool_result_error.jsonl +0 -0
  147. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Edit-tool_use.json +0 -0
  148. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Edit-tool_use.jsonl +0 -0
  149. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/ExitPlanMode-tool_result.json +0 -0
  150. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/ExitPlanMode-tool_result.jsonl +0 -0
  151. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/ExitPlanMode-tool_result_error.json +0 -0
  152. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/ExitPlanMode-tool_result_error.jsonl +0 -0
  153. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/ExitPlanMode-tool_use.json +0 -0
  154. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/ExitPlanMode-tool_use.jsonl +0 -0
  155. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Glob-tool_result.json +0 -0
  156. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Glob-tool_result.jsonl +0 -0
  157. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Glob-tool_use.json +0 -0
  158. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Glob-tool_use.jsonl +0 -0
  159. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Grep-tool_result.json +0 -0
  160. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Grep-tool_result.jsonl +0 -0
  161. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Grep-tool_use.json +0 -0
  162. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Grep-tool_use.jsonl +0 -0
  163. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/KillShell-tool_result.json +0 -0
  164. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/KillShell-tool_result.jsonl +0 -0
  165. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/KillShell-tool_result_error.json +0 -0
  166. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/KillShell-tool_result_error.jsonl +0 -0
  167. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/KillShell-tool_use.json +0 -0
  168. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/KillShell-tool_use.jsonl +0 -0
  169. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/LS-tool_result.json +0 -0
  170. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/LS-tool_result.jsonl +0 -0
  171. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/LS-tool_use.json +0 -0
  172. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/LS-tool_use.jsonl +0 -0
  173. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/MultiEdit-tool_result.json +0 -0
  174. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/MultiEdit-tool_result.jsonl +0 -0
  175. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/MultiEdit-tool_result_error.json +0 -0
  176. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/MultiEdit-tool_result_error.jsonl +0 -0
  177. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/MultiEdit-tool_use.json +0 -0
  178. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/MultiEdit-tool_use.jsonl +0 -0
  179. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Read-tool_result.json +0 -0
  180. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Read-tool_result.jsonl +0 -0
  181. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Read-tool_result_error.json +0 -0
  182. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Read-tool_result_error.jsonl +0 -0
  183. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Read-tool_use.json +0 -0
  184. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Read-tool_use.jsonl +0 -0
  185. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Task-tool_result.json +0 -0
  186. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Task-tool_result.jsonl +0 -0
  187. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Task-tool_use.json +0 -0
  188. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Task-tool_use.jsonl +0 -0
  189. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/TodoWrite-tool_result.json +0 -0
  190. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/TodoWrite-tool_result.jsonl +0 -0
  191. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/TodoWrite-tool_use.json +0 -0
  192. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/TodoWrite-tool_use.jsonl +0 -0
  193. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebFetch-tool_result.json +0 -0
  194. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebFetch-tool_result.jsonl +0 -0
  195. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebFetch-tool_use.json +0 -0
  196. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebFetch-tool_use.jsonl +0 -0
  197. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebSearch-tool_result.json +0 -0
  198. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebSearch-tool_result.jsonl +0 -0
  199. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebSearch-tool_use.json +0 -0
  200. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/WebSearch-tool_use.jsonl +0 -0
  201. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Write-tool_result.json +0 -0
  202. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Write-tool_result.jsonl +0 -0
  203. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Write-tool_result_error.json +0 -0
  204. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Write-tool_result_error.jsonl +0 -0
  205. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Write-tool_use.json +0 -0
  206. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/Write-tool_use.jsonl +0 -0
  207. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/exit_plan_mode-tool_result.json +0 -0
  208. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/exit_plan_mode-tool_result.jsonl +0 -0
  209. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/exit_plan_mode-tool_use.json +0 -0
  210. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/tools/exit_plan_mode-tool_use.jsonl +0 -0
  211. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/bash_input.json +0 -0
  212. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/bash_input.jsonl +0 -0
  213. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/bash_output.json +0 -0
  214. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/bash_output.jsonl +0 -0
  215. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/command_output.json +0 -0
  216. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/command_output.jsonl +0 -0
  217. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/image.json +0 -0
  218. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/image.jsonl +0 -0
  219. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user.json +0 -0
  220. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user.jsonl +0 -0
  221. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user_command.json +0 -0
  222. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user_command.jsonl +0 -0
  223. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user_sidechain.json +0 -0
  224. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user_sidechain.jsonl +0 -0
  225. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user_slash_command.json +0 -0
  226. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/dev-docs/messages/user/user_slash_command.jsonl +0 -0
  227. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/mise.toml +0 -0
  228. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/stubs/pygments/__init__.pyi +0 -0
  229. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/stubs/pygments/formatter.pyi +0 -0
  230. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/stubs/pygments/formatters/__init__.pyi +0 -0
  231. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/stubs/pygments/lexer.pyi +0 -0
  232. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/stubs/pygments/lexers/__init__.pyi +0 -0
  233. {claude_code_log-1.2.0 → claude_code_log-1.4.0}/stubs/pygments/util.pyi +0 -0
  234. {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 -n auto -m "not (tui or browser)" -v
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 -n auto -m "not (tui or browser or benchmark)" --cov=claude_code_log --cov-report=xml --cov-report=html --cov-report=term
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 -n auto -m tui --cov=claude_code_log --cov-append --cov-report=xml --cov-report=html --cov-report=term
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 -n auto -m browser --cov=claude_code_log --cov-append --cov-report=xml --cov-report=html --cov-report=term
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
- **Always use `-n auto` for parallel test execution:**
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 -n auto -m "not (tui or browser)" -v
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 -n auto -m tui
63
+ # or: uv run pytest -m tui
64
64
 
65
65
  # Browser tests
66
66
  just test-browser
67
- # or: uv run pytest -n auto -m browser
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 -n auto -m "not (tui or browser)" -v -x`).
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
- For detailed architecture documentation, see:
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 -n auto -m "not (tui or browser)" -v
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 -n auto test/test_snapshot_html.py -v
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
- uv run pytest -n auto test/test_snapshot_html.py --snapshot-update
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 -n auto --cov=claude_code_log --cov-report=html --cov-report=term
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
- For detailed architecture documentation, see [dev-docs/rendering-architecture.md](dev-docs/rendering-architecture.md).
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.2.0
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==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
 
@@ -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.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
 
@@ -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