# 동작 방식

> 리포에 무엇이 저장되고, 받을 때 이 컴퓨터에 무엇이 쓰이는지 설명합니다.

## 프로필

프로필은 Claude Code 설정 한 벌입니다. 리포 안에서는 이렇게 생겼습니다.

```text
aisync-config/
  aisync.json
  secrets.json              암호화된 토큰
  profiles/
    default/
      profile.json          설정 폴더, 물려받을 프로필, 환경변수
      mcp.json              MCP 서버 정의 (토큰은 참조)
      files/                ~/.claude에 놓일 파일
        settings.json
        CLAUDE.md
        skills/…
```

프로필마다 설정 폴더가 하나씩 있습니다. `default`는 `~/.claude`, 다른 이름은 `~/.claude-<이름>`을 씁니다. Claude Code의 `CLAUDE_CONFIG_DIR`와 같은 단위라서, 프로필 하나가 Claude Code 계정 하나와 맞물립니다.

## 옮기는 것과 남기는 것

| 옮기는 것 | 남기는 것 |
|---|---|
| `settings.json`, `CLAUDE.md`, `keybindings.json` | Claude 로그인 정보 |
| `skills/`, `agents/`, `commands/`, `output-styles/`, `workflows/` | `projects/`, `history.jsonl`, 세션, 캐시 |
| 사용자 MCP 서버(`.claude.json`의 `mcpServers`) | `.claude.json`의 나머지 항목 |
| | `skills/synced/`, `skills/.trash/` (Claude가 직접 관리) |
| | 플러그인 바이너리 (`settings.json`의 `enabledPlugins`는 옮김) |

받을 때는 이 목록에 있는 파일과 MCP 서버만 건드립니다. 직접 추가한 MCP 서버나 다른 파일은 그대로 둡니다.

## 경로 바꾸기

hooks나 MCP 서버 명령에는 `/Users/alice/...` 같은 절대 경로가 들어가곤 합니다. aisync는 올릴 때 홈 경로를 `{{home}}`으로 바꾸고, 받을 때 그 컴퓨터의 홈 경로로 되돌립니다. 그래서 사용자 이름이 다른 컴퓨터에서도 경로가 맞습니다.

## 받을 때 일어나는 일

1. 리포의 최신 상태를 내려받습니다.
2. 무엇을 추가하고 바꾸고 지울지 계획을 보여 줍니다. `--dry-run`이면 여기서 끝납니다.
3. 프로필이 쓰는 토큰을 이 컴퓨터에서 풀 수 있는지 확인합니다. 키가 없으면 이때 패스프레이즈를 묻습니다. 풀 수 없으면 아무것도 쓰지 않고 멈춥니다.
4. 바꾸거나 지울 파일은 `<설정 폴더>/.aisync/backup/<시각>/`에 먼저 복사합니다.
5. 파일을 쓰고, `.claude.json`의 `mcpServers` 중 이 프로필의 서버만 바꿉니다. 다른 항목은 그대로 둡니다.
6. 무엇을 놓았는지 `<설정 폴더>/.aisync/manifest.json`에 기록합니다.

이 기록 덕분에 다음 받기 때 "지난번 이후 내가 고친 파일"과 "리포에서 바뀐 파일"을 구별할 수 있습니다.

## 올릴 때 일어나는 일

1. 지난번에 받은 파일과 서버를 다시 읽습니다. 새 파일은 `--add`, 새 서버는 `--add-server`로 추가합니다.
2. 바뀐 내용에서 홈 경로를 `{{home}}`으로 되돌리고 토큰이 섞이지 않았는지 검사합니다.
3. 바뀐 파일을 한 커밋으로 만들어 GitHub API로 올립니다. git은 필요 없습니다.

## 실행 중인 Claude Code와 함께

Claude Code는 `.claude.json`을 쓰기 직전에 디스크에서 다시 읽기 때문에, 실행 중인 세션이 aisync가 바꾼 내용을 지우지 않습니다. 다만 MCP 서버는 세션을 시작할 때만 읽으니, 받은 뒤에는 세션을 다시 시작하세요.
