diff --git a/README.md b/README.md index 1d5983e..2561dea 100644 --- a/README.md +++ b/README.md @@ -388,7 +388,7 @@ Chat-Turn an die richtigen Patterns. ### Skill-Regeln (seed_rules) -`aria-brain/seed_rules.py` enthaelt 15 `type=rule, pinned=true, +`aria-brain/seed_rules.py` enthaelt 16 `type=rule, pinned=true, source=seed`-Memories, die bei jedem Brain-Start idempotent in die Vector-DB geschrieben werden (`migration_key`-basiert). Sie tauchen in jedem Chat-Turn im Hot-Memory-Block auf: diff --git a/aria-brain/agent.py b/aria-brain/agent.py index 60985aa..d1ec291 100644 --- a/aria-brain/agent.py +++ b/aria-brain/agent.py @@ -145,6 +145,13 @@ META_TOOLS = [ "mit `-v2`/`-new`/`-fixed` Suffix anzulegen. Stefan hasst Skill-" "Friedhoefe. Wenn Du `youtube2mp3` umbauen sollst → `skill_update` " "auf den bestehenden, NICHT `skill_create` mit neuem Namen.\n\n" + "Skills sind GANZ NORMALER Python-Code. Du kannst sie beliebig " + "erweitern: if-elif-Verzweigungen auf args/path, strukturierte " + "Outputs, neue Endpoints in einem Skill, json.loads etc. " + "'Der Skill ist nur ein Wrapper, kann ich nicht' ist KEINE " + "valide Antwort — erst `skill_get` lesen, dann `skill_update` " + "mit dem Fix. Stefan ist kein Python-Entwickler, er nennt das " + "ZIEL, Du baust das WIE.\n\n" "Du kannst gleichzeitig `entry_code` (Python-Code austauschen), " "`readme`, `pip_packages` (bei Aenderung wird die venv automatisch " "neu aufgebaut), `args`, `description` und `active` setzen. Felder " diff --git a/aria-brain/seed_rules.py b/aria-brain/seed_rules.py index 1c780c6..bd5a24f 100644 --- a/aria-brain/seed_rules.py +++ b/aria-brain/seed_rules.py @@ -330,6 +330,42 @@ SEED_RULES: List[dict] = [ "Beim ersten Versuch direkt XML-Tag ergibt 3-5s statt 30s+." ), }, + { + "migration_key": "seed/skill-rule/skills-are-editable-python", + "type": "rule", + "title": "Skill-Regel: Skills sind beliebiger Python-Code, kein heiliger Vertrag", + "category": "skills", + "content": ( + "Wenn Stefan eine Skill-Anpassung wuenscht — egal wie klein oder " + "gross — ist die Antwort fast IMMER:\n" + " 1. `skill_get('')` aufrufen, Code lesen\n" + " 2. Ueberlegen wie sich Stefans Wunsch im Code umsetzen laesst\n" + " 3. `skill_update` mit dem neuen `entry_code`\n" + "\n" + "Skills sind GANZ NORMALER Python-Code. Du darfst und SOLLST:\n" + " - if-elif-else-Verzweigungen auf args / paths reagieren lassen " + "(z.B. `if action == 'current': pretty_output(); else: print(json.dumps(data))`)\n" + " - json.loads(), neue Helper-Funktionen, pip-Pakete via " + "pip_packages ergaenzen\n" + " - Outputs strukturieren oder filtern\n" + " - Mehrere Endpoints einer API in einem Skill bedienen\n" + "\n" + "Was Du NICHT sagen sollst (Antipattern, am 30.05.2026 passiert):\n" + " - 'Der Skill ist ein OAuth2-API-Wrapper, ich kann das nicht in " + "den Wrapper bauen' — Quatsch, Wrapper ist auch nur Python\n" + " - 'Ich schlage einen neuen Skill statt Update vor' — pruefe " + "ZUERST ob skill_update reicht. Anti-Friedhof greift ohnehin " + "wenn der Name kollidiert.\n" + " - 'Kann ich nicht' OHNE Code gelesen zu haben — erst " + "skill_get, dann beurteilen\n" + "\n" + "Stefan ist KEIN Python-Entwickler. Er nennt das ZIEL ('strukturierte " + "Track-Ausgabe bei welches-Lied'), Du baust das WIE im Code. " + "Wenn Du Dich rausredest, ist das Verschwendung — Stefan muss sich " + "dann selbst Python-Tipps merken die er nicht im Kopf hat. " + "Genau dafuer bist Du da." + ), + }, { "migration_key": "seed/skill-rule/scaffold-reflex", "type": "rule",