Skip to content

Latest commit

 

History

497 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dotfiles

total lines GitHub code size in bytes GitHub repo size

macos

Requirements

  • macOS

Via https

git clone https://github.com/Takayyz/dotfiles.git && cd dotfiles && make all

Via ssh

git clone git@github.com:Takayyz/dotfiles.git && cd dotfiles && make all

Volta (.Voltafile)

Node.js のランタイム・パッケージマネージャー・グローバルパッケージを Brewfile と同様の形式で宣言的に管理します。

# 個別実行
make volta

# .Voltafile にパッケージを追加した後に再実行すれば差分インストールされます

.config/.Voltafile の記法:

runtime "node" "24.11.1"       # バージョン固定
manager "pnpm" "10.21.0"       # バージョン固定
package "@anthropic-ai/claude-code"  # 最新バージョン

npm (~/.npmrc)

セキュリティ強化のため、以下の設定を ~/.npmrc に追加してください。

ignore-scripts=true
min-release-age=3
設定 説明
ignore-scripts=true インストール時に post/preinstall スクリプトを実行しない(サプライチェーン攻撃の緩和)
min-release-age=3 公開から 3 日未満のパッケージバージョンをインストール拒否(新規汚染パッケージの混入防止)

herdr キーバインド (カスタム)

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 自体・tmux.conf・関連スクリプトは手動起動用に残っているが、通常の利用フローには登場しない。

  • 永続化の主は herdr: 常駐サーバ + ~/.config/herdr/session.json (workspace/tab/pane ツリーのスナップショット) で再起動を跨いで復元される。設定不要で常時有効。
  • 復元が欲しくなったら herdr session list / herdr session attach <name> を使う。
  • tmux をまた常用したくなった場合は tmux.conf の該当キーバインドのコメントアウトを外し、 .zshrc に自動起動ブロックを戻す必要がある (git 履歴から復元可能)。

herdr の agent status カスタムルール (working 検出パッチ)

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> --jsonmatched_rule.idlive_working_spinner に なっているかで判定する。

デスクトップ通知は herdr に一本化

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].deliveryoff のまま)。

Neovim キーバインド (カスタム)

Leader は Space。プラグイン管理は lazy.nvim。

基本操作 (keymaps.lua)

キー 説明
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> 次 / 前のタブ

Picker (snacks.nvim)

キー 説明
<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

Toggle (snacks.nvim)

キー 説明
<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

Merge Conflict (diffview.nvim)

コンフリクト解消専用。差分閲覧・履歴・その他の 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_attachon_linesconflict_choose は API でバッファを書き換えるので TextChanged では捕まえられない
  • デフォルト側は rhsfalse を渡して無効化している。この上書きは mode .. " " .. lhs の生文字列で照合されるので、<leader> の綴りを大文字にすると 無効化されず二重登録になる (.config/nvim/lua/plugins/diffview.lua のコメント参照)

Treesitter (nvim-treesitter)

コード編集全般の 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 等) で存在しない言語名の警告が出るのを防ぐ)

Textobjects (nvim-treesitter-textobjects)

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 引数を前と入れ替え

LSP (nvim-lspconfig + mason.nvim)

Language Server Protocol による言語支援。mason.nvim でサーバー・ツールを自動インストール。

自動インストールされる LSP サーバー:

  • ts_ls — TypeScript / JavaScript
  • intelephense — PHP
  • lua_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)

Completion (blink.cmp)

Rust 製の高速補完エンジン。LSP・スニペット・パス・バッファの 4 ソースから補完。

  • ゴーストテキスト表示
  • ドキュメント自動表示 (200ms 遅延)
  • キーマップ: default プリセット (<C-space> で手動トリガー、<C-y> で確定、<C-e> でキャンセル)

Formatter (conform.nvim)

filetype formatter
TypeScript / JavaScript / JSON / HTML / CSS / Markdown prettier
PHP php-cs-fixer
Lua stylua
  • 保存時自動フォーマット (timeout 1s)
  • <Leader>F で手動フォーマット
  • :ConformInfo でフォーマッター状態確認

