tasktree-manager 2.6.0__tar.gz → 2.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 (62) hide show
  1. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/CHANGELOG.md +10 -0
  2. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/PKG-INFO +1 -1
  3. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/README.md +4 -4
  4. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/docs/configuration.md +32 -20
  5. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/docs/user-guide.md +3 -2
  6. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/pyproject.toml +1 -1
  7. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/_version.py +2 -2
  8. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/app.py +181 -104
  9. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/services/config.py +5 -3
  10. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/services/task_manager.py +77 -32
  11. tasktree_manager-2.7.0/tasktree_manager/themes.py +203 -0
  12. tasktree_manager-2.7.0/tasktree_manager/widgets/app_header.py +64 -0
  13. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/create_modal.py +31 -10
  14. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/setup_modal.py +14 -6
  15. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/status_panel.py +14 -16
  16. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/worktree_list.py +1 -1
  17. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/test_app.py +3 -1
  18. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/test_config.py +1 -1
  19. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/test_modals.py +53 -0
  20. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/test_task_manager.py +135 -0
  21. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/SKILL.md +0 -0
  22. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/README.md +0 -0
  23. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/dashboard_app.py +0 -0
  24. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/data_viewer.py +0 -0
  25. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/todo_app.py +0 -0
  26. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/worker_demo.py +0 -0
  27. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/references/layouts.md +0 -0
  28. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/references/official-guides-index.md +0 -0
  29. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/references/styling.md +0 -0
  30. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/references/widgets.md +0 -0
  31. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.github/templates/CHANGELOG.md.j2 +0 -0
  32. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.github/workflows/ci.yml +0 -0
  33. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.github/workflows/release.yml +0 -0
  34. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/.gitignore +0 -0
  35. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/CONTRIBUTING.md +0 -0
  36. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/LICENSE +0 -0
  37. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/OPENSPEC.md +0 -0
  38. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/ROADMAP.md +0 -0
  39. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/docs/claude-code-integration-spec.md +0 -0
  40. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/docs/installation.md +0 -0
  41. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/docs/troubleshooting.md +0 -0
  42. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/mise.toml +0 -0
  43. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/scripts/bump_version.py +0 -0
  44. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/__init__.py +0 -0
  45. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/commands.py +0 -0
  46. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/services/__init__.py +0 -0
  47. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/services/claude_hooks.py +0 -0
  48. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/services/git_ops.py +0 -0
  49. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/services/models.py +0 -0
  50. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/__init__.py +0 -0
  51. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/messages_panel.py +0 -0
  52. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/task_list.py +0 -0
  53. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/__init__.py +0 -0
  54. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/conftest.py +0 -0
  55. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/test_claude_hooks.py +0 -0
  56. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/test_commands.py +0 -0
  57. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/test_git_ops.py +0 -0
  58. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/test_integration_git.py +0 -0
  59. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/test_memory.py +0 -0
  60. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/test_messages_panel.py +0 -0
  61. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/test_setup_modal.py +0 -0
  62. {tasktree_manager-2.6.0 → tasktree_manager-2.7.0}/tests/test_status_panel.py +0 -0
@@ -15,6 +15,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
15
15
  - Git hooks support
16
16
  - Custom task metadata
17
17
 
18
+ ## [2.7.0] - 2026-07-13
19
+
20
+ ### Added
21
+ - **ui**: Design-system themes, layered panels, theme cycling
22
+
23
+ ### Fixed
24
+ - **claude**: Copy repo CLAUDE.md into worktrees instead of stub
25
+ - **worktree**: Base new worktrees on origin base branch
26
+
27
+
18
28
  ## [2.6.0] - 2026-07-13
19
29
 
20
30
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tasktree-manager
3
- Version: 2.6.0
3
+ Version: 2.7.0
4
4
  Summary: TUI application for managing worktree-based tasks
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.10
@@ -14,7 +14,7 @@
14
14
  - 🌳 **Git Worktree Management** - Create, delete, and manage worktrees seamlessly
15
15
  - 📊 **Real-Time Status** - See uncommitted changes, branch info, and sync status at a glance
16
16
  - 🔀 **Sorting & Grouping** - Sort tasks by name/date/status, group worktrees by dirty/clean
17
- - 🎨 **Beautiful Themes** - 7 built-in themes via Command Palette (Ctrl+P)
17
+ - 🎨 **Beautiful Themes** - lazygit-inspired default plus 20+ themes (Catppuccin, Tokyo Night, Nord, ...) via Command Palette (Ctrl+P)
18
18
  - ⌨️ **Keyboard-First** - Navigate and control everything without touching the mouse
19
19
  - 🚀 **Fast & Responsive** - Parallel git operations with loading indicators
20
20
  - 🔧 **Flexible Configuration** - TOML config file, custom keybindings, environment variables
@@ -83,10 +83,10 @@ For detailed workflows and examples, see the [User Guide](docs/user-guide.md).
83
83
  | `c` | Claude (resume) | `C` | Claude (new) |
