From 2af88b6493f6502587842da2cb69ce501c21ed3f Mon Sep 17 00:00:00 2001 From: "Tobias J. Endres" Date: Sun, 23 Aug 2026 17:26:28 +0200 Subject: [PATCH] refactor!: rename omos to Corentic Package Manager (CPM) A CPM package is an agent package consisting of an APM manifest plus a team configuration (team-profile.yaml). The manager translates such a package into the native config of a target harness. First target: oh-my-opencode-slim; oh-my-pi, codex, claude and copilot are planned. - omos/ -> corentic-package-manager/, cpm.py as CLI entry point - new commands: cpm init [--fill] and cpm setup (guided flow with interactive model selection from opencode.json(c)) - schema field omos_agent -> harness-neutral runtime_agent - user mapping moved to ~/.config/cpm/model-mapping.yaml - provenance suffix .cpm-provenance.json - skill renamed to cpm-setup --- {omos => corentic-package-manager}/README.md | 79 ++++++++++-------- .../__pycache__/cpm.cpython-314.pyc | Bin 0 -> 31841 bytes .../cpm.py | 46 ++++++---- .../examples/model-mapping.yaml | 4 +- .../.apm/skills/job-application/SKILL.md | 0 .../examples/package/.gitignore | 0 .../examples/package/apm.yml | 0 .../examples/package/team-profile.yaml | 11 +-- .../skills/cpm-setup}/SKILL.md | 18 ++-- 9 files changed, 89 insertions(+), 69 deletions(-) rename {omos => corentic-package-manager}/README.md (55%) create mode 100644 corentic-package-manager/__pycache__/cpm.cpython-314.pyc rename omos/omos.py => corentic-package-manager/cpm.py (92%) rename {omos => corentic-package-manager}/examples/model-mapping.yaml (82%) rename {omos => corentic-package-manager}/examples/package/.apm/skills/job-application/SKILL.md (100%) rename {omos => corentic-package-manager}/examples/package/.gitignore (100%) rename {omos => corentic-package-manager}/examples/package/apm.yml (100%) rename {omos => corentic-package-manager}/examples/package/team-profile.yaml (79%) rename {omos/skills/omos-setup => corentic-package-manager/skills/cpm-setup}/SKILL.md (73%) diff --git a/omos/README.md b/corentic-package-manager/README.md similarity index 55% rename from omos/README.md rename to corentic-package-manager/README.md index 7c5ff90..394328b 100644 --- a/omos/README.md +++ b/corentic-package-manager/README.md @@ -1,31 +1,40 @@ -# omos +# Corentic Package Manager (CPM) -Adapter zwischen APM-Packages mit Team-Profil und [oh-my-opencode-slim](https://github.com/alvinunreal/oh-my-opencode-slim). +Ein **CPM-Package** ist ein Agent-Package bestehend aus einem [APM](https://microsoft.github.io/apm/)-Manifest plus Team-Konfiguration (`team-profile.yaml`). Der Corentic Package Manager übersetzt dieses Package in die native Konfiguration eines Ziel-Harnesses. -`omos` liest eine `team-profile.yaml` aus einem APM-Package, löst abstrakte Modellklassen gegen deine lokale Mapping-Tabelle auf und generiert ein namespacetes oh-my-opencode-slim-Preset. Deterministisch – `omos` rät nicht. +Übersetzungsziele: + +| Ziel-Harness | Status | +|---|---| +| [oh-my-opencode-slim](https://ohmyopencodeslim.com/) | ✅ implementiert | +| oh-my-pi | geplant | +| Codex / Claude / Copilot | Vision | + +Deterministisch – der CPM rät nicht. Er nimmt keine Verfügbarkeit an und wählt keine Modelle automatisch aus. ``` -APM-Package Nutzer Runtime -team-profile.yaml + model-mapping.yaml → omos render → .opencode/ -(Rollen, Modell- (Modellklasse → oh-my-opencode-slim.json - klassen, MCPs/Skills) konkrete Modell-ID) +CPM-Package Nutzer Runtime +apm.yml + + model-mapping.yaml → cpm render → .opencode/ +team-profile.yaml (Modellklasse → oh-my-opencode-slim.json +(Rollen, Modell- konkrete Modell-ID) (oder künftig: natives + klassen, MCPs/Skills) Config eines anderen Harness) ``` ## Voraussetzungen - Python 3.10+ mit PyYAML (`pip install pyyaml`) -- OpenCode mit installiertem Plugin [oh-my-opencode-slim](https://ohmyopencodeslim.com/) -- Ein APM-Package mit `team-profile.yaml` +- OpenCode mit installiertem Plugin [oh-my-opencode-slim](https://github.com/alvinunreal/oh-my-opencode-slim) +- Ein CPM-Package mit `team-profile.yaml` ## Schnellstart ```bash # 1. Modell-Mapping anlegen – interaktiv, mit Auswahl aus deinen opencode-Modellen -python3 omos.py init --fill +python3 cpm.py init --fill # 2. Geführt: Team-Profil lesen, Mapping prüfen/auffüllen, rendern cd -python3 /pfad/zu/omos.py setup --package /pfad/zum/package +python3 /pfad/zu/cpm.py setup --package /pfad/zum/package # 3. Aktivieren opencode # Projekt-Config wird geladen @@ -37,16 +46,16 @@ Alternativ manuell: ```bash # 1. Modell-Mapping einmalig anlegen -mkdir -p ~/.config/apm-team -cp examples/model-mapping.yaml ~/.config/apm-team/model-mapping.yaml -$EDITOR ~/.config/apm-team/model-mapping.yaml # an eigene Modelle anpassen +mkdir -p ~/.config/cpm +cp examples/model-mapping.yaml ~/.config/cpm/model-mapping.yaml +$EDITOR ~/.config/cpm/model-mapping.yaml # an eigene Modelle anpassen # 2. Validieren (Dry-Run) -python3 omos.py check --package examples/package +python3 cpm.py check --package examples/package # 3. Rendern cd -python3 /pfad/zu/omos.py render --package /pfad/zum/package +python3 /pfad/zu/cpm.py render --package /pfad/zum/package ``` ## Die drei Dateien @@ -54,34 +63,34 @@ python3 /pfad/zu/omos.py render --package /pfad/zum/package | Datei | Gehört | Zweck | Manuell editieren? | |---|---|---|---| | `team-profile.yaml` | Package-Autor | Rollen, Modellklassen, MCP-/Skill-Allowlists pro Rolle | Ja (Autor) | -| `~/.config/apm-team/model-mapping.yaml` | Nutzer | Modellklasse → konkrete Modell-ID (+ optional variant/temperature) | Ja (Nutzer) | -| `.opencode/oh-my-opencode-slim.json` | generiert | OMOS-Preset mit konkreten Modell-IDs | **Nein** – immer neu rendern | +| `~/.config/cpm/model-mapping.yaml` | Nutzer | Modellklasse → konkrete Modell-ID (+ optional variant/temperature) | Ja (Nutzer) | +| `.opencode/oh-my-opencode-slim.json` | generiert | Preset mit konkreten Modell-IDs | **Nein** – immer neu rendern | -Dazu eine Provenance-Datei `.opencode/oh-my-opencode-slim.omos-provenance.json`, die dokumentiert, welche Rolle welches Modell erhalten hat. +Dazu eine Provenance-Datei `.opencode/oh-my-opencode-slim.cpm-provenance.json`, die dokumentiert, welche Rolle welches Modell erhalten hat. ## Kommandoreferenz ```bash -python3 omos.py init [--mapping FILE] [--fill] # Mapping anlegen/füllen -python3 omos.py setup --package DIR [--mapping F] ... # geführter Ablauf -python3 omos.py render --package DIR [--mapping F] [--output F] [--dry-run] -python3 omos.py check --package DIR [--mapping F] # Dry-Run-Validierung +python3 cpm.py init [--mapping FILE] [--fill] # Mapping anlegen/füllen +python3 cpm.py setup --package DIR [--mapping F] ... # geführter Ablauf +python3 cpm.py render --package DIR [--mapping F] [--output F] [--dry-run] +python3 cpm.py check --package DIR [--mapping F] # Dry-Run-Validierung ``` ### `init` – Mapping anlegen -Erstellt `~/.config/apm-team/model-mapping.yaml` (falls nicht vorhanden). Mit `--fill` werden alle `PLACEHOLDER`-Klassen interaktiv abgefragt: `omos` listet alle Modelle aus deiner `opencode.json(c)` auf, du wählst per Nummer oder gibst eine Modell-ID manuell ein. +Erstellt `~/.config/cpm/model-mapping.yaml` (falls nicht vorhanden). Mit `--fill` werden alle `PLACEHOLDER`-Klassen interaktiv abgefragt: der CPM listet alle Modelle aus deiner `opencode.json(c)` auf, du wählst per Nummer oder gibst eine Modell-ID manuell ein. ### `setup` – Geführter Ablauf -Der Ein-Kommando-Weg: zeigt das Team-Profil verständlich an, legt fehlendes Mapping an, fragt fehlende Modellklassen interaktiv ab (gleiche Auswahl wie `init --fill`), rendert und gibt die Aktivierungsschritte aus. Entspricht dem Resolve–Validate–Render-Ablauf. +Der Ein-Kommando-Weg: zeigt das Team-Profil verständlich an, legt fehlendes Mapping an, fragt fehlende Modellklassen interaktiv ab (gleiche Auswahl wie `init --fill`), rendert und gibt die Aktivierungsschritte aus. ### `render` / `check` | Option | Default | Bedeutung | |---|---|---| -| `--package` | `.` | APM-Package-Verzeichnis mit `team-profile.yaml` | -| `--mapping` | `~/.config/apm-team/model-mapping.yaml` | Lokale Mapping-Tabelle | +| `--package` | `.` | CPM-Package-Verzeichnis mit `team-profile.yaml` | +| `--mapping` | `~/.config/cpm/model-mapping.yaml` | Lokale Mapping-Tabelle | | `--output` | `/.opencode/oh-my-opencode-slim.json` | Zieldatei | | `--team-file` | `team-profile.yaml` (alternativ `team.yaml`) | Alternativer Profilname | @@ -97,7 +106,7 @@ description: ... roles: - id: researcher # fachliche Rolle purpose: ... # wird zu Prompt/Description für Custom Agents - omos_agent: librarian # optional: OMOS-Builtin oder 'custom' + runtime_agent: librarian # optional: Harness-Builtin oder 'custom' # (Default: role-id als Custom Agent) model_class: fast-research # Pflicht, muss im Mapping existieren capabilities: @@ -105,7 +114,7 @@ roles: skills: [job-application] # Skill-Allowlist ([] = keine) ``` -Erkannte OMOS-Builtins: `orchestrator`, `oracle`, `librarian`, `explorer`, `fixer`, `designer`, `council`, `observer`. Alles andere (oder `omos_agent: custom`) erzeugt einen Custom Agent inklusive `prompt` und `orchestratorPrompt` aus dem `purpose`-Feld. +Das Feld `runtime_agent` ist bewusst harness-neutral benannt: Der Adapter entscheidet, wie die Rolle im Ziel-Harness repräsentiert wird. Erkannte Builtins des oh-my-opencode-slim-Adapters: `orchestrator`, `oracle`, `librarian`, `explorer`, `fixer`, `designer`, `council`, `observer`. Alles andere (oder `runtime_agent: custom`) erzeugt einen Custom Agent inklusive `prompt` und `orchestratorPrompt` aus dem `purpose`-Feld. ### Mapping-Formate @@ -120,25 +129,23 @@ model_classes: Alle Zusatzfelder werden 1:1 in den Agent-Eintrag des Presets übernommen. -## Was omos prüft +## Was der CPM prüft 1. Team-Profil vorhanden, Schema bekannt, `id` und `roles` vorhanden 2. Jede `model_class` hat einen Mapping-Eintrag (sonst Fehler mit Lösungshinweis) 3. MCPs gegen `~/.config/opencode/opencode.json(c)` abgleichen (**Warnung**, kein Abbruch) 4. Rollen ohne MCPs/Skills → Hinweis -`omos` nimmt keine Verfügbarkeit an und wählt keine Modelle automatisch aus. Fehlt ein Mapping, bricht das Rendern mit konkreter Ursache ab. - ## Walkthrough mit dem Beispiel-Package ```bash -cd omos/examples +cd corentic-package-manager/examples # Trockenlauf: was würde generiert? -python3 ../omos.py check --package package --mapping model-mapping.yaml +python3 ../cpm.py check --package package --mapping model-mapping.yaml # Rendern in das Beispiel-Projekt -python3 ../omos.py render --package package \ +python3 ../cpm.py render --package package \ --mapping model-mapping.yaml \ --output package/.opencode/oh-my-opencode-slim.json ``` @@ -164,6 +171,6 @@ cd package && opencode ## Grenzen (bewusst) -- `omos` startet keine Agenten und orchestriert nichts zur Laufzeit – das macht oh-my-opencode-slim. +- Der CPM startet keine Agenten und orchestriert nichts zur Laufzeit – das macht der Ziel-Harness. - MCP-/Skill-Allowlists sind Capability Scoping, keine Sandbox. Irreversible Aktionen brauchen serverseitige Autorisierung + Human Approval. - Die Modellverfügbarkeit wird gegen die opencode.jsonc-Namen geprüft, nicht per API-Healthcheck. diff --git a/corentic-package-manager/__pycache__/cpm.cpython-314.pyc b/corentic-package-manager/__pycache__/cpm.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0f913efe3e7e474f5fc02a086270ab5edad898c GIT binary patch literal 31841 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 literal 0 HcmV?d00001 diff --git a/omos/omos.py b/corentic-package-manager/cpm.py similarity index 92% rename from omos/omos.py rename to corentic-package-manager/cpm.py index 880cd90..eb2f9b5 100644 --- a/omos/omos.py +++ b/corentic-package-manager/cpm.py @@ -1,17 +1,26 @@ #!/usr/bin/env python3 -"""omos – Adapter zwischen APM-Team-Profilen und oh-my-opencode-slim. +"""cpm – Corentic Package Manager. -Liest ein team-profile.yaml aus einem APM-Package, löst Modellklassen gegen -eine lokale Mapping-Tabelle auf und generiert ein namespacetes Preset für -oh-my-opencode-slim. +Ein CPM-Package ist ein Agent-Package bestehend aus einem APM-Manifest plus +Team-Konfiguration (team-profile.yaml). Der CPM übersetzt dieses Package in +die native Konfiguration eines Ziel-Harnesses. Erstes Übersetzungsziel: +oh-my-opencode-slim. Weitere Ziele (oh-my-pi, codex, claude, copilot) sind +geplant. + +Liest ein team-profile.yaml, löst Modellklassen gegen eine lokale +Mapping-Tabelle auf und generiert ein namespacetes Preset für den +Ziel-Harness. Kommandos: - omos render Team-Profil in OMOS-Preset übersetzen und schreiben - omos check Validieren ohne zu schreiben (Dry-Run) + cpm init Nutzer-Mapping anlegen (optional interaktiv füllen) + cpm setup Geführt: Profil lesen, Mapping auffüllen, rendern + cpm render Team-Profil in Harness-Preset übersetzen und schreiben + cpm check Validieren ohne zu schreiben (Dry-Run) Beispiele: - python3 omos.py render --package examples/package --mapping ~/.config/apm-team/model-mapping.yaml - python3 omos.py check --package examples/package + python3 cpm.py setup --package examples/package + python3 cpm.py render --package examples/package --mapping ~/.config/cpm/model-mapping.yaml + python3 cpm.py check --package examples/package """ from __future__ import annotations @@ -25,7 +34,8 @@ from pathlib import Path import yaml -# Eingebaute OMOS-Agenten. Alles andere wird als Custom Agent behandelt. +# Eingebaute Agenten des ersten Übersetzungsziels oh-my-opencode-slim. +# Alles andere wird als Custom Agent behandelt. BUILTIN_AGENTS = { "orchestrator", "oracle", @@ -40,7 +50,7 @@ BUILTIN_AGENTS = { DEFAULT_MAPPING_PATH = Path.home() / ".config" / "apm-team" / "model-mapping.yaml" DEFAULT_TEAM_FILE = "team-profile.yaml" DEFAULT_OUTPUT = Path(".opencode") / "oh-my-opencode-slim.json" -PROVENANCE_SUFFIX = ".omos-provenance.json" +PROVENANCE_SUFFIX = ".cpm-provenance.json" SUPPORTED_SCHEMA = ("corentic.team-profile/v1", "acme.team-profile/v1") @@ -159,12 +169,12 @@ def build_preset(profile: dict, mapping: dict) -> tuple[dict, dict, list[str]]: skills = list(capabilities.get("skills", []) or []) purpose = str(role.get("purpose", "")).strip() - omos_agent = role.get("omos_agent", role_id) - if omos_agent == "custom": + runtime_agent = role.get("runtime_agent", role_id) + if runtime_agent == "custom": # Explizit als Custom Agent markiert → rolleneigener Name. agent_key = role_id else: - agent_key = omos_agent + agent_key = runtime_agent preset[agent_key] = { **agent_fields, @@ -175,7 +185,7 @@ def build_preset(profile: dict, mapping: dict) -> tuple[dict, dict, list[str]]: if agent_key in BUILTIN_AGENTS and agent_key != role_id: preset[agent_key]["displayName"] = role_id - if agent_key not in BUILTIN_AGENTS or omos_agent == "custom": + if agent_key not in BUILTIN_AGENTS or runtime_agent == "custom": if agent_key not in custom_agents: prompt = ( purpose @@ -363,7 +373,7 @@ def cmd_render(args: argparse.Namespace) -> int: "presetName": sanitize_preset_name(str(profile["id"])), "roles": { r.get("id"): { - "omosAgent": r.get("omos_agent", r.get("id")), + "runtimeAgent": r.get("runtime_agent", r.get("id")), "modelClass": r.get("model_class"), "resolvedModel": mapping[r["model_class"]], "mcps": (r.get("capabilities", {}) or {}).get("mcps", []), @@ -468,7 +478,7 @@ def cmd_init(args: argparse.Namespace) -> int: "bitte manuell ergänzen.") print("\nNächster Schritt:") - print(f" omos.py check --package --mapping {mapping_path}") + print(f" cpm.py check --package --mapping {mapping_path}") return 0 @@ -523,11 +533,11 @@ def cmd_setup(args: argparse.Namespace) -> int: def main(argv: list[str] | None = None) -> int: parser = argparse.ArgumentParser( - prog="omos", + prog="cpm", description=( "Adapter zwischen APM-Team-Profilen und oh-my-opencode-slim. " "Übersetzt deterministisch: Team-Profil + lokales Modell-Mapping " - "-> OMOS-Preset." + "-> Harness-Preset." ), ) sub = parser.add_subparsers(dest="command", required=True) diff --git a/omos/examples/model-mapping.yaml b/corentic-package-manager/examples/model-mapping.yaml similarity index 82% rename from omos/examples/model-mapping.yaml rename to corentic-package-manager/examples/model-mapping.yaml index 65764f7..3715568 100644 --- a/omos/examples/model-mapping.yaml +++ b/corentic-package-manager/examples/model-mapping.yaml @@ -1,7 +1,7 @@ -# ~/.config/apm-team/model-mapping.yaml +# ~/.config/cpm/model-mapping.yaml # # Lokale Mapping-Tabelle des NUTZERS. -# Ordnet abstrakte Modellklassen aus Team-Profilen konkrete, lokal +# Ordnet abstrakte Modellklassen aus CPM-Packages (Team-Profile) konkrete, lokal # verfügbare Modell-IDs zu. Einmal anlegen, gilt für alle Packages. # # Einfache Form: klasse: provider/modell-id diff --git a/omos/examples/package/.apm/skills/job-application/SKILL.md b/corentic-package-manager/examples/package/.apm/skills/job-application/SKILL.md similarity index 100% rename from omos/examples/package/.apm/skills/job-application/SKILL.md rename to corentic-package-manager/examples/package/.apm/skills/job-application/SKILL.md diff --git a/omos/examples/package/.gitignore b/corentic-package-manager/examples/package/.gitignore similarity index 100% rename from omos/examples/package/.gitignore rename to corentic-package-manager/examples/package/.gitignore diff --git a/omos/examples/package/apm.yml b/corentic-package-manager/examples/package/apm.yml similarity index 100% rename from omos/examples/package/apm.yml rename to corentic-package-manager/examples/package/apm.yml diff --git a/omos/examples/package/team-profile.yaml b/corentic-package-manager/examples/package/team-profile.yaml similarity index 79% rename from omos/examples/package/team-profile.yaml rename to corentic-package-manager/examples/package/team-profile.yaml index c56b8b0..2beb11a 100644 --- a/omos/examples/package/team-profile.yaml +++ b/corentic-package-manager/examples/package/team-profile.yaml @@ -7,7 +7,8 @@ # - welche Teilmenge der MCPs und Skills jede Rolle verwenden darf. # # Der Nutzer löst die Modellklassen lokal auf (siehe model-mapping.yaml). -# Der Adapter omos generiert daraus ein oh-my-opencode-slim-Preset. +# Der CPM (Corentic Package Manager) übersetzt dieses Profil in die native +# Konfiguration eines Ziel-Harnesses – aktuell: oh-my-opencode-slim. schema: corentic.team-profile/v1 @@ -26,7 +27,7 @@ roles: - id: researcher purpose: Sucht und bewertet Stellenausschreibungen gegen das Kandidatenprofil - omos_agent: librarian # nutzt OMOS-Builtin 'librarian' mit Alias + runtime_agent: librarian # nutzt oh-my-opencode-slim-Builtin 'librarian' mit Alias model_class: fast-research capabilities: mcps: [websearch, webfetch, openviking] @@ -36,7 +37,7 @@ roles: purpose: Erstellt auf Fakten basierende Anschreiben und Lebensläufe in ShareLaTeX. Nutze nur freigegebene Profilfakten. Erfinde keine Erfahrung. Reiche niemals selbstständig eine Bewerbung ein. - omos_agent: custom # eigener Custom Agent 'writer' + runtime_agent: custom # eigener Custom Agent 'writer' model_class: strong-writing capabilities: mcps: [openviking, sharelatex] @@ -45,7 +46,7 @@ roles: - id: checker purpose: Prüft Fakten, Ton und Vollständigkeit gegen das Kandidatenprofil. Jede Behauptung braucht eine belegbare Quelle. - omos_agent: oracle # nutzt OMOS-Builtin 'oracle' mit Alias + runtime_agent: oracle # nutzt oh-my-opencode-slim-Builtin 'oracle' mit Alias model_class: high-reasoning capabilities: mcps: [openviking] @@ -54,7 +55,7 @@ roles: - id: notifier purpose: Informiert den Nutzer über fertige Entwürfe. Versende niemals etwas ohne explizite Nutzerfreigabe. - omos_agent: custom # eigener Custom Agent 'notifier' + runtime_agent: custom # eigener Custom Agent 'notifier' model_class: cheap-reliable capabilities: mcps: [] diff --git a/omos/skills/omos-setup/SKILL.md b/corentic-package-manager/skills/cpm-setup/SKILL.md similarity index 73% rename from omos/skills/omos-setup/SKILL.md rename to corentic-package-manager/skills/cpm-setup/SKILL.md index 38e768f..4f43b26 100644 --- a/omos/skills/omos-setup/SKILL.md +++ b/corentic-package-manager/skills/cpm-setup/SKILL.md @@ -1,23 +1,23 @@ --- -name: omos-setup -description: Activate when the user wants to set up, render, or troubleshoot an omos team from an APM package. Use for omos render, team-profile, model-mapping, oh-my-opencode-slim preset, fehlende Modellklassen. +name: cpm-setup +description: Activate when the user wants to set up, render, or troubleshoot a CPM package (APM package + team-profile). Use for cpm init, cpm setup, cpm render, team-profile, model-mapping, oh-my-opencode-slim preset, fehlende Modellklassen. allowed-tools: - - "Bash(python3 omos/omos.py *)" + - "Bash(python3 corentic-package-manager/cpm.py *)" - "Read" - "Write" - "Edit" - "Glob" --- -# OMOS Setup Skill +# CPM Setup Skill -Führt den Nutzer durch: APM-Package mit Team-Profil → lokales Modell-Mapping → gerendertes oh-my-opencode-slim-Preset. +Führt den Nutzer durch: CPM-Package (APM-Manifest + Team-Profil) → lokales Modell-Mapping → gerendertes Harness-Preset (aktuell: oh-my-opencode-slim). ## Der Ablauf (Resolve–Validate–Render) ### 1. Team-Profil finden -Prüfe, ob eine `team-profile.yaml` existiert (Package-Root oder `omos/examples/team-profile.yaml`). Lies sie und fasse dem Nutzer zusammen: +Prüfe, ob eine `team-profile.yaml` existiert (Package-Root oder `corentic-package-manager/examples/package/team-profile.yaml`). Lies sie und fasse dem Nutzer zusammen: ``` Profil: acme.job-applications @@ -28,7 +28,7 @@ MCPs benötigt: openviking, sharelatex (+ websearch/webfetch als OpenCode-Native ### 2. Mapping prüfen -Prüfe `~/.config/apm-team/model-mapping.yaml`. Für **jede** im Profil verwendete Modellklasse muss ein Eintrag existieren. +Prüfe `~/.config/cpm/model-mapping.yaml`. Für **jede** im Profil verwendete Modellklasse muss ein Eintrag existieren. Wenn eine Modellklasse fehlt, biete dem Nutzer konkrete Optionen an (verfügbare Modelle aus `~/.config/opencode/opencode.jsonc` auflisten): @@ -41,6 +41,8 @@ Für 'high-reasoning' ist kein Modell zugeordnet. Nach Auswahl schreibe das Mapping und markiere optional `# selected_by: user`. +Alternativ die interaktiven Kommandos nutzen: `cpm init --fill` und `cpm setup`. + ### 3. MCPs prüfen Vergleiche die im Profil genannten MCPs mit der Sektion `mcp` in `~/.config/opencode/opencode.jsonc`. Fehlende dem Nutzer melden – nicht stillschweigend ignorieren. Native OpenCode-Tools (`websearch`, `webfetch`) sind keine MCPs und brauchen keinen Eintrag. @@ -48,7 +50,7 @@ Vergleiche die im Profil genannten MCPs mit der Sektion `mcp` in `~/.config/open ### 4. Rendern ```bash -python3 omos/omos.py render --package +python3 corentic-package-manager/cpm.py render --package ``` Zeige die Ausgabe inklusive Warnungen. Die Datei `.opencode/oh-my-opencode-slim.json` ist generiert – nicht manuell editieren.