tasktree-manager 2.10.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.
Files changed (72) hide show
  1. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/CHANGELOG.md +9 -0
  2. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/PKG-INFO +1 -1
  3. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/README.md +22 -8
  4. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/docs/configuration.md +63 -0
  5. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/docs/user-guide.md +40 -0
  6. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/pyproject.toml +1 -1
  7. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/_version.py +2 -2
  8. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/app.py +279 -8
  9. tasktree_manager-2.11.0/tasktree_manager/cli.py +431 -0
  10. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/commands.py +5 -0
  11. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/services/__init__.py +4 -0
  12. tasktree_manager-2.11.0/tasktree_manager/services/agent_sessions.py +157 -0
  13. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/services/config.py +92 -8
  14. tasktree_manager-2.11.0/tasktree_manager/services/forge.py +349 -0
  15. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/services/git_ops.py +56 -11
  16. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/services/models.py +16 -2
  17. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/services/task_manager.py +117 -7
  18. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/create_modal.py +54 -1
  19. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/worktree_list.py +76 -22
  20. tasktree_manager-2.11.0/tests/conftest.py +363 -0
  21. tasktree_manager-2.11.0/tests/test_agent_sessions.py +170 -0
  22. tasktree_manager-2.11.0/tests/test_cli.py +453 -0
  23. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/test_config.py +71 -0
  24. tasktree_manager-2.11.0/tests/test_forge.py +318 -0
  25. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/test_git_ops.py +131 -12
  26. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/test_task_manager.py +189 -0
  27. tasktree_manager-2.11.0/tests/test_worktree_badges.py +234 -0
  28. tasktree_manager-2.10.0/tasktree_manager/cli.py +0 -198
  29. tasktree_manager-2.10.0/tests/conftest.py +0 -207
  30. tasktree_manager-2.10.0/tests/test_cli.py +0 -237
  31. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/SKILL.md +0 -0
  32. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/assets/README.md +0 -0
  33. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/assets/dashboard_app.py +0 -0
  34. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/assets/data_viewer.py +0 -0
  35. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/assets/todo_app.py +0 -0
  36. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/assets/worker_demo.py +0 -0
  37. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/references/layouts.md +0 -0
  38. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/references/official-guides-index.md +0 -0
  39. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/references/styling.md +0 -0
  40. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.claude/skills/textual-tui/references/widgets.md +0 -0
  41. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.github/templates/CHANGELOG.md.j2 +0 -0
  42. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.github/workflows/ci.yml +0 -0
  43. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.github/workflows/release.yml +0 -0
  44. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/.gitignore +0 -0
  45. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/CONTRIBUTING.md +0 -0
  46. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/LICENSE +0 -0
  47. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/OPENSPEC.md +0 -0
  48. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/ROADMAP.md +0 -0
  49. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/docs/claude-code-integration-spec.md +0 -0
  50. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/docs/installation.md +0 -0
  51. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/docs/troubleshooting.md +0 -0
  52. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/mise.toml +0 -0
  53. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/scripts/bump_version.py +0 -0
  54. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/__init__.py +0 -0
  55. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/services/claude_hooks.py +0 -0
  56. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/themes.py +0 -0
  57. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/__init__.py +0 -0
  58. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/app_header.py +0 -0
  59. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/messages_panel.py +0 -0
  60. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/setup_modal.py +0 -0
  61. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/status_panel.py +0 -0
  62. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tasktree_manager/widgets/task_list.py +0 -0
  63. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/__init__.py +0 -0
  64. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/test_app.py +0 -0
  65. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/test_claude_hooks.py +0 -0
  66. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/test_commands.py +0 -0
  67. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/test_integration_git.py +0 -0
  68. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/test_memory.py +0 -0
  69. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/test_messages_panel.py +0 -0
  70. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/test_modals.py +0 -0
  71. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/test_setup_modal.py +0 -0
  72. {tasktree_manager-2.10.0 → tasktree_manager-2.11.0}/tests/test_status_panel.py +0 -0
