tasktree-manager 2.1.0__tar.gz → 2.3.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 (58) hide show
  1. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/CHANGELOG.md +15 -0
  2. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/PKG-INFO +1 -1
  3. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/README.md +16 -22
  4. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/docs/configuration.md +43 -6
  5. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/docs/user-guide.md +43 -6
  6. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/pyproject.toml +1 -1
  7. tasktree_manager-2.3.0/tasktree_manager/_version.py +24 -0
  8. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/app.py +395 -229
  9. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/services/claude_hooks.py +14 -1
  10. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/services/config.py +41 -43
  11. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/services/git_ops.py +131 -70
  12. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/services/models.py +10 -1
  13. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/services/task_manager.py +34 -14
  14. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/widgets/create_modal.py +29 -7
  15. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/widgets/status_panel.py +23 -20
  16. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/widgets/task_list.py +9 -3
  17. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tests/test_app.py +64 -1
  18. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tests/test_git_ops.py +142 -0
  19. tasktree_manager-2.1.0/tasktree_manager/_version.py +0 -34
  20. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.claude/skills/textual-tui/SKILL.md +0 -0
  21. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.claude/skills/textual-tui/assets/README.md +0 -0
  22. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.claude/skills/textual-tui/assets/dashboard_app.py +0 -0
  23. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.claude/skills/textual-tui/assets/data_viewer.py +0 -0
  24. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.claude/skills/textual-tui/assets/todo_app.py +0 -0
  25. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.claude/skills/textual-tui/assets/worker_demo.py +0 -0
  26. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.claude/skills/textual-tui/references/layouts.md +0 -0
  27. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.claude/skills/textual-tui/references/official-guides-index.md +0 -0
  28. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.claude/skills/textual-tui/references/styling.md +0 -0
  29. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.claude/skills/textual-tui/references/widgets.md +0 -0
  30. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.github/templates/CHANGELOG.md.j2 +0 -0
  31. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.github/workflows/ci.yml +0 -0
  32. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.github/workflows/release.yml +0 -0
  33. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/.gitignore +0 -0
  34. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/CONTRIBUTING.md +0 -0
  35. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/LICENSE +0 -0
  36. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/OPENSPEC.md +0 -0
  37. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/ROADMAP.md +0 -0
  38. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/docs/claude-code-integration-spec.md +0 -0
  39. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/docs/installation.md +0 -0
  40. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/docs/troubleshooting.md +0 -0
  41. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/mise.toml +0 -0
  42. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/scripts/bump_version.py +0 -0
  43. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/__init__.py +0 -0
  44. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/services/__init__.py +0 -0
  45. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/widgets/__init__.py +0 -0
  46. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/widgets/messages_panel.py +0 -0
  47. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/widgets/setup_modal.py +0 -0
  48. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tasktree_manager/widgets/worktree_list.py +0 -0
  49. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tests/__init__.py +0 -0
  50. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tests/conftest.py +0 -0
  51. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tests/test_config.py +0 -0
  52. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tests/test_integration_git.py +0 -0
  53. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tests/test_memory.py +0 -0
  54. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tests/test_messages_panel.py +0 -0
  55. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tests/test_modals.py +0 -0
  56. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tests/test_setup_modal.py +0 -0
  57. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tests/test_status_panel.py +0 -0
  58. {tasktree_manager-2.1.0 → tasktree_manager-2.3.0}/tests/test_task_manager.py +0 -0
