Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ dependencies = [
"jinja2>=3.1.6",
"mistune>=3.1.4",
"toml>=0.10.2",
"textual==6.5.0",
"textual>=6.5.0",

@coderabbitai coderabbitai Bot Jun 3, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Verify that Select widget (affected by Select.BLANK → Select.NULL breaking change) is not used

echo "=== Checking for Select widget usage ==="
rg -nP --type=py '\bSelect\b' -C3

echo -e "\n=== Checking for Select.BLANK usage ==="
rg -nP --type=py 'Select\.BLANK' -C3

Repository: daaain/claude-code-log

Length of output: 7386


🏁 Script executed:

#!/bin/bash
# Description: Check screen dismissal patterns to verify the dismissing non-active screen breaking change impact

echo "=== Checking for screen dismiss() calls ==="
rg -nP --type=py '\.dismiss\(' -C3

echo -e "\n=== Checking for ModalScreen usage ==="
rg -nP --type=py 'ModalScreen' -C3

Repository: daaain/claude-code-log

Length of output: 6363


🌐 Web query:

Textual Python TUI library changelog breaking changes since version 8.0.0

💡 Result:

As of June 3, 2026, version 8.0.0 is a historical release of the Textual library (released February 16, 2026) [1][2]. The primary breaking change introduced in version 8.0.0 was the renaming of the Select.BLANK constant to Select.NULL to resolve a naming conflict with the newly introduced Widget.BLANK Classvar [1][3][4]. Additional behavioral changes noted in the 8.0.0 release that may impact existing applications include: 1. Screen Dismissal Behavior: Dismissing a non-active screen is no longer a no-op (no-operation) and no longer triggers a warning [1][3]. While the dismissal still functions, users should be aware that the screen may not update if the current mode is not active [1][5]. 2. Screen Switching Delay: A 50ms delay was added when switching screens to allow for state updates and to prevent visual flickering (janky flash) of old content [1][3]. Since version 8.0.0, there have been no further breaking changes documented in the official changelog up to version 8.2.7 (current as of May 2026) [2][6]. Subsequent releases (8.1.0 through 8.2.7) have primarily focused on additive features, performance improvements (such as smooth scrolling for large documents), and bug fixes [2][6].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Search for Textual Select widget imports/usage ==="
rg -n --type=py "textual\.widgets.*Select|from textual\.widgets import .*Select|Select\(" .

echo "=== Search for Select.* enum/constant usage (other than Select.BLANK) ==="
rg -n --type=py "Select\.[A-Z0-9_]+" .

echo "=== Search for dismiss() calls on anything other than 'self' ==="
rg -n --type=py "\b[A-Za-z_][A-Za-z0-9_]*\.dismiss\(" .

echo "=== Search for 'dismiss(' within ModalScreen subclasses ==="
rg -n --type=py "class .*ModalScreen.*:[\s\S]{0,200}?\n\s+def .*action_.*|class .*ModalScreen.*|self\.dismiss\(" claude_code_log/tui.py

Repository: daaain/claude-code-log

Length of output: 121


🏁 Script executed:

#!/bin/bash
set +euo pipefail

echo "=== Search for Textual Select widget imports/usage ==="
rg -n --type=py "textual\.widgets.*Select|from textual\.widgets import .*Select|Select\(" . || true

echo "=== Search for Select.* enum/constant usage (other than Select.BLANK) ==="
rg -n --type=py "Select\.[A-Z0-9_]+" . || true

echo "=== Search for dismiss() calls on anything other than 'self' ==="
rg -n --type=py "\b[A-Za-z_][A-Za-z0-9_]*\.dismiss\(" . || true

echo "=== Search for 'dismiss(' within ModalScreen subclasses ==="
rg -n --type=py "class .*ModalScreen.*:.*(\n.*){0,80}self\.dismiss\(" claude_code_log/tui.py || true

Repository: daaain/claude-code-log

Length of output: 1298


Add an upper bound to the textual dependency

  • v8.0.0’s breaking changes don’t appear to affect this tool: no textual.widgets.Select/Select.* usage found in the codebase, and dismiss() calls are limited to self.dismiss(...) within ModalScreen action methods.
  • Still, textual>=6.5.0 with no upper bound lets future major releases break the app; constrain it (e.g., <9.0).
Suggested constraint
-    "textual>=6.5.0",
+    "textual>=6.5.0,<9.0",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"textual>=6.5.0",
"textual>=6.5.0,<9.0",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pyproject.toml` at line 25, Update the textual dependency entry in
pyproject.toml to add an upper bound to prevent future breaking major releases;
replace the existing "textual>=6.5.0" constraint with a ranged constraint such
as "textual>=6.5.0,<9.0" so the project still receives minor/patch updates but
is protected from incompatible v9+ changes.

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure if I want to add a hard upper bound, isn't it better for the library consumers to decide? We have a uv.lock and if there's a breakage later we can see how to deal with it.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@daaain, that's a fair point. For an application shipped with a uv.lock, the lockfile already pins exact versions for reproducible installs, so an upper bound in the constraint adds less value than it would for a pure library. The PR's goal of easing Nixpkgs packaging also aligns better with a looser bound. Happy to leave it as >=6.5.0.

( ˶ᵔ ᵕ ᵔ˶ )


✏️ Learnings added
Learnt from: daaain
Repo: daaain/claude-code-log PR: 196
File: pyproject.toml:25-25
Timestamp: 2026-06-03T18:35:03.078Z
Learning: In the `claude-code-log` project (`pyproject.toml`), the maintainer prefers open-ended minimum-version constraints (e.g., `>=x.y.z`) over adding upper bounds for dependencies. They rely on `uv.lock` for reproducible pinning and prefer to let library consumers (e.g., Nixpkgs) decide compatibility. Do not suggest adding upper bounds to dependency constraints in this project.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

"packaging>=25.0",
"gitpython>=3.1.45",
"pygments>=2.19.2",
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading