| name | announcement |
| description | Add a new announcement to all 5 JSON files with auto-translation, commit, and tag. Use when adding announcements, writing update notices, or posting new content. |
Announcement Workflow
Step 1 โ Gather Input
Ask the user for:
- Korean title (
kr_title)
- Korean body (
kr_body)
- Date โ default today
YYYY-MM-DD if not provided
- expiresAt (
YYYY-MM-DD) โ optional, skip if not provided
- permanent (
boolean) โ optional, skip if not provided
Step 2 โ Generate ID
Format: {date}-{NN} where NN is a zero-padded 2-digit incremental counter.
The date used in the ID depends on announcement type:
- Regular announcements: Use the provided date (or today)
- Permanent announcements: Use
1970-01-01
To determine NN:
- Read
static/data/announcements.json
- Search the entire array for entries whose
id starts with the target date prefix
- If matches exist, increment the highest counter; otherwise start at
01
- Example: existing
"1970-01-01-01" โ new permanent ID is "1970-01-01-02"
Step 3 โ Refine Korean Text
Before translating, refine the raw Korean input to match the tone and style of existing announcements:
- Read recent entries in
static/i18n/KR/announcements.json to learn the established style
- Read the term dictionary at
.claude/skills/announcement/terms.csv and correct any game terms to their canonical Korean forms (e.g., EGO ๊ธฐํํธ โ E.G.O ๊ธฐํํธ)
- Rewrite
kr_title and kr_body to match that style (sentence structure, formality, formatting)
- Present the refined Korean text to the user for approval before proceeding to translation
Do NOT proceed to translation until the user approves the refined Korean text.
Step 4 โ Translate
Read the term dictionary at .claude/skills/announcement/terms.csv (if not already read in Step 3).
It contains canonical translations for:
- Sinner names (12 characters)
- Game terms: ์ธ๊ฒฉ โ Identity/ไบบๆ ผ/ไบบๆ ผ, E.G.O ๊ธฐํํธ โ E.G.O Gifts/E.G.Oใฎใใ/E.G.O้ฅฐๅ, E.G.O
- Mirror dungeon names (mirrors 1โ7)
- Difficulty modes: ๋
ธ๋ง/Normal/ใใผใใซ/ๆฎ้, ์ด๋ ค์/Hard/ใใผใ/ๅฐ้พ, ํํ์ค์ฒฉ, etc.
For in-game terms like identity names, EGO names, and EGO gift names โ read the subsection.
Translate kr_title and kr_body into EN, CN, JP using the dictionaries above for all game-specific terms. Use natural-sounding language for surrounding prose.
In-game term syntax
In the input, [[{category}:{name}]] marks an in-game term. Find its id or internal representation in the KR i18n files, then use that key to look up translations in EN/JP/CN.
| Category | Lookup file (static/i18n/KR/) | Key format |
|---|
id | identityNameList.json | numeric id |
ego | egoNameList.json | numeric id |
gift | egoGiftNameList.json | numeric id |
keyword | battleKeywords.json | PascalCase id |
themepack | themePack.json | numeric id |
trait | plannerKeywords.json | PascalCase id (matched on label) |
Example: [[keyword:๋ถํ]] โ search battleKeywords.json for entry with "name" containing ๋ถํ โ find key ChargeLoad โ look up ChargeLoad in EN/JP/CN battleKeywords.json โ ๋ถํ/Load/่ฒ ่ท/่ฝฝ่ท
Trait example: [[trait:์์ง]] โ search plannerKeywords.json for entry whose "label" is ์์ง โ find key AccelBullet โ look up AccelBullet in EN/JP/CN plannerKeywords.json โ ์์ง/The Thumb/่ฆชๆ/ๆๆ. (๊ฑฐ๋ฏธ์ง โ SojiRyoshuEntangle โ The House of Spiders/่่ใฎๅทฃ/่่ๅทข.)
Step 5 โ Write All 5 Files
Read each file before editing. JSON must remain valid (no trailing commas).
static/data/announcements.json
Regular announcements: Prepend a new object at index 0 (newest-first):
{
"id": "<generated-id>",
"date": "<date>"
}
Permanent announcements: Append at the end of the array. Use date 1970-01-01.
{
"id": "<generated-id>",
"date": "1970-01-01",
"permanent": true
}
Include "expiresAt": "<date>" only if provided.
Include "permanent": true only if provided.
static/i18n/KR/announcements.json
Add key "<id>": { "title": "<kr_title>", "body": "<kr_body>" } alongside existing entries.
static/i18n/EN/announcements.json
Add key "<id>": { "title": "<en_title>", "body": "<en_body>" }.
static/i18n/CN/announcements.json
Add key "<id>": { "title": "<cn_title>", "body": "<cn_body>" }.
static/i18n/JP/announcements.json
Add key "<id>": { "title": "<jp_title>", "body": "<jp_body>" }.
Step 6 โ Commit and Tag
- Commit in static submodule (on
main):
cd static
git add data/announcements.json i18n/KR/announcements.json i18n/EN/announcements.json i18n/JP/announcements.json i18n/CN/announcements.json
git commit -m "data: add <date> announcement"
- Commit submodule ref in supermodule (on
dev):
cd ..
git add static
git commit -m "data: add <date> announcement"
- Tag the supermodule commit with format
v{YY}{MM}{DD}:
git tag v<YYMMDD>
Example: date 2026-04-01 โ tag v260401.
If the tag already exists (multiple announcements same day), append a sequential suffix: v260401-2.
Step 7 โ Push
Push the static submodule first, then the supermodule dev branch, then the tag. Submodule must go first so the pointer resolves for anyone pulling.
git -C static push origin main
git push origin dev
git push origin v<YYMMDD>
Step 8 โ Confirm
List all 5 files changed, display the generated ID and tag name.