@@ -15,6 +15,21 @@ 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.3.0] - 2026-06-10
19
+
20
+ ### Added
21
+ - Add task cloning, worktree deletion, and non-blocking git ops (#4)
22
+
23
+ ### Fixed
24
+ - Honor git timeout, real status codes, non-blocking delete (#5)
25
+
26
+
27
+ ## [2.2.0] - 2026-03-06
28
+
29
+ ### Added
30
+ - Add periodic auto-refresh for git status with selection preserv… (#3)
31
+
32
+
18
33
  ## [2.1.0] - 2026-02-10
19
34
 
20
35
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tasktree-manager
3
- Version: 2.1.0
3
+ Version: 2.3.0
4
4
  Summary: TUI application for managing worktree-based tasks
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.10
@@ -19,26 +19,18 @@
19
19
  - 🚀 **Fast & Responsive** - Parallel git operations with loading indicators
20
20
  - 🔧 **Flexible Configuration** - TOML config file, custom keybindings, environment variables
21
21
 
22
- ## 📸 Screenshots
23
-
24
- ```
25
- ┌─ tasktree-manager ──────────────────────────────────────────────────────┐
26
- │ Tasks │ Worktrees │
27
- │ ● FEAT-42 (2) │ web-api FEAT-42 ✗ 3 │
28
- │ FEAT-38-auth │ frontend FEAT-42 ✓ │
29
- │ │ │
30
- │ │ │
31
- ├──────────────────────────────────────────────────────────────────────────┤
32
- │ Status: web-api │
33
- │ Branch: FEAT-42 │
34
- │ Sync: ↑2 ↓1 │
35
- │ │
36
- │ M src/main.py │
37
- │ ?? README.md │
38
- │ M tests/test_app.py │
39
- └──────────────────────────────────────────────────────────────────────────┘
40
- n New task d Delete g Lazygit p Push r Refresh ? Help q Quit
41
- ```
22
+ ## 📊 Status Indicators
23
+
24
+ | Indicator | Meaning |
25
+ |-----------|---------|
26
+ | `●` red | Uncommitted changes |
27
+ | `◆` blue | Has CLAUDE.md file |
28
+ | `⟳` magenta | Claude Code session running |
29
+ | `!` yellow | Claude Code session waiting for input |
30
+ | `✓` green | Clean worktree / Claude session ended |
31
+ | `✗ N` red | N files changed |
32
+ | `↑N` green | N commits ahead of remote |
33
+ | `↓N` yellow | N commits behind remote |
42
34
 
43
35
  ## 🚀 Quick Start
44
36
 
@@ -85,9 +77,11 @@ For detailed workflows and examples, see the [User Guide](docs/user-guide.md).
85
77
  | `n` | New task | `g` | Open lazygit |
86
78
  | `a` | Add repo | `e` | Open editor |
87
79
  | `d` | Delete task | `o` | Open folder |
88
- | `p` | Push all | `Enter` | Open shell |
80
+ | `p` | Push all | `P` | Pull all |
81
+ | `c` | Claude (resume) | `C` | Claude (new) |
89
82
  | `r` | Refresh | `s` | Sort tasks |
90
- | `S` | Group worktrees | `Tab` | Next panel |
83
+ | `S` | Group worktrees | `m` | Messages |
84
+ | `Enter` | Open shell | `Tab` | Next panel |
91
85
  | `?` | Show help | `q` | Quit |
92
86
 
93
87
  **Themes:** Press `Ctrl+P` to switch between 7 built-in themes (textual-dark, nord, gruvbox, tokyo-night, monokai, dracula, textual-light).
@@ -93,6 +93,11 @@ theme = "textual-dark"
93
93
  # Default: false
94
94
  show_hidden_files = false
95
95
 
96
+ # Auto-refresh interval in seconds (0 = disabled)
97
+ # Periodically refreshes git status in the background
98
+ # Default: 30
99
+ refresh_interval = 30
100
+
96
101
  # ============================================================================
97
102
  # Git Settings
98
103
  # ============================================================================
@@ -160,6 +165,13 @@ push_all = "p" # Push all worktrees in current task
160
165
  pull_all = "P" # Pull all worktrees in current task (shift+p)
161
166
  refresh = "r" # Refresh git status
162
167
 
168
+ # Claude Code integration
169
+ open_claude_resume = "c" # Open Claude CLI (resume if a session exists, else new)
170
+ open_claude_gui_code = "C" # Open Claude desktop on Code page in task folder (shift+c)
171
+
172
+ # Messages panel
173
+ toggle_messages = "m" # Show/hide the activity messages panel
174
+
163
175
  # Navigation
164
176
  focus_next = "tab" # Switch to next panel
165
177
  focus_previous = "shift+tab" # Switch to previous panel
@@ -224,10 +236,11 @@ tasks_dir = "/Volumes/FastSSD/worktrees"
224
236
 
225
237
  ## UI Settings
226
238
 
227
- | Option | Type | Default | Environment Variable | Description |
228
- |--------------------|---------|-----------------|-----------------------|---------------------------------|
229
- | `theme` | string | `textual-dark` | `TASKTREE_THEME` | Color theme for the interface |
230
- | `show_hidden_files` | boolean | `false` | - | Show hidden files in listings |
239
+ | Option | Type | Default | Environment Variable | Description |
240
+ |--------------------|---------|-----------------|-----------------------|------------------------------------------|
241
+ | `theme` | string | `textual-dark` | `TASKTREE_THEME` | Color theme for the interface |
242
+ | `show_hidden_files` | boolean | `false` | - | Show hidden files in listings |
243
+ | `refresh_interval` | integer | `30` | - | Auto-refresh interval in seconds (0 = disabled) |
231
244
 
232
245
  ### `theme`
233
246
 
@@ -245,6 +258,20 @@ Available themes (press `Ctrl+P` in app to switch):
245
258
 
246
259
  Currently unused (reserved for future file browser features).
247
260
 
261
+ ### `refresh_interval`
262
+
263
+ Automatically refreshes git status for all tasks and worktrees in the background:
264
+
265
+ - Default: `30` (every 30 seconds)
266
+ - Set to `0` to disable auto-refresh
267
+ - Runs in a background thread — does not block the UI
268
+ - Preserves current task and worktree selection during refresh
269
+
270
+ ```toml
271
+ [ui]
272
+ refresh_interval = 15 # Refresh every 15 seconds
273
+ ```
274
+
248
275
  ## Git Settings
249
276
 
250
277
  | Option | Type | Default | Environment Variable | Description |
@@ -267,7 +294,8 @@ Currently unused (reserved for future file browser features).
267
294
  - Most users should use manual push (`p` key) for control
268
295
 
269
296
  **`timeout`:**
270
- - Timeout for git commands (clone, fetch, push, pull)
297
+ - Timeout for git commands that touch the network (fetch, push, pull) and worktree creation
298
+ - Local status queries use a fixed short timeout (5s) and are not affected
271
299
  - Increase for slow networks or large repositories
272
300
  - Set to `60` or higher for very large repos
273
301
 
@@ -390,7 +418,7 @@ blocklist = ["*"]
390
418
 
391
419
  ## Keybindings Reference
392
420
 
393
- All 18 customizable keybindings with descriptions:
421
+ All 22 customizable keybindings with descriptions:
394
422
 
395
423
  ### Application Control
396
424
 
@@ -404,6 +432,7 @@ All 18 customizable keybindings with descriptions:
404
432
  | Action | Default | Description | Customization Example |
405
433
  |---------------|---------|----------------------------------------|----------------------------|
406
434
  | `new_task` | `n` | Create a new task | `new_task = "ctrl+n"` |
435
+ | `clone_task` | `y` | Clone current task (same repos, new name) | `clone_task = "ctrl+y"` |
407
436
  | `add_repo` | `a` | Add repository to current task | `add_repo = "ctrl+a"` |
408
437
  | `delete_task` | `d` | Delete/finish current task | `delete_task = "delete"` |
409
438
 
@@ -419,6 +448,14 @@ All 18 customizable keybindings with descriptions:
419
448
  | `pull_all` | `P` | Pull all worktrees in current task | `pull_all = "ctrl+shift+p"` |
420
449
  | `refresh` | `r` | Refresh git status for all worktrees | `refresh = "F5"` |
421
450
 
451
+ ### Claude Code Integration
452
+
453
+ | Action | Default | Description | Customization Example |
454
+ |-----------------------|---------|------------------------------------------------------|--------------------------------------|
455
+ | `open_claude_resume` | `c` | Open Claude CLI (resume if session exists, else new) | `open_claude_resume = "ctrl+c"` |
456
+ | `open_claude_gui_code`| `C` | Open Claude desktop on Code page in task folder | `open_claude_gui_code = "ctrl+shift+c"` |
457
+ | `toggle_messages` | `m` | Show/hide activity messages panel | `toggle_messages = "ctrl+m"` |
458
+
422
459
  ### Navigation
423
460
 
424
461
  | Action | Default | Description | Customization Example |
@@ -177,7 +177,9 @@ Shows all your tasks:
177
177
 
178
178
  - **Name**: Task identifier (e.g., `FEAT-123`)
179
179
  - **Count**: Number of worktrees in parentheses (e.g., `(3)`)
180
- - **Dirty indicator** `●`: Task has uncommitted changes
180
+ - **Dirty indicator** `●`: Red dot — task has uncommitted changes
181
+ - **CLAUDE.md indicator** `◆`: Blue diamond — task has a CLAUDE.md file
182
+ - **Claude session status**: `⟳` running (magenta), `!` waiting (yellow), `✓` ended (green)
181
183
  - **Sort mode**: Press `s` to cycle through sort modes (name ↑/↓, date ↑/↓, dirty/clean first)
182
184
 
183
185
  **Navigation:**
@@ -221,13 +223,24 @@ Shows detailed git status for the selected worktree:
221
223
 
222
224
  ### Visual Indicators
223
225
 
226
+ **Task & Worktree Status:**
227
+
224
228
  | Indicator | Meaning |
225
229
  |-----------|--------------------------------------------|
226
- | `●` | Task has uncommitted changes |
227
- | `✗ N` | N files staged or modified |
228
- | `↑N` | N commits ahead of remote (unpushed) |
229
- | `↓N` | N commits behind remote (need to pull) |
230
- | `✓` | Clean worktree, in sync |
230
+ | `●` | Task/worktree has uncommitted changes |
231
+ | `✗ N` | N files staged or modified |
232
+ | `↑N` | N commits ahead of remote (unpushed) |
233
+ | `↓N` | N commits behind remote (need to pull) |
234
+ | `✓` | Clean worktree, in sync |
235
+
236
+ **Claude Code Integration:**
237
+
238
+ | Indicator | Color | Meaning |
239
+ |-----------|---------|------------------------------------------|
240
+ | `◆` | Blue | Task/worktree has a CLAUDE.md file |
241
+ | `⟳` | Magenta | Claude Code session is running |
242
+ | `!` | Yellow | Claude Code session is waiting for input |
243
+ | `✓` | Green | Claude Code session has ended |
231
244
 
232
245
  ## Complete Keyboard Reference
233
246
 
@@ -272,6 +285,7 @@ All keybindings can be customized in [`config.toml`](configuration.md).
272
285
  | Key | Action | Description |
273
286
  |-----|------------------|-----------------------------------------------------------|
274
287
  | `n` | New task | Create a new task with selected repositories |
288
+ | `y` | Clone task | Create a new task pre-populated with the current task's repos |
275
289
  | `a` | Add repository | Add additional repositories to the current task |
276
290
  | `d` | Delete/finish | Delete current task and remove worktrees |
277
291
 
@@ -283,6 +297,14 @@ All keybindings can be customized in [`config.toml`](configuration.md).
283
297
  5. Select repos with `Space` (can select multiple)
284
298
  6. Tab to "Create" button, press `Enter`
285
299
 
300
+ **Clone task workflow:**
301
+ Useful when you're spinning up several similar tasks that share the same set of repos.
302
+
303
+ 1. Highlight the source task in the left panel
304
+ 2. Press `y`
305
+ 3. The modal opens with the source task's repos already selected — just enter a new task name
306
+ 4. Adjust the repo selection or base branch if needed, then press `Enter`
307
+
286
308
  **Task deletion workflow:**
287
309
  1. Highlight task in left panel
288
310
  2. Press `d`
@@ -318,12 +340,27 @@ All keybindings can be customized in [`config.toml`](configuration.md).
318
340
  - When focused on task list: Opens the task folder (`~/tasks/TASK-NAME`)
319
341
  - When focused on worktree list: Opens the selected worktree folder
320
342
 
343
+ ### Claude Code Integration
344
+
345
+ | Key | Action | Description |
346
+ |---------|-------------------------|------------------------------------------------------------|
347
+ | `c` | Open Claude CLI | Resume the task's Claude Code session if one exists, otherwise start a new one |
348
+ | `C` | Open Claude desktop | Open the Claude desktop app on the Code page at the task folder |
349
+
350
+ **How it works:**
351
+ - `c` opens Claude Code CLI in a new Ghostty terminal tab at the task directory.
352
+ - If `~/.claude/projects/<task-folder>/` already has session transcripts, runs `claude -r` to pick from them; otherwise runs `claude` to start fresh.
353
+ - `C` opens the Claude desktop app via the `claude://code/new?folder=<task-folder>` URL scheme.
354
+ - The CLI variant (`c`) generates `CLAUDE.md` files with task/worktree context and installs hooks that report session status back to tasktree-manager.
355
+ - Session status (`⟳` running, `!` waiting, `✓` ended) appears next to the task name
356
+
321
357
  ### General
322
358
 
323
359
  | Key | Action | Description |
324
360
  |---------|-------------------------|----------------------------------------------|
325
361
  | `Ctrl+P`| Open Command Palette | Switch themes and run commands |
326
362
  | `o` | Open folder | Open current folder in new terminal tab |
363
+ | `m` | Toggle messages | Show/hide the activity messages panel |
327
364
  | `?` | Show help | Display help modal with keybindings |
328
365
  | `q` | Quit | Exit tasktree-manager |
329
366
 
@@ -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.1.0"
73
+ version = "2.3.0"
74
74
  tag_format = "v{version}"
75
75
  branch = "main"
76
76
  commit_message = "chore(release): {version} [skip ci]"
@@ -0,0 +1,24 @@
1
+ # file generated by vcs-versioning
2
+ # don't change, don't track in version control
3
+ from __future__ import annotations
4
+
5
+ __all__ = [
6
+ "__version__",
7
+ "__version_tuple__",
8
+ "version",
9
+ "version_tuple",
10
+ "__commit_id__",
11
+ "commit_id",
12
+ ]
13
+
14
+ version: str
15
+ __version__: str
16
+ __version_tuple__: tuple[int | str, ...]
17
+ version_tuple: tuple[int | str, ...]
18
+ commit_id: str | None
19
+ __commit_id__: str | None
20
+
21
+ __version__ = version = '2.3.0'
22
+ __version_tuple__ = version_tuple = (2, 3, 0)
23
+
24
+ __commit_id__ = commit_id = None