---
name: claude-resources-share
description: "Share Claude Code resources (memories, settings, skills, hooks, etc.) across projects via the centralized claude-settings repo. Use when: (1) User says 'share claude resource', 'sync settings', or 'export to claude-settings', (2) User wants to copy .claude/* files to the central repo, (3) Reusing memory or skills across projects, (4) Backing up local Claude config to the global repo."
argument-hint: "[-a|--auto]"
---

# Claude Resources Share

One-direction publish from `$HOME/.claude/` (private) to `$HOME/repos/p/claude-resources` (public).

## Auto mode

If the user passes `-a` or `--auto` (e.g. `/claude-resources-share -a`, `/claude-resources-share --auto`, or wording like "auto", "if no problems do copy and push", "do it all if clean"), enable **auto mode**:

- **Step 1**: still run the scan, but if findings are clean (no HIGH/MEDIUM priority issues per `/purge-private-info`), skip the user-confirmation gate and proceed automatically. If findings are NOT clean, stop and report — do not auto-proceed.
- **Step 6**: skip the choice prompt and run `/commits` with push (option 1) automatically.

In normal mode (no flag), follow the original gates: ask for confirmation after the scan and ask which commit option to use.

## Paths

- **Source**: `$HOME/.claude/`
- **Target**: `$HOME/repos/p/claude-resources`

## Directories to copy

| Source | Target |
|--------|--------|
| `$HOME/.claude/commands/` | `commands/` |
| `$HOME/.claude/skills/` | `skills/` |
| `$HOME/.claude/agents/` | `agents/` |
| `$HOME/.claude/hooks/` | `hooks/` |
| `$HOME/.claude/scripts/` | `scripts/` |
| `$HOME/.claude/web/` | `web/` |
| `$HOME/.claude/CLAUDE.md` | `CLAUDE.md` |

## Excludes (apply to all rsync operations)

- `node_modules/`
- `.claude/` (stray nested config dirs inside subtrees, e.g. `skills/.claude/`)
- `.docusaurus/`
- `build/`
- `dist/`
- `__pycache__/`
- `.DS_Store`
- `*.pyc`
- `.cache/`
- `pnpm-lock.yaml`
- `package-lock.json`
- `target/`

## Symlinks

Skip symlinks during copy. Symlinks in `$HOME/.claude/skills/` typically point to project-local repos that do not exist on a fresh machine, so dereferencing or preserving them in the public bundle would break the install. The rsync flag `--no-links` skips them entirely.

## Plugin manifests (preserved)

The public repo contains `.claude-plugin/marketplace.json` and `.claude-plugin/plugin.json` so users can install the bundle via `/plugin marketplace add takazudo/claude-resources`. These files live ONLY in the public repo (not in `$HOME/.claude/`), and Step 3's cleanup loop must NOT delete `.claude-plugin/`.

## Workflow

### Step 1: Scan for private info

Invoke the `/purge-private-info` command, targeting the source directories listed above. Scan file contents for:

