一键导入
add-season
Add a new Season (tier-format spirit trees) — season entry, guide + season spirits, tier-based spirit trees, tiers, nodes, items, IAPs and shops.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Add a new Season (tier-format spirit trees) — season entry, guide + season spirits, tier-based spirit trees, tiers, nodes, items, IAPs and shops.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Add a new instance of an existing (recurring) event — instance, spirit, tree, nodes, items, IAPs and shops.
Add or edit a cosmetic/item in the dataset — fields, types, groups, image links, ids and guids.
Add a Special Visit (Returning Spirits) — visit entry, per-spirit join entries, spirit trees, nodes and items.
Add a Traveling Spirit
| name | add-season |
| description | Add a new Season (tier-format spirit trees) — season entry, guide + season spirits, tier-based spirit trees, tiers, nodes, items, IAPs and shops. |
| disable-model-invocation | true |
Task: Add a new Season (e.g. "Season of Carnival") to the data files, wiring up every related entity: season → spirits (guide + season spirits) → spirit trees → spirit tree tiers → nodes → items, plus the season's real-money IAPs (premium packs) and the shops that sell them.
New season spirit trees use the tier format (the layout is described by spirit-tree-tiers
rows, not by n/nw/ne node links). This is the format used by all recent seasons
(Migration, Lightmending, Carnival) — prefer it unless the user says otherwise.
The user provides:
Season of Carnival) and its short name (e.g. Carnival).date, endDate as YYYY-MM-DD) and year.src/assets/** only. Never touch generated files in /assets/**.guid with npx nanoid -s 10 (length 10). guids must be globally
unique — the build aborts on duplicates.YYYY-MM-DD strings resolved on America/Los_Angeles. Don't convert to UTC.number on the season — although ISeason.number is required, the resolver
assigns it automatically (season order). year is set in the data.season on spirits or items — the resolver links spirit.season /
item back to the season via season.spirits[] and the tree chain.src/interfaces/*.interface.ts before writing each entity and match the
actual field names. The shapes below are a guide, not a substitute for checking.// #region <Year> / // #region <Season> /
// <Spirit Name> grouping of the neighbouring entries in each file. Follow the file's
local one-line vs. multi-line style.A tier-format season spans up to eight source files. The season is one output folder → file; subfolders are organizational only.
| File | What it holds |
|---|---|
src/assets/seasons/seasons.jsonc | The season itself; its spirits array holds spirit guids (guide first, then season spirits in tree order), and its shops array holds shop guids (IAP shops). |
src/assets/spirits/seasons/<season>.jsonc | One entry per spirit (guide + season spirits); each has tree = spirit-tree guid. New file per season. |
src/assets/spirit-trees/seasons/seasons.jsonc | One tree per spirit under a new // #region <Season>: { "guid": "<tree>", "tier": "<root-tier-guid>" }. |
src/assets/spirit-tree-tiers/seasons/<season>.jsonc | The tier chain for every spirit's tree. New file per season. |
src/assets/nodes/seasons/<season>.jsonc | The node entries referenced by the tier rows. New file per season. |
src/assets/items/seasons/<season>.jsonc | The new cosmetics/items the nodes and IAPs unlock. New file per season. |
src/assets/iaps/seasons/<season>.jsonc | The season's real-money premium packs (IIAP). New file per season (only if the season has IAPs). |
src/assets/shops/seasons/<season>.jsonc | The shops (IShop) that sell those IAPs, referenced by the season's shops. New file per season (only if the season has IAPs). |
Reference chains (resolved in src/resolver.ts):
season.spirits[] → spirit → spirit.tree → tree.tier → tier chain (via next) →
tier.rows[][] → node → node.item.season.shops[] → shop → shop.iaps[] → iap.items[] → item.Use the season slug (kebab-case short name, e.g. carnival) for the per-season file names
(nodes, items, tiers, spirits, iaps, shops).
Fetch every wiki page with Playwright MCP — browser_navigate to the URL, then
browser_snapshot to read the rendered page. This is the tried-and-tested approach; the
fandom wiki renders spirit trees and infoboxes client-side, so plain HTTP fetches miss data.
Do not fall back to WebFetch, curl, or the fandom api.php — they are unreliable for
this wiki and are not permitted here. If Playwright MCP is not available in the session, stop
and ask the user to enable it rather than substituting another fetch method.
browser_navigate to the season wiki link, then browser_snapshot. Read: season dates,
icon/image URLs, and the list of season spirits (including the season guide), in
order, each linking to its own spirit page.browser_navigate + browser_snapshot and read the spirit tree: the cosmetics/items it unlocks, the tree
layout (which nodes sit in which rows / spurs), and the cost of each node
(candles c, hearts h, seasonal candles sc, seasonal hearts sh, ascended candles
ac, etc. — see ICost in src/interfaces/).sh/Season-Pass reward
nodes handled by the trees).The season guide page frequently renders its tree as two separate wiki tables that must be read as one combined tree:
sh) Ultimate Gifts, and the
Season Pass reward. This table usually ends in a Total: N + SP summary row (drop that
row — it is a total, not a node).Combine them into the single tier chain like this:
next).Model the whole guide as one spirit with one tier chain (not two trees). If a page's layout is unclear or the two tables don't align cleanly, confirm the combined layout with the user before writing.
Create src/assets/items/seasons/<season>.jsonc (a JSONC array) and add every new cosmetic
unlocked across all the season's trees and its IAP packs (Step 7), following the
add-item skill for the item data model, ids, image links and conventions. IAP cosmetics
are items too — add them here, then reference their guids from the IAPs. Season-specific notes:
group (ItemGroup) only by availability, not by "it's an IAP": use "Limited"
only for items not planned to return (collab / limited-time). IAP cosmetics that the wiki
says are available permanently get no group. Match neighbouring items.season on the item (this holds for tree items and IAP items).type: "Special" filler nodes — include them if the trees have them.Create src/assets/nodes/seasons/<season>.jsonc (a JSONC array). Add one INode per tree
position, grouped by a // <Spirit Name> comment per spirit (guide first).
n/nw/ne links — the tier rows (Step 4) define the
layout. Each node is { "guid": "<new>", "item": "<item-guid>", <cost fields> }.c/h/sc/sh/ac/…). Free nodes omit cost fields.item references the item guid from Step 2 (omit for pure-currency/special nodes without a
cosmetic, if any).Create src/assets/spirit-tree-tiers/seasons/<season>.jsonc (a JSONC array). Build the tier
chain for every spirit, grouped by a // <Spirit Name> comment (guide first).
Each ISpiritTreeTier is:
{
"guid": "<new-tier-guid>",
"next": "<next-tier-guid>", // omit on the last tier of a spirit's chain
"rows": [
["<node>", "<node>", "<node>"], // up to 3 columns; use null for empty cells
[null, null, "<node>"]
]
}
Rules:
guid, next, and rows appear in the source — the resolver derives prev/root/
tree from next and the tree reference.rows hold the node guids from Step 3. Each row is a [INode?, INode?, INode?]
triple (left / center / right); use null for empty positions. Match the tree's visual
layout from the wiki.next; the deepest tier omits next.Append a new // #region <Season> block to the end of
src/assets/spirit-trees/seasons/seasons.jsonc, with one entry per spirit (guide first, same
order as the season spirits array):
// #region <Season>
{ "guid": "<tree-guid>", "tier": "<root-tier-guid>" },
...
// #endregion
Rules:
guid per tree. tier = the first tier guid of that spirit's chain from Step 4."revisionType": "AfterSeason" and go in spirit.treeRevisions — out of scope for the
initial add unless the user provides one.)Create src/assets/spirits/seasons/<season>.jsonc (a JSONC array). Add one ISpirit per
spirit, guide first, then season spirits in tree order:
{
"guid": "<new-spirit-guid>",
"type": "Guide", // the season guide; season spirits use "Season"
"name": "<Spirit Name>",
"imageUrl": "...", // if known
"tree": "<tree-guid>", // from Step 5
"_wiki": { "href": "https://sky-children-of-the-light.fandom.com/wiki/<Spirit_Page>" }
}
Rules:
type: "Guide" (the season guide); every other season spirit is type: "Season".tree = the matching tree guid from Step 5.season (the resolver links it back from the season).If the season has premium packs (Step 1), create src/assets/iaps/seasons/<season>.jsonc (a
JSONC array). Add one IIAP per pack:
{
"guid": "<new-iap-guid>",
"name": "<Pack Name>", // the pack's display name (e.g. "Wheatfield Cape")
"price": 14.99, // USD
"items": ["<item-guid>", ...] // the cosmetic item guids from Step 2 (one or more)
}
Rules:
guid per IAP. items are the item guids added in Step 2 for that pack (a pack may bundle
several cosmetics, e.g. a cape + neck accessory).c (candles), sc (season
candles), and sp (Season Gift Passes) are available on IIAP if a pack includes them.shops: [] in
Step 9.Create src/assets/shops/seasons/<season>.jsonc (a JSONC array). Each IShop has type
(Store | Spirit | Object), optional name, and iaps (array of IAP guids). Group the
Step 7 IAPs into shops by how the wiki says they're sold:
Object shop named after that vendor:
{ "guid": "<new>", "type": "Object", "name": "<Mannequin Name>", "iaps": [...] }. When the
wiki lists multiple mannequins (e.g. "left mannequin"/"right mannequin"), make one Object
shop per mannequin and split the IAPs accordingly.Store shop:
{ "guid": "<new>", "type": "Store", "iaps": [...] }.Match how the neighbouring seasons' shop files group things (see src/assets/shops/seasons/).
Collect the new shop guids for Step 9.
Append a new ISeason inside the correct // #region <Year> in
src/assets/seasons/seasons.jsonc (add the region if the year is new), matching neighbouring
entries:
{
"guid": "<new-season-guid>",
"name": "Season of <Name>",
"shortName": "<Short Name>",
"iconUrl": "...",
"imageUrl": "...",
"imagePosition": "top", // only if the neighbours use it
"year": <year>,
"date": "YYYY-MM-DD",
"endDate": "YYYY-MM-DD",
"spirits": [ "<guide-guid>", "<spirit-guid>", ... ], // from Step 6, guide first, tree order
"shops": [ "<shop-guid>", ... ], // from Step 8; [] if the season has no IAPs
"_wiki": { "href": "..." },
"_calendar": { "href": "..." }
}
Rules:
guid. Do not add number (resolver assigns it).spirits: the spirit guids from Step 6 — guide first, then season spirits in tree order.shops: the shop guids from Step 8 (the IAP shops); [] if the season has no premium packs.calculatorData (ICalculatorData): add only if the user provides bonus/compensation
seasonal-currency events. Shape (per entry): { guid, date, endDate, amount, description }
under timedCurrency. Ask the user rather than assuming.includedTrees: only for trees introduced during the season that are not season spirit
trees (e.g. a Traveling-Spirit rework debuting in-season). Omit unless the user calls it out.imageUrl, iconUrl, _calendar: include only if provided.npm run json-build — it must succeed (enforces globally unique guids and array-shaped
files). Fix any duplicate-guid or syntax errors.spirits → the new spirit guids (guide first); every spirit tree → a new tree.tier → the root tier; every tier next points to an existing tier; every node
guid in tier.rows exists in the nodes file.item guid exists in the items file; every new item has a unique id.shops → the new shop guids; every shop iaps guid exists in the iaps file; every
IAP items guid exists in the items file.npm test (requires a build first) to parse and resolve the full dataset.