sops-secretslisted
Install: claude install-skill yktsnet/dotfiles-public
# sops-secrets
フリートの secret 運用。`secrets/` 配下はすべて sops(age 鍵)で暗号化してコミットし、`inject` コマンドで暗号化・配置を一括処理する。`devices/secrets.nix` がディレクトリを自動スキャンして全 secret を登録する。
**Agent が実行するときの注意**: Claude Code の Bash ツールは zsh の関数を読み込まないシェルで動くため、Agent は常に実体である `python3 ~/dotfiles/apps/zsh/inject.py <file> <category>` を直接呼ぶこと(下記コマンド例もすべてこの形にしてある)。
## 安全規則
- 平文の secret をリポ内・ディスクバックの領域に置かない。生ファイルは RAM ディスク上でのみ作成する
- `secrets/` の読み取り・編集・作成は原則 Agent に許可しない。**例外**: JSON 形式(`secrets/**/*.json.age`)のみ Read/Edit/Write を許可する運用にする。これらは常に sops による暗号文(ciphertext)であり、平文が直接見えるわけではない。Edit/Write の直前に `.claude/hooks/backup-secret-json.sh`(PreToolUse, matcher `Edit|Write`)が自動でタイムスタンプ付きバックアップ(`*.json.age.bak.<timestamp>`)を残すため、誤編集時はそこから復元できる
- 上記以外の format(`binary` / `dotenv`、ファイル名が `.json.age` で終わらないもの)は引き続き deny のまま。既存カテゴリを Agent に直接触らせたい場合は、新カテゴリを JSON format(`inject` 時に拡張子 `.json` の生ファイルを渡す)で作る
- 復号値そのもの(`sops --decrypt` の出力)を確認する必要があるときは、値を表示せずコマンドに直接食わせるか user に依頼する(この規則は format に関わらず変わらない)
- Issue / PR / コミット等の説明文に実値を書かない。`~/dotfiles/secrets-agents/` の辞書を読み `<PLACEHOLDER>` を使う(グローバル CLAUDE.md の機密マスク規則)
## secret を追加する(通常運用)
```bash
# 1. RAMディスク上で生ファイルを作成・編集
# Linux:
hx /dev/shm/filename.env
# macOS(/dev/shm が無いので RAM ディスクを作る。詳細は references/macos.md):
RAMDISK=$(hdiutil attach -nomount ram://65536 | tr -d ' ')
newfs_hfs -v ramdisk "$RAMDISK" && mkdir -p /Volumes/ramdisk
mount -t hfs "$RAMDISK" /Volumes/ramdisk
hx /Volumes/ramdisk/filename.env
# 2. 暗号化してdotfilesに配置(.age 拡張子が自動で付く)
# Agent は実体を直接呼ぶ