CmdAI：自然言語でCLIコマンドを生成するAI開発ツール （完成版）

https://github.com/yoshiwatanabe/cmdai


## はじめに

開発者の皆さん、こんなことはありませんか？

- 「Gitで未追跡ファイルを削除したいけど、コマンドが思い出せない...」
- 「Azure CLIでサブスクリプション一覧を見たいけど、オプションは何だったっけ？」
- 「Dockerコンテナを一括停止する方法を毎回ググってる...」

そんな悩みを解決するために、**CmdAI**というAI活用ツールを開発しました。自然言語でやりたいことを伝えるだけで、適切なCLIコマンドを生成してくれる開発者向けアシスタントです。

## 🎯 CmdAIとは

CmdAIは、自然言語の指示をCLIコマンドに変換するAI搭載のコマンドラインツールです。

![Demo](https://github.com/yoshiwatanabe/cmdai/raw/main/cmdai-use.gif)


### 主な特徴

- **自然言語入力**: 「未追跡ファイルを削除」→ `git clean -fd`
- **複数AIプロバイダー対応**: Azure OpenAI → Ollama → パターンマッチングの階層フォールバック
- **安全性重視**: 危険なコマンドの検証と警告機能
- **学習機能**: 過去の実行履歴から改善
- **豊富なツール対応**: Git、Azure CLI、Docker、Kubectl など
- **汎用性**: AIモデルにより、どんなCLIツールにも対応可能

## 🚀 実際の使用例

### よく使うツールの直接実行

```bash
# Git操作
cmdai git "未追跡ファイルを削除"
# → git clean -fd

# Azure CLI
cmdai az "サブスクリプション一覧を表示"
# → az account list --output table

# Docker
cmdai docker "実行中のコンテナ一覧"
# → docker ps

# Kubernetes
cmdai kubectl "Podの一覧を取得"
# → kubectl get pods
```

### 任意のCLIツールにも対応

AIモデルの力により、事前定義されていないツールでも使用可能です：

```bash
# Terraform
cmdai ask terraform "リソースの状態を確認"
# → terraform show

# npm
cmdai ask npm "依存関係を更新"
# → npm update

# systemctl
cmdai ask systemctl "サービスの状態を確認"
# → systemctl status

# find
cmdai ask find "拡張子がjsのファイルを検索"
# → find . -name "*.js"
```

**フォーマット**: `cmdai ask <ツール名> "やりたいこと"`

## 🏗️ アーキテクチャの特徴

### 1. 階層型フォールバック戦略

CmdAIの最大の特徴は、**スマートな階層フォールバック**です：

```mermaid
graph LR
    User[自然言語入力] --> Azure[Azure OpenAI]
    Azure --> |失敗| Ollama[Ollama（ローカルAI）]
    Ollama --> |失敗| Pattern[パターンマッチング]
    
    Azure --> Output[コマンド出力]
    Ollama --> Output
    Pattern --> Output
```

1. **Azure OpenAI（最優先）**: 最も強力だが、API料金とネットワーク接続が必要
2. **Ollama（ローカルAI）**: プライベートで無料だが、ローカルリソース消費
3. **パターンマッチング（フォールバック）**: 確実に動作する静的なルールベース

### 2. 安全性を最優先

```csharp
// 危険なパターンの検出例
private readonly List<string> _dangerousPatterns = new()
{
    @"\brm\s+.*-rf?\s+/",         // rm -rf /
    @"\bmkfs\b",                  // ファイルシステム初期化
    @"\bshutdown\b",              // システム停止
    // ...その他の危険なコマンド
};
```

危険なコマンドは自動検出され、実行前に警告が表示されます。

### 3. 学習と改善

```csharp
public async Task RecordFeedbackAsync(
    CommandRequest request, 
    CommandResult result, 
    bool wasAccepted, 
    bool wasSuccessful)
{
    // 実行結果を学習データとして保存
    // 将来の同様のリクエストで活用
}
```

過去の実行結果を学習し、より適切なコマンド生成を実現します。

## 📋 設定方法

### 1. インストール

```bash
# .NET 8.0が必要
dotnet tool install --global --add-source . CmdAi.Cli
```

### 2. Azure OpenAI設定（推奨）

ホームディレクトリに`.env`ファイルを作成：

```env
AI__AzureOpenAIApiKey=your_api_key_here
AI__AzureOpenAIEndpoint=https://your-endpoint.openai.azure.com/...
AI__Providers__0=azureopenai
AI__Providers__1=ollama
```

### 3. Ollama設定（オプション）

```bash
# Ollamaインストール
curl -fsSL https://ollama.ai/install.sh | sh

# CodeLlamaモデルダウンロード（約4GB）
ollama pull codellama:7b

# Ollamaサービス開始
ollama serve
```

## 💡 技術的なポイント

### 1. マルチプロバイダー戦略

```csharp
public class MultiProviderAICommandResolver : ICommandResolver
{
    private async Task<CommandResult?> TryAIResolutionWithPriorityAsync(
        CommandRequest request, CommandContext context)
    {
        var providers = GetOrderedProviders(); // 設定された優先順位
        
        foreach (var provider in providers)
        {
            try
            {
                var result = await TryProviderAsync(provider, request, context);
                if (result != null) return result;
            }
            catch (Exception)
            {
                continue; // 次のプロバイダーを試す
            }
        }
        return null;
    }
}
```

### 2. コンテキスト情報の活用

```csharp
private string BuildAIContext(CommandRequest request, CommandContext context, 
    IEnumerable<LearningEntry> relevantExamples)
{
    var contextParts = new List<string>();
    
    if (context.IsGitRepository)
        contextParts.Add("Gitリポジトリ内");
    
    if (relevantExamples.Any())
    {
        contextParts.Add("類似の成功例:");
        foreach (var example in relevantExamples.Take(3))
            contextParts.Add($"'{example.Query}' → {example.Command}");
    }
    
    return string.Join(". ", contextParts);
}
```

### 3. 設定の柔軟性

```json
{
  "AI": {
    "EnableAI": true,
    "Providers": ["azureopenai", "ollama"],
    "TimeoutSeconds": 30,
    "FallbackToPatterns": true,
    "ConfidenceThreshold": 0.7
  }
}
```

## 🔍 診断機能

設定や接続状況を確認できる診断機能も搭載：

```bash
cmdai diagnostics
```

```
=== CmdAI Diagnostics ===

📋 Configuration:
  AI Enabled: True
  Configured Providers: [azureopenai, ollama]

🌐 Azure OpenAI Configuration:
  Endpoint: Configured
  API Key: Configured (***)

🔌 Provider Connectivity Tests:
  AzureOpenAIProvider: ✅ Available
  OllamaAIProvider: ❌ Unavailable

🎯 Provider Priority Order:
  1. AzureOpenAIProvider
  2. OllamaAIProvider
```

## 🛡️ セキュリティ考慮事項

1. **API キー管理**: 環境変数での安全な保存
2. **コマンド検証**: 危険なパターンの事前検出
3. **ユーザー確認**: 実行前の確認プロンプト
4. **ローカル優先**: Ollamaでプライベート実行

## 🔮 今後の展望

- **追加ツール対応**: Terraform、Ansible、npmなど
- **カスタムプロンプト**: ユーザー独自のテンプレート
- **チーム共有**: 組織内でのコマンド共有機能
- **VS Code拡張**: IDE統合

## まとめ

CmdAIは、AI技術を活用して開発者の日常業務を効率化するツールです。複数のAIプロバイダーによる階層フォールバック、安全性重視の設計、学習機能など、実用性を重視した機能が特徴です。

AIモデルを活用することで、事前に定義されていないCLIツールでも `cmdai ask <ツール名> "やりたいこと"` の形式で対応できる柔軟性も大きな魅力です。

特に以下のような場面で威力を発揮します：

- **新しいツールの学習時**: コマンドを覚える前に使える
- **複雑なオプション**: 毎回調べる手間を削減
- **チーム開発**: 統一されたコマンド実行

興味を持たれた方は、ぜひ試してみてください！

## リンク

- **GitHub**: [yoshiwatanabe/cmdai](https://github.com/yoshiwatanabe/cmdai)
- **ライセンス**: MIT

---

この記事が開発者の皆さんの生産性向上に少しでも貢献できれば幸いです。フィードバックやコントリビューションもお待ちしています！

#AI #CLI #開発ツール #生産性向上 #Azure #Ollama