tasktree-manager 2.2.0__tar.gz → 2.4.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.2.0 → tasktree_manager-2.4.0}/CHANGELOG.md +15 -0
  2. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/PKG-INFO +1 -1
  3. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/docs/configuration.md +11 -9
  4. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/docs/user-guide.md +23 -7
  5. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/pyproject.toml +1 -1
  6. tasktree_manager-2.4.0/tasktree_manager/_version.py +24 -0
  7. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/app.py +428 -276
  8. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/services/claude_hooks.py +13 -0
  9. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/services/config.py +34 -43
  10. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/services/git_ops.py +125 -71
  11. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/services/models.py +10 -1
  12. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/services/task_manager.py +34 -14
  13. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/widgets/create_modal.py +29 -7
  14. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/widgets/status_panel.py +23 -20
  15. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/widgets/task_list.py +24 -4
  16. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/widgets/worktree_list.py +14 -1
  17. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tests/test_app.py +157 -1
  18. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tests/test_git_ops.py +142 -0
  19. tasktree_manager-2.2.0/tasktree_manager/_version.py +0 -34
  20. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.claude/skills/textual-tui/SKILL.md +0 -0
  21. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.claude/skills/textual-tui/assets/README.md +0 -0
  22. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.claude/skills/textual-tui/assets/dashboard_app.py +0 -0
  23. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.claude/skills/textual-tui/assets/data_viewer.py +0 -0
  24. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.claude/skills/textual-tui/assets/todo_app.py +0 -0
  25. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.claude/skills/textual-tui/assets/worker_demo.py +0 -0
  26. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.claude/skills/textual-tui/references/layouts.md +0 -0
  27. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.claude/skills/textual-tui/references/official-guides-index.md +0 -0
  28. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.claude/skills/textual-tui/references/styling.md +0 -0
  29. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.claude/skills/textual-tui/references/widgets.md +0 -0
  30. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.github/templates/CHANGELOG.md.j2 +0 -0
  31. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.github/workflows/ci.yml +0 -0
  32. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.github/workflows/release.yml +0 -0
  33. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/.gitignore +0 -0
  34. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/CONTRIBUTING.md +0 -0
  35. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/LICENSE +0 -0
  36. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/OPENSPEC.md +0 -0
  37. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/README.md +0 -0
  38. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/ROADMAP.md +0 -0
  39. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/docs/claude-code-integration-spec.md +0 -0
  40. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/docs/installation.md +0 -0
  41. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/docs/troubleshooting.md +0 -0
  42. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/mise.toml +0 -0
  43. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/scripts/bump_version.py +0 -0
  44. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/__init__.py +0 -0
  45. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/services/__init__.py +0 -0
  46. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/widgets/__init__.py +0 -0
  47. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/widgets/messages_panel.py +0 -0
  48. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tasktree_manager/widgets/setup_modal.py +0 -0
  49. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tests/__init__.py +0 -0
  50. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tests/conftest.py +0 -0
  51. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tests/test_config.py +0 -0
  52. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tests/test_integration_git.py +0 -0
  53. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tests/test_memory.py +0 -0
  54. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tests/test_messages_panel.py +0 -0
  55. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tests/test_modals.py +0 -0
  56. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tests/test_setup_modal.py +0 -0
  57. {tasktree_manager-2.2.0 → tasktree_manager-2.4.0}/tests/test_status_panel.py +0 -0
  58. {tasktree_manager-2.2.0 → tasktree_manager-2.4.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.4.0] - 2026-06-10
