Skip to content
TakayyzPublic

About

Config files for setup MacOS

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

504 Commits

Folders and files

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> --json の matched_rule.id が live_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].delivery が off のまま)。

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_attach の on_lines。conflict_choose は API でバッファを書き換えるので TextChanged では捕まえられない
  • デフォルト側は rhs に false を渡して無効化している。この上書きは 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 に変更しています(衝突回避)。.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)。

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 から 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 を再実行する。

明示実行のみに限定 (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.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 を叩く運用になる。

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-viewer。brew 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