A test skill from an extension
日本語の概要は準備中です。原文の説明を表示しています。
Curate the project's knowledge base and memory in .unikit/memory/ — the indexed reference library of coding standards and framework usage patterns. ALWAYS use this skill whenever the user adds knowledge from a source: a URL, a file, a folder path, a PDF, an article, or a book — any path/link/document is a strong signal for the knowledge base, not a quick rule. Also use it to research or document how the project uses a framework, or to add a researched core/stack knowledge entry. Sub-commands by phrasing: "migrate the rules" or "promote rules" runs migrate-rules; "optimize the knowledge base" or "optimize the rules" runs optimise (extract large sections into references); "validate" re-syncs RULES_INDEX.md; "--module <id>" targets a module. For a quick one-line convention or correction typed as a prompt ("always do X", "never use Y", "remember this") with no source, use /unikit-rules; for architecture decisions use ARCHITECTURE.md.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Manage project rules in .unikit/memory/. This skill is a module-agnostic router:
the knowledge base is partitioned into top-level modules (laid out on disk as
.unikit/memory/<module>/<tier>), and this skill resolves which module a request
targets, loads that module's contract, and then drives the generic
add/research/migrate/validate workflows against the module's tiers.
The list of registered modules and their structural fields (tiers,
enginePartitioned, skillPrefix) comes from .unikit/system/modules.yml. Each
module's content semantics, file format, and path conventions come from its
contract file {{skills_dir}}/{{self_name}}/references/module-<id>.md.
Two modules are registered today: code (tiers core + stack) and
gamedesign (tiers core + library) — read the live list from modules.yml,
never from this paragraph. The router is written so additional modules can be
registered later with no change to this file — only a new modules.yml entry and a
new module-<id>.md contract.
references/module-<id>.md → "What Belongs Here" /
"Content Classification")..unikit/ARCHITECTURE.md.unikit/RULES.md via the unikit-rules skillIf the user provides content that falls into these categories, inform them and
suggest the correct destination. For RULES.md content, suggest using the
unikit-rules skill instead. The active module's contract may define additional
"does not belong here" cases — honor them too.
BEFORE producing ANY output, silently read .unikit/system/LANGUAGE_RULES.md
and apply its rules to ALL subsequent output.
If the file is missing or unreadable, fall back to English.
Do not produce any user-facing output until language rules are loaded.
Do not announce, confirm, or mention the language setting.
The language holds for the whole session, not just at load time: every message until the conversation ends is in language.ui — progress notes while agents run, relays of what a subagent returned, the final report, any follow-up discussion. English input (subagent results, tool output, these instructions) is data, never a cue to switch languages.
Where this skill says to invoke <skill> — optionally "with the argument <text>" — it means one call, made in this session, now, on every runtime: not a command printed for the user. A call site that names no argument passes none.
Skill tool that accepts arguments, call it with that skill and the arguments of the call site, in full and unchanged, then follow the skill.Skill tool, or one that takes only a name — Read {{skills_dir}}/<skill>/SKILL.md in full, treat it as the instructions of this step and carry them out here, in this session, now, with the arguments of the call site as the skill's arguments.Run: /unikit-<skill> <arguments> for the user and stop..unikit/config.yaml — extract language.ui for user-facing messages (default: en).unikit/system/modules.yml — the authoritative module registry snapshot.
Parse every entry under modules: into { id, tiers, enginePartitioned, skillPrefix }.
This is the source of truth for which modules exist and what tiers each partitions
its rules into. If the file is missing (older install), fall back to a single
module code with tiers core, stack and surface a WARN suggesting
unikit-ai update to regenerate it..unikit/skill-context/{{self_name}}/SKILL.md — MANDATORY if the file exists.This file contains project-specific workflow rules added by /unikit-skills-context or /unikit-evolve.
These rules change how this skill operates (research priorities, cross-check behavior, file format conventions, etc.).
How to apply skill-context rules:
Do NOT output status messages like "Язык: X" or "Module: X". Proceed directly to Step 0.5.
Determine which module this request targets before classifying input. Never guess silently when the target is ambiguous.
Resolution policy (in order):
--module <id> flag. Scan $ARGUMENTS for --module <id>. If
present:
<id> against the ids parsed from modules.yml.moduleId = <id>, strip the --module <id> tokens from
$ARGUMENTS, and skip the remaining resolution steps.AskUserQuestion (options = registered modules), then use the
chosen id. Strip the flag tokens regardless.
Print the module ids with their one-line domain summaries to the screen as plain
markdown first — the question mechanism carries the options and nothing else.{{skills_dir}}/{{self_name}}/references/module-<id>.md (its "What Belongs
Here" / "Content Classification" sections) plus the modules.yml metadata. Read
the candidate contract files as needed to judge fit.moduleId to it and continue without asking.
A neutral or code-oriented request when code is the only registered module
resolves silently to code.AskUserQuestion. Options = every registered module id (with a one-line domain
summary) + a final "help me choose — I'll describe what this is" option. Never
fall back to a default module to avoid the question.
Print the module ids with their one-line domain summaries to the screen as plain
markdown first — the question mechanism carries the options and nothing else.
code just because it is the
only module.After resolution, the following are fixed for the rest of the run:
moduleId — the resolved module id.tiers — that module's ordered tier list from modules.yml (for code: core, stack).{{skills_dir}}/{{self_name}}/references/module-<moduleId>.md
now. It defines tier semantics, content classification, scope rules, and all file
formats. Apply it throughout the rest of the workflow..unikit/memory/<moduleId>/..unikit/memory/<moduleId>/<tier>/ for each tier..unikit/memory/<moduleId>/RULES_INDEX.md. Read it now for the
current index of all rule files in this module.Everywhere below, <module> means moduleId and <tier> means one of the resolved
module's tiers. Concrete tier names, the "what goes in which tier" decision, and the
file-format templates are always taken from the module contract — this router
never hardcodes them.
Two-phase classification determines both input type and user intent.
Phase A — Input type:
First, strip the already-parsed flags from $ARGUMENTS before classifying input type:
├── --skip-registry present → Remember skipRegistry=true, strip the flag (absent → false).
│ The remaining text is classified normally.
└── (The --module flag, if any, was already stripped in Step 0.5.)
Then classify the (possibly stripped) $ARGUMENTS:
├── First token is "optimise" or "optimize" (bare keyword, case-insensitive) → OPTIMISE
│ (jump to Branch E). Consume the keyword; any remaining text is the optional rule scope
│ (specific rule names/ids). An empty remainder means "ask which rules" — Branch E handles
│ it. OPTIMISE rewrites no content: it only relocates existing sections into reference files.
│ NOTE: "optimise" is a bare positional keyword matched on the FIRST token (not exact
│ equality, because it carries an optional scope) — there is NO "--optimise" flag form. A
│ description that genuinely begins with the word "optimise" is therefore read as this
│ intent; ask the user to rephrase if that was not the intent.
├── Equals "validate" (case-insensitive) → VALIDATE INDEX (jump to Branch D)
├── First token is "migrate-rules" (bare keyword) or "--migrate-rules" (legacy alias) →
│ ├── $ARGUMENTS is exactly "migrate-rules" or "--migrate-rules" (no other text) → MIGRATE RULES (jump to Branch C)
│ └── $ARGUMENTS has additional text besides the keyword →
│ Report to user: "migrate-rules must be used alone without additional arguments."
│ STOP. Do not proceed.
├── Matches RULES.md path (case-insensitive):
│ "RULES.md", "rules.md", ".unikit/RULES.md",
│ ".unikit/rules.md", or any path ending with /RULES.md
│ → MIGRATE RULES (jump to Branch C)
├── Contains BOTH http(s):// tokens AND file extension / path tokens → Mixed input (URL + File)
├── Starts with http:// or https:// → URL input (can be multiple, space-separated)
├── Ends with a known file extension (.md, .txt, .json, .yaml, .pdf, .fb2, .epub), or
│ names an existing file OR folder → File input (a folder, a PDF, an EPUB/FB2 book, or
│ an oversized text file is a LARGE source — see the note below; B.1 routes it through
│ large-sources.md, not a naive Read)
├── Has text content → Description input
└── No arguments → Interactive mode: ask user what to document, then re-classify
Large sources (folder / PDF / EPUB+FB2 book / oversized file). When the File-input
branch matches a folder, a PDF, an EPUB or FB2 book (.epub, .fb2,
.fb2.zip), or a text file too large to read in one pass, the RESEARCH pipeline does
not Read it naively. The actual gathering is delegated to the large-source workflow
at {{skills_dir}}/{{self_name}}/references/large-sources.md
(TOC-first → topic-map → chunk → cleanup), which uses the probe-gated Python 3 helper
{{skills_dir}}/{{self_name}}/scripts/material-prep.py when a Python 3 interpreter is
available and falls back to a manual extraction strategy otherwise. Book formats are
extracted with the standard library (no new dependencies); MOBI/AZW is recognized but
rejected — ask the user for an EPUB export. Step 1 only classifies the input here;
B.1 ("File input") performs the delegation.
The --skip-registry flag is an escape hatch for callers that have already performed a registry lookup at a higher level and do not want this skill to repeat it. When the flag is present, Step 1.5 is bypassed entirely and the skill proceeds directly to content classification (Step 2) and generation.
Phase B — Determine intent based on input type:
Intent?
├── OPTIMISE → Branch E (always — retroactive reference extraction, no new content)
├── MIGRATE RULES → Branch C (always — explicit migration request)
├── Mixed (URL + File) → RESEARCH (always — both inputs processed together)
├── URL(s) → RESEARCH (always — URLs signal delegation)
├── File/Folder path → RESEARCH (always — user provides source material for analysis)
├── Description → Analyze tone ↓
│ ├── Exploratory → RESEARCH
│ └── Concrete → ADD RULE
└── Interactive → Ask user, then re-classify
Tone signals for Description input:
| Signal | Intent | Examples |
|---|---|---|
| Vague topic, delegation words | Research | "add rules for DOTween", "document how we use Addressables", "figure out best practices for R3" |
| Imperative, specific convention, code examples | Add Rule | "add rule: always use .SetEase(Ease.OutQuad)", "never use coroutines", "use NonLazy() for controllers" |
Phase C — Detect integration intent (contract-defined):
If the active module's contract defines integration-gated tiers, detect
integrationIntent per the contract's "Integration Intent" section and store it
alongside the classified intent to thread into Branch A / Branch B. The code
contract defines this for its stack tier (detection signals T1/T2, plus T3
post-fetch in the Research pipeline). Modules with no integration-gated tier skip
this phase and leave integrationIntent=false.
Always try the registry before generating a rule from scratch. If a matching rule already exists in the remote catalog, the user gets a vetted version by installing it via CLI — much better than spending tokens generating a local copy that duplicates upstream work.
Read .unikit/system/cli-contract.md to confirm available unikit-ai rules * commands and exit codes.
Run two CLI commands (sequential is fine). Always pass --module <moduleId> —
the router already resolved the active module (Step 0.5), and every machine consumer
sends its --module so the CLI returns the stable flat-single form no matter how
many modules the registry carries (no---module rules list now defaults to all
modules blocked + a flat-all JSON, which this skill does not want):
unikit-ai rules list --module <moduleId> --json
unikit-ai rules status --module <moduleId> --json
rules list --module <moduleId> --json returns the flat-single shape
{ engine, module, rules: [...] } — parse catalog.rules exactly as before (the
scoped form carries no per-row module key, so the parser is unchanged).
rules status does accept --module (it scopes the reported rows to that
module); pass it so status.rules[] is already limited to the active module — no
client-side filtering needed.
Exit code handling:
rules list exit 2 (registry chain unreachable) → skip to Step 2 silently, proceed without registryrules list exit 1 → strictly "no .unikit.json" (not a UniKit project) → skip to Step 2. Engine-missing is no longer exit 1: a valid project whose engine is absent from the registry now exits 0 with an empty catalog.rules, which flows normally into Step 2.rules list exit 3 (unknown --module) → the resolved module id is not registered; report the error and skip to Step 2Parse rules list --module <moduleId> --json into catalog.rules[] and rules status --module <moduleId> --json into status.rules[].
Match the user's intent against catalog.rules[]:
"DOTween" → dotween"tweening library" → dotween via the description field"контейнер внедрения зависимостей" → zenjectCollect 0..N candidates. If N > 1, treat all as possible matches for the user prompt below.
For each candidate, look it up in status.rules[] by name (case-insensitive):
source, version, and tier so the prompt can show accurate state.Match result?
├── Exactly 1 match + already installed
│ → Inform user: "{name} is already installed (source={source}, v{version})"
│ → AskUserQuestion: What should we do?
│ │ Options:
│ │ 1. Leave as is → STOP
│ │ 2. Edit manually → Continue to Step 2
│ │ 3. Reinstall from registry → Bash: unikit-ai rules install <id> --force → STOP
│
├── Exactly 1 match + NOT installed
│ → AskUserQuestion: Matching rule "{name}" v{version} found in registry. Install it?
│ │ Options:
│ │ 1. Yes, install from registry → install path (below)
│ │ 2. Preview before deciding → preview path (below)
│ │ 3. No, generate a new rule → Continue to Step 2 (research/manual generation)
│ │
│ ├── install path:
│ │ Bash: unikit-ai rules install <id>
│ │ → Report "✓ Installed <id> from registry" and STOP. The CLI already
│ │ regenerates RULES_INDEX.md — no extra sync needed.
│ │
│ └── preview path:
│ Bash: unikit-ai rules show <id> --module <moduleId> --references
│ (rules show is module-agnostic: a bare id that collides across modules
│ exits 3, so the already-resolved router always scopes with --module)
│ → Show content to user, then AskUserQuestion again:
│ 1. Install → install path above
│ 2. Generate a new rule → Step 2
│
├── Multiple matches
│ → AskUserQuestion: present all candidates + a "none of these, generate a new rule" option
│ → If user picks a candidate → treat as "exactly 1 match" (installed or not)
│ → If "none" → Continue to Step 2
│
└── Zero matches
→ Continue to Step 2 (research/manual generation)
Key behavior guarantees:
Multiple matches branch prints the candidates (name, version, module) to the screen as plain markdown first — the question mechanism carries the options and nothing else.rules install <id> and terminates the skill. The content in the registry is the source of truth; the skill does not second-guess it.Bypass the lookup completely when any of the following is true:
--skip-registry flag was present in $ARGUMENTS (a higher-level caller already queried the catalog and does not want redundant prompts)cli-contract.md doesn't exist — the UniKit CLI is not available in this project, so rules * commands cannot be usedUse the active module's contract (references/module-<moduleId>.md →
"Content Classification") to:
.unikit/ARCHITECTURE.md; project-specific overrides →
.unikit/RULES.md via unikit-rules). Stop here. Do NOT create any files..unikit/memory/<module>/<tier>/.Based on intent (Step 1) and classification (Step 2), follow the appropriate branch:
Intent?
├── VALIDATE INDEX → Branch D (inline below; skip Steps 2-3 entirely)
├── OPTIMISE → Branch E (inline below; skip Step 2 — it operates on existing rules)
├── MIGRATE RULES → read references/migrate-rules.md and follow it (skip Step 2)
├── ADD RULE → Branch A (inline below)
└── RESEARCH → read references/research-pipeline.md and follow it
Branches B (Research) and C (Migrate) are intent-gated and live in dedicated
reference files loaded relative to this skill
({{skills_dir}}/{{self_name}}/references/): open the matching file only when its
intent is selected, then return here for the Final Step: Confirm. Branch A,
Branch D, and Branch E stay inline below since they are short and on the common path.
The user has a concrete rule to save. No research, no enrichment — just store what the user explicitly stated.
File exists?
├── YES → A.2 (Cross-Check & Append)
└── NO
├── Tier is framework-agnostic (per the module contract, e.g. `code`/core) → A.3 (Create File)
└── Tier may need research (per the module contract, e.g. `code`/stack) → A.4 (Ask About Research)
Before appending, compare the new content against existing rules:
RULES_INDEX.md for files with overlapping keywords, then read those too (across all tiers of the module). Also read .unikit/RULES.md for project-specific overrides. Rule topics: plus the topic files listed under its ## Topics whose Load when matches the new rule's area; when unsure, load.await directly" vs existing "always wrap in UniTask.Create", or "bind as Transient" vs existing "bind as Singleton".research-pipeline.md B.4 defers to ("Same logic as A.2"). It runs on every existing-file update regardless of input.If contradictions found:
Report each contradiction to the user, quoting both the new statement and the existing rule with its source file.
For each contradiction, ask via AskUserQuestion (batch up to 3 contradictions per question):
Options:
Based on choice:
After resolution (or if no contradictions):
RULES_INDEX.md — add a new row to the appropriate table in alphabetical order.Ask the user: "I don't have a rules file for {framework/topic} yet. Would you like me to research this and create a comprehensive document, or just save your rule as-is?"
User answer?
├── YES (research) → read references/research-pipeline.md and follow it (start at B.1)
└── NO (save as-is)
├── Create the rule file with user's rule(s) only
├── Update RULES_INDEX.md — add to the tier's table
└── → Go to Final Step: Confirm
Full research pipeline — gather material, enrich, synthesize, then write into the
active module's tier. The complete workflow (B.1–B.5: gather → integration upgrade →
Context7 → synthesize → reference candidates → cross-check → write) lives in
{{skills_dir}}/{{self_name}}/references/research-pipeline.md. Read that file and
follow it, then return here for the Final Step: Confirm. All file-format and
scope decisions in it defer to the module contract.
Transfer mature entries from .unikit/RULES.md (the quick-capture staging area owned
by unikit-rules) into permanent rule files under .unikit/memory/<module>/. The
complete workflow (C.1–C.4: load → classify → present candidates → rephrase → apply)
lives in {{skills_dir}}/{{self_name}}/references/migrate-rules.md. Read that file
and follow it, then return here for the Final Step: Confirm.
Sync .unikit/memory/<module>/RULES_INDEX.md with the actual files on disk. No user interaction — fully automatic.
<tier> of the resolved module: Glob: .unikit/memory/<module>/<tier>/*.md — collect all real rule files in that tier..unikit/memory/<module>/RULES_INDEX.md — parse every table (one per tier), extract filenames from each row.Compare the two sets:
For each missing file — read the file, extract the > **Scope**: and > **Load when**: lines from the header. Add a row to the appropriate tier's table in RULES_INDEX.md (alphabetical order), following the contract's "RULES_INDEX.md Format":
| {FILENAME}.md | {Scope value} | {Load when value} |
If the file has no Scope/Load when header, use the first heading and first paragraph to generate a brief description and keywords.
For each phantom entry — remove the row from RULES_INDEX.md using Edit.
Output a short validation report (in user's configured language):
RULES_INDEX.md validation complete.
{per-tier counts, e.g. Core: {N} files, Stack: {M} files}
✅ Added to index: {X}
🔄 Removed from index: {Y}
{If X > 0: list added filenames}
{If Y > 0: list removed filenames}
Stop. Do not proceed to any other step.
Retroactively shrink existing rules by moving their large/optional sections into
reference files — the same outcome the on-add reference step (B.3.5) produces,
applied after the fact. Branch E synthesizes no new content: it relocates text
that already lives in a rule, so a rule that grew too long (e.g. a distilled book
that landed entirely inline) becomes a lean conceptual rule plus on-demand
references. The active <module> and its <tier>s were already resolved in Step
0.5; the module contract's Candidate Analyzer is the engine.
This branch is non-destructive: content moves, it is never deleted, every
proposal is confirmed before writing, and it leans on git as the safety net. It does
not touch the registry, src/, or the helper script.
Parse the rule scope from the remaining $ARGUMENTS (after the optimise keyword was
consumed in Phase A):
Named rules present (e.g. optimise dotween zenject) → that is the scope.
Resolve each name to a file under .unikit/memory/<module>/<tier>/ (match against
RULES_INDEX.md; ask if a name is ambiguous).
No names → AskUserQuestion:
Options:
Whatever the scope, process the rules in batches of 2-3 at a time — analyze, present, confirm, and write one batch before moving to the next. This keeps each confirmation focused and the diff reviewable.
For each rule in the current batch:
research-pipeline.md B.3.5): before proposing any new
reference file, scan the tier's existing references/ for a file that already
covers the topic and target it instead of forking a near-duplicate.Present the candidates per rule, grouped into Tier 1 and Tier 2 (each with
which signals fired and the target
.unikit/memory/<module>/<tier>/references/{file}.md), then AskUserQuestion
exactly as B.3.5 does:
Options:
Always report the result, including "0 candidates" for a rule that is already lean — Branch E must say so rather than silently skip it.
For each approved candidate:
> **References**: header line and add/extend a
## {Content} Lookup Workflow section telling the LLM when to open it. The main
rule keeps only pointers, not the moved data.Reference files are not indexed in RULES_INDEX.md (only main rules are); the main
rule's row is unchanged unless its Scope/Load when changed (they should not).
After the last batch, go to the Final Step: Confirm — it runs unikit-ai rules sync (reconciling the moved files into .unikit.json state and regenerating
RULES_INDEX.md) and prints the report. The Quality Gate runs in structural-only
mode for Branch E (no synthesis to grade — see the Quality Gate section).
All file-format specifications — the File Format Template (rule files, with
Scope/Load when prose guidance), the Reference File Format, the
Reference Candidate Extraction strategies, and the RULES_INDEX.md Format —
live in the active module's contract:
{{skills_dir}}/{{self_name}}/references/module-<moduleId>.md.
Always read the contract for the resolved module and follow its formats exactly. This router intentionally does not restate them, so a new module can define its own conventions without touching this file.
A cheap, automatic self-check that runs after a branch finishes writing and before the Final Step report. It is gated by intent: run it only for ADD RULE (Branch A, including the existing-file update path), RESEARCH (Branch B), and OPTIMISE (Branch E — structural checks only, since it synthesizes no new content; see below). Skip it entirely for MIGRATE RULES (Branch C), VALIDATE INDEX (Branch D — it already exited and never reaches here), and the Step 1.5 install-from-registry short-circuit — none of those produce freshly synthesized content to grade (Migrate rephrases existing entries, Validate only reconciles the index, an install pulls a vetted upstream file). This is a checklist, not a new approval prompt: run it silently and only surface a ⚠️ line if a check fails.
Always check (every gated write — cheap structural checks):
> **Scope**: and a > **Load when**: line, both written as
prose (not a bare dump of identifiers), per the module contract.{Framework Name}, {Section 1}, TODO, or other template
scaffolding survived into the written file.RULES_INDEX.md has a row for the file (new files only).For Branch E (Optimise) these structural checks apply to the relocation: the
optimised main rule still carries its > **Scope**: / > **Load when**: lines, no
placeholder scaffolding leaked into the moved content or the new ## {Content} Lookup Workflow, and each created reference is wired into the main rule's > **References**:
line. Reference files are not indexed, so the RULES_INDEX.md row check covers main
rules only. Branch E runs none of the synthesis checks below.
Additionally — only when the branch actually synthesized content, i.e. Branch B (Research) or Branch A → A.4 with research. Do not run these on the as-is paths (A.2 cross-check-append, A.3 create-as-is, A.4 save-as-is) or Branch E (Optimise) — those write the user's exact words (or merely relocate existing text) with no synthesis, so there is no coverage or distillation to grade:
research-pipeline.md B.3. Many topics raised + only one or
two examples shown = fail. "Example" means whatever the active module contract
defines (code snippets for code; numeric tables / worked formulas for gamedesign).If any check fails, fix the written file before the Final Step report (or, when a coverage gap is intentional, record the reason in the rule). Then continue to the Final Step.
First, run the Quality Gate above (ADD RULE / RESEARCH / OPTIMISE — structural-only for Optimise; skip for Migrate, Validate, and the install short-circuit), then produce the report below.
Reconcile .unikit.json state with disk (after Branch A / B / C / E only):
If the just-completed branch was Branch A (Add Rule), Branch B (Research), Branch C (Migrate Rules), or Branch E (Optimise) — i.e. anything that wrote a new or updated rule/reference file into .unikit/memory/<module>/ — run the CLI sync command so the generated file is registered in .unikit.json.rules.installed and RULES_INDEX.md is regenerated from authoritative state + disk:
unikit-ai rules sync
Why this matters: Branches A/B/C write files via Write/Edit directly and never touch .unikit.json. Without a sync pass, the new rule lives on disk but remains invisible to rules status, rules install <id> --force, and — most importantly — to /unikit Step 9.3, which builds its "already installed" set from .unikit.json state. Skipping sync here means the next /unikit run can try to reinstall the same rule from the registry and fail with exit 4 ("already installed"). syncRulesState Phase 1 picks up untracked .unikit/memory/**/*.md files and registers them as source: local entries; Phase 3 regenerates RULES_INDEX.md. That is exactly the reconciliation the skill needs before printing the report.
Treat a non-zero exit code as non-fatal for the skill: log the CLI output to the report and continue. The file is still on disk — the user can re-run unikit-ai rules sync manually.
Skip the sync entirely when:
Stop. Do not proceed to any other step. and never reaches this Final Step at all.rules install already updated state and regenerated the index, and the short-circuit terminates the skill before reaching Final Step.Report to the user (in their configured language):
.unikit.json state was reconciled via rules sync (and whether the index was regenerated)Offer rules-registry promotion (after Branch A / B / C / E only):
If the just-completed branch was Branch A (Add Rule), Branch B (Research), Branch C (Migrate Rules), or Branch E (Optimise) — i.e. anything that actually wrote into .unikit/memory/<module>/ — check whether the project's registry is local:
unikit-ai rules registry show --json
Parse the JSON. If .kind == "local", ask the user whether to promote the memory changes into the registry now via AskUserQuestion:
AskUserQuestion: A local rules registry is configured at <.url from the JSON>.
Promote the memory changes into the registry now by running /unikit-rules-registry update?
Options:
1. Yes — run /unikit-rules-registry update after the Final Step report
2. No — skip promotion, keep the changes in memory only
unikit-rules-registry with the argument update (## Skill calls). Do not collapse the memory report into the promotion run — they are separate, ordered events./unikit-rules-registry update manually later; do not repeat the question or nag on the next invocation.Skip the question entirely (do not ask, do not print a fallback hint) when:
rules registry show --json returned a non-zero exit code or .kind is not "local".Writable (this skill can create and edit, for the resolved module):
.unikit/memory/<module>/<tier>/ — rule files in each of the module's tiers.unikit/memory/<module>/<tier>/references/ — supplementary reference docs, where the module contract allows them.unikit/memory/<module>/RULES_INDEX.md — index of all rule files in the moduleWritable only during Branch C (Migrate Rules):
.unikit/RULES.md and its topic files in .unikit/rules/ — removal of migrated entries only, plus two named edits: the <!-- @no-migrate --> tag of Keep, and the deletion of a topic file that migration emptied, together with its ## Topics row; adding new entries goes through unikit-rules skillRead-only (this skill must NEVER modify these files):
.unikit/config.yaml — project settings (language). Read-only for this skill..unikit/system/modules.yml — module registry snapshot. Generated by unikit-ai; read-only here.{{skills_dir}}/{{self_name}}/references/module-<id>.md — module contracts. Read-only here.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
A test skill from an extension
日本語の概要は準備中です。原文の説明を表示しています。
A test skill from an extension (v2)
日本語の概要は準備中です。原文の説明を表示しています。
Initialize the UniKit framework in a project. Scans the current project to detect the engine and real tech stack, then generates the base framework documents that give AI agents context about the project — the resolved project description, the architecture doc, AGENTS.md, and the user-editable .unikit/config.yaml. This is the one-time, whole-project setup run before any other unikit skill. Use whenever the user wants to initialize, set up, or onboard the framework, e.g. "initialize unikit", "init the framework", "set up unikit", "set up the project", "configure AI context", "scan my project and set it up", "bootstrap the project". It also actualizes the config of a project already set up — say "update the config", "add missing settings", "actualize configuration", "fix my config".
日本語の概要は準備中です。原文の説明を表示しています。
Generate the architecture guidelines for a game project. Scans the project structure and tech stack, then produces .unikit/ARCHITECTURE.md describing the folder layout, dependency rules, and how modules communicate. Name a specific pattern or let it auto-detect. Use when the user wants to define or document the project architecture, e.g. "generate architecture", "describe the architecture", "which architecture should I use", "set up project architecture", or mentions module structure, module boundaries, project organization, or dependency rules.
日本語の概要は準備中です。原文の説明を表示しています。
Archive completed plans. Moves finished folder plans from .unikit/code/plans/<folder>/ to .unikit/code/archive/plans/<folder>/, so plan lookup and the plan lists stop offering them; an unfinished plan moves only when the user picks it, and is marked as unfinished. Lists every plan with its created and last-change dates; plans can be picked by number or by date. Never deletes, renames or commits. Use when user says "archive plans", "archive completed", "archive old plans", "clean up plans", or "show archived plans". Not for .unikit/code/PLAN.md or FIX_PLAN.md; to check that a plan is really done use /unikit-verify, to commit the move use /unikit-commit.
日本語の概要は準備中です。原文の説明を表示しています。
Create conventional commit messages for {{engine_name}} projects by analyzing staged changes. Handles engine-specific concerns like companion file pairing, binary assets, and linking the related plan. ALWAYS use this skill when the user asks to commit, save changes, or create a commit. Trigger phrases include "commit", "create commit", "commit this", "save changes", "save my work". Even if the user simply says "commit" or asks you to commit after finishing a task — invoke this skill, do NOT commit manually via git.
日本語の概要は準備中です。原文の説明を表示しています。