5ae3f87251
CI / push-validation (push) Successful in 20s
CI / helm (push) Successful in 23s
CI / quality (push) Successful in 2m21s
CI / typecheck (push) Successful in 2m44s
CI / e2e_tests (push) Successful in 3m12s
CI / integration_tests (push) Successful in 3m58s
CI / build (push) Successful in 3m16s
CI / unit_tests (push) Successful in 4m52s
CI / lint (push) Successful in 5m11s
CI / security (push) Successful in 5m54s
CI / benchmark-regression (push) Has been skipped
CI / docker (push) Successful in 1m32s
CI / coverage (push) Successful in 10m26s
CI / status-check (push) Successful in 1s
CI / benchmark-publish (push) Successful in 1h13m35s
- Fixed issue where agents were adding future cycle comments to old tracking issues - Updated 12 agent definitions to use automation-tracking-manager subagent - Removed custom tracking functions from all agents - Ensures one tracking issue per cycle with proper cleanup - Added helper scripts for tracking system updates - Created comprehensive update summary documentation This prevents agents from incorrectly reporting multiple cycles on the same tracking issue and ensures consistent tracking behavior across all agents.
211 lines
7.0 KiB
Python
Executable File
211 lines
7.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Script to update agents to use automation-tracking-manager
|
|
"""
|
|
|
|
import re
|
|
import os
|
|
|
|
# Agent configurations
|
|
agents = {
|
|
"architecture-guard.md": {
|
|
"prefix": "AUTO-GUARD",
|
|
"tracking_type": "Code Analysis Report",
|
|
"cleanup_func": "cleanup_previous_guard_tracking",
|
|
"create_func": "create_guard_tracking_issue",
|
|
},
|
|
"bug-hunter.md": {
|
|
"prefix": "AUTO-BUG-POOL",
|
|
"tracking_type": "Bug Detection Report",
|
|
"cleanup_func": "cleanup_previous_bug_hunter_tracking",
|
|
"create_func": "create_bug_hunter_tracking_issue",
|
|
},
|
|
"docs-writer.md": {
|
|
"prefix": "AUTO-DOCS",
|
|
"tracking_type": "Documentation Report",
|
|
"cleanup_func": "cleanup_previous_docs_tracking",
|
|
"create_func": "create_docs_tracking_issue",
|
|
},
|
|
"epic-planner.md": {
|
|
"prefix": "AUTO-EPIC",
|
|
"tracking_type": "Epic Planning Update",
|
|
"cleanup_func": "cleanup_previous_epic_planner_tracking",
|
|
"create_func": "create_epic_planner_tracking_issue",
|
|
},
|
|
"human-liaison.md": {
|
|
"prefix": "AUTO-LIAISON",
|
|
"tracking_type": "Human Activity Report",
|
|
"cleanup_func": "cleanup_previous_liaison_tracking",
|
|
"create_func": "create_liaison_tracking_issue",
|
|
},
|
|
"spec-updater.md": {
|
|
"prefix": "AUTO-SPEC",
|
|
"tracking_type": "Specification Update",
|
|
"cleanup_func": "cleanup_previous_spec_tracking",
|
|
"create_func": "create_spec_tracking_issue",
|
|
},
|
|
"test-infra-improver.md": {
|
|
"prefix": "AUTO-INF-POOL",
|
|
"tracking_type": "Infrastructure Analysis",
|
|
"cleanup_func": "cleanup_previous_infra_tracking",
|
|
"create_func": "create_infra_tracking_issue",
|
|
},
|
|
}
|
|
|
|
|
|
def update_agent_file(filepath, config):
|
|
"""Update a single agent file"""
|
|
print(f"\nProcessing {filepath}...")
|
|
|
|
with open(filepath, "r") as f:
|
|
content = f.read()
|
|
|
|
# Find the automation tracking section
|
|
tracking_start = content.find("## Automation Tracking System")
|
|
if tracking_start == -1:
|
|
print(
|
|
f" WARNING: Could not find '## Automation Tracking System' in {filepath}"
|
|
)
|
|
return False
|
|
|
|
# Find the next section (usually starts with ##)
|
|
next_section = content.find("\n## ", tracking_start + 1)
|
|
if next_section == -1:
|
|
next_section = content.find("\n---", tracking_start + 1)
|
|
|
|
if next_section == -1:
|
|
print(f" WARNING: Could not find end of tracking section in {filepath}")
|
|
return False
|
|
|
|
# Extract the old tracking section
|
|
old_section = content[tracking_start:next_section]
|
|
|
|
# Create the new tracking section
|
|
new_section = f"""## Automation Tracking System
|
|
|
|
**Updated**: This agent uses the centralized automation-tracking-manager subagent for all tracking operations.
|
|
|
|
### Tracking Issue Format
|
|
- **Health Reports**: `[{config["prefix"]}] {config["tracking_type"]} (Cycle N)`
|
|
- **Announcements**: `[{config["prefix"]}] Announce: <message summary>`
|
|
- **Labels**: "Automation Tracking" + any relevant priority labels
|
|
|
|
### Tracking Operations
|
|
|
|
All tracking operations are now handled by the automation-tracking-manager subagent:
|
|
|
|
```bash
|
|
# Create a new tracking issue (closes previous automatically)
|
|
task automation-tracking-manager "CREATE_TRACKING_ISSUE" \\
|
|
--agent-prefix "{config["prefix"]}" \\
|
|
--tracking-type "{config["tracking_type"]}" \\
|
|
--body "$tracking_body" \\
|
|
--repo-owner "$owner" \\
|
|
--repo-name "$repo"
|
|
|
|
# Update current tracking issue with a comment
|
|
task automation-tracking-manager "UPDATE_TRACKING_ISSUE" \\
|
|
--agent-prefix "{config["prefix"]}" \\
|
|
--tracking-type "{config["tracking_type"]}" \\
|
|
--comment "$update_comment" \\
|
|
--repo-owner "$owner" \\
|
|
--repo-name "$repo"
|
|
|
|
# Get the next cycle number
|
|
next_cycle=$(task automation-tracking-manager "GET_NEXT_CYCLE_NUMBER" \\
|
|
--agent-prefix "{config["prefix"]}" \\
|
|
--tracking-type "{config["tracking_type"]}" \\
|
|
--repo-owner "$owner" \\
|
|
--repo-name "$repo")
|
|
|
|
# Read tracking state from latest issue
|
|
tracking_state=$(task automation-tracking-manager "READ_TRACKING_STATE" \\
|
|
--agent-prefix "{config["prefix"]}" \\
|
|
--tracking-type "{config["tracking_type"]}" \\
|
|
--repo-owner "$owner" \\
|
|
--repo-name "$repo")
|
|
```"""
|
|
|
|
# Check if there are announcement functions to preserve
|
|
if "create_.*_announcement_issue" in old_section:
|
|
# Extract announcement functions
|
|
announcement_match = re.search(
|
|
r"(# Create.*announcement.*?function create_.*_announcement_issue.*?}\n)",
|
|
old_section,
|
|
re.DOTALL,
|
|
)
|
|
if announcement_match:
|
|
new_section += (
|
|
"\n\n### Announcement Functions\n\n```bash\n"
|
|
+ announcement_match.group(1)
|
|
+ "```"
|
|
)
|
|
|
|
# Replace the old section with the new one
|
|
new_content = content[:tracking_start] + new_section + content[next_section:]
|
|
|
|
# Now update the cleanup function calls
|
|
new_content = new_content.replace(f" {config['cleanup_func']}\n", "")
|
|
|
|
# Update the create function calls
|
|
create_pattern = f" {config['create_func']} .*?$"
|
|
replacement = f""" # Use automation-tracking-manager to create tracking issue
|
|
result=$(task automation-tracking-manager "CREATE_TRACKING_ISSUE" \\
|
|
--agent-prefix "{config["prefix"]}" \\
|
|
--tracking-type "{config["tracking_type"]}" \\
|
|
--body "$tracking_body" \\
|
|
--repo-owner "$owner" \\
|
|
--repo-name "$repo")
|
|
|
|
# Extract issue number and cycle from result
|
|
issue_number=$(echo "$result" | grep "ISSUE_NUMBER=" | cut -d'=' -f2)
|
|
cycle_number=$(echo "$result" | grep "CYCLE_NUMBER=" | cut -d'=' -f2)
|
|
|
|
# Update cycle for next iteration
|
|
cycle=$cycle_number"""
|
|
|
|
new_content = re.sub(create_pattern, replacement, new_content, flags=re.MULTILINE)
|
|
|
|
# Update initial cycle setup
|
|
cycle_pattern = r"(```\n)(cycle = 0|cycle=0)\n"
|
|
cycle_replacement = f"""\\1# Get initial cycle number from tracking manager
|
|
cycle=$(task automation-tracking-manager "GET_NEXT_CYCLE_NUMBER" \\
|
|
--agent-prefix "{config["prefix"]}" \\
|
|
--tracking-type "{config["tracking_type"]}" \\
|
|
--repo-owner "$owner" \\
|
|
--repo-name "$repo")
|
|
|
|
# If this returns empty or 1, we're starting fresh
|
|
if [[ -z "$cycle" || "$cycle" == "1" ]]; then
|
|
cycle=1
|
|
else
|
|
# We're resuming, so use the cycle we got
|
|
cycle=$((cycle - 1)) # Will be incremented in loop
|
|
fi
|
|
"""
|
|
|
|
new_content = re.sub(cycle_pattern, cycle_replacement, new_content)
|
|
|
|
# Write the updated content
|
|
with open(filepath, "w") as f:
|
|
f.write(new_content)
|
|
|
|
print(f" ✓ Updated {filepath}")
|
|
return True
|
|
|
|
|
|
def main():
|
|
"""Main function"""
|
|
agents_dir = "/app/.opencode/agents"
|
|
|
|
for filename, config in agents.items():
|
|
filepath = os.path.join(agents_dir, filename)
|
|
if os.path.exists(filepath):
|
|
update_agent_file(filepath, config)
|
|
else:
|
|
print(f" ERROR: File not found: {filepath}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|