このマシンはNixOSを実行しています。すべてのシステム設定は anixpkgs リポジトリにあり、~/sources/anixpkgs(正規)および場合によって別のパス(例: /data/andrew/dev/claude/sources/anixpkgs)にクローンされています。現在のツリーはflake構成を通じてデプロイします。anix-upgrade は古いツリーに対してチャネルベースのパスを保持します。
ワークフロー
- 編集 —
pkgs/下の該当するNixモジュールまたはPython/shellスクリプトを編集します。 - 新規ファイルのステージング —
git-cc(anix-upgradeが使用)は追跡済みファイル(git ls-files)のみをコピーします。新しいファイルはまずgit addしてください。そうしないとビルドから静かに除外されます。 - デプロイ — ローカルの
anix-upgrade-uiAPI(推奨)を介して、ストリーミングが完了するまで実行します。マシンのupgrade_host="$(hostname).local" curl -si "http://${upgrade_host}/anix-upgrade/api/v1/run" -X POST \ -H 'Content-Type: application/json' \ -d '{"source": "/path/to/anixpkgs", "local": true}' # 202 → {"run_id": "<uuid>", "started": true}; 409 → すでに実行中 curl -N "http://${upgrade_host}/anix-upgrade/api/v1/stream/<run_id>" # [UPGRADE SUCCESSFUL] または [UPGRADE FAILED (exit N)] で終了し、その後 [DONE].localホスト名を使用してください。localhostではありません。nginxはこのルートをマシン固有の仮想ホストでのみ公開します。 CLIフォールバック(APIに到達できない場合のみ):anix-upgrade --local -s /path/to/anixpkgs。 - テスト — このマシンで結果をテストしてからコミットします。
"local": true は、変更がサービスパッケージまたはNixOSモジュールに触れる場合は常に必須です。これがないと anix-upgrade は dependencies.nix を local-build = false のままにするため、モジュールの cfg.package デフォルトが公開タグのバイナリに解決され、変更が静かに反映されません。
重要な落とし穴
- NixOSモジュールは適切な場所(例:
pc-base.nixのインポートリスト)でインポートする必要があります。ファイルを追加するだけでは不十分です。 - 新しいオプションは
pkgs/nixos/components/opts.nixで宣言し、pc-base.nixで割り当ててから、base-dev-pkgs.nixのようなコンポーネントで使用する必要があります。 - MCPサーバーはユーザーごとに
claude mcp add -s user ...で登録します。claude-setupスクリプト(base-dev-pkgs.nix内)がこれを処理し、サーバー追加後に再実行する必要があります。
他のマシンへのデプロイ / APIリファレンス
同じAPIが anix-upgrade-ui をホストするすべてのマシンで動作します: http://<hostname>.local/anix-upgrade/api/v1/(認証なし)。run のボディフィールド(すべてオプション): version、commit、branch、source(ローカルパス)、local、boot — anix-upgrade フラグと同じセマンティクスです。レスポンスヘッダーを表示するために -si を使用してください(一部のプロキシは -s JSONボディを除去します)。
リモートマシンの場合は、まずプッシュし、branch ではなく commit(完全なハッシュ)を渡してください — ブランチのtarballはCDNキャッシュされ、--tarball-ttl 0 でも数分間古いままになる可能性があります。コミットハッシュはコンテンツアドレスの fetchGit を使用し、CDNをバイパスします:
curl -si -X POST http://<hostname>.local/anix-upgrade/api/v1/run \
-H 'Content-Type: application/json' \
-d "{\"commit\": \"$(git rev-parse HEAD)\", \"local\": true}"
実行を監視する(新しい実行が開始されると run_id は404になるため、再トリガーする前にログを取得してください):
curl -s .../api/v1/status/<run_id> | jq . # ステータス: running|success|failed
curl -N .../api/v1/stream/<run_id> # SSE: 最後の512KBを再生し、その後ライブ
curl -o upgrade.log .../api/v1/log/<run_id> # 完全なログ
実行はブラウザUI(http://<hostname>.local/anix-upgrade/)に via API バッジ付きで表示されます。1マシンにつき一度に1つの実行のみ可能です(APIと手動UIは互いにブロックします)。