claude-task-master 0.1.9__tar.gz → 0.1.11__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.9 → claude_task_master-0.1.11}/PKG-INFO +31 -8
  2. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/README.md +24 -1
  3. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/pyproject.toml +7 -7
  4. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/__init__.py +1 -1
  5. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/api/models.py +21 -5
  6. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/api/routes.py +2 -0
  7. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/bin/claudetm +6 -1
  8. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/cli_commands/workflow.py +8 -0
  9. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/__init__.py +2 -0
  10. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/agent.py +7 -2
  11. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/agent_message.py +18 -3
  12. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/agent_models.py +32 -5
  13. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/agent_phases.py +7 -1
  14. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/config.py +35 -2
  15. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/orchestrator.py +131 -23
  16. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/planner.py +8 -2
  17. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/prompts_planning.py +27 -1
  18. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/state.py +1 -0
  19. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/mcp/server.py +6 -1
  20. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/mcp/tools.py +7 -0
  21. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/webhooks/events.py +2 -2
  22. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master.egg-info/PKG-INFO +31 -8
  23. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master.egg-info/requires.txt +6 -6
  24. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/setup.cfg +0 -0
  25. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/api/__init__.py +0 -0
  26. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/api/routes_config.py +0 -0
  27. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/api/routes_control.py +0 -0
  28. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/api/routes_repo.py +0 -0
  29. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/api/routes_webhooks.py +0 -0
  30. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/api/server.py +0 -0
  31. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/auth/__init__.py +0 -0
  32. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/auth/middleware.py +0 -0
  33. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/auth/password.py +0 -0
  34. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/cli.py +0 -0
  35. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/cli_commands/__init__.py +0 -0
  36. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/cli_commands/ci_helpers.py +0 -0
  37. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/cli_commands/config.py +0 -0
  38. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/cli_commands/control.py +0 -0
  39. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/cli_commands/fix_pr.py +0 -0
  40. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/cli_commands/fix_session.py +0 -0
  41. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/cli_commands/github.py +0 -0
  42. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/cli_commands/info.py +0 -0
  43. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/cli_commands/mailbox.py +0 -0
  44. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/agent_exceptions.py +0 -0
  45. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/agent_query.py +0 -0
  46. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/checkpoint.py +0 -0
  47. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/circuit_breaker.py +0 -0
  48. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/config_loader.py +0 -0
  49. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/console.py +0 -0
  50. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/context_accumulator.py +0 -0
  51. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/control.py +0 -0
  52. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/conversation.py +0 -0
  53. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/credentials.py +0 -0
  54. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/hooks.py +0 -0
  55. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/key_listener.py +0 -0
  56. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/logger.py +0 -0
  57. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/parallel.py +0 -0
  58. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/plan_updater.py +0 -0
  59. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/pr_context.py +0 -0
  60. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/progress_tracker.py +0 -0
  61. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/prompts.py +0 -0
  62. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/prompts_base.py +0 -0
  63. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/prompts_coding_style.py +0 -0
  64. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/prompts_plan_update.py +0 -0
  65. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/prompts_verification.py +0 -0
  66. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/prompts_working.py +0 -0
  67. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/rate_limit.py +0 -0
  68. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/shutdown.py +0 -0
  69. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/state_backup.py +0 -0
  70. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/state_exceptions.py +0 -0
  71. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/state_file_ops.py +0 -0
  72. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/state_pr.py +0 -0
  73. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/state_recovery.py +0 -0
  74. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/subagents.py +0 -0
  75. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/task_group.py +0 -0
  76. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/task_runner.py +0 -0
  77. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/core/workflow_stages.py +0 -0
  78. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/github/__init__.py +0 -0
  79. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/github/client.py +0 -0
  80. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/github/client_ci.py +0 -0
  81. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/github/client_pr.py +0 -0
  82. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/github/exceptions.py +0 -0
  83. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/github/pr_cycle.py +0 -0
  84. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/mailbox/__init__.py +0 -0
  85. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/mailbox/merger.py +0 -0
  86. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/mailbox/models.py +0 -0
  87. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/mailbox/storage.py +0 -0
  88. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/mcp/__init__.py +0 -0
  89. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/mcp/auth.py +0 -0
  90. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/server.py +0 -0
  91. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/utils/__init__.py +0 -0
  92. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/utils/debug_claude_md.py +0 -0
  93. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/utils/doctor.py +0 -0
  94. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/webhooks/__init__.py +0 -0
  95. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/webhooks/client.py +0 -0
  96. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/webhooks/config.py +0 -0
  97. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master/wrapper.py +0 -0
  98. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master.egg-info/SOURCES.txt +0 -0
  99. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master.egg-info/dependency_links.txt +0 -0
  100. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master.egg-info/entry_points.txt +0 -0
  101. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/src/claude_task_master.egg-info/top_level.txt +0 -0
  102. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/tests/test_server.py +0 -0
  103. {claude_task_master-0.1.9 → claude_task_master-0.1.11}/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.9
