claude-code-log 1.6.0__tar.gz → 1.7.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 (302) hide show
  1. claude_code_log-1.7.0/.github/workflows/release.yml +169 -0
  2. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/CHANGELOG.md +22 -0
  3. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/CLAUDE.md +1 -1
  4. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/CONTRIBUTING.md +66 -22
  5. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/PKG-INFO +17 -9
  6. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/README.md +15 -7
  7. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/cache.py +357 -53
  8. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/cli.py +70 -10
  9. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/converter.py +277 -31
  10. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/dag.py +76 -4
  11. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/attachment_factory.py +51 -2
  12. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/system_factory.py +6 -0
  13. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/teammate_factory.py +4 -4
  14. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/git_remote.py +210 -65
  15. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/renderer.py +3 -3
  16. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/global_styles.css +16 -1
  17. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/transcript.html +2 -2
  18. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/utils.py +178 -110
  19. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/markdown/renderer.py +65 -60
  20. claude_code_log-1.7.0/claude_code_log/markdown_plugins.py +367 -0
  21. claude_code_log-1.7.0/claude_code_log/migrations/013_html_cache_combined_link.sql +40 -0
  22. claude_code_log-1.7.0/claude_code_log/migrations/014_cached_file_content_version.sql +30 -0
  23. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/runner.py +60 -3
  24. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/models.py +13 -1
  25. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/render_cache.py +1 -1
  26. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/renderer.py +49 -1
  27. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/search.py +47 -6
  28. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/watch.py +48 -10
  29. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/application_model.md +163 -3
  30. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/dag.md +61 -2
  31. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/implementing-a-tool-renderer.md +1 -1
  32. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/plugins.md +11 -10
  33. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/teammates.md +20 -3
  34. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/foldyard.toml +2 -0
  35. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/justfile +44 -127
  36. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/pyproject.toml +2 -2
  37. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/uv.lock +12 -15
  38. claude_code_log-1.7.0/work/agent-message-origin.md +180 -0
  39. claude_code_log-1.7.0/work/watch-live-sessions.md +278 -0
  40. claude_code_log-1.7.0/work/wenmode-evaluation.md +647 -0
  41. claude_code_log-1.6.0/claude_code_log/markdown_plugins.py +0 -440
  42. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/settings.json +0 -0
  43. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/foldyard/SKILL.md +0 -0
  44. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/foldyard/references/egress-and-capture.md +0 -0
  45. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/foldyard/references/posture-and-credentials.md +0 -0
  46. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/foldyard/references/when-a-change-doesnt-take.md +0 -0
  47. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/tool-renderer/SKILL.md +0 -0
  48. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/update-tools-coverage/SKILL.md +0 -0
  49. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/update-tools-coverage/check_codex_coverage.py +0 -0
  50. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/update-tools-coverage/check_coverage.py +0 -0
  51. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.editorconfig +0 -0
  52. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.github/workflows/ci.yml +0 -0
  53. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.github/workflows/docs.yml +0 -0
  54. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.gitignore +0 -0
  55. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.vscode/settings.json +0 -0
  56. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/LICENSE +0 -0
  57. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/__init__.py +0 -0
  58. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/api.py +0 -0
  59. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/builtin_plugins/__init__.py +0 -0
  60. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/builtin_plugins/codex_docs.py +0 -0
  61. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/discovery.py +0 -0
  62. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/entry_store.py +0 -0
  63. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/__init__.py +0 -0
  64. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/agent_metadata_factory.py +0 -0
  65. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/assistant_factory.py +0 -0
  66. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/meta_factory.py +0 -0
  67. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/priorities.py +0 -0
  68. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/task_notification_factory.py +0 -0
  69. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/tool_factory.py +0 -0
  70. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/transcript_factory.py +0 -0
  71. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/user_factory.py +0 -0
  72. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/fragment_store.py +0 -0
  73. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/__init__.py +0 -0
  74. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/ansi_colors.py +0 -0
  75. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/assistant_formatters.py +0 -0
  76. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/async_formatter.py +0 -0
  77. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/renderer_code.py +0 -0
  78. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/system_formatters.py +0 -0
  79. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/teammate_formatter.py +0 -0
  80. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/archive_search.html +0 -0
  81. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/archive_search_link.html +0 -0
  82. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/edit_diff_styles.css +0 -0
  83. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/filter_styles.css +0 -0
  84. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/live_update.js +0 -0
  85. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/message_styles.css +0 -0
  86. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/page_nav_styles.css +0 -0
  87. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/project_card_styles.css +0 -0
  88. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/pygments_styles.css +0 -0
  89. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/search.html +0 -0
  90. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/search_inline.html +0 -0
  91. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/search_styles.css +0 -0
  92. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/session_nav.html +0 -0
  93. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/session_nav_styles.css +0 -0
  94. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/teammate_styles.css +0 -0
  95. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/timeline.html +0 -0
  96. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/timeline_styles.css +0 -0
  97. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/timezone_converter.js +0 -0
  98. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/todo_styles.css +0 -0
  99. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/index.html +0 -0
  100. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/tool_formatters.py +0 -0
  101. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/user_formatters.py +0 -0
  102. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/image_export.py +0 -0
  103. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/json/__init__.py +0 -0
  104. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/json/renderer.py +0 -0
  105. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/markdown/__init__.py +0 -0
  106. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/001_initial_schema.sql +0 -0
  107. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/002_html_cache.sql +0 -0
  108. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/003_html_pagination.sql +0 -0
  109. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/004_html_pagination_variant.sql +0 -0
  110. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/005_session_team_name.sql +0 -0
  111. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/006_session_ai_title.sql +0 -0
  112. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/007_subagents_fingerprint.sql +0 -0
  113. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/008_session_sidecar.sql +0 -0
  114. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/009_sessions_hidden.sql +0 -0
  115. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/010_sessions_residual_count.sql +0 -0
  116. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/011_cached_file_size.sql +0 -0
  117. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/012_message_lookup_indexes.sql +0 -0
  118. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/__init__.py +0 -0
  119. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/parser.py +0 -0
  120. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/plugins.py +0 -0
  121. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/__init__.py +0 -0
  122. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/agy.py +0 -0
  123. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/base.py +0 -0
  124. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/claude.py +0 -0
  125. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/codex.py +0 -0
  126. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/codex_messages.py +0 -0
  127. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/codex_quickjs.py +0 -0
  128. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/codex_tools.py +0 -0
  129. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/codex_web.py +0 -0
  130. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/registry.py +0 -0
  131. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/py.typed +0 -0
  132. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/render_dispatch.py +0 -0
  133. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/render_pool.py +0 -0
  134. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/renderer_timings.py +0 -0
  135. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/server.py +0 -0
  136. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/tui.py +0 -0
  137. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/utils.py +0 -0
  138. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/workflow.py +0 -0
  139. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/agents.md +0 -0
  140. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/css-classes.md +0 -0
  141. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/message-hierarchy.md +0 -0
  142. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/assistant/assistant.json +0 -0
  143. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/assistant/assistant.jsonl +0 -0
  144. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/assistant/assistant_sidechain.json +0 -0
  145. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/assistant/assistant_sidechain.jsonl +0 -0
  146. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/assistant/thinking.json +0 -0
  147. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/assistant/thinking.jsonl +0 -0
  148. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/file_history_snapshot.json +0 -0
  149. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/file_history_snapshot.jsonl +0 -0
  150. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/queue_operation.json +0 -0
  151. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/queue_operation.jsonl +0 -0
  152. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/summary.json +0 -0
  153. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/summary.jsonl +0 -0
  154. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/system_info.json +0 -0
  155. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/system_info.jsonl +0 -0
  156. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Artifact-tool_result.json +0 -0
  157. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Artifact-tool_result.jsonl +0 -0
  158. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Artifact-tool_use.json +0 -0
  159. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Artifact-tool_use.jsonl +0 -0
  160. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/AskUserQuestion-tool_result.json +0 -0
  161. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/AskUserQuestion-tool_result.jsonl +0 -0
  162. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/AskUserQuestion-tool_result_error.json +0 -0
  163. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/AskUserQuestion-tool_result_error.jsonl +0 -0
  164. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/AskUserQuestion-tool_use.json +0 -0
  165. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/AskUserQuestion-tool_use.jsonl +0 -0
  166. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Bash-tool_result.json +0 -0
  167. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Bash-tool_result.jsonl +0 -0
  168. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Bash-tool_result_error.json +0 -0
  169. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Bash-tool_result_error.jsonl +0 -0
  170. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Bash-tool_use.json +0 -0
  171. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Bash-tool_use.jsonl +0 -0
  172. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/BashOutput-tool_result.json +0 -0
  173. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/BashOutput-tool_result.jsonl +0 -0
  174. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/BashOutput-tool_use.json +0 -0
  175. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/BashOutput-tool_use.jsonl +0 -0
  176. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Edit-tool_result.json +0 -0
  177. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Edit-tool_result.jsonl +0 -0
  178. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Edit-tool_result_error.json +0 -0
  179. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Edit-tool_result_error.jsonl +0 -0
  180. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Edit-tool_use.json +0 -0
  181. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Edit-tool_use.jsonl +0 -0
  182. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/ExitPlanMode-tool_result.json +0 -0
  183. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/ExitPlanMode-tool_result.jsonl +0 -0
  184. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/ExitPlanMode-tool_result_error.json +0 -0
  185. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/ExitPlanMode-tool_result_error.jsonl +0 -0
  186. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/ExitPlanMode-tool_use.json +0 -0
  187. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/ExitPlanMode-tool_use.jsonl +0 -0
  188. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Glob-tool_result.json +0 -0
  189. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Glob-tool_result.jsonl +0 -0
  190. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Glob-tool_use.json +0 -0
  191. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Glob-tool_use.jsonl +0 -0
  192. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Grep-tool_result.json +0 -0
  193. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Grep-tool_result.jsonl +0 -0
  194. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Grep-tool_use.json +0 -0
  195. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Grep-tool_use.jsonl +0 -0
  196. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/KillShell-tool_result.json +0 -0
  197. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/KillShell-tool_result.jsonl +0 -0
  198. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/KillShell-tool_result_error.json +0 -0
  199. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/KillShell-tool_result_error.jsonl +0 -0
  200. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/KillShell-tool_use.json +0 -0
  201. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/KillShell-tool_use.jsonl +0 -0
  202. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/LS-tool_result.json +0 -0
  203. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/LS-tool_result.jsonl +0 -0
  204. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/LS-tool_use.json +0 -0
  205. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/LS-tool_use.jsonl +0 -0
  206. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/MultiEdit-tool_result.json +0 -0
  207. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/MultiEdit-tool_result.jsonl +0 -0
  208. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/MultiEdit-tool_result_error.json +0 -0
  209. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/MultiEdit-tool_result_error.jsonl +0 -0
  210. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/MultiEdit-tool_use.json +0 -0
  211. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/MultiEdit-tool_use.jsonl +0 -0
  212. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Read-tool_result.json +0 -0
  213. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Read-tool_result.jsonl +0 -0
  214. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Read-tool_result_error.json +0 -0
  215. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Read-tool_result_error.jsonl +0 -0
  216. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Read-tool_use.json +0 -0
  217. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Read-tool_use.jsonl +0 -0
  218. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Task-tool_result.json +0 -0
  219. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Task-tool_result.jsonl +0 -0
  220. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Task-tool_use.json +0 -0
  221. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Task-tool_use.jsonl +0 -0
  222. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/TodoWrite-tool_result.json +0 -0
  223. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/TodoWrite-tool_result.jsonl +0 -0
  224. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/TodoWrite-tool_use.json +0 -0
  225. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/TodoWrite-tool_use.jsonl +0 -0
  226. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebFetch-tool_result.json +0 -0
  227. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebFetch-tool_result.jsonl +0 -0
  228. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebFetch-tool_use.json +0 -0
  229. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebFetch-tool_use.jsonl +0 -0
  230. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebSearch-tool_result.json +0 -0
  231. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebSearch-tool_result.jsonl +0 -0
  232. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebSearch-tool_use.json +0 -0
  233. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebSearch-tool_use.jsonl +0 -0
  234. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Write-tool_result.json +0 -0
  235. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Write-tool_result.jsonl +0 -0
  236. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Write-tool_result_error.json +0 -0
  237. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Write-tool_result_error.jsonl +0 -0
  238. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Write-tool_use.json +0 -0
  239. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Write-tool_use.jsonl +0 -0
  240. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/exit_plan_mode-tool_result.json +0 -0
  241. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/exit_plan_mode-tool_result.jsonl +0 -0
  242. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/exit_plan_mode-tool_use.json +0 -0
  243. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/exit_plan_mode-tool_use.jsonl +0 -0
  244. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/bash_input.json +0 -0
  245. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/bash_input.jsonl +0 -0
  246. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/bash_output.json +0 -0
  247. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/bash_output.jsonl +0 -0
  248. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/command_output.json +0 -0
  249. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/command_output.jsonl +0 -0
  250. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/image.json +0 -0
  251. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/image.jsonl +0 -0
  252. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user.json +0 -0
  253. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user.jsonl +0 -0
  254. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user_command.json +0 -0
  255. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user_command.jsonl +0 -0
  256. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user_sidechain.json +0 -0
  257. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user_sidechain.jsonl +0 -0
  258. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user_slash_command.json +0 -0
  259. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user_slash_command.jsonl +0 -0
  260. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/README.md +0 -0
  261. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/collaboration/agent-tools.json +0 -0
  262. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/collaboration/thread-spawn.json +0 -0
  263. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/legacy/flat-rollout.md +0 -0
  264. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/lifecycle/turn-context.json +0 -0
  265. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/manifest.json +0 -0
  266. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/messages/environment-context.json +0 -0
  267. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/messages/user-shell-command.json +0 -0
  268. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/messages/visible-pair.json +0 -0
  269. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/reasoning/summary.json +0 -0
  270. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/session/session_meta.json +0 -0
  271. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/tools/async-command.json +0 -0
  272. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/tools/exec-wrapper.json +0 -0
  273. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/tools/function-call.json +0 -0
  274. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/tools/web-run.json +0 -0
  275. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages.md +0 -0
  276. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/rendering-architecture.md +0 -0
  277. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/tools-coverage.md +0 -0
  278. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/workflows.md +0 -0
  279. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/foldyard.local.toml.example +0 -0
  280. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/mise.toml +0 -0
  281. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/mkdocs.yml +0 -0
  282. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/pygments/__init__.pyi +0 -0
  283. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/pygments/formatter.pyi +0 -0
  284. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/pygments/formatters/__init__.pyi +0 -0
  285. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/pygments/lexer.pyi +0 -0
  286. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/pygments/lexers/__init__.pyi +0 -0
  287. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/pygments/util.pyi +0 -0
  288. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/quickjs.pyi +0 -0
  289. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/agent-hierarchies-design.md +0 -0
  290. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/archive-search-server.md +0 -0
  291. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/codex-backlog.md +0 -0
  292. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/identifier-consolidation.md +0 -0
  293. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/obsidian-friendly-output.md +0 -0
  294. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/parse-memory-spike.md +0 -0
  295. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/render-format-once.md +0 -0
  296. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/rendering-next.md +0 -0
  297. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/session-state-propagation.md +0 -0
  298. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/tool-renderer-plugins.md +0 -0
  299. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/tui-output-fixes.md +0 -0
  300. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/watch-mode.md +0 -0
  301. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/win-io.md +0 -0
  302. {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/xdist-import-cost.md +0 -0
@@ -0,0 +1,169 @@
1
+ name: Release
2
+
3
+ # Tag → build + wait for CI → (a maintainer approves) → publish to PyPI →
4
+ # GitHub Release.
5
+ # Adapted from foldyard's release workflow. `just release-prep` makes the
6
+ # commit and tag; `just release-push` pushes them, which starts this.
7
+ #
8
+ # The approval is the `pypi` environment's required reviewers (repo Settings →
9
+ # Environments → pypi): the publish job waits until any one of them approves
10
+ # the run, so a pushed tag on its own publishes nothing. The approval is only
11
+ # requested once CI on the release commit has passed (the `ci` job).
12
+ #
13
+ # Trusted publishing: PyPI trusts THIS workflow in THIS repo (PyPI project
14
+ # settings → Publishing → GitHub publisher: owner daaain, repo claude-code-log,
15
+ # workflow release.yml, environment pypi). No API token is stored anywhere;
16
+ # `uv publish` exchanges the job's OIDC token for a short-lived upload token.
17
+ # Build and publish are separate jobs so the publish job holds the id-token
18
+ # permission and nothing else, and never runs project code.
19
+ on:
20
+ push:
21
+ # Tags are bare versions (1.6.0, not v1.6.0), as every release so far.
22
+ tags: ["[0-9]+.[0-9]+.[0-9]+"]
23
+
24
+ # Least privilege by default; the two jobs that need more (publish: id-token,
25
+ # github-release: contents write) say so themselves and run no project code.
26
+ permissions:
27
+ contents: read
28
+
29
+ jobs:
30
+ # `just release-push` pushes main and the tag together, so CI (ci.yml) and
31
+ # this workflow start side by side on the same commit. Rather than re-run the
32
+ # whole matrix, wait for THAT run: publish needs this job, so reviewers are
33
+ # only asked to approve once the release commit's CI is green, and a red run
34
+ # fails the release before anyone is asked.
35
+ ci:
36
+ runs-on: ubuntu-latest
37
+ timeout-minutes: 90
38
+ permissions:
39
+ actions: read
40
+ contents: read
41
+ steps:
42
+ # A tag cut on a branch (or a commit squash-merged away) would release
43
+ # code main never had. CI only runs on pushes to main, so the wait below
44
+ # would refuse it too — but slowly, and only while ci.yml's trigger stays
45
+ # main-only. This says so directly. Tag rulesets can't express it: they
46
+ # govern who may push a tag, not which commit it names.
47
+ - name: The tagged commit must be on main
48
+ env:
49
+ GH_TOKEN: ${{ github.token }}
50
+ run: |
51
+ set -euo pipefail
52
+ # Comparing main...SHA: `identical` or `behind` means main contains it.
53
+ status="$(gh api "repos/$GITHUB_REPOSITORY/compare/main...$GITHUB_SHA" --jq .status)"
54
+ case "$status" in
55
+ identical|behind) echo "✓ $GITHUB_SHA is on main" ;;
56
+ *) echo "✗ tag $GITHUB_REF_NAME names $GITHUB_SHA, which is not on main ($status)"
57
+ exit 1 ;;
58
+ esac
59
+ - name: Wait for CI on the tagged commit to pass
60
+ env:
61
+ GH_TOKEN: ${{ github.token }}
62
+ run: |
63
+ set -euo pipefail
64
+ find_run() {
65
+ gh run list --repo "$GITHUB_REPOSITORY" --workflow ci.yml --commit "$GITHUB_SHA" \
66
+ --event push --limit 1 --json databaseId --jq '.[0].databaseId // empty'
67
+ }
68
+ # The CI run can register a moment after this one does.
69
+ for _ in $(seq 30); do
70
+ run_id="$(find_run)"
71
+ [ -n "$run_id" ] && break
72
+ sleep 10
73
+ done
74
+ if [ -z "${run_id:-}" ]; then
75
+ echo "✗ no CI run for $GITHUB_SHA — release a commit that was pushed to main"
76
+ exit 1
77
+ fi
78
+ echo "Waiting on CI run $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$run_id"
79
+ gh run watch "$run_id" --repo "$GITHUB_REPOSITORY" --exit-status --interval 30 > /dev/null \
80
+ || { echo "✗ CI failed on $GITHUB_SHA — fix it and release the next version"; exit 1; }
81
+ echo "✓ CI passed"
82
+
83
+ build:
84
+ runs-on: ubuntu-latest
85
+ timeout-minutes: 10
86
+ steps:
87
+ - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6.1.0
88
+ with:
89
+ persist-credentials: false
90
+ - uses: astral-sh/setup-uv@v8.2.0
91
+ # The same number is written in four places: the tag, pyproject.toml,
92
+ # uv.lock (it records the project's own version) and CHANGELOG.md.
93
+ # Failing here costs a re-tag; failing after publish costs the version
94
+ # number forever, since PyPI never lets one be reused.
95
+ - name: Tag, pyproject, uv.lock and CHANGELOG must agree
96
+ run: |
97
+ set -euo pipefail
98
+ tag="$GITHUB_REF_NAME"
99
+ version="$(uv version --short)"
100
+ if [ "$tag" != "$version" ]; then
101
+ echo "✗ tag $tag does not match [project].version = $version — bump pyproject first"
102
+ exit 1
103
+ fi
104
+ locked="$(awk '/^name = "claude-code-log"$/{getline; print}' uv.lock | sed -n 's/^version = "\(.*\)"$/\1/p')"
105
+ if [ "$locked" != "$version" ]; then
106
+ echo "✗ uv.lock records claude-code-log $locked, pyproject says $version — run \`uv lock\`"
107
+ exit 1
108
+ fi
109
+ - run: uv build
110
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
111
+ with:
112
+ name: dist
113
+ path: dist/
114
+ if-no-files-found: error
115
+ # The GitHub Release's notes: this version's CHANGELOG section, extracted
116
+ # HERE (the job that already runs project code, read-only) so the job
117
+ # holding contents:write runs none. A missing section fails the run.
118
+ # Its own artifact, because `uv publish` uploads everything in dist/.
119
+ - name: Release notes from CHANGELOG.md
120
+ run: |
121
+ set -euo pipefail
122
+ mkdir notes
123
+ python3 scripts/release_notes.py "$GITHUB_REF_NAME" > notes/notes.md
124
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
125
+ with:
126
+ name: notes
127
+ path: notes/
128
+ if-no-files-found: error
129
+
130
+ publish:
131
+ needs: [ci, build]
132
+ runs-on: ubuntu-latest
133
+ timeout-minutes: 10
134
+ environment: pypi
135
+ permissions:
136
+ id-token: write
137
+ steps:
138
+ - uses: astral-sh/setup-uv@v8.2.0
139
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
140
+ with:
141
+ name: dist
142
+ path: dist/
143
+ - run: uv publish
144
+
145
+ # After PyPI took it, never before: a GitHub Release for a version PyPI
146
+ # refused would advertise one nobody can install. The wheel and sdist ride
147
+ # along, byte-identical to what PyPI has.
148
+ github-release:
149
+ needs: publish
150
+ runs-on: ubuntu-latest
151
+ timeout-minutes: 5
152
+ permissions:
153
+ contents: write
154
+ steps:
155
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
156
+ with:
157
+ name: dist
158
+ path: dist/
159
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
160
+ with:
161
+ name: notes
162
+ path: notes/
163
+ - name: Create the GitHub Release
164
+ env:
165
+ GH_TOKEN: ${{ github.token }}
166
+ run: |
167
+ set -euo pipefail
168
+ gh release create "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --verify-tag \
169
+ --title "Release $GITHUB_REF_NAME" --notes-file notes/notes.md dist/*
@@ -6,6 +6,28 @@ 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.7.0] - 2026-10-05
10
+
11
+ ### Changed
12
+
13
+ - **(Claude) Upgrade wenmode to 0.15.2 and bump to 1.7.0 (#340)**
14
+ - **Release to PyPI from a tag-driven, maintainer-approved workflow (#341)**
15
+ - **(Claude) Show the logical-parent arrow on a /compact boundary's uuid line (#338)**
16
+ - **(Claude) Drop the host icon before a tool_result title that has its own (#337)**
17
+ - **Keep a Markdown message's body when its title is empty (#336)**
18
+ - **fix(search): report an unreadable cache as such, not as a missing FTS5 (#334)**
19
+ - **Continue the rewind branch across a /compact boundary (#331)**
20
+ - **Run the fail-fast just ci steps before the test suite**
21
+ - **Switch the Markdown engine from mistune to wenmode (#329)**
22
+ - **Resolve commit SHAs from one rev-list per repository (#330)**
23
+ - **Render peer agent messages as teammate cards instead of steering (#309) (#328)**
24
+ - **Apply the cache's write pragmas to every writing connection (#326)**
25
+ - **Link teammate subagent transcripts spawned by the Agent tool (#316)**
26
+ - **Re-parse cached entries when the shape of what we cache changes (#320) (#322)**
27
+ - **Make watch ticks cheap (#321)**
28
+ - **Update some README bits**
29
+
30
+
9
31
  ## [1.6.0] - 2026-08-31
10
32
 
11
33
  ### Changed
@@ -16,7 +16,7 @@ This tool processes Claude Code transcript files (stored as JSONL) and generates
16
16
  - **Runtime Message Filtering**: JavaScript-powered filtering to show/hide message types
17
17
  - **Interactive Timeline**: vis-timeline visualization with click-to-scroll navigation
18
18
  - **Date Range Filtering**: Filter messages using natural language (e.g., "today", "yesterday")
19
- - **Markdown Rendering**: Server-side markdown with syntax highlighting using mistune
19
+ - **Markdown Rendering**: Server-side markdown with syntax highlighting using wenmode
20
20
 
21
21
  ## Usage
22
22
 
@@ -64,7 +64,7 @@ The project uses:
64
64
  - Textual for Terminal User Interface
65
65
  - Pydantic for data modeling and validation
66
66
  - Jinja2 for HTML template rendering
67
- - mistune for Markdown rendering
67
+ - wenmode for Markdown rendering
68
68
  - dateparser for natural language date parsing
69
69
 
70
70
  ### Dependency Management
@@ -171,14 +171,20 @@ uv run pytest test/test_snapshot_html.py -n0
171
171
  # all pass → the committed .ambr matches the render (not a raced file)
172
172
  ```
173
173
 
174
- When you do intend to regenerate, run `--snapshot-update` serially; a purely
175
- additive result (`+N/-0`, e.g. "8 snapshots passed. 1 snapshot generated.")
176
- is the healthy signature:
174
+ When you do intend to regenerate, use the recipe — it purges stale
175
+ bytecode, regenerates serially, and then re-runs read-only to prove the
176
+ file it just wrote is what the code renders:
177
177
 
178
178
  ```bash
179
- uv run pytest test/test_snapshot_html.py -n0 --snapshot-update
179
+ just update-snapshot
180
180
  ```
181
181
 
182
+ A purely additive result (`+N/-0`, e.g. "8 snapshots passed. 1 snapshot
183
+ generated.") is the healthy signature. The recipe exists because doing
184
+ only part of this by hand is what produced both incidents above; reach
185
+ for a bare `pytest --snapshot-update` only if you have a reason to, and
186
+ keep the `-n0`.
187
+
182
188
  When snapshot tests fail:
183
189
  1. Review the diff to verify changes are intentional
184
190
  2. If intentional, run `--snapshot-update` (serially) to accept new output
@@ -477,29 +483,67 @@ The cache automatically rebuilds when source files change or cache schema versio
477
483
 
478
484
  ## Release Process
479
485
 
480
- The project uses automated releases with semantic versioning.
486
+ Releases are tag-driven: pushing a version tag runs
487
+ [`.github/workflows/release.yml`](.github/workflows/release.yml), which
488
+ publishes to PyPI only after a maintainer approves it.
481
489
 
482
- ### Quick Release
490
+ ### Cutting a release
483
491
 
484
492
  ```bash
485
- # Bump version and create release (patch/minor/major)
486
- just release-prep patch # Bug fixes
487
- just release-prep minor # New features
488
- just release-prep major # Breaking changes
489
-
490
- # Or specify exact version
491
- just release-prep 0.4.3
493
+ # On main, with a clean tree: bump version, update uv.lock and CHANGELOG.md,
494
+ # commit and tag — all local (patch/minor/major, or an exact version)
495
+ just release-prep minor
492
496
 
493
- # Preview what would be released
497
+ # Check the notes the GitHub Release will carry, and the commit
494
498
  just release-preview
499
+ git show --stat HEAD
495
500
 
496
- # Push to PyPI and create GitHub release
501
+ # Push main and the tag together (--atomic), which starts the workflow
497
502
  just release-push
498
503
  ```
499
504
 
500
- ### GitHub Release Only
501
-
502
- ```bash
503
- just github-release # For latest tag
504
- just github-release 0.4.2 # For specific version
505
- ```
505
+ Until the push, `git tag -d X.Y.Z && git reset --hard HEAD~1` undoes it.
506
+
507
+ ### What the workflow does
508
+
509
+ 1. **ci** — refuses a tag whose commit isn't on `main`, then waits for the CI
510
+ run (`ci.yml`) that the same push started on the release commit, and fails
511
+ the release if it fails. Nothing is re-run.
512
+ 2. **build** — in parallel, checks that the tag, `[project].version`,
513
+ `uv.lock`'s own `claude-code-log` entry and a `## [X.Y.Z]` CHANGELOG
514
+ section all agree, then runs `uv build` and extracts the release notes
515
+ (`scripts/release_notes.py`).
516
+ 3. **publish** — once both pass, waits in the `pypi` environment for a
517
+ required reviewer to **approve the deployment** in the run's page on
518
+ GitHub, then `uv publish`es.
519
+ 4. **github-release** — once PyPI has it, creates the GitHub Release from the
520
+ notes, with the same wheel and sdist attached.
521
+
522
+ Publishing uses PyPI **trusted publishing**: PyPI trusts this workflow and the
523
+ `pypi` environment, so no API token exists anywhere. A version, once
524
+ published, is burned — PyPI refuses re-uploads even after a delete, so a
525
+ botched release is fixed by releasing the next number.
526
+
527
+ `just publish` is the manual escape hatch for when GitHub is down; it needs
528
+ PyPI credentials (e.g. `UV_PUBLISH_TOKEN`) locally.
529
+
530
+ ### Who can release
531
+
532
+ Pushing a tag needs write access, and on this personally-owned repo every
533
+ collaborator has it — so collaborators *are* the maintainers who can start a
534
+ release. Publishing additionally needs one of the `pypi` environment's
535
+ required reviewers to approve. Before adding a collaborator who shouldn't
536
+ release, note that write access is all-or-nothing here: per-role tag
537
+ restrictions need an organisation-owned repo.
538
+
539
+ ### One-time setup
540
+
541
+ - **PyPI** → project settings → Publishing → add a GitHub publisher: owner
542
+ `daaain`, repo `claude-code-log`, workflow `release.yml`, environment `pypi`.
543
+ - **GitHub** → Settings → Environments → `pypi`: add the maintainers as
544
+ required reviewers (any one approval releases), and limit deployments to
545
+ tags matching `[0-9]*.[0-9]*.[0-9]*`.
546
+ - **GitHub** → Settings → Rules → Rulesets: the "release tags are immutable"
547
+ tag ruleset blocks deleting, moving or force-pushing `refs/tags/[0-9]*`, so
548
+ a published version's tag always names what was released. Releasing a
549
+ botched version again means the next number, which PyPI requires anyway.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: claude-code-log
3
- Version: 1.6.0
3
+ Version: 1.7.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
@@ -14,13 +14,13 @@ Requires-Dist: click>=8.3.0
14
14
  Requires-Dist: dateparser>=1.2.2
15
15
  Requires-Dist: gitpython>=3.1.52
16
16
  Requires-Dist: jinja2>=3.1.6
17
- Requires-Dist: mistune>=3.1.4
18
17
  Requires-Dist: packaging>=25.0
19
18
  Requires-Dist: pydantic>=2.12.0
20
19
  Requires-Dist: pygments>=2.19.2
21
20
  Requires-Dist: quickjs-ng<0.16,>=0.15.1.1
22
21
  Requires-Dist: textual>=6.5.0
23
22
  Requires-Dist: toml>=0.10.2
23
+ Requires-Dist: wenmode<0.16,>=0.15.2
24
24
  Description-Content-Type: text/markdown
25
25
 
26
26
  # Claude Code Log
@@ -73,7 +73,7 @@ uvx claude-code-log@latest --open-browser
73
73
  - **Date Range Filtering**: Filter messages by date range using natural language (e.g., "today", "yesterday", "last week")
74
74
  - **Rich Message Types**: Support for user/assistant messages, tool use/results, thinking content, images
75
75
  - **System Command Visibility**: Show system commands (like `init`) in expandable details with structured parsing
76
- - **Markdown Rendering**: Server-side markdown rendering with syntax highlighting using mistune
76
+ - **Markdown Rendering**: Server-side markdown rendering with syntax highlighting using wenmode
77
77
  - **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
78
78
  - **Floating Navigation**: Always-available back-to-top button and filter controls
79
79
  - **CLI Interface**: Simple command-line tool using Click
@@ -256,7 +256,7 @@ When processing all projects, the tool generates:
256
256
  - **Session Navigation**: Interactive table of contents with session summaries and timestamp ranges
257
257
  - **Token Usage Display**: Individual message and session-level token consumption tracking
258
258
  - **Syntax Highlighting**: Code blocks properly formatted with markdown rendering
259
- - **Markdown Support**: Server-side rendering with mistune including:
259
+ - **Markdown Support**: Server-side rendering with wenmode including:
260
260
  - Headers, lists, emphasis, strikethrough
261
261
  - Code blocks and inline code
262
262
  - Links, images, and tables
@@ -279,18 +279,26 @@ Markdown export provides a lightweight, portable alternative to HTML:
279
279
 
280
280
  ## Installation
281
281
 
282
- Install using pip:
282
+ The recommended way is installing as a `uv` tool:
283
283
 
284
284
  ```bash
285
- pip install claude-code-log
285
+ uv tool install claude-code-log
286
286
  ```
287
287
 
288
- Or run directly with uvx (no separate installation step required):
288
+ This will create a `claude-code-log` binary that you can call directly.
289
+
290
+ Or run directly with `uvx` (no separate installation step required):
289
291
 
290
292
  ```bash
291
293
  uvx claude-code-log@latest
292
294
  ```
293
295
 
296
+ Alternatively, if you prefer, install using `pip`:
297
+
298
+ ```bash
299
+ pip install claude-code-log
300
+ ```
301
+
294
302
  Or install from source:
295
303
 
296
304
  ```bash
@@ -298,6 +306,8 @@ git clone https://github.com/daaain/claude-code-log.git
298
306
  cd claude-code-log
299
307
  uv sync
300
308
  uv run claude-code-log
309
+ # or if you want `claude-code-log` binary that works everywhere:
310
+ uv tool install --editable .
301
311
  ```
302
312
 
303
313
  ## Contributing
@@ -328,6 +338,4 @@ Cross-platform (macOS and Windows/MSYS).
328
338
  - feed the filtered user messages to headless claude CLI to distill the user intent from the session
329
339
  - filter message type on Python (CLI) side too, not just UI
330
340
  - add minimalist theme and make it light + dark; animate gradient background in fancy theme
331
- - do we need special handling for hooks?
332
- - make processing parallel, currently we only use 1 CPU (core) and it's slow
333
341
  - merge git worktree directories
@@ -48,7 +48,7 @@ uvx claude-code-log@latest --open-browser
48
48
  - **Date Range Filtering**: Filter messages by date range using natural language (e.g., "today", "yesterday", "last week")
49
49
  - **Rich Message Types**: Support for user/assistant messages, tool use/results, thinking content, images
50
50
  - **System Command Visibility**: Show system commands (like `init`) in expandable details with structured parsing
51
- - **Markdown Rendering**: Server-side markdown rendering with syntax highlighting using mistune
51
+ - **Markdown Rendering**: Server-side markdown rendering with syntax highlighting using wenmode
52
52
  - **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
53
53
  - **Floating Navigation**: Always-available back-to-top button and filter controls
54
54
  - **CLI Interface**: Simple command-line tool using Click
@@ -231,7 +231,7 @@ When processing all projects, the tool generates:
231
231
  - **Session Navigation**: Interactive table of contents with session summaries and timestamp ranges
232
232
  - **Token Usage Display**: Individual message and session-level token consumption tracking
233
233
  - **Syntax Highlighting**: Code blocks properly formatted with markdown rendering
234
- - **Markdown Support**: Server-side rendering with mistune including:
234
+ - **Markdown Support**: Server-side rendering with wenmode including:
235
235
  - Headers, lists, emphasis, strikethrough
236
236
  - Code blocks and inline code
237
237
  - Links, images, and tables
@@ -254,18 +254,26 @@ Markdown export provides a lightweight, portable alternative to HTML:
254
254
 
255
255
  ## Installation
256
256
 
257
- Install using pip:
257
+ The recommended way is installing as a `uv` tool:
258
258
 
259
259
  ```bash
260
- pip install claude-code-log
260
+ uv tool install claude-code-log
261
261
  ```
262
262
 
263
- Or run directly with uvx (no separate installation step required):
263
+ This will create a `claude-code-log` binary that you can call directly.
264
+
265
+ Or run directly with `uvx` (no separate installation step required):
264
266
 
265
267
  ```bash
266
268
  uvx claude-code-log@latest
267
269
  ```
268
270
 
271
+ Alternatively, if you prefer, install using `pip`:
272
+
273
+ ```bash
274
+ pip install claude-code-log
275
+ ```
276
+
269
277
  Or install from source:
270
278
 
271
279
  ```bash
@@ -273,6 +281,8 @@ git clone https://github.com/daaain/claude-code-log.git
273
281
  cd claude-code-log
274
282
  uv sync
275
283
  uv run claude-code-log
284
+ # or if you want `claude-code-log` binary that works everywhere:
285
+ uv tool install --editable .
276
286
  ```
277
287
 
278
288
  ## Contributing
@@ -303,6 +313,4 @@ Cross-platform (macOS and Windows/MSYS).
303
313
  - feed the filtered user messages to headless claude CLI to distill the user intent from the session
304
314
  - filter message type on Python (CLI) side too, not just UI
305
315
  - add minimalist theme and make it light + dark; animate gradient background in fancy theme
306
- - do we need special handling for hooks?
307
- - make processing parallel, currently we only use 1 CPU (core) and it's slow
308
316
  - merge git worktree directories