create-neomutt-gmail - CLIツールで完結させる

·
#npm#CLI#Neomutt#開発

引きこもり人生のスタート

はじめに

前回の記事で、mutt-config-coreconfig-fs-utilsという2つのnpmパッケージを公開しました。

今日はその2つを組み合わせたCLIツールを完成させました。

npx create-neomutt-gmail

質問に答えるだけで、Neomutt + Gmail + OAuth2.0の設定が完了します。


なぜCLIツールを作ったのか

前回までの状態

2つのパッケージを公開しましたが、実際に使うにはコードを書く必要がありました:

const { generateMuttConfigs } = require('mutt-config-core');
const { setupStandardMuttDirs, writeConfigFiles } = require('config-fs-utils');

// 設定を生成
const configs = generateMuttConfigs({
  email: 'user@gmail.com',
  realName: 'John Doe',
  editor: 'nvim',
  locale: 'ja'
});

// ディレクトリ作成
await setupStandardMuttDirs();

// ファイル書き込み
await writeConfigFiles({...});

これでは一般のユーザーは使えません。

目指したもの

npx create-neomutt-gmail

これだけ。 プログラミング不要。


CLIツールの機能

1. Prerequisites Check

実行前に必要な依存関係をチェック:

📋 Prerequisites Check
✓ neomutt found
✓ python3 found
✓ gpg found
✓ GPG keys configured

足りないものがあれば、インストール方法を表示します。

2. 対話的な質問

必要な情報を順番に聞いていきます:

📝 Configuration

✔ Gmail address: user@gmail.com
✔ Your name (for email headers): John Doe
✔ Preferred text editor: nvim
✔ Gmail language setting: 日本語 (Japanese)
✔ GPG key ID: user@gmail.com

矢印キーで選択、Enterで確定。直感的です。

3. 安全確認

既存の設定がある場合は警告:

⚠️  Existing Neomutt configuration found.
   A backup will be created before overwriting.

? Continue with setup? (Y/n)

4. ファイル作成

プログレススピナーで進捗を表示:

✔ Directories created
  ✓ /Users/username/.config/mutt/
  ✓ /Users/username/.config/mutt/accounts/
  ✓ /Users/username/.local/etc/oauth-tokens/
  ...

✔ Configuration files created
  ✓ /Users/username/.config/mutt/muttrc
  ✓ /Users/username/.config/mutt/accounts/user@gmail.com.muttrc

✔ mutt_oauth2.py downloaded
  ✓ /Users/username/.config/mutt/mutt_oauth2.py

5. 次のステップガイド

設定完了後、何をすべきか明確に表示:

🎉 Configuration complete!

📖 Next Steps:

1. Setup Google Cloud Console
   Visit: https://console.cloud.google.com/
   
   a. Create a new project
   b. Enable Gmail API
   c. Configure OAuth consent screen
   ...

2. Obtain OAuth 2.0 token
   Run the following command:
   
   python3 ~/.config/mutt/mutt_oauth2.py ...

3. Launch Neomutt
   neomutt

コピペできるコマンドも表示されます。


安全機能

Dry-runモード

実際にファイルを作成する前に、何が起きるか確認できます:

npx create-neomutt-gmail --dry-run
🔍 DRY RUN MODE - No files will be created

📁 Directories to be created:
  /Users/username/.config/mutt/
  ...

📄 Files to be created:
  /Users/username/.config/mutt/muttrc
  ...

📝 Configuration preview:
  Email: user@gmail.com
  Name: John Doe
  Editor: nvim
  Locale: ja

自動バックアップ

既存ファイルは上書き前に自動バックアップ:

~/.config/mutt/muttrc
→ ~/.config/mutt/muttrc.backup-2026-01-26T15-30-00-000Z

確認プロンプト

重要な操作の前には必ず確認:

📦 Ready to create:
  • Configuration directories
  • Neomutt config files
  • OAuth2 script

? Proceed with installation? (Y/n)

技術的な実装

使用ライブラリ

{
  "dependencies": {
    "mutt-config-core": "^0.1.0",    // 設定生成
    "config-fs-utils": "^0.1.0",     // ファイル操作
    "inquirer": "^13.2.1",           // 対話的質問
    "chalk": "^5.6.2",               // カラフルな出力
    "ora": "^9.1.0",                 // プログレススピナー
    "node-fetch": "^3.3.2"           // OAuth2スクリプトダウンロード
  }
}

