character-kit

Community@xixi/character-kit
Community skill — not reviewed. It was shared by 西西 and has not been checked by Neta. Read SKILL.md below before letting an agent use it.
Use it in Cohub

Paste this into your agent's chat — it fetches the skill and follows it.

Use the skill: character-kit. Run `npx -y @neta-art/neta-search-cli@latest skills use @xixi/character-kit --via site` and follow what it prints. Read its complete output, redirecting it to a temporary file first if necessary, and resolve relative paths from the skill directory it prints.
Install from a terminal
npx -y @neta-art/neta-search-cli@latest skills use @xixi/character-kit
Summary

Turn your cast into a character archive, a model sheet, and a playable "who is the undercover" game in one page.

  • Archive tab: each character gets a card that flips open to reveal a secret and a relationship line.
  • Sheet tab: one character sheet with a main picture, four views, and four expressions, all keeping the same face. Actions and outfits can be added.
  • Game tab: a "who is the undercover" round with your characters. Players get near-identical words, give clues, and vote someone out.
  • Needs 3 to 8 characters with a trait and a relationship each, plus a visual style for the sheet.
  • The default sheet is 9 pictures. You're told the picture count first. The archive and the game need no pictures.
SKILL.md
# Character Kit

One cast, three ways in. **Archive** gives each character a card that flips open to a secret and a relationship line. **Sheet** gives one model sheet: a master, four views, expressions, actions and outfits, all drawn from the same identity lock so the face does not drift. **Undercover** turns the same cast into a social-deduction round: every player gets one of two near-identical words, gives a clue, and votes.

Read this file fully before generating anything or writing files. Resolve relative paths from this skill's directory.

## Language

Reply in the user's language, whatever language this file is in. This holds for every message of the run, above all the final handover; translate what the scripts print, don't paste it. All visible text — tab labels, dossier copy, sheet captions, game prompts, win messages — follows the user's language; character names and quoted lines stay as written.

## When to use / when not

Use when the user has several characters and wants a reusable reference kit, a visual model sheet, or a deduction game with their own cast. This skill makes one web Work.

Not for a single portrait (`character-portraits`), a relationship map (`relationship-network`), a full visual novel (`create-avg`), or a chat roleplay. For those, say what this skill makes and stop.

## Inputs

| Item | Required | Counts as given when |
|---|---|---|
| Cast | yes | 3–8 named characters with at least one written trait and one relationship. "My OCs" alone does not count. |
| Visual style | yes for the sheet | The world's visual style, a named style, or a reference image. Without it the sheet cannot be consistent. |
| Word pair | no — default written from the cast | Two near-identical things from the world (coffee/tea, sword/saber, two sisters). The builder needs a clue pool for each. |
| Sheet depth | no — default 9 images | `master + 4 views + 4 expressions`. Actions (6) and outfits (4) are optional add-ons. |

Ask once, in one message, if the cast or the visual style is missing, then stop. If both are given, build; state the image budget in one line.

## Cost model

Default sheet = 9 generated images: one master, four views, four expressions. Each extra expression is +1; six actions are +6; four outfits are +4. The deduction game and the archive need no images. Say the budget before generating; never quietly drop the four views.

## Steps

1. **Read the cast.** `neta atom list` → `neta atom get` for each character. Extract one sentence of role, three keywords, one secret, one quote, and every named relationship. Write `$RUN/cast.md` with the source of each. Do not invent a relationship the material does not support; write "unspecified" instead.
2. **Write the plan.** `$RUN/plan.json` per `references/plan-schema.md`. The archive is text; the sheet is a list of image slots; the game is one word pair with five clues per side and three ambiguous clues.
3. **Build the identity lock.** One block of text used at the top and bottom of every image prompt:
   ```text
   CHARACTER IDENTITY LOCK — reproduce this exact character without changing any feature
   Name / species / core appearance / signature accessory / palette / art style
   Quality: full body in frame; anatomically correct; correct limbs, ears, tails, wings; no text;
   simple neutral background.
   ```
   Use the same wording for all slots of one character. This is the reason the face holds across four views.
4. **Generate the sheet.** Through the bundled script, one slot at a time:
   ```bash
   node scripts/gen.mjs --kind image --state $RUN/gen-<char>-<slot>.json \
     --prompt "<identity lock + slot prompt from references/plan-schema.md>" \
     --work-title "<Work title>" --param aspect_ratio=3:4 --param image_size=1K --models "<fallbacks>"
   ```
   Rerun while `generating`/`busy`; it resumes the accepted task and never pays twice. Generate the master first, then pass it as `--image reference_image=<master>` for views, expressions and outfits so identity carries.
5. **Validate and build.**
   ```bash
   node scripts/build.mjs --plan $RUN/plan.json --assets $RUN/assets --out $RUN/site --lang <locale> --check
   node /mods/neta/neta work init web works/webs/<slug> --title "<title>"
   node scripts/build.mjs --plan $RUN/plan.json --assets $RUN/assets --out works/webs/<slug> --lang <locale>
   ```
6. **Play all three tabs.** Serve it and check: every card flips and shows a secret, every declared sheet image loads with its caption, the undercover round gives every alive player a clue, a vote eliminates one player, a tie skips an elimination, the undercover win and civilian win both reachable, and 375 px width keeps the tabs usable. Write `$RUN/qa.md`.
7. **Publish and hand over.** See Deliver.

`$RUN` = `_runs/character-kit/<timestamp>/`.

## Deliver

One browser web Work.

1. Publish: `node /mods/neta/neta work publish web works/webs/<slug> --title "<same title>"`.
2. Open the published entry and switch through all three tabs.
3. In the user's language, state the cast size, the sheet image count, and the word pair — but not which character is the undercover.
4. **Hand over with a card — the run is not delivered until this step is done.** One `interaction-components` card on its own line, target `{ "type": "work", "workId": "<id>" }`, the id from the publish output (fallback: `cohubWorkId` in `works/webs/<slug>/meta.json`). Never a made-up id, a folder path, or a `world-file` link to `index.html`.

## Out of scope

- Do not change world settings, delete files that existed before the run, or edit memory, character cards, installed scripts or existing Works.
- Do not invent relationships, secrets or traits the material does not support. Mark written additions as written.
- Do not add combat, romance routes or a branching story. The deduction round is the only game.
- Make only the requested Work; do not act on your own next-step suggestions.

## When to stop

- No cast or no visual style: ask once, then stop.
- More than eight characters: say the sheet becomes 70+ images, propose the archive and game for everyone plus a sheet for four, and let the user decide.
- Asked for a single portrait or a relationship map: say what this skill makes and stop.

## Gotchas

- The four views drift because each prompt re-describes the character slightly differently. Use one identity-lock block verbatim, and pass the master as a reference for every later slot.
- A "back view" prompt that says "back" but not "full body, including the back of the head and hair" produces a headless torso. Keep the full phrase.
- Identity reference images and first-frame roles cannot be mixed on most models. For a still sheet, pass `reference_image`, not `first_frame`.
- The undercover AI must not use a clue tag from the other word's pool. If it does, the round is solved in one line; filter by the actor's own tag set.
- A tie that eliminates someone by random choice feels broken. Skip the elimination on a tie and say so.
- The deducer's own word is shown only to them; on the shared screen, keep it behind a hold-to-reveal.