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.
Files changed (103) hide show
  1. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/PKG-INFO +16 -7
  2. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/README.md +9 -0
  3. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/pyproject.toml +7 -7
  4. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/__init__.py +1 -1
  5. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/models.py +43 -5
  6. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/routes.py +69 -1
  7. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/workflow.py +8 -0
  8. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/agent.py +7 -2
  9. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_message.py +18 -3
  10. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_phases.py +7 -1
  11. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/orchestrator.py +131 -23
  12. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/planner.py +8 -2
  13. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_planning.py +27 -1
  14. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/state.py +1 -0
  15. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/state_file_ops.py +12 -0
  16. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mcp/server.py +25 -1
  17. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mcp/tools.py +67 -0
  18. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/events.py +2 -2
  19. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/PKG-INFO +16 -7
  20. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/requires.txt +6 -6
  21. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/setup.cfg +0 -0
  22. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/__init__.py +0 -0
  23. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_config.py +0 -0
  24. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_control.py +0 -0
  25. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_repo.py +0 -0
  26. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/routes_webhooks.py +0 -0
  27. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/api/server.py +0 -0
  28. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/auth/__init__.py +0 -0
  29. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/auth/middleware.py +0 -0
  30. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/auth/password.py +0 -0
  31. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/bin/claudetm +0 -0
  32. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli.py +0 -0
  33. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/__init__.py +0 -0
  34. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/ci_helpers.py +0 -0
  35. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/config.py +0 -0
  36. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/control.py +0 -0
  37. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/fix_pr.py +0 -0
  38. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/fix_session.py +0 -0
  39. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/github.py +0 -0
  40. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/info.py +0 -0
  41. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/cli_commands/mailbox.py +0 -0
  42. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/__init__.py +0 -0
  43. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_exceptions.py +0 -0
  44. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_models.py +0 -0
  45. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/agent_query.py +0 -0
  46. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/checkpoint.py +0 -0
  47. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/circuit_breaker.py +0 -0
  48. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/config.py +0 -0
  49. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/config_loader.py +0 -0
  50. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/console.py +0 -0
  51. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/context_accumulator.py +0 -0
  52. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/control.py +0 -0
  53. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/conversation.py +0 -0
  54. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/credentials.py +0 -0
  55. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/hooks.py +0 -0
  56. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/key_listener.py +0 -0
  57. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/logger.py +0 -0
  58. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/parallel.py +0 -0
  59. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/plan_updater.py +0 -0
  60. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/pr_context.py +0 -0
  61. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/progress_tracker.py +0 -0
  62. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts.py +0 -0
  63. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_base.py +0 -0
  64. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_coding_style.py +0 -0
  65. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_plan_update.py +0 -0
  66. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_verification.py +0 -0
  67. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/prompts_working.py +0 -0
  68. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/rate_limit.py +0 -0
  69. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/shutdown.py +0 -0
  70. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/state_backup.py +0 -0
  71. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/state_exceptions.py +0 -0
  72. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/state_pr.py +0 -0
  73. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/state_recovery.py +0 -0
  74. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/subagents.py +0 -0
  75. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/task_group.py +0 -0
  76. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/task_runner.py +0 -0
  77. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/core/workflow_stages.py +0 -0
  78. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/github/__init__.py +0 -0
  79. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/github/client.py +0 -0
  80. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/github/client_ci.py +0 -0
  81. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/github/client_pr.py +0 -0
  82. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/github/exceptions.py +0 -0
  83. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/github/pr_cycle.py +0 -0
  84. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/__init__.py +0 -0
  85. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/merger.py +0 -0
  86. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/models.py +0 -0
  87. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mailbox/storage.py +0 -0
  88. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mcp/__init__.py +0 -0
  89. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/mcp/auth.py +0 -0
  90. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/server.py +0 -0
  91. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/utils/__init__.py +0 -0
  92. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/utils/debug_claude_md.py +0 -0
  93. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/utils/doctor.py +0 -0
  94. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/__init__.py +0 -0
  95. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/client.py +0 -0
  96. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/webhooks/config.py +0 -0
  97. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master/wrapper.py +0 -0
  98. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/SOURCES.txt +0 -0
  99. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/dependency_links.txt +0 -0
  100. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/entry_points.txt +0 -0
  101. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/src/claude_task_master.egg-info/top_level.txt +0 -0
  102. {claude_task_master-0.1.8 → claude_task_master-0.1.10}/tests/test_server.py +0 -0
  103. {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.8
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.0
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>=13.0.0
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.0.0; extra == "mcp"
28
+ Requires-Dist: mcp>=1.26.0; extra == "mcp"
29
29
  Provides-Extra: api
30
- Requires-Dist: fastapi>=0.100.0; extra == "api"
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.100.0; extra == "dev"
41
- Requires-Dist: ruff>=0.3.0; extra == "dev"
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.8"
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.0",
27
+ "claude-agent-sdk>=0.1.30",
28
28
  "typer>=0.12.0",
29
29
  "pydantic>=2.0.0",
30
- "rich>=13.0.0",
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.0.0"]
42
+ mcp = ["mcp>=1.26.0"]
43
43
  api = [
44
- "fastapi>=0.100.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.100.0",
58
- "ruff>=0.3.0",
57
+ "hypothesis>=6.151.5",
58
+ "ruff>=0.15.0",
59
59
  "mypy>=1.9.0",
60
60
  ]
61
61
  all = [
@@ -3,5 +3,5 @@
3
3
  Uses Claude Agent SDK to keep Claude working until a goal is achieved.
4
4
  """
5
5
 
6
- __version__ = "0.1.8"
6
+ __version__ = "0.1.10"
7
7
  __all__ = ["__version__"]
@@ -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(str, Enum):
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(str, Enum):
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(str, Enum):
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(str, Enum):
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("Registered info routes: /status, /plan, /logs, /progress, /context, /health")
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, goal: str, context: str = "", coding_style: str | None = None
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.
@@ -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
- result_text = message.result
85
- console.newline() # Add newline after completion
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
 
@@ -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, goal: str, context: str = "", coding_style: str | None = None
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)