19
+
20
+ ### Added
21
+ - Context-sensitive footer showing the focused panel's keys (#6)
22
+
23
+
24
+ ## [2.3.0] - 2026-06-10
25
+
26
+ ### Added
27
+ - Add task cloning, worktree deletion, and non-blocking git ops (#4)
28
+
29
+ ### Fixed
30
+ - Honor git timeout, real status codes, non-blocking delete (#5)
31
+
32
+
18
33
  ## [2.2.0] - 2026-03-06
19
34
 
20
35
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tasktree-manager
3
- Version: 2.2.0
3
+ Version: 2.4.0
4
4
  Summary: TUI application for managing worktree-based tasks
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.10
@@ -166,8 +166,8 @@ pull_all = "P" # Pull all worktrees in current task (shift+p)
166
166
  refresh = "r" # Refresh git status
167
167
 
168
168
  # Claude Code integration
169
- open_claude_resume = "c" # Resume Claude Code session in task directory
170
- open_claude_new = "C" # Start new Claude Code session (shift+c)
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
171
 
172
172
  # Messages panel
173
173
  toggle_messages = "m" # Show/hide the activity messages panel
@@ -294,7 +294,8 @@ refresh_interval = 15 # Refresh every 15 seconds
294
294
  - Most users should use manual push (`p` key) for control
295
295
 
296
296
  **`timeout`:**
297
- - 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
298
299
  - Increase for slow networks or large repositories
299
300
  - Set to `60` or higher for very large repos
300
301
 
@@ -417,7 +418,7 @@ blocklist = ["*"]
417
418
 
418
419
  ## Keybindings Reference
419
420
 
420
- All 21 customizable keybindings with descriptions:
421
+ All 22 customizable keybindings with descriptions:
421
422
 
422
423
  ### Application Control
423
424
 
@@ -431,6 +432,7 @@ All 21 customizable keybindings with descriptions:
431
432
  | Action | Default | Description | Customization Example |
432
433
  |---------------|---------|----------------------------------------|----------------------------|
433
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"` |
434
436
  | `add_repo` | `a` | Add repository to current task | `add_repo = "ctrl+a"` |
435
437
  | `delete_task` | `d` | Delete/finish current task | `delete_task = "delete"` |
436
438
 
@@ -448,11 +450,11 @@ All 21 customizable keybindings with descriptions:
448
450
 
449
451
  ### Claude Code Integration
450
452
 
451
- | Action | Default | Description | Customization Example |
452
- |----------------------|---------|------------------------------------------|--------------------------------------|
453
- | `open_claude_resume` | `c` | Resume Claude Code session in task dir | `open_claude_resume = "ctrl+c"` |
454
- | `open_claude_new` | `C` | Start new Claude Code session | `open_claude_new = "ctrl+shift+c"` |
455
- | `toggle_messages` | `m` | Show/hide activity messages panel | `toggle_messages = "ctrl+m"` |
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"` |
456
458
 
457
459
  ### Navigation
458
460
 
@@ -246,6 +246,12 @@ Shows detailed git status for the selected worktree:
246
246
 
247
247
  All keybindings can be customized in [`config.toml`](configuration.md).
248
248
 
249
+ The footer is context-sensitive, lazygit-style: it shows the actions for the
250
+ focused panel (task actions in the Task List, worktree/git actions in the
251
+ Worktree List) plus the always-available `r` Refresh, `?` Help, and `q` Quit.
252
+ Every key works regardless of which panel has focus — the footer only changes
253
+ what is displayed. Press `?` for the full reference at any time.
254
+
249
255
  ### Navigation
250
256
 
251
257
  | Key | Action | Description |
@@ -285,6 +291,7 @@ All keybindings can be customized in [`config.toml`](configuration.md).
285
291
  | Key | Action | Description |
286
292
  |-----|------------------|-----------------------------------------------------------|
287
293
  | `n` | New task | Create a new task with selected repositories |
294
+ | `y` | Clone task | Create a new task pre-populated with the current task's repos |
288
295
  | `a` | Add repository | Add additional repositories to the current task |
289
296
  | `d` | Delete/finish | Delete current task and remove worktrees |
290
297
 
@@ -296,6 +303,14 @@ All keybindings can be customized in [`config.toml`](configuration.md).
296
303
  5. Select repos with `Space` (can select multiple)
297
304
  6. Tab to "Create" button, press `Enter`
298
305
 
306
+ **Clone task workflow:**
307
+ Useful when you're spinning up several similar tasks that share the same set of repos.
308
+
309
+ 1. Highlight the source task in the left panel
310
+ 2. Press `y`
311
+ 3. The modal opens with the source task's repos already selected — just enter a new task name
312
+ 4. Adjust the repo selection or base branch if needed, then press `Enter`
313
+
299
314
  **Task deletion workflow:**
300
315
  1. Highlight task in left panel
301
316
  2. Press `d`
@@ -333,15 +348,16 @@ All keybindings can be customized in [`config.toml`](configuration.md).
333
348
 
334
349
  ### Claude Code Integration
335
350
 
336
- | Key | Action | Description |
337
- |---------|-------------------------|----------------------------------------------|
338
- | `c` | Open Claude (resume) | Resume Claude Code session in task directory |
339
- | `C` | Open Claude (new) | Start new Claude Code session in task directory |
351
+ | Key | Action | Description |
352
+ |---------|-------------------------|------------------------------------------------------------|
353
+ | `c` | Open Claude CLI | Resume the task's Claude Code session if one exists, otherwise start a new one |
354
+ | `C` | Open Claude desktop | Open the Claude desktop app on the Code page at the task folder |
340
355
 
341
356
  **How it works:**
342
- - Opens Claude Code in a new Ghostty terminal tab at the task directory
343
- - Generates `CLAUDE.md` files with task/worktree context
344
- - Installs hooks that report session status back to tasktree-manager
357
+ - `c` opens Claude Code CLI in a new Ghostty terminal tab at the task directory.
358
+ - If `~/.claude/projects/<task-folder>/` already has session transcripts, runs `claude -r` to pick from them; otherwise runs `claude` to start fresh.
359
+ - `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.
345
361
  - Session status (`⟳` running, `!` waiting, `✓` ended) appears next to the task name
346
362
 
347
363
  ### General
@@ -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.2.0"
73
+ version = "2.4.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.4.0'
22
+ __version_tuple__ = version_tuple = (2, 4, 0)
23
+
24
+ __commit_id__ = commit_id = None