Migrate
Skill honerlaw/agent-marketplace/plugins/minerva/skills/migrate
Checks an existing `.minerva/knowledge/` folder against the current LLM-wiki structure — read-only; runs the deterministic `migration_status` shape signal (files that don't conform to the naming convention and are therefore invisible to the wiki tooling — a false clean — plus missing index.md / overview.md and entries with no `## Related` cross-refs) and emits a migration checklist naming the existing skills that close each gap. It never edits files; renames and cross-ref authoring are judgment calls done by hand. Use when old notes don't appear in the index or lint reports clean on a corpus that predates the wiki conventions, when the user asks to migrate / restructure / refactor a legacy knowledge folder or wants a migration check, or when they invoke `minerva:migrate`.From its SKILL.md
npx -y skills add honerlaw/agent-marketplace --skill migrateAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 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.
SKILL.md
6.9 KB, ~1.6k tokens by cl100k_base, as published. Nobody here has run it
Assess an existing .minerva/knowledge/ corpus against the current LLM-wiki structure
and report a migration checklist. minerva:migrate is read-only: it inventories
what needs migrating and names the skill that closes each gap, then stops.
Read-only contract. This skill must not modify any file. Its
allowed-toolsomitsEdit/Write/MultiEditby design. It performs no renames, authors no cross-references, and runs no remediation skill — it only reports and recommends.
This is a SHAPE check, NOT a HEALTH check.
migration_statustells you whether the corpus is in the shape the wiki tooling requires (conforming filenames, index + overview present, entries carrying## Related). A clean migration inventory can still coexist withminerva:linterrors (e.g. a stale index watermark or catalog drift), so a passing migration check still requires a greenminerva:lintpass and aminerva:synthesizepass — those are the ongoing health checks; this is the one-time shape audit.
Why this exists
The detector (scripts/knowledge_lint.py), the fixer (scripts/knowledge_fix.py), and
scripts/synthesis_status.py all enumerate the corpus through the ENTRY_RE glob
(^\d{3}-[a-z]+-.+\.md$) only. A file that doesn't match — a legacy entry named
before the NNN-type-slug convention — is invisible to every one of them, so a
pre-conventions corpus reads as a false clean across the whole toolchain.
minerva:migrate is the one surface that globs the complement of ENTRY_RE and
inventories those invisible files, turning a false-clean legacy corpus into an actionable
checklist.
Target
The .minerva/knowledge/ corpus of the current working tree, resolved from
git rev-parse --show-toplevel — the same per-branch semantics minerva:lint and the
unit-021 drift gate use. Takes no work-unit argument; it audits the whole knowledge base.
Step 1 — Run the shape signal (deterministic, read-only)
Run migration_status through its importable Python API, anchoring both the
scripts/ import path and the corpus path to the working-tree root so it works from any
subdirectory (scripts/migration_status.py is read-only — it never writes):
ROOT="$(git rev-parse --show-toplevel)"; PLUGIN_SCRIPTS=$(find -L "${HOME}/.claude/plugins/minerva" "${HOME}/.claude/plugins/cache/agent-marketplace/minerva" -maxdepth 2 -type d -name "scripts" 2>/dev/null | head -1); python3 -c "import sys, json; sys.path.insert(0, '${PLUGIN_SCRIPTS:-$ROOT/scripts}'); \
from migration_status import migration_status; \
print(json.dumps(migration_status('$ROOT/.minerva/knowledge'), indent=2))"
The returned dict carries plain-primitive signals:
non_conforming_files—*.mdfiles in the knowledge dir that do not matchENTRY_RE(excluding the reservedindex.md/overview.md). The migration-unique signal — these are the files invisible to all other wiki tooling.index_present/overview_present— booleans for the index catalog and the synthesis overview.entries_without_related— conforming entries whose## Relatedblock is absent or empty (no cross-ref edges). Derived fence-aware from the frozen detector'sparse_entry(a fenced## Relatedexample does not count), and robust to malformed legacy entries (a conforming-named file with no**Type**/ no sections is counted, never crashed on).conforming_entry_count— how many entries already match the convention.
Step 2 — Emit the migration checklist (read-only)
Translate the signal into a checklist. For each gap, name the existing skill that closes it and a one-line effect — do not run it, and do not reproduce its findings:
non_conforming_filesnon-empty → these files must be renamed toNNN-type-slug.md(e.g.decision/bug/pattern/constraint) so the tooling can see them. ⚠️ Not automated — rename by hand (renames must update every[[…]]wikilink + the index catalog — deliberate mutation this read-only check never performs).index_presentfalse → runminerva:init(it scaffolds / backfillsindex.mdfrom the existing entries).overview_presentfalse → runminerva:synthesize(it creates the theme-groupedoverview.md).entries_without_relatednon-empty → these entries need## Relatedcross-refs authored. ⚠️ Not automated — authoring which entries relate (and the relationship label) is LLM judgment; do it by hand.minerva:lint-fixonly repairs reciprocals of links that already exist, not the initial edges.- Always, after the corpus conforms → run
minerva:lintto surface mechanical drift (index watermark, broken links, missing reciprocals) andminerva:lint-fixto repair the deterministic subset. Then runminerva:synthesizeto (re)build the overview.
Present it as a numbered checklist with the counts from the signal, then stop. If
non_conforming_files and entries_without_related are both empty and index + overview
are present, report: migration: corpus is in conforming shape (<N> entries) — run minerva:lint + minerva:synthesize to confirm health.
Out of scope
- Any file mutation — no renames, no cross-ref authoring, no index/overview writes.
This skill reports; the gated/judged remediation lives in
minerva:init/minerva:lint-fix/minerva:synthesize(run by the user) or in future migration-APPLY units. - Editing the frozen detector (
scripts/knowledge_lint.py) —migration_statusconsumes itsENTRY_RE/parse_entryAPI, never re-derives it. - Being a health check — mechanical drift and synthesis staleness are owned by
minerva:lintandminerva:synthesize; this skill checks shape, not health. - Scanning subdirectories — like the detector / fixer / synthesis tooling,
migration_statusglobs*.mdnon-recursively (top-level of.minerva/knowledge/only); entries nested in a subdirectory are not inventoried (consistent with the rest of the toolchain, which is equally non-recursive).
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.