cktovdlisted
Install: claude install-skill vanducng/skills
# cktovd — claudekit → vd-cli migration
Migrate two layers, in order:
1. **Machine** (once): vd-cli owns the Claude Code control plane — clean-room hooks in `~/.claude/hooks/`, config in `~/.claude/.vd.json`.
2. **Repo** (per project): opt into the `.work` umbrella via `<git-root>/.vd.json` and physically move `plans/` artifacts.
Detect scope from the argument: `--machine` → machine layer only; a repo path (default: cwd git root) → repo layer (runs a machine preflight first); `--check` → verify only, change nothing.
## Layout contract (source of truth: vd-cli `internal/hooks/assets/lib/paths.cjs`)
| Artifact | Legacy (no umbrella) | Umbrella on (`.work`) |
|---|---|---|
| Plans | `<cwd>/plans/` | `<git-root>/.work/plans/` |
| Reports | `plans/reports/` | `<git-root>/.work/reports/` (**sibling** of plans, not nested) |
| Journals | `plans/journals/` | `<git-root>/.work/journals/` |
| Visuals | `plans/visuals/` | `<git-root>/.work/visuals/` |
| State | `plans/goals/` | `<git-root>/.work/state/` (**renamed**: goals → state) |
| Docs | `<cwd>/docs/` | `<cwd>/docs/` — **never moves**: git-tracked team deliverables, umbrella-blind by design |
The umbrella dir is named tool-neutrally (`.work`, not `.vd`) because multiple agents share the repo.
Config precedence: DEFAULT ← global `~/.claude/.vd.json` ← project `<git-root>/.vd.json`. At each layer, if `.vd.json` is absent, `.ck.json` is read as a legacy fallback — **read-only, one-way**: vd never writes `.ck.json`, so migration