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.
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/CHANGELOG.md +16 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/PKG-INFO +1 -1
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/README.md +10 -8
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/docs/configuration.md +61 -20
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/docs/user-guide.md +42 -6
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/pyproject.toml +1 -1
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/_version.py +2 -2
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/app.py +282 -105
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/commands.py +5 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/services/claude_hooks.py +9 -1
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/services/config.py +21 -3
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/services/git_ops.py +70 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/services/task_manager.py +77 -32
- tasktree_manager-2.7.0/tasktree_manager/themes.py +203 -0
- tasktree_manager-2.7.0/tasktree_manager/widgets/app_header.py +64 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/create_modal.py +93 -72
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/setup_modal.py +14 -6
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/status_panel.py +14 -16
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/worktree_list.py +1 -1
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_app.py +57 -3
- tasktree_manager-2.7.0/tests/test_claude_hooks.py +106 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_config.py +17 -1
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_git_ops.py +75 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_modals.py +156 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_task_manager.py +135 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/SKILL.md +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/README.md +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/dashboard_app.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/data_viewer.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/todo_app.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/assets/worker_demo.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/references/layouts.md +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/references/official-guides-index.md +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/references/styling.md +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.claude/skills/textual-tui/references/widgets.md +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.github/templates/CHANGELOG.md.j2 +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.github/workflows/ci.yml +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.github/workflows/release.yml +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/.gitignore +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/CONTRIBUTING.md +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/LICENSE +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/OPENSPEC.md +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/ROADMAP.md +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/docs/claude-code-integration-spec.md +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/docs/installation.md +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/docs/troubleshooting.md +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/mise.toml +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/scripts/bump_version.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/__init__.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/services/__init__.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/services/models.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/__init__.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/messages_panel.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tasktree_manager/widgets/task_list.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/__init__.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/conftest.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_commands.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_integration_git.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_memory.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_messages_panel.py +0 -0
- {tasktree_manager-2.5.0 → tasktree_manager-2.7.0}/tests/test_setup_modal.py +0 -0
- {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
|
|
@@ -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** -
|
|
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. **
|
|
61
|
-
4. **
|
|
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 | `
|
|
79
|
-
| `d` | Delete task | `
|
|
80
|
-
| `p` | Push 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
|
-
| `
|
|
86
|
+
| `t` | Cycle theme | `Tab` | Next panel |
|
|
85
87
|
| `?` | Show help | `q` | Quit |
|
|
86
88
|
|
|
87
|
-
**Themes:**
|
|
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:
|
|
89
|
-
#
|
|
90
|
-
|
|
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 | `
|
|
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
|
-
- `
|
|
250
|
-
- `
|
|
251
|
-
- `
|
|
252
|
-
- `gruvbox` -
|
|
253
|
-
- `
|
|
254
|
-
- `
|
|
255
|
-
|
|
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
|
|
589
|
-
|
|
590
|
-
| `
|
|
591
|
-
| `
|
|
592
|
-
| `
|
|
593
|
-
| `gruvbox`
|
|
594
|
-
| `
|
|
595
|
-
| `
|
|
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. **
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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`
|
|
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.
|
|
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.
|
|
22
|
-
__version_tuple__ = version_tuple = (2,
|
|
21
|
+
__version__ = version = '2.7.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 7, 0)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|