pbring 0.2.0

Secure macOS clipboard history daemon
# pbring

macOS向けのセキュアなクリップボード履歴デーモン。暗号化、ヘッドレス、パイプ志向。
Linux Waylandの [cliphist](https://github.com/sentriz/cliphist) に相当するmacOS版。

*pasteboard + ring -- Emacsのkill-ringのように、コピー履歴をリングバッファとして暗号化保管する。*

## 特徴

- AES-256-GCMによるエントリ単位の暗号化、キーはmacOS Keychainに保管
- NSPasteboardマーカーによるパスワード自動フィルタリング(1Password、Keychain等)
- `org.nspasteboard.source` によるループ防止
- TTLベースの自動期限切れ(デフォルト: 24時間)
- `zeroize` によるメモリ安全性 -- 平文はdrop時にワイプ
- UIなし -- 純粋なCLI、パイプで任意のピッカーと連携

## インストール

```bash
cargo install --path .
```

## クイックスタート

```bash
# デーモン起動(フォアグラウンド)
pbringd

# launchdに登録して自動起動
cp resources/com.pbring.daemon.plist ~/Library/LaunchAgents/
launchctl load ~/Library/LaunchAgents/com.pbring.daemon.plist

# 履歴から選択してクリップボードに復元
pbring list | fzf | pbring copy
```

## コマンド

### `pbringd`

デーモンバイナリ。`NSPasteboard.general.changeCount` を500ms間隔でポーリングし、クリップボード内容を暗号化してSQLiteに保存する。

- PIDファイル: `~/.local/state/pbring/pbringd.pid`
- `SIGTERM` / `SIGINT` で安全にシャットダウン

### `pbring list`

```
<id>\t<timestamp>\t<type>\t<preview>
```

| オプション | 説明 |
|-----------|------|
| `--limit N` | 表示する最大エントリ数(デフォルト: 100) |
| `--type text\|image\|file` | メディアタイプでフィルタ |

### `pbring get`

stdinから1行(`<id>\t...`)を読み取り、エントリを取得・復号してstdoutに生バイト出力する。他のツールへのパイプに使用。

```bash
pbring list | head -1 | pbring get
```

### `pbring copy`

stdinから1行(`<id>\t...`)を読み取り、エントリを取得・復号して正しいUTIでペーストボードに直接セットする。テキスト、画像、ファイルに対応。

```bash
pbring list | fzf | pbring copy
```

### `pbring delete`

stdinから1行を読み取り、該当エントリを削除する。

```bash
echo "42" | pbring delete
```

### `pbring clear`

全エントリを削除する。DBファイル自体は残る。

### `pbring wipe`

全エントリを削除し、DBファイルをゼロ埋めしてから削除する。完全な痕跡消去用。

## セキュリティ

### ペーストボードマーカーによるフィルタリング

デーモンは `NSPasteboard.general.types` を検査し、以下のマーカーがある場合は記録をスキップする。

| マーカー | 用途 |
|---------|------|
| `org.nspasteboard.ConcealedType` | パスワード(1Password、LastPass、Keychain) |
| `org.nspasteboard.TransientType` | 一時的なコンテンツ(TextExpander) |
| `org.nspasteboard.AutoGeneratedType` | 自動生成コンテンツ(Keyboard Maestro) |
| `com.agilebits.onepassword` | 1Password固有マーカー |
| `PasswordPboardType` | レガシーパスワードマーカー |

### 暗号化

- アルゴリズム: AES-256-GCM、エントリごとにランダム96bitノンス
- キー: 256bit、初回起動時に生成、macOS Keychainに保存(`com.pbring.encryption-key`- Keychainアクセスは `security` CLIコマンド経由

### メモリ安全性

- 復号データは `Zeroizing<Vec<u8>>` で保持 -- drop時にワイプ
- 暗号化キーは `Zeroizing<[u8; 32]>` で保持

## 設定

`~/.config/pbring/config.toml`

```toml
poll_interval_ms = 500        # ポーリング間隔(ミリ秒)
max_entries = 1000             # 最大保持エントリ数
ttl_seconds = 86400            # エントリのTTL(0で無期限)
max_entry_bytes = 10_485_760   # 最大エントリサイズ(10MB)
record_types = ["text", "image", "file"]
extra_ignored_types = []       # 追加の除外NSPasteboardType文字列
ignored_apps = []              # 除外するバンドルID
preview_max_chars = 100        # プレビューの最大文字数
```

全フィールドは省略可能。上記はデフォルト値。

## ファイル配置

| ファイル | パス |
|---------|------|
| データベース | `~/.local/share/pbring/history.db` |
| 設定ファイル | `~/.config/pbring/config.toml` |
| PIDファイル | `~/.local/state/pbring/pbringd.pid` |
| launchd plist | `~/Library/LaunchAgents/com.pbring.daemon.plist` |

## 動作要件

- macOS 14 (Sonoma) 以降
- Rust 1.75+

## ライセンス

MIT