Seafile Retirement — Scrub & Relocation (design)

Status: Design complete, walked section-by-section with Brad 2026-06-18 and approved. Next step is /planningseafile-retirement-plan.md (shares this stem). Dateless while active per the design/plan suffix convention.

One-line: Seafile is retired (client already uninstalled). Scrub every live Seafile reference from the docs/utilities/settings across all three repos, repoint paths to new flat homes under C:\Projects\, then physically relocate the repos and re-wire ~/.claude/ via a handoff script Brad runs outside the session, with a self-check as the verification gate.


Understanding summary

  • What: A single coordinated "de-Seafiling" — scrub Seafile references, repoint all absolute paths, physically relocate the three repos to flat C:\Projects\ peers (claude-personal, yggdrasil, odin-codin), re-wire ~/.claude/, and migrate per-project memory so everything keeps working.
  • Why: Seafile retired — no active benefit on a consistent single machine, more upkeep friction than it was worth. Already uninstalled, so the files at C:\Seafile\Claude\ are inert.
  • Who/where: Brad, single Windows machine, staying local. No multi-machine concern.
  • Constraints / success criteria: after the change — ~/.claude/ resolves (skills, commands, CLAUDE.md); the registered hooks still fire (script paths repointed); per-project memory and session continuity preserved; and no live doc, utility, or setting points at C:\Seafile\… or describes Seafile as the sync mechanism.
  • Key technical constraint: this work is authored from a session running inside C:\Seafile\Claude\yggdrasil. A live session can't cleanly move the directory it runs in, so the physical move + re-wire is a scripted handoff Brad runs after the session closes, not executed mid-session.

