task-agent 1.0.41__tar.gz → 1.2.1__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 (147) hide show
  1. {task_agent-1.0.41 → task_agent-1.2.1}/.gemini/settings.json +1 -5
  2. task_agent-1.2.1/.ta/agents/antigravity/meta.toml +12 -0
  3. {task_agent-1.0.41 → task_agent-1.2.1}/PKG-INFO +7 -2
  4. {task_agent-1.0.41 → task_agent-1.2.1}/docs/cli/README.md +6 -0
  5. task_agent-1.2.1/plugins/antigravity/skills/agent-import/SKILL.md +47 -0
  6. task_agent-1.2.1/plugins/claude-code/skills/agent-import/SKILL.md +47 -0
  7. task_agent-1.2.1/plugins/codex/.mcp.json +8 -0
  8. task_agent-1.2.1/plugins/codex/README.md +8 -0
  9. task_agent-1.2.1/plugins/copilot/.mcp.json +8 -0
  10. task_agent-1.2.1/plugins/copilot/README.md +8 -0
  11. task_agent-1.2.1/plugins/grok/.mcp.json +8 -0
  12. task_agent-1.2.1/plugins/grok/README.md +8 -0
  13. {task_agent-1.0.41 → task_agent-1.2.1}/pyproject.toml +11 -2
  14. task_agent-1.2.1/skills/agent-import/SKILL.md +47 -0
  15. {task_agent-1.0.41 → task_agent-1.2.1}/skills/mission-workflow/SKILL.md +6 -0
  16. task_agent-1.2.1/src/taskagent/agent_registry.py +77 -0
  17. task_agent-1.2.1/src/taskagent/chat/__init__.py +23 -0
  18. task_agent-1.2.1/src/taskagent/chat/config.py +88 -0
  19. task_agent-1.2.1/src/taskagent/chat/discovery.py +5 -0
  20. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/cli.py +316 -217
  21. task_agent-1.2.1/src/taskagent/importers/__init__.py +32 -0
  22. task_agent-1.2.1/src/taskagent/importers/antigravity.py +134 -0
  23. task_agent-1.2.1/src/taskagent/importers/base.py +53 -0
  24. task_agent-1.2.1/src/taskagent/importers/claude_code.py +119 -0
  25. task_agent-1.2.1/src/taskagent/importers/generic.py +100 -0
  26. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/inbox.py +92 -0
  27. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/manager.py +988 -423
  28. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/mcp.py +183 -1
  29. task_agent-1.2.1/src/taskagent/perf.py +152 -0
  30. task_agent-1.2.1/src/taskagent/runner.py +186 -0
  31. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_agent_registry.py +23 -0
  32. task_agent-1.2.1/tests/test_atomic_mutations.py +131 -0
  33. task_agent-1.2.1/tests/test_chat_config.py +80 -0
  34. task_agent-1.2.1/tests/test_chat_discovery.py +109 -0
  35. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_cli.py +39 -0
  36. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_cli_windows.py +0 -17
  37. task_agent-1.2.1/tests/test_importers.py +138 -0
  38. task_agent-1.2.1/tests/test_inbox_watch.py +70 -0
  39. task_agent-1.2.1/tests/test_lease.py +83 -0
  40. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_mcp.py +36 -0
  41. task_agent-1.2.1/tests/test_perf.py +96 -0
  42. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_plugin_antigravity.py +1 -0
  43. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_plugin_claude.py +1 -1
  44. task_agent-1.2.1/tests/test_runner.py +88 -0
  45. {task_agent-1.0.41 → task_agent-1.2.1}/uv.lock +425 -2
  46. task_agent-1.0.41/src/taskagent/agent_registry.py +0 -226
  47. {task_agent-1.0.41 → task_agent-1.2.1}/.agents/skills/next/SKILL.md +0 -0
  48. {task_agent-1.0.41 → task_agent-1.2.1}/.env +0 -0
  49. {task_agent-1.0.41 → task_agent-1.2.1}/.github/workflows/ci.yml +0 -0
  50. {task_agent-1.0.41 → task_agent-1.2.1}/.github/workflows/publish.yml +0 -0
  51. {task_agent-1.0.41 → task_agent-1.2.1}/.gitignore +0 -0
  52. {task_agent-1.0.41 → task_agent-1.2.1}/.mise.toml +0 -0
  53. {task_agent-1.0.41 → task_agent-1.2.1}/.pre-commit-config.yaml +0 -0
  54. {task_agent-1.0.41 → task_agent-1.2.1}/.python-version +0 -0
  55. {task_agent-1.0.41 → task_agent-1.2.1}/.ta/agents/agy-cli/meta.toml +0 -0
  56. {task_agent-1.0.41 → task_agent-1.2.1}/.ta/agents/gh/meta.toml +0 -0
  57. {task_agent-1.0.41 → task_agent-1.2.1}/.ta/agents/minimal/meta.toml +0 -0
  58. {task_agent-1.0.41 → task_agent-1.2.1}/.ta/agents/uat-aws/meta.toml +0 -0
  59. {task_agent-1.0.41 → task_agent-1.2.1}/.ta/worker +0 -0
  60. {task_agent-1.0.41 → task_agent-1.2.1}/.ta-config.json +0 -0
  61. {task_agent-1.0.41 → task_agent-1.2.1}/CLAUDE.md +0 -0
  62. {task_agent-1.0.41 → task_agent-1.2.1}/GEMINI.md +0 -0
  63. {task_agent-1.0.41 → task_agent-1.2.1}/Makefile +0 -0
  64. {task_agent-1.0.41 → task_agent-1.2.1}/README.md +0 -0
  65. {task_agent-1.0.41 → task_agent-1.2.1}/agent.env +0 -0
  66. {task_agent-1.0.41 → task_agent-1.2.1}/docs/README.md +0 -0
  67. {task_agent-1.0.41 → task_agent-1.2.1}/docs/STATION-MAP.md +0 -0
  68. {task_agent-1.0.41 → task_agent-1.2.1}/docs/architecture/README.md +0 -0
  69. {task_agent-1.0.41 → task_agent-1.2.1}/docs/chats/gemini-conversation-1773283034591.json +0 -0
  70. {task_agent-1.0.41 → task_agent-1.2.1}/docs/chats/project-init-to-v0.1.46.md +0 -0
  71. {task_agent-1.0.41 → task_agent-1.2.1}/docs/development/README.md +0 -0
  72. {task_agent-1.0.41 → task_agent-1.2.1}/docs/task-agents.md +0 -0
  73. {task_agent-1.0.41 → task_agent-1.2.1}/docs/workflow/README.md +0 -0
  74. {task_agent-1.0.41 → task_agent-1.2.1}/docs/workflow/trivial_worker_policy.md +0 -0
  75. {task_agent-1.0.41 → task_agent-1.2.1}/opencode.json +0 -0
  76. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/antigravity/.gemini-plugin/plugin.json +0 -0
  77. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/antigravity/.mcp.json +0 -0
  78. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/antigravity/README.md +0 -0
  79. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/antigravity/hooks/hooks.json +0 -0
  80. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/antigravity/hooks/session_start.sh +0 -0
  81. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/antigravity/rules/task_agent.md +0 -0
  82. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/antigravity/scripts/statusline.sh +0 -0
  83. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/antigravity/skills/README.md +0 -0
  84. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/antigravity/skills/complete-task/SKILL.md +0 -0
  85. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/antigravity/skills/mission-workflow/SKILL.md +0 -0
  86. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/antigravity/skills/next/SKILL.md +0 -0
  87. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/antigravity/skills/next-task/SKILL.md +0 -0
  88. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  89. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/claude-code/.mcp.json +0 -0
  90. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/claude-code/README.md +0 -0
  91. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/claude-code/hooks/hooks.json +0 -0
  92. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/claude-code/hooks/session_start.sh +0 -0
  93. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/claude-code/scripts/statusline.sh +0 -0
  94. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/claude-code/skills/complete-task/SKILL.md +0 -0
  95. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/claude-code/skills/mission-workflow/SKILL.md +0 -0
  96. {task_agent-1.0.41 → task_agent-1.2.1}/plugins/claude-code/skills/next-task/SKILL.md +0 -0
  97. {task_agent-1.0.41 → task_agent-1.2.1}/scripts/clean_duplicates.py +0 -0
  98. {task_agent-1.0.41 → task_agent-1.2.1}/scripts/migrate_tasks.py +0 -0
  99. {task_agent-1.0.41 → task_agent-1.2.1}/scripts/recover_dates.py +0 -0
  100. {task_agent-1.0.41 → task_agent-1.2.1}/sidecars/adk-worker/.env.example +0 -0
  101. {task_agent-1.0.41 → task_agent-1.2.1}/sidecars/adk-worker/README.md +0 -0
  102. {task_agent-1.0.41 → task_agent-1.2.1}/sidecars/adk-worker/instructions/manager.md +0 -0
  103. {task_agent-1.0.41 → task_agent-1.2.1}/sidecars/adk-worker/instructions/validator.md +0 -0
  104. {task_agent-1.0.41 → task_agent-1.2.1}/sidecars/adk-worker/instructions/worker.md +0 -0
  105. {task_agent-1.0.41 → task_agent-1.2.1}/sidecars/adk-worker/profiles/default.json +0 -0
  106. {task_agent-1.0.41 → task_agent-1.2.1}/sidecars/adk-worker/pyproject.toml +0 -0
  107. {task_agent-1.0.41 → task_agent-1.2.1}/sidecars/adk-worker/uv.lock +0 -0
  108. {task_agent-1.0.41 → task_agent-1.2.1}/sidecars/adk-worker/worker.py +0 -0
  109. {task_agent-1.0.41 → task_agent-1.2.1}/skills/README.md +0 -0
  110. {task_agent-1.0.41 → task_agent-1.2.1}/skills/complete-task/SKILL.md +0 -0
  111. {task_agent-1.0.41 → task_agent-1.2.1}/skills/next/SKILL.md +0 -0
  112. {task_agent-1.0.41 → task_agent-1.2.1}/skills/next-task/SKILL.md +0 -0
  113. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/__init__.py +0 -0
  114. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/__main__.py +0 -0
  115. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/agent.py +0 -0
  116. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/audit.py +0 -0
  117. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/config.py +0 -0
  118. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/discovery.py +0 -0
  119. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/models/__init__.py +0 -0
  120. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/models/issue.py +0 -0
  121. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/models/metric.py +0 -0
  122. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/plugins/__init__.py +0 -0
  123. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/plugins/github.py +0 -0
  124. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/store_registry.py +0 -0
  125. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/templates.py +0 -0
  126. {task_agent-1.0.41 → task_agent-1.2.1}/src/taskagent/theme.py +0 -0
  127. {task_agent-1.0.41 → task_agent-1.2.1}/test-dir/opencode.json +0 -0
  128. {task_agent-1.0.41 → task_agent-1.2.1}/tests/conftest.py +0 -0
  129. {task_agent-1.0.41 → task_agent-1.2.1}/tests/e2e/test_agent_sandboxing.sh +0 -0
  130. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_agent.py +0 -0
  131. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_agy_cli_worker.py +0 -0
  132. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_auto_commit.py +0 -0
  133. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_discovery.py +0 -0
  134. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_github_token.py +0 -0
  135. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_inbox.py +0 -0
  136. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_manager.py +0 -0
  137. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_manager_git.py +0 -0
  138. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_metrics.py +0 -0
  139. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_migration.py +0 -0
  140. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_project_host_root.py +0 -0
  141. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_rebind.py +0 -0
  142. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_remote_attach.py +0 -0
  143. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_remote_create.py +0 -0
  144. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_repo_resolve.py +0 -0
  145. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_store_registry.py +0 -0
  146. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_store_symlink.py +0 -0
  147. {task_agent-1.0.41 → task_agent-1.2.1}/tests/test_templates.py +0 -0
