A test skill from an extension
日本語の概要は準備中です。原文の説明を表示しています。
Curate .unikit/MCP-RECHECK-NOTES.md — the project's log of findings about the configured engine MCP server. Four jobs: re-stamp (the server moved, so every entry is suspect), replay (reproduce a `replay: safe` finding inside a disposable sandbox to see whether it still holds), retire (offer to drop what was fixed or went upstream), and upstream (print a ready diff for the packaged INDEX.md). Use for "audit the MCP notes", "are these findings still true", "recheck the MCP traps", "clean up MCP-RECHECK-NOTES", "the server was updated — revisit the notes". Replaying mutates a live editor, so it starts by telling you how to prepare it — save your scene, open an empty one — and asks once before touching anything. Everything it creates lives under a single UNIKIT_AUDIT_<runid> prefix, is deleted in one action, and the scene is never saved. To record a NEW finding use /unikit-mcp-trap instead.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
.unikit/MCP-RECHECK-NOTES.md accumulates. Findings get fixed upstream, calls disappear,
servers move. Left alone the file drifts from a protection into a superstition — every
row costing a call, none of them still true.
This skill is the pass that keeps it honest. It is a project tool, not a release
tool: it curates what this project observed, and it never edits the packaged rules tree
(.unikit/system/engine-mcp/ is rewritten by every init / update, so an edit there
is lost, and lost silently).
The format is not owned here. /unikit-mcp-trap owns
references/notes-format.md; this skill reads it as the interface and curates against
it.
BEFORE producing ANY output, silently read .unikit/system/LANGUAGE_RULES.md and
apply it to all output (fall back to English if it is missing). Ids, area keywords, and
the observation protocol stay English — other skills grep them. Do not announce 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.
Silently load — do not narrate:
{{skills_dir}}/unikit-mcp-trap/references/notes-format.md — the format
specification: header fields, the two sections, ids, the genre rejections, and the
replay: safe definition. Mandatory; without it, curate nothing..unikit/system/dev-principles.md — the evidence contract (A1/A2), the failure
classes (A3), the area vocabulary (A8), and no rules ≠ no rights (A9). Read it
whole — the part below its LAZY-READ BOUNDARY marker too: this skill touches editor
state, so it is a first Editor task by definition..unikit/system/engine-mcp/INDEX.md — the delivery stamp (server:) and the
base section, including how a project-relative asset path is written for this
engine (see "The asset root is a contract" below). File absent →
there are no known exceptions; that restricts nothing and switches nothing to
⏸️ MANUAL..unikit/MCP-RECHECK-NOTES.md — the file being curated. Absent → say so and
stop; there is nothing to audit and nothing to create.Then pick the run id: <runid> is a short token unique to this run (a timestamp is
enough). Every object, asset, and file this skill creates carries it.
When a replay needs an asset, it goes under a project-relative audit folder:
<the project's asset root>/UNIKIT_AUDIT_<runid>/
The literal form of that root is engine-specific and must not appear in this file.
Take it from .unikit/system/engine-mcp/INDEX.md → the access/base section, which states
how project-relative paths are written for the configured engine. Not stated there → ask
the user once, and record the answer for this run only.
This is not pedantry about portability. A hard-coded root passes every guard in the
repository and then makes the sandbox contract unsatisfiable on any other engine —
silently, because the path simply resolves somewhere else. The whole safety of a replay
rests on "everything I created is under one prefix I can delete in one action". The same
split is why unikit-gd-recon/SKILL.md stays engine-agnostic and puts the per-engine
matrix into references/code-recon.md.
Compare the notes header (server:) against the delivery stamp.
Different → print one line and continue:
WARN [mcp-audit] server in notes header ≠ configured (<notes> ≠ <configured>)
A mismatch makes every entry suspect, not void. Suspect entries stay in force: a stale check costs one call and fails safe, while dropping checks because the server underneath them changed throws away the protection they were written for. What the mismatch changes is the priority of the replay pass — these are the rows most worth replaying, and they are offered first.
The installer renames this file on every completed server switch, so a mismatch is not the ordinary case: it means a switch was interrupted, or the file arrived by hand. That is still information and not an error — and it is not a re-stamp instruction either, see "What this skill never does".
Only rows marked replay: safe are ever replayed. replay: manual rows are shown,
never executed — see Step 2.
Replaying executes an arbitrary call taken from a note's evidence field against a live
editor. That is a mutating operation and this skill is granted accordingly; the
restraint lives in the behaviour below, not in the tool perimeter, and it is
compensated by the structural rollback in SWEEP and CONFIRM.
The order is load-bearing. It is "gates with no edits between them" — the whole run is described and confirmed before anything is created, and nothing is executed before that confirmation.
There are no pre-flight measurements. The user's confirmation is the only gate.
That is a deliberate inversion of what stood here, and the reason is measurement, not
taste. The gate used to refuse on dirty — and a fresh empty untitled scene, the one
safe place to run this, is dirty=True by default (mcp_status → scene=New Scene dirty=True). The gate therefore rejected the only correct state structurally, every
time, while a configured saved production scene reads dirty=False and sailed through.
The check was not merely weak; it was pointing the wrong way. Nor is such a check
portable: of the servers surveyed, one reports no scene-dirty state at all, one does not
document editor state, and one runs an engine where "compiling" is not a concept. The
status blob is not even atomic — four calls in one minute named three different ports.
1 — INSTRUCT, then ASK. Say what this run does and what the editor has to look like for it, then ask once. Nothing is created and nothing is mutated before the answer. The one thing read from the server beforehand is the optional courtesy line in item 3 — it names the open scene, it is allowed to fail, and no decision depends on it.
The message carries, in this order:
UNIKIT_AUDIT_<runid>, the asset
folder if one is needed, the filename prefix — plus which rows will be replayed and
which will only be shown.Editor ready? [y/N].Anything other than an explicit yes ends the run. Nothing has been touched at this point, so there is nothing to undo.
2 — FILTER. Drop replay: manual rows from execution and simply display them, with
the reason they cannot be replayed automatically. manual is also the default for
any row whose replay field is missing or unreadable.
3 — MARK. Place a console marker. Everything after it is the delta this run is answerable for.
This is the first call this skill is required to make — worth knowing when reading a transport error here. Only one call can precede it, the optional courtesy read in Step 1, and it is allowed to have failed or been skipped, so its success is not something you can lean on: treat a failure at MARK as the first evidence about the connection, not the second.
4 — REPLAY. Execute strictly inside the sandbox:
UNIKIT_AUDIT_<runid> the single root object in the scene
<asset root>/UNIKIT_AUDIT_<runid>/ only if an asset is genuinely required
UNIKIT_AUDIT_<runid>_<name> any file outside the project, baselines included
One root object, one folder, one filename prefix. Nothing is created outside them. If a
row cannot be reproduced inside the sandbox, it is not safe — record that and treat
the row as manual from here on.
Each replayed row yields a verdict on its own claim: does the trap still reproduce? Read the state back — the response is not the answer, per A1.
A row that failed to replay because the editor was unstable is not silently demoted.
See "A failed replay is not automatically a demotion" below: the rule above turns "did not
reproduce in the sandbox" into manual, and applied blindly it would corrupt a perfectly
good safe row whose replay happened to land during a compile.
5 — SWEEP. Delete the sandbox root in one action. One root, one deletion; that is what the naming was for.
6 — CONFIRM. Search by the <runid> prefix and do not save the scene.
Step 6 is the structural guarantee: the scene was never saved, so even a sweep that fails leaves nothing on disk. That is why the scene must not be saved even when everything looks clean — saving would convert a recoverable mess into a committed one.
Step 1 prints the name of the currently open scene. That line is shown, and nothing else: it is not compared against anything, no value of it changes the run, and if the call that produces it fails, the line is simply absent and the run continues to the question.
Three words, so it is not turned back into a gate later: shown, not checked.
Name the scene, never characterise it. Print what it is called and stop there — not
"clean", not "empty", not "safe to use". This skill no longer measures scene state, so any
such word is invented; and even when it was measured, "clean" said far more than the
measurement supported. That was the original complaint: dirty=False on a fully configured
production scene got reported as a clean scene, which is a false success (A3) on the
reporting side. Where an unsaved-changes state genuinely has to be described anywhere in
this pipeline, the words are "no unsaved changes", which is what was actually read.
What it is for is the original complaint. A user reads "create a new empty scene", says yes, and has in fact forgotten — with the name in front of them they see their production scene sitting there and answer no. It solves that by informing a human, which is the only place the judgement belongs now.
A safe row whose replay does not reproduce is a retirement candidate (Job 3) — the
server was fixed, or the call is gone. A safe row whose replay fails while the editor is
unstable is neither: it is a run that produced no evidence.
So when there is reason to suspect instability — a compile started mid-run, the transport
answered inconsistently, the console shows unrelated errors after the marker — do not
write manual into the row. Report the failure with the reason and offer the demotion
to the user as a choice.
Without this, the REPLAY rule ("could not be reproduced in the sandbox → not safe")
quietly downgrades a correct row because a domain reload happened to land in the middle of
it, and the note is degraded for good on evidence that never existed.
CLAIM: the sandbox is gone
EVIDENCE: search for UNIKIT_AUDIT_<runid> → 0 objects, 0 assets
console delta from the marker → no new errors
VERDICT: CONFIRMED | NOT CONFIRMED
NOT CONFIRMED → a loud, ERROR-level report listing by name everything that
remains, and no blind repeat of the deletion. A second delete against an unknown
state is how a failed cleanup becomes a destructive one.
<runid> under
the same prefix. They are reported and offered for sweeping as a separate action
with its own confirmation — never folded into this run's cleanup, and never swept
because the prefix matched.A row is a retirement candidate when:
INDEX.md now carries the same check — the finding went upstream and the
local row is a duplicate.Offer each candidate with its evidence. Removal is proposed, never automatic: a replay is one observation, and one observation is exactly the sample size the whole "executors do not write these notes" rule exists to distrust.
Accepted → remove the row from both tables, leaving the id retired. Ids are never
reused: they are referenced from plans (from: <plan>#<id>), from upstream diffs, and
from earlier reports.
Then stamp the header: audited: <today>. This is the only field of the notes header
this skill writes, and the only place audited: ever moves — it is the cursor
/unikit-mcp-trap reads to decide which plans are new.
A local row that would help every project using this server belongs in the packaged tree
instead. Print a ready diff for mcp/<engine>/rules/<server>/INDEX.md — the check
row in the packaged form (id | area | confirm that), with the observation kept beside
it as PR context.
Print it. Do not apply it: the packaged tree lives in the UniKit repository, is owned by the maintainers, and is retired there by a conformance run plus a diff. After the PR merges, the local row becomes a duplicate and the next audit retires it under Job 3.
destructive default call — a class this very
server declares (a scene is created over an unsaved one) — and the editor's
Save / Don't Save dialog is one an agent cannot answer. Preparing the editor is the
user's step, in Step 1, and it stays there.server: in the notes header to make a mismatch go away. The
mismatch is information: it is what makes rows suspect.⏸️ MANUAL because rules are missing, and never treats an
unreachable editor as proof that a capability is absent — that is a stop-condition
(A7), reported as a fact./unikit-mcp-trap — record a new finding; owner of references/notes-format.md..unikit/system/dev-principles.md — the evidence contract, the failure classes, and
the degradation ladder this skill descends when a route is unavailable.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
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.
日本語の概要は準備中です。原文の説明を表示しています。