3
+ Version: 0.1.11
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.27
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"
@@ -295,9 +295,14 @@ This creates `.claude-task-master/config.json`:
295
295
  },
296
296
  "models": {
297
297
  "sonnet": "claude-sonnet-4-5-20250929",
298
- "opus": "claude-opus-4-5-20251101",
298
+ "opus": "claude-opus-4-6",
299
299
  "haiku": "claude-haiku-4-5-20251001"
300
300
  },
301
+ "context_windows": {
302
+ "opus": 200000,
303
+ "sonnet": 200000,
304
+ "haiku": 200000
305
+ },
301
306
  "git": {
302
307
  "target_branch": "main",
303
308
  "auto_push": true
@@ -305,6 +310,15 @@ This creates `.claude-task-master/config.json`:
305
310
  }
306
311
  ```
307
312
 
313
+ > **Note:** Opus 4.6 and Sonnet 4.5 support a 1M token context window in beta (**tier 4+** API access required). If you have tier 4+ access, you can increase the context windows:
314
+ > ```json
315
+ > "context_windows": {
316
+ > "opus": 1000000,
317
+ > "sonnet": 1000000,
318
+ > "haiku": 200000
319
+ > }
320
+ > ```
321
+
308
322
  ### Environment Variables
309
323
 
310
324
  The config file sets these environment variables before Python starts:
@@ -390,6 +404,7 @@ claudetm start "Your goal here" [OPTIONS]
390
404
  | `--model` | Model to use (sonnet, opus, haiku) | sonnet |
391
405
  | `--auto-merge/--no-auto-merge` | Auto-merge PRs when ready | True |
392
406
  | `--max-sessions` | Limit number of sessions | unlimited |
407
+ | `--prs` | Limit number of PRs to create | unlimited |
393
408
  | `--pause-on-pr` | Pause after creating PR | False |
394
409
 
395
410
  ### Common Workflows
@@ -404,6 +419,10 @@ claudetm start "Refactor auth system" --model opus --no-auto-merge
404
419
  # Limited sessions to prevent runaway
405
420
  claudetm start "Fix bug in parser" --max-sessions 5
406
421
 
422
+ # Limit number of PRs (forces everything into fewer PRs)
423
+ claudetm start "Add user dashboard" --prs 1
424
+ claudetm start "Implement notifications" --prs 3 --max-sessions 10
425
+
407
426
  # Monitor progress
408
427
  watch -n 5 'claudetm status'
409
428
 
@@ -435,6 +454,10 @@ claudetm start "Add dark mode toggle to settings" --model opus
435
454
  # Refactoring
436
455
  claudetm start "Refactor API client to use async/await" --max-sessions 5
437
456
 
457
+ # Limit PRs for focused changes
458
+ claudetm start "Add user authentication" --prs 1
459
+ claudetm start "Build admin dashboard" --prs 2 --max-sessions 8
460
+
438
461
  # Documentation
439
462
  claudetm start "Add API documentation and examples"
440
463
  ```
@@ -250,9 +250,14 @@ This creates `.claude-task-master/config.json`:
250
250
  },
251
251
  "models": {
252
252
  "sonnet": "claude-sonnet-4-5-20250929",
253
- "opus": "claude-opus-4-5-20251101",
253
+ "opus": "claude-opus-4-6",
254
254
  "haiku": "claude-haiku-4-5-20251001"
255
255
  },
256
+ "context_windows": {
257
+ "opus": 200000,
258
+ "sonnet": 200000,
259
+ "haiku": 200000
260
+ },
256
261
  "git": {
257
262
  "target_branch": "main",
258
263
  "auto_push": true
@@ -260,6 +265,15 @@ This creates `.claude-task-master/config.json`:
260
265
  }
