Initial monorepo structure

This commit is contained in:
2026-06-30 20:37:40 +02:00
commit 2f2b295531
121 changed files with 39171 additions and 0 deletions
@@ -0,0 +1,137 @@
"""Integrationsmodul Verdrahtung aller Komponenten.
Stellt eine Factory-Funktion bereit, die alle Monorepo-Komponenten mit
korrekten Querverweisen erstellt und verdrahtet:
- SecretEncryptionManager ↔ ContextGuard (load_env nutzt Entschlüsselung)
- SecretEncryptionManager ↔ FederationManager (Team-Repos erhalten nur eigene Secrets)
- SecretEncryptionManager ↔ OrchestratorAdapter (Env-Loading via Encryption)
Requirements: 2.2, 9.3, 9.4, 10.10
"""
from __future__ import annotations
import logging
from pathlib import Path
from typing import Any
from monorepo.audit import AuditLogger
from monorepo.encryption import MachineContextManager, SecretEncryptionManager
from monorepo.federation import FederationManager
from monorepo.orchestrator import OrchestratorAdapter
from monorepo.security import ContextGuard
logger = logging.getLogger(__name__)
def create_integrated_stack(root_path: Path) -> dict[str, Any]:
"""Erstellt alle Monorepo-Komponenten mit vollständiger Verdrahtung.
Factory-Funktion die den gesamten Komponentenstack aufbaut, wobei
der SecretEncryptionManager als zentrales Bindeglied zwischen
ContextGuard, OrchestratorAdapter und FederationManager dient.
Ablauf:
1. MachineContext laden (aus shared/config/machine-context.yaml)
2. SecretEncryptionManager erstellen
3. ContextGuard mit encryption_manager erstellen
4. AuditLogger erstellen
5. OrchestratorAdapter mit encryption_manager und context_guard erstellen
6. FederationManager mit encryption_manager erstellen
Args:
root_path: Wurzelverzeichnis des Monorepos (absoluter Pfad).
Returns:
Dict mit allen erstellten Komponenten:
- "encryption_manager": SecretEncryptionManager
- "context_guard": ContextGuard
- "audit_logger": AuditLogger
- "orchestrator_adapter": OrchestratorAdapter
- "federation_manager": FederationManager (oder None wenn team-repos.yaml fehlt)
- "machine_context_manager": MachineContextManager
Raises:
FileNotFoundError: Wenn essentielle Konfigurationsdateien fehlen
(access-config.yaml muss existieren; machine-context.yaml ist
optional, führt aber zu einem eingeschränkten Stack).
"""
root_path = root_path.resolve()
# 1. MachineContext laden
machine_ctx_manager = MachineContextManager(root_path)
encryption_manager: SecretEncryptionManager | None = None
try:
machine_ctx_manager.load()
encryption_manager = machine_ctx_manager.create_encryption_manager()
logger.info(
"SecretEncryptionManager erstellt für Maschine '%s' "
"(autorisierte Kontexte: %s).",
machine_ctx_manager.machine_context.name,
machine_ctx_manager.machine_context.authorized_contexts,
)
except FileNotFoundError:
logger.warning(
"machine-context.yaml nicht gefunden. "
"Stack wird ohne Verschlüsselung erstellt."
)
except ValueError as e:
logger.warning(
"machine-context.yaml ungültig: %s. "
"Stack wird ohne Verschlüsselung erstellt.",
e,
)
# 2. ContextGuard mit optionalem encryption_manager erstellen
context_guard = ContextGuard(
root_path=root_path,
encryption_manager=encryption_manager,
)
logger.info("ContextGuard erstellt (encryption: %s).", encryption_manager is not None)
# 3. AuditLogger erstellen
audit_logger = AuditLogger(root_path / ".audit" / "access.log")
# 4. OrchestratorAdapter mit encryption_manager verdrahten
orchestrator_adapter = OrchestratorAdapter(
root_path=root_path,
context_guard=context_guard,
audit_logger=audit_logger,
encryption_manager=encryption_manager,
)
logger.info("OrchestratorAdapter erstellt (encryption: %s).", encryption_manager is not None)
# 5. FederationManager mit encryption_manager erstellen
federation_manager: FederationManager | None = None
team_repos_config_path = root_path / "shared" / "config" / "team-repos.yaml"
if team_repos_config_path.exists():
try:
federation_manager = FederationManager(
config_path=team_repos_config_path,
monorepo_root=root_path,
encryption_manager=encryption_manager,
)
logger.info(
"FederationManager erstellt (encryption: %s).",
encryption_manager is not None,
)
except (FileNotFoundError, ValueError) as e:
logger.warning(
"FederationManager konnte nicht erstellt werden: %s", e
)
else:
logger.info(
"team-repos.yaml nicht gefunden. FederationManager wird nicht erstellt."
)
return {
"encryption_manager": encryption_manager,
"context_guard": context_guard,
"audit_logger": audit_logger,
"orchestrator_adapter": orchestrator_adapter,
"federation_manager": federation_manager,
"machine_context_manager": machine_ctx_manager,
}