tasktree-manager 2.9.0__tar.gz → 2.11.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.9.0 → tasktree_manager-2.11.0}/CHANGELOG.md +15 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/PKG-INFO +1 -1
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/README.md +35 -4
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/docs/configuration.md +63 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/docs/user-guide.md +40 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/pyproject.toml +1 -1
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/_version.py +2 -2
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/app.py +285 -9
- tasktree_manager-2.11.0/tasktree_manager/cli.py +431 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/commands.py +5 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/services/__init__.py +4 -0
- tasktree_manager-2.11.0/tasktree_manager/services/agent_sessions.py +157 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/services/config.py +92 -8
- tasktree_manager-2.11.0/tasktree_manager/services/forge.py +349 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/services/git_ops.py +56 -11
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/services/models.py +16 -2
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/services/task_manager.py +117 -7
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/create_modal.py +54 -1
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/worktree_list.py +76 -22
- tasktree_manager-2.11.0/tests/conftest.py +363 -0
- tasktree_manager-2.11.0/tests/test_agent_sessions.py +170 -0
- tasktree_manager-2.11.0/tests/test_cli.py +453 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/test_config.py +71 -0
- tasktree_manager-2.11.0/tests/test_forge.py +318 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/test_git_ops.py +131 -12
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/test_task_manager.py +189 -0
- tasktree_manager-2.11.0/tests/test_worktree_badges.py +234 -0
- tasktree_manager-2.9.0/tests/conftest.py +0 -207
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/SKILL.md +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/assets/README.md +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/assets/dashboard_app.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/assets/data_viewer.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/assets/todo_app.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/assets/worker_demo.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/references/layouts.md +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/references/official-guides-index.md +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/references/styling.md +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/references/widgets.md +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.github/templates/CHANGELOG.md.j2 +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.github/workflows/ci.yml +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.github/workflows/release.yml +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/.gitignore +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/CONTRIBUTING.md +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/LICENSE +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/OPENSPEC.md +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/ROADMAP.md +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/docs/claude-code-integration-spec.md +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/docs/installation.md +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/docs/troubleshooting.md +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/mise.toml +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/scripts/bump_version.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/__init__.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/services/claude_hooks.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/themes.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/__init__.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/app_header.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/messages_panel.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/setup_modal.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/status_panel.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/task_list.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/__init__.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/test_app.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/test_claude_hooks.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/test_commands.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/test_integration_git.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/test_memory.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/test_messages_panel.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/test_modals.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/test_setup_modal.py +0 -0
- {tasktree_manager-2.9.0 → tasktree_manager-2.11.0}/tests/test_status_panel.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.11.0] - 2026-07-30
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
- Add agent dashboard, forge-aware safety, finish/status CLI
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
- **cli**: Collapse multi-line f-string per ruff format
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
## [2.10.0] - 2026-07-23
|
|
28
|
+
|
|
29
|
+
### Added
|
|
30
|
+
- **cli**: Add headless CLI for task management
|
|
31
|
+
|
|
32
|
+
|
|
18
33
|
## [2.9.0] - 2026-07-14
|
|
19
34
|
|
|
20
35
|
### Added
|
|
@@ -18,6 +18,10 @@
|
|
|
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
|
|
21
|
+
- 🤖 **Headless CLI** - Create, list, inspect, finish, and delete tasks from scripts and AI agents without opening the TUI
|
|
22
|
+
- 🛰️ **Agent Dashboard** - Live Claude Code session state per worktree (from `claude agents`), plus one-key background-agent dispatch — the multi-repo agent view Claude Code lacks natively
|
|
23
|
+
- 🔀 **Forge-Aware Safety** - MR/PR and CI state via `glab`/`gh`; squash- and rebase-merged branches count as merged instead of blocking deletion forever
|
|
24
|
+
- 📦 **Finish Flow with Archives** - Ending a task saves its combined diff (committed-but-unmerged + uncommitted) to an archive before deleting
|
|
21
25
|
|
|
22
26
|
## 📊 Status Indicators
|
|
23
27
|
|
|
@@ -25,12 +29,15 @@
|
|
|
25
29
|
|-----------|---------|
|
|
26
30
|
| `●` red | Uncommitted changes |
|
|
27
31
|
| `◆` blue | Has CLAUDE.md file |
|
|
28
|
-
| `⟳` magenta | Claude Code session running |
|
|
32
|
+
| `⟳` magenta | Claude Code session running / agent working |
|
|
29
33
|
| `!` yellow | Claude Code session waiting for input |
|
|
34
|
+
| `▣` green | Agent session ready (idle) |
|
|
30
35
|
| `✓` green | Clean worktree / Claude session ended |
|
|
31
36
|
| `✗ N` red | N files changed |
|
|
32
37
|
| `↑N` green | N commits ahead of remote |
|
|
33
38
|
| `↓N` yellow | N commits behind remote |
|
|
39
|
+
| `○` green / `●` magenta / `×` red | MR open / merged / closed |
|
|
40
|
+
| `◐` yellow / `✔` green / `✘` red | CI running / passed / failed |
|
|
34
41
|
|
|
35
42
|
## 🚀 Quick Start
|
|
36
43
|
|
|
@@ -63,6 +70,27 @@ On first run, you'll configure:
|
|
|
63
70
|
|
|
64
71
|
For detailed workflows and examples, see the [User Guide](docs/user-guide.md).
|
|
65
72
|
|
|
73
|
+
### Headless CLI
|
|
74
|
+
|
|
75
|
+
Running `tasktree-manager` with arguments skips the TUI — useful for scripts and AI-agent
|
|
76
|
+
workflows (e.g. a skill that creates a Jira ticket and then the matching task):
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
tasktree-manager create DIC-1901-argocd-tls --repos backend,frontend # --base overrides the default base branch
|
|
80
|
+
tasktree-manager list --json # tasks with repos and dirty state (plain text without --json)
|
|
81
|
+
tasktree-manager repos # available repos in REPOS_DIR
|
|
82
|
+
tasktree-manager add-repo DIC-1901-argocd-tls infra
|
|
83
|
+
tasktree-manager status # current task inferred from $PWD; also --json / --oneline / --forge
|
|
84
|
+
tasktree-manager finish DIC-1901-argocd-tls # safety sweep -> archive diff -> delete; --push / --no-archive / --force
|
|
85
|
+
tasktree-manager delete DIC-1901-argocd-tls # low-level delete; refuses on unfinished work; --force overrides
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Exit code is 0 on success, 1 on failure with the reason on stderr. `delete` and `finish` run
|
|
89
|
+
the same safety check as the TUI (uncommitted, unpushed, or unmerged work blocks deletion);
|
|
90
|
+
with `glab`/`gh` installed, squash/rebase-merged branches are recognized as merged.
|
|
91
|
+
`status --oneline` emits a compact `TASK repoA✓ repoB●2↑1` summary that slots straight into
|
|
92
|
+
a Claude Code statusline or shell prompt.
|
|
93
|
+
|
|
66
94
|
## 📖 Documentation
|
|
67
95
|
|
|
68
96
|
**Complete guides:**
|
|
@@ -81,6 +109,7 @@ For detailed workflows and examples, see the [User Guide](docs/user-guide.md).
|
|
|
81
109
|
| `p` | Push all | `o` | Open folder |
|
|
82
110
|
| `P` | Pull all | `Enter` | Open shell |
|
|
83
111
|
| `c` | Claude (resume) | `C` | Claude (new) |
|
|
112
|
+
| `b` | Dispatch agent | `D` | Delete worktree |
|
|
84
113
|
| `r` | Refresh | `s` | Sort tasks |
|
|
85
114
|
| `S` | Group worktrees | `m` | Messages |
|
|
86
115
|
| `t` | Cycle theme | `Tab` | Next panel |
|
|
@@ -160,11 +189,13 @@ For comprehensive troubleshooting, see the [Troubleshooting Guide](docs/troubles
|
|
|
160
189
|
|
|
161
190
|
## 🗺️ Roadmap
|
|
162
191
|
|
|
163
|
-
|
|
192
|
+
Recently shipped: agent dashboard (per-worktree Claude session badges + background dispatch),
|
|
193
|
+
forge-aware merged detection (glab/gh, squash/rebase merges), MR/CI status badges,
|
|
194
|
+
guided `finish` flow with diff archiving, `status` subcommand for scripts and statuslines.
|
|
164
195
|
|
|
165
196
|
Upcoming:
|
|
166
|
-
- **v0.3.0** - Search/filter, task templates
|
|
167
|
-
- **v0.4.0** - JIRA
|
|
197
|
+
- **v0.3.0** - Search/filter, task templates
|
|
198
|
+
- **v0.4.0** - JIRA status column, git hooks, automation
|
|
168
199
|
- **v1.0.0** - Stable release
|
|
169
200
|
|
|
170
201
|
See [ROADMAP.md](ROADMAP.md) and [CHANGELOG.md](CHANGELOG.md) for details.
|
|
@@ -79,6 +79,11 @@ repos_dir = "/Users/username/repos"
|
|
|
79
79
|
# Created automatically if it doesn't exist
|
|
80
80
|
tasks_dir = "/Users/username/tasks"
|
|
81
81
|
|
|
82
|
+
# Directory for finished-task diff archives
|
|
83
|
+
# Relative paths resolve under tasks_dir (never the current directory)
|
|
84
|
+
# Default: "" (uses <tasks_dir>/.archive)
|
|
85
|
+
archive_dir = ""
|
|
86
|
+
|
|
82
87
|
# ============================================================================
|
|
83
88
|
# UI Settings
|
|
84
89
|
# ============================================================================
|
|
@@ -99,6 +104,16 @@ show_hidden_files = false
|
|
|
99
104
|
# Default: 30
|
|
100
105
|
refresh_interval = 30
|
|
101
106
|
|
|
107
|
+
# Claude agent session poll interval in seconds (0 = disabled)
|
|
108
|
+
# Polls `claude agents --json` for per-worktree session state badges
|
|
109
|
+
# Default: 10
|
|
110
|
+
agent_poll_interval = 10
|
|
111
|
+
|
|
112
|
+
# MR/CI forge status poll interval in seconds (0 = disabled)
|
|
113
|
+
# Polls glab/gh for MR and pipeline state badges in the worktree list
|
|
114
|
+
# Default: 60
|
|
115
|
+
forge_poll_interval = 60
|
|
116
|
+
|
|
102
117
|
# ============================================================================
|
|
103
118
|
# Git Settings
|
|
104
119
|
# ============================================================================
|
|
@@ -170,6 +185,32 @@ claude_repo_memory = true
|
|
|
170
185
|
# Default: "" (uses $SHELL, falls back to /bin/bash)
|
|
171
186
|
shell = ""
|
|
172
187
|
|
|
188
|
+
# Path to glab executable (GitLab CLI, used for MR/CI status)
|
|
189
|
+
# Default: "glab" (searches PATH)
|
|
190
|
+
glab_path = "glab"
|
|
191
|
+
|
|
192
|
+
# Path to gh executable (GitHub CLI, used for PR/CI status)
|
|
193
|
+
# Default: "gh" (searches PATH)
|
|
194
|
+
gh_path = "gh"
|
|
195
|
+
|
|
196
|
+
# ============================================================================
|
|
197
|
+
# Forge (MR/PR state via glab/gh)
|
|
198
|
+
# ============================================================================
|
|
199
|
+
[forge]
|
|
200
|
+
|
|
201
|
+
# Query MR/PR and CI state from GitLab/GitHub CLIs.
|
|
202
|
+
# Used for worktree badges, squash-merge-aware safety checks, and
|
|
203
|
+
# `status --forge`. Set to false to disable all forge lookups
|
|
204
|
+
# (e.g. air-gapped environments).
|
|
205
|
+
# Default: true
|
|
206
|
+
enabled = true
|
|
207
|
+
|
|
208
|
+
# Extra self-hosted GitLab hostnames. Hosts containing "gitlab" and
|
|
209
|
+
# github.com are auto-detected from each repo's origin URL; list hosts
|
|
210
|
+
# here only when the hostname doesn't contain "gitlab".
|
|
211
|
+
# Default: []
|
|
212
|
+
gitlab_hosts = []
|
|
213
|
+
|
|
173
214
|
# ============================================================================
|
|
174
215
|
# Keybindings
|
|
175
216
|
# ============================================================================
|
|
@@ -187,6 +228,7 @@ help = "?" # Show help modal
|
|
|
187
228
|
new_task = "n" # Create new task
|
|
188
229
|
add_repo = "a" # Add repository to current task
|
|
189
230
|
delete_task = "d" # Delete/finish task
|
|
231
|
+
delete_worktree = "D" # Remove single worktree from task (shift+d)
|
|
190
232
|
|
|
191
233
|
# Git operations
|
|
192
234
|
open_lazygit = "g" # Open lazygit in selected worktree
|
|
@@ -201,6 +243,7 @@ refresh = "r" # Refresh git status
|
|
|
201
243
|
# Claude Code integration
|
|
202
244
|
open_claude_resume = "c" # Open Claude CLI (resume if a session exists, else new)
|
|
203
245
|
open_claude_gui_code = "C" # Open Claude desktop on Code page in task folder (shift+c)
|
|
246
|
+
dispatch_agent = "b" # Dispatch background Claude agent in selected worktree
|
|
204
247
|
|
|
205
248
|
# Messages panel
|
|
206
249
|
toggle_messages = "m" # Show/hide the activity messages panel
|
|
@@ -245,6 +288,7 @@ blocklist = [
|
|
|
245
288
|
|------------|------|-----------|---------------------|------------------------------------------------|
|
|
246
289
|
| `repos_dir` | path | `~/repos` | `REPOS_DIR` | Directory containing your git repositories |
|
|
247
290
|
| `tasks_dir` | path | `~/tasks` | `TASKS_DIR` | Directory where task worktrees will be created |
|
|
291
|
+
| `archive_dir` | path | `""` (`<tasks_dir>/.archive`) | - | Directory for finished-task diff archives |
|
|
248
292
|
|
|
249
293
|
### Details
|
|
250
294
|
|
|
@@ -280,6 +324,8 @@ tasks_dir = "/Volumes/FastSSD/worktrees"
|
|
|
280
324
|
| `theme` | string | `tasktree` | `TASKTREE_THEME` | Color theme for the interface |
|
|
281
325
|
| `show_hidden_files` | boolean | `false` | - | Show hidden files in listings |
|
|
282
326
|
| `refresh_interval` | integer | `30` | - | Auto-refresh interval in seconds (0 = disabled) |
|
|
327
|
+
| `agent_poll_interval` | integer | `10` | - | Claude agent session poll in seconds (0 = disabled) |
|
|
328
|
+
| `forge_poll_interval` | integer | `60` | - | MR/CI forge status poll in seconds (0 = disabled) |
|
|
283
329
|
|
|
284
330
|
### `theme`
|
|
285
331
|
|
|
@@ -354,6 +400,23 @@ refresh_interval = 15 # Refresh every 15 seconds
|
|
|
354
400
|
| `lazygit_path` | string | `"lazygit"` | - | Path to lazygit executable |
|
|
355
401
|
| `hunk_path` | string | `"hunk"` | - | Path to hunk diff-viewer executable |
|
|
356
402
|
| `shell` | string | `""` | `SHELL` | Shell to use when opening terminals |
|
|
403
|
+
| `glab_path` | string | `"glab"` | - | Path to GitLab CLI (MR/CI status) |
|
|
404
|
+
| `gh_path` | string | `"gh"` | - | Path to GitHub CLI (PR/CI status) |
|
|
405
|
+
|
|
406
|
+
## Forge Settings
|
|
407
|
+
|
|
408
|
+
MR/PR and CI state is looked up through the GitLab (`glab`) and GitHub (`gh`)
|
|
409
|
+
CLIs. The provider is auto-detected per repository from its `origin` URL:
|
|
410
|
+
`github.com` uses `gh`; hosts containing "gitlab" (or listed in
|
|
411
|
+
`gitlab_hosts`) use `glab`; anything else (including local-path remotes) is
|
|
412
|
+
skipped. Lookups power the worktree MR/CI badges, squash-merge-aware safety
|
|
413
|
+
checks, and `tasktree-manager status --forge`. Missing CLIs or network
|
|
414
|
+
failures degrade silently — features fall back to plain git behavior.
|
|
415
|
+
|
|
416
|
+
| Option | Type | Default | Description |
|
|
417
|
+
|----------------|------------|---------|----------------------------------------------------|
|
|
418
|
+
| `enabled` | boolean | `true` | Master switch for all forge lookups |
|
|
419
|
+
| `gitlab_hosts` | array[str] | `[]` | Extra self-hosted GitLab hostnames to auto-detect |
|
|
357
420
|
|
|
358
421
|
### Details
|
|
359
422
|
|
|
@@ -364,6 +364,7 @@ Useful when you're spinning up several similar tasks that share the same set of
|
|
|
364
364
|
|---------|-------------------------|------------------------------------------------------------|
|
|
365
365
|
| `c` | Open Claude CLI | Resume the task's Claude Code session if one exists, otherwise start a new one |
|
|
366
366
|
| `C` | Open Claude desktop | Open the Claude desktop app on the Code page at the task folder |
|
|
367
|
+
| `b` | Dispatch agent | Run a background Claude agent (`claude --bg`) in the selected worktree |
|
|
367
368
|
|
|
368
369
|
**How it works:**
|
|
369
370
|
- `c` opens Claude Code CLI in a new Ghostty terminal tab at the task directory.
|
|
@@ -374,6 +375,35 @@ Useful when you're spinning up several similar tasks that share the same set of
|
|
|
374
375
|
- 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.
|
|
375
376
|
- Each worktree additionally gets its own `.claude/settings.local.json` pointing auto-memory at the **main repo's** memory directory (`claude_repo_memory`, enabled by default). Sessions started manually inside a worktree (`cd` + `claude`) would otherwise key their memory to the worktree path and lose it when the worktree is deleted; with this, what Claude learns about a repo persists across worktrees and is shared with sessions in the main checkout. The file is git-excluded so worktrees stay clean, and these sessions also report status back to the task indicator.
|
|
376
377
|
|
|
378
|
+
**Agent dashboard:**
|
|
379
|
+
|
|
380
|
+
Claude Code's native agent view is scoped to a single repository — it has no concept of a
|
|
381
|
+
task spanning several repos. tasktree-manager fills that gap:
|
|
382
|
+
|
|
383
|
+
- The worktree list polls `claude agents --json` (every `agent_poll_interval` seconds,
|
|
384
|
+
default 10) and shows a per-worktree session badge: `⟳` working, `!` needs input,
|
|
385
|
+
`▣` ready/idle. Any Claude session whose working directory is inside a worktree counts,
|
|
386
|
+
whether started from the TUI, the dashboard, or a plain terminal.
|
|
387
|
+
- `b` prompts for an instruction and dispatches a background agent
|
|
388
|
+
(`claude --bg -n <task>/<repo>`) into the selected worktree. Dispatch results land in
|
|
389
|
+
the messages panel (`m`), and the session appears in `claude agents` under the
|
|
390
|
+
`<task>/<repo>` name. Dispatch to several worktrees in parallel is fine.
|
|
391
|
+
- If the `claude` CLI is missing or too old for `agents --json`, polling disables itself
|
|
392
|
+
after three failed attempts (one note in the messages panel) — the rest of the app is
|
|
393
|
+
unaffected.
|
|
394
|
+
|
|
395
|
+
**Forge badges (MR/CI):**
|
|
396
|
+
|
|
397
|
+
With the GitLab (`glab`) or GitHub (`gh`) CLI installed and authenticated, the worktree
|
|
398
|
+
list also shows each branch's MR state (`○` open, `●` merged, `×` closed) and CI state
|
|
399
|
+
(`◐` running, `✔` passed, `✘` failed; GitHub only — GitLab's MR list API carries no
|
|
400
|
+
pipeline data). The provider is auto-detected from each repo's origin URL; self-hosted
|
|
401
|
+
GitLab works when the hostname contains "gitlab" or is listed under `[forge]
|
|
402
|
+
gitlab_hosts`. The same lookup makes safety checks recognize squash/rebase-merged
|
|
403
|
+
branches: a branch whose MR is merged no longer blocks task deletion even though
|
|
404
|
+
`git merge-base` cannot see the merge. Set `[forge] enabled = false` to turn all of
|
|
405
|
+
this off.
|
|
406
|
+
|
|
377
407
|
### General
|
|
378
408
|
|
|
379
409
|
| Key | Action | Description |
|
|
@@ -623,14 +653,24 @@ d (delete task)
|
|
|
623
653
|
- tasktree-manager checks for uncommitted changes
|
|
624
654
|
- Checks for unpushed commits
|
|
625
655
|
- Offers to push before deletion
|
|
656
|
+
- With `glab`/`gh` installed, branches whose MR/PR was squash- or rebase-merged count as
|
|
657
|
+
merged (plain `git merge-base` cannot see those merges)
|
|
626
658
|
- Force delete available (with confirmation)
|
|
627
659
|
|
|
628
660
|
**What happens on delete:**
|
|
661
|
+
- ✅ The task's remaining diff (committed-but-unmerged + uncommitted work) is archived to
|
|
662
|
+
`archive_dir` (default `<tasks_dir>/.archive/<task>-<timestamp>.patch`) before anything
|
|
663
|
+
is removed — the messages panel (`m`) shows the archive path
|
|
629
664
|
- ✅ Worktrees removed from `TASKS_DIR`
|
|
630
665
|
- ✅ Branches remain on remote (if pushed)
|
|
631
666
|
- ✅ Original repos in `REPOS_DIR` untouched
|
|
632
667
|
- ❌ Local branches remain in original repos (cleanup manually if needed)
|
|
633
668
|
|
|
669
|
+
**From scripts:** `tasktree-manager finish <task>` runs the same guided flow headlessly
|
|
670
|
+
(safety sweep → optional `--push` → archive → delete), and `tasktree-manager status
|
|
671
|
+
[--json|--oneline] [--forge]` reports per-worktree state — see the README's Headless CLI
|
|
672
|
+
section.
|
|
673
|
+
|
|
634
674
|
### Manual Cleanup
|
|
635
675
|
|
|
636
676
|
If tasktree-manager crashes or worktrees are corrupted:
|
|
@@ -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.11.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.11.0'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 11, 0)
|
|
23
23
|
|
|
24
24
|
__commit_id__ = commit_id = None
|