ローカルターミナルで動作するコーディングエージェント。Ollama や OpenAI 互換サーバーを LLM バックエンドとして使用し、ファイル操作やシェルコマンドの実行をエージェント的に行います。
GitHub Releases からビルド済みバイナリをダウンロード:
# macOS (Apple Silicon)
curl -L https://github.com/Kewton/Anvil/releases/download/v0.0.9/anvil-darwin-arm64.gz -o anvil.gz
gunzip anvil.gz
chmod +x anvil
sudo mv anvil /usr/local/bin/
# インストール確認
anvil --helpAnvil は LLM の推論を外部サーバーに委託します。以下のいずれかを用意してください。
# インストール: https://ollama.com
ollama serve # サーバー起動
ollama pull qwen3.5:latest # モデル取得(例)# LM Studio 等でサーバーを起動し、URL とモデル名を指定
# provider-url は http://localhost:1234 と http://localhost:1234/v1 のどちらでも利用できます
anvil --provider openai --provider-url http://localhost:1234 --model your-model
# LM Studio を使うだけなら lmstudio エイリアスも利用できます
anvil --provider lmstudio --model your-model# プロジェクトのディレクトリで起動
cd /path/to/your/project
anvil --model qwen3.5:35b起動すると対話プロンプトが表示されます:
___ _ __
/ | ____ _ _(_) /_
/ /| | / __ \ | / / / __/
/ ___ |/ / / / |/ / / /_
/_/ |_/_/ /_/|___/_/\__/
local coding agent for serious terminal work
Model : qwen3.5:35b
Context : 200k
Mode : local / confirm
[U] you >
# 対話モードで起動(前回のセッションを自動復元)
anvil --model qwen3.5:35b
# 新しいセッションで開始(履歴をリセット)
anvil --model qwen3.5:35b --fresh-session
# 全ツール自動承認モード(承認プロンプトをスキップ)
anvil --model qwen3.5:35b --no-approval
# 非対話モード(パイプ入力・スクリプト向け)
echo "src/main.rsを読んで要約して" | anvil --model qwen3.5:35b --no-approval --oneshot[U] you > このプロジェクトの構造を教えて
$ ls -la ← shell.exec がリアルタイムで実行される
Cargo.toml README.md src/ tests/
...
[A] anvil > このプロジェクトは Rust で構築されており...
[U] you > src/main.rs にエラーハンドリングを追加して
Allow file.write: src/main.rs? [y/n] y ← ファイル変更前に承認を求める
[A] anvil > エラーハンドリングを追加しました。変更内容は...
[U] you > /exit
通常モードでは、ファイル書き込み (file.write) とシェルコマンド (shell.exec) の実行前にインラインで確認を求めます:
Allow shell.exec: npm test? [y/n]
| 入力 | 動作 |
|---|---|
y / yes |
ツールを実行 |
n / その他 |
拒否(LLMに「denied by user」として通知) |
--no-approval で起動すると全ツールが承認なしで実行されます。
Anvil は LLM に以下のツールを提供します:
| ツール | 権限 | 説明 |
|---|---|---|
file.read |
Safe (自動実行) | ファイル読み取り・ディレクトリ一覧 |
file.search |
Safe (自動実行) | ファイル名・内容で検索 |
file.write |
Confirm (承認必要) | ファイル作成・上書き |
shell.exec |
Confirm (承認必要) | シェルコマンド実行(出力はリアルタイム表示) |
セッション中に / で始まるコマンドを入力できます:
| コマンド | 説明 |
|---|---|
/help |
コマンド一覧を表示 |
/status |
現在の状態を表示 |
/plan |
現在のプランを表示 |
/plan-add <項目> |
プランに項目を追加 |
/plan-focus <番号> |
アクティブなステップを変更 |
/plan-clear |
プランをクリア |
/checkpoint <メモ> |
チェックポイントを保存 |
/repo-find <クエリ> |
リポジトリ内を検索 |
/timeline |
セッションのタイムラインを表示 |
/compact |
古い履歴を圧縮 |
/model |
現在のモデル情報 |
/provider |
プロバイダー情報 |
/reset |
Ready 状態に戻す |
/exit |
セッション終了 |
以下のコマンドは承認モードに関係なくブロックされます:
rm -rf //rm -rf ~(再帰削除)mkfs(フォーマット)dd if=(rawディスク書き込み):(){(fork bomb)
パスはサンドボックス内に制限され、絶対パス・..・シンボリックリンクによる脱出を防止します。
Anvil はプロジェクトディレクトリごとにセッションファイル (.anvil/sessions/) を自動保存します。同じディレクトリで再起動すると前回の会話が自動復元されます。
# セッション復元(デフォルト)
anvil --model qwen3.5:35b
# 新しいセッションで開始
anvil --model qwen3.5:35b --fresh-sessionLLM に送信するメッセージはトークンバジェットで自動制御されます:
- 最新のメッセージから優先的にバジェット内に収まる分だけ送信
- メッセージ数が閾値(デフォルト64)を超えると古い履歴を自動要約
/compactコマンドで手動圧縮も可能
長い会話でも最近のやり取りが常に優先され、古い会話は要約として保持されます。
プロジェクトルートの .anvil/config に key=value 形式で記述:
provider = ollama
model = qwen3.5:35b
provider_url = http://127.0.0.1:11434
context_window = 200000
stream = trueANVIL_PROVIDER=ollama # プロバイダー (ollama / openai)
ANVIL_MODEL=qwen3.5:35b # モデル名
ANVIL_PROVIDER_URL=http://... # プロバイダーURL
ANVIL_CONTEXT_WINDOW=200000 # コンテキストウィンドウサイズ
ANVIL_CONTEXT_BUDGET=50000 # トークンバジェット明示指定
ANVIL_MAX_AGENT_ITERATIONS=30 # agenticループの最大反復数(default: 30)
ANVIL_HTTP_TIMEOUT=300 # LLMリクエストタイムアウト(秒)(旧ANVIL_CURL_TIMEOUTもフォールバックとして有効)
ANVIL_API_KEY=sk-... # OpenAI互換APIキーanvil [OPTIONS]
-p, --provider <PROVIDER> プロバイダー (ollama|openai|lmstudio)
-m, --model <MODEL> モデル名
-u, --provider-url <URL> プロバイダーURL
--sidecar-model <MODEL> サイドカーモデル名
--context-window <SIZE> コンテキストウィンドウサイズ
--context-budget <TOKENS> トークンバジェット明示指定
--max-iterations <N> agenticループ最大反復数(default: 30)
--no-stream ストリーミング無効
--debug デバッグログ有効
--no-approval 全ツール自動承認
--fresh-session 新規セッションで開始
--oneshot 非対話モード
--reasoning-visibility <LEVEL> 推論表示レベル (hidden|summary)
-h, --help ヘルプ表示
-V, --version バージョン表示
優先順位: CLI > 環境変数 > 設定ファイル > デフォルト値
APIキーは設定ファイルではなく環境変数で設定することを推奨します:
export ANVIL_API_KEY=sk-... # OpenAI互換APIキー
export SERPER_API_KEY=... # Serper Web検索APIキー設定ファイル(.anvil/config)にAPIキーが記載されている場合、起動時に警告メッセージが表示されます。また、.anvil/ ディレクトリが .gitignore に登録されていない場合も警告が表示されます。
設定ファイルの誤コミットによるAPIキー漏洩を防ぐため、.gitignore に .anvil/ を追加してください:
# .gitignore
.anvil/
.anvil/slash-commands.json で独自のスラッシュコマンドを定義できます:
{
"commands": [
{
"name": "/review",
"description": "コードレビューを実行",
"prompt": "このリポジトリの最近の変更をレビューして、改善点を指摘してください。"
}
]
}| プロバイダー | 設定例 |
|---|---|
| Ollama | anvil --model qwen3.5:35b (デフォルト) |
| LM Studio | anvil --provider lmstudio --model your-model |
| OpenAI互換 | anvil --provider openai --provider-url http://localhost:1234 --model your-model (/v1 付きURLも可) |
| API キー認証 | ANVIL_API_KEY=Bearer sk-... を環境変数に設定 |
# Rust toolchain (1.85+) が必要: https://rustup.rs
git clone https://github.com/Kewton/Anvil.git
cd Anvil
cargo build --releasecargo build # デバッグビルド
cargo test # 全テスト実行(108件)
cargo clippy --all-targets # 静的解析
cargo fmt # フォーマット
cargo run -- --model qwen3.5:35b # デバッグ実行src/
├── main.rs # エントリポイント
├── app/ # アプリケーション層
│ ├── mod.rs # オーケストレータ
│ ├── agentic.rs # agenticツール実行ループ
│ ├── cli.rs # CLI入力ループ
│ ├── plan.rs # プラン管理
│ └── render.rs # コンソール描画
├── agent/mod.rs # LLMプロトコル・パーサー
├── provider/ # LLMプロバイダー
│ ├── ollama.rs # Ollamaクライアント
│ ├── openai.rs # OpenAI互換クライアント
│ └── transport.rs # HTTPトランスポート(curl)
├── tooling/mod.rs # ツール実行・検証・サンドボックス
├── session/mod.rs # セッション永続化
├── config/mod.rs # 設定管理
├── state/mod.rs # 状態マシン
└── extensions/mod.rs # スラッシュコマンド拡張
tests/ # 統合テスト(108件)
- Issue を作成
feature/<issue>-<description>ブランチを作成- 実装 → テスト → clippy 通過を確認
- Pull Request を作成(develop ブランチ向け)
詳細は CLAUDE.md を参照してください。