Fantasia Arbor
vishiri/fantasia-archive
Project Arbor MCP code graph: callers/callees, impact, map, file graph.
Add or change any text a player can see, in every locale the game ships in.
$ npx skills add openfootmanager/openfootmanager --skill add-ui-string -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install openfootmanager/openfootmanager add-ui-string --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/openfootmanager/openfootmanager.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/add-ui-string .claude/skills/add-ui-string && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "add-ui-string" agent skill from https://github.com/openfootmanager/openfootmanager/tree/develop/.claude/skills/add-ui-string into .claude/skills/add-ui-string/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-ui-string", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/openfootmanager/openfootmanager/tree/develop/.claude/skills/add-ui-stringType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add openfootmanager/openfootmanager --skill add-ui-string -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install openfootmanager/openfootmanager add-ui-string --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openfootmanager/openfootmanager.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/add-ui-string .agents/skills/add-ui-string && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "add-ui-string" agent skill from https://github.com/openfootmanager/openfootmanager/tree/develop/.claude/skills/add-ui-string into .agents/skills/add-ui-string/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-ui-string", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add openfootmanager/openfootmanager --skill add-ui-string -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install openfootmanager/openfootmanager add-ui-string --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openfootmanager/openfootmanager.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/add-ui-string .cursor/skills/add-ui-string && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "add-ui-string" agent skill from https://github.com/openfootmanager/openfootmanager/tree/develop/.claude/skills/add-ui-string into .cursor/skills/add-ui-string/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-ui-string", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/openfootmanager/openfootmanager.git --path .claude/skills/add-ui-string--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add openfootmanager/openfootmanager --skill add-ui-string -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install openfootmanager/openfootmanager add-ui-string --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openfootmanager/openfootmanager.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/add-ui-string .gemini/skills/add-ui-string && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "add-ui-string" agent skill from https://github.com/openfootmanager/openfootmanager/tree/develop/.claude/skills/add-ui-string into .gemini/skills/add-ui-string/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-ui-string", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install openfootmanager/openfootmanager add-ui-stringInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add openfootmanager/openfootmanager --skill add-ui-string -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/openfootmanager/openfootmanager.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/add-ui-string .github/skills/add-ui-string && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "add-ui-string" agent skill from https://github.com/openfootmanager/openfootmanager/tree/develop/.claude/skills/add-ui-string into .github/skills/add-ui-string/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-ui-string", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add openfootmanager/openfootmanager --skill add-ui-string -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install openfootmanager/openfootmanager add-ui-string --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openfootmanager/openfootmanager.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/add-ui-string .opencode/skills/add-ui-string && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "add-ui-string" agent skill from https://github.com/openfootmanager/openfootmanager/tree/develop/.claude/skills/add-ui-string into .opencode/skills/add-ui-string/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "add-ui-string", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
add-ui-stringAdd or change any text a player can see, in every locale the game ships in.
Add UI String is an agent skill from openfootmanager/openfootmanager. Add or change any text a player can see, in every locale the game ships in. Covers the full procedure — en.json first, real translations for the rest, INTENTIONALSAME.json only where a term genuinely does not translate, then the two vitest gates. Use for frontend strings and for Rust-side message keys.
Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering Translation, Unit testing and Internationalization. It works with Rust, Vitest, Tauri and Model Context Protocol. The repository describes itself as: An open source soccer/football manager game. The licence is GPL-3.0.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4615fc5. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadEditWriteGrepGlobBash(npm exec --no -- vitest run src/i18n)Bash(npm exec --no -- vitest run src/utils)Bash(npm run audit:i18n)From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Add UI String loads about 2.6k tokens when it runs. Until then it costs about 80 tokens; SKILL.md has 1,341 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from openfootmanager/openfootmanager at commit 4615fc5, republished under its GPL-3.0 licence (© openfootmanager). 1,341 words, ~2,605 tokens.
.claude/skills/add-ui-string/SKILL.md (or your agent's skills folder).Follow the root Code quality section; use i18n-auditor for translation review and
ui-accessibility-reviewer for changed accessible names. /write-tests and ofm-test-reviewer
(programme PR 2) provide scenario and regression evidence; locale coverage alone does not prove wiring.
OpenFoot Manager ships in 12 locales. A string that exists only in English is a broken build, not a TODO. This is the project's most frequently violated rule, so follow the steps in order and finish with the tests.
That is the test, and it is narrower than "a human will read it". If the answer is yes — anywhere in the UI, or a backend error the UI surfaces — this skill applies and the string needs all 12 locales.
If the only reader is an AI agent (the MCP server's tool output) or a modder at a terminal
(ofm-cli output and its scaffold templates, docs/), it stays English and this skill does not
apply. The boundary inside the MCP server: its own private errors reach only the agent, through
tools.rs::err_result. But an MCP function that propagates an error from a shared application::
service which also backs a Tauri command (such as application::live_match::*) must keep the
be.error.* key, because the UI shows that error on the Tauri path.
Getting this wrong in the cautious direction is not free — a key no player will ever see still costs
twelve translations and a row in every locale file, forever. Root CLAUDE.md rule 2 has the table;
if a surface is genuinely ambiguous, ask.
Source of truth: SUPPORTED_LANGUAGES in src/i18n/index.ts.
| Code | Language | Code | Language | |
|---|---|---|---|---|
en | English (source) | ru | Russian | |
es | Spanish | pt-BR | Brazilian Portuguese | |
pt | Portuguese | zh-CN | Simplified Chinese | |
fr | French | cs | Czech | |
de | German | tr | Turkish | |
it | Italian | id | Indonesian |
Files: src/i18n/locales/<code>.json.
If SUPPORTED_LANGUAGES and this table ever disagree, src/i18n/index.ts wins — read it. It has
grown before and will again: id was the twelfth, added in August 2026.
This file and src/CLAUDE.md are the only two that state a count, because they are the only two
that carry the list. The rest of the repository's docs say "every locale" on purpose: when id
was added, a dozen files were left claiming eleven. Keep it that way.
# Is this string, or something close, already translated?
grep -rn "the exact english text" src/i18n/locales/en.jsonKeys are nested and namespaced by feature (squad.*, tactics.*, transfers.*, news.*,
settings.*). Put the new key where its siblings live. Reusing an existing key beats adding a
near-duplicate — but do not reuse a key across contexts where a translator would need
different wording (a noun label and a button verb are different keys even when English collapses
them).
en.json firstEnglish is the source. Every other locale is validated against its key set.
Use interpolation for anything dynamic — never build a sentence by concatenating translated fragments, because word order differs by language:
// wrong — unassemblable in German or Turkish
"signedFor": "signed for",
// right
"signedFor": "{{player}} signed for {{team}} for {{fee}}"Pluralisation uses i18next suffixes (_one, _other, and the extra forms ru and cs need).
If a count is involved, check how an existing pluralised key in en.json is written and match it.
Add the same key path to cs, de, es, fr, id, it, pt, pt-BR, ru, tr, zh-CN.
{{player}} stays {{player}}; only the
surrounding text and the word order change.pt and pt-BR are genuinely different — European vs Brazilian vocabulary (relvado vs
gramado, equipa vs time). Don't copy one into the other.zh-CN is Simplified Chinese. The font stack in src/App.css has CJK fallbacks — don't remove
them.Most of these languages choose between a familiar and a polite second person — du/Sie,
tu/vous, ty/vy, kamu/Anda, 你/您 — and that choice is not yours to make one string at a
time. Each file has already made it. A string in the wrong register reads to a native speaker the
way a stranger using your first name does: not wrong, exactly, but written by someone who wasn't
paying attention.
Read four or five neighbouring values in the namespace you are editing, and copy their form.
Do not instead count pronouns across the whole file and follow the majority. Those counts are
dominated by third-person text about players rather than text to the manager, and the markers
are ambiguous in both directions. Spanish su is "his" far more often than polite "your". And a
capital Sie only means formal "you" mid-sentence — at the start of one, where German capitalises
regardless, de.json also uses it for "they" and for "it". One string carries the whole problem:
transfers.transferFeedbackCounterHeadline
"Sie wollen mehr, bevor sie einschlagen." // They want more before shaking hands.Both pronouns are the same word meaning the same thing — the club on the other side of the deal.
Only sentence position capitalises the first. A grep for Sie counts one of them as formal
address and misses the other entirely.
Register follows who is speaking, which is why one file can hold both forms correctly. In
de.json, a journalist's question under match.press.* is formal (Sie, throughout); a menu
label, and the dialogue options the manager picks under be.msg.playerEvent.options.*, are
familiar (du). Neither of those is a bug.
Elsewhere in de.json the two forms are genuinely tangled — board correspondence under
be.msg.* mixes them from one letter to the next. That is unresolved, not a pattern to copy: if
the keys around yours disagree with each other, say so rather than picking one silently.
⚠️ A polite form can force you to guess the manager's gender. Formal Czech takes a plural
auxiliary but keeps the participle singular and gendered: uspořádal jste says the manager is a
man, uspořádala jste says she is a woman, and the game does not know. Rephrase so that nobody is
the subject — Tisková konference dnes už proběhla, a press conference has already taken place
today. Any locale that agrees a verb or adjective with the person being addressed can spring this.
INTENTIONAL_SAME.json — only for terms that truly don't translatesrc/i18n/INTENTIONAL_SAME.json allowlists keys whose value is legitimately identical to English:
proper nouns, competition names, position abbreviations like GK. Entries are keyed by locale
code, or global for all of them.
This is an escape hatch for linguistics, not for unfinished work. If you find yourself adding several keys at once, you are using it wrong.
Rust never emits English text for the player. It emits a translation key, and the frontend resolves it:
src/utils/backendI18n.ts — the main mappingsrc/utils/backendI18nPlayerEvents.ts — player event messagessrc/utils/backendI18n.legacy.ts — keys kept for old savesSo a new inbox message or news headline generated in ofm_core means: emit the key on the Rust
side, map it in backendI18n.ts if the mapping isn't automatic, and add the key to every locale
file. src/utils/backendI18n.localeCoverage.test.ts covers this half.
npm exec --no -- vitest run src/i18n # localeCoverage + frontendKeyCoverage + index
npm exec --no -- vitest run src/utils # backendI18n coverage, if you touched backend keyslocaleCoverage.test.ts — every locale has every en.json key, and no locale silently copies
the English string (outside INTENTIONAL_SAME.json).frontendKeyCoverage.test.ts — every literal t("…") key in src/ exists in en.json. It
parses the TypeScript AST, so typo'd keys fail too.Then the advisory sweep:
npm run audit:i18nThis command always exits 0. It is a heuristic reporter over both src/ and src-tauri/;
read its output and check whether any candidate it lists is a string you just added. A clean run
is not a pass — the vitest gates are.
src/i18n/locales/en.json, in the right namespacept and pt-BR translated separatelyINTENTIONAL_SAME.json touched only for genuinely untranslatable termssrc/utils/backendI18n*.ts if applicablenpm exec --no -- vitest run src/i18n greennpm run audit:i18n output read, not just runaria-label uses a translated string, not a hardcoded one© openfootmanager, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/add-ui-string of openfootmanager/openfootmanager.
Open the folder on GitHubat commit 4615fc5
Add UI String next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Add UI String this skillopenfootmanager/openfootmanager | 1.1k | — | ~2.6k | Automated safety check: Pass | GPL-3.0 | |
| Fantasia Arborvishiri/fantasia-archive | 409 | — | ~528 | Automated safety check: Pass | GPL-3.0 | |
| Update TranslationsRaicuparta/rai-pal | 732 | — | ~839 | Automated safety check: Pass | GPL-3.0 | |
| Adding LLM MCP ToolsTriliumNext/Trilium | 38k | — | ~2.5k | Automated safety check: Pass | AGPL-3.0 | |
| Rocketmq Rust Issue Generatormxsm/rocketmq-rust | 1.5k | — | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| Playwright Testingchongdashu/vibejam-starter-pack | 149 | — | ~2.2k | Automated safety check: Pass | None |
vishiri/fantasia-archive
Project Arbor MCP code graph: callers/callees, impact, map, file graph.
Raicuparta/rai-pal
A skill your agent uses when asked to update translations, localize strings, add new languages, fix missing translation keys, or sync language files in this project.
TriliumNext/Trilium
A skill your agent uses when adding, changing, or reviewing an LLM/MCP tool in Trilium (the defineTools definitions under packages/trilium-core/src/services/llm/tools/ —…
mxsm/rocketmq-rust
A skill your agent uses when the user asks to create, draft, prepare, or publish a GitHub issue for the rocketmq-rust project — bugs, features, enhancements, refactors, docs, unit tests, CI…
chongdashu/vibejam-starter-pack
Plan, implement, and debug frontend tests: unit/integration/E2E/visual/a11y.
ansible/ansible-ui
Write, run, and debug Playwright E2E / integration / live tests.
openfootmanager/openfootmanager
Add a field to a domain type so it survives save/load. An agent skill from openfootmanager/openfootmanager.
openfootmanager/openfootmanager
Add a tool to the MCP server that lets AI agents play OpenFoot Manager.
openfootmanager/openfootmanager
Expose new backend behaviour to the frontend over Tauri IPC.
openfootmanager/openfootmanager
Build a new frontend component, panel, dashboard tab, or screen that matches the Matchday design language, works in light and dark, is keyboard and screen-reader accessible, reuses existing…
openfootmanager/openfootmanager
Verify a pull request with the frontend scripts, default and MCP backend tests and clippy, formatting, architecture checks and review evidence.
Works with
Add or change any text a player can see, in every locale the game ships in. Add UI String is an agent skill from openfootmanager/openfootmanager. Add or change any text a player can see, in every locale the game ships in.
Add UI String fits situations like: frontend strings and for Rust-side message keys; tasks that involve Translation; tasks that involve Unit testing.
Run `npx skills add openfootmanager/openfootmanager --skill add-ui-string -a claude-code`. Or copy the skill folder (.claude/skills/add-ui-string in openfootmanager/openfootmanager) into .claude/skills/add-ui-string in your project. Claude Code loads it when a task matches its description.
Run `npx skills add openfootmanager/openfootmanager --skill add-ui-string -a codex`. Or copy the skill folder (.claude/skills/add-ui-string in openfootmanager/openfootmanager) into .agents/skills/add-ui-string in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add openfootmanager/openfootmanager --skill add-ui-string -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-ui-string, .gemini/skills/add-ui-string, .github/skills/add-ui-string and .opencode/skills/add-ui-string in your project.
Going by SKILL.md and its folder, Add UI String needs the command-line tools its instructions call (npm). Its frontmatter pre-approves these tools: Read, Edit, Write, Grep, Glob, Bash(npm exec --no -- vitest run src/i18n), Bash(npm exec --no -- vitest run src/utils), Bash(npm run audit:i18n).
SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Add UI String is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Add UI String: Fantasia Arbor (vishiri/fantasia-archive, 409 stars), Update Translations (Raicuparta/rai-pal, 732 stars), Adding LLM MCP Tools (TriliumNext/Trilium, 38k stars) and Rocketmq Rust Issue Generator (mxsm/rocketmq-rust, 1.5k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
openfootmanager (a GitHub organization) maintains it in openfootmanager/openfootmanager, which has 1,135 GitHub stars. The repository holds 6 skills in this directory. The repository was last updated on October 7, 2026.
Source: openfootmanager/openfootmanager on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.