Skip to main content

#!/usr/bin/env python3 """ H.1.4: Activate First 50 Critical Components

Batch activation script for critical CODITECT components. Prioritizes: all agents, all commands, all prompts, hook, and critical skills.

Usage: python3 scripts/activate-critical-components.py # Execute activation python3 scripts/activate-critical-components.py --dry-run # Preview only """

import sys import json from pathlib import Path from datetime import datetime, timezone from typing import List, Dict, Tuple

Critical components to activate (50 total)

CRITICAL_COMPONENTS: List[Tuple[str, str, str]] = [ # All 8 deactivated agents ("agent", "coditect-onboarding", "Critical - User onboarding workflow"), ("agent", "complexity-assessor", "Critical - Task complexity analysis"), ("agent", "documentation-librarian", "Critical - Documentation management"), ("agent", "first-project-companion", "Critical - New user experience"), ("agent", "git-workflow-orchestrator", "Critical - Git operations orchestration"), ("agent", "incident-response", "Critical - Production incident handling"), ("agent", "production-cleanup-orchestrator", "Critical - Maintenance operations"), ("agent", "sample-budget-aware-agent", "Reference - Budget-aware agent pattern"),

# All 7 deactivated commands
("command", "documentation-librarian", "Critical - Documentation command"),
("command", "generate-project-plan", "Critical - Project planning"),
("command", "orchestrate-ecosystem", "Critical - Multi-repo orchestration"),
("command", "orchestrate-submodule", "Critical - Submodule management"),
("command", "production-cleanup", "Critical - Production maintenance"),
("command", "smart-merge", "Critical - Intelligent merge operations"),
("command", "thread", "Important - Threaded conversations"),

# All 6 deactivated prompts
("prompt", "framework-core", "Critical - Core framework prompt"),
("prompt", "task-architecture", "Critical - Architecture tasks"),
("prompt", "task-code-generation", "Critical - Code generation tasks"),
("prompt", "task-deployment", "Critical - Deployment tasks"),
("prompt", "task-documentation", "Critical - Documentation tasks"),
("prompt", "task-research", "Critical - Research tasks"),

# 1 deactivated hook
("hook", "smart-merge", "Critical - Smart merge hook"),

# 28 critical skills (to reach 50 total)
("skill", "adr-compliance", "Critical - ADR compliance validation"),
("skill", "agentic-orchestrator", "Critical - Agent coordination"),
("skill", "authentication-authorization", "Critical - Security patterns"),
("skill", "backend-api-security-patterns", "Critical - API security"),
("skill", "caching-strategies", "Important - Performance optimization"),
("skill", "cicd-automation-patterns", "Critical - CI/CD automation"),
("skill", "cloud-architecture-review", "Important - Cloud review"),
("skill", "cloud-infrastructure-patterns", "Important - Cloud infrastructure"),
("skill", "code-review-patterns", "Critical - Code review quality"),
("skill", "codebase-analysis-patterns", "Critical - Code understanding"),
("skill", "codebase-navigation", "Critical - Code discovery"),
("skill", "codi-qa-patterns", "Critical - QA patterns"),
("skill", "compliance-validation", "Critical - Enterprise compliance"),
("skill", "debugging-patterns", "Critical - Debug workflows"),
("skill", "documentation-quality", "Important - Doc quality"),
("skill", "error-handling-resilience", "Critical - Error handling"),
("skill", "event-driven-architecture", "Important - Event patterns"),
("skill", "foundationdb-patterns", "Important - Database patterns"),
("skill", "git-workflow-patterns", "Critical - Git workflows"),
("skill", "memory-retrieval", "Critical - Context retrieval"),
("skill", "microservices-patterns", "Important - Microservices"),
("skill", "multi-tenant-architecture", "Critical - Multi-tenant SaaS"),
("skill", "orchestration-patterns", "Critical - Agent orchestration"),
("skill", "orchestrator-code-review-patterns", "Important - Review orchestration"),
("skill", "pattern-finding", "Important - Pattern discovery"),
("skill", "security-scanning-patterns", "Critical - Security scanning"),
("skill", "software-design-patterns", "Important - Design patterns"),
("skill", "testing-strategies", "Critical - Test strategies"),

]

