task-agent 1.3.8__tar.gz → 1.3.10__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 (157) hide show
  1. {task_agent-1.3.8 → task_agent-1.3.10}/PKG-INFO +2 -2
  2. {task_agent-1.3.8 → task_agent-1.3.10}/docs/cli/README.md +6 -2
  3. {task_agent-1.3.8/plugins/claude-code → task_agent-1.3.10/plugins/antigravity}/skills/complete-task/SKILL.md +8 -0
  4. {task_agent-1.3.8 → task_agent-1.3.10/plugins/claude-code}/skills/complete-task/SKILL.md +8 -0
  5. {task_agent-1.3.8 → task_agent-1.3.10}/pyproject.toml +2 -2
  6. {task_agent-1.3.8/plugins/antigravity → task_agent-1.3.10}/skills/complete-task/SKILL.md +8 -0
  7. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/cli.py +78 -5
  8. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/manager.py +416 -22
  9. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/mcp.py +32 -1
  10. task_agent-1.3.10/tests/test_manager_git.py +571 -0
  11. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_mcp.py +27 -0
  12. {task_agent-1.3.8 → task_agent-1.3.10}/uv.lock +5 -5
  13. task_agent-1.3.8/tests/test_manager_git.py +0 -253
  14. {task_agent-1.3.8 → task_agent-1.3.10}/.agents/skills/next/SKILL.md +0 -0
  15. {task_agent-1.3.8 → task_agent-1.3.10}/.gemini/settings.json +0 -0
  16. {task_agent-1.3.8 → task_agent-1.3.10}/.github/workflows/ci.yml +0 -0
  17. {task_agent-1.3.8 → task_agent-1.3.10}/.github/workflows/publish.yml +0 -0
  18. {task_agent-1.3.8 → task_agent-1.3.10}/.gitignore +0 -0
  19. {task_agent-1.3.8 → task_agent-1.3.10}/.mise.toml +0 -0
  20. {task_agent-1.3.8 → task_agent-1.3.10}/.pre-commit-config.yaml +0 -0
  21. {task_agent-1.3.8 → task_agent-1.3.10}/.python-version +0 -0
  22. {task_agent-1.3.8 → task_agent-1.3.10}/.ta/agents/agy-cli/meta.toml +0 -0
  23. {task_agent-1.3.8 → task_agent-1.3.10}/.ta/agents/antigravity/meta.toml +0 -0
  24. {task_agent-1.3.8 → task_agent-1.3.10}/.ta/agents/gh/meta.toml +0 -0
  25. {task_agent-1.3.8 → task_agent-1.3.10}/.ta/agents/minimal/meta.toml +0 -0
  26. {task_agent-1.3.8 → task_agent-1.3.10}/.ta/agents/uat-aws/meta.toml +0 -0
  27. {task_agent-1.3.8 → task_agent-1.3.10}/.ta/worker +0 -0
  28. {task_agent-1.3.8 → task_agent-1.3.10}/.ta-config.json +0 -0
  29. {task_agent-1.3.8 → task_agent-1.3.10}/CLAUDE.md +0 -0
  30. {task_agent-1.3.8 → task_agent-1.3.10}/GEMINI.md +0 -0
  31. {task_agent-1.3.8 → task_agent-1.3.10}/Makefile +0 -0
  32. {task_agent-1.3.8 → task_agent-1.3.10}/README.md +0 -0
  33. {task_agent-1.3.8 → task_agent-1.3.10}/agent.env +0 -0
  34. {task_agent-1.3.8 → task_agent-1.3.10}/docs/README.md +0 -0
  35. {task_agent-1.3.8 → task_agent-1.3.10}/docs/STATION-MAP.md +0 -0
  36. {task_agent-1.3.8 → task_agent-1.3.10}/docs/architecture/README.md +0 -0
  37. {task_agent-1.3.8 → task_agent-1.3.10}/docs/chats/gemini-conversation-1773283034591.json +0 -0
  38. {task_agent-1.3.8 → task_agent-1.3.10}/docs/chats/project-init-to-v0.1.46.md +0 -0
  39. {task_agent-1.3.8 → task_agent-1.3.10}/docs/development/README.md +0 -0
  40. {task_agent-1.3.8 → task_agent-1.3.10}/docs/task-agents.md +0 -0
  41. {task_agent-1.3.8 → task_agent-1.3.10}/docs/workflow/README.md +0 -0
  42. {task_agent-1.3.8 → task_agent-1.3.10}/docs/workflow/trivial_worker_policy.md +0 -0
  43. {task_agent-1.3.8 → task_agent-1.3.10}/opencode.json +0 -0
  44. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/antigravity/.gemini-plugin/plugin.json +0 -0
  45. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/antigravity/.mcp.json +0 -0
  46. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/antigravity/README.md +0 -0
  47. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/antigravity/hooks/hooks.json +0 -0
  48. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/antigravity/hooks/session_start.sh +0 -0
  49. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/antigravity/rules/task_agent.md +0 -0
  50. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/antigravity/scripts/statusline.sh +0 -0
  51. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/antigravity/skills/README.md +0 -0
  52. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/antigravity/skills/agent-import/SKILL.md +0 -0
  53. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/antigravity/skills/mission-workflow/SKILL.md +0 -0
  54. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/antigravity/skills/next/SKILL.md +0 -0
  55. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/antigravity/skills/next-task/SKILL.md +0 -0
  56. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  57. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/claude-code/.mcp.json +0 -0
  58. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/claude-code/README.md +0 -0
  59. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/claude-code/hooks/hooks.json +0 -0
  60. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/claude-code/hooks/session_start.sh +0 -0
  61. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/claude-code/scripts/statusline.sh +0 -0
  62. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/claude-code/skills/agent-import/SKILL.md +0 -0
  63. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/claude-code/skills/mission-workflow/SKILL.md +0 -0
  64. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/claude-code/skills/next-task/SKILL.md +0 -0
  65. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/codex/.mcp.json +0 -0
  66. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/codex/README.md +0 -0
  67. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/copilot/.mcp.json +0 -0
  68. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/copilot/README.md +0 -0
  69. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/grok/.mcp.json +0 -0
  70. {task_agent-1.3.8 → task_agent-1.3.10}/plugins/grok/README.md +0 -0
  71. {task_agent-1.3.8 → task_agent-1.3.10}/scripts/clean_duplicates.py +0 -0
  72. {task_agent-1.3.8 → task_agent-1.3.10}/scripts/migrate_tasks.py +0 -0
  73. {task_agent-1.3.8 → task_agent-1.3.10}/scripts/recover_dates.py +0 -0
  74. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/adk-worker/.env.example +0 -0
  75. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/adk-worker/README.md +0 -0
  76. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/adk-worker/instructions/manager.md +0 -0
  77. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/adk-worker/instructions/validator.md +0 -0
  78. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/adk-worker/instructions/worker.md +0 -0
  79. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/adk-worker/profiles/default.json +0 -0
  80. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/adk-worker/pyproject.toml +0 -0
  81. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/adk-worker/uv.lock +0 -0
  82. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/adk-worker/worker.py +0 -0
  83. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/keet-bridge/README.md +0 -0
  84. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/keet-bridge/bridge.js +0 -0
  85. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/keet-bridge/package-lock.json +0 -0
  86. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/keet-bridge/package.json +0 -0
  87. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/keet-bridge/run.sh +0 -0
  88. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/keet-bridge/test-e2e.js +0 -0
  89. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/matrix-bridge/README.md +0 -0
  90. {task_agent-1.3.8 → task_agent-1.3.10}/sidecars/matrix-bridge/matrix_bridge.py +0 -0
  91. {task_agent-1.3.8 → task_agent-1.3.10}/skills/README.md +0 -0
  92. {task_agent-1.3.8 → task_agent-1.3.10}/skills/agent-import/SKILL.md +0 -0
  93. {task_agent-1.3.8 → task_agent-1.3.10}/skills/mission-workflow/SKILL.md +0 -0
  94. {task_agent-1.3.8 → task_agent-1.3.10}/skills/next/SKILL.md +0 -0
  95. {task_agent-1.3.8 → task_agent-1.3.10}/skills/next-task/SKILL.md +0 -0
  96. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/__init__.py +0 -0
  97. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/__main__.py +0 -0
  98. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/agent.py +0 -0
  99. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/agent_registry.py +0 -0
  100. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/audit.py +0 -0
  101. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/chat/__init__.py +0 -0
  102. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/chat/config.py +0 -0
  103. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/chat/discovery.py +0 -0
  104. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/chat/last_used.py +0 -0
  105. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/config.py +0 -0
  106. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/discovery.py +0 -0
  107. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/importers/__init__.py +0 -0
  108. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/importers/antigravity.py +0 -0
  109. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/importers/base.py +0 -0
  110. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/importers/claude_code.py +0 -0
  111. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/importers/generic.py +0 -0
  112. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/inbox.py +0 -0
  113. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/models/__init__.py +0 -0
  114. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/models/issue.py +0 -0
  115. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/models/metric.py +0 -0
  116. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/perf.py +0 -0
  117. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/plugins/__init__.py +0 -0
  118. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/plugins/github.py +0 -0
  119. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/runner.py +0 -0
  120. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/store_registry.py +0 -0
  121. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/templates.py +0 -0
  122. {task_agent-1.3.8 → task_agent-1.3.10}/src/taskagent/theme.py +0 -0
  123. {task_agent-1.3.8 → task_agent-1.3.10}/test-dir/opencode.json +0 -0
  124. {task_agent-1.3.8 → task_agent-1.3.10}/tests/conftest.py +0 -0
  125. {task_agent-1.3.8 → task_agent-1.3.10}/tests/e2e/test_agent_sandboxing.sh +0 -0
  126. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_agent.py +0 -0
  127. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_agent_registry.py +0 -0
  128. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_agy_cli_worker.py +0 -0
  129. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_atomic_mutations.py +0 -0
  130. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_auto_commit.py +0 -0
  131. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_chat_config.py +0 -0
  132. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_chat_discovery.py +0 -0
  133. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_chat_last_used.py +0 -0
  134. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_cli.py +0 -0
  135. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_cli_windows.py +0 -0
  136. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_discovery.py +0 -0
  137. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_github_token.py +0 -0
  138. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_importers.py +0 -0
  139. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_inbox.py +0 -0
  140. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_inbox_watch.py +0 -0
  141. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_lease.py +0 -0
  142. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_manager.py +0 -0
  143. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_metrics.py +0 -0
  144. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_migration.py +0 -0
  145. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_perf.py +0 -0
  146. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_plugin_antigravity.py +0 -0
  147. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_plugin_claude.py +0 -0
  148. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_project_host_root.py +0 -0
  149. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_rebind.py +0 -0
  150. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_remote_attach.py +0 -0
  151. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_remote_create.py +0 -0
  152. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_repo_resolve.py +0 -0
  153. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_runner.py +0 -0
  154. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_store_registry.py +0 -0
  155. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_store_symlink.py +0 -0
  156. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_templates.py +0 -0
  157. {task_agent-1.3.8 → task_agent-1.3.10}/tests/test_yazi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: task-agent
