claude-task-master 0.1.5__tar.gz → 0.1.6__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 (102) hide show
  1. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/PKG-INFO +1 -1
  2. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/pyproject.toml +1 -1
  3. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/__init__.py +1 -1
  4. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/bin/claudetm +1 -1
  5. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/config.py +3 -3
  6. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/prompts_planning.py +6 -2
  7. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/task_runner.py +73 -34
  8. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master.egg-info/PKG-INFO +1 -1
  9. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/README.md +0 -0
  10. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/setup.cfg +0 -0
  11. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/api/__init__.py +0 -0
  12. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/api/models.py +0 -0
  13. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/api/routes.py +0 -0
  14. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/api/routes_config.py +0 -0
  15. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/api/routes_control.py +0 -0
  16. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/api/routes_repo.py +0 -0
  17. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/api/routes_webhooks.py +0 -0
  18. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/api/server.py +0 -0
  19. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/auth/__init__.py +0 -0
  20. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/auth/middleware.py +0 -0
  21. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/auth/password.py +0 -0
  22. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/cli.py +0 -0
  23. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/cli_commands/__init__.py +0 -0
  24. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/cli_commands/ci_helpers.py +0 -0
  25. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/cli_commands/config.py +0 -0
  26. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/cli_commands/control.py +0 -0
  27. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/cli_commands/fix_pr.py +0 -0
  28. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/cli_commands/fix_session.py +0 -0
  29. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/cli_commands/github.py +0 -0
  30. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/cli_commands/info.py +0 -0
  31. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/cli_commands/mailbox.py +0 -0
  32. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/cli_commands/workflow.py +0 -0
  33. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/__init__.py +0 -0
  34. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/agent.py +0 -0
  35. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/agent_exceptions.py +0 -0
  36. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/agent_message.py +0 -0
  37. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/agent_models.py +0 -0
  38. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/agent_phases.py +0 -0
  39. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/agent_query.py +0 -0
  40. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/checkpoint.py +0 -0
  41. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/circuit_breaker.py +0 -0
  42. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/config_loader.py +0 -0
  43. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/console.py +0 -0
  44. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/context_accumulator.py +0 -0
  45. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/control.py +0 -0
  46. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/conversation.py +0 -0
  47. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/credentials.py +0 -0
  48. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/hooks.py +0 -0
  49. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/key_listener.py +0 -0
  50. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/logger.py +0 -0
  51. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/orchestrator.py +0 -0
  52. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/parallel.py +0 -0
  53. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/plan_updater.py +0 -0
  54. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/planner.py +0 -0
  55. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/pr_context.py +0 -0
  56. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/progress_tracker.py +0 -0
  57. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/prompts.py +0 -0
  58. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/prompts_base.py +0 -0
  59. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/prompts_plan_update.py +0 -0
  60. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/prompts_verification.py +0 -0
  61. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/prompts_working.py +0 -0
  62. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/rate_limit.py +0 -0
  63. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/shutdown.py +0 -0
  64. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/state.py +0 -0
  65. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/state_backup.py +0 -0
  66. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/state_exceptions.py +0 -0
  67. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/state_file_ops.py +0 -0
  68. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/state_pr.py +0 -0
  69. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/state_recovery.py +0 -0
  70. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/subagents.py +0 -0
  71. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/task_group.py +0 -0
  72. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/core/workflow_stages.py +0 -0
  73. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/github/__init__.py +0 -0
  74. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/github/client.py +0 -0
  75. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/github/client_ci.py +0 -0
  76. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/github/client_pr.py +0 -0
  77. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/github/exceptions.py +0 -0
  78. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/github/pr_cycle.py +0 -0
  79. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/mailbox/__init__.py +0 -0
  80. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/mailbox/merger.py +0 -0
  81. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/mailbox/models.py +0 -0
  82. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/mailbox/storage.py +0 -0
  83. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/mcp/__init__.py +0 -0
  84. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/mcp/auth.py +0 -0
  85. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/mcp/server.py +0 -0
  86. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/mcp/tools.py +0 -0
  87. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/server.py +0 -0
  88. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/utils/__init__.py +0 -0
  89. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/utils/debug_claude_md.py +0 -0
  90. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/utils/doctor.py +0 -0
  91. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/webhooks/__init__.py +0 -0
  92. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/webhooks/client.py +0 -0
  93. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/webhooks/config.py +0 -0
  94. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/webhooks/events.py +0 -0
  95. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master/wrapper.py +0 -0
  96. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master.egg-info/SOURCES.txt +0 -0
  97. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master.egg-info/dependency_links.txt +0 -0
  98. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master.egg-info/entry_points.txt +0 -0
  99. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master.egg-info/requires.txt +0 -0
  100. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/src/claude_task_master.egg-info/top_level.txt +0 -0
  101. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/tests/test_server.py +0 -0
  102. {claude_task_master-0.1.5 → claude_task_master-0.1.6}/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.5
