Skills Leaderboard
Built-in
Basic Cohub abilities. Most agents already have these mounted; listed here for reference.
THE AGENT SKILLS DIRECTORY
Reusable skills for AI agents. Install any of them into a Cohub world's agent with one command.
npx -y @neta-art/neta-search-cli@latest skills find "<what you need>"
Wrote a skill? Publish it here →
Basic Cohub abilities. Most agents already have these mounted; listed here for reference.
Paste this into your agent's chat — it fetches the skill and follows it.
Use the skill: ip-journal. Run `npx -y @neta-art/neta-search-cli@latest skills use @yizhizhi/ip-journal --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.npx -y @neta-art/neta-search-cli@latest skills use @yizhizhi/ip-journalBuild a journal / scrapbook app web Work styled after any IP (a world's setting, characters and chat logs) — mobile first, with a desktop layout. The user gets a bookshelf of bound journals, real page turning, illustrated pages made from their roleplay, today's story or the whole world, a free editor (drag, scale, rotate, stickers, ink, photos, undo), an in-world AI journal assistant (e.g. an enchanted quill), 11 languages, music and sound, and sharing / export (card, long image, PDF, read-only link). Use when the user wants a journal, diary, scrapbook, notebook or memory book for their world, story or a known IP. Not for a dress-up game (that is ip-dressup), a single page, or a chat roleplay. Triggers - journal app, diary app, scrapbook, memory book, bullet journal for my world, 手账, 做一个手账, 日记本, 剪贴簿, 把这段 RP 做成手账, 給某 IP 做手帳, 手帳アプリ.
# IP journal app
The user ends up with one published web Work: a journal app that feels like it belongs to the IP — its shell copies the game's own UI, its pages look like objects from the world (tickets, letters, photos, newspaper clippings), and its stickers, covers and icons are in the IP's own art style. Content becomes journals bound onto a shelf; the user can edit every page. The engine never changes; each IP is a **world pack** (config, text, art, skin, components).
Read this file fully before generating anything or writing files. Resolve relative paths from this skill's directory (`$SK` below).
## 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. Text the user sees in the deliverable — Work title, app title, buttons, labels, journal pages — follows the user's language: the app ships 11 languages (en, zh, zh-TW, ja, ko, fr, de, es, it, pt, ru), follows the device language and falls back to English, and on any screen shows only one language; write the Work title in the user's language. Text the user typed stays as they wrote it.
## When to use / when not
Use when the user wants a journal / diary / scrapbook / memory-book app for a world, a roleplay, today's story or a known IP. Not for: a dress-up game (ip-dressup), one illustrated page or card, a novel, a chat roleplay, a puzzle or collectible-card game — say this skill makes a journal app and stop. Riddle locks, clue pages, card albums and badges are out even inside a journal (hard rule 1).
## Inputs
| Item | Required | Counts as given when |
|---|---|---|
| The IP / world | yes | The chat runs in a world that has `world/WORLD.md` (that world is the IP), or the user names an IP. "Make me a journal" with no world and no IP does not count. |
| Source content for the three books (a roleplay, today's story, the whole world) | no — default: the world's own characters, places and events; a roleplay or chat log the user points at becomes the first book | The user names or pastes a roleplay / story. |
| Owner name and in-world identity (e.g. house, region) | no — default: from the world's player profile, else a neutral one; it only changes accents | |
| Reference images / official site | no — default: search the official site and in-game UI yourself (`docs/02-official-site.md`) | |
If a required item is missing, ask for it once, in one message, before building — then stop. If every required item is given, do not ask anything and do not wait for a go-ahead: build through to delivery. If a choice is risky, state the default you take and continue in the same turn.
## Directory
```
SKILL.md this file: contract, steps, hard rules
docs/ detail for each step (13 = UI system; 15 = web / desktop layout; 12 / 14 / 15 = validation logs: Genshin Impact, Pokémon, Harry Potter web)
engine/ the shared engine (no IP content); index.html + shelf / tools / quill / share / audio / cover / welcome / replies .js + lib/grabfold (page turning)
server/ optional assistant backend: quill (AI writer), margin replies, custom stickers, share uploads
tools/ asset generation and post-processing, fonts, cover recolouring, back covers, i18n, assembly, static build, self-checks; examples/ = page generators
scripts/verify.mjs the self-check the review gate reads (writes verify-report.json)
worlds/<sample>/ three finished sample world packs: harry-potter (dark classic), genshin (bright fantasy), pokemon (sporty flat-colour)
```
A world pack (what you build for the user's IP) has `world.src.js` (you write it; text as `{en, zh}`) → `templates.js` + `i18n/<lang>.json` (generated), `components.js` (IP-only page components), `theme.css`, `a/` (art, fixed file names), `f/` (fonts), `fonts.json`, `assets/` (prompts + raw images), `BRIEF.md` — see `docs/05-world-pack.md`.
## Steps
Working folders: `$RUN=_runs/ip-journal/<slug>/` under the workspace root; the world pack is `$W=$RUN/world`, the assembled app `$APP=$RUN/app`, the static build `$DIST=$RUN/dist`. Never write into this skill's own folder (`worlds/` are read-only samples) and never move or delete `$RUN` afterwards. Start the pack from the sample closest in tone (`cp -r $SK/worlds/<sample> $W`) and replace everything IP-specific.
1. **Read the inputs** — `world/WORLD.md`, characters, places, events, any roleplay / chat the user points at (with Neta tools also `neta atom list` / `neta atom get <id>`). → `$W/BRIEF.md` §0 (`docs/01-brief-template.md`).
2. **References + official site** — in-game UI, promo art, the official site; read fonts, colours, lines, buttons; decide dark or light shell. → `$W/research/NOTES.md`, BRIEF §UI, `$W/theme.css` (`docs/02`).
3. **Mood** — fonts by the IP's character (five kinds), paper material, music preset → `WORLD.fonts`, `material`, `audio` (`docs/03`, `docs/07`, `docs/08`).
4. **Carriers** — what do people in this world write things down on? Three sources → three books; content types → IP objects. → BRIEF §carriers (`docs/01`).
5. **Assets** — write `$W/assets/prompts.json` (one style suffix; one sheet for the whole icon set; copyright-safe), then:
`GEN_PAR=3 python3 $SK/tools/gen.py $W/assets/prompts.json` (retries, falls back to another image model, skips finished images) → `python3 $SK/tools/prepare.py $W` → `python3 $SK/tools/recolor_covers.py $W && python3 $SK/tools/back_covers.py $W` → `python3 $SK/tools/webfonts.py $W` (`docs/04`, `docs/03`). Optional wide backgrounds `a/library_w.webp`, `a/desk_w.webp` (`docs/15`).
6. **World pack** — `$W/world.src.js`, `components.js`, `theme.css` (`docs/05`, `docs/06`, `docs/13`); pages can be generated from a skeleton (`tools/examples/`).
7. **Languages** — `python3 $SK/tools/i18n_world.py $W --ui-from $SK/worlds/harry-potter` (writes `templates.js` + 11 languages; safe to rerun) → `python3 $SK/tools/check_i18n.py $W --forbid "<names from the sample you copied>"` → `python3 $SK/tools/check_lang.py $W` (`docs/09`).
8. **Assemble + check** — `$SK/tools/assemble.sh $W $APP`, serve it (`python3 -m http.server`, or `server/start.sh` when the assistant backend is used, `docs/11`), then:
- `node $SK/scripts/verify.mjs $APP` — passes when the app has every art file it references, all 11 language files with the same keys, the UI keys the engine needs, ≤ 1000 files after the static build, and (when a browser is available) `tools/web_check.sh` at 1440×900 and 390×844 reports nothing. It writes `$APP/verify-report.json`. Fix every FAIL and rerun; do not deliver while it fails.
- In the browser inject `tools/qa.js` → `qaAll()` (overflow / overlap / stickers covering text = 0) and `qaLangAll()` per language; `tools/audit.sh` screenshots every screen; read `docs/10-checklist.md`.
9. **Static build** — fonts slices go to a public CDN first (`docs/11`, `WORLD.service.fontBase`), then `$SK/tools/build_static.sh $APP $DIST` (version-stamps every path).
## Deliver
One route: a **web Work** (the static app in `$DIST`).
- With Neta tools (`/mods/neta` exists): `node /mods/neta/neta work init web works/webs/<slug> --title "<app title in the user's language>"` → `node /mods/neta/neta work publish web works/webs/<slug> --from $DIST --title "<same title>"`.
- Without them (a plain Cohub space): `cohub -s $COHUB_SPACE_ID apps publish <slug> --dir <$DIST relative to /workspace> --visibility public --hide-cohub-bar` (`docs/11-deploy.md`).
- Before handing over, check the core content is in it on the **published** link (not only locally — fonts come from the CDN there): the shelf shows the three bound books, a book opens and turns pages, every page has content, the editor opens, `window.FONT_BASE` is set and no font is in `error`.
Then, as the last step — the run is not delivered until it is done:
10. **Hand over with a card.** One `interaction-components` link card on its own line, target `{ "type": "work", "workId": "<id>" }`, the id taken from the publish output (fallback: `cohubWorkId` in `works/webs/<slug>/meta.json`). Never a made-up id, a folder or a `world-file` link to `index.html`. Then one or two lines on what is inside, in the user's language, and say plainly what you could not check (headless browsers show ~3 fps and no sound; the AI assistant works only while its backend runs).
## Out of scope
- Do not change world settings (WORLD.md config, visual style, slug) or delete files that existed before the run.
- Do not modify memory, character cards, installed scripts (including this skill's own files and sample worlds), existing Works or roleplays.
- Make only the one journal Work; do not act on your own next-step suggestions.
- No theme switcher, riddle locks, clue pages, card albums or badges (hard rules 1, 3).
- Real auto-binding from live product data (reading the user's actual RP / agent history through a product API) is not in this version: books are bound from the world pack's templates; the quill can lay out single pages.
## When to stop
- No world and no IP named: ask which IP, once, then stop.
- Asked for something this skill does not make (a dress-up game, a single page, a roleplay): say this skill makes a journal app and stop.
- An image is refused or fails after retries: mark it `pending: true` in the world pack (the app hides it) and continue; never draw a copyrighted protagonist or creature to replace it.
## Hard rules (each comes from explicit user feedback — breaking one means rework)
**Product**
1. Only two things: **turn content into journals** (sources: a roleplay / today's story / the whole world) and **edit it yourself**. No riddle locks, clue pages, card albums, badges or other clutter.
2. Bound journals go on a **bookshelf** and are kept (IndexedDB); the shelf can be reordered; taking a book down asks twice.
3. **No theme switching.** The IP decides the style; the player's in-world identity (e.g. house) only changes accents.
4. **Mobile first, and the web must work well** (`docs/15`): fill every viewport, never draw a phone frame; wide (≥ 900 px, landscape) = more books per shelf row, the book scaled to the height, panels as centred cards, landscape backgrounds; with a mouse a ✕ on every panel, arrow keys turn pages, hints say "drag / arrow keys".
**Visual**
5. **The shell follows the IP's real UI; the pages follow the IP's world.** Collect references first (in-game UI, promo material, official site; the user's own first), read fonts / colours / lines, pick free fonts of the same character, decide dark or light, start from the matching sample skin (`docs/02`). "Luxurious" on an official site usually means light and thin lines, not thick frames and ornaments.
6. **Icons are IP-object metaphors, one icon style for the whole app**, drawn the way the IP draws its own icons; one sheet makes the whole set, sliced by role; flat styles are tinted with `iconTint` (`docs/04`). No Unicode symbols or generic line icons as function icons. Only three button kinds.
7. **Everything visible follows the IP's art style** — stickers, covers, cards, illustrations, and page layout too (scattered vs grid-aligned). Research it yourself and note it in `research/NOTES.md`.
8. **Fonts follow the IP's character**; Chinese fonts are sliced on demand so any character the user or the AI writes renders.
9. **AI draws the art, code sets the text**; no text inside art. No original protagonists' faces, official logos or crests — draw "their object + that moment" instead. **When the creature itself is the IP (Pokémon), don't draw the creature**; use its objects (ball, berries, lightning, footprints) and leave official art to the user's licence (`docs/14`).
10. **Paper material is decided per IP**: old books are matte, only photo paper shines. No system scrollbars, default buttons or white system dialogs.
**Interaction**
11. Page turning feels like a real book: the page folds where the finger is; going back pulls the previous page out from behind the spine; covers are rigid boards with thickness; closing the back cover moves the book to the other side and the camera back to the centre (`docs/07`).
12. Editing: one-finger drag, two-finger scale / rotate, snapping guides, undo / redo. The AI assistant is an **object in the IP** (Harry Potter = an enchanted quill), changes only page elements and can be undone.
13. At least 10 languages, following the device, English fallback; names use each language's official translation; each language gets fonts of the same character. **Whatever language is chosen, the screen shows only that language** (pages and shell): run `tools/check_lang.py` after translating and `qaLangAll()` before publishing; components never hard-code foreign text (`docs/09`).
**Engineering**
14. The front end ships as a static app (always opens); the AI goes through a sandbox service (only the assistant is unavailable while it sleeps). Every resource path is versioned against CDN mixing.
15. Run `docs/10-checklist.md` after every change and **screenshot it yourself before handing over** — on the **published link** (local has the font files, online uses the CDN) and in a browser **with an old bookshelf** (users have books bound earlier).
16. **One UI system for the shell** (`docs/13`): one font family, five sizes, one button, one selected colour, one panel header. Buttons copy the **in-game** UI.
17. When the user says "still not right", build a comparison page with 5–6 options for them to pick (`docs/13` §3) instead of guessing another version.
18. After starting from a sample skin, run `tools/audit.sh` and look at the whole set for leftovers: gold-foil text, cream frames, overlay colours, white text on light backgrounds are the usual misses.
19. **Run `tools/web_check.sh` on every screen** (phone + wide): buttons alone on a row are centred; every button on the top layer is clickable (the writer panel's labels once shared the class `.wl` with the welcome overlay, and a transparent overlay covered the whole panel); every ✕ closes with a real click. Search the engine and every `theme.css` before adding a class name.
## References — read when the step names them
| File | Read when |
|---|---|
| `docs/01-brief-template.md` | steps 1 and 4 |
| `docs/02-official-site.md` | step 2 |
| `docs/03-fonts.md` (+ `docs/research/fonts-and-pageflip.md`) | steps 3 and 5 |
| `docs/04-art-and-assets.md` | step 5: slots, icon roles, prompts, post-processing |
| `docs/05-world-pack.md`, `docs/06-components-layout.md` | step 6 |
| `docs/07-paper-motion.md`, `docs/08-audio.md` | step 3 and any page-turn / sound work |
| `docs/09-i18n.md` | step 7 |
| `docs/10-checklist.md` | step 8, every time |
| `docs/11-deploy.md` | steps 8–9 and Deliver (backend, fonts CDN, publishing, online self-check) |
| `docs/13-ui-system.md` | step 6 and any shell UI change |
| `docs/12`, `docs/14`, `docs/15` | a bright / flat-colour IP (12), a "creature is the IP" world (14), any wide-layout change (15) |
## Known limits
- Binding uses the world pack's fixed templates; real generation from live RP / agent history waits for a product data API (the quill can already lay out one page, `server/quill-system.md`).
- The image service (gpt-image-2) sometimes returns 4xx / 5xx; `tools/gen.py` retries and falls back; what still fails is marked `pending: true` and hidden.
- Genshin and Pokémon samples have no wide landscape backgrounds yet (`docs/15`).
## Gotchas
- `TMP_DIR` for the server must be inside the workspace: `cohub completion --system-prompt` only accepts paths in the space.
- A static app is limited to 1000 files: CJK font slices (thousands of files) go to the public CDN in sub-folder batches; `build_static.sh` refuses a pack with slices but no `fontBase`.
- The CDN caches same-name files for hours: every publish gets new versioned paths; `fonts-*.css` carries `?v=`.
- Locally fine ≠ online fine: check the published link (fonts load from the CDN there).
- An old bookshelf (books bound with earlier templates) renders differently from a fresh one: always test with one.
- A panel-wide `.btn-gold.wide` has `max-width:330px`: it must be centred with `margin:0 auto` or it hugs the left edge of the wide panel.