def load_status(status_file: Path) -> Dict: """Load activation status from file.""" with open(status_file) as f: return json.load(f)

def save_status(status_file: Path, status: Dict) -> None: """Save activation status to file with atomic write.""" status['last_updated'] = datetime.now(timezone.utc).isoformat().replace('+00:00', 'Z')

temp_file = status_file.with_suffix('.tmp')
with open(temp_file, 'w') as f:
json.dump(status, f, indent=2)
f.write('\n')
temp_file.rename(status_file)

def find_component(status: Dict, comp_type: str, comp_name: str) -> Tuple[Dict, int]: """Find component in status by type and name.""" for idx, comp in enumerate(status.get('components', [])): if comp.get('type') == comp_type and comp.get('name') == comp_name: return comp, idx return None, -1

def activate_components(framework_root: Path, dry_run: bool = False) -> Dict: """ Activate all critical components.

Returns:
Dict with activation results
"""
# Find status file
status_file = framework_root / 'config' / 'component-activation-status.json'
if not status_file.exists():
status_file = framework_root / '.coditect' / 'component-activation-status.json'

if not status_file.exists():
print("Error: component-activation-status.json not found")
sys.exit(1)

status = load_status(status_file)

results = {
'activated': [],
'already_active': [],
'not_found': [],
'errors': []
}

now = datetime.now(timezone.utc).isoformat().replace('+00:00', 'Z')

print()
print("=" * 70)
print("H.1.4: Activating 50 Critical Components")
print("=" * 70)
print()

for comp_type, comp_name, reason in CRITICAL_COMPONENTS:
comp, idx = find_component(status, comp_type, comp_name)

if comp is None:
print(f" [NOT FOUND] {comp_type}/{comp_name}")
results['not_found'].append((comp_type, comp_name))
continue

if comp.get('activated', False):
print(f" [SKIP] {comp_type}/{comp_name} (already active)")
results['already_active'].append((comp_type, comp_name))
continue

# Activate the component
if not dry_run:
status['components'][idx]['activated'] = True
status['components'][idx]['activated_at'] = now
status['components'][idx]['status'] = 'operational'
status['components'][idx]['reason'] = f"H.1.4 batch activation - {reason}"

# Update summary counts
status['activation_summary']['activated'] += 1
status['activation_summary']['deactivated'] -= 1

print(f" [ACTIVATE] {comp_type}/{comp_name}")
results['activated'].append((comp_type, comp_name, reason))

# Save changes
if not dry_run and results['activated']:
# Update both locations
for path in [
framework_root / 'config' / 'component-activation-status.json',
framework_root / '.coditect' / 'component-activation-status.json'
]:
if path.parent.exists():
save_status(path, status)

# Print summary
print()
print("=" * 70)
print("Activation Summary")
print("=" * 70)
print(f" Activated: {len(results['activated'])}")
print(f" Already active: {len(results['already_active'])}")
print(f" Not found: {len(results['not_found'])}")
print()

if results['not_found']:
print("Components not found in registry:")
for t, n in results['not_found']:
print(f" - {t}/{n}")
print()

if dry_run:
print("[DRY RUN] No changes made")
else:
print(f"Updated: {status['activation_summary']['activated']} activated, "
f"{status['activation_summary']['deactivated']} deactivated")

return results

def main(): import argparse

parser = argparse.ArgumentParser(description='H.1.4: Activate 50 critical components')
parser.add_argument('--dry-run', action='store_true', help='Preview without making changes')
args = parser.parse_args()

framework_root = Path(__file__).parent.parent
results = activate_components(framework_root, dry_run=args.dry_run)

# Exit with error if any components weren't found
if results['not_found']:
sys.exit(1)

sys.exit(0)

if name == 'main': main()