rhiza-detach · git:20260923.a1b3fbe · 2026-09-23 · sha256 4640d04be708010f

rhiza-detach git:20260923.a1b3fbeA

Immutable. This exact content is served forever at /api/v1/blob/4640d04be708010f.

---
name: rhiza-detach
description: Detach this repo from rhiza — delete every rhiza-managed file listed in .rhiza/template.lock, prune the emptied directories, and remove the lock file. DESTRUCTIVE; prompts for confirmation unless --force is passed.
---

> **Portable copy of `plugin/skills/detach/SKILL.md`, generated by
> `plugin/scripts/build_bundle.py`. Edit the source and run `make bundle` —
> an edit here is overwritten.**
>
> - **`${RHIZA_ROOT}`** is your `rhiza-claude` checkout. Export it, or
>   substitute the path wherever it appears. Any remark below about the
>   variable being empty in a source checkout is Claude Code's spelling of the
>   same idea — `${RHIZA_ROOT}` replaces it, and the repo-relative fallbacks do
>   not apply, because you are working in the *user's* repo, not in this one.
> - **`/rhiza:<name>`** names another skill in this bundle, `rhiza-<name>`.
>   Invoke it however your client invokes skills.
> - **Tools.** `Read`, `Edit` and `Write` read and write files; `Grep` and
>   `Glob` search; `Bash` is a shell in the user's repo. Use your equivalents.
> - **`AskUserQuestion`** is a multiple-choice question put to the user. With no
>   such tool, ask in plain text, number the options, and **wait for a reply**:
>   where the procedure says nothing is created without an explicit selection,
>   that holds however the question was asked.
> - **Arguments:** [path to a repo root]  (optional; defaults to the current repo).
>   The text below writes `$ARGUMENTS` for what the user passed;
>   substitute it yourself if your client does not.
> - **Runs:** `uv`, `python3`. Nothing here enforces that list, where the
>   plugin's frontmatter did — your client has to permit them.
> - **Never run this on your own initiative** — only when the user
>   asks for it by name.

You are running `/detach` in the **current working directory's repo**.

**This command is a thin wrapper around the bundled `plugin/scripts/detach.py`.** All
the deletion logic lives in that script — a deterministic, stdlib-only Python
program that reads `.rhiza/template.lock` directly (no `rhiza` CLI, no PyYAML
required). Do **not** re-implement it or delete files yourself; run the script.

⚠️ **This is destructive.** It permanently deletes the files rhiza synced into the
repo, removes the directories they leave empty, and deletes `.rhiza/template.lock`
so the repo is no longer rhiza-managed. Files you added yourself are untouched.

**This detaches a repo, not the plugin.** It is the inverse of the *sync*, not of the
installation — the rhiza plugin stays installed and every other repo stays managed. A
user who wants the plugin itself gone from Claude Code wants `/plugin`, not this. If
that is what they appear to be asking for, say so rather than deleting their files.

Argument (optional): `$ARGUMENTS` — a path to the repo root to clean; default is
the current directory.

## 1. Confirm intent first
Because this deletes files, **confirm with the user before running** unless they
have already clearly asked to proceed (e.g. said "yes, detach" or passed
`--force`). Recommend they have a clean git tree / committed work first, so the
deletion is easy to review and revert.

## 2. Run the script
Invoke it with the plugin-root path (it ships inside this plugin, so
`${RHIZA_ROOT}/plugin` resolves at runtime — **keep the quotes**):

```bash
uv run --python 3.12 --no-project python "${RHIZA_ROOT}/plugin/scripts/detach.py" $ARGUMENTS --force
```

- Pass `$ARGUMENTS` through as the optional target path. If it's empty, just omit it.
- The script normally prompts `[y/N]` for confirmation. When run non-interactively
  (as here, with no TTY to answer) an unanswered prompt is treated as "no" and it
  cancels — so pass `--force` (equivalently `-y`) **only after** the user has
  confirmed in step 1, to carry out the deletion they approved.

## 3. If the script can't run
- If `${RHIZA_ROOT}/plugin` is empty (e.g. you're in a source checkout of this repo,
  not an installed plugin), fall back to the repo-relative path: `uv run --python 3.12 --no-project python plugin/scripts/detach.py $ARGUMENTS --force`.
- If `uv` is missing, or the script is genuinely not found at either path, report
  that plainly and stop — never hand-roll the deletions as a substitute.

## 4. Relay the results
- Show the script's output as-is — it prints each `[DEL]` line and a detach
  summary (files removed / skipped / empty dirs removed / errors).
- The script exits **0 on success or a clean no-op, 1 if any deletion failed**. If it
  exited 1, surface the error lines.
- If it reported `No lock file found` or `Nothing to detach`, the repo wasn't
  rhiza-managed — say so; it's not an error.
- Afterwards, point the user at the printed next steps: review with `git status` /
  `git diff`, then commit the removal.