84
84
  | `r` | Refresh | `s` | Sort tasks |
85
85
  | `S` | Group worktrees | `m` | Messages |
86
- | `Tab` | Next panel | `?` | Show help |
87
- | `q` | Quit | | |
86
+ | `t` | Cycle theme | `Tab` | Next panel |
87
+ | `?` | Show help | `q` | Quit |
88
88
 
89
- **Themes:** Press `Ctrl+P` to switch between 7 built-in themes (textual-dark, nord, gruvbox, tokyo-night, monokai, dracula, textual-light).
89
+ **Themes:** The default `tasktree` theme pairs a lazygit-classic ANSI palette with layered panels, numbered title bars, green focus borders, and a keycap footer. Five more design-system palettes ship tuned to the same shape — tokyo-night, catppuccin-mocha, gruvbox, dracula, nord — and every other Textual built-in theme works too (`Ctrl+P` to switch); the whole UI is styled with Textual design tokens, so any theme restyles it consistently.
90
90
 
91
91
  ## 🏗️ How It Works
92
92
 
@@ -85,9 +85,10 @@ tasks_dir = "/Users/username/tasks"
85
85
  [ui]
86
86
 
87
87
  # Theme to use for the interface
88
- # Options: textual-dark, textual-light, nord, gruvbox, tokyo-night, monokai, dracula
89
- # Default: textual-dark
90
- theme = "textual-dark"
88
+ # Options: tasktree (default), tokyo-night, catppuccin-mocha, catppuccin-latte,
89
+ # catppuccin-frappe, catppuccin-macchiato, nord, gruvbox, dracula, monokai,
90
+ # rose-pine, textual-dark, textual-light, ...
91
+ theme = "tasktree"
91
92
 
92
93
  # Show hidden files in file listings
93
94
  # Default: false
@@ -202,6 +203,9 @@ cursor_up = "k" # Move cursor up
202
203
  cycle_sort = "s" # Cycle task sort mode
203
204
  toggle_grouping = "S" # Toggle worktree grouping (shift+s)
204
205
 
206
+ # Appearance
207
+ cycle_theme = "t" # Cycle through the design-system themes
208
+
205
209
  # ============================================================================
206
210
  # Symlinks
207
211
  # ============================================================================
@@ -258,7 +262,7 @@ tasks_dir = "/Volumes/FastSSD/worktrees"
258
262
 
259
263
  | Option | Type | Default | Environment Variable | Description |
260
264
  |--------------------|---------|-----------------|-----------------------|------------------------------------------|
261
- | `theme` | string | `textual-dark` | `TASKTREE_THEME` | Color theme for the interface |
265
+ | `theme` | string | `tasktree` | `TASKTREE_THEME` | Color theme for the interface |
262
266
  | `show_hidden_files` | boolean | `false` | - | Show hidden files in listings |
263
267
  | `refresh_interval` | integer | `30` | - | Auto-refresh interval in seconds (0 = disabled) |
264
268
 
@@ -266,13 +270,21 @@ tasks_dir = "/Volumes/FastSSD/worktrees"
266
270
 
267
271
  Available themes (press `Ctrl+P` in app to switch):
268
272
 
269
- - `textual-dark` - Default dark theme with blue accents
270
- - `textual-light` - Light theme with high contrast
271
- - `nord` - Arctic, north-bluish color palette
272
- - `gruvbox` - Retro groove warm color scheme
273
- - `tokyo-night` - Clean, dark theme inspired by Tokyo's night
274
- - `monokai` - Classic dark theme with vibrant colors
275
- - `dracula` - Dark theme with pastel-like colors
273
+ - `tasktree` - Default: lazygit-classic ANSI palette with green focus borders
274
+ - `tokyo-night` - Blue accent on deep blue-black
275
+ - `catppuccin-mocha` - Mauve accent, soothing pastels
276
+ - `gruvbox` - Orange accent, retro warm
277
+ - `dracula` - Purple accent, high-contrast pastels
278
+ - `nord` - Frost cyan accent, arctic palette
279
+
280
+ These six come from the tasktree design system, with matched panel layering
281
+ and selection colors. All other Textual built-in themes also work
282
+ (`catppuccin-latte`, `rose-pine`, `monokai`, `solarized-dark`,
283
+ `textual-dark`/`-light`, ...).
284
+
285
+ The whole UI is styled with Textual design tokens (panel surfaces, focus
286
+ borders, selection bars, footer keycaps), so every theme restyles all of it
287
+ consistently.
276
288
 
277
289
  ### `show_hidden_files`
278
290
 
@@ -500,6 +512,7 @@ All 22 customizable keybindings with descriptions:
500
512
  |-------------------|---------|------------------------------------------|----------------------------------|
501
513
  | `cycle_sort` | `s` | Cycle task sort mode | `cycle_sort = "ctrl+s"` |
