refactor: migrate icon fields from emoji to lucide:<name> tokens (#63)
* refactor: migrate icon fields from emoji to lucide:<name> tokens
Every TOML manifest's `icon = "<emoji>"` line is replaced with
`icon = "lucide:<kebab-name>"` — a reference to a lucide-react icon,
which the librefang.ai site and dashboard render as crisp SVG. Reasons
for the switch:
- Emoji render very differently across OS/browser/font stacks; the
registry catalog looked inconsistent from one row to the next.
- Five manifests (clip / creator / linkedin / reddit / twitter) had
their icons stored as literal Python-style escape strings
("\\U0001F3AC") because the TOML parser upstream never decoded
them. Switching away from emoji drops that class of bug entirely.
- As a drive-by, also decode the \\uXXXX accent escapes in the
[i18n.fr] block of hands/creator/HAND.toml so "Créateur" shows
up correctly.
87 files touched. example manifests left untouched (still "TODO").
* fix: backfill i18n name + drop the single-member email category
- Every existing [i18n.<lang>] block now has a `name` field. 60 files
previously translated description but kept the English name
implicitly — which rendered as "some English some Chinese" in the
registry UI. Fill in the missing name from the English brand (or a
known localized equivalent: DingTalk→钉钉, Feishu→飞书, Email→
电子邮件 / メール / E-Mail / Correo / Courriel, and a handful of
hands that have Chinese product names like 视频剪辑 Hand).
- channels/email.toml was the only item under category="email";
reclassify it as "messaging" so the sub-category filter chip list
on the category page isn't littered with singletons.
* feat(i18n): localize 76 agents/integrations/plugins into 7 languages
Adds full [i18n.zh], [i18n.zh-TW], [i18n.ja], [i18n.ko], [i18n.de],
[i18n.es], [i18n.fr] blocks with name + description to every manifest
that previously shipped English-only.
Coverage:
- 32 agents (academic-researcher, analyst, architect, assistant,
code-reviewer, coder, customer-support, data-scientist, debugger,
devops-lead, doc-writer, email-assistant, health-tracker,
hello-world, home-automation, legal-assistant, meeting-assistant,
ops, orchestrator, personal-finance, planner, recipe-assistant,
recruiter, researcher, sales-assistant, security-auditor,
social-media, test-engineer, translator, travel-planner, tutor,
writer)
- 33 integrations (AWS, Azure, Bitbucket, Brave Search, Discord,
Dropbox, Elasticsearch, Exa Search, Fetch, Filesystem, GCP, Git,
GitHub, GitLab, Gmail, Google Calendar, Google Drive, Google Maps,
Jira, Linear, Memory, MongoDB, Notion, PostgreSQL, Puppeteer, Redis,
Sentry, Sequential Thinking, Slack, SQLite, Teams, Time, Todoist) —
brand names kept as-is across all locales, only descriptions
translated.
- 11 plugins (auto-summarizer, context-decay, conversation-logger,
episodic-memory, guardrails, keyword-memory, mempalace-indexer,
sentiment-tracker, todo-tracker, topic-memory, user-profile)
The descriptions are one-line summaries — hand-translated rather than
machine-generated, so technical terms (MCP, PR, CI/CD, etc.) stay
consistent across locales.
* feat(i18n): close remaining per-lang gaps for channels, workflows, devteam
Third pass on i18n coverage. Every non-example manifest now carries a
full set of [i18n.zh], [i18n.zh-TW], [i18n.ja], [i18n.ko], [i18n.de],
[i18n.es], [i18n.fr] blocks.
- 44 channel adapters: added French descriptions (zh/zh-TW/ja/ko/de/es
were already present). Brand names kept as-is in all locales so users
recognize Discord / Slack / LINE / etc. consistently.
- 22 workflows: filled zh-TW / ja / ko / de / es / fr blocks. Each
translation mirrors the existing zh one in structure and tone so the
catalog reads consistently across locales.
- hands/devteam/HAND.toml: added the four langs that were missing
(zh-TW, de, es, fr).
Only the 6 templates under examples/ are left without i18n blocks on
purpose — they still contain "TODO:" placeholders.
This commit is contained in:
159 files changed
+3293
-89
No files matched your search
@@ -6,3 +6,32 @@ author = "librefang"
|
||||
[hooks]
|
||||
ingest = "hooks/ingest.py"
|
||||
after_turn = "hooks/after_turn.py"
|
||||
|
||||
|
||||
[i18n.zh]
|
||||
name = "自动摘要"
|
||||
description = "持续维护会话摘要,帮助 Agent 在长对话中不丢失上下文。"
|
||||
|
||||
[i18n.zh-TW]
|
||||
name = "自動摘要"
|
||||
description = "持續維護會話摘要,幫助 Agent 在長對話中不遺失上下文。"
|
||||
|
||||
[i18n.ja]
|
||||
name = "自動要約"
|
||||
description = "会話の要約を逐次更新し、長い会話でもコンテキストを失わないよう支援。"
|
||||
|
||||
[i18n.ko]
|
||||
name = "자동 요약"
|
||||
description = "진행 중인 대화 요약을 유지하여 긴 대화에서 컨텍스트 손실을 방지."
|
||||
|
||||
[i18n.de]
|
||||
name = "Auto-Zusammenfassung"
|
||||
description = "Pflegt eine laufende Konversations-Zusammenfassung, damit Agenten bei langen Gesprächen den Kontext behalten."
|
||||
|
||||
[i18n.es]
|
||||
name = "Auto-resumen"
|
||||
description = "Mantiene un resumen continuo de la conversación para que los agentes no pierdan contexto en diálogos largos."
|
||||
|
||||
[i18n.fr]
|
||||
name = "Auto-résumé"
|
||||
description = "Maintient un résumé continu de la conversation pour que les agents ne perdent pas de contexte dans les longs échanges."
|
||||
@@ -6,3 +6,32 @@ author = "librefang"
|
||||
[hooks]
|
||||
ingest = "hooks/ingest.py"
|
||||
after_turn = "hooks/after_turn.py"
|
||||
|
||||
|
||||
[i18n.zh]
|
||||
name = "上下文衰减"
|
||||
description = "基于时间的记忆衰减 + 相关性评分,模拟自然遗忘。"
|
||||
|
||||
[i18n.zh-TW]
|
||||
name = "上下文衰減"
|
||||
description = "基於時間的記憶衰減 + 相關性評分,模擬自然遺忘。"
|
||||
|
||||
[i18n.ja]
|
||||
name = "コンテキスト減衰"
|
||||
description = "時間経過に基づく記憶減衰と関連度スコアで自然な忘却を再現。"
|
||||
|
||||
[i18n.ko]
|
||||
name = "컨텍스트 감쇠"
|
||||
description = "시간 기반 기억 감쇠와 관련성 점수로 자연스러운 망각을 구현."
|
||||
|
||||
[i18n.de]
|
||||
name = "Kontext-Verfall"
|
||||
description = "Zeitbasierter Gedächtnisverfall mit Relevanz-Scoring für natürliches Vergessen."
|
||||
|
||||
[i18n.es]
|
||||
name = "Decaimiento de contexto"
|
||||
description = "Decaimiento de memoria basado en el tiempo con puntuación de relevancia para un olvido natural."
|
||||
|
||||
[i18n.fr]
|
||||
name = "Déclin du contexte"
|
||||
description = "Déclin de mémoire basé sur le temps avec scoring de pertinence pour un oubli naturel."
|
||||
@@ -5,3 +5,32 @@ author = "librefang"
|
||||
|
||||
[hooks]
|
||||
after_turn = "hooks/after_turn.py"
|
||||
|
||||
|
||||
[i18n.zh]
|
||||
name = "对话日志"
|
||||
description = "将所有会话写入 JSONL 文件,便于审计、分析与调试。"
|
||||
|
||||
[i18n.zh-TW]
|
||||
name = "對話日誌"
|
||||
description = "將所有會話寫入 JSONL 檔案,便於稽核、分析與除錯。"
|
||||
|
||||
[i18n.ja]
|
||||
name = "会話ロガー"
|
||||
description = "全会話を JSONL に記録し、監査・分析・デバッグに利用。"
|
||||
|
||||
[i18n.ko]
|
||||
name = "대화 로거"
|
||||
description = "모든 대화를 JSONL 파일로 기록하여 감사, 분석, 디버깅에 활용."
|
||||
|
||||
[i18n.de]
|
||||
name = "Konversations-Logger"
|
||||
description = "Protokolliert alle Konversationen in JSONL-Dateien für Audit, Analytics und Debugging."
|
||||
|
||||
[i18n.es]
|
||||
name = "Registro de conversaciones"
|
||||
description = "Registra todas las conversaciones en archivos JSONL para auditoría, analítica y depuración."
|
||||
|
||||
[i18n.fr]
|
||||
name = "Journal de conversations"
|
||||
description = "Enregistre toutes les conversations en JSONL pour audit, analytics et débogage."
|
||||
@@ -6,3 +6,32 @@ author = "librefang"
|
||||
[hooks]
|
||||
ingest = "hooks/ingest.py"
|
||||
after_turn = "hooks/after_turn.py"
|
||||
|
||||
|
||||
[i18n.zh]
|
||||
name = "情景记忆"
|
||||
description = "基于情景的记忆分段与召回,实现跨会话的上下文延续。"
|
||||
|
||||
[i18n.zh-TW]
|
||||
name = "情景記憶"
|
||||
description = "基於情景的記憶分段與召回,實現跨會話的上下文延續。"
|
||||
|
||||
[i18n.ja]
|
||||
name = "エピソード記憶"
|
||||
description = "エピソード単位の記憶セグメンテーションと想起でセッションを跨ぐ文脈継続を実現。"
|
||||
|
||||
[i18n.ko]
|
||||
name = "에피소드 메모리"
|
||||
description = "에피소드 기반 기억 분할과 회상으로 세션 간 컨텍스트 연속성을 제공."
|
||||
|
||||
[i18n.de]
|
||||
name = "Episodisches Gedächtnis"
|
||||
description = "Episodenbasierte Gedächtnissegmentierung und -abruf für sitzungsübergreifenden Kontext."
|
||||
|
||||
[i18n.es]
|
||||
name = "Memoria episódica"
|
||||
description = "Segmentación y recuerdo de memoria por episodios para continuidad de contexto entre conversaciones."
|
||||
|
||||
[i18n.fr]
|
||||
name = "Mémoire épisodique"
|
||||
description = "Segmentation et rappel de mémoire par épisodes pour une continuité de contexte entre conversations."
|
||||
@@ -5,3 +5,32 @@ author = "librefang"
|
||||
|
||||
[hooks]
|
||||
ingest = "hooks/ingest.py"
|
||||
|
||||
|
||||
[i18n.zh]
|
||||
name = "安全护栏"
|
||||
description = "检测潜在有害内容模式,向 Agent 上下文注入警告提示。"
|
||||
|
||||
[i18n.zh-TW]
|
||||
name = "安全護欄"
|
||||
description = "偵測潛在有害內容模式,向 Agent 上下文注入警告提示。"
|
||||
|
||||
[i18n.ja]
|
||||
name = "ガードレール"
|
||||
description = "有害な可能性のあるコンテンツパターンを検出し、Agent のコンテキストに警告を注入。"
|
||||
|
||||
[i18n.ko]
|
||||
name = "가드레일"
|
||||
description = "잠재적으로 유해한 콘텐츠 패턴을 탐지하고 Agent 컨텍스트에 경고를 삽입."
|
||||
|
||||
[i18n.de]
|
||||
name = "Guardrails"
|
||||
description = "Erkennt potenziell schädliche Inhaltsmuster und fügt Warnungen in den Agenten-Kontext ein."
|
||||
|
||||
[i18n.es]
|
||||
name = "Guardrails"
|
||||
description = "Detecta patrones de contenido potencialmente dañinos e inyecta advertencias en el contexto del agente."
|
||||
|
||||
[i18n.fr]
|
||||
name = "Garde-fous"
|
||||
description = "Détecte les motifs de contenu potentiellement nuisibles et injecte des avertissements dans le contexte de l'agent."
|
||||
@@ -5,3 +5,32 @@ author = "librefang"
|
||||
|
||||
[hooks]
|
||||
ingest = "hooks/ingest.py"
|
||||
|
||||
|
||||
[i18n.zh]
|
||||
name = "关键词记忆"
|
||||
description = "从用户消息中抽取关键词与命名实体,作为上下文记忆返回。"
|
||||
|
||||
[i18n.zh-TW]
|
||||
name = "關鍵字記憶"
|
||||
description = "從使用者訊息中抽取關鍵字與命名實體,作為上下文記憶返回。"
|
||||
|
||||
[i18n.ja]
|
||||
name = "キーワードメモリ"
|
||||
description = "ユーザーメッセージからキーワードと固有表現を抽出し、文脈メモリとして返す。"
|
||||
|
||||
[i18n.ko]
|
||||
name = "키워드 메모리"
|
||||
description = "사용자 메시지에서 키워드와 개체명을 추출하여 컨텍스트 메모리로 반환."
|
||||
|
||||
[i18n.de]
|
||||
name = "Keyword-Gedächtnis"
|
||||
description = "Extrahiert Schlüsselwörter und Named-Entities aus Nutzernachrichten und liefert sie als Kontext-Gedächtnis zurück."
|
||||
|
||||
[i18n.es]
|
||||
name = "Memoria por palabras clave"
|
||||
description = "Extrae palabras clave y entidades de los mensajes del usuario y las devuelve como memoria contextual."
|
||||
|
||||
[i18n.fr]
|
||||
name = "Mémoire par mots-clés"
|
||||
description = "Extrait mots-clés et entités nommées des messages utilisateur et les restitue comme mémoire contextuelle."
|
||||
@@ -119,3 +119,32 @@ description = "Prune drawers older than this many days when running hooks/prune.
|
||||
"hooks/ingest.py" = "621b17f2d0afbd6142a49963fb57187a500cfeac057c13cb80961b6222bd03e2"
|
||||
"hooks/after_turn.py" = "1c5bcdade4ca0d785878d60910105208fcff38f74872426ee821363ce5bf9811"
|
||||
"hooks/prune.py" = "2dceeb9bb0d0b7ee224291bfce600f629f38b4a853cd437774d9b66ef226838d"
|
||||
|
||||
|
||||
[i18n.zh]
|
||||
name = "MemPalace 索引器"
|
||||
description = "自动把对话索引进 MemPalace 并召回相关记忆。无需 API key、不依赖云端。"
|
||||
|
||||
[i18n.zh-TW]
|
||||
name = "MemPalace 索引器"
|
||||
description = "自動將對話索引進 MemPalace 並召回相關記憶。無需 API key、不依賴雲端。"
|
||||
|
||||
[i18n.ja]
|
||||
name = "MemPalace インデクサ"
|
||||
description = "会話を MemPalace に自動索引し関連メモリを想起。API キー不要・クラウド不要。"
|
||||
|
||||
[i18n.ko]
|
||||
name = "MemPalace 인덱서"
|
||||
description = "대화를 MemPalace에 자동 색인하고 관련 기억을 회상. API 키 불필요, 클라우드 불필요."
|
||||
|
||||
[i18n.de]
|
||||
name = "MemPalace-Indexer"
|
||||
description = "Indiziert Gespräche automatisch in MemPalace und ruft passende Erinnerungen ab. Ohne API-Keys, ohne Cloud."
|
||||
|
||||
[i18n.es]
|
||||
name = "Indexador MemPalace"
|
||||
description = "Indexa automáticamente las conversaciones en MemPalace y recupera memorias relevantes. Sin API keys ni cloud."
|
||||
|
||||
[i18n.fr]
|
||||
name = "Indexeur MemPalace"
|
||||
description = "Indexe automatiquement les conversations dans MemPalace et rappelle les mémoires pertinentes. Sans clé d'API, sans cloud."
|
||||
@@ -5,3 +5,32 @@ author = "librefang"
|
||||
|
||||
[hooks]
|
||||
ingest = "hooks/ingest.py"
|
||||
|
||||
|
||||
[i18n.zh]
|
||||
name = "情绪追踪"
|
||||
description = "分析用户消息的情绪,并把情感上下文注入 Agent,让回复更贴合情绪。"
|
||||
|
||||
[i18n.zh-TW]
|
||||
name = "情緒追蹤"
|
||||
description = "分析使用者訊息的情緒,並將情感上下文注入 Agent,讓回覆更貼合情緒。"
|
||||
|
||||
[i18n.ja]
|
||||
name = "感情トラッカー"
|
||||
description = "ユーザーメッセージの感情を分析し、感情コンテキストを注入して適切なトーンで応答できるようにする。"
|
||||
|
||||
[i18n.ko]
|
||||
name = "감정 추적기"
|
||||
description = "사용자 메시지의 감정을 분석하여 Agent 컨텍스트에 감정 정보를 주입하고 적절한 어조로 응답하게 함."
|
||||
|
||||
[i18n.de]
|
||||
name = "Sentiment-Tracker"
|
||||
description = "Analysiert die Stimmung von Nutzernachrichten und fügt emotionalen Kontext ein, damit Antworten den passenden Ton treffen."
|
||||
|
||||
[i18n.es]
|
||||
name = "Rastreador de sentimiento"
|
||||
description = "Analiza el sentimiento de los mensajes del usuario e inyecta contexto emocional para que el agente responda con el tono adecuado."
|
||||
|
||||
[i18n.fr]
|
||||
name = "Suivi de sentiment"
|
||||
description = "Analyse le sentiment des messages utilisateur et injecte un contexte émotionnel pour que l'agent réponde avec le bon ton."
|
||||
@@ -6,3 +6,32 @@ author = "librefang"
|
||||
[hooks]
|
||||
ingest = "hooks/ingest.py"
|
||||
after_turn = "hooks/after_turn.py"
|
||||
|
||||
|
||||
[i18n.zh]
|
||||
name = "待办追踪"
|
||||
description = "识别对话中的行动项与任务,持久化保存并作为上下文召回。"
|
||||
|
||||
[i18n.zh-TW]
|
||||
name = "待辦追蹤"
|
||||
description = "辨識對話中的行動項目與任務,持久化保存並作為上下文召回。"
|
||||
|
||||
[i18n.ja]
|
||||
name = "ToDo トラッカー"
|
||||
description = "会話内のアクションアイテム・タスクを検出し、永続化して文脈として呼び戻す。"
|
||||
|
||||
[i18n.ko]
|
||||
name = "할 일 추적기"
|
||||
description = "대화에서 액션 아이템과 작업을 감지해 저장하고 컨텍스트로 회상."
|
||||
|
||||
[i18n.de]
|
||||
name = "Todo-Tracker"
|
||||
description = "Erkennt in Konversationen genannte Action-Items und Aufgaben, speichert sie und ruft sie als Kontext zurück."
|
||||
|
||||
[i18n.es]
|
||||
name = "Rastreador de tareas"
|
||||
description = "Detecta tareas y acciones mencionadas en las conversaciones, las persiste y las recupera como contexto."
|
||||
|
||||
[i18n.fr]
|
||||
name = "Suivi de tâches"
|
||||
description = "Détecte les actions et tâches mentionnées dans les conversations, les persiste et les rappelle comme contexte."
|
||||
@@ -6,3 +6,32 @@ author = "librefang"
|
||||
[hooks]
|
||||
ingest = "hooks/ingest.py"
|
||||
after_turn = "hooks/after_turn.py"
|
||||
|
||||
|
||||
[i18n.zh]
|
||||
name = "话题记忆"
|
||||
description = "按话题召回记忆,结合关键词聚类实现跨会话的上下文关联。"
|
||||
|
||||
[i18n.zh-TW]
|
||||
name = "話題記憶"
|
||||
description = "依話題召回記憶,結合關鍵字分群實現跨會話的上下文關聯。"
|
||||
|
||||
[i18n.ja]
|
||||
name = "トピックメモリ"
|
||||
description = "トピック単位のメモリ想起にキーワードクラスタリングを組み合わせ、セッションを跨ぐ文脈を維持。"
|
||||
|
||||
[i18n.ko]
|
||||
name = "주제 메모리"
|
||||
description = "주제별 기억 회상과 키워드 클러스터링으로 세션 간 컨텍스트를 연결."
|
||||
|
||||
[i18n.de]
|
||||
name = "Topic-Gedächtnis"
|
||||
description = "Themenbewusster Gedächtnisabruf mit Keyword-Clustering für sitzungsübergreifenden Kontext."
|
||||
|
||||
[i18n.es]
|
||||
name = "Memoria por temas"
|
||||
description = "Recuerdo de memoria consciente del tema con agrupamiento de palabras clave para contexto entre conversaciones."
|
||||
|
||||
[i18n.fr]
|
||||
name = "Mémoire par sujets"
|
||||
description = "Rappel de mémoire orienté sujet avec clustering de mots-clés pour un contexte inter-conversations."
|
||||
@@ -6,3 +6,32 @@ author = "librefang"
|
||||
[hooks]
|
||||
ingest = "hooks/ingest.py"
|
||||
after_turn = "hooks/after_turn.py"
|
||||
|
||||
|
||||
[i18n.zh]
|
||||
name = "用户画像"
|
||||
description = "从对话模式中持续构建用户画像,用于个性化的 Agent 回复。"
|
||||
|
||||
[i18n.zh-TW]
|
||||
name = "使用者畫像"
|
||||
description = "從對話模式中持續建立使用者畫像,用於個人化的 Agent 回覆。"
|
||||
|
||||
[i18n.ja]
|
||||
name = "ユーザープロファイル"
|
||||
description = "会話パターンから継続的にユーザープロファイルを構築し、パーソナライズ応答に活用。"
|
||||
|
||||
[i18n.ko]
|
||||
name = "사용자 프로필"
|
||||
description = "대화 패턴에서 지속적으로 사용자 프로필을 구축하여 개인화된 응답에 활용."
|
||||
|
||||
[i18n.de]
|
||||
name = "User-Profil"
|
||||
description = "Persistente Nutzerprofilerstellung aus Konversationsmustern für personalisierte Agent-Antworten."
|
||||
|
||||
[i18n.es]
|
||||
name = "Perfil de usuario"
|
||||
description = "Perfilado persistente del usuario a partir de patrones de conversación para respuestas personalizadas."
|
||||
|
||||
[i18n.fr]
|
||||
name = "Profil utilisateur"
|
||||
description = "Profilage persistant basé sur les motifs de conversation pour des réponses personnalisées."
|
||||
Reference in new issue
Block a user