ファイル構成

create-neomutt-gmail/
├── bin/
│   └── cli.js              # Entry point
├── src/
│   ├── index.js            # Main logic
│   ├── prerequisites.js    # Dependency checks
│   ├── questions.js        # User prompts
│   ├── download.js         # Download mutt_oauth2.py
│   └── display.js          # Output formatting
├── package.json
└── README.md

コマンドラインオプション

npx create-neomutt-gmail --help       # ヘルプ表示
npx create-neomutt-gmail --dry-run    # プレビューのみ
npx create-neomutt-gmail --skip-prereqs  # チェックスキップ

開発で苦労したこと

1. npm publishでのbin警告

"bin[create-neomutt-gmail]" script name bin/cli.js was invalid and removed

原因: パスの書き方が間違っていた

解決: .bin/cli.js./bin/cli.js

何度もバージョンを上げて再公開しました(0.1.1 → 0.1.4)

2. ESM vs CommonJS

"type": "module" を使ったため、import/exportで統一する必要がありました。

3. テスト環境の作り方

実際のホームディレクトリを壊さないように:

HOME=/tmp/test-home npm run dev

一時的なHOMEディレクトリを使ってテスト。


実際の使用例

標準的な使い方

$ npx create-neomutt-gmail

🔧 Neomutt + Gmail Setup Wizard

📋 Prerequisites Check
✓ neomutt found
✓ python3 found
✓ gpg found

📝 Configuration
? Gmail address: 

質問に答えていくだけで完了します。

Dry-runでの確認

$ npx create-neomutt-gmail --dry-run

🔍 DRY RUN MODE - No files will be created
...
Run without --dry-run to actually create files.

安全に動作確認できます。


3つのパッケージの関係

create-neomutt-gmail (CLI - ユーザー体験)
├── mutt-config-core (設定生成)
└── config-fs-utils (ファイル操作)

それぞれが独立して使えるのがポイントです。

他のツールからmutt-config-coreだけを使うこともできるし、config-fs-utilsを別のプロジェクトで使うこともできます。

使い分け

ユーザー使うパッケージ
一般ユーザーcreate-neomutt-gmail
プログラマーmutt-config-core + config-fs-utils
ライブラリ開発者mutt-config-core のみ

統計

create-neomutt-gmail

  • バージョン: 0.1.4
  • 依存関係: 6個(うち2つは自作)
  • パッケージサイズ: 7.3 kB
  • ファイル数: 10個
  • 開発時間: 約4時間

今日の総パッケージ数

  1. md-blog-core ✅
  2. mutt-config-core ✅
  3. config-fs-utils ✅
  4. create-neomutt-gmail ✅

4つのnpmパッケージを公開!


学んだこと

1. CLIツールの設計

  • 段階的な確認 - ユーザーを不安にさせない
  • 明確なガイダンス - 次に何をすべきか常に表示
  • 安全第一 - Dry-run、バックアップ、確認プロンプト

2. npmのbin設定

  • パスは ./bin/cli.js 形式
  • shebang (#!/usr/bin/env node) が必須
  • 実行権限 (chmod +x) を忘れずに

3. ユーザー体験の重要性

技術的に正しいだけでは不十分。ユーザーが:

  • 迷わない - 明確な指示
  • 安心できる - 確認とバックアップ
  • 学べる - エラーメッセージで次の行動が分かる

まとめ

失敗から学んだことを、誰でも使えるツールに。

Neomuttの設定で何度も失敗した経験が、このCLIツールの礎になりました。

達成したこと

  • ✅ 対話的なセットアップウィザード
  • ✅ 安全なファイル操作
  • ✅ 詳細なガイダンス
  • ✅ Dry-runモード
  • ✅ 日本語/英語対応

次のステップ

  • ユーザーからのフィードバック収集
  • エラーケースの改善
  • ドキュメントの充実
  • テストの追加

誰かの役に立てば嬉しいです。


リンク


使ってみてください

npx create-neomutt-gmail

フィードバックや改善案、大歓迎です!

Issue: https://github.com/a-lost-social-misfit/create-neomutt-gmail/issues