stillo 0.1.12

AI-native terminal browser
use clap::{Parser, Subcommand, ValueEnum};
use url::Url;

#[derive(Parser, Debug)]
#[command(name = "stillo", version, about = "AI-native terminal browser")]
pub struct Cli {
    #[command(subcommand)]
    pub command: Option<Command>,

    /// URLを直接指定した場合は dump として動作
    pub url: Option<Url>,

    /// 出力形式
    #[arg(long, default_value = "markdown", global = true)]
    pub format: OutputFormat,

    /// タイムアウト秒数
    #[arg(long, default_value = "30", global = true)]
    pub timeout: u64,

    /// SPA委譲先を明示指定(デフォルトは auto でSPA検出時に自動委譲)
    #[arg(long, global = true)]
    pub delegate: Option<DelegateTarget>,

    /// JS委譲を無効化し、静的HTMLのみ処理する
    #[arg(long, global = true)]
    pub no_delegate: bool,

    /// 詳細ログ出力
    #[arg(short, long, global = true)]
    pub verbose: bool,
}

#[derive(Subcommand, Debug)]
pub enum Command {
    /// URLのコンテンツをMarkdown/テキストとして stdout に出力
    Dump {
        url: Url,
        #[arg(long)]
        format: Option<OutputFormat>,
        #[arg(long)]
        delegate: Option<DelegateTarget>,
        #[arg(long)]
        no_delegate: bool,
    },
    /// TUIブラウザモード
    Browse { url: Url },
    /// ページについてLLMに質問(ANTHROPIC_API_KEY / OPENAI_API_KEY 環境変数が必要)
    Qa { question: String, url: Url },
    /// ページをLLMで要約(ANTHROPIC_API_KEY / OPENAI_API_KEY 環境変数が必要)
    Summarize { url: Url },
    /// 指定したフィールドをLLMで抽出(ANTHROPIC_API_KEY / OPENAI_API_KEY 環境変数が必要)
    Extract {
        fields: String,
        url: Url,
        #[arg(long)]
        format: Option<OutputFormat>,
    },
    /// MCPサーバーとして起動(stdio transport、JSON-RPC 2.0)
    Mcp,
}

#[derive(ValueEnum, Clone, Debug, Default)]
pub enum OutputFormat {
    #[default]
    Markdown,
    Plain,
    Json,
}

#[derive(ValueEnum, Clone, Debug)]
pub enum DelegateTarget {
    /// SPA検出時に自動的に委譲チェーンを試みる
    Auto,
    /// Chrome DevTools Protocol(要: Chrome起動済み)
    Cdp,
    /// Playwright デーモン(Phase 3以降)
    Playwright,
    /// Jina Reader API
    Jina,
    /// Firecrawl API
    Firecrawl,
}