osovv/grace-migrate
Agent-applied GRACE 3 to GRACE 4 migration workflow. CLI validates the result but does not convert or delete files.
npx skills add https://github.com/osovv/grace-marketplace --skill grace-migrate
<skill>
<migration_safety>
Migration is copy-and-validate, not destructive conversion. Before writing .grace, inventory every legacy source, record a restorable backup path outside the proposed cleanup set, present the migration report, and wait for explicit write approval. Never create retroactive C-* bundles.
</migration_safety>
<workflow>
.grace state. If .grace already exists, stop and ask whether migration should merge, replace, or abort.references/migration-report-template.xml, review references/migration-checklist.md, and ask for explicit approval before writing .grace..grace, then run grace lint --path <project-root> --assertions current and grace status --path <project-root> --json. Require status projectKind grace4 with no integrity errors, and record commands, exit states, and findings.git status --porcelain --untracked-files=all before cleanup.</workflow>
<cleanup_preconditions>
Cleanup requires all of: complete inventory, restorable backup, explicit write approval, successful current lint, fresh status proving GRACE 4 with no integrity errors, verified generated coverage, git availability/worktree inspection, recorded porcelain output when applicable, exact proposed paths, separate explicit cleanup approval, and separate dirty or non-git risk acknowledgement when applicable. A missing gate means no cleanup.
</cleanup_preconditions>
<cleanup_failure_rule>
If validation, git inspection, move, archive, or delete fails, stop immediately and state: "Legacy GRACE 3 artifacts remain untouched unless the failure output explicitly lists a completed move." Never retry destructive cleanup automatically.
</cleanup_failure_rule>
</skill>
Take osovv/grace-migrate from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.