jpskill.com
🛠️ 開発・MCP コミュニティ

domain-cli

CLIツール開発時に、引数解析やサブコマンド、インタラクティブな操作、カラフルな表示、設定ファイル、シェル補完など、コマンドラインアプリケーションに必要な機能を効率的に構築するSkill。

📜 元の英語説明(参考)

Use when building CLI tools. Keywords: CLI, command line, terminal, clap, structopt, argument parsing, subcommand, interactive, TUI, ratatui, crossterm, indicatif, progress bar, colored output, shell completion, config file, environment variable, 命令行, 终端应用, 参数解析

🇯🇵 日本人クリエイター向け解説

一言でいうと

CLIツール開発時に、引数解析やサブコマンド、インタラクティブな操作、カラフルな表示、設定ファイル、シェル補完など、コマンドラインアプリケーションに必要な機能を効率的に構築するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o domain-cli.zip https://jpskill.com/download/9253.zip && unzip -o domain-cli.zip && rm domain-cli.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/9253.zip -OutFile "$d\domain-cli.zip"; Expand-Archive "$d\domain-cli.zip" -DestinationPath $d -Force; ri "$d\domain-cli.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して domain-cli.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → domain-cli フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

CLI Domain

レイヤー3: ドメイン制約

ドメイン制約 → 設計への影響

ドメインルール 設計制約 Rust での実装
ユーザーエルゴノミクス 明確なヘルプ、エラー clapderive マクロ
設定の優先順位 CLI > 環境変数 > ファイル 階層化された設定のロード
終了コード エラー時は非ゼロ 適切な Result のハンドリング
標準出力/標準エラー出力 データ vs エラー エラーには eprintln!
割り込み可能 Ctrl+C を処理 シグナルハンドリング

重要な制約

ユーザーコミュニケーション

ルール: エラーは標準エラー出力へ、データは標準出力へ
理由: パイプ可能な出力、スクリプト化
RUST: エラーには eprintln!、データには println!

設定の優先順位

ルール: CLI 引数 > 環境変数 > 設定ファイル > デフォルト値
理由: ユーザーの期待、オーバーライド機能
RUST: clap + figment/config による階層化された設定

終了コード

ルール: エラーが発生した場合は非ゼロを返す
理由: スクリプト統合、自動化
RUST: main() -> Result<(), Error> または明示的な exit()

トレースダウン ↓

制約から設計へ (レイヤー2):

"引数のパースが必要"
    ↓ m05-type-driven: 引数のための構造体を Derive する
    ↓ clap: #[derive(Parser)]

"設定の階層化が必要"
    ↓ m09-domain: 設定をドメインオブジェクトとして扱う
    ↓ figment/config: レイヤー化されたソース

"進捗状況の表示が必要"
    ↓ m12-lifecycle: RAII としてのプログレスバー
    ↓ indicatif: ProgressBar

主要なクレート

目的 クレート
引数パース clap
インタラクティブなプロンプト dialoguer
プログレスバー indicatif
色付き出力 colored
ターミナル UI ratatui
ターミナル制御 crossterm
コンソールユーティリティ console

デザインパターン

パターン 目的 実装
引数構造体 型安全な引数 #[derive(Parser)]
サブコマンド コマンド階層 #[derive(Subcommand)]
設定レイヤー オーバーライドの優先順位 CLI > 環境変数 > ファイル
進捗状況 ユーザーフィードバック ProgressBar::new(len)

コードパターン: CLI 構造

use clap::{Parser, Subcommand};

#[derive(Parser)]
#[command(name = "myapp", about = "My CLI tool")]
struct Cli {
    /// Enable verbose output
    #[arg(short, long)]
    verbose: bool,

    #[command(subcommand)]
    command: Commands,
}

#[derive(Subcommand)]
enum Commands {
    /// Initialize a new project
    Init { name: String },
    /// Run the application
    Run {
        #[arg(short, long)]
        port: Option<u16>,
    },
}

fn main() -> anyhow::Result<()> {
    let cli = Cli::parse();
    match cli.command {
        Commands::Init { name } => init_project(&name)?,
        Commands::Run { port } => run_server(port.unwrap_or(8080))?,
    }
    Ok(())
}

