tasktree-manager 2.5.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.5.0 → tasktree_manager-2.7.0}/CHANGELOG.md +16 -0
  2. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/PKG-INFO +1 -1
  3. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/README.md +10 -8
  4. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/docs/configuration.md +61 -20
  5. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/docs/user-guide.md +42 -6
  6. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/pyproject.toml +1 -1
  7. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/_version.py +2 -2
  8. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/app.py +282 -105
  9. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/commands.py +5 -0
  10. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/services/claude_hooks.py +9 -1
  11. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/services/config.py +21 -3
  12. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/services/git_ops.py +70 -0
  13. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/services/task_manager.py +77 -32
  14. tasktree_manager-2.7.0/tasktree_manager/themes.py +203 -0
  15. tasktree_manager-2.7.0/tasktree_manager/widgets/app_header.py +64 -0
  16. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/create_modal.py +93 -72
  17. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/setup_modal.py +14 -6
  18. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/status_panel.py +14 -16
  19. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/worktree_list.py +1 -1
  20. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_app.py +57 -3
  21. tasktree_manager-2.7.0/tests/test_claude_hooks.py +106 -0
  22. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_config.py +17 -1
  23. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_git_ops.py +75 -0
  24. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_modals.py +156 -0
  25. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_task_manager.py +135 -0
  26. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/SKILL.md +0 -0
  27. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/README.md +0 -0
  28. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/dashboard_app.py +0 -0
  29. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/data_viewer.py +0 -0
  30. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/todo_app.py +0 -0
  31. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/worker_demo.py +0 -0
  32. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/references/layouts.md +0 -0
  33. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/references/official-guides-index.md +0 -0
  34. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/references/styling.md +0 -0
  35. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/references/widgets.md +0 -0
  36. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.github/templates/CHANGELOG.md.j2 +0 -0
  37. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.github/workflows/ci.yml +0 -0
  38. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.github/workflows/release.yml +0 -0
  39. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.gitignore +0 -0
  40. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/CONTRIBUTING.md +0 -0
  41. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/LICENSE +0 -0
  42. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/OPENSPEC.md +0 -0
  43. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/ROADMAP.md +0 -0
  44. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/docs/claude-code-integration-spec.md +0 -0
  45. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/docs/installation.md +0 -0
  46. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/docs/troubleshooting.md +0 -0
  47. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/mise.toml +0 -0
  48. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/scripts/bump_version.py +0 -0
  49. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/__init__.py +0 -0
  50. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/services/__init__.py +0 -0
  51. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/services/models.py +0 -0
  52. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/__init__.py +0 -0
  53. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/messages_panel.py +0 -0
  54. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/task_list.py +0 -0
  55. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/__init__.py +0 -0
  56. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/conftest.py +0 -0
  57. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_commands.py +0 -0
  58. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_integration_git.py +0 -0
  59. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_memory.py +0 -0
  60. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_messages_panel.py +0 -0
  61. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_setup_modal.py +0 -0
  62. {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_status_panel.py +0 -0
@@ -15,6 +15,22 @@ 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
+
28
+ ## [2.6.0] - 2026-07-13
29
+
30
+ ### Changed
31
+ - Hunk diff viewer, shared Claude memory pool, repo filter fix (#8)
32
+
33
+
18
34
  ## [2.5.0] - 2026-06-10
19
35
 
20
36
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tasktree-manager
3
- Version: 2.5.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
@@ -57,8 +57,9 @@ On first run, you'll configure:
57
57
 
58
58
  1. **Create a task** - Press `n`, enter task name, select repositories
59
59
  2. **Work on code** - Press `e` for editor, `g` for lazygit, or `Enter` for shell
60
- 3. **Push changes** - Press `p` to push all worktrees
61
- 4. **Delete task** - Press `d` when finished
60
+ 3. **Review changes** - Press `h` to view the diff in [hunk](https://github.com/modem-dev/hunk) (all repos from the task panel, one repo from the worktree panel)
61
+ 4. **Push changes** - Press `p` to push all worktrees
62
+ 5. **Delete task** - Press `d` when finished
62
63
 
63
64
  For detailed workflows and examples, see the [User Guide](docs/user-guide.md).
64
65
 
@@ -75,16 +76,17 @@ For detailed workflows and examples, see the [User Guide](docs/user-guide.md).
75
76
  | Key | Action | Key | Action |
76
77
  |-----|--------|-----|--------|
77
78
  | `n` | New task | `g` | Open lazygit |
78
- | `a` | Add repo | `e` | Open editor |
79
- | `d` | Delete task | `o` | Open folder |
80
- | `p` | Push all | `P` | Pull all |
79
+ | `a` | Add repo | `h` | Show diff (hunk) |
80
+ | `d` | Delete task | `e` | Open editor |
81
+ | `p` | Push all | `o` | Open folder |
82
+ | `P` | Pull all | `Enter` | Open shell |
81
83
  | `c` | Claude (resume) | `C` | Claude (new) |
82
84
  | `r` | Refresh | `s` | Sort tasks |
83
85
  | `S` | Group worktrees | `m` | Messages |
84
- | `Enter` | Open shell | `Tab` | Next panel |
86
+ | `t` | Cycle theme | `Tab` | Next panel |
85
87
  | `?` | Show help | `q` | Quit |
86
88
 
87
- **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.
88
90
 
89
91
  ## 🏗️ How It Works
90
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
@@ -133,6 +134,25 @@ editor = ""
133
134
  # Default: "lazygit" (searches PATH)
134
135
  lazygit_path = "lazygit"
135
136
 
137
+ # Path to hunk executable (terminal diff viewer)
138
+ # https://github.com/modem-dev/hunk
139
+ # Default: "hunk" (searches PATH)
140
+ hunk_path = "hunk"
141
+
142
+ # Path to claude CLI executable
143
+ # Default: "claude" (searches PATH)
144
+ claude_path = "claude"
145
+
146
+ # Shared Claude Code auto-memory directory for task sessions.
147
+ # Task folders are not git repositories, so by default Claude Code would key
148
+ # its auto memory to the task path — memory that is orphaned when the task is
149
+ # deleted. tasktree-manager writes this path as "autoMemoryDirectory" into each
150
+ # task's .claude/settings.local.json so every task session reads and writes one
151
+ # shared memory pool that persists across tasks.
152
+ # Set to "" to disable (each task keeps its own throwaway memory).
153
+ # Default: "~/.claude/tasktree-memory"
154
+ claude_memory_dir = "~/.claude/tasktree-memory"
155
+
136
156
  # Preferred shell
137
157
  # Leave empty to use $SHELL environment variable
138
158
  # Default: "" (uses $SHELL, falls back to /bin/bash)
@@ -158,6 +178,7 @@ delete_task = "d" # Delete/finish task
158
178
 
159
179
  # Git operations
160
180
  open_lazygit = "g" # Open lazygit in selected worktree
181
+ show_diff = "h" # Open hunk diff (task panel = all repos, worktree panel = one repo)
161
182
  open_editor = "e" # Open editor in selected task/worktree
162
183
  open_folder = "o" # Open folder in new terminal tab
163
184
  open_shell = "enter" # Open shell in selected worktree
@@ -182,6 +203,9 @@ cursor_up = "k" # Move cursor up
182
203
  cycle_sort = "s" # Cycle task sort mode
183
204
  toggle_grouping = "S" # Toggle worktree grouping (shift+s)
184
205
 
206
+ # Appearance
207
+ cycle_theme = "t" # Cycle through the design-system themes
208
+
185
209
  # ============================================================================
186
210
  # Symlinks
187
211
  # ============================================================================
@@ -238,7 +262,7 @@ tasks_dir = "/Volumes/FastSSD/worktrees"
238
262
 
239
263
  | Option | Type | Default | Environment Variable | Description |
240
264
  |--------------------|---------|-----------------|-----------------------|------------------------------------------|
241
- | `theme` | string | `textual-dark` | `TASKTREE_THEME` | Color theme for the interface |
265
+ | `theme` | string | `tasktree` | `TASKTREE_THEME` | Color theme for the interface |
242
266
  | `show_hidden_files` | boolean | `false` | - | Show hidden files in listings |
243
267
  | `refresh_interval` | integer | `30` | - | Auto-refresh interval in seconds (0 = disabled) |
244
268
 
@@ -246,13 +270,21 @@ tasks_dir = "/Volumes/FastSSD/worktrees"
246
270
 
247
271
  Available themes (press `Ctrl+P` in app to switch):
248
272
 
249
- - `textual-dark` - Default dark theme with blue accents
250
- - `textual-light` - Light theme with high contrast
251
- - `nord` - Arctic, north-bluish color palette
252
- - `gruvbox` - Retro groove warm color scheme
253
- - `tokyo-night` - Clean, dark theme inspired by Tokyo's night
254
- - `monokai` - Classic dark theme with vibrant colors
255
- - `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.
256
288
 
257
289
  ### `show_hidden_files`
258
290
 
@@ -305,6 +337,7 @@ refresh_interval = 15 # Refresh every 15 seconds
305
337
  |---------------|--------|-------------|---------------------|--------------------------------------|
306
338
  | `editor` | string | `""` | `EDITOR` | Command to launch your editor |
307
339
  | `lazygit_path` | string | `"lazygit"` | - | Path to lazygit executable |
340
+ | `hunk_path` | string | `"hunk"` | - | Path to hunk diff-viewer executable |
308
341
  | `shell` | string | `""` | `SHELL` | Shell to use when opening terminals |
309
342
 
310
343
  ### Details
@@ -320,6 +353,13 @@ refresh_interval = 15 # Refresh every 15 seconds
320
353
  - Use absolute path for custom location: `"/opt/homebrew/bin/lazygit"`
321
354
  - Install lazygit: `brew install lazygit` (macOS), `apt install lazygit` (Ubuntu)
322
355
 
356
+ **`hunk_path`:**
357
+ - [hunk](https://github.com/modem-dev/hunk) is a review-first terminal diff viewer
358
+ - Default `"hunk"` searches PATH
359
+ - Use absolute path for custom location: `"/opt/homebrew/bin/hunk"`
360
+ - Install hunk: `brew install hunk` (macOS) or `npm i -g hunkdiff`
361
+ - Used when pressing `h`: from the task panel it opens a combined diff across all the task's repos; from the worktree panel it opens the selected repo's diff
362
+
323
363
  **`shell`:**
324
364
  - Leave empty (`""`) to use `$SHELL` environment variable
325
365
  - Fallback: `/bin/bash`
@@ -441,6 +481,7 @@ All 22 customizable keybindings with descriptions:
441
481
  | Action | Default | Description | Customization Example |
442
482
  |----------------|----------|---------------------------------------|-----------------------------|
443
483
  | `open_lazygit` | `g` | Open lazygit in selected worktree | `open_lazygit = "ctrl+g"` |
484
+ | `show_diff` | `h` | Open hunk diff (task = all repos, worktree = one) | `show_diff = "ctrl+h"` |
444
485
  | `open_editor` | `e` | Open editor in task/worktree folder | `open_editor = "ctrl+e"` |
445
486
  | `open_folder` | `o` | Open folder in new terminal tab | `open_folder = "ctrl+o"` |
446
487
  | `open_shell` | `enter` | Open shell in selected worktree | `open_shell = "ctrl+t"` |
@@ -471,6 +512,7 @@ All 22 customizable keybindings with descriptions:
471
512
  |-------------------|---------|------------------------------------------|----------------------------------|
472
513
  | `cycle_sort` | `s` | Cycle task sort mode | `cycle_sort = "ctrl+s"` |
473
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"` |
474
516
 
475
517
  ### Available Key Syntax
476
518
 
@@ -585,15 +627,14 @@ TASKTREE_THEME=dracula tasktree-manager
585
627
 
586
628
  ### Theme Descriptions
587
629
 
588
- | Theme | Style | Best For |
589
- |-----------------|---------------------|-----------------------------------|
590
- | `textual-dark` | Dark with blue | Default, general use |
591
- | `textual-light` | Light with contrast | Bright environments |
592
- | `nord` | Arctic blue | Low-contrast, easy on eyes |
593
- | `gruvbox` | Retro warm | Nostalgic, comfortable |
594
- | `tokyo-night` | Modern dark | Clean, professional |
595
- | `monokai` | Vibrant colors | High contrast, code-focused |
596
- | `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 |
597
638
 
598
639
  ### Theme Persistence
599
640
 
@@ -134,17 +134,22 @@ A **worktree** is a git working directory for a specific repository within a tas
134
134
  - Stage files, commit changes, resolve conflicts
135
135
  - Exit lazygit (press `q` in lazygit)
136
136
 
137
- 3. **Or open a shell:**
137
+ 3. **Review the diff:**
138
+ - Press `h` from the worktree panel to review that repo's changes in [hunk](https://github.com/modem-dev/hunk)
139
+ - Press `h` from the task panel to review a combined diff across **all** the task's repos at once
140
+ - Exit hunk (press `q`)
141
+
142
+ 4. **Or open a shell:**
138
143
  - Press `Enter` to open a shell in the worktree
139
144
  - Make changes with your editor/IDE
140
145
  - Run build/test commands
141
146
  - Exit shell (type `exit`)
142
147
 
143
- 4. **Push changes:**
148
+ 5. **Push changes:**
144
149
  - Press `p` to push all worktrees in the task
145
150
  - Or use lazygit (`g`) to push individually
146
151
 
147
- 5. **Delete the task:**
152
+ 6. **Delete the task:**
148
153
  - Press `d` to delete/finish the task
149
154
  - Follow prompts if there are uncommitted or unpushed changes
150
155
  - Worktrees are removed (branches remain on remote)
@@ -168,7 +173,7 @@ tasktree-manager uses a **3-panel layout**:
168
173
  │ M src/auth.py │
169
174
  │ ?? README.md │
170
175
  └──────────────────────────────────────────────────────────────────────────┘
171
- n New d Delete g Lazygit p Push r Refresh ? Help q Quit
176
+ n New d Delete g Lazygit h Diff p Push r Refresh ? Help q Quit
172
177
  ```
173
178
 
174
179
  ### Left Panel: Task List
@@ -203,7 +208,7 @@ Shows worktrees for the selected task:
203
208
 
204
209
  **Navigation:**
205
210
  - `j/k` or arrow keys: Move up/down
206
- - `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)
207
212
  - Highlighting a worktree: Shows detailed status in bottom panel
208
213
 
209
214
  ### Bottom Panel: Status Display
@@ -272,6 +277,7 @@ what is displayed. Press `?` for the full reference at any time.
272
277
  |-----|-----------------------|------------------------------------------------------------|
273
278
  | `s` | Cycle sort mode | Cycle through: name ↑/↓, date ↑/↓, dirty first, clean first |
274
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 |
275
281
 
276
282
  **Sort modes:**
277
283
  - `by name ↑` - Alphabetical A-Z (default)
@@ -325,6 +331,7 @@ Useful when you're spinning up several similar tasks that share the same set of
325
331
  | Key | Action | Description |
326
332
  |---------|--------------------|------------------------------------------------------|
327
333
  | `g` | Open lazygit | Open lazygit in the selected worktree |
334
+ | `h` | Show diff | Open hunk: all repos from the task panel, the selected repo from the worktree panel |
328
335
  | `e` | Open editor | Open editor in task/worktree folder (runs `$EDITOR .`) |
329
336
  | `Enter` | Open shell | Open a shell in the selected worktree |
330
337
  | `p` | Push all | Push all worktrees in the current task (parallel) |
@@ -357,8 +364,9 @@ Useful when you're spinning up several similar tasks that share the same set of
357
364
  - `c` opens Claude Code CLI in a new Ghostty terminal tab at the task directory.
358
365
  - If `~/.claude/projects/<task-folder>/` already has session transcripts, runs `claude -r` to pick from them; otherwise runs `claude` to start fresh.
359
366
  - `C` opens the Claude desktop app via the `claude://code/new?folder=<task-folder>` URL scheme.
360
- - 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.
361
368
  - Session status (`⟳` running, `!` waiting, `✓` ended) appears next to the task name
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.
362
370
 
363
371
  ### General
364
372
 
@@ -666,6 +674,34 @@ apt install lazygit
666
674
  # See: https://github.com/jesseduffield/lazygit
667
675
  ```
668
676
 
677
+ ### Hunk
678
+
679
+ [hunk](https://github.com/modem-dev/hunk) is a review-first terminal diff viewer, well suited to reviewing agent-authored changesets across a multi-repo task.
680
+
681
+ **Why hunk:**
682
+ - Fast, keyboard-driven diff review with a desktop-inspired layout
683
+ - Reviews an entire task's changes across all its repos in one view
684
+ - Complements lazygit (which stages/commits per repo)
685
+
686
+ **Using hunk:**
687
+ 1. From the **worktree panel**, press `h` to review the selected repo's uncommitted changes
688
+ 2. From the **task panel**, press `h` to review a combined diff across **all** the task's repos at once (each file is grouped under its repo name)
689
+ 3. tasktree-manager suspends, hunk opens
690
+ 4. Press `q` in hunk to return; status auto-refreshes and selection is preserved
691
+
692
+ The combined task view includes both tracked (staged and unstaged) changes and untracked files.
693
+
694
+ **Install hunk:**
695
+ ```bash
696
+ # macOS
697
+ brew install hunk
698
+
699
+ # npm
700
+ npm i -g hunkdiff
701
+
702
+ # See: https://github.com/modem-dev/hunk
703
+ ```
704
+
669
705
  ### Editors
670
706
 
671
707
  **Direct editor integration:**
@@ -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.5.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.5.0'
22
- __version_tuple__ = version_tuple = (2, 5, 0)
21
+ __version__ = version = '2.7.0'
22
+ __version_tuple__ = version_tuple = (2, 7, 0)
23
23
 
24
24
  __commit_id__ = commit_id = None