Unikit gd spec
Create and own the master game design document (GAME.md — the authored one-pager plus the generated [gen] system/flow maps) and the GD-IDS.yaml facts registry — the top-level, big-picture layer of the GDD and the machine interface the code side reads. Use it to write the master spec from a concept or dialogue, import an existing GDD (a file path or URL), edit GAME.md content ("change a pillar", "rework the monetization stance", "tweak the loop stack"), pitch the game ("pitch" → PITCH.md), re-decompose the systems ("remap"), and — importantly — to add a new system to the design map ("let's add a new system", "add a crafting system to the game design", "add this to the GDD"). This is the structural, map-level layer plus GAME.md content edits. To write or fill in the detailed parameters of one existing system, use /unikit-gd-system; to apply one edit spanning several zones at once use /unikit-gd-apply; to invent a brand-new game concept use /unikit-gd-brainstorm.From its SKILL.md
npx -y skills add NintendaDev/unikit-ai --skill unikit-gd-specAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 16 stars16 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 3 commands, including `date +%F` and 2 more.
SKILL.md
16.9 KB, ~4.3k tokens by cl100k_base, as published. Nobody here has run it
Game Design — Master Spec & System Map
Author the whole-game truth and the map of every system. This skill owns the
spec / map zone in .unikit/gamedesign/ (gd-principles → Zone Ownership):
GAME.md— the one-page master GDD. This skill owns both halves: the authored one-pager (premise, pillars, loop stack, win/lose intent, monetization stance, non-goals) and the generated[gen]maps at the bottom (## System Map [gen]/## Flow Map [gen]/## Funnel [gen]), which are mechanical read-only re-renders ofGD-IDS.yaml. Both content edits to its sections and structure edits (which systems exist, remap) live here — there is no separate editor skill.GD-IDS.yaml— the machine-truth registry of pillars, systems, flows, and facts, and the interface the code side reads (unikit-plan/unikit-verify/unikit-explore).
Optionally it produces PITCH.md. Per-system detail (systems/<slug>.md) is
not this skill's job — that is unikit-gd-system; player-action flows
(flows/<slug>.md) are unikit-gd-flow's; content types
(content-types/CT-<slug>.md) are unikit-gd-content's. This skill remains the
single writer of the system roster: a flow's GOAL → SYS or a content type's
belongs_to that needs a missing system routes back here for add-system.
Language Awareness — BLOCKING PRE-REQUISITE
BEFORE producing ANY output, silently read .unikit/system/LANGUAGE_RULES.md
and apply it to all output and artifacts (fall back to English if it is missing) —
including the rule to translate concepts, not transliterate jargon.
gd-principles → "Language" adds the game-design specifics: which IDs and stored
field values stay English. Do not announce or mention the language setting.
Bootstrap — Working Contract & Domain Knowledge (MANDATORY)
Before any authoring, silently load — do NOT narrate the loading:
.unikit/system/gamedesign/gd-principles.md— the cross-skill core: the zone-ownership model and routing rule, the collaborative protocol (Question → Options → Decision → Draft → Approval, Explain → Capture), the one-way design→code boundary, the facts-registry / ID conventions, the language rules, and the anti-patterns. Plus, from the samegamedesign/folder, the shards this skill needs:gd-authoring.md(the section-cycle authoring contract + the delta discipline, incl. the GAME.md carve-out this skill implements) andgd-lifecycle.md(the lifecycle & status spine). This skill never re-specifies those mechanics — it applies them. If the core file is missing, warn the user thatgd-principlesis not installed (unikit-ai update) and continue with the protocol summarized above as a fallback..unikit/memory/gamedesign/RULES_INDEX.md— the domain knowledge index. Load the core rules relevant to master-spec work on demand by theirLoad Whencolumn — most oftenframeworks(MDA, SDT/PENS, Flow),player-motivation(Quantic Foundry),core-loops, andmonetization-ethics(for the Monetization Stance). Re-read at skill start; never rely on a prior conversation's cache. Obey the index's Rule-Loading Discipline: load byLoad When, load a reference only from its parent rule's> **References**:, and never glob the memory tree (.unikit/memory/gamedesign/**) to discover rules..unikit/RULES.md(if present) — project overrides, highest priority..unikit/DESCRIPTION.mdand.unikit/ROADMAP.md(optional) — project constraints and milestones; routing context only.- Schema guard (clean break — no automatic migration). When
GD-IDS.yamlalready exists it MUST beversion: 2. If it is stillversion: 1, STOP and report: the design workspace is on the pre-v2 layout — v2 dropped the standalone markdown system-index that v1 kept beside the registry and now renders the maps read-only intoGAME.md(## System Map [gen]/## Flow Map [gen]/## Funnel [gen]); there is no automatic migration. Tell the user to bumpGD-IDS.yamltoversion: 2, fold any rows from the legacy system-index into GAME.md's## System Map [gen], and delete that legacy index file before re-running. Create mode (noGD-IDS.yamlyet) skips this check.
One-way boundary: this skill never reads .unikit/code/, project source, or
build artifacts. Importing a GDD reads only the document the user points at.
Input
$ARGUMENTS — a single positional value, free-form, in any language. It may be a
file path or URL to an existing GDD, or a description / intent. There
are no flags: the mode is inferred (see Step 0). Ambiguity is always resolved
by asking — never by guessing.
Workflow
Step 0: Resolve Mode (no flags)
Mode is a function of the artifact state on disk and the intent in the
prompt (gd-principles "never guess" rule). Resolve in this order:
-
The argument is a file path or URL (contains
/, ends in.md/.markdown, exists on disk, or starts withhttp) → Import mode. Confirm the target with the user if the path is uncertain. -
The prompt asks for a pitch ("pitch", "питч", "one-pager to sell it") → Pitch mode.
-
The prompt asks to rebuild / re-derive the system map ("remap", "rebuild the map", "пересобери карту", "re-decompose systems") and
GAME.mdexists → Remap mode. -
The prompt asks to add one system ("add a/new system", "let's add a crafting system", "add this to the GDD", "добавь систему", or it names a system absent from the roster) and
GAME.mdexists → Add-System mode. This is distinct from Remap: Remap re-derives the whole map, Add-System grafts one named system onto the existing map and never touches the authored one-pager. (It is the route the internal design lens hands a new mechanic to — seereferences/mode-add-system.md.) -
The prompt asks to change GAME.md content ("change/rework/tune a pillar, the fantasy, a loop, the monetization stance, an anti-pillar, win/lose intent…") and
GAME.mdexists → Edit mode. This is the content-edit zone the spec owns (absorbed under zone-ownership: there is no separateimproveskill). Editing GAME.md's authored sections is Edit; re-deriving the roster is Remap/Add-System. -
GAME.mddoes not exist (check.unikit/gamedesign/GAME.md) and no import path → Create mode. -
GAME.mdexists and the intent is none of the above → ambiguous. Ask:AskUserQuestion: GAME.md already exists. What do you want to do? Options: 1. Edit GAME.md content — change a pillar / fantasy / loop / stance 2. Rebuild the system map — re-derive the roster from GAME.md 3. Add one system to the map 4. Create a pitch (PITCH.md) 5. Import a different GDD — give me the path/URL
Announce the resolved mode in one line, then proceed to Step 2 (load the matching mode body).
Step 1: Ensure the Workspace
Create .unikit/gamedesign/ (and systems/, flows/, concepts/, researches/,
reviews/ as needed) if missing. Get today's date in YYYY-MM-DD (date +%F).
If GD-IDS.yaml does not yet exist, you will create it from the canonical structure
described below (the version: 2 registry); never overwrite an existing registry
value silently.
Step 2: Load the Mode Body
With the mode resolved (Step 0) and the workspace ensured (Step 1), load the matching mode body on demand and follow it — do not keep all six mode bodies in context:
| Mode | Reference body |
|---|---|
| Create | {{skills_dir}}/{{self_name}}/references/mode-create.md (also holds Phase A + Phase B, reused below) |
| Import | {{skills_dir}}/{{self_name}}/references/mode-import.md |
| Edit | {{skills_dir}}/{{self_name}}/references/mode-edit.md |
| Remap | {{skills_dir}}/{{self_name}}/references/mode-remap.md |
| Add-System | {{skills_dir}}/{{self_name}}/references/mode-add-system.md |
| Pitch | {{skills_dir}}/{{self_name}}/references/mode-pitch.md |
Import / Remap / Add-System reuse Phase A / Phase B from mode-create.md — load
that reference too when a body points to it. The shared Regen-on-Write contract
(below) and the Final report (below) stay here; every mode body returns to them.
Genre Profile — Create Seed
In Create mode (and only Create — a fresh GAME.md from a concept/dialogue),
this skill resolves and seeds a genre profile. The user never types a genres
command — the spec drives the CLI (the skill-runs-CLI precedent: /unikit Step 9.2
rules install). Full mechanics live in references/mode-create.md → Resolve the
genre profile (seed); in brief:
- Resolve (best-fit). Read the descriptive
genre:hint from the seedCONCEPT.md(a human intent, not a catalog id). Open the catalog withunikit-ai genres list(its output is authoritative — there is NO genre→id map in this skill), and semantically best-fit the hint to a profile byname/aliases/summary(e.g. «симулятор ломбарда» →tycoon). The hint may deliberately not equal any id. - Install + record. Run
unikit-ai genres install <id>(idempotent — driven by this skill, not the user), then write the resolved id into the GAME.md header> **genre_profile**: <id>(distinct from the descriptivegenre:intent in CONCEPT). Read the installed profile JSON (.unikit/system/gamedesign/genres/<id>.json). - Seed interview. Seeds (
seed_systems/seed_content_types/seed_entities/seed_resources) are proposals, never auto-written — run a subtractive multi-select + add questions, with per-CTscale.confidenceis the pre-fill knob (high → pre-check more, low → ask more). Kept seeds apply through the existing owner paths: systems → Phase B / spec Add-System; content → route to/unikit-gd-contentadd-CT; RES/TRACK/KNOB → their zone-owner. - Universal baseline. No
genre:hint, no concept, or no profile fits closely → author WITHOUT a profile (treat asconfidence: low— ask more, assume less), leavegenre_profile:empty, install nothing.
The profile is read-only. Every divergence (a dropped seed, an added field, a
custom CT) lands in GD-IDS — the project's custom configuration is GD-IDS (import
from the profile + augment at spec), NEVER an edit to the profile JSON. The genre
layer dissolves into the registry, so verify stays genre-blind and only
unikit-gd-review reads the profile (its completeness lens).
Regen-on-Write — ## System Map [gen]
GAME.md's ## System Map [gen] block is a mechanical re-render of GD-IDS.yaml
systems (the RULES_INDEX model) — never hand-authored. unikit-gd-spec is its
primary writer: after any write that changes the roster or a system's registry
metadata (Create Phase B, Add-System, Remap, and a roster-affecting Edit), re-render
the block as the last step:
- Read
GD-IDS.yamlsystems. - Group by
category(omit empty categories); within a group sort bytier(MVP → Vertical Slice → Alpha → Full Vision) then design order. - One row per system:
ID | System | Tier | Status | Ver | Depends | Doc.Statusmirrorsdoc_status, overridden bydeprecated(from thestatusfield) and by the code-setimplemented(display-only — design never authors it;gd-lifecycle→ Lifecycle & Status). Append the· partial (n/m)suffix when the system'sSYSTEM.mdcarries ≥1<!-- deferred -->(the canonical render format fromgd-lifecycle— the same suffixunikit-gd-verifyemits, so spec's regen-on-write never drops· partialbefore the next verify).Veris—untilskeleton.Docissystems/SYS-<slug>.md.
- Replace only the content between
<!-- gen:system-map -->and<!-- /gen:system-map -->; never touch the authored one-pager above it. Full map (one row per system); collapse to a single grouped table only as an escape hatch for very large rosters (150+).
The ## Flow Map [gen] / ## Funnel [gen] blocks (rendered by unikit-gd-flow, the
Flow axis) and the ## Content Map [gen] block (rendered by unikit-gd-content, the
Content axis) are out of this skill's scope — leave their template scaffold
untouched; this skill renders only ## System Map [gen]. unikit-gd-verify
independently re-renders a stale [gen] block when its freshness check trips
(gd-lifecycle → Lifecycle & Status) — the render is deterministic, so all writers
always agree.
Final: Compact Report & Next Steps
After artifacts are written, show a compact report (TIER A — gd-principles →
Language: names lead, ids are parenthetical copy-paste tags, status is a plain phrase;
no summary document, no report file):
Mode: <create | import | edit | remap | add-system | pitch>
Workspace: .unikit/gamedesign/
Written:
- GAME.md (vN — <still a draft | approved>) — incl. ## System Map [gen] re-rendered
- GD-IDS.yaml (<P> pillars, <N> systems)
- [SOURCE.md / PITCH.md when applicable]
System map: <N> systems — <M> MVP, … ; design order: <name> (SYS-<slug>), <name> (SYS-<slug>), …
Then recommend the next step (do not auto-invoke):
- 🧩 Detail the first MVP system — /unikit-gd-system <SYS-slug>
- 🔍 Review the master spec (fresh session) — /unikit-gd-review
Ownership Boundaries
- Owns: all of
GAME.md— the authored one-pager (its content edits under the GAME.md carve-out and its structure: which systems exist, remap) and its generated## System Map [gen]block (the primary regenerator). Owns the system roster (Create + Import Phase B, Add-System, Remap) andGD-IDS.yamlpillars + systems; optionalPITCH.md; importSOURCE.md. Owns theGD-IDSresearch:pointer (written in Add-System when seeded from an explore brief) —unikit-gd-explorenever writes it. Owns the genre-profile resolve (Create seed): best-fit the CONCEPTgenre:hint to a profile, driveunikit-ai genres install <id>, and write the resolved> **genre_profile**:id into GAME.md (the user never types agenrescommand; the profile is read-only — divergence → GD-IDS). - Not this skill: per-system GDDs (
systems/<slug>.md) →unikit-gd-system; player-action flows (flows/<slug>.md) and the## Flow Map [gen]/## Funnel [gen]renders →unikit-gd-flow; content types (content-types/CT-<slug>.md) and the## Content Map [gen]render →unikit-gd-content(a content type registers itself — there is no add-content here); ideation / concepts →unikit-gd-brainstorm; research briefs →unikit-gd-explore. - Never: write without explicit approval; change a
GD-IDS.yamlvalue silently; delete or renumber an ID; read the code workspace or project source.
Quick Reference
/unikit-gd-spec <description> → create GAME.md (one-pager + maps) + GD-IDS.yaml
/unikit-gd-spec ./path/to/GDD.md → import an existing GDD (extract, keep SOURCE.md)
/unikit-gd-spec https://… → import from a URL
/unikit-gd-spec change PIL-2's design test → edit GAME.md content (GAME.md carve-out)
/unikit-gd-spec remap the systems → re-derive the map (GAME.md must exist)
/unikit-gd-spec add a crafting system → add-system: graft one system onto the map → seam to detail
/unikit-gd-spec pitch this game → produce PITCH.md
What ships with it: 6 files
24.5 KB alongside SKILL.md
references/
- mode-add-system.md4.5 KB
- mode-create.md12.3 KB
- mode-edit.md2.4 KB
- mode-import.md2.8 KB
- mode-pitch.md854 B
- mode-remap.md1.7 KB