claude-task-master 0.1.8__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.8 → claude_task_master-0.1.10}/PKG-INFO +16 -7
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/README.md +9 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/pyproject.toml +7 -7
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/__init__.py +1 -1
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/models.py +43 -5
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/routes.py +69 -1
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/workflow.py +8 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/agent.py +7 -2
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_message.py +18 -3
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_phases.py +7 -1
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/orchestrator.py +131 -23
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/planner.py +8 -2
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_planning.py +27 -1
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/state.py +1 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/state_file_ops.py +12 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mcp/server.py +25 -1
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mcp/tools.py +67 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/events.py +2 -2
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/PKG-INFO +16 -7
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/requires.txt +6 -6
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/setup.cfg +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/__init__.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_config.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_control.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_repo.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_webhooks.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/server.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/auth/__init__.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/auth/middleware.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/auth/password.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/bin/claudetm +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/__init__.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/ci_helpers.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/config.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/control.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/fix_pr.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/fix_session.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/github.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/info.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/mailbox.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/__init__.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_exceptions.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_models.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_query.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/checkpoint.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/circuit_breaker.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/config.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/config_loader.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/console.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/context_accumulator.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/control.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/conversation.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/credentials.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/hooks.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/key_listener.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/logger.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/parallel.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/plan_updater.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/pr_context.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/progress_tracker.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_base.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_coding_style.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_plan_update.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_verification.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_working.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/rate_limit.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/shutdown.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/state_backup.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/state_exceptions.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/state_pr.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/state_recovery.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/subagents.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/task_group.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/task_runner.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/workflow_stages.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/github/__init__.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/github/client.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/github/client_ci.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/github/client_pr.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/github/exceptions.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/github/pr_cycle.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/__init__.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/merger.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/models.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/storage.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mcp/__init__.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mcp/auth.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/server.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/utils/__init__.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/utils/debug_claude_md.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/utils/doctor.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/__init__.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/client.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/config.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/wrapper.py +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/SOURCES.txt +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/dependency_links.txt +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/entry_points.txt +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/top_level.txt +0 -0
- {claude_task_master-0.1.8 → claude_task_master-0.1.10}/tests/test_server.py +0 -0
- {claude_task_master-0.1.8 → 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 = [
|
|
@@ -25,6 +25,7 @@ Response Models:
|
|
|
25
25
|
- CloneRepoResponse: Result of cloning a repository
|
|
26
26
|
- SetupRepoResponse: Result of setting up a repository
|
|
27
27
|
- PlanRepoResponse: Result of planning for a repository
|
|
28
|
+
- DeleteCodingStyleResponse: Result of deleting coding-style.md
|
|
28
29
|
|
|
29
30
|
Usage:
|
|
30
31
|
from claude_task_master.api.models import (
|
|
@@ -47,7 +48,7 @@ Usage:
|
|
|
47
48
|
from __future__ import annotations
|
|
48
49
|
|
|
49
50
|
from datetime import datetime
|
|
50
|
-
from enum import Enum
|
|
51
|
+
from enum import Enum, StrEnum
|
|
51
52
|
from typing import Any
|
|
52
53
|
|
|
53
54
|
from pydantic import BaseModel, Field
|
|
@@ -57,7 +58,7 @@ from pydantic import BaseModel, Field
|
|
|
57
58
|
# =============================================================================
|
|
58
59
|
|
|
59
60
|
|
|
60
|
-
class TaskStatus(
|
|
61
|
+
class TaskStatus(StrEnum):
|
|
61
62
|
"""Valid task status values."""
|
|
62
63
|
|
|
63
64
|
PLANNING = "planning"
|
|
@@ -69,7 +70,7 @@ class TaskStatus(str, Enum):
|
|
|
69
70
|
FAILED = "failed"
|
|
70
71
|
|
|
71
72
|
|
|
72
|
-
class WorkflowStage(
|
|
73
|
+
class WorkflowStage(StrEnum):
|
|
73
74
|
"""Valid workflow stage values for PR lifecycle."""
|
|
74
75
|
|
|
75
76
|
WORKING = "working"
|
|
@@ -82,7 +83,7 @@ class WorkflowStage(str, Enum):
|
|
|
82
83
|
MERGED = "merged"
|
|
83
84
|
|
|
84
85
|
|
|
85
|
-
class LogLevel(
|
|
86
|
+
class LogLevel(StrEnum):
|
|
86
87
|
"""Valid log level values."""
|
|
87
88
|
|
|
88
89
|
QUIET = "quiet"
|
|
@@ -90,7 +91,7 @@ class LogLevel(str, Enum):
|
|
|
90
91
|
VERBOSE = "verbose"
|
|
91
92
|
|
|
92
93
|
|
|
93
|
-
class LogFormat(
|
|
94
|
+
class LogFormat(StrEnum):
|
|
94
95
|
"""Valid log format values."""
|
|
95
96
|
|
|
96
97
|
TEXT = "text"
|
|
@@ -158,6 +159,7 @@ class ConfigUpdateRequest(BaseModel):
|
|
|
158
159
|
Attributes:
|
|
159
160
|
auto_merge: Whether to auto-merge PRs when approved.
|
|
160
161
|
max_sessions: Maximum number of work sessions before pausing.
|
|
162
|
+
max_prs: Maximum number of pull requests to create.
|
|
161
163
|
pause_on_pr: Whether to pause after creating PR for manual review.
|
|
162
164
|
enable_checkpointing: Whether to enable state checkpointing.
|
|
163
165
|
log_level: Log level (quiet, normal, verbose).
|
|
@@ -175,6 +177,12 @@ class ConfigUpdateRequest(BaseModel):
|
|
|
175
177
|
le=1000,
|
|
176
178
|
description="Maximum number of work sessions before pausing",
|
|
177
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
|
+
)
|
|
178
186
|
pause_on_pr: bool | None = Field(
|
|
179
187
|
default=None,
|
|
180
188
|
description="Whether to pause after creating PR for manual review",
|
|
@@ -227,6 +235,7 @@ class TaskInitRequest(BaseModel):
|
|
|
227
235
|
model: Model to use (opus, sonnet, haiku).
|
|
228
236
|
auto_merge: Whether to auto-merge PRs when approved.
|
|
229
237
|
max_sessions: Max work sessions before pausing.
|
|
238
|
+
max_prs: Max pull requests to create.
|
|
230
239
|
pause_on_pr: Pause after creating PR for manual review.
|
|
231
240
|
"""
|
|
232
241
|
|
|
@@ -252,6 +261,12 @@ class TaskInitRequest(BaseModel):
|
|
|
252
261
|
le=1000,
|
|
253
262
|
description="Maximum number of work sessions before pausing",
|
|
254
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
|
+
)
|
|
255
270
|
pause_on_pr: bool = Field(
|
|
256
271
|
default=False,
|
|
257
272
|
description="Pause after creating PR for manual review",
|
|
@@ -383,6 +398,7 @@ class TaskOptionsResponse(BaseModel):
|
|
|
383
398
|
Attributes:
|
|
384
399
|
auto_merge: Whether to auto-merge PRs when approved.
|
|
385
400
|
max_sessions: Maximum number of work sessions before pausing.
|
|
401
|
+
max_prs: Maximum number of pull requests to create.
|
|
386
402
|
pause_on_pr: Whether to pause after creating PR for manual review.
|
|
387
403
|
enable_checkpointing: Whether state checkpointing is enabled.
|
|
388
404
|
log_level: Current log level.
|
|
@@ -392,6 +408,7 @@ class TaskOptionsResponse(BaseModel):
|
|
|
392
408
|
|
|
393
409
|
auto_merge: bool
|
|
394
410
|
max_sessions: int | None
|
|
411
|
+
max_prs: int | None
|
|
395
412
|
pause_on_pr: bool
|
|
396
413
|
enable_checkpointing: bool
|
|
397
414
|
log_level: str
|
|
@@ -860,3 +877,24 @@ class PlanRepoResponse(BaseModel):
|
|
|
860
877
|
criteria: str | None = None
|
|
861
878
|
run_id: str | None = None
|
|
862
879
|
error: str | None = None
|
|
880
|
+
|
|
881
|
+
|
|
882
|
+
# =============================================================================
|
|
883
|
+
# Coding Style Response Models
|
|
884
|
+
# =============================================================================
|
|
885
|
+
|
|
886
|
+
|
|
887
|
+
class DeleteCodingStyleResponse(BaseModel):
|
|
888
|
+
"""Response model for deleting the coding-style.md file.
|
|
889
|
+
|
|
890
|
+
Attributes:
|
|
891
|
+
success: Whether the deletion operation succeeded.
|
|
892
|
+
message: Human-readable result message.
|
|
893
|
+
file_existed: Whether the file existed before deletion.
|
|
894
|
+
error: Error message if deletion failed.
|
|
895
|
+
"""
|
|
896
|
+
|
|
897
|
+
success: bool
|
|
898
|
+
message: str
|
|
899
|
+
file_existed: bool = False
|
|
900
|
+
error: str | None = None
|
|
@@ -10,6 +10,7 @@ Endpoints:
|
|
|
10
10
|
- GET /progress: Get progress summary
|
|
11
11
|
- GET /context: Get accumulated context/learnings
|
|
12
12
|
- GET /health: Health check endpoint
|
|
13
|
+
- DELETE /coding-style: Delete the coding-style.md file
|
|
13
14
|
- POST /task/init: Initialize a new task
|
|
14
15
|
- DELETE /task: Delete/cleanup current task
|
|
15
16
|
- POST /control/stop: Stop a running task with optional cleanup
|
|
@@ -51,6 +52,7 @@ from claude_task_master.api.models import (
|
|
|
51
52
|
ConfigUpdateRequest,
|
|
52
53
|
ContextResponse,
|
|
53
54
|
ControlResponse,
|
|
55
|
+
DeleteCodingStyleResponse,
|
|
54
56
|
ErrorResponse,
|
|
55
57
|
HealthResponse,
|
|
56
58
|
LogsResponse,
|
|
@@ -285,6 +287,7 @@ def create_info_router() -> APIRouter:
|
|
|
285
287
|
options=TaskOptionsResponse(
|
|
286
288
|
auto_merge=state.options.auto_merge,
|
|
287
289
|
max_sessions=state.options.max_sessions,
|
|
290
|
+
max_prs=state.options.max_prs,
|
|
288
291
|
pause_on_pr=state.options.pause_on_pr,
|
|
289
292
|
enable_checkpointing=state.options.enable_checkpointing,
|
|
290
293
|
log_level=state.options.log_level,
|
|
@@ -613,6 +616,68 @@ def create_info_router() -> APIRouter:
|
|
|
613
616
|
active_tasks=active_tasks,
|
|
614
617
|
)
|
|
615
618
|
|
|
619
|
+
@router.delete(
|
|
620
|
+
"/coding-style",
|
|
621
|
+
response_model=DeleteCodingStyleResponse,
|
|
622
|
+
responses={
|
|
623
|
+
404: {"model": ErrorResponse, "description": "No active task found"},
|
|
624
|
+
500: {"model": ErrorResponse, "description": "Internal server error"},
|
|
625
|
+
},
|
|
626
|
+
summary="Delete Coding Style",
|
|
627
|
+
description="Delete the coding-style.md file from the state directory.",
|
|
628
|
+
)
|
|
629
|
+
async def delete_coding_style(request: Request) -> DeleteCodingStyleResponse | JSONResponse:
|
|
630
|
+
"""Delete the coding-style.md file.
|
|
631
|
+
|
|
632
|
+
Removes the coding-style.md file from the state directory. This file
|
|
633
|
+
contains extracted coding conventions and is regenerated on the next run.
|
|
634
|
+
|
|
635
|
+
Returns:
|
|
636
|
+
DeleteCodingStyleResponse indicating whether the file was deleted.
|
|
637
|
+
|
|
638
|
+
Raises:
|
|
639
|
+
404: If no active task exists.
|
|
640
|
+
500: If an error occurs during deletion.
|
|
641
|
+
"""
|
|
642
|
+
state_manager = _get_state_manager(request)
|
|
643
|
+
|
|
644
|
+
if not state_manager.exists():
|
|
645
|
+
return JSONResponse(
|
|
646
|
+
status_code=404,
|
|
647
|
+
content=ErrorResponse(
|
|
648
|
+
error="not_found",
|
|
649
|
+
message="No active task found",
|
|
650
|
+
suggestion="Start a new task with 'claudetm start <goal>'",
|
|
651
|
+
).model_dump(),
|
|
652
|
+
)
|
|
653
|
+
|
|
654
|
+
try:
|
|
655
|
+
file_existed = state_manager.delete_coding_style()
|
|
656
|
+
|
|
657
|
+
if file_existed:
|
|
658
|
+
return DeleteCodingStyleResponse(
|
|
659
|
+
success=True,
|
|
660
|
+
message="Coding style file deleted successfully",
|
|
661
|
+
file_existed=True,
|
|
662
|
+
)
|
|
663
|
+
else:
|
|
664
|
+
return DeleteCodingStyleResponse(
|
|
665
|
+
success=True,
|
|
666
|
+
message="Coding style file did not exist",
|
|
667
|
+
file_existed=False,
|
|
668
|
+
)
|
|
669
|
+
|
|
670
|
+
except Exception as e:
|
|
671
|
+
logger.exception("Error deleting coding style file")
|
|
672
|
+
return JSONResponse(
|
|
673
|
+
status_code=500,
|
|
674
|
+
content=ErrorResponse(
|
|
675
|
+
error="internal_error",
|
|
676
|
+
message="Failed to delete coding style file",
|
|
677
|
+
detail=str(e),
|
|
678
|
+
).model_dump(),
|
|
679
|
+
)
|
|
680
|
+
|
|
616
681
|
return router
|
|
617
682
|
|
|
618
683
|
|
|
@@ -1004,6 +1069,7 @@ def create_task_router() -> APIRouter:
|
|
|
1004
1069
|
options = TaskOptions(
|
|
1005
1070
|
auto_merge=task_init.auto_merge,
|
|
1006
1071
|
max_sessions=task_init.max_sessions,
|
|
1072
|
+
max_prs=task_init.max_prs,
|
|
1007
1073
|
pause_on_pr=task_init.pause_on_pr,
|
|
1008
1074
|
enable_checkpointing=False, # Default to False
|
|
1009
1075
|
log_level="normal", # Default to normal
|
|
@@ -1356,7 +1422,9 @@ def register_routes(app: FastAPI) -> None:
|
|
|
1356
1422
|
repo_router = create_repo_router()
|
|
1357
1423
|
app.include_router(repo_router, prefix="/repo")
|
|
1358
1424
|
|
|
1359
|
-
logger.debug(
|
|
1425
|
+
logger.debug(
|
|
1426
|
+
"Registered info routes: /status, /plan, /logs, /progress, /context, /health, /coding-style"
|
|
1427
|
+
)
|
|
1360
1428
|
logger.debug("Registered control routes: /control/stop, /control/resume, /config")
|
|
1361
1429
|
logger.debug("Registered task routes: /task/init, /task")
|
|
1362
1430
|
logger.debug("Registered webhook routes: /webhooks, /webhooks/{id}, /webhooks/test")
|
|
@@ -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.8 → 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.8 → 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)
|