3
- Version: 1.3.8
3
+ Version: 1.3.10
4
4
  Summary: A prioritized, file-based task queue for autonomous agentic workers
5
5
  Project-URL: Homepage, https://github.com/InTEGr8or/task-agent
6
6
  Project-URL: Repository, https://github.com/InTEGr8or/task-agent.git
@@ -28,7 +28,7 @@ Requires-Dist: pyyaml>=6.0
28
28
  Requires-Dist: questionary>=2.1.1
29
29
  Requires-Dist: rich>=13.9.4
30
30
  Requires-Dist: transitions>=0.9.2
31
- Requires-Dist: verkit>=0.1.4
31
+ Requires-Dist: verkit>=0.2.0
32
32
  Description-Content-Type: text/markdown
33
33
 
34
34
  # Task Agent 🤖
@@ -53,12 +53,16 @@ Prints a fast, lightweight one-liner for shell prompt integration (e.g. bash, zs
53
53
  Marks a task as completed.
54
54
  - **Flags**:
55
55
  - `-m`, `--message`: Custom git commit message.
56
+ - `--code-repo`: Checkout to commit (path or moniker) when the edits are not in the task store's host.
57
+ - `--path`: File to commit. Repeat for several files. All paths must be in one git repository.
58
+ - `--sweep-host`: `git add .` in the bound host checkout. Can include unrelated pending work in that host.
59
+ - `--cached-only`: Commit only what is already staged.
56
60
  - `--no-commit`: Skip the automatic git commit.
61
+ - **Code commits follow the task's repo.** If that repo is not the one your shell is in, `ta done` commits there. It does not `git add .` the shell's repo. `--path` is a partial commit: a relative path is read in the task repo, and an absolute path can partial-commit `pwd` instead. Repeat `--path` for several files in the same git repo.
57
62
  - **Process**:
58
63
  1. Moves the file to `completed/{year}/`.
59
- 2. Commits changes to the repository.
64
+ 2. Commits the partitioned checkout when one was named, or the task worktree.
60
65
  3. Appends the resulting commit hash to the task file.
61
- 4. Increments the project patch version (if `pyproject.toml` or `package.json` is present).
62
66
 
63
67
  ### `ta promote <slug>`
64
68
  Moves a task from `draft/` to `pending/`.
@@ -41,6 +41,14 @@ are actually satisfied.
41
41
  3. **Complete via task-agent (required)**
42
42
  - MCP: `complete_task` with `name` + `solution` (and optional commit `message`)
43
43
  - CLI: `ta done <slug>` (with project flags as needed)
44
+ - **Commit in the task's repo.** If `repo` is a different checkout from
45
+ the session `pwd`, the code commit goes there, not into `pwd`.
46
+ - **Partial commits.** Pass `paths` to stage only those files. Relative
47
+ paths resolve in the task repo when it is not `pwd` (a small fix in the
48
+ other repo, no new session). Absolute paths partial-commit `pwd` or any
49
+ other checkout they point at. All paths in one call must share one git
50
+ repo. `sweep_host` commits the whole cwd repo and can pick up unrelated
51
+ files.
44
52
  4. **Self-report cost metrics when known** (cost optimization)
45
53
  - Model name / version, provider
46
54
  - Agent harness (e.g. `claude-code`, `antigravity`, `grok`, `opencode`)
@@ -41,6 +41,14 @@ are actually satisfied.
41
41
  3. **Complete via task-agent (required)**
42
42
  - MCP: `complete_task` with `name` + `solution` (and optional commit `message`)
43
43
  - CLI: `ta done <slug>` (with project flags as needed)
44
+ - **Commit in the task's repo.** If `repo` is a different checkout from
45
+ the session `pwd`, the code commit goes there, not into `pwd`.
46
+ - **Partial commits.** Pass `paths` to stage only those files. Relative
47
+ paths resolve in the task repo when it is not `pwd` (a small fix in the
48
+ other repo, no new session). Absolute paths partial-commit `pwd` or any
49
+ other checkout they point at. All paths in one call must share one git
50
+ repo. `sweep_host` commits the whole cwd repo and can pick up unrelated
51
+ files.
44
52
  4. **Self-report cost metrics when known** (cost optimization)
45
53
  - Model name / version, provider
46
54
  - Agent harness (e.g. `claude-code`, `antigravity`, `grok`, `opencode`)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "task-agent"
3
- version = "1.3.8"
3
+ version = "1.3.10"
4
4
  description = "A prioritized, file-based task queue for autonomous agentic workers"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -38,7 +38,7 @@ dependencies = [
38
38
  "questionary>=2.1.1",
39
39
  "rich>=13.9.4",
40
40
  "githubkit>=0.15.5",
41
- "verkit>=0.1.4",
41
+ "verkit>=0.2.0",
42
42
  "multi-agent-registry>=0.1.0",
43
43
  "transitions>=0.9.2",
44
44
  "boto3>=1.34.0",
@@ -41,6 +41,14 @@ are actually satisfied.
41
41
  3. **Complete via task-agent (required)**
42
42
  - MCP: `complete_task` with `name` + `solution` (and optional commit `message`)
43
43
  - CLI: `ta done <slug>` (with project flags as needed)
44
+ - **Commit in the task's repo.** If `repo` is a different checkout from
45
+ the session `pwd`, the code commit goes there, not into `pwd`.
46
+ - **Partial commits.** Pass `paths` to stage only those files. Relative
47
+ paths resolve in the task repo when it is not `pwd` (a small fix in the
48
+ other repo, no new session). Absolute paths partial-commit `pwd` or any
49
+ other checkout they point at. All paths in one call must share one git
50
+ repo. `sweep_host` commits the whole cwd repo and can pick up unrelated
51
+ files.
44
52
  4. **Self-report cost metrics when known** (cost optimization)
45
53
  - Model name / version, provider
46
54
  - Agent harness (e.g. `claude-code`, `antigravity`, `grok`, `opencode`)
@@ -1670,6 +1670,9 @@ def cmd_done(
1670
1670
  no_verify: bool = True,
1671
1671
  metrics: Optional[SubtaskMetric] = None,
1672
1672
  cached_only: bool = False,
1673
+ code_repo: Optional[str] = None,
1674
+ code_paths: Optional[list] = None,
1675
+ sweep_host: bool = False,
1673
1676
  ):
1674
1677
  """Mark an issue as done."""
1675
1678
  if not slug:
@@ -1680,7 +1683,16 @@ def cmd_done(
1680
1683
  )
1681
1684
  sys.exit(1)
1682
1685
 
1683
- worktree_path = find_worktree_path_for_slug(slug)
1686
+ lookup_root = manager.code_root
1687
+ if code_repo:
1688
+ try:
1689
+ lookup_root = manager._resolve_code_repo_root(code_repo)
1690
+ except Exception:
1691
+ pass
1692
+ worktree_path = manager._issue_worktree(slug, lookup_root) if lookup_root else None
1693
+ if worktree_path is None:
1694
+ worktree_path = find_worktree_path_for_slug(slug)
1695
+ git_cwd = str(lookup_root) if lookup_root else None
1684
1696
  abs_worktree = (
1685
1697
  worktree_path.resolve() if worktree_path and worktree_path.exists() else None
1686
1698
  )
@@ -1701,6 +1713,9 @@ def cmd_done(
1701
1713
  no_verify=no_verify,
1702
1714
  metrics=metrics,
1703
1715
  cached_only=cached_only,
1716
+ code_repo=code_repo,
1717
+ code_paths=code_paths,
1718
+ sweep_host=sweep_host,
1704
1719
  )
1705
1720
  console.print(
1706
1721
  f"[bold green]Issue '{issue.slug}' marked as done and "
@@ -1708,6 +1723,10 @@ def cmd_done(
1708
1723
  )
1709
1724
  if commit_hash:
1710
1725
  console.print(f"Commit: {commit_hash}")
1726
+ note = getattr(manager, "last_code_commit_note", "")
1727
+ if note:
1728
+ style = "yellow" if commit_hash == "no_code_commit" else "dim"
1729
+ console.print(f"[{style}]{note}[/{style}]")
1711
1730
 
1712
1731
  # Releases are explicit — do not auto-amend/bump on done (that rewrote
1713
1732
  # history and orphaned tags). Hint when a project version file exists.
@@ -1742,8 +1761,18 @@ def cmd_done(
1742
1761
  console.print(f"[blue]Cleaning up git worktree for '{slug}'...[/blue]")
1743
1762
  try:
1744
1763
  # Remove worktree
1764
+ remove_cmd = ["git", "worktree", "remove", str(worktree_path)]
1765
+ if git_cwd:
1766
+ remove_cmd = [
1767
+ "git",
1768
+ "-C",
1769
+ git_cwd,
1770
+ "worktree",
1771
+ "remove",
1772
+ str(worktree_path),
1773
+ ]
1745
1774
  subprocess.run(
1746
- ["git", "worktree", "remove", str(worktree_path)],
1775
+ remove_cmd,
1747
1776
  check=True,
1748
1777
  capture_output=True,
1749
1778
  text=True,
@@ -1755,8 +1784,11 @@ def cmd_done(
1755
1784
  # Delete branch
1756
1785
  branch_name = f"issue/{slug}"
1757
1786
  console.print(f"[blue]Deleting local branch '{branch_name}'...[/blue]")
1787
+ delete_cmd = ["git", "branch", "-d", branch_name]
1788
+ if git_cwd:
1789
+ delete_cmd = ["git", "-C", git_cwd, "branch", "-d", branch_name]
1758
1790
  subprocess.run(
1759
- ["git", "branch", "-d", branch_name],
1791
+ delete_cmd,
1760
1792
  check=True,
1761
1793
  capture_output=True,
1762
1794
  text=True,
@@ -1775,15 +1807,27 @@ def cmd_done(
1775
1807
  # If worktree doesn't exist, we still try to delete the branch if it exists
1776
1808
  branch_name = f"issue/{slug}"
1777
1809
  try:
1810
+ show_cmd = ["git", "show-ref", "--verify", f"refs/heads/{branch_name}"]
1811
+ delete_cmd = ["git", "branch", "-d", branch_name]
1812
+ if git_cwd:
1813
+ show_cmd = [
1814
+ "git",
1815
+ "-C",
1816
+ git_cwd,
1817
+ "show-ref",
1818
+ "--verify",
1819
+ f"refs/heads/{branch_name}",
1820
+ ]
1821
+ delete_cmd = ["git", "-C", git_cwd, "branch", "-d", branch_name]
1778
1822
  result = subprocess.run(
1779
- ["git", "show-ref", "--verify", f"refs/heads/{branch_name}"],
1823
+ show_cmd,
1780
1824
  capture_output=True,
1781
1825
  text=True,
1782
1826
  )
1783
1827
  if result.returncode == 0:
1784
1828
  console.print(f"[blue]Deleting local branch '{branch_name}'...[/blue]")
1785
1829
  subprocess.run(
1786
- ["git", "branch", "-d", branch_name],
1830
+ delete_cmd,
1787
1831
  check=True,
1788
1832
  capture_output=True,
1789
1833
  text=True,
@@ -7061,6 +7105,32 @@ TA_STRATEGY_COOLDOWN_HOURS environment variable.
7061
7105
  "files, so one agent's `done` doesn't sweep up the other's changes"
7062
7106
  ),
7063
7107
  )
7108
+ done_parser.add_argument(
7109
+ "--code-repo",
7110
+ default=None,
7111
+ help=(
7112
+ "Checkout to commit code into (path or registered moniker). "
7113
+ "Use when the edits are not in this task store's host repo."
7114
+ ),
7115
+ )
7116
+ done_parser.add_argument(
7117
+ "--path",
7118
+ action="append",
7119
+ dest="code_paths",
7120
+ default=None,
7121
+ help=(
7122
+ "File to include in the code commit. Repeat for several files. "
7123
+ "All paths must be in the same git repository. Nothing else is staged."
7124
+ ),
7125
+ )
7126
+ done_parser.add_argument(
7127
+ "--sweep-host",
7128
+ action="store_true",
7129
+ help=(
7130
+ "git add . in the bound host checkout. Can pick up unrelated "
7131
+ "pending work in that host. Other checkouts are not touched."
7132
+ ),
7133
+ )
7064
7134
  done_parser.add_argument(
7065
7135
  "--hooks",
7066
7136
  dest="no_verify",
@@ -7468,6 +7538,9 @@ TA_STRATEGY_COOLDOWN_HOURS environment variable.
7468
7538
  args.no_verify,
7469
7539
  metrics=done_metrics,
7470
7540
  cached_only=getattr(args, "cached_only", False),
7541
+ code_repo=getattr(args, "code_repo", None),
7542
+ code_paths=getattr(args, "code_paths", None),
7543
+ sweep_host=getattr(args, "sweep_host", False),
7471
7544
  )
7472
7545
  elif args.command == "delete":
7473
7546
  cmd_soft_delete(console, manager, args.slug)