feat(omos): example package, team profile, mapping and setup skill
- examples/package: copy of the job-application APM package with corentic.team-profile/v1 declaration (orchestrator, researcher, writer, checker, notifier) - examples/model-mapping.yaml: user-side model class mapping with simple and extended entries - skills/omos-setup: skill guiding users through resolve-validate-render and activation
This commit is contained in:
parent
907f43d40b
commit
f0f1915251
6 changed files with 288 additions and 0 deletions
19
omos/examples/model-mapping.yaml
Normal file
19
omos/examples/model-mapping.yaml
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
# ~/.config/apm-team/model-mapping.yaml
|
||||
#
|
||||
# Lokale Mapping-Tabelle des NUTZERS.
|
||||
# Ordnet abstrakte Modellklassen aus Team-Profilen konkrete, lokal
|
||||
# verfügbare Modell-IDs zu. Einmal anlegen, gilt für alle Packages.
|
||||
#
|
||||
# Einfache Form: klasse: provider/modell-id
|
||||
# Erweiterte Form: klasse: { model: ..., variant: ..., temperature: ... }
|
||||
|
||||
model_classes:
|
||||
strong-generalist: ollama/qwen3.6:35b-a3b-q4_K_M
|
||||
fast-research: ollama/qwen3.5:9b
|
||||
strong-writing:
|
||||
model: ollama/qwen3.6:35b-a3b-q4_K_M
|
||||
temperature: 0.7
|
||||
high-reasoning:
|
||||
model: ollama/qwen3.6:35b-a3b-q4_K_M
|
||||
variant: thinking
|
||||
cheap-reliable: ollama/gemma4:12b
|
||||
112
omos/examples/package/.apm/skills/job-application/SKILL.md
Normal file
112
omos/examples/package/.apm/skills/job-application/SKILL.md
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
---
|
||||
name: job-application
|
||||
description: Activate when the user wants to find jobs and create tailored applications. Use for Bewerbung, job search, cover letter, application, Stellenuche.
|
||||
allowed-tools:
|
||||
- "openviking_search"
|
||||
- "openviking_recall"
|
||||
- "openviking_read"
|
||||
- "websearch"
|
||||
- "webfetch"
|
||||
- "sharelatex_*"
|
||||
- "Read"
|
||||
- "Write"
|
||||
---
|
||||
|
||||
# Job Application Skill
|
||||
|
||||
Find matching positions and create tailored applications (Anschreiben + Lebenslauf) in ShareLaTeX.
|
||||
|
||||
## Reference Project
|
||||
|
||||
Template: ShareLaTeX project `6a873cad300b2c1747bdf4c4`
|
||||
All files from this project are copied verbatim into each new project.
|
||||
Only two files are rewritten: `variables.tex` and `cover-letter.tex`.
|
||||
All other files (resume.tex, sections/*, _header.tex, TLCresume.sty) stay UNCHANGED.
|
||||
|
||||
## Process
|
||||
|
||||
### 1. Profile
|
||||
|
||||
Read user profile from OpenViking: skills, experience, projects, personal data.
|
||||
|
||||
### 2. Search
|
||||
|
||||
Search for jobs via websearch. Use the user's query or infer from profile.
|
||||
Collect 8-10 candidates with: role, company, location, source URL.
|
||||
|
||||
### 3. Prioritize
|
||||
|
||||
Present top 4 as table:
|
||||
|
||||
| # | Role | Company | Location | Why |
|
||||
|---|------|---------|----------|-----|
|
||||
|
||||
Wait for user selection before proceeding.
|
||||
|
||||
### 4. Create Projects
|
||||
|
||||
For each selected job:
|
||||
|
||||
1. Create ShareLaTeX project: "Bewerbung – {Company} – {Role}"
|
||||
2. Copy ALL files from template (resume.tex, sections/*, _header.tex, TLCresume.sty, variables.tex, cover-letter.tex, README.md)
|
||||
3. Rewrite `variables.tex` with job-specific values
|
||||
4. Rewrite `cover-letter.tex` with tailored Anschreiben
|
||||
5. Do NOT modify any other files
|
||||
|
||||
### 5. Cover Letter Rules (DIN 5008)
|
||||
|
||||
#### Format
|
||||
- Language: German (unless job posting is English)
|
||||
- Length: exactly one A4 page
|
||||
- Font: 12pt, matching the template (already set in LaTeX)
|
||||
- Structure: DIN 5008 business letter format
|
||||
|
||||
#### Variables to set (in variables.tex)
|
||||
- `\Company`: full company name (e.g. "R+V Allgemeine Versicherung AG")
|
||||
- `\Position`: exact job title from posting
|
||||
- `\RefNumber`: job reference number if available
|
||||
- `\Subject`: "Bewerbung als {Position}" (bold in LaTeX)
|
||||
- `\Salutation`: "Sehr geehrte/r Frau/Herr {Name}," if known, else "Sehr geehrte Damen und Herren,"
|
||||
|
||||
#### Structure of cover-letter.tex
|
||||
1. Sender block (already in template)
|
||||
2. Recipient block
|
||||
3. Date (right-aligned)
|
||||
4. Subject line (bold, no "Betreff:" prefix)
|
||||
5. Salutation
|
||||
6. Opening (3-5 sentences): state position, where found, one compelling reason why
|
||||
7. Body (2 paragraphs, ~100 words each):
|
||||
- Paragraph 1: 2-3 matching qualifications with concrete examples from OpenViking profile
|
||||
- Paragraph 2: Why this company specifically (researched values, projects, mission)
|
||||
8. Closing: availability for interview, "Mit freundlichen Grüßen"
|
||||
9. Anlagen list
|
||||
|
||||
#### Do's
|
||||
- Research company before writing (website, recent news, values)
|
||||
- Reference specific company projects or values
|
||||
- Use concrete examples with numbers/metrics
|
||||
- Match language to job posting (German posting → German letter)
|
||||
- Use keywords from job posting (ATS optimization)
|
||||
- Keep sentences short and factual
|
||||
- End with call to action (interview availability)
|
||||
|
||||
#### Don'ts
|
||||
- Never start with "Hiermit bewerbe ich mich" (used by 90% of applicants)
|
||||
- Never use "Mit großem Interesse habe ich Ihre Stellenanzeige gelesen"
|
||||
- Don't repeat CV content verbatim
|
||||
- Don't use generic phrases like "innovativ", "teamfähig", "motiviert"
|
||||
- Don't include personal details (age, marital status)
|
||||
- Don't exceed one page
|
||||
- Don't use humor or informal language
|
||||
- Don't copy-paste between applications (recipients notice)
|
||||
- Don't make claims you can't back up with examples
|
||||
|
||||
### 6. Compile
|
||||
|
||||
Compile each project. Fix errors. Return project links.
|
||||
|
||||
## Output
|
||||
|
||||
| Role | Project | Status |
|
||||
|------|---------|--------|
|
||||
| ... | link | Created |
|
||||
2
omos/examples/package/.gitignore
vendored
Normal file
2
omos/examples/package/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
# Generierte Artefakte – Quelle sind team-profile.yaml + model-mapping.yaml
|
||||
.opencode/
|
||||
21
omos/examples/package/apm.yml
Normal file
21
omos/examples/package/apm.yml
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
name: job-application
|
||||
version: 1.0.0
|
||||
description: Find matching jobs and create tailored cover letters + CVs in ShareLaTeX
|
||||
author: Tobias Endres
|
||||
license: MIT
|
||||
type: skill
|
||||
targets:
|
||||
- generic
|
||||
- opencode
|
||||
dependencies:
|
||||
mcp:
|
||||
- name: sharelatex
|
||||
registry: false
|
||||
transport: sse
|
||||
url: https://sharelatex-mcp.corentic.eu/sse
|
||||
- name: openviking
|
||||
registry: false
|
||||
transport: sse
|
||||
url: https://openviking.corentic.eu/mcp
|
||||
headers:
|
||||
Authorization: Bearer ${OPENVIKING_API_KEY}
|
||||
61
omos/examples/package/team-profile.yaml
Normal file
61
omos/examples/package/team-profile.yaml
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
# team-profile.yaml
|
||||
# Deklaration des empfohlenen Agenten-Teams für das Package job-application.
|
||||
#
|
||||
# Diese Datei gehört dem Package-AUTOR. Sie beschreibt:
|
||||
# - welche Rollen für den fachlichen Workflow sinnvoll sind,
|
||||
# - welche Modellklasse jede Rolle benötigt (abstrakt, keine konkreten IDs),
|
||||
# - 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.
|
||||
|
||||
schema: corentic.team-profile/v1
|
||||
|
||||
id: acme.job-applications
|
||||
description: >
|
||||
Human-in-the-loop-Team zur Recherche, Vorbereitung und Prüfung
|
||||
individueller Bewerbungsunterlagen.
|
||||
|
||||
roles:
|
||||
- id: orchestrator
|
||||
purpose: Zerlegt Aufgaben, delegiert an Spezialisten, integriert Ergebnisse
|
||||
model_class: strong-generalist
|
||||
capabilities:
|
||||
mcps: []
|
||||
skills: [job-application]
|
||||
|
||||
- id: researcher
|
||||
purpose: Sucht und bewertet Stellenausschreibungen gegen das Kandidatenprofil
|
||||
omos_agent: librarian # nutzt OMOS-Builtin 'librarian' mit Alias
|
||||
model_class: fast-research
|
||||
capabilities:
|
||||
mcps: [websearch, webfetch, openviking]
|
||||
skills: [job-application]
|
||||
|
||||
- id: writer
|
||||
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'
|
||||
model_class: strong-writing
|
||||
capabilities:
|
||||
mcps: [openviking, sharelatex]
|
||||
skills: []
|
||||
|
||||
- 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
|
||||
model_class: high-reasoning
|
||||
capabilities:
|
||||
mcps: [openviking]
|
||||
skills: []
|
||||
|
||||
- id: notifier
|
||||
purpose: Informiert den Nutzer über fertige Entwürfe.
|
||||
Versende niemals etwas ohne explizite Nutzerfreigabe.
|
||||
omos_agent: custom # eigener Custom Agent 'notifier'
|
||||
model_class: cheap-reliable
|
||||
capabilities:
|
||||
mcps: []
|
||||
skills: []
|
||||
73
omos/skills/omos-setup/SKILL.md
Normal file
73
omos/skills/omos-setup/SKILL.md
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
---
|
||||
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.
|
||||
allowed-tools:
|
||||
- "Bash(python3 omos/omos.py *)"
|
||||
- "Read"
|
||||
- "Write"
|
||||
- "Edit"
|
||||
- "Glob"
|
||||
---
|
||||
|
||||
# OMOS Setup Skill
|
||||
|
||||
Führt den Nutzer durch: APM-Package mit Team-Profil → lokales Modell-Mapping → gerendertes oh-my-opencode-slim-Preset.
|
||||
|
||||
## 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:
|
||||
|
||||
```
|
||||
Profil: acme.job-applications
|
||||
Rollen: orchestrator → strong-generalist, researcher → fast-research,
|
||||
writer → strong-writing, checker → high-reasoning, notifier → cheap-reliable
|
||||
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.
|
||||
|
||||
Wenn eine Modellklasse fehlt, biete dem Nutzer konkrete Optionen an (verfügbare Modelle aus `~/.config/opencode/opencode.jsonc` auflisten):
|
||||
|
||||
```
|
||||
Für 'high-reasoning' ist kein Modell zugeordnet.
|
||||
1. Vorhandenes Modell wählen (z. B. ollama/qwen3.6:35b-a3b-q4_K_M)
|
||||
2. Neues Provider/Modell in opencode.jsonc konfigurieren
|
||||
3. Abbrechen
|
||||
```
|
||||
|
||||
Nach Auswahl schreibe das Mapping und markiere optional `# selected_by: user`.
|
||||
|
||||
### 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.
|
||||
|
||||
### 4. Rendern
|
||||
|
||||
```bash
|
||||
python3 omos/omos.py render --package <package-dir>
|
||||
```
|
||||
|
||||
Zeige die Ausgabe inklusive Warnungen. Die Datei `.opencode/oh-my-opencode-slim.json` ist generiert – nicht manuell editieren.
|
||||
|
||||
### 5. Aktivieren
|
||||
|
||||
Nutzer anleiten: `opencode` starten → `/preset <team-id>` → Reload. Preset-Wechsel greifen erst nach einem Reload (by Design).
|
||||
|
||||
## Fehlerbehandlung
|
||||
|
||||
| Fehler | Lösung |
|
||||
|---|---|
|
||||
| „Modellklasse X ist nicht gemappt" | Schritt 2: Mapping ergänzen |
|
||||
| „MCP ... nicht in opencode.json konfiguriert" | Schritt 3: MCP einrichten oder Rolle anpassen |
|
||||
| „Kein Team-Profil gefunden" | Pfad prüfen, `--team-file` verwenden |
|
||||
| Ungültiges YAML | Zeile aus Fehlermeldung zeigen |
|
||||
|
||||
## Regeln
|
||||
|
||||
- Niemals selbst Modelle erraten oder zuordnen – immer den Nutzer wählen lassen.
|
||||
- Niemals die generierte `.opencode/oh-my-opencode-slim.json` direkt editieren; Quelle sind Team-Profil + Mapping.
|
||||
- Sicherheitsgrenzen des Packages (MCP/Skill-Allowlists) nur verschärfen, nie aufweichen.
|
||||
Loading…
Add table
Reference in a new issue