i18n-studio/SKILL.md
--- name: i18n-studio description: This skill should be used when editing, translating, or reviewing an Astro-style i18n string corpus (files of the form export default { en: {...}, ru: {...} } under src/i18n/strings), or when the user wants to fill in missing translations, audit coverage, accept/review translations, propagate an edit across duplicate strings, get translation candidates, bulk-edit UI microcopy, or open a visual/keyboard translation editor. Drives the standalone i18n Studio tool
npx skillsauth add glebis/claude-skills i18n-studioInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
i18n Studio edits Astro-style i18n string files safely: files shaped like
export default { en: {...}, ru: {...} } where leaves are UI strings. It writes
one string literal at a time through a ts-morph AST, so every save is a minimal
one-line diff with all surrounding formatting preserved, and a running dev server
hot-reloads. It also produces Claude translation candidates that preserve HTML
tags and tone.
Use it instead of hand-editing .ts string files with Edit/sed: manual edits
risk formatting churn, broken quoting/escaping, and desynced languages. The AST
layer avoids all three.
Applies to any repo whose translations follow the export default { <lang>: {...} }
convention, not one specific project.
The tool defaults to <cwd>/src/i18n/strings. Confirm the real location before
starting (it may differ):
ls src/i18n/strings 2>/dev/null || find . -path '*/i18n/strings' -type d -not -path '*/node_modules/*' | head
Use that path as --dir below. Ensure the tool is installed once:
cd ~/ai_projects/i18n-studio && npm install.
Start it in the background, pointed at the target strings dir, and wait until it is reachable:
node ~/ai_projects/i18n-studio/server.mjs --dir "$PWD/src/i18n/strings" --port 4331 &
until curl -sf http://localhost:4331/api/strings >/dev/null; do sleep 0.5; done
Pass --langs en,ru,de if the corpus has languages beyond the en,ru default,
and --voice "<one-line tone brief>" to steer suggestion style. Stop it with
kill %1 (or the printed PID) when finished.
For a human to edit visually, start the server the same way and share the URL
(http://localhost:4331); do not try to click the web UI programmatically.
scripts/i18n.mjs (dependency-free, Node 18+) wraps the API. Point it at the
server with I18N_URL if the port is not 4331.
S=~/ai_projects/claude-skills/i18n-studio/scripts/i18n.mjs
node "$S" audit --to ru # status breakdown + untranslated/missing
node "$S" audit --to ru --pending # also list translated-but-unaccepted
node "$S" get Hero.ts en h1 # read a value
node "$S" suggest Hero.ts h1 --from en --to ru # 3 candidates (proposals only)
node "$S" set Hero.ts ru h1 "Сначала — результат" # AST-safe write (→ pending)
node "$S" accept Hero.ts ru h1 # mark reviewed/accepted
node "$S" unaccept Hero.ts ru h1 # back to pending
node "$S" ignore Dream.ts ru s2 # mark n/a — "doesn't need translation"
node "$S" unignore Dream.ts ru s2 # back to untranslated/pending
Typical translation-fill loop: audit --to <lang> to see the breakdown and gaps →
for each gap, suggest from the source language → review the candidate (see rules
below) → set the chosen value → accept once it is right.
Acceptance is a durable review state (sidecar .i18n-status.json); editing a
value automatically drops it back to pending. A cell can instead be marked n/a
("doesn't need translation" — a name, a fragment, a shared token): ignore drops
it out of the untranslated/pending gap counts so it stops nagging, and — unlike
accept — works on an empty/untranslated cell. Like acceptance it is value-coupled,
so translating the cell later re-surfaces it. For a human reviewer, the fullscreen
review mode (below) is faster than the CLI.
The raw routes (GET /api/strings, POST /api/save, POST /api/suggest), data
shapes, dot-path rules, config flags, and a no-server library path are documented
in references/api.md. Read it before doing anything beyond the CLI above.
For a human, the browser UI is the fast path. Start the server, share the URL, and point out:
×N). The n/a
toggle marks a string as not needing translation — it works even on empty cells and
removes them from the untranslated queue.review ▸): steps through the filtered set one at a time,
fully keyboard driven with a visible legend — ←/→ or j/k move, a accept &
next, p pending, i mark n/a & next, e edit, s suggest, 1/2/3 apply a suggestion, u undo,
Esc close, > focus. Tab lands on the edit field; clicking the file name
filters the list to that file. This is the tool for grinding through thousands.Shift + .): hides all chrome, leaving only the strings.set, verify the candidate keeps the
same HTML tags and entities as the source (<b>, <span ...>, , ',
—) in the same positions, and does not translate code identifiers or
proper nouns. Suggestions are proposals, not decisions.${...} come back editable: true, interp: true (badged ${…}); translate
the prose but keep every ${...} placeholder exactly. Only non-string leaves
(numbers, identifiers) stay read-only and must be edited in the .ts source.weeks.2.sessions.1.t.development
--- name: agency-docs-updater description: End-to-end pipeline for publishing Claude Code lab meetings. Accepts optional args: date (YYYYMMDD, "yesterday", "today") and lab number (e.g. "04"). Examples: "yesterday 04", "20260420 05", "04" (today, lab 04), "" (today, auto-detect lab). --- # Agency Docs Updater Execute ALL steps automatically in sequence. Only pause if a step fails and cannot be recovered. Read `references/learnings.md` before starting for known pitfalls. **Configuration**: pat
tools
This skill should be used when applying proper typography to prose text or files in Russian, English, German, or French — smart quotes per locale («ёлочки», “curly”, „Gänsefüßchen“, « guillemets »), correct dashes (тире, em/en dash, Gedankenstrich, tiret), non-breaking spaces, ranges, ellipsis, and French espaces insécables before ! ? ; :. Fully deterministic via a pinned typograf-based CLI; never apply these rules by hand. Triggers on "типографика", "typograf", "оттипографь", "smart quotes", "fix typography", "неразрывные пробелы".
development
This skill should be used when inspecting or applying advanced OpenType features of a font (woff2/otf/ttf) — ligatures, stylistic sets (ss01–ss20), character variants (cvXX), texture healing, slashed zero, tabular/oldstyle figures, fractions, small caps, case-sensitive forms — and generating the CSS to enable them. Interviews the user via cenno to pick features. Triggers on "OpenType features", "font features", "stylistic sets", "ligatures", "texture healing", "tabular figures", "what can this font do".
tools
--- name: pre-session-portrait description: Build a compressed, visualizable "portrait" of a consulting/coaching client before a session, so the paid hour is spent solving, not scoping. Runs a 7-lens JTBD-inspired interview (where / how / what / problem / ideal / tension / jobs-to-be-done) that takes rich open answers in and compresses them to an 11-field YAML portrait out. Delivers three ways: raw paste-into-a-clean-chat prompt, a secret GitHub gist link, or a Codex CLI one-liner. Use when prep