261
266
  ```
262
267
 
268
+ > **Note:** Opus 4.6 and Sonnet 4.5 support a 1M token context window in beta (**tier 4+** API access required). If you have tier 4+ access, you can increase the context windows:
269
+ > ```json
270
+ > "context_windows": {
271
+ > "opus": 1000000,
272
+ > "sonnet": 1000000,
273
+ > "haiku": 200000
274
+ > }
275
+ > ```
276
+
263
277
  ### Environment Variables
264
278
 
265
279
  The config file sets these environment variables before Python starts:
@@ -345,6 +359,7 @@ claudetm start "Your goal here" [OPTIONS]
345
359
  | `--model` | Model to use (sonnet, opus, haiku) | sonnet |
346
360
  | `--auto-merge/--no-auto-merge` | Auto-merge PRs when ready | True |
347
361
  | `--max-sessions` | Limit number of sessions | unlimited |
362
+ | `--prs` | Limit number of PRs to create | unlimited |
348
363
  | `--pause-on-pr` | Pause after creating PR | False |
349
364
 
350
365
  ### Common Workflows
@@ -359,6 +374,10 @@ claudetm start "Refactor auth system" --model opus --no-auto-merge
359
374
  # Limited sessions to prevent runaway
360
375
  claudetm start "Fix bug in parser" --max-sessions 5
361
376
 
377
+ # Limit number of PRs (forces everything into fewer PRs)
378
+ claudetm start "Add user dashboard" --prs 1
379
+ claudetm start "Implement notifications" --prs 3 --max-sessions 10
380
+
362
381
  # Monitor progress
363
382
  watch -n 5 'claudetm status'
364
383
 
@@ -390,6 +409,10 @@ claudetm start "Add dark mode toggle to settings" --model opus
390
409
  # Refactoring
391
410
  claudetm start "Refactor API client to use async/await" --max-sessions 5
392
411
 
412
+ # Limit PRs for focused changes
413
+ claudetm start "Add user authentication" --prs 1
414
+ claudetm start "Build admin dashboard" --prs 2 --max-sessions 8
415
+
393
416
  # Documentation
394
417
  claudetm start "Add API documentation and examples"
395
418
  ```
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "claude-task-master"
7
- version = "0.1.9"
7
+ version = "0.1.11"
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",
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.9"
6
+ __version__ = "0.1.11"
7
7
  __all__ = ["__version__"]
@@ -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(str, Enum):
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(str, Enum):
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(str, Enum):
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(str, Enum):
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
@@ -289,9 +289,14 @@ default_config = {
289
289
  },
290
290
  "models": {
291
291
  "sonnet": "claude-sonnet-4-5-20250929",
292
- "opus": "claude-opus-4-5-20251101",
292
+ "opus": "claude-opus-4-6",
293
293
  "haiku": "claude-haiku-4-5-20251001"
294
294
  },
295
+ "context_windows": {
296
+ "opus": 200000,
297
+ "sonnet": 200000,
298
+ "haiku": 200000
299
+ },
295
300
  "git": {
296
301
  "target_branch": "main",
297
302
  "auto_push": True
@@ -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(),
@@ -24,6 +24,7 @@ from claude_task_master.core.agent_models import (
24
24
  ModelType,
25
25
  TaskComplexity,
26
26
  ToolConfig,
27
+ get_context_window,
27
28
  get_tools_for_phase,
28
29
  parse_task_complexity,
29
30
  )
@@ -246,6 +247,7 @@ __all__ = [
246
247
  "MODEL_CONTEXT_WINDOWS",
247
248
  "MODEL_CONTEXT_WINDOWS_STANDARD",
248
249
  "DEFAULT_COMPACT_THRESHOLD_PERCENT",
250
+ "get_context_window",
249
251
  # Rate limit classes
250
252
  "RateLimitConfig",
251
253
  # Checkpoint exceptions
@@ -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
 
@@ -91,12 +91,15 @@ class ToolConfig(Enum):
91
91
  # Constants
92
92
  # =============================================================================
93
93
 
94
- # Model context window sizes (tokens) for auto-compact threshold calculation
95
- # Sonnet 4/4.5 supports 1M context (available for tier 4+ users)
96
- # See: https://www.claude.com/blog/1m-context
94
+ # Model context window sizes (tokens) for auto-compact threshold calculation.
95
+ # These are defaults; users can override via config.json "context_windows" section.
96
+ # Opus 4.6 and Sonnet 4.5 support 1M context (beta, tier 4+ users).
97
+ # Note: The Agent SDK handles the `context-1m-2025-08-07` beta header internally.
98
+ # These values are only used to calculate when to trigger context compaction.
99
+ # See: https://platform.claude.com/docs/en/build-with-claude/context-windows
97
100
  MODEL_CONTEXT_WINDOWS = {
98
- ModelType.OPUS: 200_000, # Claude Opus 4.5: 200K context
99
- ModelType.SONNET: 1_000_000, # Claude Sonnet 4/4.5: 1M context (tier 4+)
101
+ ModelType.OPUS: 1_000_000, # Claude Opus 4.6: 1M context (beta, tier 4+)
102
+ ModelType.SONNET: 1_000_000, # Claude Sonnet 4.5: 1M context (beta, tier 4+)
100
103
  ModelType.HAIKU: 200_000, # Claude Haiku 4.5: 200K context
101
104
  }
102
105
 
@@ -107,6 +110,30 @@ MODEL_CONTEXT_WINDOWS_STANDARD = {
107
110
  ModelType.HAIKU: 200_000,
108
111
  }
109
112
 
113
+
114
+ def get_context_window(
115
+ model: ModelType,
116
+ config: ClaudeTaskMasterConfig | None = None,
117
+ ) -> int:
118
+ """Get context window size for a model, reading from config if available.
119
+
120
+ Args:
121
+ model: The model type.
122
+ config: Optional config object. If None, uses hardcoded defaults.
123
+
124
+ Returns:
125
+ Context window size in tokens.
126
+ """
127
+ if config is not None:
128
+ context_map = {
129
+ ModelType.OPUS: config.context_windows.opus,
130
+ ModelType.SONNET: config.context_windows.sonnet,
131
+ ModelType.HAIKU: config.context_windows.haiku,
132
+ }
133
+ return context_map.get(model, MODEL_CONTEXT_WINDOWS[model])
134
+ return MODEL_CONTEXT_WINDOWS[model]
135
+
136
+
110
137
  # Default compact threshold as percentage of context window
111
138
  DEFAULT_COMPACT_THRESHOLD_PERCENT = 0.85 # Compact at 85% usage
112
139
 
@@ -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)
@@ -71,7 +71,7 @@ class ModelConfig(BaseModel):
71
71
  description="Model name for 'sonnet' (balanced). Overridden by CLAUDETM_MODEL_SONNET.",
72
72
  )