- API keys, tokens, passwords, webhook keys
- Client/corporate names that appear to be real clients
- Personal SNS accounts (other than the repo owner's)
- Hardcoded absolute paths containing usernames (e.g., `$HOME/`)

Present all findings to the user. **Do NOT proceed until the user explicitly confirms** there are no problems or that findings are acceptable.

In **auto mode** (`-a` / `--auto`): if the scan reports no HIGH/MEDIUM priority findings (clean result), skip the confirmation gate and proceed to Step 2. If anything is flagged, stop and report — auto mode never auto-confirms a non-clean scan.

### Step 2: Prepare target directory and pull latest

```bash
# Create target if it doesn't exist
mkdir -p $HOME/repos/p/claude-resources
```

If the target has a `.git/` directory, pull latest to avoid conflicts:

```bash
cd $HOME/repos/p/claude-resources
git pull --rebase
```

If not a git repo, the user should initialize it separately.

### Step 3: Remove old content and fresh copy

First, remove all old content in the target (preserving `.git/`, `.gitignore`, `README.md`, `LICENSE`):

```bash
# Remove previous copies (but preserve git and repo meta files)
cd $HOME/repos/p/claude-resources
for dir in commands skills agents hooks scripts web; do
  rm -rf "./$dir"
done
rm -f ./CLAUDE.md
```

Then copy fresh from source using rsync. **IMPORTANT**: Pass each `--exclude` flag separately — do NOT store them in a shell variable, as variable expansion breaks glob patterns like `*.pyc`. The `--no-links` flag is critical: it skips symlinked skills/commands/agents that point to project-local repos.

```bash
SRC="$HOME/.claude"
DST="$HOME/repos/p/claude-resources"

for dir in commands skills agents hooks scripts web; do
  rsync -av --no-links \
    --exclude=node_modules \
    --exclude=.claude \
    --exclude=.docusaurus \
    --exclude=build \
    --exclude=dist \
    --exclude=__pycache__ \
    --exclude=.DS_Store \
    --exclude='*.pyc' \
    --exclude=.cache \
    --exclude=pnpm-lock.yaml \
    --exclude=package-lock.json \
    --exclude=target \
    "$SRC/$dir/" "$DST/$dir/"
done
cp "$SRC/CLAUDE.md" "$DST/CLAUDE.md"
```

### Step 4: Verify and clean

After copying, verify no excluded artifacts leaked through and confirm the plugin manifests are still in place:

```bash
DST="$HOME/repos/p/claude-resources"

# Check for leaked node_modules
leaked=$(find "$DST" -name node_modules -type d 2>/dev/null)
if [ -n "$leaked" ]; then
  echo "WARNING: Leaked node_modules found, removing:"
  echo "$leaked"
  find "$DST" -name node_modules -type d -exec rm -rf {} + 2>/dev/null
fi

# Clean .DS_Store files
find "$DST" -name .DS_Store -delete 2>/dev/null

# Sanity check: plugin manifests must exist for marketplace install to work
for f in .claude-plugin/marketplace.json .claude-plugin/plugin.json; do
  if [ ! -f "$DST/$f" ]; then
    echo "ERROR: Missing $f -- marketplace install will fail. Restore before pushing."
  fi
done

# Sanity check: no symlinks should have leaked through
leaked_links=$(find "$DST" -type l 2>/dev/null)
if [ -n "$leaked_links" ]; then
  echo "WARNING: Symlinks leaked through (should be skipped via --no-links):"
  echo "$leaked_links"
  find "$DST" -type l -delete 2>/dev/null
fi
```

### Step 5: Summary

Report file counts per directory:

```bash
DST="$HOME/repos/p/claude-resources"
for dir in commands skills agents hooks scripts web; do
  echo "$dir: $(find "$DST/$dir" -type f | wc -l) files"
done
echo "CLAUDE.md: 1 file"
```

### Step 6: Commit and push

**Normal mode**: Ask the user whether they want to commit and push the changes to the target repo. **Do NOT auto-commit or auto-push.** Present the options:

1. Commit and push
2. Commit only (no push)
3. Skip (leave changes uncommitted)

If the user chooses to commit, use the `/commits` skill to commit inside the target repo directory. If they also want to push, push after committing.

**Auto mode** (`-a` / `--auto`): skip the prompt. Run `/commits` inside the target repo directory and push (equivalent to option 1) without asking. Report the commit and push result back to the user.

## Scan whitelist

The following items are known and acceptable — do NOT flag them during the Step 1 scan:

- IFTTT webhook event names in `hooks/notify-ifttt.sh` (the key itself is in an env var)
- References to "CodeGrid", "esa", repo names like `takazudo-codegrid-writing`, `takazudo-esa-writing` in skills/agents (publicly known authorship)
- `$HOME/repos/w/` and `$HOME/repos/p/` directory structure references (personal convention, no secrets)

## Important rules

- **Never copy from public to private.** This is strictly one-direction.
- **Never skip Step 1.** The safety scan is mandatory every time.
- **Never auto-confirm a non-clean scan.** In auto mode, only proceed when the scan is fully clean; any HIGH/MEDIUM finding stops the flow and requires user input. In normal mode, always wait for explicit user approval after the scan.
- **Never store rsync excludes in a shell variable.** Pass each `--exclude` flag inline to avoid glob expansion issues.
- **Never delete `.claude-plugin/`** during cleanup. Step 3 only removes `commands/`, `skills/`, `agents/`, `hooks/`, `scripts/`, `web/`, and `CLAUDE.md` — the plugin manifests are public-repo-only files and must persist across shares.
- **Never include symlinks.** Use `--no-links` in rsync. Symlinked skills/commands/agents point to project-local repos that do not exist on a fresh machine and would break installs from the marketplace.