Linter (nvim-lint)

filetype linter
TypeScript / JavaScript eslint_d
PHP phpstan
  • トリガー: ファイル保存時・開いた時・Insert モード離脱時

AI Sidekick (sidekick.nvim)

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 を直接トグル

Motion (flash.nvim)

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 で代替可能

Surround (nvim-surround)

テキストの囲み文字(括弧・クォート等)を追加・削除・変更する。

キー モード 説明
ys{motion}{char} n 囲みを追加 (例: ysiw" → word を " で囲む)
yss{char} n 行全体を囲む
ds{char} n 囲みを削除 (例: ds"" を削除)
cs{old}{new} n 囲みを変更 (例: cs"'"' に)
S{char} x visual 選択範囲を囲む

Text Case (text-case.nvim)

カーソル下の単語やテキストオブジェクトのケース (命名規則) を変換する。

キー 変換先
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 に変換

Noice (noice.nvim)

キー 説明
<S-Enter> コマンドライン出力をリダイレクト (cmdline モード)
<Leader>snl 最後のメッセージを表示
<Leader>snh メッセージ履歴
<Leader>sna 全メッセージ
<Leader>snd 通知をすべて消す

claude-mem (ChromaDB)

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 に変更しています(衝突回避)。.zshenvCLAUDE_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)。

archify skill

tt-a1i/archify — アーキテクチャ / ワークフロー / シーケンス / データフロー / ライフサイクル図を、単一ファイルの対話的 HTML として生成する agent skill。 .config/.agents/skills/archify/ に実体をコミットして管理している (~/.claude/skills はこのディレクトリへの symlink なので、置いた時点で git 管理下に入る)。

導入 (gh skill install)

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 から deliversha256 まで一致するものを再生成できる

図の見た目を確認したいだけなら 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 を再実行する。

明示実行のみに限定 (skillOverrides)

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.mddescription を書き換えて抑制しないこと。 SKILL.md は provenance 付きの upstream 追跡ファイルなので gh skill update で改変が消える。またこのフィールドは照合用で、 トリガー語が並んだまま「明示実行時のみ」と書いても打ち消せる保証がない。この種の制御は 自分の管理物である settings.json に置く。

軽い図解 (ASCII / Mermaid) の規約は diagram-conventions skill 側の担当なので、AGENTS.md には archify のことは書いていない。

依存とオフライン動作

package.jsonajv 等は devDependency で、実行時に必要なバリデータは renderers/shared/generated-validators.mjs に事前生成済み。npm install 不要node bin/archify.mjs がそのまま動く (要 Node.js >= 18)。

更新チェックの無効化

archify は更新のお知らせ表示のためだけに固定 URL へ GET する (ダウンロード・自動更新はしない。 成功時は約 72 時間間隔)。これを止めるため .config/claude/settings.jsonenv に設定している。

"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 を叩く運用になる。

schedule skill (gws / MCP フォールバック)

.config/.agents/skills/schedule/ の自作 skill。Google カレンダーの予定を取得して整形表示する。

取得経路は 2 つあり、fetch-schedule.sh がどちらを使うか判定する:

  1. gws CLI — 優先。スクリプト自身が予定まで取得する
  2. 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 ビューア)

leaf — ターミナル用の Markdown プレビューア。Homebrew の formula 名は leaf-markdown-viewerbrew install leaf は別物 (vrongmeal/leaf、upstream 停止済みで 2027-08-23 に disable 予定) なので間違えないこと。両者は同じ leaf バイナリを吐くので conflict する。

~/.config/leaf はこのリポジトリの .config/leaf へのディレクトリ symlink なので、 テーマを置いた時点で反映される。

Iceberg テーマ (.config/leaf/themes/iceberg.toml)

cocopon/iceberg.vim 準拠のカスタムテーマ。配色は .config/nvim/lua/config/palette.lua (single source of truth) に揃えている。

# config.toml — 相対パスは config.toml のあるディレクトリ基準で解決される
theme = "themes/iceberg.toml"

参考記事

About

Config files for setup MacOS

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages