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.
- claude_code_log-1.7.0/.github/workflows/release.yml +169 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/CHANGELOG.md +22 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/CLAUDE.md +1 -1
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/CONTRIBUTING.md +66 -22
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/PKG-INFO +17 -9
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/README.md +15 -7
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/cache.py +357 -53
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/cli.py +70 -10
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/converter.py +277 -31
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/dag.py +76 -4
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/attachment_factory.py +51 -2
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/system_factory.py +6 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/teammate_factory.py +4 -4
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/git_remote.py +210 -65
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/renderer.py +3 -3
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/global_styles.css +16 -1
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/transcript.html +2 -2
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/utils.py +178 -110
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/markdown/renderer.py +65 -60
- claude_code_log-1.7.0/claude_code_log/markdown_plugins.py +367 -0
- claude_code_log-1.7.0/claude_code_log/migrations/013_html_cache_combined_link.sql +40 -0
- claude_code_log-1.7.0/claude_code_log/migrations/014_cached_file_content_version.sql +30 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/runner.py +60 -3
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/models.py +13 -1
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/render_cache.py +1 -1
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/renderer.py +49 -1
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/search.py +47 -6
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/watch.py +48 -10
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/application_model.md +163 -3
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/dag.md +61 -2
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/implementing-a-tool-renderer.md +1 -1
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/plugins.md +11 -10
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/teammates.md +20 -3
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/foldyard.toml +2 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/justfile +44 -127
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/pyproject.toml +2 -2
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/uv.lock +12 -15
- claude_code_log-1.7.0/work/agent-message-origin.md +180 -0
- claude_code_log-1.7.0/work/watch-live-sessions.md +278 -0
- claude_code_log-1.7.0/work/wenmode-evaluation.md +647 -0
- claude_code_log-1.6.0/claude_code_log/markdown_plugins.py +0 -440
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/settings.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/foldyard/SKILL.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/foldyard/references/egress-and-capture.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/foldyard/references/posture-and-credentials.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/foldyard/references/when-a-change-doesnt-take.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/tool-renderer/SKILL.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/update-tools-coverage/SKILL.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/update-tools-coverage/check_codex_coverage.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.claude/skills/update-tools-coverage/check_coverage.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.editorconfig +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.github/workflows/ci.yml +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.github/workflows/docs.yml +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.gitignore +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/.vscode/settings.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/LICENSE +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/__init__.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/api.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/builtin_plugins/__init__.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/builtin_plugins/codex_docs.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/discovery.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/entry_store.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/__init__.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/agent_metadata_factory.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/assistant_factory.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/meta_factory.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/priorities.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/task_notification_factory.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/tool_factory.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/transcript_factory.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/factories/user_factory.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/fragment_store.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/__init__.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/ansi_colors.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/assistant_formatters.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/async_formatter.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/renderer_code.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/system_formatters.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/teammate_formatter.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/archive_search.html +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/archive_search_link.html +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/edit_diff_styles.css +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/filter_styles.css +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/live_update.js +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/message_styles.css +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/page_nav_styles.css +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/project_card_styles.css +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/pygments_styles.css +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/search.html +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/search_inline.html +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/search_styles.css +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/session_nav.html +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/session_nav_styles.css +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/teammate_styles.css +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/timeline.html +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/timeline_styles.css +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/timezone_converter.js +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/components/todo_styles.css +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/templates/index.html +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/tool_formatters.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/html/user_formatters.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/image_export.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/json/__init__.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/json/renderer.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/markdown/__init__.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/001_initial_schema.sql +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/002_html_cache.sql +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/003_html_pagination.sql +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/004_html_pagination_variant.sql +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/005_session_team_name.sql +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/006_session_ai_title.sql +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/007_subagents_fingerprint.sql +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/008_session_sidecar.sql +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/009_sessions_hidden.sql +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/010_sessions_residual_count.sql +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/011_cached_file_size.sql +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/012_message_lookup_indexes.sql +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/migrations/__init__.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/parser.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/plugins.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/__init__.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/agy.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/base.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/claude.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/codex.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/codex_messages.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/codex_quickjs.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/codex_tools.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/codex_web.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/providers/registry.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/py.typed +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/render_dispatch.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/render_pool.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/renderer_timings.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/server.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/tui.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/utils.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/claude_code_log/workflow.py +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/agents.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/css-classes.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/message-hierarchy.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/assistant/assistant.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/assistant/assistant.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/assistant/assistant_sidechain.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/assistant/assistant_sidechain.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/assistant/thinking.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/assistant/thinking.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/file_history_snapshot.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/file_history_snapshot.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/queue_operation.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/queue_operation.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/summary.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/summary.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/system_info.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/system/system_info.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Artifact-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Artifact-tool_result.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Artifact-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Artifact-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/AskUserQuestion-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/AskUserQuestion-tool_result.jsonl +0 -0
- {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
- {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
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/AskUserQuestion-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/AskUserQuestion-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Bash-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Bash-tool_result.jsonl +0 -0
- {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
- {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
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Bash-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Bash-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/BashOutput-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/BashOutput-tool_result.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/BashOutput-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/BashOutput-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Edit-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Edit-tool_result.jsonl +0 -0
- {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
- {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
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Edit-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Edit-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/ExitPlanMode-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/ExitPlanMode-tool_result.jsonl +0 -0
- {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
- {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
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/ExitPlanMode-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/ExitPlanMode-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Glob-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Glob-tool_result.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Glob-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Glob-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Grep-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Grep-tool_result.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Grep-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Grep-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/KillShell-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/KillShell-tool_result.jsonl +0 -0
- {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
- {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
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/KillShell-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/KillShell-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/LS-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/LS-tool_result.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/LS-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/LS-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/MultiEdit-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/MultiEdit-tool_result.jsonl +0 -0
- {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
- {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
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/MultiEdit-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/MultiEdit-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Read-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Read-tool_result.jsonl +0 -0
- {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
- {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
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Read-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Read-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Task-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Task-tool_result.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Task-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Task-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/TodoWrite-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/TodoWrite-tool_result.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/TodoWrite-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/TodoWrite-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebFetch-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebFetch-tool_result.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebFetch-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebFetch-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebSearch-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebSearch-tool_result.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebSearch-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/WebSearch-tool_use.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Write-tool_result.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Write-tool_result.jsonl +0 -0
- {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
- {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
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Write-tool_use.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/tools/Write-tool_use.jsonl +0 -0
- {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
- {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
- {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
- {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
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/bash_input.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/bash_input.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/bash_output.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/bash_output.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/command_output.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/command_output.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/image.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/image.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user_command.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user_command.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user_sidechain.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user_sidechain.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user_slash_command.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/claude-code/user/user_slash_command.jsonl +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/README.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/collaboration/agent-tools.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/collaboration/thread-spawn.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/legacy/flat-rollout.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/lifecycle/turn-context.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/manifest.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/messages/environment-context.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/messages/user-shell-command.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/messages/visible-pair.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/reasoning/summary.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/session/session_meta.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/tools/async-command.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/tools/exec-wrapper.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/tools/function-call.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages/codex/tools/web-run.json +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/messages.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/rendering-architecture.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/tools-coverage.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/dev-docs/workflows.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/foldyard.local.toml.example +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/mise.toml +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/mkdocs.yml +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/pygments/__init__.pyi +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/pygments/formatter.pyi +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/pygments/formatters/__init__.pyi +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/pygments/lexer.pyi +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/pygments/lexers/__init__.pyi +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/pygments/util.pyi +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/stubs/quickjs.pyi +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/agent-hierarchies-design.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/archive-search-server.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/codex-backlog.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/identifier-consolidation.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/obsidian-friendly-output.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/parse-memory-spike.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/render-format-once.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/rendering-next.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/session-state-propagation.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/tool-renderer-plugins.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/tui-output-fixes.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/watch-mode.md +0 -0
- {claude_code_log-1.6.0 → claude_code_log-1.7.0}/work/win-io.md +0 -0
- {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
|
|
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
|
-
-
|
|
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,
|
|
175
|
-
|
|
176
|
-
is the
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
490
|
+
### Cutting a release
|
|
483
491
|
|
|
484
492
|
```bash
|
|
485
|
-
#
|
|
486
|
-
|
|
487
|
-
just release-prep minor
|
|
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
|
-
#
|
|
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
|
|
501
|
+
# Push main and the tag together (--atomic), which starts the workflow
|
|
497
502
|
just release-push
|
|
498
503
|
```
|
|
499
504
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
282
|
+
The recommended way is installing as a `uv` tool:
|
|
283
283
|
|
|
284
284
|
```bash
|
|
285
|
-
|
|
285
|
+
uv tool install claude-code-log
|
|
286
286
|
```
|
|
287
287
|
|
|
288
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
257
|
+
The recommended way is installing as a `uv` tool:
|
|
258
258
|
|
|
259
259
|
```bash
|
|
260
|
-
|
|
260
|
+
uv tool install claude-code-log
|
|
261
261
|
```
|
|
262
262
|
|
|
263
|
-
|
|
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
|