502
514
  | `toggle_grouping` | `S` | Toggle worktree grouping by dirty/clean | `toggle_grouping = "ctrl+g"` |
515
+ | `cycle_theme` | `t` | Cycle through the design-system themes | `cycle_theme = "ctrl+t"` |
503
516
 
504
517
  ### Available Key Syntax
505
518
 
@@ -614,15 +627,14 @@ TASKTREE_THEME=dracula tasktree-manager
614
627
 
615
628
  ### Theme Descriptions
616
629
 
617
- | Theme | Style | Best For |
618
- |-----------------|---------------------|-----------------------------------|
619
- | `textual-dark` | Dark with blue | Default, general use |
620
- | `textual-light` | Light with contrast | Bright environments |
621
- | `nord` | Arctic blue | Low-contrast, easy on eyes |
622
- | `gruvbox` | Retro warm | Nostalgic, comfortable |
623
- | `tokyo-night` | Modern dark | Clean, professional |
624
- | `monokai` | Vibrant colors | High contrast, code-focused |
625
- | `dracula` | Pastel dark | Popular, easy to read |
630
+ | Theme | Style | Best For |
631
+ |----------------------|---------------------|-----------------------------------|
632
+ | `tasktree` | Lazygit-style ANSI | Default, terminal-native feel |
633
+ | `tokyo-night` | Modern dark | Clean, professional |
634
+ | `catppuccin-mocha` | Soothing pastel | Popular, easy on the eyes |
635
+ | `gruvbox` | Retro warm | Nostalgic, comfortable |
636
+ | `dracula` | Pastel dark | Popular, easy to read |
637
+ | `nord` | Arctic blue | Low-contrast, easy on eyes |
626
638
 
627
639
  ### Theme Persistence
628
640
 
@@ -208,7 +208,7 @@ Shows worktrees for the selected task:
208
208
 
209
209
  **Navigation:**
210
210
  - `j/k` or arrow keys: Move up/down
211
- - `S`: Toggle grouping by dirty/clean (panel title shows "(grouped)" when active)
211
+ - `S`: Toggle grouping by dirty/clean (panel subtitle shows "grouped" when active)
212
212
  - Highlighting a worktree: Shows detailed status in bottom panel
213
213
 
214
214
  ### Bottom Panel: Status Display
@@ -277,6 +277,7 @@ what is displayed. Press `?` for the full reference at any time.
277
277
  |-----|-----------------------|------------------------------------------------------------|
278
278
  | `s` | Cycle sort mode | Cycle through: name ↑/↓, date ↑/↓, dirty first, clean first |
279
279
  | `S` | Toggle grouping | Group worktrees by dirty/clean status (Shift+S) |
280
+ | `t` | Cycle theme | Cycle tasktree → tokyo-night → catppuccin (4x) → gruvbox → dracula → nord |
280
281
 
281
282
  **Sort modes:**
282
283
  - `by name ↑` - Alphabetical A-Z (default)
@@ -363,7 +364,7 @@ Useful when you're spinning up several similar tasks that share the same set of
363
364
  - `c` opens Claude Code CLI in a new Ghostty terminal tab at the task directory.
364
365
  - If `~/.claude/projects/<task-folder>/` already has session transcripts, runs `claude -r` to pick from them; otherwise runs `claude` to start fresh.
365
366
  - `C` opens the Claude desktop app via the `claude://code/new?folder=<task-folder>` URL scheme.
366
- - The CLI variant (`c`) generates `CLAUDE.md` files with task/worktree context and installs hooks that report session status back to tasktree-manager.
367
+ - The CLI variant (`c`) generates a task-level `CLAUDE.md` with task/worktree context, copies each repo's own `CLAUDE.md` into worktrees whose branch predates it (never generating stub content), and installs hooks that report session status back to tasktree-manager.
367
368
  - Session status (`⟳` running, `!` waiting, `✓` ended) appears next to the task name
368
369
  - Both variants point the session's Claude Code auto-memory at a shared pool (`claude_memory_dir`, default `~/.claude/tasktree-memory`). Task folders are not git repos, so without this each task would get its own memory directory that is orphaned when the task is deleted; with the shared pool, what Claude learns in one task carries over to future tasks.
369
370
 
@@ -70,7 +70,7 @@ version-file = "tasktree_manager/_version.py"
70
70
  # Semantic Release Configuration
71
71
  [tool.semantic_release]
72
72
  version_toml = ["pyproject.toml:tool.semantic_release.version"]
73
- version = "2.6.0"
73
+ version = "2.7.0"
74
74
  tag_format = "v{version}"
75
75
  branch = "main"
76
76
  commit_message = "chore(release): {version} [skip ci]"
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2.6.0'
22
- __version_tuple__ = version_tuple = (2, 6, 0)
21
+ __version__ = version = '2.7.0'
22
+ __version_tuple__ = version_tuple = (2, 7, 0)
23
23
 
24
24
  __commit_id__ = commit_id = None