よくある間違い

間違い ドメイン違反 修正
標準出力へのエラー出力 パイプ処理を壊す eprintln!
ヘルプテキストがない UX が悪い #[arg(help = "...")]
エラー時のパニック 悪い終了コード Result + 適切なハンドリング
長い処理に対する進捗表示がない ユーザーの不安 indicatif

レイヤー1へのトレース

制約 レイヤー2のパターン レイヤー1の実装
型安全な引数 Derive マクロ clap Parser
エラーハンドリング Result の伝播 anyhow + 終了コード
ユーザーフィードバック 進捗状況の RAII indicatif ProgressBar
設定の優先順位 ビルダーパターン レイヤー化されたソース

関連スキル

いつ 参照
エラーハンドリング m06-error-handling
型駆動の引数 m05-type-driven
進捗状況のライフサイクル m12-lifecycle
非同期 CLI m07-concurrency
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

CLI Domain

Layer 3: Domain Constraints

Domain Constraints → Design Implications

Domain Rule Design Constraint Rust Implication
User ergonomics Clear help, errors clap derive macros
Config precedence CLI > env > file Layered config loading
Exit codes Non-zero on error Proper Result handling
Stdout/stderr Data vs errors eprintln! for errors
Interruptible Handle Ctrl+C Signal handling

Critical Constraints

User Communication

RULE: Errors to stderr, data to stdout
WHY: Pipeable output, scriptability
RUST: eprintln! for errors, println! for data

Configuration Priority

RULE: CLI args > env vars > config file > defaults
WHY: User expectation, override capability
RUST: Layered config with clap + figment/config

Exit Codes

RULE: Return non-zero on any error
WHY: Script integration, automation
RUST: main() -> Result<(), Error> or explicit exit()

Trace Down ↓

From constraints to design (Layer 2):

"Need argument parsing"
    ↓ m05-type-driven: Derive structs for args
    ↓ clap: #[derive(Parser)]

"Need config layering"
    ↓ m09-domain: Config as domain object
    ↓ figment/config: Layer sources

"Need progress display"
    ↓ m12-lifecycle: Progress bar as RAII
    ↓ indicatif: ProgressBar

Key Crates

Purpose Crate
Argument parsing clap
Interactive prompts dialoguer
Progress bars indicatif
Colored output colored
Terminal UI ratatui
Terminal control crossterm
Console utilities console

Design Patterns

Pattern Purpose Implementation
Args struct Type-safe args #[derive(Parser)]
Subcommands Command hierarchy #[derive(Subcommand)]
Config layers Override precedence CLI > env > file
Progress User feedback ProgressBar::new(len)

Code Pattern: CLI Structure

use clap::{Parser, Subcommand};

#[derive(Parser)]
#[command(name = "myapp", about = "My CLI tool")]
struct Cli {
    /// Enable verbose output
    #[arg(short, long)]
    verbose: bool,

    #[command(subcommand)]
    command: Commands,
}

#[derive(Subcommand)]
enum Commands {
    /// Initialize a new project
    Init { name: String },
    /// Run the application
    Run {
        #[arg(short, long)]
        port: Option<u16>,
    },
}

fn main() -> anyhow::Result<()> {
    let cli = Cli::parse();
    match cli.command {
        Commands::Init { name } => init_project(&name)?,
        Commands::Run { port } => run_server(port.unwrap_or(8080))?,
    }
    Ok(())
}

Common Mistakes

Mistake Domain Violation Fix
Errors to stdout Breaks piping eprintln!
No help text Poor UX #[arg(help = "...")]
Panic on error Bad exit code Result + proper handling
No progress for long ops User uncertainty indicatif

Trace to Layer 1

Constraint Layer 2 Pattern Layer 1 Implementation
Type-safe args Derive macros clap Parser
Error handling Result propagation anyhow + exit codes
User feedback Progress RAII indicatif ProgressBar
Config precedence Builder pattern Layered sources

Related Skills

When See
Error handling m06-error-handling
Type-driven args m05-type-driven
Progress lifecycle m12-lifecycle
Async CLI m07-concurrency