Agent-almanac create-glyph
git clone https://github.com/pjt222/agent-almanac
T=$(mktemp -d) && git clone --depth=1 https://github.com/pjt222/agent-almanac "$T" && mkdir -p ~/.claude/skills && cp -r "$T/i18n/de/skills/create-glyph" ~/.claude/skills/pjt222-agent-almanac-create-glyph-dfb704 && rm -rf "$T"
i18n/de/skills/create-glyph/SKILL.mdGlyphe erstellen
R-basierte Piktogramm-Glyphen fuer Skill-, Agent- oder Team-Icons in der
viz/-Visualisierungsschicht erstellen. Jede Glyphe ist eine reine ggplot2-Funktion, die eine erkennbare Form auf einer 100x100-Leinwand zeichnet und mit einem Neon-Glow-Effekt als transparentes WebP gerendert wird.
Wann verwenden
- Ein neuer Skill, Agent oder Team wurde hinzugefuegt und benoetigt ein visuelles Icon
- Eine bestehende Glyphe soll ersetzt oder neu gestaltet werden
- Batch-Erstellung von Glyphen fuer eine neue Skill-Domaene
- Visuelle Metaphern fuer Entitaetskonzepte prototypisieren
Eingaben
- Erforderlich: Entitaetstyp —
,skill
oderagentteam - Erforderlich: Entitaets-ID (z.B.
,create-glyph
,mystic
) und Domaene (fuer Skills)r-package-review - Erforderlich: Visuelles Konzept — was die Glyphe darstellen soll
- Optional: Referenz-Glyphe zum Studium des Komplexitaetsniveaus
- Optional: Benutzerdefinierter
-Wert (Standard: 4)--glow-sigma
Verfahren
Schritt 1: Konzept — Visuelle Metapher entwerfen
Die zu ikonifizierende Entitaet identifizieren und eine visuelle Metapher waehlen.
- Die Quelldatei der Entitaet lesen, um das Kernkonzept zu verstehen:
- Skills:
skills/<id>/SKILL.md - Agents:
agents/<id>.md - Teams:
teams/<id>.md
- Skills:
- Einen Metaphertyp waehlen:
- Konkretes Objekt: ein Kolben fuer Experimente, ein Schild fuer Sicherheit
- Abstraktes Symbol: Pfeile fuer Zusammenfuehrung, Spiralen fuer Iteration
- Zusammengesetzt: 2-3 einfache Formen kombinieren (z.B. Dokument + Stift)
- Bestehende Glyphen als Komplexitaetsreferenz heranziehen:
Complexity Tiers: +----------+--------+-------------------------------------------+ | Tier | Layers | Examples | +----------+--------+-------------------------------------------+ | Simple | 2 | glyph_flame, glyph_heartbeat | | Moderate | 3-5 | glyph_document, glyph_experiment_flask | | Complex | 6+ | glyph_ship_wheel, glyph_bridge_cpp | +----------+--------+-------------------------------------------+
- Einen Funktionsnamen festlegen:
(snake_case, eindeutig)glyph_<beschreibender_name>
Erwartet: Eine klare gedankliche Skizze der Form mit 2-6 geplanten Ebenen.
Bei Fehler: Falls das Konzept zu abstrakt ist, auf ein verwandtes konkretes Objekt zurueckgreifen. Bestehende Glyphen in derselben Domaene zur Inspiration durchsehen.
Schritt 2: Zusammensetzen — Glyphen-Funktion schreiben
Die R-Funktion schreiben, die ggplot2-Ebenen erzeugt.
-
Funktionssignatur (unveraenderlicher Vertrag):
glyph_<name> <- function(cx, cy, s, col, bright) { # cx, cy = center coordinates (50, 50 on 100x100 canvas) # s = scale factor (1.0 = fill ~70% of canvas) # col = domain color hex (e.g., "#ff88dd" for design) # bright = brightened variant of col (auto-computed by renderer) # Returns: list() of ggplot2 layers } -
Skalierungsfaktor
auf ALLE Dimensionen anwenden fuer konsistente Skalierung:* sr <- 20 * s # radius hw <- 15 * s # half-width lw <- .lw(s) # line width (default base 2.5) lw_thin <- .lw(s, 1.2) # thinner line width -
Geometrie mit verfuegbaren Primitives erstellen:
Geometrie Verwendung ggplot2::geom_polygon(data, .aes(x, y), ...)Gefuellte Formen ggplot2::geom_path(data, .aes(x, y), ...)Offene Linien/Kurven ggplot2::geom_segment(data, .aes(x, xend, y, yend), ...)Liniensegmente, Pfeile ggplot2::geom_rect(data, .aes(xmin, xmax, ymin, ymax), ...)Rechtecke ggforce::geom_circle(data, .aes(x0, y0, r), ...)Kreise -
Die Farbstrategie anwenden:
Alpha Guide: +----------------------+------------+--------------------------+ | Purpose | Alpha | Example | +----------------------+------------+--------------------------+ | Large fill (body) | 0.08-0.15 | hex_with_alpha(col, 0.1) | | Medium fill (accent) | 0.15-0.25 | hex_with_alpha(col, 0.2) | | Small fill (detail) | 0.25-0.35 | hex_with_alpha(bright, 0.3) | | Outline stroke | 1.0 | color = bright | | Secondary stroke | 1.0 | color = col | | No fill | --- | fill = NA | +----------------------+------------+--------------------------+ -
Eine flache
von Ebenen zurueckgeben (der Renderer iteriert und umgibt jede mit Glow)list() -
Die Funktion in der passenden Primitives-Datei basierend auf dem Entitaetstyp platzieren:
- Skills: Domaenengruppiert ueber 19 Primitives-Dateien:
— bushcraft, compliance, containerization, data-serialization, defensiveprimitives.R
— devops, general, git, mcp-integrationprimitives_2.R
— mlops, observability, PM, r-packages, reporting, review, web-dev, esoteric, designprimitives_3.R- Weitere
bisprimitives_4.R
fuer neuere Domaenenprimitives_19.R
- Agents:
viz/R/agent_primitives.R - Teams:
viz/R/team_primitives.R
- Skills: Domaenengruppiert ueber 19 Primitives-Dateien:
Erwartet: Eine funktionierende R-Funktion, die eine Liste von 2-6 ggplot2-Ebenen zurueckgibt.
Bei Fehler: Falls
ggforce::geom_circle Fehler verursacht, sicherstellen, dass ggforce installiert ist. Falls Koordinaten nicht stimmen, bedenken, dass die Leinwand 100x100 mit (0,0) unten links ist. Die Funktion interaktiv testen:
source("viz/R/utils.R"); source("viz/R/primitives.R") # etc. layers <- glyph_<name>(50, 50, 1.0, "#ff88dd", "#ffa8f0") p <- ggplot2::ggplot() + ggplot2::coord_fixed(xlim=c(0,100), ylim=c(0,100)) + ggplot2::theme_void() for (l in layers) p <- p + l print(p)
Schritt 3: Registrieren — Entitaet der Glyphe zuordnen
Die Entitaet-zu-Glyphe-Zuordnung in der passenden Glyph-Zuordnungsdatei hinzufuegen.
Fuer Skills:
oeffnenviz/R/glyphs.R- Den Kommentarbereich fuer die Zieldomaene finden (z.B.
)# -- design (3) - Den Eintrag in alphabetischer Reihenfolge innerhalb des Domaenenblocks hinzufuegen:
"skill-id" = "glyph_function_name", - Die Domaenenanzahl im Kommentar bei Bedarf aktualisieren
Fuer Agents:
oeffnenviz/R/agent_glyphs.R- Die alphabetische Position in
findenAGENT_GLYPHS - Den Eintrag hinzufuegen:
"agent-id" = "glyph_function_name",
Fuer Teams:
-
oeffnenviz/R/team_glyphs.R -
Die alphabetische Position in
findenTEAM_GLYPHS -
Den Eintrag hinzufuegen:
"team-id" = "glyph_function_name", -
Sicherstellen, dass keine doppelte ID in der Zielliste existiert
Erwartet: Die entsprechende
*_GLYPHS-Liste enthaelt die neue Zuordnung.
Bei Fehler: Falls der Build spaeter "No glyph mapped" meldet, nochmals pruefen, dass die Entitaets-ID exakt mit der im Manifest und in der Registry uebereinstimmt.
Schritt 4: Manifest — Icon-Eintrag hinzufuegen
Das Icon im passenden Manifest registrieren.
Fuer Skills:
viz/data/icon-manifest.json
{ "skillId": "skill-id", "domain": "domain-name", "prompt": "<domain basePrompt>, <descriptors>, dark background, vector art", "seed": <next_seed>, "path": "public/icons/cyberpunk/<domain>/<skill-id>.webp", "status": "pending" }
Fuer Agents:
viz/data/agent-icon-manifest.json
{ "agentId": "agent-id", "prompt": "<agent-specific descriptors>, dark background, vector art", "seed": <next_seed>, "path": "public/icons/cyberpunk/agents/<agent-id>.webp", "status": "pending" }
Fuer Teams:
viz/data/team-icon-manifest.json
{ "teamId": "team-id", "prompt": "<team-specific descriptors>, dark background, vector art", "seed": <next_seed>, "path": "public/icons/cyberpunk/teams/<team-id>.webp", "status": "pending" }
Erwartet: Gueltiges JSON mit dem neuen Eintrag bei den zugehoerigen Typ-Geschwistern.
Bei Fehler: JSON-Syntax validieren. Haeufige Fehler: nachgestelltes Komma nach dem letzten Array-Element, fehlende Anfuehrungszeichen.
Schritt 5: Rendern — Icon generieren
Die Build-Pipeline ausfuehren, um das WebP zu rendern.
- Zum
-Verzeichnis navigierenviz/ - Basierend auf dem Entitaetstyp rendern:
Fuer Skills:
cd viz && Rscript build-icons.R --only <domain> # Or skip existing: Rscript build-icons.R --only <domain> --skip-existing
Fuer Agents:
cd viz && Rscript build-agent-icons.R --only <agent-id> # Or skip existing: Rscript build-agent-icons.R --only <agent-id> --skip-existing
Fuer Teams:
cd viz && Rscript build-team-icons.R --only <team-id> # Or skip existing: Rscript build-team-icons.R --only <team-id> --skip-existing
- Fuer einen Probelauf zuerst
an einen beliebigen Befehl anhaengen--dry-run - Ausgabeorte:
- Skills:
viz/public/icons/<palette>/<domain>/<skill-id>.webp - Agents:
viz/public/icons/<palette>/agents/<agent-id>.webp - Teams:
viz/public/icons/<palette>/teams/<team-id>.webp
- Skills:
Erwartet: Das Log zeigt
OK: <entity> (seed=XXXXX, XX.XKB) und die WebP-Datei existiert.
Bei Fehler:
— Zuordnung aus Schritt 3 fehlt oder hat einen Tippfehler"No glyph mapped"
— Domaene nicht in"Unknown domain"
inget_palette_colors()palettes.R- R-Paketfehler — Zuerst
ausfuehreninstall.packages(c("ggplot2", "ggforce", "ggfx", "ragg", "magick")) - Falls das Rendering abstuerzt, die Glyphen-Funktion interaktiv testen (siehe Schritt 2 Fallback)
Schritt 6: Verifizieren — Visuelle Inspektion
Die gerenderte Ausgabe auf Qualitaetsstandards pruefen.
-
Datei-Existenz und angemessene Groesse pruefen:
ls -la viz/public/icons/cyberpunk/<type-path>/<entity-id>.webp # Expected: 15-80 KB typical range -
Das WebP in einem Bildbetrachter oeffnen und pruefen:
- Form ist bei voller Groesse (1024x1024) klar erkennbar
- Neon-Glow ist vorhanden, aber nicht uebertrieben
- Hintergrund ist transparent (kein schwarzes/weisses Rechteck)
- Kein Beschnitt an den Leinwandraendern
-
Bei kleinen Groessen pruefen (das Icon wird mit ~40-160px im Force-Graph gerendert):
- Form bleibt erkennbar
- Details werden nicht zu Rauschen
- Glow uebertrifft nicht die Form
Erwartet: Ein klares, erkennbares Piktogramm mit gleichmaessigem Neon-Glow auf transparentem Hintergrund.
Bei Fehler:
- Glow zu stark: mit
neu rendern (Standard ist 4)--glow-sigma 2 - Glow zu schwach: mit
neu rendern--glow-sigma 8 - Form bei kleinen Groessen unlesbar: Glyphe vereinfachen (weniger Ebenen, kraeftigere Striche,
Basiswert erhoehen).lw(s, base) - Beschnitt an Raendern: Formdimensionen reduzieren oder Zentrum verschieben
Schritt 7: Iterieren — Bei Bedarf verfeinern
Anpassungen vornehmen und erneut rendern.
-
Haeufige Anpassungen:
- Kraeftigere Striche:
erhoehen —.lw(s, base)
oderbase = 3.0
versuchen3.5 - Sichtbarere Fuellung: Alpha von 0.10 auf 0.15-0.20 erhoehen
- Formproportionen: Multiplikatoren auf
anpassen (z.B.s
->20 * s
)24 * s - Detail-Ebenen hinzufuegen/entfernen: Gesamtzahl der Ebenen zwischen 2-6 halten fuer beste Ergebnisse
- Kraeftigere Striche:
-
Zum erneuten Rendern nach Aenderungen:
# Delete the existing icon first, then re-render rm viz/public/icons/cyberpunk/<type-path>/<entity-id>.webp # Use the appropriate build command from Step 5 -
Wenn zufriedenstellend, pruefen, ob der Manifest-Status
zeigt (das Build-Skript aktualisiert ihn automatisch bei Erfolg)"done"
Erwartet: Das fertige Icon besteht alle Pruefungen aus Schritt 6.
Bei Fehler: Falls die Glyphe nach 3+ Iterationen immer noch nicht gut lesbar ist, eine voellig andere visuelle Metapher in Betracht ziehen (zurueck zu Schritt 1).
Referenz
Domaenen- und Entitaetsfarbpaletten
Alle 58 Domaenenfarben (fuer Skills) sind in
viz/R/palettes.R definiert (die einzige Quelle der Wahrheit). Agent- und Team-Farben werden ebenfalls in palettes.R verwaltet. Die Cyberpunk-Palette (handabgestimmte Neonfarben) ist in get_cyberpunk_colors(). Viridis-Familienpaletten werden automatisch ueber viridisLite generiert.
Zum Nachschlagen einer Farbe:
source("viz/R/palettes.R") get_palette_colors("cyberpunk")$domains[["design"]] # skill domain get_palette_colors("cyberpunk")$agents[["mystic"]] # agent get_palette_colors("cyberpunk")$teams[["tending"]] # team
Beim Hinzufuegen einer neuen Domaene an drei Stellen in
palettes.R eintragen:
(alphabetisch)PALETTE_DOMAIN_ORDER
Domaenenlisteget_cyberpunk_colors()
ausfuehren, um JSON + JS zu regenerierenRscript generate-palette-colors.R
Glyphen-Funktionskatalog
Den vollstaendigen Katalog verfuegbarer Glyphen-Funktionen in den Primitives-Quelldateien einsehen:
- Skills:
bisviz/R/primitives.R
(domaenengruppiert)viz/R/primitives_19.R - Agents:
viz/R/agent_primitives.R - Teams:
viz/R/team_primitives.R
Hilfsfunktionen
| Funktion | Signatur | Zweck |
|---|---|---|
| | Skalierungsbewusste Linienbreite |
| alias fuer | Kurzform-Aesthetic-Mapping |
| | Alpha zu Hex-Farbe hinzufuegen |
| | Hex-Farbe aufhellen |
| | Hex-Farbe abdunkeln |
Validierungscheckliste
- Glyphen-Funktion folgt der
Signaturglyph_<name>(cx, cy, s, col, bright) -> list() - Alle Dimensionen verwenden den
Skalierungsfaktor* s - Farbstrategie nutzt
fuer Fuellungen,col
fuer Umrisse,bright
fuer Transparenzhex_with_alpha() - Funktion in der korrekten Primitives-Datei fuer Entitaetstyp und Domaene platziert
- Glyphen-Zuordnungseintrag in der passenden
-Datei hinzugefuegt*_glyphs.R - Manifest-Eintrag mit korrekter Entitaets-ID, Pfad und
hinzugefuegt"status": "pending" - Build-Befehl laeuft ohne Fehler (zuerst Probelauf)
- Gerendertes WebP existiert am erwarteten Pfad
- Dateigroesse im erwarteten Bereich (15-80 KB)
- Icon ist bei 1024px und ~40px Anzeiggroessen klar erkennbar
- Transparenter Hintergrund (kein massives Rechteck hinter der Glyphe)
- Manifest-Status nach erfolgreichem Rendern auf
aktualisiert"done"
Haeufige Fehler
vergessen: Hartcodierte Pixelwerte brechen, wenn sich die Skalierung aendert. Immer mit* s
multiplizieren.s- Leinwand-Ursprungsverwirrung: (0,0) ist unten links, nicht oben links. Hoehere
-Werte bewegen sich NACH OBEN.y - Doppelter Glow: Der Renderer wendet bereits
auf jede Ebene an. Keinen Glow INNERHALB der Glyphen-Funktion hinzufuegen.ggfx::with_outer_glow() - Zu viele Ebenen: Jede Ebene bekommt individuelles Glow-Wrapping. Mehr als 8 Ebenen macht das Rendering langsam und visuell unruhig.
- Nicht uebereinstimmende IDs: Die Entitaets-ID in der Glyphen-Zuordnung, im Manifest und in der Registry muessen alle exakt uebereinstimmen.
- JSON-Nachkommas: Das Manifest ist striktes JSON. Kein nachgestelltes Komma nach dem letzten Array-Element.
- Fehlende Domaenenfarbe: Falls die Domaene nicht in
inget_cyberpunk_colors()
ist, wird das Rendering einen Fehler werfen. Zuerst die Farbe hinzufuegen, dann regenerieren.palettes.R - Falsche Primitives-Datei: Skills gehoeren in domaenengruppierte
, Agents inprimitives*.R
, Teams inagent_primitives.R
.team_primitives.R
Verwandte Skills
- enhance-glyph — Visuelle Qualitaet einer bestehenden Glyphe verbessern, Rendering-Probleme beheben oder Detail-Ebenen hinzufuegen
- audit-icon-pipeline — Fehlende Glyphen und Icons erkennen, um zu wissen, was erstellt werden muss
- render-icon-pipeline — Die vollstaendige Rendering-Pipeline von Anfang bis Ende ausfuehren
- ornament-style-mono — Komplementaere KI-basierte Bilderzeugung (Z-Image vs R-codierte Glyphen)
- ornament-style-color — Farbtheorie anwendbar auf Glyphen-Akzentfuellungsentscheidungen
- create-skill — Der uebergeordnete Workflow, der Glyphen-Erstellung ausloest beim Hinzufuegen neuer Skills