@@ -15,6 +15,15 @@ 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
+
18
27
  ## [2.10.0] - 2026-07-23
19
28
 
20
29
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tasktree-manager
3
- Version: 2.10.0
3
+ Version: 2.11.0
4
4
  Summary: TUI application for managing worktree-based tasks
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.10
@@ -18,7 +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, and delete tasks from scripts and AI agents without opening the TUI
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
22
25
 
23
26
  ## 📊 Status Indicators
24
27
 
@@ -26,12 +29,15 @@
26
29
  |-----------|---------|
27
30
  | `●` red | Uncommitted changes |
28
31
  | `◆` blue | Has CLAUDE.md file |
29
- | `⟳` magenta | Claude Code session running |
32
+ | `⟳` magenta | Claude Code session running / agent working |
30
33
  | `!` yellow | Claude Code session waiting for input |
34
+ | `▣` green | Agent session ready (idle) |
31
35
  | `✓` green | Clean worktree / Claude session ended |
32
36
  | `✗ N` red | N files changed |
33
37
  | `↑N` green | N commits ahead of remote |
34
38
  | `↓N` yellow | N commits behind remote |
39
+ | `○` green / `●` magenta / `×` red | MR open / merged / closed |
40
+ | `◐` yellow / `✔` green / `✘` red | CI running / passed / failed |
35
41
 
36
42
  ## 🚀 Quick Start
37
43
 
@@ -74,11 +80,16 @@ tasktree-manager create DIC-1901-argocd-tls --repos backend,frontend # --base o
74
80
  tasktree-manager list --json # tasks with repos and dirty state (plain text without --json)
75
81
  tasktree-manager repos # available repos in REPOS_DIR
76
82
  tasktree-manager add-repo DIC-1901-argocd-tls infra
77
- tasktree-manager delete DIC-1901-argocd-tls # refuses on unfinished work; --force overrides
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
78
86
  ```
79
87
 
80
- Exit code is 0 on success, 1 on failure with the reason on stderr. `delete` runs the same
81
- safety check as the TUI (uncommitted, unpushed, or unmerged work blocks deletion).
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.
82
93
 
83
94
  ## 📖 Documentation
84
95
 
@@ -98,6 +109,7 @@ safety check as the TUI (uncommitted, unpushed, or unmerged work blocks deletion
98
109
  | `p` | Push all | `o` | Open folder |
99
110
  | `P` | Pull all | `Enter` | Open shell |
100
111
  | `c` | Claude (resume) | `C` | Claude (new) |
112
+ | `b` | Dispatch agent | `D` | Delete worktree |
101
113
  | `r` | Refresh | `s` | Sort tasks |
102
114
  | `S` | Group worktrees | `m` | Messages |
103
115
  | `t` | Cycle theme | `Tab` | Next panel |
@@ -177,11 +189,13 @@ For comprehensive troubleshooting, see the [Troubleshooting Guide](docs/troubles
177
189
 
178
190
  ## 🗺️ Roadmap
179
191
 
180
- Current: **v0.2.0** - Configuration system, themes, comprehensive documentation
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.
181
195
 
182
196
  Upcoming:
183
- - **v0.3.0** - Search/filter, task templates, archiving
184
- - **v0.4.0** - JIRA integration, git hooks, automation
197
+ - **v0.3.0** - Search/filter, task templates
198
+ - **v0.4.0** - JIRA status column, git hooks, automation
185
199
  - **v1.0.0** - Stable release
186
200
 
187
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.10.0"
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.10.0'
22
- __version_tuple__ = version_tuple = (2, 10, 0)
21
+ __version__ = version = '2.11.0'
22
+ __version_tuple__ = version_tuple = (2, 11, 0)
23
23
 
24
24
  __commit_id__ = commit_id = None