IDE-Intake: Ziel-Plattform waehlbar (LXC oder Docker) + Infrastruktur-Steckbrief

Zweiter, dezenter Schalter (nur bei IDE): Ziel = LXC (Standard) oder Docker.
Die Wahl fliesst als 'ZIEL-PLATTFORM'-Zeile in den Auftrag, dazu immer ein
Infrastruktur-Steckbrief (Proxmox/LXC, PBS-Backups, systemd, self-hosted Gitea,
alles lokal) — sonst plant jedes Modell nach Industrie-Default Docker/Cloud.
Skill: Ziel + Infrastruktur sind bindend; traegt die Wahl nicht, muss das
Konzept es ausdruecklich sagen statt sie still zu ignorieren.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-07-20 22:18:20 +02:00
parent 7b9752261a
commit d5da853db2
29 changed files with 144 additions and 83 deletions
+2 -1
View File
@@ -14,6 +14,7 @@ class IdeeIn(BaseModel):
notiz: str = ""
welt: str = "box" # "box" = Werkstatt baut · "ide" = vorbereiten für Zed
tiefe: str = "" # nur ide: "simpel" | "gruendlich" (leer = Box schätzt selbst)
ziel: str = "" # nur ide: "lxc" | "docker" (leer = Box entscheidet)
class TaskIn(BaseModel):
@@ -32,7 +33,7 @@ def list_queue() -> dict:
@router.post("/ideen")
def add_idea(body: IdeeIn) -> dict:
res = ideen.add_idea(body.titel, body.notiz, welt=body.welt, tiefe=body.tiefe)
res = ideen.add_idea(body.titel, body.notiz, welt=body.welt, tiefe=body.tiefe, ziel=body.ziel)
if not res.get("ok"):
raise HTTPException(400, res.get("error", "Idee konnte nicht angelegt werden."))
return res
+32 -5
View File
@@ -287,8 +287,29 @@ _AUFWAND = {
}
# Infrastruktur des Commanders — ohne das plant jedes Modell nach Industrie-Default
# (Docker/Cloud) statt für die reale Umgebung.
_INFRA = ("INFRASTRUKTUR des Commanders (plane DAFUER, nicht nach Industrie-Default): Proxmox (pve) "
"mit LXC-Containern; ein Proxmox Backup Server sichert die LXCs automatisch; Dienste laufen "
"als systemd-Units, moeglichst sudo-frei; Gitea ist self-hosted. Alles laeuft lokal im "
"Heimnetz — KEINE Cloud, kein fremder Hoster, keine Bezahl-Dienste.")
# Ziel-Plattform je Projekt (vom Commander gewaehlt) — ueberstimmt die Annahmen des Modells.
_ZIEL = {
"lxc": ("ZIEL-PLATTFORM (vom Commander gewaehlt): LXC — plane die Umsetzung als Dienst in einem "
"eigenen Proxmox-LXC-Container: systemd-Unit, Dateien im Container, KEIN Docker und KEIN "
"docker compose. Der LXC wird vom Proxmox Backup Server automatisch mitgesichert."),
"docker": ("ZIEL-PLATTFORM (vom Commander gewaehlt): DOCKER — plane docker compose, laufend "
"INNERHALB eines Proxmox-LXC mit aktiviertem Nesting (kein separater Docker-Host). "
"Sag im Konzept, wo die Volumes liegen und wie sie ins LXC-Backup kommen."),
}
_ZIEL_EHRLICH = ("Traegt die gewaehlte Ziel-Plattform fuer dieses Projekt NICHT (z. B. eine noetige "
"Komponente gibt es nur als Docker-Image), dann sag das im Konzept AUSDRUECKLICH mit "
"Begruendung — ignoriere die Wahl nicht still und scheitere nicht daran.")
def add_idea(titel: str, notiz: str = "", created_by: str = "mc2-ui",
welt: str = "box", tiefe: str = "") -> dict:
welt: str = "box", tiefe: str = "", ziel: str = "") -> dict:
"""Idee in die Queue legen.
welt='box' (Default): triage — der Specifier arbeitet sie aus, die Werkstatt baut,
@@ -299,7 +320,9 @@ def add_idea(titel: str, notiz: str = "", created_by: str = "mc2-ui",
Zed selbst baut (IDE-Welt). Bewusst KEIN --triage: so fasst der Auto-Zerleger die
Karte nie an und die Werkstatt baut sie nie (der Fan-out-Fehler vom 20.07.).
tiefe (nur ide): 'simpel' | 'gruendlich' — vom Knopf gewaehlte Konzept-Tiefe; leer =
die Box schaetzt selbst (Fallback fuer Telegram/Lucy)."""
die Box schaetzt selbst (Fallback fuer Telegram/Lucy).
ziel (nur ide): 'lxc' | 'docker' — Ziel-Plattform des Projekts; leer = die Box
entscheidet (bekommt aber immer den Infrastruktur-Steckbrief)."""
if not _available():
return {"ok": False, "error": "Die Ideen-Queue lebt auf der Box."}
titel = (titel or "").strip()
@@ -309,9 +332,13 @@ def add_idea(titel: str, notiz: str = "", created_by: str = "mc2-ui",
notiz = (notiz or "").strip()
if welt == "ide":
args = ["create", titel, "--assignee", "projektstart", "--created-by", created_by, "--json"]
aufwand = _AUFWAND.get(str(tiefe).lower())
if aufwand:
notiz = aufwand + ("\n\n" + notiz if notiz else "")
# Vorspann: Aufwand (Tiefe) + Ziel-Plattform + Infrastruktur — überstimmt die
# Annahmen des Modells und macht das Konzept auf die reale Umgebung passend.
vorspann = [p for p in (_AUFWAND.get(str(tiefe).lower()),
_ZIEL.get(str(ziel).lower())) if p]
zielwahl = _ZIEL.get(str(ziel).lower())
vorspann.append(_INFRA + (" " + _ZIEL_EHRLICH if zielwahl else ""))
notiz = "\n\n".join(vorspann) + ("\n\n" + notiz if notiz else "")
else:
args = ["create", titel, "--triage", "--created-by", created_by, "--json"]
if notiz: