Aethero_github / aethero_audit.py
xvadur's picture
Migrated Aethero Orchestra to unified repo
2913244
#!/usr/bin/env python3
"""
Aethero Audit System - Introspective Development Performance Analysis
Systém na extrakciu a analýzu Aetheron jednotiek z vývojových logov
Slovak Healthcare Worker Solo Development Efficiency Measurement
"""
import json
import subprocess
import re
import os
import sys
from datetime import datetime, timedelta
from typing import Dict, List, Any, Optional, Tuple
from pathlib import Path
from dataclasses import dataclass, asdict
from collections import defaultdict, Counter
import csv
# Import existujúcich Aethero komponentov
sys.path.append('/Users/_xvadur/Desktop/Aethero_github/Aethero_App')
from introspective_parser_module.metrics import CognitiveMetricsAnalyzer
from introspective_parser_module.models import (
ASLCognitiveTag, MentalStateEnum, EmotionToneEnum,
TemporalContextEnum, AetheroIntrospectiveEntity
)
@dataclass
class AetheronUnit:
"""
Základná jednotka vývojovej produktivity - 1 Aetheron
Reprezentuje kvantifikovateľný vývojový výkon
"""
timestamp: datetime
aetheron_value: float # 1.0 = 1 Aetheron
git_commit_count: int
shell_commands_count: int
cognitive_load_estimate: float
development_rhythm_score: float
efficiency_multiplier: float
context_tags: List[str]
@property
def total_output_score(self) -> float:
"""Celkový výstupný skór pre daný časový úsek"""
return (
self.git_commit_count * 0.4 +
self.shell_commands_count * 0.2 +
self.development_rhythm_score * 0.3 +
self.efficiency_multiplier * 0.1
)
@dataclass
class DevelopmentSession:
"""Reprezentácia vývojovej relácie"""
start_time: datetime
end_time: datetime
total_aetherony: float
commits: List[Dict[str, Any]]
commands: List[Dict[str, Any]]
cognitive_coherence: float
productivity_rating: str # "vysoká", "stredná", "nízka"
class AetheroAuditSystem:
"""
Hlavný audit systém pre analýzu vývojového výkonu
Integrácia s existujúcim ASL kognitívnym systémom
"""
def __init__(self, git_repo_path: str = None, shell_history_path: str = None):
self.git_repo_path = git_repo_path or "/Users/_xvadur/Desktop/Aethero_github"
self.shell_history_path = shell_history_path or os.path.expanduser("~/.zsh_history")
self.cognitive_analyzer = CognitiveMetricsAnalyzer()
self.audit_session_id = datetime.now().strftime("%Y%m%d_%H%M%S")
# Definícia oficiálnej Aetheron jednotky
self.AETHERON_DEFINITION = {
"base_unit": "1 Aetheron = 1 hodina efektívneho vývoja",
"measurement_factors": {
"git_commits": 0.3,
"shell_commands": 0.2,
"cognitive_coherence": 0.3,
"time_efficiency": 0.2
},
"slovak_context": "Meranie produktivity slovenského zdravotníckeho pracovníka"
}
def extract_git_development_data(self, days_back: int = 30) -> List[Dict[str, Any]]:
"""
Extrahovanie dát z git logu za posledné dni
"""
since_date = (datetime.now() - timedelta(days=days_back)).strftime("%Y-%m-%d")
try:
# Git log s podrobnými informáciami
git_cmd = [
"git", "log",
f"--since={since_date}",
"--pretty=format:%H|%an|%ae|%ad|%s|%b",
"--date=iso",
"--numstat"
]
result = subprocess.run(
git_cmd,
cwd=self.git_repo_path,
capture_output=True,
text=True,
check=True
)
commits = self._parse_git_log_output(result.stdout)
print(f"[AUDIT] Extrahovaných {len(commits)} commit-ov za posledných {days_back} dní")
return commits
except subprocess.CalledProcessError as e:
print(f"[ERROR] Git log extraction failed: {e}")
return []
def _parse_git_log_output(self, git_output: str) -> List[Dict[str, Any]]:
"""Parsovanie výstupu git log"""
commits = []
lines = git_output.strip().split('\n')
current_commit = None
for line in lines:
if '|' in line and len(line.split('|')) == 6:
# Nový commit
if current_commit:
commits.append(current_commit)
parts = line.split('|')
# Parse date properly handling timezone
date_str = parts[3].replace(' +0100', '').replace(' +0200', '')
if '+' in date_str:
date_str = date_str.split('+')[0]
try:
commit_date = datetime.fromisoformat(date_str)
except:
# Fallback parsing
from dateutil import parser
commit_date = parser.parse(parts[3]).replace(tzinfo=None)
current_commit = {
'hash': parts[0],
'author': parts[1],
'email': parts[2],
'date': commit_date,
'subject': parts[4],
'body': parts[5],
'files_changed': [],
'lines_added': 0,
'lines_removed': 0
}
elif current_commit and '\t' in line:
# Štatistiky súborov
parts = line.split('\t')
if len(parts) == 3:
added, removed, filename = parts
current_commit['files_changed'].append(filename)
if added.isdigit():
current_commit['lines_added'] += int(added)
if removed.isdigit():
current_commit['lines_removed'] += int(removed)
if current_commit:
commits.append(current_commit)
return commits
def extract_shell_development_commands(self, days_back: int = 30) -> List[Dict[str, Any]]:
"""
Extrahovanie vývojových príkazov zo shell histórie
"""
if not os.path.exists(self.shell_history_path):
print(f"[WARNING] Shell history súbor nenájdený: {self.shell_history_path}")
return []
since_timestamp = (datetime.now() - timedelta(days=days_back)).timestamp()
commands = []
try:
with open(self.shell_history_path, 'r', encoding='utf-8', errors='ignore') as f:
for line in f:
line = line.strip()
if line.startswith(': '):
# Zsh history formát: ": timestamp:elapsed_time;command"
match = re.match(r': (\d+):\d+;(.+)', line)
if match:
timestamp = int(match.group(1))
command = match.group(2)
if timestamp >= since_timestamp:
if self._is_development_command(command):
commands.append({
'timestamp': datetime.fromtimestamp(timestamp),
'command': command,
'category': self._categorize_command(command),
'complexity_score': self._assess_command_complexity(command)
})
print(f"[AUDIT] Extrahovaných {len(commands)} vývojových príkazov")
return sorted(commands, key=lambda x: x['timestamp'])
except Exception as e:
print(f"[ERROR] Shell history parsing failed: {e}")
return []
def _is_development_command(self, command: str) -> bool:
"""Identifikácia, či príkaz súvisí s vývojom"""
dev_keywords = [
'git', 'npm', 'pip', 'python', 'node', 'yarn', 'pnpm',
'docker', 'kubectl', 'terraform', 'ansible',
'vim', 'nvim', 'emacs', 'code', 'subl',
'make', 'cmake', 'cargo', 'mvn', 'gradle',
'pytest', 'jest', 'mocha', 'cypress',
'cd', 'ls', 'find', 'grep', 'cat', 'tail', 'head',
'curl', 'wget', 'ssh', 'scp', 'rsync'
]
return any(keyword in command.lower() for keyword in dev_keywords)
def _categorize_command(self, command: str) -> str:
"""Kategorizácia vývojového príkazu"""
if any(kw in command.lower() for kw in ['git commit', 'git push', 'git pull']):
return 'version_control'
elif any(kw in command.lower() for kw in ['npm install', 'pip install', 'yarn add']):
return 'dependency_management'
elif any(kw in command.lower() for kw in ['python', 'node', 'npm run', 'yarn']):
return 'execution'
elif any(kw in command.lower() for kw in ['vim', 'nvim', 'code', 'emacs']):
return 'editing'
elif any(kw in command.lower() for kw in ['test', 'pytest', 'jest', 'mocha']):
return 'testing'
elif any(kw in command.lower() for kw in ['docker', 'kubectl', 'terraform']):
return 'infrastructure'
else:
return 'general'
def _assess_command_complexity(self, command: str) -> float:
"""Hodnotenie zložitosti príkazu (1.0 - 10.0)"""
complexity_indicators = {
'git rebase': 8.0,
'docker-compose': 7.0,
'kubectl': 6.0,
'terraform': 7.0,
'pip install': 3.0,
'npm install': 3.0,
'git commit': 4.0,
'git push': 3.0,
'python': 5.0,
'vim': 6.0,
'grep': 4.0,
'find': 5.0
}
for indicator, score in complexity_indicators.items():
if indicator in command.lower():
# Úprava skóre podľa dĺžky príkazu
length_multiplier = min(1.5, len(command) / 50)
return min(10.0, score * length_multiplier)
return 3.0 # Základné skóre pre nerozpoznané príkazy
def calculate_development_sessions(self, commits: List[Dict], commands: List[Dict]) -> List[DevelopmentSession]:
"""
Identifikácia a analýza vývojových relácií
Relácia = kontinuálny blok vývojovej aktivity
"""
sessions = []
all_activities = []
# Zlúčenie commit-ov a príkazov do časovej osi
for commit in commits:
all_activities.append({
'timestamp': commit['date'],
'type': 'commit',
'data': commit
})
for command in commands:
all_activities.append({
'timestamp': command['timestamp'],
'type': 'command',
'data': command
})
all_activities.sort(key=lambda x: x['timestamp'])
# Identifikácia relácií (gap viac ako 2 hodiny = nová relácia)
session_gap_threshold = timedelta(hours=2)
current_session_activities = []
for i, activity in enumerate(all_activities):
if not current_session_activities:
current_session_activities.append(activity)
else:
time_gap = activity['timestamp'] - current_session_activities[-1]['timestamp']
if time_gap <= session_gap_threshold:
current_session_activities.append(activity)
else:
# Ukončenie aktuálnej relácie
if len(current_session_activities) >= 3: # Minimálne 3 aktivity
session = self._create_development_session(current_session_activities)
sessions.append(session)
current_session_activities = [activity]
# Posledná relácia
if len(current_session_activities) >= 3:
session = self._create_development_session(current_session_activities)
sessions.append(session)
print(f"[AUDIT] Identifikovaných {len(sessions)} vývojových relácií")
return sessions
def _create_development_session(self, activities: List[Dict]) -> DevelopmentSession:
"""Vytvorenie DevelopmentSession z aktivít"""
start_time = activities[0]['timestamp']
end_time = activities[-1]['timestamp']
commits = [a['data'] for a in activities if a['type'] == 'commit']
commands = [a['data'] for a in activities if a['type'] == 'command']
# Výpočet Aetheron jednotiek pre reláciu
session_duration_hours = (end_time - start_time).total_seconds() / 3600
# Aetheron kalkulácia
commit_score = len(commits) * 0.5 # 0.5 Aetheron za commit
command_score = sum(cmd.get('complexity_score', 3.0) for cmd in commands) / 10
# Efektivita na základe časového pomeru
efficiency_ratio = min(1.0, (commit_score + command_score) / max(session_duration_hours, 0.1))
total_aetherony = (commit_score + command_score) * efficiency_ratio
# Kognitívna koherencia (simulovaná na základe aktivít)
cognitive_coherence = self._estimate_cognitive_coherence(commits, commands)
# Hodnotenie produktivity
if total_aetherony >= 2.0:
productivity_rating = "vysoká"
elif total_aetherony >= 1.0:
productivity_rating = "stredná"
else:
productivity_rating = "nízka"
return DevelopmentSession(
start_time=start_time,
end_time=end_time,
total_aetherony=total_aetherony,
commits=commits,
commands=commands,
cognitive_coherence=cognitive_coherence,
productivity_rating=productivity_rating
)
def _estimate_cognitive_coherence(self, commits: List[Dict], commands: List[Dict]) -> float:
"""
Odhad kognitívnej koherencie na základe vzorcov v aktivitách
Integrácia s existujúcim ASL systémom
"""
# Analýza vzorcov v commit správach
commit_complexity = []
for commit in commits:
subject = commit.get('subject', '')
# Hodnotenie na základe ASL kritérií
if any(word in subject.lower() for word in ['fix', 'bug', 'error']):
commit_complexity.append(0.3) # Problémové riešenie = nižšia koherencia
elif any(word in subject.lower() for word in ['feature', 'add', 'implement']):
commit_complexity.append(0.8) # Nová funkcionalita = vyššia koherencia
elif any(word in subject.lower() for word in ['refactor', 'clean', 'optimize']):
commit_complexity.append(0.9) # Optimalizácia = najvyššia koherencia
else:
commit_complexity.append(0.5)
# Analýza diverzity príkazov
command_categories = [cmd.get('category', 'general') for cmd in commands]
category_diversity = len(set(command_categories)) / max(len(command_categories), 1)
base_coherence = sum(commit_complexity) / max(len(commit_complexity), 1) if commit_complexity else 0.5
diversity_bonus = category_diversity * 0.2
return min(1.0, base_coherence + diversity_bonus)
def generate_aetheron_units(self, sessions: List[DevelopmentSession]) -> List[AetheronUnit]:
"""Generovanie detailných Aetheron jednotiek"""
aetheron_units = []
for session in sessions:
# Rozdelenie relácie na hodinové bloky pre presnejšie meranie
session_duration = session.end_time - session.start_time
hour_blocks = max(1, int(session_duration.total_seconds() / 3600))
for hour in range(hour_blocks):
block_start = session.start_time + timedelta(hours=hour)
block_end = min(session.start_time + timedelta(hours=hour + 1), session.end_time)
# Aktivity v tomto bloku
block_commits = [c for c in session.commits
if block_start <= c['date'] < block_end]
block_commands = [c for c in session.commands
if block_start <= c['timestamp'] < block_end]
if block_commits or block_commands:
# Výpočet Aetheron hodnoty pre blok
commit_value = len(block_commits) * 0.3
command_value = len(block_commands) * 0.1
cognitive_bonus = session.cognitive_coherence * 0.2
# Rytmus vývoja na základe frekvencií aktivít
rhythm_score = min(1.0, (len(block_commits) + len(block_commands)) / 10)
# Efektivitný multiplikátor
efficiency = session.cognitive_coherence * rhythm_score
aetheron_value = (commit_value + command_value + cognitive_bonus) * (1 + efficiency)
# Kontextové tagy
context_tags = []
if any('fix' in c.get('subject', '').lower() for c in block_commits):
context_tags.append('debugging')
if any('feature' in c.get('subject', '').lower() for c in block_commits):
context_tags.append('feature_development')
if any(c.get('category') == 'testing' for c in block_commands):
context_tags.append('testing')
unit = AetheronUnit(
timestamp=block_start,
aetheron_value=aetheron_value,
git_commit_count=len(block_commits),
shell_commands_count=len(block_commands),
cognitive_load_estimate=10 - (session.cognitive_coherence * 8),
development_rhythm_score=rhythm_score,
efficiency_multiplier=efficiency,
context_tags=context_tags
)
aetheron_units.append(unit)
return aetheron_units
def export_audit_results(self, sessions: List[DevelopmentSession],
aetheron_units: List[AetheronUnit]) -> Dict[str, str]:
"""Export výsledkov auditu do JSON a CSV formátov"""
# JSON export
json_data = {
'audit_metadata': {
'session_id': self.audit_session_id,
'generated_at': datetime.now().isoformat(),
'git_repo': self.git_repo_path,
'aetheron_definition': self.AETHERON_DEFINITION,
'total_sessions': len(sessions),
'total_aetheron_units': len(aetheron_units),
'total_aetherony_generated': sum(unit.aetheron_value for unit in aetheron_units)
},
'development_sessions': [],
'aetheron_units': [],
'summary_statistics': self._generate_summary_statistics(sessions, aetheron_units)
}
# Konverzia session objektov
for session in sessions:
json_data['development_sessions'].append({
'start_time': session.start_time.isoformat(),
'end_time': session.end_time.isoformat(),
'duration_hours': (session.end_time - session.start_time).total_seconds() / 3600,
'total_aetherony': session.total_aetherony,
'commits_count': len(session.commits),
'commands_count': len(session.commands),
'cognitive_coherence': session.cognitive_coherence,
'productivity_rating': session.productivity_rating
})
# Konverzia Aetheron jednotiek
for unit in aetheron_units:
json_data['aetheron_units'].append(asdict(unit))
# Zápis JSON
json_filename = f"aethero_audit_{self.audit_session_id}.json"
json_path = os.path.join(os.getcwd(), json_filename)
with open(json_path, 'w', encoding='utf-8') as f:
json.dump(json_data, f, indent=2, ensure_ascii=False, default=str)
# CSV export
csv_filename = f"aethero_audit_units_{self.audit_session_id}.csv"
csv_path = os.path.join(os.getcwd(), csv_filename)
with open(csv_path, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow([
'Timestamp', 'Aetheron_Value', 'Git_Commits', 'Shell_Commands',
'Cognitive_Load', 'Rhythm_Score', 'Efficiency_Multiplier', 'Context_Tags'
])
for unit in aetheron_units:
writer.writerow([
unit.timestamp.isoformat(),
unit.aetheron_value,
unit.git_commit_count,
unit.shell_commands_count,
unit.cognitive_load_estimate,
unit.development_rhythm_score,
unit.efficiency_multiplier,
','.join(unit.context_tags)
])
return {
'json_file': json_path,
'csv_file': csv_path
}
def _generate_summary_statistics(self, sessions: List[DevelopmentSession],
units: List[AetheronUnit]) -> Dict[str, Any]:
"""Generovanie súhrnných štatistík"""
if not units:
return {}
total_aetherony = sum(unit.aetheron_value for unit in units)
avg_cognitive_load = sum(unit.cognitive_load_estimate for unit in units) / len(units)
avg_rhythm_score = sum(unit.development_rhythm_score for unit in units) / len(units)
# Najproduktívnejšie dni
daily_productivity = defaultdict(float)
for unit in units:
day_key = unit.timestamp.strftime('%Y-%m-%d')
daily_productivity[day_key] += unit.aetheron_value
# Top vývojové vzorce
all_tags = []
for unit in units:
all_tags.extend(unit.context_tags)
tag_frequency = Counter(all_tags)
return {
'total_aetherony_generated': round(total_aetherony, 2),
'average_aetherony_per_hour': round(total_aetherony / max(len(units), 1), 2),
'average_cognitive_load': round(avg_cognitive_load, 2),
'average_rhythm_score': round(avg_rhythm_score, 2),
'most_productive_day': max(daily_productivity.items(), key=lambda x: x[1])[0] if daily_productivity else None,
'productivity_by_day': dict(daily_productivity),
'top_development_patterns': dict(tag_frequency.most_common(5)),
'development_efficiency_rating': self._calculate_efficiency_rating(total_aetherony, len(sessions))
}
def _calculate_efficiency_rating(self, total_aetherony: float, session_count: int) -> str:
"""Hodnotenie celkovej efektivity vývojára"""
efficiency_score = total_aetherony / max(session_count, 1)
if efficiency_score >= 3.0:
return "Výnimočná - Slovak Healthcare Dev Ninja 🚀"
elif efficiency_score >= 2.0:
return "Vysoká - Efektívny Solo Developer 💪"
elif efficiency_score >= 1.0:
return "Stredná - Stabilný Vývojový Rytmus ⚡"
else:
return "Nízka - Potreba Optimalizácie 📈"
def run_complete_audit(self, days_back: int = 30) -> Dict[str, str]:
"""
Spustenie kompletného audit procesu
"""
print(f"\n🔍 AETHERO AUDIT SYSTEM - Spúšťam analýzu za posledných {days_back} dní")
print("=" * 70)
# 1. Extrahovanie git dát
print("📊 Extrakcia git commit histórie...")
commits = self.extract_git_development_data(days_back)
# 2. Extrahovanie shell dát
print("💻 Extrakcia shell command histórie...")
commands = self.extract_shell_development_commands(days_back)
# 3. Kalkulácia relácií
print("🧮 Kalkulácia vývojových relácií...")
sessions = self.calculate_development_sessions(commits, commands)
# 4. Generovanie Aetheron jednotiek
print("⚡ Generovanie Aetheron jednotiek...")
aetheron_units = self.generate_aetheron_units(sessions)
# 5. Export výsledkov
print("💾 Export výsledkov auditu...")
file_paths = self.export_audit_results(sessions, aetheron_units)
# 6. Súhrnný report
total_aetherony = sum(unit.aetheron_value for unit in aetheron_units)
print(f"\n✅ AUDIT DOKONČENÝ")
print(f"📈 Celkovo vygenerovaných: {total_aetherony:.2f} Aetheron jednotiek")
print(f"🕐 Počet vývojových relácií: {len(sessions)}")
print(f"📝 Analyzovaných commit-ov: {len(commits)}")
print(f"💻 Analyzovaných príkazov: {len(commands)}")
print(f"\n📁 Súbory:")
print(f" JSON: {file_paths['json_file']}")
print(f" CSV: {file_paths['csv_file']}")
return file_paths
def main():
"""Hlavná funkcia pre spustenie auditu"""
audit_system = AetheroAuditSystem()
# Parametrizácia cez argumenty
import argparse
parser = argparse.ArgumentParser(description='Aethero Development Audit System')
parser.add_argument('--days', type=int, default=30, help='Počet dní na analýzu (default: 30)')
parser.add_argument('--git-repo', type=str, help='Cesta k git repozitáru')
parser.add_argument('--shell-history', type=str, help='Cesta k shell history súboru')
args = parser.parse_args()
if args.git_repo:
audit_system.git_repo_path = args.git_repo
if args.shell_history:
audit_system.shell_history_path = args.shell_history
# Spustenie auditu
file_paths = audit_system.run_complete_audit(args.days)
print(f"\n🎯 Aethero Audit dokončený! Súbory uložené:")
for file_type, path in file_paths.items():
print(f" {file_type.upper()}: {path}")
if __name__ == "__main__":
main()