3
+ Version: 0.1.6
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "claude-task-master"
7
- version = "0.1.5"
7
+ version = "0.1.6"
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"
@@ -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.5"
6
+ __version__ = "0.1.6"
7
7
  __all__ = ["__version__"]
@@ -33,7 +33,7 @@ set -euo pipefail
33
33
 
34
34
  # Script version - synchronized with Python package version
35
35
  # This should be kept in sync using scripts/sync_version.py
36
- SCRIPT_VERSION="0.1.5"
36
+ SCRIPT_VERSION="0.1.6"
37
37
 
38
38
  # Configuration file location
39
39
  CONFIG_DIR=".claude-task-master"
@@ -109,8 +109,8 @@ class ToolsConfig(BaseModel):
109
109
  """
110
110
 
111
111
  planning: list[str] = Field(
112
- default_factory=lambda: ["Read", "Glob", "Grep", "Bash"],
113
- description="Tools available during planning phase (read-only + bash for checks).",
112
+ default_factory=lambda: ["Read", "Glob", "Grep", "Bash", "WebFetch", "WebSearch"],
113
+ description="Tools available during planning phase (read-only + bash for checks + web tools for research).",
114
114
  )
115
115
  verification: list[str] = Field(
116
116
  default_factory=lambda: ["Read", "Glob", "Grep", "Bash"],
@@ -152,7 +152,7 @@ class ClaudeTaskMasterConfig(BaseModel):
152
152
  "auto_push": true
153
153
  },
154
154
  "tools": {
155
- "planning": ["Read", "Glob", "Grep", "Bash"],
155
+ "planning": ["Read", "Glob", "Grep", "Bash", "WebFetch", "WebSearch"],
156
156
  "verification": ["Read", "Glob", "Grep", "Bash"],
157
157
  "working": []
158
158
  }
@@ -36,14 +36,18 @@ testing strategy, and how all pieces fit together. Plan for success.
36
36
  - `Glob` - Find files by pattern
37
37
  - `Grep` - Search for code patterns
38
38
  - `Bash` - Run commands (git status, tests, lint checks, etc.)
39
+ - `WebSearch` - Search the web for current information (use FIRST to find URLs)
40
+ - `WebFetch` - Fetch full content from URLs (only URLs from search results or user-provided)
41
+
42
+ **Web Research Workflow:** Use `WebSearch` first to find relevant documentation/articles,
43
+ then use `WebFetch` to retrieve full content from specific URLs in the search results.
44
+ WebFetch can also retrieve PDFs for technical documentation.
39
45
 
40
46
  **FORBIDDEN TOOLS (NEVER use during planning):**
41
47
  - ❌ `Write` - Do NOT write any files
42
48
  - ❌ `Edit` - Do NOT edit any files
43
49
  - ❌ `Task` - Do NOT launch any agents
44
50
  - ❌ `TodoWrite` - Do NOT use todo tracking
45
- - ❌ `WebFetch` - Do NOT fetch web pages
46
- - ❌ `WebSearch` - Do NOT search the web
47
51
 
48
52
  **WHY**: The orchestrator will save your plan to `plan.md` automatically.
49
53
  You just need to OUTPUT the plan as TEXT in your response.
@@ -157,6 +157,62 @@ class TaskRunner:
157
157
  self._parsed_groups_cache = None
158
158
  self._plan_hash = None
159
159
 
160
+ def _get_group_context(self, state: TaskState, plan: str | None = None) -> dict | None:
161
+ """Get PR group context for the current task.
162
+
163
+ Computes information about the current task's PR group including:
164
+ - Group name and ID
165
+ - Whether this is the last task in the group
166
+ - Remaining tasks in the group
167
+ - Completed tasks in the group
168
+
169
+ Args:
170
+ state: Current task state.
171
+ plan: Optional plan content. If not provided, loads from state manager.
172
+
173
+ Returns:
174
+ Dict with group context, or None if no plan or task out of range.
175
+ Keys: group_id, group_name, is_last_in_group, remaining_in_group,
176
+ completed_tasks, tasks_in_group
177
+ """
178
+ if plan is None:
179
+ plan = self.state_manager.load_plan()
180
+ if not plan:
181
+ return None
182
+
183
+ parsed_tasks, _ = self._get_parsed_tasks(plan)
184
+ if state.current_task_index >= len(parsed_tasks):
185
+ return None
186
+
187
+ current_task = parsed_tasks[state.current_task_index]
188
+ group_id = current_task.group_id
189
+ group_name = current_task.group_name
190
+
191
+ # Get all tasks in this group
192
+ tasks_in_group = [t for t in parsed_tasks if t.group_id == group_id]
193
+
194
+ # Find the current task's position within the group
195
+ current_task_in_group_idx = next(
196
+ (i for i, t in enumerate(tasks_in_group) if t.index == state.current_task_index),
197
+ 0,
198
+ )
199
+
200
+ # Calculate remaining tasks
201
+ remaining_in_group = len(tasks_in_group) - current_task_in_group_idx - 1
202
+ is_last_in_group = remaining_in_group == 0
203
+
204
+ # Get completed tasks in this group (for context)
205
+ completed_tasks = [t.cleaned_description for t in tasks_in_group if t.is_complete]
206
+
207
+ return {
208
+ "group_id": group_id,
209
+ "group_name": group_name,
210
+ "is_last_in_group": is_last_in_group,
211
+ "remaining_in_group": remaining_in_group,
212
+ "completed_tasks": completed_tasks,
213
+ "tasks_in_group": tasks_in_group,
214
+ }
215
+
160
216
  def run_work_session(self, state: TaskState) -> None:
161
217
  """Run a single work session.
162
218
 
@@ -204,25 +260,19 @@ class TaskRunner:
204
260
  complexity, cleaned_task = parse_task_complexity(current_task)
205
261
  target_model = TaskComplexity.get_model_for_complexity(complexity)
206
262
 
207
- # Get PR/group info for this task
208
- parsed_tasks, groups = self._get_parsed_tasks(plan)
209
- pr_name = "Default"
210
- pr_group_id = "default"
211
- if state.current_task_index < len(parsed_tasks):
212
- pr_name = parsed_tasks[state.current_task_index].group_name
213
- pr_group_id = parsed_tasks[state.current_task_index].group_id
214
-
215
- # Determine if this is the last task in the PR group
216
- tasks_in_group = [t for t in parsed_tasks if t.group_id == pr_group_id]
217
- current_task_in_group_idx = next(
218
- (i for i, t in enumerate(tasks_in_group) if t.index == state.current_task_index),
219
- 0,
220
- )
221
- remaining_in_group = len(tasks_in_group) - current_task_in_group_idx - 1
222
- is_last_in_group = remaining_in_group == 0
223
-
224
- # Get completed tasks in this group (for context)
225
- completed_in_group = [t.cleaned_description for t in tasks_in_group if t.is_complete]
263
+ # Get PR/group context for this task (reuses _get_group_context for DRY)
264
+ group_context = self._get_group_context(state, plan)
265
+ if group_context:
266
+ pr_name = group_context["group_name"]
267
+ is_last_in_group = group_context["is_last_in_group"]
268
+ remaining_in_group = group_context["remaining_in_group"]
269
+ completed_in_group = group_context["completed_tasks"]
270
+ else:
271
+ # Fallback for edge cases (shouldn't happen in normal operation)
272
+ pr_name = "Default"
273
+ is_last_in_group = True
274
+ remaining_in_group = 0
275
+ completed_in_group = []
226
276
 
227
277
  # Load context safely
228
278
  try:
@@ -480,19 +530,8 @@ Please complete this task."""
480
530
  Returns:
481
531
  True if this is the last task in the PR group.
482
532
  """
483
- plan = self.state_manager.load_plan()
484
- if not plan:
485
- return True
486
-
487
- parsed_tasks, _ = self._get_parsed_tasks(plan)
488
- if state.current_task_index >= len(parsed_tasks):
533
+ group_context = self._get_group_context(state)
534
+ if group_context is None:
535
+ # No plan or task out of range - treat as last task
489
536
  return True
490
-
491
- current_group_id = parsed_tasks[state.current_task_index].group_id
492
- tasks_in_group = [t for t in parsed_tasks if t.group_id == current_group_id]
493
- current_task_in_group_idx = next(
494
- (i for i, t in enumerate(tasks_in_group) if t.index == state.current_task_index),
495
- 0,
496
- )
497
- remaining_in_group = len(tasks_in_group) - current_task_in_group_idx - 1
498
- return remaining_in_group == 0
537
+ return bool(group_context["is_last_in_group"])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-task-master
3
- Version: 0.1.5
3
+ Version: 0.1.6
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