claude-task-master 0.1.9__tar.gz → 0.1.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.
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/PKG-INFO +16 -7
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/README.md +9 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/pyproject.toml +7 -7
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/__init__.py +1 -1
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/models.py +21 -5
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/routes.py +2 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/workflow.py +8 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/agent.py +7 -2
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_message.py +18 -3
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_phases.py +7 -1
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/orchestrator.py +131 -23
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/planner.py +8 -2
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_planning.py +27 -1
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/state.py +1 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mcp/server.py +6 -1
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mcp/tools.py +7 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/events.py +2 -2
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/PKG-INFO +16 -7
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/requires.txt +6 -6
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/setup.cfg +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/__init__.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_config.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_control.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_repo.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_webhooks.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/server.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/auth/__init__.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/auth/middleware.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/auth/password.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/bin/claudetm +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/__init__.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/ci_helpers.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/config.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/control.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/fix_pr.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/fix_session.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/github.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/info.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/mailbox.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/__init__.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_exceptions.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_models.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_query.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/checkpoint.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/circuit_breaker.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/config.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/config_loader.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/console.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/context_accumulator.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/control.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/conversation.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/credentials.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/hooks.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/key_listener.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/logger.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/parallel.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/plan_updater.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/pr_context.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/progress_tracker.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_base.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_coding_style.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_plan_update.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_verification.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_working.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/rate_limit.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/shutdown.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/state_backup.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/state_exceptions.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/state_file_ops.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/state_pr.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/state_recovery.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/subagents.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/task_group.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/task_runner.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/workflow_stages.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/github/__init__.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/github/client.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/github/client_ci.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/github/client_pr.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/github/exceptions.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/github/pr_cycle.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/__init__.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/merger.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/models.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/storage.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mcp/__init__.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mcp/auth.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/server.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/utils/__init__.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/utils/debug_claude_md.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/utils/doctor.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/__init__.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/client.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/config.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/wrapper.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/SOURCES.txt +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/dependency_links.txt +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/entry_points.txt +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/top_level.txt +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/tests/test_server.py +0 -0
- {claude_task_master-0.1.9 → claude_task_master-0.1.10}/tests/test_wrapper.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-task-master
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.10
|
|
4
4
|
Summary: Autonomous task orchestration system that keeps Claude working until a goal is achieved
|
|
5
5
|
Author: Claude Task Master Team
|
|
6
6
|
License-Expression: MIT
|
|
@@ -19,15 +19,15 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
19
19
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
20
20
|
Requires-Python: >=3.12
|
|
21
21
|
Description-Content-Type: text/markdown
|
|
22
|
-
Requires-Dist: claude-agent-sdk>=0.1.
|
|
22
|
+
Requires-Dist: claude-agent-sdk>=0.1.30
|
|
23
23
|
Requires-Dist: typer>=0.12.0
|
|
24
24
|
Requires-Dist: pydantic>=2.0.0
|
|
25
|
-
Requires-Dist: rich>=
|
|
25
|
+
Requires-Dist: rich>=14.3.2
|
|
26
26
|
Requires-Dist: httpx>=0.27.0
|
|
27
27
|
Provides-Extra: mcp
|
|
28
|
-
Requires-Dist: mcp>=1.
|
|
28
|
+
Requires-Dist: mcp>=1.26.0; extra == "mcp"
|
|
29
29
|
Provides-Extra: api
|
|
30
|
-
Requires-Dist: fastapi>=0.
|
|
30
|
+
Requires-Dist: fastapi>=0.128.1; extra == "api"
|
|
31
31
|
Requires-Dist: uvicorn[standard]>=0.24.0; extra == "api"
|
|
32
32
|
Requires-Dist: passlib[bcrypt]>=1.7.4; extra == "api"
|
|
33
33
|
Requires-Dist: bcrypt<4.1.0,>=4.0.0; extra == "api"
|
|
@@ -37,8 +37,8 @@ Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
|
37
37
|
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
38
38
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
|
|
39
39
|
Requires-Dist: pytest-timeout>=2.4.0; extra == "dev"
|
|
40
|
-
Requires-Dist: hypothesis>=6.
|
|
41
|
-
Requires-Dist: ruff>=0.
|
|
40
|
+
Requires-Dist: hypothesis>=6.151.5; extra == "dev"
|
|
41
|
+
Requires-Dist: ruff>=0.15.0; extra == "dev"
|
|
42
42
|
Requires-Dist: mypy>=1.9.0; extra == "dev"
|
|
43
43
|
Provides-Extra: all
|
|
44
44
|
Requires-Dist: claude-task-master[api,dev,mcp]; extra == "all"
|
|
@@ -390,6 +390,7 @@ claudetm start "Your goal here" [OPTIONS]
|
|
|
390
390
|
| `--model` | Model to use (sonnet, opus, haiku) | sonnet |
|
|
391
391
|
| `--auto-merge/--no-auto-merge` | Auto-merge PRs when ready | True |
|
|
392
392
|
| `--max-sessions` | Limit number of sessions | unlimited |
|
|
393
|
+
| `--prs` | Limit number of PRs to create | unlimited |
|
|
393
394
|
| `--pause-on-pr` | Pause after creating PR | False |
|
|
394
395
|
|
|
395
396
|
### Common Workflows
|
|
@@ -404,6 +405,10 @@ claudetm start "Refactor auth system" --model opus --no-auto-merge
|
|
|
404
405
|
# Limited sessions to prevent runaway
|
|
405
406
|
claudetm start "Fix bug in parser" --max-sessions 5
|
|
406
407
|
|
|
408
|
+
# Limit number of PRs (forces everything into fewer PRs)
|
|
409
|
+
claudetm start "Add user dashboard" --prs 1
|
|
410
|
+
claudetm start "Implement notifications" --prs 3 --max-sessions 10
|
|
411
|
+
|
|
407
412
|
# Monitor progress
|
|
408
413
|
watch -n 5 'claudetm status'
|
|
409
414
|
|
|
@@ -435,6 +440,10 @@ claudetm start "Add dark mode toggle to settings" --model opus
|
|
|
435
440
|
# Refactoring
|
|
436
441
|
claudetm start "Refactor API client to use async/await" --max-sessions 5
|
|
437
442
|
|
|
443
|
+
# Limit PRs for focused changes
|
|
444
|
+
claudetm start "Add user authentication" --prs 1
|
|
445
|
+
claudetm start "Build admin dashboard" --prs 2 --max-sessions 8
|
|
446
|
+
|
|
438
447
|
# Documentation
|
|
439
448
|
claudetm start "Add API documentation and examples"
|
|
440
449
|
```
|
|
@@ -345,6 +345,7 @@ claudetm start "Your goal here" [OPTIONS]
|
|
|
345
345
|
| `--model` | Model to use (sonnet, opus, haiku) | sonnet |
|
|
346
346
|
| `--auto-merge/--no-auto-merge` | Auto-merge PRs when ready | True |
|
|
347
347
|
| `--max-sessions` | Limit number of sessions | unlimited |
|
|
348
|
+
| `--prs` | Limit number of PRs to create | unlimited |
|
|
348
349
|
| `--pause-on-pr` | Pause after creating PR | False |
|
|
349
350
|
|
|
350
351
|
### Common Workflows
|
|
@@ -359,6 +360,10 @@ claudetm start "Refactor auth system" --model opus --no-auto-merge
|
|
|
359
360
|
# Limited sessions to prevent runaway
|
|
360
361
|
claudetm start "Fix bug in parser" --max-sessions 5
|
|
361
362
|
|
|
363
|
+
# Limit number of PRs (forces everything into fewer PRs)
|
|
364
|
+
claudetm start "Add user dashboard" --prs 1
|
|
365
|
+
claudetm start "Implement notifications" --prs 3 --max-sessions 10
|
|
366
|
+
|
|
362
367
|
# Monitor progress
|
|
363
368
|
watch -n 5 'claudetm status'
|
|
364
369
|
|
|
@@ -390,6 +395,10 @@ claudetm start "Add dark mode toggle to settings" --model opus
|
|
|
390
395
|
# Refactoring
|
|
391
396
|
claudetm start "Refactor API client to use async/await" --max-sessions 5
|
|
392
397
|
|
|
398
|
+
# Limit PRs for focused changes
|
|
399
|
+
claudetm start "Add user authentication" --prs 1
|
|
400
|
+
claudetm start "Build admin dashboard" --prs 2 --max-sessions 8
|
|
401
|
+
|
|
393
402
|
# Documentation
|
|
394
403
|
claudetm start "Add API documentation and examples"
|
|
395
404
|
```
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "claude-task-master"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.10"
|
|
8
8
|
description = "Autonomous task orchestration system that keeps Claude working until a goal is achieved"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -24,10 +24,10 @@ classifiers = [
|
|
|
24
24
|
]
|
|
25
25
|
|
|
26
26
|
dependencies = [
|
|
27
|
-
"claude-agent-sdk>=0.1.
|
|
27
|
+
"claude-agent-sdk>=0.1.30",
|
|
28
28
|
"typer>=0.12.0",
|
|
29
29
|
"pydantic>=2.0.0",
|
|
30
|
-
"rich>=
|
|
30
|
+
"rich>=14.3.2",
|
|
31
31
|
"httpx>=0.27.0",
|
|
32
32
|
]
|
|
33
33
|
|
|
@@ -39,9 +39,9 @@ Issues = "https://github.com/developerz-ai/claude-task-master/issues"
|
|
|
39
39
|
Changelog = "https://github.com/developerz-ai/claude-task-master/blob/main/CHANGELOG.md"
|
|
40
40
|
|
|
41
41
|
[project.optional-dependencies]
|
|
42
|
-
mcp = ["mcp>=1.
|
|
42
|
+
mcp = ["mcp>=1.26.0"]
|
|
43
43
|
api = [
|
|
44
|
-
"fastapi>=0.
|
|
44
|
+
"fastapi>=0.128.1",
|
|
45
45
|
"uvicorn[standard]>=0.24.0",
|
|
46
46
|
# Note: passlib (last release: 1.7.4, Oct 2020) is unmaintained but has no known CVEs.
|
|
47
47
|
# It's widely used and bcrypt is timing-safe. Consider argon2-cffi as future alternative.
|
|
@@ -54,8 +54,8 @@ dev = [
|
|
|
54
54
|
"pytest-cov>=4.1.0",
|
|
55
55
|
"pytest-asyncio>=0.23.0",
|
|
56
56
|
"pytest-timeout>=2.4.0",
|
|
57
|
-
"hypothesis>=6.
|
|
58
|
-
"ruff>=0.
|
|
57
|
+
"hypothesis>=6.151.5",
|
|
58
|
+
"ruff>=0.15.0",
|
|
59
59
|
"mypy>=1.9.0",
|
|
60
60
|
]
|
|
61
61
|
all = [
|
|
@@ -48,7 +48,7 @@ Usage:
|
|
|
48
48
|
from __future__ import annotations
|
|
49
49
|
|
|
50
50
|
from datetime import datetime
|
|
51
|
-
from enum import Enum
|
|
51
|
+
from enum import Enum, StrEnum
|
|
52
52
|
from typing import Any
|
|
53
53
|
|
|
54
54
|
from pydantic import BaseModel, Field
|
|
@@ -58,7 +58,7 @@ from pydantic import BaseModel, Field
|
|
|
58
58
|
# =============================================================================
|
|
59
59
|
|
|
60
60
|
|
|
61
|
-
class TaskStatus(
|
|
61
|
+
class TaskStatus(StrEnum):
|
|
62
62
|
"""Valid task status values."""
|
|
63
63
|
|
|
64
64
|
PLANNING = "planning"
|
|
@@ -70,7 +70,7 @@ class TaskStatus(str, Enum):
|
|
|
70
70
|
FAILED = "failed"
|
|
71
71
|
|
|
72
72
|
|
|
73
|
-
class WorkflowStage(
|
|
73
|
+
class WorkflowStage(StrEnum):
|
|
74
74
|
"""Valid workflow stage values for PR lifecycle."""
|
|
75
75
|
|
|
76
76
|
WORKING = "working"
|
|
@@ -83,7 +83,7 @@ class WorkflowStage(str, Enum):
|
|
|
83
83
|
MERGED = "merged"
|
|
84
84
|
|
|
85
85
|
|
|
86
|
-
class LogLevel(
|
|
86
|
+
class LogLevel(StrEnum):
|
|
87
87
|
"""Valid log level values."""
|
|
88
88
|
|
|
89
89
|
QUIET = "quiet"
|
|
@@ -91,7 +91,7 @@ class LogLevel(str, Enum):
|
|
|
91
91
|
VERBOSE = "verbose"
|
|
92
92
|
|
|
93
93
|
|
|
94
|
-
class LogFormat(
|
|
94
|
+
class LogFormat(StrEnum):
|
|
95
95
|
"""Valid log format values."""
|
|
96
96
|
|
|
97
97
|
TEXT = "text"
|
|
@@ -159,6 +159,7 @@ class ConfigUpdateRequest(BaseModel):
|
|
|
159
159
|
Attributes:
|
|
160
160
|
auto_merge: Whether to auto-merge PRs when approved.
|
|
161
161
|
max_sessions: Maximum number of work sessions before pausing.
|
|
162
|
+
max_prs: Maximum number of pull requests to create.
|
|
162
163
|
pause_on_pr: Whether to pause after creating PR for manual review.
|
|
163
164
|
enable_checkpointing: Whether to enable state checkpointing.
|
|
164
165
|
log_level: Log level (quiet, normal, verbose).
|
|
@@ -176,6 +177,12 @@ class ConfigUpdateRequest(BaseModel):
|
|
|
176
177
|
le=1000,
|
|
177
178
|
description="Maximum number of work sessions before pausing",
|
|
178
179
|
)
|
|
180
|
+
max_prs: int | None = Field(
|
|
181
|
+
default=None,
|
|
182
|
+
ge=1,
|
|
183
|
+
le=100,
|
|
184
|
+
description="Maximum number of pull requests to create",
|
|
185
|
+
)
|
|
179
186
|
pause_on_pr: bool | None = Field(
|
|
180
187
|
default=None,
|
|
181
188
|
description="Whether to pause after creating PR for manual review",
|
|
@@ -228,6 +235,7 @@ class TaskInitRequest(BaseModel):
|
|
|
228
235
|
model: Model to use (opus, sonnet, haiku).
|
|
229
236
|
auto_merge: Whether to auto-merge PRs when approved.
|
|
230
237
|
max_sessions: Max work sessions before pausing.
|
|
238
|
+
max_prs: Max pull requests to create.
|
|
231
239
|
pause_on_pr: Pause after creating PR for manual review.
|
|
232
240
|
"""
|
|
233
241
|
|
|
@@ -253,6 +261,12 @@ class TaskInitRequest(BaseModel):
|
|
|
253
261
|
le=1000,
|
|
254
262
|
description="Maximum number of work sessions before pausing",
|
|
255
263
|
)
|
|
264
|
+
max_prs: int | None = Field(
|
|
265
|
+
default=None,
|
|
266
|
+
ge=1,
|
|
267
|
+
le=100,
|
|
268
|
+
description="Maximum number of pull requests to create",
|
|
269
|
+
)
|
|
256
270
|
pause_on_pr: bool = Field(
|
|
257
271
|
default=False,
|
|
258
272
|
description="Pause after creating PR for manual review",
|
|
@@ -384,6 +398,7 @@ class TaskOptionsResponse(BaseModel):
|
|
|
384
398
|
Attributes:
|
|
385
399
|
auto_merge: Whether to auto-merge PRs when approved.
|
|
386
400
|
max_sessions: Maximum number of work sessions before pausing.
|
|
401
|
+
max_prs: Maximum number of pull requests to create.
|
|
387
402
|
pause_on_pr: Whether to pause after creating PR for manual review.
|
|
388
403
|
enable_checkpointing: Whether state checkpointing is enabled.
|
|
389
404
|
log_level: Current log level.
|
|
@@ -393,6 +408,7 @@ class TaskOptionsResponse(BaseModel):
|
|
|
393
408
|
|
|
394
409
|
auto_merge: bool
|
|
395
410
|
max_sessions: int | None
|
|
411
|
+
max_prs: int | None
|
|
396
412
|
pause_on_pr: bool
|
|
397
413
|
enable_checkpointing: bool
|
|
398
414
|
log_level: str
|
|
@@ -287,6 +287,7 @@ def create_info_router() -> APIRouter:
|
|
|
287
287
|
options=TaskOptionsResponse(
|
|
288
288
|
auto_merge=state.options.auto_merge,
|
|
289
289
|
max_sessions=state.options.max_sessions,
|
|
290
|
+
max_prs=state.options.max_prs,
|
|
290
291
|
pause_on_pr=state.options.pause_on_pr,
|
|
291
292
|
enable_checkpointing=state.options.enable_checkpointing,
|
|
292
293
|
log_level=state.options.log_level,
|
|
@@ -1068,6 +1069,7 @@ def create_task_router() -> APIRouter:
|
|
|
1068
1069
|
options = TaskOptions(
|
|
1069
1070
|
auto_merge=task_init.auto_merge,
|
|
1070
1071
|
max_sessions=task_init.max_sessions,
|
|
1072
|
+
max_prs=task_init.max_prs,
|
|
1071
1073
|
pause_on_pr=task_init.pause_on_pr,
|
|
1072
1074
|
enable_checkpointing=False, # Default to False
|
|
1073
1075
|
log_level="normal", # Default to normal
|
|
@@ -113,6 +113,11 @@ def start(
|
|
|
113
113
|
"-n",
|
|
114
114
|
help="Max work sessions before pausing (default: unlimited)",
|
|
115
115
|
),
|
|
116
|
+
max_prs: int | None = typer.Option(
|
|
117
|
+
None,
|
|
118
|
+
"--prs",
|
|
119
|
+
help="Max pull requests to create (default: unlimited)",
|
|
120
|
+
),
|
|
116
121
|
pause_on_pr: bool = typer.Option(
|
|
117
122
|
False,
|
|
118
123
|
"--pause-on-pr",
|
|
@@ -158,6 +163,8 @@ def start(
|
|
|
158
163
|
claudetm start "Add dark mode toggle"
|
|
159
164
|
claudetm start "Fix bug #123" -m opus --no-auto-merge
|
|
160
165
|
claudetm start "Refactor auth" -n 5 --pause-on-pr
|
|
166
|
+
claudetm start "Add user auth" --prs 1
|
|
167
|
+
claudetm start "Implement dashboard" --prs 3 --max-sessions 10
|
|
161
168
|
claudetm start "Debug issue" -l verbose --log-format json
|
|
162
169
|
claudetm start "Deploy feature" --webhook-url https://example.com/hooks
|
|
163
170
|
|
|
@@ -212,6 +219,7 @@ def start(
|
|
|
212
219
|
options = TaskOptions(
|
|
213
220
|
auto_merge=auto_merge,
|
|
214
221
|
max_sessions=max_sessions,
|
|
222
|
+
max_prs=max_prs,
|
|
215
223
|
pause_on_pr=pause_on_pr,
|
|
216
224
|
enable_checkpointing=enable_checkpointing,
|
|
217
225
|
log_level=log_level.lower(),
|
|
@@ -171,7 +171,11 @@ class AgentWrapper:
|
|
|
171
171
|
)
|
|
172
172
|
|
|
173
173
|
def run_planning_phase(
|
|
174
|
-
self,
|
|
174
|
+
self,
|
|
175
|
+
goal: str,
|
|
176
|
+
context: str = "",
|
|
177
|
+
coding_style: str | None = None,
|
|
178
|
+
max_prs: int | None = None,
|
|
175
179
|
) -> dict[str, Any]:
|
|
176
180
|
"""Run planning phase with read-only tools.
|
|
177
181
|
|
|
@@ -182,10 +186,11 @@ class AgentWrapper:
|
|
|
182
186
|
goal: The goal to plan for.
|
|
183
187
|
context: Additional context for planning.
|
|
184
188
|
coding_style: Optional coding style guide to inject into prompt.
|
|
189
|
+
max_prs: Optional maximum number of PRs to create.
|
|
185
190
|
|
|
186
191
|
Delegates to AgentPhaseExecutor for implementation.
|
|
187
192
|
"""
|
|
188
|
-
return self._phase_executor.run_planning_phase(goal, context, coding_style)
|
|
193
|
+
return self._phase_executor.run_planning_phase(goal, context, coding_style, max_prs)
|
|
189
194
|
|
|
190
195
|
def generate_coding_style(self) -> dict[str, Any]:
|
|
191
196
|
"""Generate a coding style guide by analyzing the codebase.
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_message.py
RENAMED
|
@@ -79,10 +79,25 @@ class MessageProcessor:
|
|
|
79
79
|
self.logger.log_tool_result(block.tool_use_id, "completed")
|
|
80
80
|
|
|
81
81
|
# Collect final result from ResultMessage
|
|
82
|
+
# Important: Only use message.result if we have no accumulated text,
|
|
83
|
+
# or if message.result contains content not in our accumulated text.
|
|
84
|
+
# This preserves verification markers (VERIFICATION_RESULT: PASS/FAIL)
|
|
85
|
+
# that may be output in earlier TextBlocks.
|
|
82
86
|
if message_type == "ResultMessage":
|
|
83
|
-
if hasattr(message, "result"):
|
|
84
|
-
|
|
85
|
-
|
|
87
|
+
if hasattr(message, "result") and message.result:
|
|
88
|
+
# If we have no accumulated text, use the result
|
|
89
|
+
if not result_text.strip():
|
|
90
|
+
result_text = message.result
|
|
91
|
+
console.newline() # Add newline after completion
|
|
92
|
+
# If message.result contains verification markers we're missing,
|
|
93
|
+
# prefer message.result (it might be more complete)
|
|
94
|
+
elif (
|
|
95
|
+
"verification_result:" in message.result.lower()
|
|
96
|
+
and "verification_result:" not in result_text.lower()
|
|
97
|
+
):
|
|
98
|
+
result_text = message.result
|
|
99
|
+
console.newline() # Add newline after completion
|
|
100
|
+
# Otherwise keep our accumulated text (it has the markers)
|
|
86
101
|
|
|
87
102
|
return result_text
|
|
88
103
|
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_phases.py
RENAMED
|
@@ -111,7 +111,11 @@ class AgentPhaseExecutor:
|
|
|
111
111
|
self.process_message_func = process_message_func
|
|
112
112
|
|
|
113
113
|
def run_planning_phase(
|
|
114
|
-
self,
|
|
114
|
+
self,
|
|
115
|
+
goal: str,
|
|
116
|
+
context: str = "",
|
|
117
|
+
coding_style: str | None = None,
|
|
118
|
+
max_prs: int | None = None,
|
|
115
119
|
) -> dict[str, Any]:
|
|
116
120
|
"""Run planning phase with read-only tools.
|
|
117
121
|
|
|
@@ -122,6 +126,7 @@ class AgentPhaseExecutor:
|
|
|
122
126
|
goal: The goal to plan for.
|
|
123
127
|
context: Additional context for planning.
|
|
124
128
|
coding_style: Optional coding style guide to inject into prompt.
|
|
129
|
+
max_prs: Optional maximum number of PRs to create.
|
|
125
130
|
|
|
126
131
|
Returns:
|
|
127
132
|
Dict with 'plan', 'criteria', and 'raw_output' keys.
|
|
@@ -131,6 +136,7 @@ class AgentPhaseExecutor:
|
|
|
131
136
|
goal=goal,
|
|
132
137
|
context=context if context else None,
|
|
133
138
|
coding_style=coding_style,
|
|
139
|
+
max_prs=max_prs,
|
|
134
140
|
)
|
|
135
141
|
|
|
136
142
|
# Always use Opus for planning (smartest model)
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/orchestrator.py
RENAMED
|
@@ -1357,6 +1357,9 @@ After completing your fixes, end with: TASK COMPLETE"""
|
|
|
1357
1357
|
def _wait_for_fix_pr_merge(self, state: TaskState) -> bool:
|
|
1358
1358
|
"""Wait for fix PR to pass CI and merge it.
|
|
1359
1359
|
|
|
1360
|
+
If CI fails, attempts to fix the issues (up to 2 retries) before giving up.
|
|
1361
|
+
This mirrors the regular PR workflow where CI failures trigger fix sessions.
|
|
1362
|
+
|
|
1360
1363
|
Args:
|
|
1361
1364
|
state: Current task state.
|
|
1362
1365
|
|
|
@@ -1377,7 +1380,68 @@ After completing your fixes, end with: TASK COMPLETE"""
|
|
|
1377
1380
|
console.warning(f"Could not detect fix PR: {e}")
|
|
1378
1381
|
return False
|
|
1379
1382
|
|
|
1380
|
-
#
|
|
1383
|
+
# Allow up to 2 CI fix attempts before giving up
|
|
1384
|
+
max_ci_fix_attempts = 1 # 0 and 1 = 2 attempts
|
|
1385
|
+
ci_fix_attempt = 0
|
|
1386
|
+
|
|
1387
|
+
while ci_fix_attempt <= max_ci_fix_attempts:
|
|
1388
|
+
# Poll CI until success or failure
|
|
1389
|
+
ci_result = self._poll_fix_pr_ci(pr_number, state)
|
|
1390
|
+
|
|
1391
|
+
if ci_result == "success":
|
|
1392
|
+
# CI passed, proceed to merge
|
|
1393
|
+
break
|
|
1394
|
+
elif ci_result == "failure":
|
|
1395
|
+
ci_fix_attempt += 1
|
|
1396
|
+
if ci_fix_attempt > max_ci_fix_attempts:
|
|
1397
|
+
console.error(f"Fix PR CI failed after {max_ci_fix_attempts} fix attempts")
|
|
1398
|
+
return False
|
|
1399
|
+
|
|
1400
|
+
# Attempt to fix the CI failure
|
|
1401
|
+
console.info(
|
|
1402
|
+
f"Attempting to fix CI failure ({ci_fix_attempt}/{max_ci_fix_attempts})..."
|
|
1403
|
+
)
|
|
1404
|
+
if not self._fix_pr_ci_failure(pr_number, state):
|
|
1405
|
+
console.error("Failed to fix CI issues")
|
|
1406
|
+
return False
|
|
1407
|
+
|
|
1408
|
+
# Wait for CI to restart after push
|
|
1409
|
+
console.info("Waiting 30s for CI to restart...")
|
|
1410
|
+
if not interruptible_sleep(30):
|
|
1411
|
+
return False
|
|
1412
|
+
else:
|
|
1413
|
+
# Interrupted or timed out
|
|
1414
|
+
return False
|
|
1415
|
+
|
|
1416
|
+
# Merge the PR
|
|
1417
|
+
if state.options.auto_merge:
|
|
1418
|
+
try:
|
|
1419
|
+
console.info(f"Merging fix PR #{pr_number}...")
|
|
1420
|
+
self.github_client.merge_pr(pr_number)
|
|
1421
|
+
console.success(f"Fix PR #{pr_number} merged!")
|
|
1422
|
+
|
|
1423
|
+
# Checkout back to target branch
|
|
1424
|
+
self._checkout_to_main()
|
|
1425
|
+
|
|
1426
|
+
return True
|
|
1427
|
+
except Exception as e:
|
|
1428
|
+
console.error(f"Failed to merge fix PR: {e}")
|
|
1429
|
+
return False
|
|
1430
|
+
else:
|
|
1431
|
+
console.info(f"Fix PR #{pr_number} ready to merge (auto_merge disabled)")
|
|
1432
|
+
console.detail("Merge manually then run 'claudetm resume'")
|
|
1433
|
+
return False
|
|
1434
|
+
|
|
1435
|
+
def _poll_fix_pr_ci(self, pr_number: int, state: TaskState) -> str:
|
|
1436
|
+
"""Poll CI status for a fix PR.
|
|
1437
|
+
|
|
1438
|
+
Args:
|
|
1439
|
+
pr_number: The PR number to check.
|
|
1440
|
+
state: Current task state.
|
|
1441
|
+
|
|
1442
|
+
Returns:
|
|
1443
|
+
"success" if CI passed, "failure" if CI failed, "interrupted" if cancelled.
|
|
1444
|
+
"""
|
|
1381
1445
|
max_wait = 600 # 10 minutes max
|
|
1382
1446
|
poll_interval = 10
|
|
1383
1447
|
waited = 0
|
|
@@ -1388,40 +1452,84 @@ After completing your fixes, end with: TASK COMPLETE"""
|
|
|
1388
1452
|
|
|
1389
1453
|
if pr_status.ci_state == "SUCCESS":
|
|
1390
1454
|
console.success("Fix PR CI passed!")
|
|
1391
|
-
|
|
1455
|
+
return "success"
|
|
1392
1456
|
elif pr_status.ci_state in ("FAILURE", "ERROR"):
|
|
1393
|
-
console.
|
|
1394
|
-
return
|
|
1457
|
+
console.warning("Fix PR CI failed")
|
|
1458
|
+
return "failure"
|
|
1395
1459
|
else:
|
|
1396
1460
|
console.info(f"Waiting for fix PR CI... ({pr_status.checks_pending} pending)")
|
|
1397
1461
|
if not interruptible_sleep(poll_interval):
|
|
1398
|
-
return
|
|
1462
|
+
return "interrupted"
|
|
1399
1463
|
waited += poll_interval
|
|
1400
1464
|
except Exception as e:
|
|
1401
1465
|
console.warning(f"Error checking CI: {e}")
|
|
1402
1466
|
if not interruptible_sleep(poll_interval):
|
|
1403
|
-
return
|
|
1467
|
+
return "interrupted"
|
|
1404
1468
|
waited += poll_interval
|
|
1405
1469
|
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
return False
|
|
1470
|
+
console.warning("Timed out waiting for fix PR CI")
|
|
1471
|
+
return "interrupted"
|
|
1409
1472
|
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
try:
|
|
1413
|
-
console.info(f"Merging fix PR #{pr_number}...")
|
|
1414
|
-
self.github_client.merge_pr(pr_number)
|
|
1415
|
-
console.success(f"Fix PR #{pr_number} merged!")
|
|
1473
|
+
def _fix_pr_ci_failure(self, pr_number: int, state: TaskState) -> bool:
|
|
1474
|
+
"""Fix CI failures on a fix PR.
|
|
1416
1475
|
|
|
1417
|
-
|
|
1418
|
-
self._checkout_to_main()
|
|
1476
|
+
Saves CI failure logs and runs an agent to fix the issues.
|
|
1419
1477
|
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1478
|
+
Args:
|
|
1479
|
+
pr_number: The PR number with failing CI.
|
|
1480
|
+
state: Current task state.
|
|
1481
|
+
|
|
1482
|
+
Returns:
|
|
1483
|
+
True if fix session completed successfully.
|
|
1484
|
+
"""
|
|
1485
|
+
try:
|
|
1486
|
+
# Save CI failure logs
|
|
1487
|
+
self.pr_context.save_ci_failures(pr_number)
|
|
1488
|
+
|
|
1489
|
+
# Get feedback (CI failures)
|
|
1490
|
+
has_ci, has_comments, pr_dir_path = self.pr_context.get_combined_feedback(pr_number)
|
|
1491
|
+
|
|
1492
|
+
if not has_ci and not has_comments:
|
|
1493
|
+
console.warning("No CI failures or comments found to fix")
|
|
1423
1494
|
return False
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1495
|
+
|
|
1496
|
+
# Build task description
|
|
1497
|
+
ci_path = f"{pr_dir_path}/ci/" if pr_dir_path else ".claude-task-master/debugging/"
|
|
1498
|
+
|
|
1499
|
+
task_description = f"""
|
|
1500
|
+
Fix PR CI Failure
|
|
1501
|
+
|
|
1502
|
+
The CI checks have failed for this fix PR. Your task is to:
|
|
1503
|
+
|
|
1504
|
+
1. Read the CI failure logs in `{ci_path}`
|
|
1505
|
+
2. Understand what tests/lints are failing
|
|
1506
|
+
3. Fix the issues in the codebase
|
|
1507
|
+
4. Run tests locally to verify fixes (check package.json, Makefile, or pyproject.toml for test commands)
|
|
1508
|
+
5. Commit and push the fixes
|
|
1509
|
+
|
|
1510
|
+
Important:
|
|
1511
|
+
- Only fix issues identified in the CI logs
|
|
1512
|
+
- Run tests locally before committing
|
|
1513
|
+
- Push changes to trigger a new CI run
|
|
1514
|
+
"""
|
|
1515
|
+
|
|
1516
|
+
# Run agent to fix issues
|
|
1517
|
+
context = self.state_manager.load_context()
|
|
1518
|
+
coding_style = self.state_manager.load_coding_style()
|
|
1519
|
+
|
|
1520
|
+
current_branch = self._get_current_branch()
|
|
1521
|
+
self.agent.run_work_session(
|
|
1522
|
+
task_description=task_description,
|
|
1523
|
+
context=context,
|
|
1524
|
+
model_override=ModelType.OPUS,
|
|
1525
|
+
required_branch=current_branch,
|
|
1526
|
+
coding_style=coding_style,
|
|
1527
|
+
)
|
|
1528
|
+
|
|
1529
|
+
state.session_count += 1
|
|
1530
|
+
self.state_manager.save_state(state)
|
|
1531
|
+
return True
|
|
1532
|
+
|
|
1533
|
+
except Exception as e:
|
|
1534
|
+
console.error(f"Failed to fix CI issues: {e}")
|
|
1427
1535
|
return False
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/planner.py
RENAMED
|
@@ -55,9 +55,15 @@ class Planner:
|
|
|
55
55
|
# Load any existing context
|
|
56
56
|
context = self.state_manager.load_context()
|
|
57
57
|
|
|
58
|
-
#
|
|
58
|
+
# Get max_prs from state options (if state exists)
|
|
59
|
+
max_prs = None
|
|
60
|
+
if self.state_manager.state_file.exists():
|
|
61
|
+
state = self.state_manager.load_state()
|
|
62
|
+
max_prs = state.options.max_prs
|
|
63
|
+
|
|
64
|
+
# Run planning phase with Claude (with coding style and max_prs)
|
|
59
65
|
result = self.agent.run_planning_phase(
|
|
60
|
-
goal=goal, context=context, coding_style=coding_style
|
|
66
|
+
goal=goal, context=context, coding_style=coding_style, max_prs=max_prs
|
|
61
67
|
)
|
|
62
68
|
|
|
63
69
|
# Extract plan and criteria from result
|
|
@@ -10,7 +10,10 @@ from .prompts_base import PromptBuilder
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def build_planning_prompt(
|
|
13
|
-
goal: str,
|
|
13
|
+
goal: str,
|
|
14
|
+
context: str | None = None,
|
|
15
|
+
coding_style: str | None = None,
|
|
16
|
+
max_prs: int | None = None,
|
|
14
17
|
) -> str:
|
|
15
18
|
"""Build the planning phase prompt.
|
|
16
19
|
|
|
@@ -18,6 +21,7 @@ def build_planning_prompt(
|
|
|
18
21
|
goal: The user's goal to achieve.
|
|
19
22
|
context: Optional accumulated context from previous sessions.
|
|
20
23
|
coding_style: Optional coding style guide to inject.
|
|
24
|
+
max_prs: Optional maximum number of PRs to create.
|
|
21
25
|
|
|
22
26
|
Returns:
|
|
23
27
|
Complete planning prompt.
|
|
@@ -175,6 +179,28 @@ executed in a continuous conversation, so Claude remembers previous work.
|
|
|
175
179
|
**Each PR should be mergeable independently when possible.**""",
|
|
176
180
|
)
|
|
177
181
|
|
|
182
|
+
# PR limit constraint (if specified)
|
|
183
|
+
if max_prs:
|
|
184
|
+
builder.add_section(
|
|
185
|
+
"⚠️ PR LIMIT CONSTRAINT (MANDATORY)",
|
|
186
|
+
f"""**CRITICAL: You MUST create EXACTLY {max_prs} pull request(s) or fewer. This is MANDATORY.**
|
|
187
|
+
|
|
188
|
+
🚫 **YOU ARE NOT ALLOWED TO EXCEED {max_prs} PR(s). NO EXCEPTIONS.**
|
|
189
|
+
|
|
190
|
+
Everything MUST fit within {max_prs} PR(s). Plan accordingly:
|
|
191
|
+
|
|
192
|
+
{"**For 1 PR: Put EVERYTHING in a single pull request.**" if max_prs == 1 else f"**For {max_prs} PRs: Intelligently group all work into {max_prs} or fewer pull requests.**"}
|
|
193
|
+
|
|
194
|
+
- Combine ALL related changes together
|
|
195
|
+
- Group tests, docs, and code in the same PR
|
|
196
|
+
- Keep dependencies together (schema + model + service in one PR)
|
|
197
|
+
- Prioritize essential work if needed
|
|
198
|
+
|
|
199
|
+
**DO NOT CREATE MORE THAN {max_prs} PR(s) under any circumstances.**
|
|
200
|
+
|
|
201
|
+
Any plan that exceeds {max_prs} PR(s) is INVALID and will be REJECTED.""",
|
|
202
|
+
)
|
|
203
|
+
|
|
178
204
|
# Success criteria
|
|
179
205
|
builder.add_section(
|
|
180
206
|
"Step 3: Define Success Criteria",
|
|
@@ -226,6 +226,7 @@ def create_server(
|
|
|
226
226
|
model: str = "opus",
|
|
227
227
|
auto_merge: bool = True,
|
|
228
228
|
max_sessions: int | None = None,
|
|
229
|
+
max_prs: int | None = None,
|
|
229
230
|
pause_on_pr: bool = False,
|
|
230
231
|
state_dir: str | None = None,
|
|
231
232
|
) -> dict[str, Any]:
|
|
@@ -239,6 +240,7 @@ def create_server(
|
|
|
239
240
|
model: Model to use (opus, sonnet, haiku).
|
|
240
241
|
auto_merge: Whether to auto-merge PRs when approved.
|
|
241
242
|
max_sessions: Max work sessions before pausing.
|
|
243
|
+
max_prs: Max pull requests to create.
|
|
242
244
|
pause_on_pr: Pause after creating PR for manual review.
|
|
243
245
|
state_dir: Optional custom state directory path.
|
|
244
246
|
|
|
@@ -246,7 +248,7 @@ def create_server(
|
|
|
246
248
|
Dictionary indicating success with run_id or failure.
|
|
247
249
|
"""
|
|
248
250
|
return tools.initialize_task(
|
|
249
|
-
work_dir, goal, model, auto_merge, max_sessions, pause_on_pr, state_dir
|
|
251
|
+
work_dir, goal, model, auto_merge, max_sessions, max_prs, pause_on_pr, state_dir
|
|
250
252
|
)
|
|
251
253
|
|
|
252
254
|
@mcp.tool()
|
|
@@ -336,6 +338,7 @@ def create_server(
|
|
|
336
338
|
def update_config(
|
|
337
339
|
auto_merge: bool | None = None,
|
|
338
340
|
max_sessions: int | None = None,
|
|
341
|
+
max_prs: int | None = None,
|
|
339
342
|
pause_on_pr: bool | None = None,
|
|
340
343
|
enable_checkpointing: bool | None = None,
|
|
341
344
|
log_level: str | None = None,
|
|
@@ -351,6 +354,7 @@ def create_server(
|
|
|
351
354
|
Args:
|
|
352
355
|
auto_merge: Whether to auto-merge PRs when approved.
|
|
353
356
|
max_sessions: Maximum number of work sessions before pausing.
|
|
357
|
+
max_prs: Maximum number of pull requests to create.
|
|
354
358
|
pause_on_pr: Whether to pause after creating PR for manual review.
|
|
355
359
|
enable_checkpointing: Whether to enable state checkpointing.
|
|
356
360
|
log_level: Log level (quiet, normal, verbose).
|
|
@@ -365,6 +369,7 @@ def create_server(
|
|
|
365
369
|
work_dir,
|
|
366
370
|
auto_merge=auto_merge,
|
|
367
371
|
max_sessions=max_sessions,
|
|
372
|
+
max_prs=max_prs,
|
|
368
373
|
pause_on_pr=pause_on_pr,
|
|
369
374
|
enable_checkpointing=enable_checkpointing,
|
|
370
375
|
log_level=log_level,
|
|
@@ -524,6 +524,7 @@ def initialize_task(
|
|
|
524
524
|
model: str = "opus",
|
|
525
525
|
auto_merge: bool = True,
|
|
526
526
|
max_sessions: int | None = None,
|
|
527
|
+
max_prs: int | None = None,
|
|
527
528
|
pause_on_pr: bool = False,
|
|
528
529
|
state_dir: str | None = None,
|
|
529
530
|
) -> dict[str, Any]:
|
|
@@ -535,6 +536,7 @@ def initialize_task(
|
|
|
535
536
|
model: Model to use (opus, sonnet, haiku).
|
|
536
537
|
auto_merge: Whether to auto-merge PRs when approved.
|
|
537
538
|
max_sessions: Max work sessions before pausing.
|
|
539
|
+
max_prs: Max pull requests to create.
|
|
538
540
|
pause_on_pr: Pause after creating PR for manual review.
|
|
539
541
|
state_dir: Optional custom state directory path.
|
|
540
542
|
|
|
@@ -554,6 +556,7 @@ def initialize_task(
|
|
|
554
556
|
options = TaskOptions(
|
|
555
557
|
auto_merge=auto_merge,
|
|
556
558
|
max_sessions=max_sessions,
|
|
559
|
+
max_prs=max_prs,
|
|
557
560
|
pause_on_pr=pause_on_pr,
|
|
558
561
|
)
|
|
559
562
|
state = state_manager.initialize(goal=goal, model=model, options=options)
|
|
@@ -832,6 +835,7 @@ def update_config(
|
|
|
832
835
|
work_dir: Path,
|
|
833
836
|
auto_merge: bool | None = None,
|
|
834
837
|
max_sessions: int | None = None,
|
|
838
|
+
max_prs: int | None = None,
|
|
835
839
|
pause_on_pr: bool | None = None,
|
|
836
840
|
enable_checkpointing: bool | None = None,
|
|
837
841
|
log_level: str | None = None,
|
|
@@ -848,6 +852,7 @@ def update_config(
|
|
|
848
852
|
work_dir: Working directory for the server.
|
|
849
853
|
auto_merge: Whether to auto-merge PRs when approved.
|
|
850
854
|
max_sessions: Maximum number of work sessions before pausing.
|
|
855
|
+
max_prs: Maximum number of pull requests to create.
|
|
851
856
|
pause_on_pr: Whether to pause after creating PR for manual review.
|
|
852
857
|
enable_checkpointing: Whether to enable state checkpointing.
|
|
853
858
|
log_level: Log level (quiet, normal, verbose).
|
|
@@ -868,6 +873,8 @@ def update_config(
|
|
|
868
873
|
kwargs["auto_merge"] = auto_merge
|
|
869
874
|
if max_sessions is not None:
|
|
870
875
|
kwargs["max_sessions"] = max_sessions
|
|
876
|
+
if max_prs is not None:
|
|
877
|
+
kwargs["max_prs"] = max_prs
|
|
871
878
|
if pause_on_pr is not None:
|
|
872
879
|
kwargs["pause_on_pr"] = pause_on_pr
|
|
873
880
|
if enable_checkpointing is not None:
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/events.py
RENAMED
|
@@ -44,7 +44,7 @@ from __future__ import annotations
|
|
|
44
44
|
import uuid
|
|
45
45
|
from dataclasses import dataclass, field
|
|
46
46
|
from datetime import UTC, datetime
|
|
47
|
-
from enum import
|
|
47
|
+
from enum import StrEnum
|
|
48
48
|
from typing import Any
|
|
49
49
|
|
|
50
50
|
# =============================================================================
|
|
@@ -52,7 +52,7 @@ from typing import Any
|
|
|
52
52
|
# =============================================================================
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
class EventType(
|
|
55
|
+
class EventType(StrEnum):
|
|
56
56
|
"""Webhook event types.
|
|
57
57
|
|
|
58
58
|
Each event type corresponds to a specific lifecycle event in the
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-task-master
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.10
|
|
4
4
|
Summary: Autonomous task orchestration system that keeps Claude working until a goal is achieved
|
|
5
5
|
Author: Claude Task Master Team
|
|
6
6
|
License-Expression: MIT
|
|
@@ -19,15 +19,15 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
19
19
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
20
20
|
Requires-Python: >=3.12
|
|
21
21
|
Description-Content-Type: text/markdown
|
|
22
|
-
Requires-Dist: claude-agent-sdk>=0.1.
|
|
22
|
+
Requires-Dist: claude-agent-sdk>=0.1.30
|
|
23
23
|
Requires-Dist: typer>=0.12.0
|
|
24
24
|
Requires-Dist: pydantic>=2.0.0
|
|
25
|
-
Requires-Dist: rich>=
|
|
25
|
+
Requires-Dist: rich>=14.3.2
|
|
26
26
|
Requires-Dist: httpx>=0.27.0
|
|
27
27
|
Provides-Extra: mcp
|
|
28
|
-
Requires-Dist: mcp>=1.
|
|
28
|
+
Requires-Dist: mcp>=1.26.0; extra == "mcp"
|
|
29
29
|
Provides-Extra: api
|
|
30
|
-
Requires-Dist: fastapi>=0.
|
|
30
|
+
Requires-Dist: fastapi>=0.128.1; extra == "api"
|
|
31
31
|
Requires-Dist: uvicorn[standard]>=0.24.0; extra == "api"
|
|
32
32
|
Requires-Dist: passlib[bcrypt]>=1.7.4; extra == "api"
|
|
33
33
|
Requires-Dist: bcrypt<4.1.0,>=4.0.0; extra == "api"
|
|
@@ -37,8 +37,8 @@ Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
|
37
37
|
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
38
38
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == "dev"
|
|
39
39
|
Requires-Dist: pytest-timeout>=2.4.0; extra == "dev"
|
|
40
|
-
Requires-Dist: hypothesis>=6.
|
|
41
|
-
Requires-Dist: ruff>=0.
|
|
40
|
+
Requires-Dist: hypothesis>=6.151.5; extra == "dev"
|
|
41
|
+
Requires-Dist: ruff>=0.15.0; extra == "dev"
|
|
42
42
|
Requires-Dist: mypy>=1.9.0; extra == "dev"
|
|
43
43
|
Provides-Extra: all
|
|
44
44
|
Requires-Dist: claude-task-master[api,dev,mcp]; extra == "all"
|
|
@@ -390,6 +390,7 @@ claudetm start "Your goal here" [OPTIONS]
|
|
|
390
390
|
| `--model` | Model to use (sonnet, opus, haiku) | sonnet |
|
|
391
391
|
| `--auto-merge/--no-auto-merge` | Auto-merge PRs when ready | True |
|
|
392
392
|
| `--max-sessions` | Limit number of sessions | unlimited |
|
|
393
|
+
| `--prs` | Limit number of PRs to create | unlimited |
|
|
393
394
|
| `--pause-on-pr` | Pause after creating PR | False |
|
|
394
395
|
|
|
395
396
|
### Common Workflows
|
|
@@ -404,6 +405,10 @@ claudetm start "Refactor auth system" --model opus --no-auto-merge
|
|
|
404
405
|
# Limited sessions to prevent runaway
|
|
405
406
|
claudetm start "Fix bug in parser" --max-sessions 5
|
|
406
407
|
|
|
408
|
+
# Limit number of PRs (forces everything into fewer PRs)
|
|
409
|
+
claudetm start "Add user dashboard" --prs 1
|
|
410
|
+
claudetm start "Implement notifications" --prs 3 --max-sessions 10
|
|
411
|
+
|
|
407
412
|
# Monitor progress
|
|
408
413
|
watch -n 5 'claudetm status'
|
|
409
414
|
|
|
@@ -435,6 +440,10 @@ claudetm start "Add dark mode toggle to settings" --model opus
|
|
|
435
440
|
# Refactoring
|
|
436
441
|
claudetm start "Refactor API client to use async/await" --max-sessions 5
|
|
437
442
|
|
|
443
|
+
# Limit PRs for focused changes
|
|
444
|
+
claudetm start "Add user authentication" --prs 1
|
|
445
|
+
claudetm start "Build admin dashboard" --prs 2 --max-sessions 8
|
|
446
|
+
|
|
438
447
|
# Documentation
|
|
439
448
|
claudetm start "Add API documentation and examples"
|
|
440
449
|
```
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/requires.txt
RENAMED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
claude-agent-sdk>=0.1.
|
|
1
|
+
claude-agent-sdk>=0.1.30
|
|
2
2
|
typer>=0.12.0
|
|
3
3
|
pydantic>=2.0.0
|
|
4
|
-
rich>=
|
|
4
|
+
rich>=14.3.2
|
|
5
5
|
httpx>=0.27.0
|
|
6
6
|
|
|
7
7
|
[all]
|
|
8
8
|
claude-task-master[api,dev,mcp]
|
|
9
9
|
|
|
10
10
|
[api]
|
|
11
|
-
fastapi>=0.
|
|
11
|
+
fastapi>=0.128.1
|
|
12
12
|
uvicorn[standard]>=0.24.0
|
|
13
13
|
passlib[bcrypt]>=1.7.4
|
|
14
14
|
bcrypt<4.1.0,>=4.0.0
|
|
@@ -19,9 +19,9 @@ pytest>=8.0.0
|
|
|
19
19
|
pytest-cov>=4.1.0
|
|
20
20
|
pytest-asyncio>=0.23.0
|
|
21
21
|
pytest-timeout>=2.4.0
|
|
22
|
-
hypothesis>=6.
|
|
23
|
-
ruff>=0.
|
|
22
|
+
hypothesis>=6.151.5
|
|
23
|
+
ruff>=0.15.0
|
|
24
24
|
mypy>=1.9.0
|
|
25
25
|
|
|
26
26
|
[mcp]
|
|
27
|
-
mcp>=1.
|
|
27
|
+
mcp>=1.26.0
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/__init__.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_config.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_control.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_repo.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_webhooks.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/auth/__init__.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/auth/middleware.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/auth/password.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/config.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/fix_pr.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/github.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/info.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_models.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_query.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/checkpoint.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/config.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/config_loader.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/console.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/control.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/conversation.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/credentials.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/key_listener.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/logger.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/parallel.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/plan_updater.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/pr_context.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/rate_limit.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/shutdown.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/state_backup.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/state_file_ops.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/state_pr.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/state_recovery.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/subagents.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/task_group.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/core/task_runner.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/github/__init__.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/github/client.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/github/client_ci.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/github/client_pr.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/github/exceptions.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/github/pr_cycle.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/__init__.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/merger.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/models.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/storage.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/mcp/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/utils/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/utils/doctor.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/__init__.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/client.py
RENAMED
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/config.py
RENAMED
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{claude_task_master-0.1.9 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|