73
73
  opus: str = Field(
74
- default="claude-opus-4-5-20251101",
74
+ default="claude-opus-4-6",
75
75
  description="Model name for 'opus' (smartest). Overridden by CLAUDETM_MODEL_OPUS.",
76
76
  )
77
77
  haiku: str = Field(
@@ -97,6 +97,30 @@ class GitConfig(BaseModel):
97
97
  )
98
98
 
99
99
 
100
+ class ContextWindowsConfig(BaseModel):
101
+ """Context window sizes per model (in tokens).
102
+
103
+ Controls the max context window size used for auto-compact threshold calculation.
104
+ Opus 4.6 and Sonnet 4.5 support 1M context in beta (tier 4+ users).
105
+ Users on lower tiers should set these to 200000.
106
+
107
+ To enable 1M context via the API, use the beta header: context-1m-2025-08-07
108
+ """
109
+
110
+ opus: int = Field(
111
+ default=200_000,
112
+ description="Opus context window size in tokens. 200000 (standard) or 1000000 (beta, tier 4+).",
113
+ )
114
+ sonnet: int = Field(
115
+ default=200_000,
116
+ description="Sonnet context window size in tokens. 200000 (standard) or 1000000 (beta, tier 4+).",
117
+ )
118
+ haiku: int = Field(
119
+ default=200_000,
120
+ description="Haiku context window size in tokens.",
121
+ )
122
+
123
+
100
124
  class ToolsConfig(BaseModel):
101
125
  """Tool configurations per execution phase.
102
126
 
@@ -144,13 +168,18 @@ class ClaudeTaskMasterConfig(BaseModel):
144
168
  },
145
169
  "models": {
146
170
  "sonnet": "claude-sonnet-4-5-20250929",
147
- "opus": "claude-opus-4-5-20251101",
171
+ "opus": "claude-opus-4-6",
148
172
  "haiku": "claude-haiku-4-5-20251001"
149
173
  },
150
174
  "git": {
151
175
  "target_branch": "main",
152
176
  "auto_push": true
153
177
  },
178
+ "context_windows": {
179
+ "opus": 200000,
180
+ "sonnet": 200000,
181
+ "haiku": 200000
182
+ },
154
183
  "tools": {
155
184
  "planning": ["Read", "Glob", "Grep", "Bash", "WebFetch", "WebSearch"],
156
185
  "verification": ["Read", "Glob", "Grep", "Bash"],
@@ -172,6 +201,10 @@ class ClaudeTaskMasterConfig(BaseModel):
172
201
  default_factory=ModelConfig,
173
202
  description="Model name mappings.",
174
203
  )
204
+ context_windows: ContextWindowsConfig = Field(
205
+ default_factory=ContextWindowsConfig,
206
+ description="Context window sizes per model (tokens). Set to 200000 if not on tier 4+.",
207
+ )
175
208
  git: GitConfig = Field(
176
209
  default_factory=GitConfig,
177
210
  description="Git configuration (target branch, auto-push).",