Vierter Modus 'Idee': Produkt-Idee durchdenken statt Projekt starten
Fuer echte Software-Ideen (z.B. Game-Server-Management), die weder MC2/Lucy- Umbau noch schon ein Zed-Projekt sind. Volle Denk-Kaskade mit PRODUKT-Blick (was, fuer wen, was gibt es schon, kleinster Wurf, was spricht dagegen) statt Umsetzungs-Blick. Ergebnis: NUR KONZEPT.md — keine Roadmap, kein Geruest, keine Bau-Aufforderung; der Commander entscheidet danach. Kein Ziel-Schalter (eine Idee braucht noch keine Plattform). Eigene Farbe (sky), Button 'Durchdenken'. Nebenbei: projektstart-SOUL.md ist jetzt versioniert + deploy-fest (lag bisher nur auf der Box). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -14,7 +14,8 @@ 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)
|
||||
ziel: str = "" # nur ide-Projekt: "lxc" | "docker" (leer = Box entscheidet)
|
||||
art: str = "projekt" # nur ide: "projekt" (Repo+Roadmap+Bau) | "idee" (nur durchdenken)
|
||||
|
||||
|
||||
class TaskIn(BaseModel):
|
||||
@@ -33,7 +34,8 @@ 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, ziel=body.ziel)
|
||||
res = ideen.add_idea(body.titel, body.notiz, welt=body.welt, tiefe=body.tiefe,
|
||||
ziel=body.ziel, art=body.art)
|
||||
if not res.get("ok"):
|
||||
raise HTTPException(400, res.get("error", "Idee konnte nicht angelegt werden."))
|
||||
return res
|
||||
|
||||
+42
-12
@@ -307,8 +307,26 @@ _INFRA_LXC = (
|
||||
"aus per 'ssh pve' erreichbar (root, Key), Steuerung mit 'pct'. Was dort schon laeuft (Reverse-"
|
||||
"Proxy, DNS, Gitea usw.), schaust du bei Bedarf mit 'ssh pve pct list' nach — nicht annehmen.\n"
|
||||
"· Gitea ist self-hosted im Heimnetz (CI-Pipelines moeglich).\n"
|
||||
"· Alles laeuft lokal — KEINE Cloud, kein fremder Hoster, keine Bezahl-Dienste.\n"
|
||||
"Richte den Tech-Vorschlag an der gewaehlten ZIEL-PLATTFORM aus, nicht am Industrie-Default.")
|
||||
"· Alles laeuft lokal — KEINE Cloud, kein fremder Hoster, keine Bezahl-Dienste.")
|
||||
|
||||
_ZIEL_HINWEIS = ("Richte den Tech-Vorschlag an der gewaehlten ZIEL-PLATTFORM aus, "
|
||||
"nicht am Industrie-Default.")
|
||||
|
||||
# Auftrags-Art „Idee pruefen": Produkt-Blick statt Umsetzungs-Blick, KEIN Projektstart.
|
||||
_ART_IDEE = (
|
||||
"AUFTRAGS-ART: IDEE PRUEFEN (KEIN Projektstart!). Der Commander will diese Produkt-Idee erst "
|
||||
"einmal DURCHDACHT haben — er hat sich NICHT entschieden, sie zu bauen.\n"
|
||||
"· Blickwinkel zuerst PRODUKT, nicht Technik: Was ist es genau? Welches Problem, fuer wen? Was "
|
||||
"gibt es dafuer schon und warum reicht das nicht? Was waere der kleinste sinnvolle Wurf? Was "
|
||||
"spricht DAGEGEN (Aufwand, Betrieb, Wartung, Risiken)? Technik nur so tief, wie es fuer die "
|
||||
"Machbarkeit noetig ist.\n"
|
||||
"· Rollen-Cast entsprechend waehlen — NICHT nur Entwickler-Rollen, sondern auch Zielgruppen-, "
|
||||
"Abgrenzungs-/Markt- und Betriebs-Sicht. Volle Denk-Kaskade mit Advocatus Diaboli.\n"
|
||||
"· Ergebnis: NUR ein KONZEPT.md im neuen Repo (plus knappes README). KEINE ROADMAP.md, KEINE "
|
||||
"AGENTS.md, KEIN SAVEPOINT.md, KEIN Geruest — das entsteht erst, wenn der Commander sich fuers "
|
||||
"Bauen entscheidet.\n"
|
||||
"· Uebergabe NICHT als Bau-Aufforderung formulieren: sag, was die Idee waere, was sie braeuchte "
|
||||
"und was dagegen spricht — die Entscheidung liegt beim Commander.")
|
||||
|
||||
# Ziel-Plattform je Projekt (vom Commander gewaehlt) — ueberstimmt die Annahmen des Modells.
|
||||
_ZIEL = {
|
||||
@@ -327,7 +345,8 @@ _ZIEL_EHRLICH = ("Traegt die gewaehlte Ziel-Plattform fuer dieses Projekt NICHT
|
||||
|
||||
|
||||
def add_idea(titel: str, notiz: str = "", created_by: str = "mc2-ui",
|
||||
welt: str = "box", tiefe: str = "", ziel: str = "") -> dict:
|
||||
welt: str = "box", tiefe: str = "", ziel: str = "",
|
||||
art: str = "projekt") -> dict:
|
||||
"""Idee in die Queue legen.
|
||||
|
||||
welt='box' (Default): triage — der Specifier arbeitet sie aus, die Werkstatt baut,
|
||||
@@ -339,8 +358,9 @@ def add_idea(titel: str, notiz: str = "", created_by: str = "mc2-ui",
|
||||
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).
|
||||
ziel (nur ide): 'lxc' | 'docker' — Ziel-Plattform des Projekts; leer = die Box
|
||||
entscheidet (bekommt aber immer den Infrastruktur-Steckbrief)."""
|
||||
ziel (nur ide-Projekt): 'lxc' | 'docker' — Ziel-Plattform; leer = die Box entscheidet.
|
||||
art (nur ide): 'projekt' (Default, Repo+Doku+Roadmap, Bau in Zed) oder 'idee'
|
||||
(Produkt-Idee nur durchdenken: NUR Konzept, keine Roadmap/Geruest, kein Bau-Druck)."""
|
||||
if not _available():
|
||||
return {"ok": False, "error": "Die Ideen-Queue lebt auf der Box."}
|
||||
titel = (titel or "").strip()
|
||||
@@ -352,12 +372,18 @@ def add_idea(titel: str, notiz: str = "", created_by: str = "mc2-ui",
|
||||
args = ["create", titel, "--assignee", "projektstart", "--created-by", created_by, "--json"]
|
||||
# Vorspann: Aufwand (Tiefe) + Ziel-Plattform + Infrastruktur — überstimmt die
|
||||
# Annahmen des Modells und macht das Konzept auf die reale Umgebung passend.
|
||||
zielwahl = _ZIEL.get(str(ziel).lower())
|
||||
vorspann = [p for p in (_AUFWAND.get(str(tiefe).lower()), zielwahl) if p]
|
||||
# Heimlabor-Kontext nur beim LXC-Pfad (und ohne Wahl = seine Standard-Welt);
|
||||
# Docker-Projekte bekommen bewusst den portablen Kontext.
|
||||
infra = _INFRA_DOCKER if str(ziel).lower() == "docker" else _INFRA_LXC
|
||||
vorspann.append(infra + (" " + _ZIEL_EHRLICH if zielwahl else ""))
|
||||
if str(art).lower() == "idee":
|
||||
# Idee pruefen: Produkt-Blick, volle Kaskade, KEIN Ziel/Geruest/Bau-Druck.
|
||||
# Sein Heimlabor bleibt Kontext (dort liefe es ja), aber ohne Plattform-Festlegung.
|
||||
vorspann = [_ART_IDEE, _AUFWAND["gruendlich"], _INFRA_LXC]
|
||||
else:
|
||||
zielwahl = _ZIEL.get(str(ziel).lower())
|
||||
vorspann = [p for p in (_AUFWAND.get(str(tiefe).lower()), zielwahl) if p]
|
||||
# Heimlabor-Kontext nur beim LXC-Pfad (und ohne Wahl = seine Standard-Welt);
|
||||
# Docker-Projekte bekommen bewusst den portablen Kontext.
|
||||
infra = _INFRA_DOCKER if str(ziel).lower() == "docker" else _INFRA_LXC
|
||||
vorspann.append(infra + " " + _ZIEL_HINWEIS
|
||||
+ (" " + _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"]
|
||||
@@ -373,7 +399,11 @@ def add_idea(titel: str, notiz: str = "", created_by: str = "mc2-ui",
|
||||
_list_cache["ts"] = 0.0 # nächster Poll zeigt die neue Idee sofort
|
||||
try:
|
||||
from services import announce
|
||||
if welt == "ide":
|
||||
if welt == "ide" and str(art).lower() == "idee":
|
||||
announce.add(f"Idee wird durchdacht: „{titel}“ ({task['id']}) — die Box arbeitet ein "
|
||||
"Konzept aus (Produkt-Blick). Danach entscheidest du, ob was draus wird.",
|
||||
"[Ideen-Queue]", "ideen-queue", "silent")
|
||||
elif welt == "ide":
|
||||
announce.add(f"Neues IDE-Projekt in Vorbereitung: „{titel}“ ({task['id']}) — die Box "
|
||||
"härtet das Konzept und legt das Repo an, dann baust du in Zed.",
|
||||
"[Ideen-Queue]", "ideen-queue", "silent")
|
||||
|
||||
Reference in New Issue
Block a user