claude-task-master 0.1.7__py3-none-any.whl → 0.1.8__py3-none-any.whl
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/__init__.py +1 -1
- claude_task_master/core/agent.py +25 -2
- claude_task_master/core/agent_phases.py +53 -3
- claude_task_master/core/orchestrator.py +4 -0
- claude_task_master/core/planner.py +41 -3
- claude_task_master/core/prompts.py +8 -0
- claude_task_master/core/prompts_coding_style.py +160 -0
- claude_task_master/core/prompts_planning.py +30 -6
- claude_task_master/core/prompts_working.py +36 -13
- claude_task_master/core/state_backup.py +11 -3
- claude_task_master/core/state_file_ops.py +20 -0
- claude_task_master/core/task_runner.py +8 -0
- {claude_task_master-0.1.7.dist-info → claude_task_master-0.1.8.dist-info}/METADATA +1 -1
- {claude_task_master-0.1.7.dist-info → claude_task_master-0.1.8.dist-info}/RECORD +17 -16
- {claude_task_master-0.1.7.dist-info → claude_task_master-0.1.8.dist-info}/WHEEL +0 -0
- {claude_task_master-0.1.7.dist-info → claude_task_master-0.1.8.dist-info}/entry_points.txt +0 -0
- {claude_task_master-0.1.7.dist-info → claude_task_master-0.1.8.dist-info}/top_level.txt +0 -0
claude_task_master/__init__.py
CHANGED
claude_task_master/core/agent.py
CHANGED
|
@@ -170,15 +170,35 @@ class AgentWrapper:
|
|
|
170
170
|
ValueError("query must be callable"),
|
|
171
171
|
)
|
|
172
172
|
|
|
173
|
-
def run_planning_phase(
|
|
173
|
+
def run_planning_phase(
|
|
174
|
+
self, goal: str, context: str = "", coding_style: str | None = None
|
|
175
|
+
) -> dict[str, Any]:
|
|
174
176
|
"""Run planning phase with read-only tools.
|
|
175
177
|
|
|
176
178
|
Always uses Opus (smartest model) for planning to ensure
|
|
177
179
|
high-quality task breakdown and complexity classification.
|
|
178
180
|
|
|
181
|
+
Args:
|
|
182
|
+
goal: The goal to plan for.
|
|
183
|
+
context: Additional context for planning.
|
|
184
|
+
coding_style: Optional coding style guide to inject into prompt.
|
|
185
|
+
|
|
186
|
+
Delegates to AgentPhaseExecutor for implementation.
|
|
187
|
+
"""
|
|
188
|
+
return self._phase_executor.run_planning_phase(goal, context, coding_style)
|
|
189
|
+
|
|
190
|
+
def generate_coding_style(self) -> dict[str, Any]:
|
|
191
|
+
"""Generate a coding style guide by analyzing the codebase.
|
|
192
|
+
|
|
193
|
+
Analyzes CLAUDE.md, convention files, and codebase to create a
|
|
194
|
+
concise coding style guide with workflow and conventions.
|
|
195
|
+
|
|
196
|
+
Returns:
|
|
197
|
+
Dict with 'coding_style' and 'raw_output' keys.
|
|
198
|
+
|
|
179
199
|
Delegates to AgentPhaseExecutor for implementation.
|
|
180
200
|
"""
|
|
181
|
-
return self._phase_executor.
|
|
201
|
+
return self._phase_executor.generate_coding_style()
|
|
182
202
|
|
|
183
203
|
def run_work_session(
|
|
184
204
|
self,
|
|
@@ -190,6 +210,7 @@ class AgentWrapper:
|
|
|
190
210
|
create_pr: bool = True,
|
|
191
211
|
pr_group_info: dict | None = None,
|
|
192
212
|
target_branch: str = "main",
|
|
213
|
+
coding_style: str | None = None,
|
|
193
214
|
) -> dict[str, Any]:
|
|
194
215
|
"""Run a work session with full tools.
|
|
195
216
|
|
|
@@ -203,6 +224,7 @@ class AgentWrapper:
|
|
|
203
224
|
create_pr: If True, instruct agent to create PR. If False, commit only.
|
|
204
225
|
pr_group_info: Optional dict with PR group context (name, completed_tasks, etc).
|
|
205
226
|
target_branch: The target branch for rebasing (default: "main").
|
|
227
|
+
coding_style: Optional coding style guide to inject into prompt.
|
|
206
228
|
|
|
207
229
|
Returns:
|
|
208
230
|
Dict with 'output', 'success', and 'model_used' keys.
|
|
@@ -218,6 +240,7 @@ class AgentWrapper:
|
|
|
218
240
|
create_pr=create_pr,
|
|
219
241
|
pr_group_info=pr_group_info,
|
|
220
242
|
target_branch=target_branch,
|
|
243
|
+
coding_style=coding_style,
|
|
221
244
|
)
|
|
222
245
|
|
|
223
246
|
def verify_success_criteria(self, criteria: str, context: str = "") -> dict[str, Any]:
|
|
@@ -13,7 +13,13 @@ from typing import TYPE_CHECKING, Any, TypeVar
|
|
|
13
13
|
|
|
14
14
|
from . import console
|
|
15
15
|
from .agent_models import ModelType, get_tools_for_phase
|
|
16
|
-
from .prompts import
|
|
16
|
+
from .prompts import (
|
|
17
|
+
build_coding_style_prompt,
|
|
18
|
+
build_planning_prompt,
|
|
19
|
+
build_verification_prompt,
|
|
20
|
+
build_work_prompt,
|
|
21
|
+
extract_coding_style,
|
|
22
|
+
)
|
|
17
23
|
|
|
18
24
|
if TYPE_CHECKING:
|
|
19
25
|
from .agent_query import AgentQueryExecutor
|
|
@@ -104,7 +110,9 @@ class AgentPhaseExecutor:
|
|
|
104
110
|
self.get_agents_func = get_agents_func
|
|
105
111
|
self.process_message_func = process_message_func
|
|
106
112
|
|
|
107
|
-
def run_planning_phase(
|
|
113
|
+
def run_planning_phase(
|
|
114
|
+
self, goal: str, context: str = "", coding_style: str | None = None
|
|
115
|
+
) -> dict[str, Any]:
|
|
108
116
|
"""Run planning phase with read-only tools.
|
|
109
117
|
|
|
110
118
|
Always uses Opus (smartest model) for planning to ensure
|
|
@@ -113,12 +121,17 @@ class AgentPhaseExecutor:
|
|
|
113
121
|
Args:
|
|
114
122
|
goal: The goal to plan for.
|
|
115
123
|
context: Additional context for planning.
|
|
124
|
+
coding_style: Optional coding style guide to inject into prompt.
|
|
116
125
|
|
|
117
126
|
Returns:
|
|
118
127
|
Dict with 'plan', 'criteria', and 'raw_output' keys.
|
|
119
128
|
"""
|
|
120
129
|
# Build prompt for planning
|
|
121
|
-
prompt = build_planning_prompt(
|
|
130
|
+
prompt = build_planning_prompt(
|
|
131
|
+
goal=goal,
|
|
132
|
+
context=context if context else None,
|
|
133
|
+
coding_style=coding_style,
|
|
134
|
+
)
|
|
122
135
|
|
|
123
136
|
# Always use Opus for planning (smartest model)
|
|
124
137
|
console.info("Planning with Opus (smartest model)...")
|
|
@@ -152,6 +165,7 @@ class AgentPhaseExecutor:
|
|
|
152
165
|
create_pr: bool = True,
|
|
153
166
|
pr_group_info: dict | None = None,
|
|
154
167
|
target_branch: str = "main",
|
|
168
|
+
coding_style: str | None = None,
|
|
155
169
|
) -> dict[str, Any]:
|
|
156
170
|
"""Run a work session with full tools.
|
|
157
171
|
|
|
@@ -165,6 +179,7 @@ class AgentPhaseExecutor:
|
|
|
165
179
|
create_pr: If True, instruct agent to create PR. If False, commit only.
|
|
166
180
|
pr_group_info: Optional dict with PR group context (name, completed_tasks, etc).
|
|
167
181
|
target_branch: The target branch for rebasing (default: "main").
|
|
182
|
+
coding_style: Optional coding style guide to inject into prompt.
|
|
168
183
|
|
|
169
184
|
Returns:
|
|
170
185
|
Dict with 'output', 'success', and 'model_used' keys.
|
|
@@ -178,6 +193,7 @@ class AgentPhaseExecutor:
|
|
|
178
193
|
create_pr=create_pr,
|
|
179
194
|
pr_group_info=pr_group_info,
|
|
180
195
|
target_branch=target_branch,
|
|
196
|
+
coding_style=coding_style,
|
|
181
197
|
)
|
|
182
198
|
|
|
183
199
|
# Run async query with optional model override
|
|
@@ -328,3 +344,37 @@ class AgentPhaseExecutor:
|
|
|
328
344
|
|
|
329
345
|
# Default criteria if none specified
|
|
330
346
|
return "All tasks in the task list are completed successfully."
|
|
347
|
+
|
|
348
|
+
def generate_coding_style(self) -> dict[str, Any]:
|
|
349
|
+
"""Generate a coding style guide by analyzing the codebase.
|
|
350
|
+
|
|
351
|
+
Analyzes CLAUDE.md, convention files, and sample source files
|
|
352
|
+
to create a concise coding style guide.
|
|
353
|
+
|
|
354
|
+
Returns:
|
|
355
|
+
Dict with 'coding_style' and 'raw_output' keys.
|
|
356
|
+
"""
|
|
357
|
+
# Build prompt for coding style generation
|
|
358
|
+
prompt = build_coding_style_prompt()
|
|
359
|
+
|
|
360
|
+
console.info("Generating coding style guide with Opus...")
|
|
361
|
+
|
|
362
|
+
# Run with planning tools (read-only) and Opus for quality
|
|
363
|
+
result = run_async_with_cleanup(
|
|
364
|
+
self.query_executor.run_query(
|
|
365
|
+
prompt=prompt,
|
|
366
|
+
tools=self.get_tools_for_phase("planning"),
|
|
367
|
+
model_override=ModelType.OPUS, # Use Opus for quality
|
|
368
|
+
get_model_name_func=self.get_model_name_func,
|
|
369
|
+
get_agents_func=self.get_agents_func,
|
|
370
|
+
process_message_func=self.process_message_func,
|
|
371
|
+
)
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
# Extract the coding style content
|
|
375
|
+
coding_style = extract_coding_style(result)
|
|
376
|
+
|
|
377
|
+
return {
|
|
378
|
+
"coding_style": coding_style,
|
|
379
|
+
"raw_output": result,
|
|
380
|
+
}
|
|
@@ -1337,11 +1337,15 @@ After fixing everything, run the tests again to confirm they pass.
|
|
|
1337
1337
|
After completing your fixes, end with: TASK COMPLETE"""
|
|
1338
1338
|
|
|
1339
1339
|
try:
|
|
1340
|
+
# Load coding style for consistent style in fix session
|
|
1341
|
+
coding_style = self.state_manager.load_coding_style()
|
|
1342
|
+
|
|
1340
1343
|
self.agent.run_work_session(
|
|
1341
1344
|
task_description=task_description,
|
|
1342
1345
|
context=context,
|
|
1343
1346
|
model_override=ModelType.OPUS,
|
|
1344
1347
|
create_pr=True,
|
|
1348
|
+
coding_style=coding_style,
|
|
1345
1349
|
)
|
|
1346
1350
|
state.session_count += 1
|
|
1347
1351
|
self.state_manager.save_state(state)
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from typing import Any
|
|
4
4
|
|
|
5
|
+
from . import console
|
|
5
6
|
from .agent import AgentWrapper
|
|
6
7
|
from .state import StateManager
|
|
7
8
|
|
|
@@ -14,13 +15,50 @@ class Planner:
|
|
|
14
15
|
self.agent = agent
|
|
15
16
|
self.state_manager = state_manager
|
|
16
17
|
|
|
18
|
+
def ensure_coding_style(self) -> str | None:
|
|
19
|
+
"""Ensure coding style guide exists, generating it if needed.
|
|
20
|
+
|
|
21
|
+
Checks if coding-style.md exists. If not, generates it by analyzing
|
|
22
|
+
CLAUDE.md and convention files in the codebase.
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
The coding style guide content, or None if generation failed.
|
|
26
|
+
"""
|
|
27
|
+
# Check if coding style already exists
|
|
28
|
+
coding_style = self.state_manager.load_coding_style()
|
|
29
|
+
if coding_style:
|
|
30
|
+
console.info("Using existing coding style guide")
|
|
31
|
+
return coding_style
|
|
32
|
+
|
|
33
|
+
# Generate coding style by analyzing codebase
|
|
34
|
+
console.info("Generating coding style guide from codebase...")
|
|
35
|
+
result = self.agent.generate_coding_style()
|
|
36
|
+
|
|
37
|
+
coding_style_content: str = result.get("coding_style", "")
|
|
38
|
+
if coding_style_content:
|
|
39
|
+
self.state_manager.save_coding_style(coding_style_content)
|
|
40
|
+
console.success("Coding style guide generated and saved")
|
|
41
|
+
return coding_style_content
|
|
42
|
+
|
|
43
|
+
console.warning("Could not generate coding style guide")
|
|
44
|
+
return None
|
|
45
|
+
|
|
17
46
|
def create_plan(self, goal: str) -> dict[str, Any]:
|
|
18
|
-
"""Create initial task plan using read-only tools.
|
|
47
|
+
"""Create initial task plan using read-only tools.
|
|
48
|
+
|
|
49
|
+
First generates coding style guide if it doesn't exist, then
|
|
50
|
+
runs planning phase with the coding style injected.
|
|
51
|
+
"""
|
|
52
|
+
# Ensure coding style exists (generate if needed)
|
|
53
|
+
coding_style = self.ensure_coding_style()
|
|
54
|
+
|
|
19
55
|
# Load any existing context
|
|
20
56
|
context = self.state_manager.load_context()
|
|
21
57
|
|
|
22
|
-
# Run planning phase with Claude
|
|
23
|
-
result = self.agent.run_planning_phase(
|
|
58
|
+
# Run planning phase with Claude (with coding style)
|
|
59
|
+
result = self.agent.run_planning_phase(
|
|
60
|
+
goal=goal, context=context, coding_style=coding_style
|
|
61
|
+
)
|
|
24
62
|
|
|
25
63
|
# Extract plan and criteria from result
|
|
26
64
|
plan = result.get("plan", "")
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Prompt Templates - Centralized, maintainable prompt generation.
|
|
2
2
|
|
|
3
3
|
This module provides structured prompt templates for different agent phases:
|
|
4
|
+
- Coding Style: Generate concise coding style guide from codebase analysis
|
|
4
5
|
- Planning: Initial codebase analysis and task creation
|
|
5
6
|
- Plan Update: Modifying existing plans based on change requests
|
|
6
7
|
- Working: Task execution with verification
|
|
@@ -12,6 +13,7 @@ All prompts are designed to be concise, structured, and token-efficient.
|
|
|
12
13
|
This module re-exports all prompt functions for backward compatibility.
|
|
13
14
|
The actual implementations are in:
|
|
14
15
|
- prompts_base.py: PromptSection, PromptBuilder
|
|
16
|
+
- prompts_coding_style.py: build_coding_style_prompt, extract_coding_style
|
|
15
17
|
- prompts_planning.py: build_planning_prompt
|
|
16
18
|
- prompts_plan_update.py: build_plan_update_prompt
|
|
17
19
|
- prompts_working.py: build_work_prompt
|
|
@@ -24,6 +26,9 @@ from __future__ import annotations
|
|
|
24
26
|
# Re-export base classes
|
|
25
27
|
from .prompts_base import PromptBuilder, PromptSection
|
|
26
28
|
|
|
29
|
+
# Re-export coding style prompts
|
|
30
|
+
from .prompts_coding_style import build_coding_style_prompt, extract_coding_style
|
|
31
|
+
|
|
27
32
|
# Re-export planning prompts
|
|
28
33
|
from .prompts_plan_update import build_plan_update_prompt
|
|
29
34
|
from .prompts_planning import build_planning_prompt
|
|
@@ -43,6 +48,9 @@ __all__ = [
|
|
|
43
48
|
# Base classes
|
|
44
49
|
"PromptSection",
|
|
45
50
|
"PromptBuilder",
|
|
51
|
+
# Coding Style
|
|
52
|
+
"build_coding_style_prompt",
|
|
53
|
+
"extract_coding_style",
|
|
46
54
|
# Planning
|
|
47
55
|
"build_planning_prompt",
|
|
48
56
|
"build_plan_update_prompt",
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"""Coding Style Generation Prompt for Claude Task Master.
|
|
2
|
+
|
|
3
|
+
This module contains the prompt for generating a concise coding style guide
|
|
4
|
+
by analyzing CLAUDE.md and convention files. The generated guide captures:
|
|
5
|
+
- Coding workflow (TDD, development process)
|
|
6
|
+
- Code style conventions (naming, formatting)
|
|
7
|
+
- Project-specific requirements
|
|
8
|
+
|
|
9
|
+
The guide is saved to coding-style.md and injected into planning and work
|
|
10
|
+
prompts to save tokens while ensuring consistent code quality.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from .prompts_base import PromptBuilder
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def build_coding_style_prompt() -> str:
|
|
19
|
+
"""Build the prompt for generating a coding style guide.
|
|
20
|
+
|
|
21
|
+
This prompt instructs Claude to analyze CLAUDE.md and convention files
|
|
22
|
+
to create a concise coding style guide that captures the project's
|
|
23
|
+
workflow (TDD, development process) and code conventions.
|
|
24
|
+
|
|
25
|
+
Returns:
|
|
26
|
+
Complete coding style generation prompt.
|
|
27
|
+
"""
|
|
28
|
+
builder = PromptBuilder(
|
|
29
|
+
intro="""You are analyzing a codebase to extract its coding workflow and style guide.
|
|
30
|
+
|
|
31
|
+
Your mission: **Create a CONCISE coding guide (under 600 words).**
|
|
32
|
+
|
|
33
|
+
Focus on extracting:
|
|
34
|
+
1. **Development workflow** (TDD, test-first, iteration patterns)
|
|
35
|
+
2. **Code conventions** (naming, formatting, imports)
|
|
36
|
+
3. **Project-specific requirements** (from CLAUDE.md)
|
|
37
|
+
|
|
38
|
+
This guide will be injected into every coding task, so keep it SHORT and ACTIONABLE.
|
|
39
|
+
|
|
40
|
+
## TOOL RESTRICTIONS (MANDATORY)
|
|
41
|
+
|
|
42
|
+
**ALLOWED TOOLS (use ONLY these):**
|
|
43
|
+
- `Read` - Read files to understand patterns
|
|
44
|
+
- `Glob` - Find files by pattern
|
|
45
|
+
- `Grep` - Search for code patterns
|
|
46
|
+
- `Bash` - Run commands (check configs, linters, etc.)
|
|
47
|
+
|
|
48
|
+
**FORBIDDEN TOOLS (NEVER use):**
|
|
49
|
+
- `Write` - Do NOT write any files
|
|
50
|
+
- `Edit` - Do NOT edit any files
|
|
51
|
+
- `Task` - Do NOT launch any agents"""
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
builder.add_section(
|
|
55
|
+
"Step 1: Read CLAUDE.md (PRIORITY)",
|
|
56
|
+
"""**Start by reading `CLAUDE.md` at the repository root.**
|
|
57
|
+
|
|
58
|
+
This file contains the project's coding requirements and workflow instructions.
|
|
59
|
+
Extract:
|
|
60
|
+
- Development workflow (TDD, test-driven, iteration patterns)
|
|
61
|
+
- Code quality requirements
|
|
62
|
+
- Testing approach (test first? mock patterns?)
|
|
63
|
+
- Any specific coding rules or constraints
|
|
64
|
+
|
|
65
|
+
Also check these if CLAUDE.md doesn't exist:
|
|
66
|
+
- `.claude/instructions.md`
|
|
67
|
+
- `CONTRIBUTING.md`
|
|
68
|
+
- `.cursorrules`, `.github/copilot-instructions.md`""",
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
builder.add_section(
|
|
72
|
+
"Step 2: Check Configs",
|
|
73
|
+
"""Quickly scan linter/formatter configs for conventions:
|
|
74
|
+
|
|
75
|
+
- Python: `pyproject.toml` [tool.ruff], `ruff.toml`
|
|
76
|
+
- JS/TS: `.eslintrc`, `.prettierrc`, `biome.json`
|
|
77
|
+
- General: `.editorconfig`
|
|
78
|
+
|
|
79
|
+
Note line length, quote style, import ordering rules.""",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
builder.add_section(
|
|
83
|
+
"Step 3: Generate Coding Guide",
|
|
84
|
+
"""Create a CONCISE guide with these sections (skip if not applicable):
|
|
85
|
+
|
|
86
|
+
```markdown
|
|
87
|
+
# Coding Style
|
|
88
|
+
|
|
89
|
+
## Workflow
|
|
90
|
+
- [TDD approach? Test-first? Iteration pattern?]
|
|
91
|
+
- [Required checks before commit: tests, lint, types?]
|
|
92
|
+
|
|
93
|
+
## Code Style
|
|
94
|
+
- [Naming: snake_case, camelCase, etc.]
|
|
95
|
+
- [Formatting: line length, quotes, indentation]
|
|
96
|
+
- [Imports: ordering, grouping]
|
|
97
|
+
|
|
98
|
+
## Types
|
|
99
|
+
- [Type annotations required? Strictness level?]
|
|
100
|
+
|
|
101
|
+
## Testing
|
|
102
|
+
- [Test file naming, location]
|
|
103
|
+
- [Assertion style, mock patterns]
|
|
104
|
+
- [Coverage requirements?]
|
|
105
|
+
|
|
106
|
+
## Error Handling
|
|
107
|
+
- [Exception patterns, logging approach]
|
|
108
|
+
|
|
109
|
+
## Project-Specific
|
|
110
|
+
- [Any unique requirements from CLAUDE.md]
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Rules:**
|
|
114
|
+
- Each section: 2-4 bullet points MAX
|
|
115
|
+
- Be SPECIFIC and ACTIONABLE: "Run `pytest` before commit" not "Test your code"
|
|
116
|
+
- Capture the WORKFLOW, not just style
|
|
117
|
+
- Include actual commands where relevant
|
|
118
|
+
- Total guide: under 600 words""",
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
builder.add_section(
|
|
122
|
+
"Output Format",
|
|
123
|
+
"""Output ONLY the coding guide in markdown format.
|
|
124
|
+
|
|
125
|
+
Start with `# Coding Style` and include only relevant sections.
|
|
126
|
+
|
|
127
|
+
Do NOT include explanations or meta-commentary - just the guide itself.
|
|
128
|
+
|
|
129
|
+
End with:
|
|
130
|
+
```
|
|
131
|
+
CODING_STYLE_COMPLETE
|
|
132
|
+
```""",
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
return builder.build()
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def extract_coding_style(result: str) -> str:
|
|
139
|
+
"""Extract the coding style guide from the generation result.
|
|
140
|
+
|
|
141
|
+
Args:
|
|
142
|
+
result: The raw output from the coding style generation.
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
The extracted coding style guide content.
|
|
146
|
+
"""
|
|
147
|
+
# Remove the completion marker if present
|
|
148
|
+
content = result.replace("CODING_STYLE_COMPLETE", "").strip()
|
|
149
|
+
|
|
150
|
+
# If it starts with markdown header, return as-is
|
|
151
|
+
if content.startswith("# Coding Style") or content.startswith("# coding style"):
|
|
152
|
+
return content
|
|
153
|
+
|
|
154
|
+
# Try to find the coding style section
|
|
155
|
+
if "# Coding Style" in content:
|
|
156
|
+
idx = content.index("# Coding Style")
|
|
157
|
+
return content[idx:].strip()
|
|
158
|
+
|
|
159
|
+
# Fallback: wrap the content
|
|
160
|
+
return f"# Coding Style\n\n{content}"
|
|
@@ -9,12 +9,15 @@ from __future__ import annotations
|
|
|
9
9
|
from .prompts_base import PromptBuilder
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
def build_planning_prompt(
|
|
12
|
+
def build_planning_prompt(
|
|
13
|
+
goal: str, context: str | None = None, coding_style: str | None = None
|
|
14
|
+
) -> str:
|
|
13
15
|
"""Build the planning phase prompt.
|
|
14
16
|
|
|
15
17
|
Args:
|
|
16
18
|
goal: The user's goal to achieve.
|
|
17
19
|
context: Optional accumulated context from previous sessions.
|
|
20
|
+
coding_style: Optional coding style guide to inject.
|
|
18
21
|
|
|
19
22
|
Returns:
|
|
20
23
|
Complete planning prompt.
|
|
@@ -65,16 +68,37 @@ You just need to OUTPUT the plan as TEXT in your response.
|
|
|
65
68
|
if context:
|
|
66
69
|
builder.add_section("Previous Context", context.strip())
|
|
67
70
|
|
|
71
|
+
# Coding style section if available (generated from codebase analysis)
|
|
72
|
+
if coding_style:
|
|
73
|
+
builder.add_section(
|
|
74
|
+
"Project Coding Style",
|
|
75
|
+
f"""The following coding style guide was extracted from this codebase.
|
|
76
|
+
**Tasks you create MUST respect these conventions.**
|
|
77
|
+
|
|
78
|
+
{coding_style.strip()}""",
|
|
79
|
+
)
|
|
80
|
+
|
|
68
81
|
# Exploration phase - READ ONLY
|
|
69
82
|
builder.add_section(
|
|
70
83
|
"Step 1: Explore Codebase (READ ONLY)",
|
|
71
84
|
"""Thoroughly analyze the codebase using READ-ONLY operations:
|
|
72
|
-
1. **Read** key files (README, configs, main modules)
|
|
73
|
-
2. **Glob** to find patterns (`**/*.py`, `src/**/*.ts`)
|
|
74
|
-
3. **Grep** for specific code (class definitions, imports)
|
|
75
|
-
4. **Identify** tests, CI config, and coding standards
|
|
76
85
|
|
|
77
|
-
|
|
86
|
+
**CRITICAL: Read Project Conventions FIRST**
|
|
87
|
+
1. **Read `CLAUDE.md`** (if exists) - Contains coding requirements, project instructions,
|
|
88
|
+
and conventions that MUST be followed. This file defines how code should be written.
|
|
89
|
+
2. Also check: `.claude/instructions.md`, `CONTRIBUTING.md`, `.cursorrules`, `.github/copilot-instructions.md`
|
|
90
|
+
|
|
91
|
+
**Then explore the codebase:**
|
|
92
|
+
3. **Read** key files (README, configs, main modules)
|
|
93
|
+
4. **Glob** to find patterns (`**/*.py`, `src/**/*.ts`)
|
|
94
|
+
5. **Grep** for specific code (class definitions, imports)
|
|
95
|
+
6. **Identify** tests, CI config, and existing code patterns
|
|
96
|
+
|
|
97
|
+
**Remember:** Any coding requirements found in `CLAUDE.md` or similar convention files
|
|
98
|
+
MUST be respected when creating tasks. Include relevant requirements in task descriptions
|
|
99
|
+
so the working phase follows project standards.
|
|
100
|
+
|
|
101
|
+
Understand the architecture AND coding standards before creating tasks.""",
|
|
78
102
|
)
|
|
79
103
|
|
|
80
104
|
# Task creation phase - organized by PR
|
|
@@ -18,6 +18,7 @@ def build_work_prompt(
|
|
|
18
18
|
create_pr: bool = True,
|
|
19
19
|
pr_group_info: dict | None = None,
|
|
20
20
|
target_branch: str = "main",
|
|
21
|
+
coding_style: str | None = None,
|
|
21
22
|
) -> str:
|
|
22
23
|
"""Build the work session prompt.
|
|
23
24
|
|
|
@@ -33,6 +34,7 @@ def build_work_prompt(
|
|
|
33
34
|
- completed_tasks: List of completed task descriptions in this group
|
|
34
35
|
- remaining_tasks: Number of tasks remaining after current
|
|
35
36
|
target_branch: The target branch for rebasing (default: "main").
|
|
37
|
+
coding_style: Optional coding style guide to follow.
|
|
36
38
|
|
|
37
39
|
Returns:
|
|
38
40
|
Complete work session prompt.
|
|
@@ -86,6 +88,15 @@ def build_work_prompt(
|
|
|
86
88
|
if context:
|
|
87
89
|
builder.add_section("Context", context.strip())
|
|
88
90
|
|
|
91
|
+
# Coding style section - concise guide to follow
|
|
92
|
+
if coding_style:
|
|
93
|
+
builder.add_section(
|
|
94
|
+
"Coding Style (MUST FOLLOW)",
|
|
95
|
+
f"""Follow these project conventions:
|
|
96
|
+
|
|
97
|
+
{coding_style.strip()}""",
|
|
98
|
+
)
|
|
99
|
+
|
|
89
100
|
# File hints
|
|
90
101
|
if file_hints:
|
|
91
102
|
files_list = "\n".join(f"- `{f}`" for f in file_hints[:10]) # Limit to 10
|
|
@@ -194,12 +205,18 @@ git status
|
|
|
194
205
|
- Check existing patterns
|
|
195
206
|
- Identify tests to run
|
|
196
207
|
|
|
197
|
-
**3.
|
|
208
|
+
**3. Read project conventions FIRST**
|
|
209
|
+
- Check for `CLAUDE.md` at the repository root - it contains coding requirements
|
|
210
|
+
- Also check: `.claude/instructions.md`, `CONTRIBUTING.md`, `.cursorrules`
|
|
211
|
+
- These files define project-specific coding standards you MUST follow
|
|
212
|
+
|
|
213
|
+
**4. Make changes**
|
|
198
214
|
- Edit existing files, Write new files
|
|
199
|
-
- Follow project coding style
|
|
215
|
+
- Follow project coding style from `CLAUDE.md` and conventions files
|
|
200
216
|
- Stay focused on current task
|
|
217
|
+
- Match existing patterns and code style in the codebase
|
|
201
218
|
|
|
202
|
-
**
|
|
219
|
+
**5. Verify work**
|
|
203
220
|
```bash
|
|
204
221
|
# Common verification commands
|
|
205
222
|
pytest # Python tests
|
|
@@ -208,7 +225,7 @@ ruff check . && mypy . # Python lint/types
|
|
|
208
225
|
eslint . && tsc # JS lint/types
|
|
209
226
|
```
|
|
210
227
|
|
|
211
|
-
**
|
|
228
|
+
**6. Commit properly**
|
|
212
229
|
```bash
|
|
213
230
|
git add -A && git commit -m "$(cat <<'EOF'
|
|
214
231
|
type: Brief description (50 chars)
|
|
@@ -224,7 +241,7 @@ EOF
|
|
|
224
241
|
**Note:** The `.claude-task-master/` directory is automatically gitignored - it contains
|
|
225
242
|
orchestrator state files that should never be committed.
|
|
226
243
|
|
|
227
|
-
**
|
|
244
|
+
**7. Rebase onto {target_branch} BEFORE pushing** (CRITICAL!)
|
|
228
245
|
```bash
|
|
229
246
|
git fetch origin {target_branch}
|
|
230
247
|
git rebase origin/{target_branch}
|
|
@@ -249,7 +266,7 @@ while you were working. You MUST rebase before pushing.
|
|
|
249
266
|
- **Package versions**: Usually take the newer version from {target_branch}
|
|
250
267
|
- **Config files**: Merge both sets of changes carefully
|
|
251
268
|
|
|
252
|
-
**
|
|
269
|
+
**8. Push and Create PR** (REQUIRED - DO NOT SKIP!)
|
|
253
270
|
```bash
|
|
254
271
|
git push -u origin HEAD
|
|
255
272
|
gh pr create --title "type: description" --body "..." --label "claudetm"
|
|
@@ -269,7 +286,7 @@ If label doesn't exist, create it and retry.
|
|
|
269
286
|
|
|
270
287
|
**The orchestrator handles CI/reviews/merge automatically.**
|
|
271
288
|
|
|
272
|
-
**
|
|
289
|
+
**9. Log File Best Practices**
|
|
273
290
|
- For log/progress files, use APPEND mode (don't read entire file)
|
|
274
291
|
- Example: `echo "message" >> progress.md` instead of Read + Write
|
|
275
292
|
- This avoids context bloat from reading large log files"""
|
|
@@ -290,12 +307,18 @@ git status
|
|
|
290
307
|
- Check existing patterns
|
|
291
308
|
- Identify tests to run
|
|
292
309
|
|
|
293
|
-
**3.
|
|
310
|
+
**3. Read project conventions FIRST**
|
|
311
|
+
- Check for `CLAUDE.md` at the repository root - it contains coding requirements
|
|
312
|
+
- Also check: `.claude/instructions.md`, `CONTRIBUTING.md`, `.cursorrules`
|
|
313
|
+
- These files define project-specific coding standards you MUST follow
|
|
314
|
+
|
|
315
|
+
**4. Make changes**
|
|
294
316
|
- Edit existing files, Write new files
|
|
295
|
-
- Follow project coding style
|
|
317
|
+
- Follow project coding style from `CLAUDE.md` and conventions files
|
|
296
318
|
- Stay focused on current task
|
|
319
|
+
- Match existing patterns and code style in the codebase
|
|
297
320
|
|
|
298
|
-
**
|
|
321
|
+
**5. Verify work**
|
|
299
322
|
```bash
|
|
300
323
|
# Common verification commands
|
|
301
324
|
pytest # Python tests
|
|
@@ -304,7 +327,7 @@ ruff check . && mypy . # Python lint/types
|
|
|
304
327
|
eslint . && tsc # JS lint/types
|
|
305
328
|
```
|
|
306
329
|
|
|
307
|
-
**
|
|
330
|
+
**6. Commit properly**
|
|
308
331
|
```bash
|
|
309
332
|
git add -A && git commit -m "$(cat <<'EOF'
|
|
310
333
|
type: Brief description (50 chars)
|
|
@@ -320,13 +343,13 @@ EOF
|
|
|
320
343
|
**Note:** The `.claude-task-master/` directory is automatically gitignored - it contains
|
|
321
344
|
orchestrator state files that should never be committed.
|
|
322
345
|
|
|
323
|
-
**
|
|
346
|
+
**7. DO NOT create PR yet**
|
|
324
347
|
|
|
325
348
|
⚠️ **More tasks remain in this PR group. Just commit, do NOT push or create PR.**
|
|
326
349
|
|
|
327
350
|
The orchestrator will tell you when to create the PR (after all tasks in this group are done).
|
|
328
351
|
|
|
329
|
-
**
|
|
352
|
+
**8. Log File Best Practices**
|
|
330
353
|
- For log/progress files, use APPEND mode (don't read entire file)
|
|
331
354
|
- Example: `echo "message" >> progress.md` instead of Read + Write
|
|
332
355
|
- This avoids context bloat from reading large log files"""
|
|
@@ -121,7 +121,11 @@ class BackupRecoveryMixin:
|
|
|
121
121
|
return self._create_backup(self.state_file)
|
|
122
122
|
|
|
123
123
|
def cleanup_on_success(self, run_id: str) -> None:
|
|
124
|
-
"""Clean up all state files except logs on success.
|
|
124
|
+
"""Clean up all state files except logs and coding-style.md on success.
|
|
125
|
+
|
|
126
|
+
Preserves:
|
|
127
|
+
- logs/ directory (keeps last 10 log files)
|
|
128
|
+
- coding-style.md (reusable across runs to save tokens)
|
|
125
129
|
|
|
126
130
|
Args:
|
|
127
131
|
run_id: The run ID (used for identifying which log file belongs to this run).
|
|
@@ -129,10 +133,14 @@ class BackupRecoveryMixin:
|
|
|
129
133
|
# Release session lock first
|
|
130
134
|
self.release_session_lock()
|
|
131
135
|
|
|
132
|
-
#
|
|
136
|
+
# Files to preserve (besides logs/ directory)
|
|
137
|
+
preserved_files = {"coding-style.md"}
|
|
138
|
+
|
|
139
|
+
# Delete all files in state directory except preserved ones and logs/
|
|
133
140
|
for item in self.state_dir.iterdir():
|
|
134
141
|
if item.is_file():
|
|
135
|
-
item.
|
|
142
|
+
if item.name not in preserved_files:
|
|
143
|
+
item.unlink()
|
|
136
144
|
elif item.is_dir() and item != self.logs_dir:
|
|
137
145
|
shutil.rmtree(item)
|
|
138
146
|
|
|
@@ -126,6 +126,26 @@ class FileOperationsMixin:
|
|
|
126
126
|
return context_file.read_text()
|
|
127
127
|
return ""
|
|
128
128
|
|
|
129
|
+
def save_coding_style(self, coding_style: str) -> None:
|
|
130
|
+
"""Save coding style guide to coding-style.md.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
coding_style: The coding style guide content.
|
|
134
|
+
"""
|
|
135
|
+
coding_style_file = self.state_dir / "coding-style.md"
|
|
136
|
+
coding_style_file.write_text(coding_style)
|
|
137
|
+
|
|
138
|
+
def load_coding_style(self) -> str | None:
|
|
139
|
+
"""Load coding style guide from coding-style.md.
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
The coding style guide content, or None if not found.
|
|
143
|
+
"""
|
|
144
|
+
coding_style_file = self.state_dir / "coding-style.md"
|
|
145
|
+
if coding_style_file.exists():
|
|
146
|
+
return coding_style_file.read_text()
|
|
147
|
+
return None
|
|
148
|
+
|
|
129
149
|
def _parse_plan_tasks(self, plan: str) -> list[str]:
|
|
130
150
|
"""Parse tasks from plan markdown.
|
|
131
151
|
|
|
@@ -324,6 +324,13 @@ Please complete this task."""
|
|
|
324
324
|
# Set task context for Claude prefix display [claude HH:MM:SS N/M]
|
|
325
325
|
set_task_context(state.current_task_index + 1, len(tasks))
|
|
326
326
|
|
|
327
|
+
# Load coding style guide for token-efficient style injection
|
|
328
|
+
try:
|
|
329
|
+
coding_style = self.state_manager.load_coding_style()
|
|
330
|
+
except Exception as e:
|
|
331
|
+
console.warning(f"Could not load coding style: {e}")
|
|
332
|
+
coding_style = None
|
|
333
|
+
|
|
327
334
|
# Run work session with model routing based on task complexity
|
|
328
335
|
try:
|
|
329
336
|
# Convert string model name to ModelType enum
|
|
@@ -339,6 +346,7 @@ Please complete this task."""
|
|
|
339
346
|
create_pr=should_create_pr,
|
|
340
347
|
pr_group_info=pr_group_info,
|
|
341
348
|
target_branch=target_branch,
|
|
349
|
+
coding_style=coding_style,
|
|
342
350
|
)
|
|
343
351
|
except AgentError:
|
|
344
352
|
if self.logger:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
claude_task_master/__init__.py,sha256=
|
|
1
|
+
claude_task_master/__init__.py,sha256=JAKhI_GFk5m5HASlCbJF5c_zSYuMV_GZYjOLrzWU-Lo,187
|
|
2
2
|
claude_task_master/cli.py,sha256=b2nowi18sFSX8pLZiFKjQqDp7cvRWRnNayN96n-d770,6238
|
|
3
3
|
claude_task_master/server.py,sha256=a39yqwj2gZWpAPOzU9E3yj8ds7wmSqevOyiI7QHu_EQ,15791
|
|
4
4
|
claude_task_master/wrapper.py,sha256=NQywkv06-4jkBz4lFPkQvDrr8TEMgyAqYWEnQI2fgck,6001
|
|
@@ -25,11 +25,11 @@ claude_task_master/cli_commands/info.py,sha256=jmzslLMiVk3ZyGBsVxNSfoe1qLJsuCG9Z
|
|
|
25
25
|
claude_task_master/cli_commands/mailbox.py,sha256=SJzZxzxpkIv4cwXA-8gaVzqTJuqh1rwxQ4TeL-VmDE4,9291
|
|
26
26
|
claude_task_master/cli_commands/workflow.py,sha256=_ITtxFoH6JWd8vPPjdKXjmRj3RiOay3kUEwSZl7rJhA,16980
|
|
27
27
|
claude_task_master/core/__init__.py,sha256=nmwC07VqpbuogTYbXTYhb0KJifwsrF922FepWEHnpyc,8945
|
|
28
|
-
claude_task_master/core/agent.py,sha256=
|
|
28
|
+
claude_task_master/core/agent.py,sha256=fRx7NzOZMsqfRFcue5Tvlq8nvkyiv5i_vP06J_awC2I,11931
|
|
29
29
|
claude_task_master/core/agent_exceptions.py,sha256=TjPlGXQhGjWof1kENyRmBowRNRay4SXL0YCH_VYsq4g,6354
|
|
30
30
|
claude_task_master/core/agent_message.py,sha256=-GYlZe0A8WCoEtuM4LHtymA4DEJLaHgpbQghpMl4i6g,6860
|
|
31
31
|
claude_task_master/core/agent_models.py,sha256=06kTenpOHKDFt8tOqa9h5-4fvjkwNxm2MDC3FzbbmoQ,6551
|
|
32
|
-
claude_task_master/core/agent_phases.py,sha256=
|
|
32
|
+
claude_task_master/core/agent_phases.py,sha256=QVhPu9RJGYceoOb1yJyXsUJSNBYjLdFkJAaRHgZ6-ZM,13227
|
|
33
33
|
claude_task_master/core/agent_query.py,sha256=lu6-X3AdNC4t-THZf6Qc2lBIpwhmm7bhgWqezSbOOGY,17269
|
|
34
34
|
claude_task_master/core/checkpoint.py,sha256=qwW_Qj1yjNNuyBZEAj91bOGhn1yCsjqOccGn3XFIPRg,7142
|
|
35
35
|
claude_task_master/core/circuit_breaker.py,sha256=kXVgLDVy5_kie65frVPkrcPMmm6FWSHOqwfTe7Isebk,13545
|
|
@@ -43,29 +43,30 @@ claude_task_master/core/credentials.py,sha256=khav4RO-N5R7lG7E1VGdDztEgB1yOzYBJL
|
|
|
43
43
|
claude_task_master/core/hooks.py,sha256=ZQLsELwrCDgxmjRQfsNO8e3Tswpig-8yWZjEAjbpT98,14304
|
|
44
44
|
claude_task_master/core/key_listener.py,sha256=d-TZvEkmhYudzLkJx6SWYFBMyJMYcscZ9k9vrAXMBU0,5434
|
|
45
45
|
claude_task_master/core/logger.py,sha256=87m45KxDH3UO8JG9TFZVsstd5bpFspNVG6L5gg8fgLc,8061
|
|
46
|
-
claude_task_master/core/orchestrator.py,sha256=
|
|
46
|
+
claude_task_master/core/orchestrator.py,sha256=pSL-Uw7klHxHgHMmpG1eTRPOeZLtvJoxxYtHHXwOibE,54313
|
|
47
47
|
claude_task_master/core/parallel.py,sha256=1eQWU4yVJCQktsK1sC98eMk42Y8OOneQXSeZ-G4psO8,14838
|
|
48
48
|
claude_task_master/core/plan_updater.py,sha256=hhLR3L9cPqDUAjxaVMPWDDwm6GFHe3xrDbAXFSFeRxA,6843
|
|
49
|
-
claude_task_master/core/planner.py,sha256=
|
|
49
|
+
claude_task_master/core/planner.py,sha256=wYHTO6oOBE9JMFumyciw0qqbc6nTutpEt5SVqQ3_SRU,2917
|
|
50
50
|
claude_task_master/core/pr_context.py,sha256=C1kxyona1LUTFcag-CHp86T-YJYTunPlJEAGllqBUTE,19534
|
|
51
51
|
claude_task_master/core/progress_tracker.py,sha256=nQS4LKjQcy0ptNJFH80nBAz_ygbVbgn73ItdBbe6tzk,12068
|
|
52
|
-
claude_task_master/core/prompts.py,sha256=
|
|
52
|
+
claude_task_master/core/prompts.py,sha256=WPPQQGYvUq_vF4muKuBuYoB8fq3hU1E6lZhDSB34-V8,2212
|
|
53
53
|
claude_task_master/core/prompts_base.py,sha256=pCJsHWq1hxoLC_f5c_GwaaXFdwIkyIseU9qmtZwVt3c,1981
|
|
54
|
+
claude_task_master/core/prompts_coding_style.py,sha256=kGmd8Sq0-nTnNLS8qrqSwxv3Adk6bRNZ0C1Uq1jGzpA,4756
|
|
54
55
|
claude_task_master/core/prompts_plan_update.py,sha256=Gvq1urZ3Cn6IMGDN6XQosKb0GjbLxKYeCVBbP-SREpY,4314
|
|
55
|
-
claude_task_master/core/prompts_planning.py,sha256=
|
|
56
|
+
claude_task_master/core/prompts_planning.py,sha256=BoA-ix8ZpXTjDFaSdxK3Nmjqq6SxPrdsN7oNuErQmJo,7275
|
|
56
57
|
claude_task_master/core/prompts_verification.py,sha256=h4fW8hF479BA0I43BWNLzDGHcGqn86Dh_xfXpSvmeEE,4624
|
|
57
|
-
claude_task_master/core/prompts_working.py,sha256=
|
|
58
|
+
claude_task_master/core/prompts_working.py,sha256=HsCmVJFnn71HAcbkSR4J8A5UOsMfL4jUB-SqCEPRma4,11449
|
|
58
59
|
claude_task_master/core/rate_limit.py,sha256=r_ztFybFHTP1UWJIW66OTqAUNJLffyCo7uPwrpFUO1c,4439
|
|
59
60
|
claude_task_master/core/shutdown.py,sha256=-WaP6FoAgvdBGOmu6AtEu9YWA4n0v8AP9Cm_39g_BW8,10194
|
|
60
61
|
claude_task_master/core/state.py,sha256=wCoFubgFyW5Lj1gqum7Kz_2_khynWv7lTxtw92NxCSk,24811
|
|
61
|
-
claude_task_master/core/state_backup.py,sha256=
|
|
62
|
+
claude_task_master/core/state_backup.py,sha256=OJnFotGNyCxzDBbfmtd8zo8VyEHVvsxGH_NRBNL0Ma8,5780
|
|
62
63
|
claude_task_master/core/state_exceptions.py,sha256=7nJ5-tBf-owTU68a07pkdUq-DnUV_D7DbNMuNSzsVLc,6691
|
|
63
|
-
claude_task_master/core/state_file_ops.py,sha256=
|
|
64
|
+
claude_task_master/core/state_file_ops.py,sha256=uQ4lRPzVWWD5VhXnZhDQacJyqefK0V_38uBpQiV7zaI,5035
|
|
64
65
|
claude_task_master/core/state_pr.py,sha256=R8pwmzP15yStFji_Epq1p8VcWdLN96aG8mAcndi5p1U,7926
|
|
65
66
|
claude_task_master/core/state_recovery.py,sha256=1kIOd_dnRF3ZbjNohTXDzanBsfAhrWcQUNzGdg3rN9o,3812
|
|
66
67
|
claude_task_master/core/subagents.py,sha256=-O4dsywG2-FWwB6kg20GwaVIuQ2DAWcrkJYIBvmVM1Q,6759
|
|
67
68
|
claude_task_master/core/task_group.py,sha256=NAxx7-MZ6JTpRjlQzgbiLGCkI8K52lIVEG3TtgeS0IY,9514
|
|
68
|
-
claude_task_master/core/task_runner.py,sha256=
|
|
69
|
+
claude_task_master/core/task_runner.py,sha256=vFXwgtv1hpAu0ApIGyBcD0FHCDP_waZcCv9DMVhpPpA,18534
|
|
69
70
|
claude_task_master/core/workflow_stages.py,sha256=a-tLyvud1W_2PM76IRUXEHkp0dLuKZhK0ACp3eJGFKs,35319
|
|
70
71
|
claude_task_master/github/__init__.py,sha256=N3qXxFc8jL9cjDaHZCGc_hGhc4GEfUqktsDq6569790,892
|
|
71
72
|
claude_task_master/github/client.py,sha256=LFRsurhRAyMXzbkYOvVOcnllzHKrKFhLBEPTOjL4JkI,8625
|
|
@@ -88,8 +89,8 @@ claude_task_master/webhooks/__init__.py,sha256=bJfQBkSRZCOaVNnOg7PlG-FbwJV4YsySD
|
|
|
88
89
|
claude_task_master/webhooks/client.py,sha256=DEz3vrNmuTBPp2t_rK515zRRKJAzFxxL8B9iCbXRuEU,24589
|
|
89
90
|
claude_task_master/webhooks/config.py,sha256=cufVrl94zSSubpoNFWVYp5ht2Okf_K_8UAQfFsaaOIE,19230
|
|
90
91
|
claude_task_master/webhooks/events.py,sha256=dbzOEdrum_joa4AUizVKxyPQW6q3TVAXDft5kxlr8O8,32140
|
|
91
|
-
claude_task_master-0.1.
|
|
92
|
-
claude_task_master-0.1.
|
|
93
|
-
claude_task_master-0.1.
|
|
94
|
-
claude_task_master-0.1.
|
|
95
|
-
claude_task_master-0.1.
|
|
92
|
+
claude_task_master-0.1.8.dist-info/METADATA,sha256=w6ZU44zJZ6uVA5ZNYeOT2rXbLd3PSj9wWhZkGQ9_MBI,29580
|
|
93
|
+
claude_task_master-0.1.8.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
|
|
94
|
+
claude_task_master-0.1.8.dist-info/entry_points.txt,sha256=vpjSBkvZSSZ1WmmNSbiszyiiy-fAvtmmaOTOyLnufqM,251
|
|
95
|
+
claude_task_master-0.1.8.dist-info/top_level.txt,sha256=Axj8q87a_7qo5JyjdIFe9ebs4BFOnuDt_gdxHqSDwqc,19
|
|
96
|
+
claude_task_master-0.1.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|