- macOS
git clone https://github.com/Takayyz/dotfiles.git && cd dotfiles && make allgit clone git@github.com:Takayyz/dotfiles.git && cd dotfiles && make allNode.js のランタイム・パッケージマネージャー・グローバルパッケージを Brewfile と同様の形式で宣言的に管理します。
# 個別実行
make volta
# .Voltafile にパッケージを追加した後に再実行すれば差分インストールされます.config/.Voltafile の記法:
runtime "node" "24.11.1" # バージョン固定
manager "pnpm" "10.21.0" # バージョン固定
package "@anthropic-ai/claude-code" # 最新バージョン
セキュリティ強化のため、以下の設定を ~/.npmrc に追加してください。
ignore-scripts=true
min-release-age=3| 設定 | 説明 |
|---|---|
ignore-scripts=true |
インストール時に post/preinstall スクリプトを実行しない(サプライチェーン攻撃の緩和) |
min-release-age=3 |
公開から 3 日未満のパッケージバージョンをインストール拒否(新規汚染パッケージの混入防止) |
prefix は ctrl+a に変更済み。
| キー | 説明 |
|---|---|
ctrl+g |
lazygit をポップアップで開く |
ctrl+n |
navi (チートシート) をポップアップで開く。選択したコマンドは herdr pane send-text で元ペインに送信される (copy & paste) |
ctrl+p |
ghq project switcher (選択後 herdr workspace create で開く) |
prefix+d |
Docker Compose status (Iceberg テーマで色付き表示) |
prefix+m |
btop (システムモニター) |
prefix+alt+g |
セッションナビゲーター (goto。lazygit に ctrl+g を使わせるため既定の prefix+g から退避) |
popup コマンドの環境解決 herdr の custom command は popup 実行時に
HERDR_ACTIVE_PANE_ID/HERDR_ACTIVE_PANE_CWDなどの 環境変数を自動で受け取れる。
tmux 自体・tmux.conf・関連スクリプトは手動起動用に残っているが、通常の利用フローには登場しない。
- 永続化の主は herdr: 常駐サーバ +
~/.config/herdr/session.json(workspace/tab/pane ツリーのスナップショット) で再起動を跨いで復元される。設定不要で常時有効。 - 復元が欲しくなったら
herdr session list/herdr session attach <name>を使う。 - tmux をまた常用したくなった場合は
tmux.confの該当キーバインドのコメントアウトを外し、.zshrcに自動起動ブロックを戻す必要がある (git 履歴から復元可能)。
herdr は agent の状態 (idle/working/blocked/unknown) をプロセスではなく画面テキスト/OSC
シーケンスのルールベース検出 (herdr agent explain <target> --json で確認可能) で判定している。
標準の Claude 用ルールは working をターミナルタイトルの点字スピナー文字でしか検出できないが、
現行の Claude Code はタイトルにスピナーを書かなくなったため (herdr issue
#671)、標準ルールのままだと working 中でも
idle と誤表示される。
.config/herdr/agent-detection/claude.toml に、リモートマニフェスト全体をコピーした上で
画面本体のスピナー/トークン数表示を見る live_working_spinner ルールを追加したオーバーライドを
置いている。herdr はオーバーライドが存在するとリモートマニフェストを丸ごと置き換える (部分マージ
しない) ため、今後 herdr 側でリモートの claude.toml が更新された場合はこのファイルも手動で追従
させる必要がある。
- 反映は
link.sh実行 →herdr server reload-agent-manifests(reload-configはテーマ設定用で agent-detection には効かないので注意)。 - 動作確認は
herdr agent explain <target> --jsonのmatched_rule.idがlive_working_spinnerに なっているかで判定する。
agent が blocked (入力待ち) / done (完了) になった時のデスクトップ通知は、Claude Code の
Stop/Notification フック (osascript) ではなく herdr 側のビルトイン機能に一本化している。
.config/herdr/config.tomlの[ui.toast]でdelivery = "system"/delay_seconds = 0を 設定。macOS ではterminal-notifierがあれば優先使用 (通知クリックでターミナルにフォーカス可能)、 無ければosascriptにフォールバックする。- Claude Code 固有のフックだと Claude Code しか通知が飛ばなかったが、herdr 側に寄せたことで codex/copilot など herdr が管理する全 agent に同じ仕組みで通知が効く。
- 反映は
herdr server reload-config。動作確認はherdr notification show <title>を叩いて"shown":trueが返るか ("reason":"disabled"なら[ui.toast].deliveryがoffのまま)。
Leader は Space。プラグイン管理は lazy.nvim。
| キー | 説明 |
|---|---|
jj (insert) |
Escape |
<Leader>w |
Save |
<Leader>q |
Quit |
<Leader>h / <Leader>l |
行頭 / 行末 |
<Leader>c |
コメントトグル (normal/visual) |
<Leader>yp |
Git ルートからの相対パスをクリップボードにコピー |
<Leader>- / <Leader>\ |
水平 / 垂直分割 |
補助キー (タブ・インデント等)
| キー | 説明 |
|---|---|
<S-Tab> (insert) |
デデント |
<Esc><Esc> |
検索ハイライトクリア |
gg |
ファイル先頭の最初の文字へ |
<Leader>< / <Leader>> |
デデント / インデント |
<Leader>n |
新規ファイル |
<Leader>t |
新規タブ |
<Leader><Tab> / <Leader><S-Tab> |
次 / 前のタブ |
| キー | 説明 |
|---|---|
<Leader>? |
Keymaps 一覧 |
<Leader><Space> |
Smart Find Files |
<Leader>, |
Buffers |
<Leader>/ |
Grep |
<Leader>: |
Command History |
<Leader>ff |
Find Files |
<Leader>fg |
Find Git Files |
<Leader>fr |
Recent Files |
<Leader>fc |
Find Config File |
<Leader>gs |
Git Status |
<Leader>gl |
Git Log |
<Leader>gd |
Git Diff (Hunks) |
<Leader>sg |
Grep |
<Leader>sw |
Grep Word (normal/visual) |
<Leader>sh |
Help Pages |
<Leader>sk |
Keymaps |
<Leader>sd |
Diagnostics |
<Leader>sR |
Resume Last Picker |
<Leader>su |
Undo History |
gd |
LSP: Goto Definition |
gr |
LSP: References |
gI |
LSP: Goto Implementation |
gy |
LSP: Goto Type Definition |
Find / Git / Search / LSP 補助キー
Find (<Leader>f)
| キー | 説明 |
|---|---|
<Leader>fb |
Buffers |
Git (<Leader>g)
| キー | 説明 |
|---|---|
<Leader>gb |
Git Branches |
<Leader>gL |
Git Log Line |
<Leader>gS |
Git Stash |
<Leader>gf |
Git Log File |
Search (<Leader>s)
| キー | 説明 |
|---|---|
<Leader>sb |
Buffer Lines |
<Leader>sB |
Grep Open Buffers |
<Leader>s" |
Registers |
<Leader>s/ |
Search History |
<Leader>sa |
Autocmds |
<Leader>sc |
Command History |
<Leader>sC |
Commands |
<Leader>sD |
Buffer Diagnostics |
<Leader>sH |
Highlights |
<Leader>si |
Icons |
<Leader>sj |
Jumps |
<Leader>sl |
Location List |
<Leader>sm |
Marks |
<Leader>sM |
Man Pages |
<Leader>sp |
Search for Plugin Spec |
<Leader>sq |
Quickfix List |
LSP
| キー | 説明 |
|---|---|
gD |
Goto Declaration |
<Leader>j |
Goto Definition (alias) |
<Leader>r |
References (alias) |
<Leader>ss |
LSP Symbols |
<Leader>sS |
LSP Workspace Symbols |
Other
| キー | 説明 |
|---|---|
<Leader>uC |
Colorschemes |
| キー | 説明 |
|---|---|
<Leader>us |
Toggle Spelling |
<Leader>uw |
Toggle Wrap |
<Leader>ul |
Toggle Line Numbers |
<Leader>uL |
Toggle Relative Numbers |
<Leader>ud |
Toggle Diagnostics |
<Leader>uh |
Toggle Inlay Hints |
<Leader>ug |
Toggle Indent Guides |
<Leader>uT |
Toggle Treesitter |
<Leader>uc |
Toggle Conceal |
<Leader>ub |
Toggle Dark/Light Background |
コンフリクト解消専用。差分閲覧・履歴・その他の git 操作は lazygit を使うので、 diffview 側は merge tool だけを配線している。
| キー | 説明 |
|---|---|
<Leader>gv |
Diffview トグル (競合時にこれ一つで開く) |
マージ / リベースが競合している状態で開くと、競合ファイルが専用セクションに並ぶ。
レイアウトは diff1_plain — 差分ペインを一切出さず、作業ツリーのファイル 1 枚を
コンフリクトマーカー付きで開くだけ。ours / base / theirs は全部マーカーの中にある。
コンフリクト解消のキー (プラグインのデフォルト + 追加分)
| キー | 説明 |
|---|---|
]x / [x |
次 / 前のコンフリクトへ |
<Leader>mo / <Leader>mt / <Leader>mb |
ours / theirs / base を採用 |
<Leader>ma / dx |
全部採用 / 競合領域ごと削除 |
<Leader>mO mT mB mA / dX |
同じ操作をファイル全体に適用 |
<Tab> / <S-Tab> |
次 / 前の競合ファイルへ |
<Leader>e / <Leader>b |
ファイルパネルへフォーカス / トグル |
g? |
ヘルプパネル |
q (パネル上のみ) |
Diffview を閉じる (追加分) |
競合領域の背景色は自前で当てている。diff1_plain は diff モードを使わないので、プラグイン側
は領域に何も塗らないため。
| 領域 | 本文の背景 | マーカー行の背景 + 文字色 |
|---|---|---|
| OURS (HEAD 側) | #1c2724 緑寄り |
#27372b + iceberg green |
| BASE (共通祖先) | #1e202b 中間色 |
#2a2d3a + gray |
| THEIRS (取り込む) | #1e2433 青寄り |
#28324a + blue |
merge.conflictStyle = zdiff3が前提 (.config/git/config)。diffview はマーカーを バッファのテキストから直接パースするので、これが無いと|||||||の base セクション自体が 存在せず、base が見えないうえ<Leader>cbも無反応になるqは競合ファイル側には割り当てていない (マクロ記録を潰さないため)- sunglasses.nvim の減光でファイルパネルにフォーカスした瞬間に競合ファイルが暗くなるので、
Diffview のタブに滞在している間だけ hooks (
view_enter/view_leave) で自動 OFF にする - コンフリクト採用キーは upstream のデフォルト (
<Leader>c系) から<Leader>m(merge) 系へ 移設済み。グローバルの<Leader>c(コメントトグル) が完全一致してしまい、競合バッファではtimeoutlen分の待ちが入り、ファイルパネル上では小文字版が存在しないためコメントが走る という二重の事故になっていたため - 背景は
bgのみ指定した extmark のline_hl_groupなので、CursorLineと同じように treesitter の文字色を潰さず背景だけが乗る - 再描画は
nvim_buf_attachのon_lines。conflict_chooseは API でバッファを書き換えるのでTextChangedでは捕まえられない - デフォルト側は
rhsにfalseを渡して無効化している。この上書きはmode .. " " .. lhsの生文字列で照合されるので、<leader>の綴りを大文字にすると 無効化されず二重登録になる (.config/nvim/lua/plugins/diffview.luaのコメント参照)
コード編集全般の AST ベースシンタックスハイライト・インデントを提供。noice.nvim のコマンドラインハイライトにも利用される。
require("nvim-treesitter").install(): noice.nvim 推奨パーサー + 作業言語 (TypeScript / TSX / JavaScript, PHP / Blade, Rust, Python) + 設定ファイル系 (JSON, TOML, YAML, HTML, CSS) を起動時にインストールmainブランチにはauto_installが無いため、新しい言語を扱うときは このリストに追記する (即時反映は:TSInstall <lang>)
- 100KB 以上のファイルではハイライトを自動で無効化 (パフォーマンス保護)
- パーサー未インストール警告は nvim-treesitter がサポートする言語のみに限定
(
get_lang()は未知の filetype をそのまま返すため、プラグインのパネル (DiffviewFiles等) で存在しない言語名の警告が出るのを防ぐ)
Select — オペレータ (d, c, y, v) と組み合わせて使用:
| テキストオブジェクト | 対象 |
|---|---|
af / if |
関数 (outer/inner) |
ac / ic |
クラス (outer/inner) |
aa / ia |
引数・パラメータ (outer/inner) |
al / il |
ループ (outer/inner) |
Move — 関数/クラス間ジャンプ:
| キー | 説明 |
|---|---|
]m / [m |
次/前の関数の先頭 |
]M / [M |
次/前の関数の末尾 |
]] / [[ |
次/前のクラスの先頭 |
Swap — 引数の入れ替え:
| キー | 説明 |
|---|---|
<Leader>xa |
引数を次と入れ替え |
<Leader>xA |
引数を前と入れ替え |
Language Server Protocol による言語支援。mason.nvim でサーバー・ツールを自動インストール。
自動インストールされる LSP サーバー:
ts_ls— TypeScript / JavaScriptintelephense— PHPlua_ls— Lua (Neovim ランタイム認識)
自動インストールされるツール:
- フォーマッター:
prettier,stylua,php-cs-fixer - リンター:
eslint_d,phpstan
| キー | 説明 |
|---|---|
D |
LSP: Hover Documentation (関数定義・ドキュメント表示) |
gK |
LSP: Signature Help |
<Leader>rn |
LSP: Rename Symbol |
<Leader>ra |
LSP: Code Action (normal/visual) |
gl |
LSP: Line Diagnostics |
<Leader>F |
Format Buffer (conform.nvim) |
Rust 製の高速補完エンジン。LSP・スニペット・パス・バッファの 4 ソースから補完。
- ゴーストテキスト表示
- ドキュメント自動表示 (200ms 遅延)
- キーマップ:
defaultプリセット (<C-space>で手動トリガー、<C-y>で確定、<C-e>でキャンセル)
| filetype | formatter |
|---|---|
| TypeScript / JavaScript / JSON / HTML / CSS / Markdown | prettier |
| PHP | php-cs-fixer |
| Lua | stylua |
- 保存時自動フォーマット (timeout 1s)
<Leader>Fで手動フォーマット:ConformInfoでフォーマッター状態確認
| filetype | linter |
|---|---|
| TypeScript / JavaScript | eslint_d |
| PHP | phpstan |
- トリガー: ファイル保存時・開いた時・Insert モード離脱時
Neovim 内で AI CLI ツール (Claude Code 等) を操作し、Copilot NES (Next Edit Suggestions) をインラインで適用できるプラグイン。
| キー | 説明 |
|---|---|
<C-.> |
Sidekick CLI をトグル (全モード) |
<Leader>aa |
Sidekick CLI をトグル |
<Leader>as |
CLI ツールを選択 |
<Leader>ad |
CLI セッションをデタッチ |
<Leader>at |
カーソル位置のコードを CLI に送信 |
<Leader>af |
現在のファイルを CLI に送信 |
<Leader>av |
ビジュアル選択を CLI に送信 |
<Leader>ap |
プロンプトを選択 |
<Leader>ac |
Claude を直接トグル |
easy-motion 系のジャンプナビゲーション。s を押して文字を入力すると、画面上の候補にラベルが表示され、1〜2 キーで瞬時にジャンプできる。
| キー | モード | 説明 |
|---|---|---|
s |
n, x, o | Flash: 文字検索ジャンプ |
S |
n, o | Flash Treesitter: 構文ノード単位で選択 |
r |
o | Remote Flash: リモートジャンプ (オペレータ待ち) |
R |
o, x | Treesitter Search: 構文ベース検索 |
<C-s> |
c | / 検索中に Flash のラベルジャンプを切替 |
f/F/t/Tも拡張され、複数候補にラベルが表示される- ビルトイン
s(substitute) はclで代替可能
テキストの囲み文字(括弧・クォート等)を追加・削除・変更する。
| キー | モード | 説明 |
|---|---|---|
ys{motion}{char} |
n | 囲みを追加 (例: ysiw" → word を " で囲む) |
yss{char} |
n | 行全体を囲む |
ds{char} |
n | 囲みを削除 (例: ds" → " を削除) |
cs{old}{new} |
n | 囲みを変更 (例: cs"' → " を ' に) |
S{char} |
x | visual 選択範囲を囲む |
カーソル下の単語やテキストオブジェクトのケース (命名規則) を変換する。
| キー | 変換先 | 例 |
|---|---|---|
gas |
snake_case | my_variable |
gac |
camelCase | myVariable |
gap |
PascalCase | MyVariable |
gad |
dash-case | my-variable |
gau |
UPPER_CASE | MY_VARIABLE |
gat |
Title Case | My Variable |
ga. |
dot.case | my.variable |
ga/ |
path/case | my/variable |
- operator モード (
go+ suffix + テキストオブジェクト) も対応。例:gosiwで単語を snake_case に変換
| キー | 説明 |
|---|---|
<S-Enter> |
コマンドライン出力をリダイレクト (cmdline モード) |
<Leader>snl |
最後のメッセージを表示 |
<Leader>snh |
メッセージ履歴 |
<Leader>sna |
全メッセージ |
<Leader>snd |
通知をすべて消す |
claude-mem プラグインのセマンティック検索機能には ChromaDB が必要です。ChromaDB は独立したプロセスのため、PC 再起動後も自動起動するよう launchd に登録することを推奨します。
# 1. ChromaDB をインストール
uv tool install chromadb
# 2. データディレクトリを作成
mkdir -p ~/.local/share/chromadb
# 3. LaunchAgent plist を配置 (下記参照)
# ~/Library/LaunchAgents/local.chromadb.plist
# 4. サービスを登録・起動
launchctl load ~/Library/LaunchAgents/local.chromadb.plist
# 5. 動作確認
curl -s http://localhost:18000/api/v2/heartbeatポートはデフォルトの 8000 から 18000 に変更しています(衝突回避)。.zshenv で CLAUDE_MEM_CHROMA_PORT=18000 を export し、claude-mem 側の接続先を環境変数で上書きしています。
# 停止
launchctl unload ~/Library/LaunchAgents/local.chromadb.plist
# 起動
launchctl load ~/Library/LaunchAgents/local.chromadb.plist
# 状態確認
curl -s http://localhost:18000/api/v2/heartbeat注意: launchd plist を配置せずに使うと、PC 再起動後に ChromaDB が停止し、claude-mem のメモリ検索が機能しなくなります(degraded mode)。
tt-a1i/archify — アーキテクチャ / ワークフロー / シーケンス /
データフロー / ライフサイクル図を、単一ファイルの対話的 HTML として生成する agent skill。
.config/.agents/skills/archify/ に実体をコミットして管理している
(~/.claude/skills はこのディレクトリへの symlink なので、置いた時点で git 管理下に入る)。
gh-stack と同じく gh skill install (gh 2.95.0 時点で preview) を使う。upstream 推奨の
npx skills add ではなく、こちらを使う理由:
SKILL.mdの frontmatter に provenance (github-repo/github-pinned/github-ref/github-tree-sha/github-path) が追記され、どのリポジトリのどのタグ由来かが ファイル自体に残るgh skill listの 4 列目に取得元が表示され、自作 skill と区別できるgh skill updateで更新できる
gh skill install tt-a1i/archify archify --agent claude-code --scope user --pin v2.16.0--pin を付けないと最新を取りに行くので、バージョンを固定したい場合は必ず指定する。
gh skill install は git tree をそのまま取得するため 7.3MB / 190 ファイルになる。upstream が
リリース資産の archify.zip から除外している開発用ファイルと、描画済みサンプルを削って
2.3MB / 71 ファイルにしている。
cd .config/.agents/skills/archify
rm -rf test # 111 ファイル。公式 zip も除外している
rm -f package-lock.json
rm -f scripts/generate-brand-marks.mjs scripts/generate-validators.mjs # 事前生成済みファイルの生成ツール
rm -f examples/*.html # 描画済みサンプル 3.5MB (下記)examples/*.html (5 個 / 3.5MB) を削る根拠:
SKILL.mdからもbin/renderers/delta/のコードからも一切参照されない (唯一名前が出るscripts/render-examples.mjsは、これらを生成する側の出力先指定)- 隣の JSON から
deliverで sha256 まで一致するものを再生成できる
図の見た目を確認したいだけなら node bin/archify.mjs demo <dir> が archify-demo.html を
その場で生成する。
assets/template.html(664KB) と混同しないこと。 こちらはrenderers/shared/cli.mjsが 読み込むレンダリングの土台テンプレートで、削除すると全く動かなくなる。
examples/*.json (14 個) は SKILL.md が「スキーマと JSON example を 1 つずつ読め」と
明示的に指示しているので必須。
更新時の注意:
gh skill updateは削ったファイルを復活させるので、更新後に上記のrmを再実行する。
archify は生成コストが高い (JSON を書いて 700KB 前後の HTML を出力する) ので、会話中の軽い説明で
勝手に起動しないよう .config/claude/settings.json で明示実行のみに制限している。
"skillOverrides": {
"archify": "user-invocable-only"
}skillOverrides の値は 4 種類:
| 値 | 挙動 |
|---|---|
on (省略時) |
description 込みでモデルに提示され、自動起動する |
name-only |
名前だけ提示し description を隠す |
user-invocable-only |
モデルからは隠すが /archify は使える |
off |
両方から隠す (スラッシュコマンドも補完に出なくなる) |
SKILL.mdのdescriptionを書き換えて抑制しないこと。SKILL.mdは provenance 付きの upstream 追跡ファイルなのでgh skill updateで改変が消える。またこのフィールドは照合用で、 トリガー語が並んだまま「明示実行時のみ」と書いても打ち消せる保証がない。この種の制御は 自分の管理物であるsettings.jsonに置く。
軽い図解 (ASCII / Mermaid) の規約は diagram-conventions skill 側の担当なので、AGENTS.md には
archify のことは書いていない。
package.json の ajv 等は devDependency で、実行時に必要なバリデータは
renderers/shared/generated-validators.mjs に事前生成済み。npm install 不要で
node bin/archify.mjs がそのまま動く (要 Node.js >= 18)。
archify は更新のお知らせ表示のためだけに固定 URL へ GET する (ダウンロード・自動更新はしない。
成功時は約 72 時間間隔)。これを止めるため .config/claude/settings.json の env に設定している。
"env": {
"ARCHIFY_UPDATE_CHECK_DISABLED": "1"
}shell の設定 (.zshenv 等) には置かない。 archify が動くのは Claude Code の Bash ツール経由
(node bin/archify.mjs) だけで、settings.json の env はその子プロセスまで届く (既存の
CLAUDE_CODE_* 等と同じ)。shell 側に置くと archify と無関係な全セッションに変数が撒かれ、
スコープが実態より広くなる。
これでお知らせが出なくなるので、更新は手動で gh skill update を叩く運用になる。
.config/.agents/skills/schedule/ の自作 skill。Google カレンダーの予定を取得して整形表示する。
取得経路は 2 つあり、fetch-schedule.sh がどちらを使うか判定する:
gwsCLI — 優先。スクリプト自身が予定まで取得する- Google カレンダー MCP コネクタ — フォールバック。
gwsが未導入 or 未認証のとき
現状 gws は未インストールなので、実際に走るのは常に 2 の経路。
シェルスクリプトから MCP ツールは呼べないため、フォールバック時にスクリプトができるのは
日付レンジの解決までで、実際の取得はモデル側が list_events を叩いて行う。分岐の指示は
SKILL.md に書いてある。出力 JSON の source キー ("gws" / "mcp") が判別子。
bash ~/.claude/skills/schedule/fetch-schedule.sh --week
# => {"source":"mcp", "startTime":"2026-09-07T00:00:00+09:00", "endTime":"2026-09-14T00:00:00+09:00", ...}レンジ計算をスクリプト側に寄せてあるのは、両経路で必ず同じ期間になるようにするため。
モデルに日付計算をさせると週の起点 (月曜固定) や --days=N の境界がブレる。
フォールバックは異常系ではないので exit 0 で返す。非 0 は引数不正か環境不備のときだけ。
leaf — ターミナル用の Markdown プレビューア。Homebrew の formula 名は
leaf-markdown-viewer。brew install leaf は別物 (vrongmeal/leaf、upstream 停止済みで 2027-08-23 に
disable 予定) なので間違えないこと。両者は同じ leaf バイナリを吐くので conflict する。
~/.config/leaf はこのリポジトリの .config/leaf へのディレクトリ symlink なので、
テーマを置いた時点で反映される。
cocopon/iceberg.vim 準拠のカスタムテーマ。配色は
.config/nvim/lua/config/palette.lua (single source of truth) に揃えている。
# config.toml — 相対パスは config.toml のあるディレクトリ基準で解決される
theme = "themes/iceberg.toml"