Non-goals (explicit)

  • NOT the cloud move. Relocating the whole environment onto a dedicated always-on host (the eventual destination, with Kingdom.md as the visibility window) stays deferred behind Kingdom.md. working/host-relocation-design.md remains the live thread for it.
  • NOT GitHub remotes today. Pushing the three repos to private remotes is the planned backup replacement but is a near-term follow-up right after this work, not part of it. A brief single-copy-local interim is accepted.
  • NOT the AGENTS.md/CLAUDE.md restructuring or the Odin-Codin'→Yggdrasil fold — separate post-Seafile threads (bookmarked 2026-06-18).
  • NOT any Windows→Linux/Bash conversion — that belongs to the cloud move.
  • NOT rewriting historical/dated records (dated current-plan.md checkpoints, archive/*) — they keep their Seafile mentions as accurate history.

Assumptions

  • Uninstalling the Seafile client is done (Brad, 2026-06-18). Scope is the repos, the ~/.claude/ wiring, the physical move, and memory migration.
  • The "personal layer" concept/term stays; only the directory renames to claude-personal.
  • relink.ps1 is the re-wiring mechanism: update its base paths, then re-run (idempotent) to rebuild the junctions/symlinks at the new location.
  • The hook scripts (bell.ps1, webfetch-github-guard.ps1) don't hardcode their own paths (confirmed: no Seafile hits inside them); only their registration in settings.json needs repointing.
  • The per-project memory dir (…\projects\C--Seafile-Claude-yggdrasil\) orphans when cwd changes (Claude Code re-derives the folder name from the path); migrating it is in scope.
  • Nothing external to these repos hardcodes C:\Seafile\… (Brad confirmed — no other scripts/scheduled-tasks/IDE configs/shortcuts).

The design

End state

Three repos at C:\Projects\claude-personal, C:\Projects\yggdrasil, C:\Projects\odin-codin; ~/.claude/ re-wired to those homes; hooks firing from C:\Projects\claude-personal\hooks\; per-project memory preserved at its new hash path; no live artifact referencing C:\Seafile\… or Seafile-as-sync. host-relocation-design.md survives as the live cloud thread. C:\Seafile\Claude\ left on disk (inert) for Brad to delete by hand once verified.

Phase A — in-session edits (git-tracked; done now while files are still at C:\Seafile)

claude-personal repo (the personal repo; renamed at move time):

  • skills/new-machine-setup/relink.ps1$lib = 'C:\Seafile\Claude''C:\Projects'; $repos 'personal''claude-personal'; the two literal personal\… paths (CLAUDE.md symlink ~L76, repo-settings ~L83) → claude-personal\…. Update the header comment (drops "Seafile library"). Optional robustness: harden broken-reparse-point handling so a stale junction whose target moved is removed before re-creation — though the relocation script's pre-clean (D9) makes this non-critical for the move itself.
  • skills/new-machine-setup/SKILL.md — the portability rewrite: from "install Seafile client + sync library" to "get the three repos onto the machine (GitHub clone later / thumb-drive copy / manual paste), placed at C:\Projects\{claude-personal,yggdrasil,odin-codin}, then run relink.ps1." Drop the "Seafile Details" section; repoint all C:\Seafile\… paths; reword the "doesn't ride Seafile sync" lines (settings/plugins are machine-local for other reasons); update the frontmatter description + triggers (drop "Seafile symlinks"); fix the "Standard File Structure" footer.
  • skills/new-machine-setup/evals/evals.json — the 3 eval prompts + expected-outputs are Seafile-framed; rewrite to the portable framing.
  • claude-config/README.md — repoint hook paths; reword the "all paths under C:\Seafile\Claude\ library root → machine-independent" framing; dereference Seafile generally.
  • claude-config/settings.json (snapshot) — hook command paths → C:/Projects/claude-personal/hooks/…; drop the now-dead Read(//C/Seafile/Claude/**) allow (covered by the existing Read(//C/Projects/**)).
  • CLAUDE.md — Machine Setup rewrite: "Standard paths," the "Seafile sync" section, and "Layered configuration" lose Seafile-as-sync and describe the flat C:\Projects\ layout (three sibling repos, no library root). Keep the still-true conventions (mklink/Dev Mode, line-endings, settings hand-management — reworded to drop Seafile framing). Reconcile the "commit convention" line that currently endorses a "Co-Authored-By trailer" → state the rule below. Add the co-author convention (promoted from memory).
  • .gitignore — reword the "Seafile library" comment.

yggdrasil repo:

  • AGENTS.md:162 — "symlinked from the Seafile library root" → new framing.
  • README.md:121 — "cloned to C:\Seafile\Claude\yggdrasil\" → C:\Projects\yggdrasil\.
  • skills/bookmarking/SKILL.md:36bookmarks.md path → new.
  • commands/scry.md:60 — example .puppet path → new.
  • .claude/settings.json:5-6.puppet Write/Edit perms → C:/Projects/yggdrasil/.puppet/**.
  • bookmarks.md — reconcile Seafile-referencing entries: L20 (drain its doc-scrub portion as done-by-this-work; keep the cloud-relocation remainder pointing at host-relocation-design.md), L15 (repoint example path), light notes on L35/L36 (the worktree-remove race was blamed on Seafile scanning the tree — with Seafile gone, note it may no longer recur). Also fix the pre-existing newline mash between the 2026-06-09 and 2026-06-11 entries.
  • NEW CLAUDE.md (repo root) — minimal, carrying just the omit-Co-Author convention. Auto-loads when cwd is yggdrasil (the portability insurance). Seed of the future AGENTS.md→CLAUDE.md migration (bookmarked).
  • working/host-relocation-design.md — light touch only (note the viewer = Kingdom.md and the single-machine interim); the design otherwise stays live.

odin-codin repo: no edits (no Seafile references) — it only moves.

memory (…\projects\C--Seafile-Claude-yggdrasil\memory\):

  • Keep git-commit-from-powershell.md (machine-specific PowerShell fact; revisit at the Ubuntu move).
  • Delete omit-claude-coauthor-trailer.md (now dual-homed in CLAUDE.md files).
  • Update MEMORY.md index accordingly.

Library root (not in any repo): seafile-ignore.txt — no action; vanishes when Brad deletes the old folder.

The commit-trailer convention (resolved)

Omit the Co-Authored-By trailer by default, always — including no Co-Authored-By: Claude. Add a trailer only when Brad explicitly asks in the moment. This goes into personal CLAUDE.md (global) and the new yggdrasil/CLAUDE.md (ships with the repo, auto-loads in-repo even when the personal layer isn't wired). Redundant by design — portability insurance.

Memory triage rationale

CLAUDE.md auto-loads (host/OS-independent: Claude Desktop and a future Ubuntu terminal share the same engine and loading rules); AGENTS.md does not auto-load in Claude Code (only via @-import or explicit read). So the convention's reliable home is a CLAUDE.md, not AGENTS.md. The git-commit fact is genuinely machine-specific (PowerShell here-strings vs -F) and stays in per-machine memory. The memory dir migrates regardless, because that fact stays.

Phase B — the handoff machinery (Brad runs after the session closes)

Two PowerShell scripts, living + run from C:\Install\Claude (Brad's scratch dir; outside the moving repos so they survive the move). Copies committed into the repo for the record.

relocate-claude.ps1 — idempotent, with a -DryRun mode (prints every planned action, touches nothing). Ordered steps:

  1. Preflight (abort with a clear message on any failure): all three source dirs present (or detect a partial/re-run); C:\Projects exists; no registered git worktrees in any repo (they break on move); working trees committed.
  2. Move the three dirs → C:\Projects\{claude-personal,yggdrasil,odin-codin} (skip any already at target — idempotent).
  3. Migrate memorycopy (not move) ~/.claude/projects/C--Seafile-Claude-*C--Projects-* (mapping personalclaude-personal), leaving originals as rollback until the old folder is deleted.
  4. Pre-clean ~/.claude links — delete the skills/ + commands/ link-dirs and the CLAUDE.md link wholesale (clean slate; sidesteps broken-junction edge cases).
  5. Repoint live ~/.claude/settings.json — surgically swap the two hook command paths to C:/Projects/claude-personal/hooks/…; leave everything else (incl. GitKraken) untouched.
  6. Run the updated relink.ps1 from its new home → rebuilds the CLAUDE.md symlink + per-skill junctions + per-command symlinks fresh, all pointing at C:\Projects.
  7. Invoke the self-check and print its report.

self-check-claude.ps1 — independently runnable; PASS/FAIL per assertion:

  • The three targets exist and are git repos; the three C:\Seafile sources are gone.
  • ~/.claude/CLAUDE.md resolves to C:\Projects\claude-personal\CLAUDE.md and reads.
  • Every ~/.claude/skills/* junction and commands/* symlink targets C:\Projects\*zero still pointing at C:\Seafile; counts sane.
  • Live settings.json hook paths point at C:\Projects\claude-personal\hooks\ and those .ps1 files exist.
  • Memory dir present at the new C--Projects-yggdrasil path.
  • A residual-reference grep finds no lingering C:\Seafile path in operational files (scripts, settings.json, skill/command instructions, configs) — proving the scrub held. Deliberately excluded (they reference Seafile by topic, not as a live path): the two design docs (seafile-retirement-design.md, host-relocation-design.md), archive/* and dated current-plan.md checkpoints, and the retirement-narrating bookmark entries. The check is about stray hardcoded paths, not prose about the retirement.

Caveat: relocate-claude.ps1 can't be live-tested in the authoring session (it moves the dir we're in). Per Yggdrasil's "verify-by-walkthrough / first-real-use" pattern, the scripts are verified by structural review + the dry-run; the self-check is the real gate on Brad's run.

Choreography (end-to-end order)

Phase A (this session): (1) all git-tracked edits above; (2) author both scripts, drop copies in C:\Install\Claude, commit copies into the repo; (3) commit each touched repo (claude-personal

  • yggdrasil; odin-codin untouched, just moves).

Boundary — /save-progress: (4) pin the checkpoint and dispose this session's worktree (merge to main) before the move — a registered worktree breaks when its parent repo relocates. Then close the session.

Phase B (Brad runs from C:\Install\Claude, session closed): (5) relocate-claude.ps1 -DryRun → eyeball; (6) relocate-claude.ps1 → move + migrate memory + repoint settings + pre-clean/relink + auto-run self-check; (7) open a fresh session at C:\Projects\yggdrasil, confirm all-PASS; (8) delete the inert C:\Seafile\Claude\ by hand once satisfied.

Post-move follow-ups (separate): GitHub private remotes (deferred backup); optional general /hygiene-check bookmark-curation pass; then the future threads (Odin-fold, AGENTS.md repurpose).


Decision log

  • D1 Scope = scrub + relocate now; cloud move stays deferred (host-relocation-design.md lives on). Alt considered: pursue the full cloud relocation now — rejected, gated behind Kingdom.md; or pure doc-scrub with no move — rejected, Brad wants the repos out of the Seafile-named folder.
  • D2 Target = flat C:\Projects\ peers; personalclaude-personal. Alt: C:\Projects\Claude\ (preserve grouping) or C:\Claude\ — Brad chose flat; claude-personal resolves the "personal as a top-level entry reads oddly" wrinkle.
  • D3 Backup via GitHub remotes deferred to a near-term follow-up; brief single-copy-local gap accepted. Alt: set up remotes now (rejected — keep today scoped) / other interim backup (Brad: thumb-drive copy is enough optionality for now).
  • D4 Approach 1: one idempotent relocate script (+-DryRun) + a separate self-check. Alt: guided manual steps + small helpers (rejected — more hands-on, missable steps); defer all to a fresh post-move session (rejected — wastes hot-context editable work).
  • D5 Old C:\Seafile\Claude\ left intact for manual deletion (rollback path); the script does not auto-delete it.
  • D6 Memory: git-commit fact stays in memory (machine-specific); co-author convention dual-homed (personal CLAUDE.md + new yggdrasil/CLAUDE.md), removed from memory; memory dir migrated regardless.
  • D7 Commit trailer: omit Co-Authored-By by default, always; add only on explicit request.
  • D8 Yggdrasil convention home = minimal yggdrasil/CLAUDE.md (auto-loads), not AGENTS.md (Claude Code doesn't auto-load AGENTS.md — verified against code.claude.com/docs). Broader AGENTS.md repurpose + convention migration deferred (bookmarked 2026-06-18).
  • D9 Post-move broken-junction risk handled by pre-cleaning ~/.claude links, then relinking fresh — chosen over trusting in-place repair of stale reparse points.
  • D10 Session worktree disposed (merged to main) before the physical move.
  • D11 Scripts live/run from C:\Install\Claude; copies committed for the record.

Related bookmarks (captured 2026-06-18, separate efforts)

  • Fold Odin Codin' into Yggdrasil (after Seafile retirement).
  • Repurpose AGENTS.md as external-facing + migrate internal conventions to auto-loading CLAUDE.md + update /good-morning (the new yggdrasil/CLAUDE.md is this thread's seed).

Handoff

Ready for /planningworking/seafile-retirement-plan.md. The plan should sequence Phase A (per-repo edit tasks with verifiable outcomes), the two scripts as build-and-structurally-verify tasks, and Phase B as the documented handoff + self-check gate.