From mark-my-words
Migrate mark-my-words data files from the old flat .things/ layout to the per-plugin directory structure. Moves voice profiles and renames the blog working directory.
How this skill is triggered — by the user, by Claude, or both
Slash command
/mark-my-words:migrate-mmwThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
<purpose>
This skill handles data file relocation only. Config migration (config.yml -> config.json + preferences.json) is handled by /things:setup-things. Run /things:setup-things first if config.json doesn't exist yet.
<load-config>
<action>Resolve the user's home directory.</action>
<command language="bash" output="home" tool="Bash">echo $HOME</command>
<constraint>Never pass `~` to the Read tool.</constraint>
<read path="<home>/.things/config.json" output="config" />
<if condition="config-missing">Tell the user: "Run `/things:setup-things` first to initialize your .things directory." Then stop.</if>
</load-config>
<action>Check for old data.</action>
<command language="bash" tool="Bash">ls -d <home>/.things/voices 2>/dev/null; ls -d <home>/.mark-my-words-workdir 2>/dev/null</command>
<if condition="no-old-data-found">Tell the user: "No old mark-my-words data found to migrate. Your data is already in the new location or hasn't been created yet." Then stop.</if>
Show Migration Plan
<action>Inventory old data.</action>
<command language="bash" tool="Bash">echo "voices: $(ls <home>/.things/voices/*.md 2>/dev/null | wc -l | tr -d ' ') files"; echo "workdir: $([ -d <home>/.mark-my-words-workdir ] && echo 'yes' || echo 'no')"</command>
<output-format>
mark-my-words migration plan:
Data moves:
- `~/.things/voices/` (<n> files) -> `~/.things/mark-my-words/voices/`
Renames:
- `~/.mark-my-words-workdir` -> `~/.mark-my-words` (if present)
</output-format>
<if condition="dry-run-flag">Show the plan and stop. Do not move any files.</if>
<ask-user-question>
<question>Proceed with mark-my-words data migration?</question>
<option>Yes -- move files now</option>
<option>No -- cancel</option>
</ask-user-question>
Create Target Directories
<command language="bash" tool="Bash">mkdir -p <home>/.things/mark-my-words/voices</command>
Move Voice Profiles
<constraint>Use `mv` (not `cp`) to avoid duplicates. Skip items that don't exist.</constraint>
<command language="bash" tool="Bash">mv <home>/.things/voices/* <home>/.things/mark-my-words/voices/ 2>/dev/null || true</command>
Rename Blog Working Directory
<if condition="old-workdir-exists">
<command language="bash" tool="Bash">mv <home>/.mark-my-words-workdir <home>/.mark-my-words</command>
<if condition="preferences-exist">
<action>Read `<home>/.things/mark-my-words/preferences.json` and update `workdir` to `<home>/.mark-my-words` using Edit.</action>
</if>
</if>
<action>Scan for stray copies in common locations.</action>
<command language="bash" tool="Bash">ls -d <home>/Documents/.mark-my-words-workdir <home>/Documents/personal/.mark-my-words-workdir 2>/dev/null</command>
<if condition="stray-copies-found">
<output>
Warning: Found additional `.mark-my-words-workdir` copies:
- `<path>`
These may have uncommitted changes. Review and remove them manually if no longer needed.
</output>
</if>
Clean Up Empty Old Directories
<command language="bash" tool="Bash">rmdir <home>/.things/voices 2>/dev/null || true</command>
<constraint>Only `rmdir` (not `rm -rf`) -- this safely fails if the directory isn't empty.</constraint>
Verify Migration
<command language="bash" tool="Bash">echo "voices: $(ls <home>/.things/mark-my-words/voices/*.md 2>/dev/null | wc -l | tr -d ' ') files"; echo "workdir: $([ -d <home>/.mark-my-words ] && echo '<home>/.mark-my-words' || echo 'not found')"</command>
Handle Git
<git-workflow>
<action>Read git workflow from `<home>/.things/config.json`.</action>
<if condition="workflow-auto">
<command language="bash" tool="Bash">git -C <home>/.things add -A && git -C <home>/.things commit -m "migrate: mark-my-words data to per-plugin directory" && git -C <home>/.things push</command>
</if>
<if condition="workflow-ask">
<ask-user-question>
<question>Commit migrated files to .things repo?</question>
<option>Yes -- commit and push</option>
<option>Commit only -- commit without pushing</option>
<option>No -- I'll handle git myself</option>
</ask-user-question>
</if>
<if condition="workflow-manual">Tell the user their files have been moved and they can commit when ready.</if>
</git-workflow>
Confirm
<completion-message>
mark-my-words data migration complete!
- <n> voice profiles -> `~/.things/mark-my-words/voices/`
- Blog working directory: `~/.mark-my-words`
Your data is now in the per-plugin directory structure. Use `/new-post-mmw` to write a post.
</completion-message>
npx claudepluginhub brennacodes/brenna-plugs --plugin mark-my-wordsMigrates Mycelium projects from legacy npx-degit install (.claude/skills) to plugin install (.claude/ state only). Detects state, guides plugin setup, runs migration via git, verifies preservation. Idempotent.
Migrates Elle plugin installations between versions using sequential idempotent steps with backups. Use for updates, version mismatches, or 'migrate Elle'/'upgrade Elle'.
Applies pending Accelerator meta-directory migrations to update a repo to the latest plugin schema. Prints a one-line preview per migration before applying, and refuses to run on a dirty working tree.