import os
import sys
import requests
import argparse
from typing import List
from dataclasses import dataclass
@dataclass
class Issue:
title: str
description: str
labels: List[str]
priority: str group: str
class GitHubIssueManager:
def __init__(self, token: str, username: str, repo: str, project_id: str = None):
self.token = token
self.username = username
self.repo = repo
self.project_id = project_id
self.base_url = "https://api.github.com"
self.headers = {
"Authorization": f"token {token}",
"Accept": "application/vnd.github+json",
"Content-Type": "application/json"
}
def create_issue(self, issue: Issue, dry_run: bool = False) -> bool:
body = f"""## 🎯 SOMA-CORE {issue.group}
**Description:**
{issue.description}
## 📋 Implementation Checklist
- [ ] Research and design phase
- [ ] Core implementation
- [ ] Integration with existing system
- [ ] Testing and validation
- [ ] Documentation update
- [ ] Performance benchmarks
## 🔗 Related
- Part of SOMA-CORE multi-agent editing system
- Priority: {issue.priority.upper()}
- Group: {issue.group}
## 🏷️ Labels
{', '.join(issue.labels)}
---
*Auto-generated by SOMA-CORE systematic issue creation*"""
if dry_run:
print(f"[DRY RUN] Would create issue: {issue.title}")
print(f" Labels: {', '.join(issue.labels)}")
print(f" Priority: {issue.priority}")
print(f" Group: {issue.group}")
return True
data = {
"title": issue.title,
"body": body,
"labels": issue.labels
}
try:
response = requests.post(
f"{self.base_url}/repos/{self.username}/{self.repo}/issues",
headers=self.headers,
json=data
)
if response.status_code == 201:
issue_data = response.json()
print(f"✅ Created issue #{issue_data['number']}: {issue.title}")
if self.project_id:
self.add_to_project(issue_data['node_id'], issue.title)
return True
else:
print(f"❌ Failed to create issue: {issue.title}")
print(f" Error: {response.text}")
return False
except Exception as e:
print(f"❌ Error creating issue {issue.title}: {str(e)}")
return False
def add_to_project(self, node_id: str, title: str):
query = """
mutation($projectId: ID!, $contentId: ID!) {
addProjectV2ItemById(input: {
projectId: $projectId,
contentId: $contentId
}) {
item { id }
}
}
"""
variables = {
"projectId": self.project_id,
"contentId": node_id
}
try:
response = requests.post(
"https://api.github.com/graphql",
headers={
"Authorization": f"bearer {self.token}",
"Content-Type": "application/json"
},
json={"query": query, "variables": variables}
)
if response.status_code == 200:
result = response.json()
if "errors" not in result:
print(f"📊 Added to project: {title}")
else:
print(f"⚠️ Project add warning for {title}: {result['errors']}")
else:
print(f"⚠️ Failed to add {title} to project: {response.text}")
except Exception as e:
print(f"⚠️ Error adding {title} to project: {str(e)}")
def get_systematic_issues() -> List[Issue]:
issues = []
issues.extend([
Issue(
title="EditModificationInterface - Inline Edit Modification",
description="Allow users to modify proposed edits before applying with inline editor capabilities. Users should be able to tweak code suggestions, merge proposals from multiple agents, and split large edits into smaller chunks.",
labels=["soma++", "edit-control", "enhancement", "high-priority"],
priority="high",
group="Edit Control Enhancement"
),
Issue(
title="AdvancedPreviewSystem - Side-by-side Live Editor",
description="Implement side-by-side editor view with live editing, syntax highlighting and error checking. Include real-time validation of modified edits and preview of downstream effects on other files.",
labels=["soma++", "preview", "enhancement", "high-priority"],
priority="high",
group="Edit Control Enhancement"
),
Issue(
title="GranularApprovalLevels - Multi-level Approval System",
description="Implement granular approval system with: approve with modifications, approve conditionally (with warnings), approve for review later, and queue for batch processing.",
labels=["soma++", "approval", "enhancement", "high-priority"],
priority="high",
group="Edit Control Enhancement"
),
Issue(
title="StagedApplicationSystem - Phased Edit Application",
description="Apply edits in groups/phases with testing between stages, rollback capabilities to any previous stage, and stable state bookmarking.",
labels=["soma++", "staging", "enhancement", "high-priority"],
priority="high",
group="Edit Control Enhancement"
)
])
issues.extend([
Issue(
title="EditClassificationSystem - Automated Edit Categorization",
description="Auto-categorize edits (critical, safe, cosmetic, experimental) with risk assessment scoring, impact analysis, and dependency tracking between edits.",
labels=["soma++", "classification", "enhancement", "medium-priority"],
priority="medium",
group="Classification System"
),
Issue(
title="GitIntegration - Branch-per-session Automation",
description="Create branches per edit session with automated backup strategies, CI/CD hooks, and code review integration.",
labels=["soma++", "git", "workflow", "medium-priority"],
priority="medium",
group="Workflow Integration"
),
Issue(
title="FileProtectionConstraints - File-level Protection Rules",
description="Mark files as read-only or critical with edit boundaries (only certain functions), require higher consensus for sensitive files, and custom validation rules per file type.",
labels=["soma++", "protection", "security", "medium-priority"],
priority="medium",
group="Edit Control Enhancement"
),
Issue(
title="EditHistoryTimeTravel - Complete Edit History Management",
description="Complete edit history with metadata, rollback to any point in history, branch and merge edit timelines, and compare different edit paths.",
labels=["soma++", "history", "enhancement", "medium-priority"],
priority="medium",
group="Workflow Integration"
)
])
issues.extend([
Issue(
title="IntrospectOperator - Recursive Self-diagnosis",
description="Implement operator for recursive self-diagnosis and phase awareness in multi-agent editing workflows. Should analyze reasoning paths and detect cognitive bottlenecks.",
labels=["soma++", "operator", "cognitive", "high-priority"],
priority="high",
group="Core SOMA Operators"
),
Issue(
title="ConsensusOperator - Multi-agent Agreement Resolver",
description="Multi-agent edit agreement resolver across operations with conflict resolution. Should find symbolic agreement across diverse agent proposals with configurable thresholds.",
labels=["soma++", "operator", "consensus", "high-priority"],
priority="high",
group="Core SOMA Operators"
),
Issue(
title="CognitiveLoadOperator - Complexity Estimation",
description="Estimates computational complexity of reasoning paths and edit proposal generation. Should provide dynamic estimation of symbolic processing requirements.",
labels=["soma++", "operator", "cognitive", "high-priority"],
priority="high",
group="Core SOMA Operators"
),
Issue(
title="AttentionFocusOperator - Context Prioritization",
description="Prioritizes high-salience context elements during ops execution and code analysis. Should weight context elements by semantic and temporal relevance.",
labels=["soma++", "operator", "attention", "high-priority"],
priority="high",
group="Core SOMA Operators"
)
])
issues.extend([
Issue(
title="ConditionalLogicSystem - Test-based Edit Application",
description="Apply edits only if tests pass with conditional chains (if X succeeds, then apply Y), performance benchmarking gates, and user-defined success criteria.",
labels=["soma++", "conditional", "testing", "medium-priority"],
priority="medium",
group="Workflow Integration"
),
Issue(
title="CustomAgentConfiguration - User-defined Agent Personalities",
description="User-defined agent personalities/focus with custom prompting and constraints, agent behavior modification based on project context, and personal agent training on user preferences.",
labels=["soma++", "agents", "customization", "medium-priority"],
priority="medium",
group="Agent Configuration"
),
Issue(
title="VisualReasoningOperator - Image-to-symbolic Conversion",
description="Converts image inputs into symbolic graph concepts for visual code understanding. Enable processing of diagrams, screenshots, and visual documentation for code editing.",
labels=["soma++", "operator", "visual", "medium-priority"],
priority="medium",
group="Core SOMA Operators"
),
Issue(
title="MetaReflectiveOperator - System Introspection",
description="Claude's signature operator for recursive system introspection and self-improvement. Should analyze the editing system's own performance and suggest improvements.",
labels=["soma++", "operator", "meta", "medium-priority"],
priority="medium",
group="Core SOMA Operators"
)
])
issues.extend([
Issue(
title="Performance Monitoring Dashboard",
description="Create comprehensive dashboard for edit metrics, success rates, agent performance, and system health monitoring.",
labels=["soma++", "monitoring", "dashboard", "low-priority"],
priority="low",
group="System Monitoring"
),
Issue(
title="Advanced CLI Interface - Multi-pane View",
description="Enhanced CLI with multi-pane view (file tree, edit list, preview, diff), keyboard shortcuts for rapid decision making, and undo/redo functionality.",
labels=["soma++", "cli", "ui", "low-priority"],
priority="low",
group="User Interface"
),
Issue(
title="GUI Prototype - Visual Edit Management",
description="Future GUI considerations: Visual diff editor with drag-and-drop, graph view of edit dependencies, real-time collaboration view, and dashboard for edit metrics.",
labels=["soma++", "gui", "prototype", "low-priority"],
priority="low",
group="User Interface"
)
])
return issues
def main():
parser = argparse.ArgumentParser(description="Systematically create GitHub issues for SOMA-CORE")
parser.add_argument("--dry-run", action="store_true", help="Preview issues without creating them")
parser.add_argument("--group", help="Only create issues for specific group")
parser.add_argument("--priority", help="Only create issues with specific priority (high/medium/low)")
args = parser.parse_args()
script_dir = os.path.dirname(os.path.abspath(__file__))
config_file = os.path.join(script_dir, "config.env")
if not os.path.exists(config_file):
print("❌ Config file not found. Run setup.sh first.")
sys.exit(1)
config = {}
with open(config_file, 'r') as f:
for line in f:
if line.strip() and not line.startswith('#'):
key, value = line.strip().split('=', 1)
config[key] = value.strip('"')
manager = GitHubIssueManager(
token=config['GITHUB_TOKEN'],
username=config['GITHUB_USERNAME'],
repo=config['GITHUB_REPO'],
project_id=config.get('GITHUB_PROJECT_ID')
)
all_issues = get_systematic_issues()
filtered_issues = all_issues
if args.group:
filtered_issues = [i for i in filtered_issues if i.group == args.group]
if args.priority:
filtered_issues = [i for i in filtered_issues if i.priority == args.priority]
print(f"🚀 SOMA-CORE Systematic Issue Creation")
print(f"=====================================")
print(f"Total issues: {len(filtered_issues)}")
if args.dry_run:
print("🔍 DRY RUN MODE - No issues will be created")
print()
groups = {}
for issue in filtered_issues:
key = f"{issue.group} ({issue.priority})"
if key not in groups:
groups[key] = []
groups[key].append(issue)
created = 0
failed = 0
for group_name, issues in groups.items():
print(f"\n📂 {group_name}")
print("=" * (len(group_name) + 4))
for issue in issues:
if manager.create_issue(issue, args.dry_run):
created += 1
else:
failed += 1
print(f"\n🎉 Summary")
print(f"=========")
print(f"✅ Created: {created}")
if failed > 0:
print(f"❌ Failed: {failed}")
if not args.dry_run:
print(f"\n🔗 View at: https://github.com/{config['GITHUB_USERNAME']}/{config['GITHUB_REPO']}/issues")
if config.get('GITHUB_PROJECT_ID'):
print(f"📊 Project: Check your GitHub projects page")
if __name__ == "__main__":
main()