@@ -8,12 +8,8 @@
8
8
  "trust": true
9
9
  },
10
10
  "task_agent": {
11
- "command": "uv",
11
+ "command": "ta",
12
12
  "args": [
13
- "run",
14
- "--project",
15
- "/home/mstouffer/repos/task-agent",
16
- "ta",
17
13
  "mcp"
18
14
  ],
19
15
  "trust": true
@@ -0,0 +1,12 @@
1
+ name = "antigravity"
2
+ description = "Antigravity CLI (agy) agent workflow template running agy, claude, or opencode non-interactively"
3
+
4
+ [dotfiles]
5
+ ".gitconfig" = { source = "inline", content = """
6
+ [user]
7
+ name = Agent
8
+ email = agent@localhost
9
+ [safe]
10
+ directory = *
11
+ """ }
12
+ ".ssh/id_ed25519" = { source = "generate" }
@@ -1,17 +1,22 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: task-agent
3
- Version: 1.0.41
3
+ Version: 1.2.1
4
4
  Summary: A prioritized, file-based task queue for autonomous agentic workers
5
5
  Author-email: Mark Stouffer <1802850+InTEGr8or@users.noreply.github.com>
6
6
  License: MIT
7
7
  Requires-Python: >=3.12
8
+ Requires-Dist: agent-cli-registry>=0.1.1
9
+ Requires-Dist: boto3>=1.34.0
8
10
  Requires-Dist: githubkit>=0.15.5
11
+ Requires-Dist: google-genai>=0.1.0
9
12
  Requires-Dist: mcp<2.0.0,>=1.26.0
10
13
  Requires-Dist: pydantic>=2.10.6
11
14
  Requires-Dist: pyperclip>=1.9.0
12
15
  Requires-Dist: python-dotenv>=1.2.2
16
+ Requires-Dist: pyyaml>=6.0
13
17
  Requires-Dist: questionary>=2.1.1
14
18
  Requires-Dist: rich>=13.9.4
19
+ Requires-Dist: transitions>=0.9.2
15
20
  Requires-Dist: verkit>=0.1.4
16
21
  Description-Content-Type: text/markdown
17
22
 
@@ -82,6 +82,12 @@ Displays and manages the target project's version.
82
82
  - `promote [major|minor|patch]`: Bumps the project version and syncs lockfiles.
83
83
  - `tag`: Tags the current commit with the project version.
84
84
 
85
+ ### `ta perf`
86
+ Manage performance monitoring logging.
87
+ - **Actions**: `status` (default), `on` / `enable`, `off` / `disable`, `log`
88
+ - **Environment Variable**: `TA_PERF_LOG=1` (or `0`)
89
+ - **Notification**: Displays a notice when performance logging is active.
90
+
85
91
  ### `ta self-up`
86
92
  Upgrades the `task-agent` tool itself via `uv`.
87
93
 
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: agent-import
3
+ description: >
4
+ Import session tasks and todo items from external AI agent task runners
5
+ (Antigravity CLI, Claude Code, generic task lists) into task-agent as working-task
6
+ documents. Use when the user asks to import tasks, sync agent session state, or
7
+ preserve ephemeral session todos into task-agent.
8
+ ---
9
+
10
+ # Agent Import (task-agent)
11
+
12
+ Import tasks from agent-native task runners (such as Antigravity CLI TaskManager, Claude Code Todo/Task state, or generic task lists) directly into `task-agent`.
13
+
14
+ ## When to use
15
+
16
+ - User asks to import agent tasks or sync session todo lists
17
+ - Preserving ephemeral agent session todos into durable `task-agent` storage
18
+ - Session start: bringing external agent session tasks into the current `working-task`
19
+
20
+ ## When not to use
21
+
22
+ - Manually adding a single new task — use `create_task` / `ta new` instead
23
+ - Completing a task — use `complete_task` / `ta done` instead
24
+
25
+ ## Prerequisites
26
+
27
+ - `task-agent` MCP server connected, or shell access to `ta` CLI
28
+ - An active `working-task` set (or pass explicit `--slug <slug>`)
29
+
30
+ ## Steps
31
+
32
+ 1. **Identify working-task**
33
+ - MCP: `list_active_tasks` or specify `slug`
34
+ - CLI: `ta active`
35
+ 2. **Execute Agent Import**
36
+ - MCP: `import_agent_tasks(slug=..., agent_type="...")`
37
+ - CLI: `ta agent import [--slug <slug>] [--agent <type>] [--file <path>]`
38
+ 3. **Verify document creation**
39
+ - Check created `imports/{agent}_tasks.json` in working-task directory.
40
+
41
+ ## Tool map
42
+
43
+ | Intent | Prefer |
44
+ |--------|--------|
45
+ | Import agent tasks | `import_agent_tasks` / `ta agent import` |
46
+ | Targeted import | `import_agent_tasks(slug="my-slug")` |
47
+ | Custom file import | `ta agent import --file <path>` |
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: agent-import
3
+ description: >
4
+ Import session tasks and todo items from external AI agent task runners
5
+ (Antigravity CLI, Claude Code, generic task lists) into task-agent as working-task
6
+ documents. Use when the user asks to import tasks, sync agent session state, or
7
+ preserve ephemeral session todos into task-agent.
8
+ ---
9
+
10
+ # Agent Import (task-agent)
11
+
12
+ Import tasks from agent-native task runners (such as Antigravity CLI TaskManager, Claude Code Todo/Task state, or generic task lists) directly into `task-agent`.
13
+
14
+ ## When to use
15
+
16
+ - User asks to import agent tasks or sync session todo lists
17
+ - Preserving ephemeral agent session todos into durable `task-agent` storage
18
+ - Session start: bringing external agent session tasks into the current `working-task`
19
+
20
+ ## When not to use
21
+
22
+ - Manually adding a single new task — use `create_task` / `ta new` instead
23
+ - Completing a task — use `complete_task` / `ta done` instead
24
+
25
+ ## Prerequisites
26
+
27
+ - `task-agent` MCP server connected, or shell access to `ta` CLI
28
+ - An active `working-task` set (or pass explicit `--slug <slug>`)
29
+
30
+ ## Steps
31
+
32
+ 1. **Identify working-task**
33
+ - MCP: `list_active_tasks` or specify `slug`
34
+ - CLI: `ta active`
35
+ 2. **Execute Agent Import**
36
+ - MCP: `import_agent_tasks(slug=..., agent_type="...")`
37
+ - CLI: `ta agent import [--slug <slug>] [--agent <type>] [--file <path>]`
38
+ 3. **Verify document creation**
39
+ - Check created `imports/{agent}_tasks.json` in working-task directory.
40
+
41
+ ## Tool map
42
+
43
+ | Intent | Prefer |
44
+ |--------|--------|
45
+ | Import agent tasks | `import_agent_tasks` / `ta agent import` |
46
+ | Targeted import | `import_agent_tasks(slug="my-slug")` |
47
+ | Custom file import | `ta agent import --file <path>` |
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "task_agent": {
4
+ "command": "ta",
5
+ "args": ["mcp"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ # task-agent OpenAI Codex Plugin
2
+
3
+ OpenAI Codex CLI harness plugin package for `task-agent`.
4
+
5
+ ## Installation
6
+ ```bash
7
+ ta init-plugin --codex
8
+ ```
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "task_agent": {
4
+ "command": "ta",
5
+ "args": ["mcp"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ # task-agent GitHub Copilot CLI Plugin
2
+
3
+ GitHub Copilot CLI plugin package for `task-agent`.
4
+
5
+ ## Installation
6
+ ```bash
7
+ ta init-plugin --copilot
8
+ ```
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "task_agent": {
4
+ "command": "ta",
5
+ "args": ["mcp"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ # task-agent Grok Build Plugin
2
+
3
+ Grok Build coding assistant plugin package for `task-agent`.
4
+
5
+ ## Installation
6
+ ```bash
7
+ ta init-plugin --grok
8
+ ```
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "task-agent"
3
- version = "1.0.41"
3
+ version = "1.2.1"
4
4
  description = "A prioritized, file-based task queue for autonomous agentic workers"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -17,8 +17,14 @@ dependencies = [
17
17
  "rich>=13.9.4",
18
18
  "githubkit>=0.15.5",
19
19
  "verkit>=0.1.4",
20
+ "agent-cli-registry>=0.1.1",
21
+ "transitions>=0.9.2",
22
+ "boto3>=1.34.0",
23
+ "google-genai>=0.1.0",
24
+ "pyyaml>=6.0",
20
25
  ]
21
26
 
27
+
22
28
  [project.scripts]
23
29
  ta = "taskagent.cli:main"
24
30
 
@@ -26,6 +32,9 @@ ta = "taskagent.cli:main"
26
32
  requires = ["hatchling"]
27
33
  build-backend = "hatchling.build"
28
34
 
35
+ [tool.hatch.metadata]
36
+ allow-direct-references = true
37
+
29
38
  [tool.hatch.build.targets.wheel]
30
39
  packages = ["src/taskagent"]
31
40
  artifacts = ["sidecars/"]
@@ -40,7 +49,7 @@ dev = [
40
49
  ]
41
50
 
42
51
  [tool.bumpversion]
43
- current_version = "1.0.38"
52
+ current_version = "1.0.50"
44
53
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
45
54
  serialize = ["{major}.{minor}.{patch}"]
46
55
  search = "version = \"{current_version}\""
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: agent-import
3
+ description: >
4
+ Import session tasks and todo items from external AI agent task runners
5
+ (Antigravity CLI, Claude Code, generic task lists) into task-agent as working-task
6
+ documents. Use when the user asks to import tasks, sync agent session state, or
7
+ preserve ephemeral session todos into task-agent.
8
+ ---
9
+
10
+ # Agent Import (task-agent)
11
+
12
+ Import tasks from agent-native task runners (such as Antigravity CLI TaskManager, Claude Code Todo/Task state, or generic task lists) directly into `task-agent`.
13
+
14
+ ## When to use
15
+
16
+ - User asks to import agent tasks or sync session todo lists
17
+ - Preserving ephemeral agent session todos into durable `task-agent` storage
18
+ - Session start: bringing external agent session tasks into the current `working-task`
19
+
20
+ ## When not to use
21
+
22
+ - Manually adding a single new task — use `create_task` / `ta new` instead
23
+ - Completing a task — use `complete_task` / `ta done` instead
24
+
25
+ ## Prerequisites
26
+
27
+ - `task-agent` MCP server connected, or shell access to `ta` CLI
28
+ - An active `working-task` set (or pass explicit `--slug <slug>`)
29
+
30
+ ## Steps
31
+
32
+ 1. **Identify working-task**
33
+ - MCP: `list_active_tasks` or specify `slug`
34
+ - CLI: `ta active`
35
+ 2. **Execute Agent Import**
36
+ - MCP: `import_agent_tasks(slug=..., agent_type="...")`
37
+ - CLI: `ta agent import [--slug <slug>] [--agent <type>] [--file <path>]`
38
+ 3. **Verify document creation**
39
+ - Check created `imports/{agent}_tasks.json` in working-task directory.
40
+
41
+ ## Tool map
42
+
43
+ | Intent | Prefer |
44
+ |--------|--------|
45
+ | Import agent tasks | `import_agent_tasks` / `ta agent import` |
46
+ | Targeted import | `import_agent_tasks(slug="my-slug")` |
47
+ | Custom file import | `ta agent import --file <path>` |
@@ -64,6 +64,12 @@ orient (strategy + active + next)
64
64
  - Follow **complete-task** skill
65
65
  - Report model/tokens/harness when available (cost optimization)
66
66
 
67
+ ### Inter-Agent Inbox Messaging & Watching
68
+
69
+ - **Cross-Repo Messaging**: Send messages to target agent stores via `send_inbox_message(to_repo="target", body="...")` or `ta inbox send --repo target`.
70
+ - **Zero-CPU Inotify Watch**: Use `watch_inbox_mcp` or `ta inbox watch` to block with zero CPU overhead until a message arrives, triggering instant reactive wakeups for collaborative agent workflows.
71
+ - **Acknowledge Receipts**: Always acknowledge processed messages via `ack_inbox(message_id=...)` or `ta inbox ack <id>`.
72
+
67
73
  ## Anti-patterns
68
74
 
69
75
  | Avoid | Prefer |
@@ -0,0 +1,77 @@
1
+ """Agent CLI Detection Registry for Task Agent.
2
+
3
+ Re-exports core agent definitions from the standalone `agent_registry` package
4
+ while maintaining task-agent specific user plugin configuration helpers.
5
+ """
6
+
7
+ import json
8
+ from pathlib import Path
9
+ from typing import List, Optional
10
+
11
+ from agent_registry import (
12
+ AgentCLIInfo,
13
+ DiscoveredChat,
14
+ discover_agent_chats,
15
+ get_agent_cli_registry,
16
+ inspect_agent_cli,
17
+ inspect_all_agent_clis,
18
+ )
19
+
20
+ __all__ = [
21
+ "AgentCLIInfo",
22
+ "DiscoveredChat",
23
+ "get_agent_cli_registry",
24
+ "inspect_agent_cli",
25
+ "inspect_all_agent_clis",
26
+ "discover_agent_chats",
27
+ "get_disabled_agent_plugins",
28
+ "set_agent_plugin_enabled",
29
+ "is_agent_plugin_enabled",
30
+ ]
31
+
32
+
33
+ def get_disabled_agent_plugins() -> List[str]:
34
+ """Load list of explicitly disabled agent plugins from task-agent user config."""
35
+ config_file = Path.home() / ".config" / "task-agent" / "config.json"
36
+ if config_file.is_file():
37
+ try:
38
+ data = json.loads(config_file.read_text(encoding="utf-8"))
39
+ disabled = data.get("plugins", {}).get("disabled_agents", [])
40
+ if isinstance(disabled, list):
41
+ return [str(item) for item in disabled]
42
+ except Exception:
43
+ pass
44
+ return []
45
+
46
+
47
+ def set_agent_plugin_enabled(agent_id: str, enabled: bool) -> None:
48
+ """Enable or disable a specific agent plugin in task-agent user config."""
49
+ config_dir = Path.home() / ".config" / "task-agent"
50
+ config_dir.mkdir(parents=True, exist_ok=True)
51
+ config_file = config_dir / "config.json"
52
+
53
+ data: dict = {}
54
+ if config_file.is_file():
55
+ try:
56
+ data = json.loads(config_file.read_text(encoding="utf-8"))
57
+ except Exception:
58
+ data = {}
59
+
60
+ plugins_cfg = data.setdefault("plugins", {})
61
+ disabled = plugins_cfg.setdefault("disabled_agents", [])
62
+
63
+ if enabled and agent_id in disabled:
64
+ disabled.remove(agent_id)
65
+ elif not enabled and agent_id not in disabled:
66
+ disabled.append(agent_id)
67
+
68
+ config_file.write_text(json.dumps(data, indent=2), encoding="utf-8")
69
+
70
+
71
+ def is_agent_plugin_enabled(
72
+ agent_id: str, disabled_list: Optional[List[str]] = None
73
+ ) -> bool:
74
+ """Check if an agent plugin is enabled (enabled by default unless explicitly disabled)."""
75
+ if disabled_list is None:
76
+ disabled_list = get_disabled_agent_plugins()
77
+ return agent_id not in disabled_list
@@ -0,0 +1,23 @@
1
+ """Chat archival module for task-agent."""
2
+
3
+ from taskagent.chat.config import (
4
+ ChatConfig,
5
+ RetentionConfig,
6
+ S3Config,
7
+ SummarizationConfig,
8
+ load_chat_config,
9
+ )
10
+ from taskagent.chat.discovery import (
11
+ DiscoveredChat,
12
+ discover_agent_chats,
13
+ )
14
+
15
+ __all__ = [
16
+ "ChatConfig",
17
+ "DiscoveredChat",
18
+ "RetentionConfig",
19
+ "S3Config",
20
+ "SummarizationConfig",
21
+ "discover_agent_chats",
22
+ "load_chat_config",
23
+ ]
@@ -0,0 +1,88 @@
1
+ """Configuration schema and loader for chat archiver."""
2
+
3
+ from pathlib import Path
4
+ from typing import Any
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class S3Config(BaseModel):
10
+ """S3 bucket and prefix configuration for chat archives."""
11
+
12
+ bucket: str = Field(default="chatarch", description="AWS S3 bucket name")
13
+ prefix: str = Field(default="chats/", description="S3 object key prefix")
14
+
15
+
16
+ class RetentionConfig(BaseModel):
17
+ """Chat retention policy configuration."""
18
+
19
+ days: int = Field(default=20, description="Retention threshold in days")
20
+ keep_count: int = Field(
21
+ default=5,
22
+ alias="keep_recent",
23
+ description="Number of recent chats to keep per workspace",
24
+ )
25
+
26
+ model_config = {
27
+ "populate_by_name": True,
28
+ }
29
+
30
+
31
+ class SummarizationConfig(BaseModel):
32
+ """Summarization API configuration."""
33
+
34
+ model: str = Field(
35
+ default="gemini-2.5-flash",
36
+ description="Gemini model used for chat summarization",
37
+ )
38
+ delay: float = Field(
39
+ default=20.0,
40
+ description="Delay in seconds between API calls",
41
+ )
42
+
43
+
44
+ class ChatConfig(BaseModel):
45
+ """Complete chat archiver configuration settings."""
46
+
47
+ s3: S3Config = Field(default_factory=S3Config)
48
+ retention: RetentionConfig = Field(default_factory=RetentionConfig)
49
+ summarization: SummarizationConfig = Field(default_factory=SummarizationConfig)
50
+
51
+
52
+ def load_chat_config(config_path: Path | None = None) -> ChatConfig:
53
+ """Load and parse chat archiver configuration from ~/.config/task-agent/config.json or custom path.
54
+
55
+ Falls back to sensible defaults if the file does not exist, is invalid, or section is omitted.
56
+ """
57
+ import json
58
+
59
+ if config_path is None:
60
+ config_path = Path.home() / ".config" / "task-agent" / "config.json"
61
+
62
+ if not config_path.is_file():
63
+ return ChatConfig()
64
+
65
+ try:
66
+ data: Any = json.loads(config_path.read_text(encoding="utf-8"))
67
+ except Exception:
68
+ return ChatConfig()
69
+
70
+ if not isinstance(data, dict):
71
+ return ChatConfig()
72
+
73
+ # Support nested 'chat' or 'chat_archiver' section
74
+ chat_data = data.get("chat") or data.get("chat_archiver")
75
+ if isinstance(chat_data, dict):
76
+ try:
77
+ return ChatConfig.model_validate(chat_data)
78
+ except Exception:
79
+ return ChatConfig()
80
+
81
+ # Check if s3, retention, or summarization are in root data
82
+ if any(key in data for key in ("s3", "retention", "summarization")):
83
+ try:
84
+ return ChatConfig.model_validate(data)
85
+ except Exception:
86
+ return ChatConfig()
87
+
88
+ return ChatConfig()
@@ -0,0 +1,5 @@
1
+ """Discovery module for scanning agent chat log files (re-exported from agent_registry)."""
2
+
3
+ from agent_registry import DiscoveredChat, discover_agent_chats
4
+
5
+ __all__ = ["DiscoveredChat", "discover_agent_chats"]