CLI の補完機能は、既に入力されたオプションを認識できるようになっているべきです。

2026/01/13 14:04

CLI の補完機能は、既に入力されたオプションを認識できるようになっているべきです。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:


改良された要約

Optique 0.10.0 は 型安全な依存関係システム を導入し、コマンドラインパーサが正確でコンテキストに応じたシェル補完と、Git ブランチやクラウド API などの実際のデータに対する検証を提供できるようにします。

追加機能

  • 静的依存関係 (
    or()
    ) により、排他的なフラグセット(例:
    --json → --pretty
    --csv → --delimiter
    )を宣言できます。
  • 実行時依存関係:
    • dependency()
      はソースオプションをマークします。
    • derive()
      /
      deriveAsync()
      はソースの値に依存するパーサを構築します。
    • deriveFrom()
      /
      deriveFromAsync()
      は複数のオプション(例:
      --env
      +
      --region
      )を結合して派生した選択肢を生成します。

パースフロー

  1. すべてのオプション宣言から依存関係を収集
  2. derive*
    呼び出しで提供されたファクトリにより派生パーサを作成
  3. これらのコンテキスト認識パーサで入力を再パースし、正しい検証と補完を実現。

Git 統合

同梱パッケージ

@optique/git
は非同期パーサ(
gitBranch
gitTag
gitRef
)を提供し、isomorphic‑git を使用して Node.js と Deno の両方で Git リポジトリから読み取ります。これにより、CLI ツールは指定されたリポジトリパス(例:Git の
-C
オプション)に基づくブランチやタグの補完を提供できます。

利用可能性

Optique 0.10.0 のプレリリース (

0.10.0-dev.311
) は次で入手可能です:

  • npm:
    npm install @optique/core@0.10.0-dev.311
  • Deno:
    deno add jsr:@optique/core@0.10.0-dev.311

今後の展望

将来のリリースでは、クラウドプロバイダー、データベース、コンテナレジストリなど他の外部システムへの依存関係処理を拡張し、安全で明確な CLI をさらに実現し、信頼性の高い補完と検証を提供できるようになる可能性があります。


このバージョンは、リストからすべての重要ポイントを明示的に含めつつ、明快かつ簡潔な主旨を保持しています。

本文

Git の

-C
オプションを使ってみよう

git -C /path/to/repo checkout <TAB>

タブキーを押すと、現在のディレクトリではなく

/path/to/repo
からブランチ名が補完されます。
この補完はコンテキストに応じて動作します ― 他のオプションの値によって変わります。

ほとんどの CLI パーサはこうした依存関係を扱えません。各オプションを独立して処理するため、

--branch
の補完が
--repo
の値を知ることができず、次のような二つの不満足な選択肢に陥ります。

  • すべてのリポジトリからの全ブランチ候補を表示(無意味)
  • 補完自体を完全に諦める

Optique 0.10.0 は、型安全性を保ったままこの問題を解決する依存関係システムを導入します。


静的依存関係:
or()

Optique は

or()
コンビネータである程度の依存オプションを扱えます:

import { flag, object, option, or, string } from "@optique/core";

const outputOptions = or(
  object({
    json: flag("--json"),
    pretty: flag("--pretty"),
  }),
  object({
    csv: flag("--csv"),
    delimiter: option("--delimiter", string()),
  })
);

TypeScript は

--json
が true の場合は
--pretty
フィールドがあると知り、
--csv
が true の場合は
--delimiter
フィールドがあると知ります。
パーサは実行時にこれを検証し、シェル補完も
--json
が存在する時だけ
--pretty
を提案します。

定義時に有効な組み合わせが分かるケースではうまく動作しますが、ランタイム入力に依存するケース(リポジトリごとに変わるブランチ名など)には対応できません。


ランタイム依存関係

よくあるシナリオは次のようなものです:

  • --environment
    が利用可能サービスを決定するデプロイ CLI
  • --connection
    がテーブル候補を決める DB ツール
  • --project
    が表示されるリソースを制御するクラウド CLI

これらでは、依存オプションにユーザーが入力した値を知るまで有効な値は分かりません。Optique 0.10.0 は

dependency()
derive()
でこのケースを扱います。


依存関係システム

概念は簡単です:あるオプションを 依存元 としてマークし、その値を使って派生パーサを作ります。

import {
  choice,
  dependency,
  message,
  object,
  option,
  string,
} from "@optique/core";

function getRefsFromRepo(repoPath: string): string[] {
  // 実際には Git リポジトリから読み取る
  return ["main", "develop", "feature/login"];
}

// 依存元としてマーク
const repoParser = dependency(string());

// 派生パーサを作成
const refParser = repoParser.derive({
  metavar: "REF",
  factory: (repoPath) => {
    const refs = getRefsFromRepo(repoPath);
    return choice(refs);
  },
  defaultValue: () => ".",
});

const parser = object({
  repo: option("--repo", repoParser, {
    description: message`Path to the repository`,
  }),
  ref: option("--ref", refParser, {
    description: message`Git reference`,
  }),
});

factory
が依存関係を解決する場所です。
ユーザーが
--repo
に実際に入力した値を受け取り、そのリポジトリ固有の参照で検証できるパーサを返します。

内部構造:Optique は三段階解析戦略を採用しています。

  1. まずすべてのオプションを一度に解析し、依存値を収集
  2. 集めた値で
    factory
    を呼び出し、具体的なパーサを生成
  3. 派生オプションを再度解析して動的に作られたパーサで処理

これにより、検証と補完の両方が正しく機能します。すでに

--repo /some/path
を入力済みなら、
--ref
の補完はそのパスから取得した参照を表示します。


@optique/git
でリポジトリ認識型補完

@optique/git
パッケージは Git リポジトリから非同期に値を読み取るパーサを提供します。
依存関係システムと組み合わせれば、リポジトリ固有の補完を持つ CLI を簡単に構築できます。

import {
  command,
  dependency,
  message,
  object,
  option,
  string,
} from "@optique/core";
import { gitBranch } from "@optique/git";

const repoParser = dependency(string());

const branchParser = repoParser.deriveAsync({
  metavar: "BRANCH",
  factory: (repoPath) => gitBranch({ dir: repoPath }),
  defaultValue: () => ".",
});

const checkout = command(
  "checkout",
  object({
    repo: option("--repo", repoParser, {
      description: message`Path to the repository`,
    }),
    branch: option("--branch", branchParser, {
      description: message`Branch to checkout`,
    }),
  })
);

これで

my-cli checkout --repo /path/to/project --branch <TAB>
と入力すると、補完は
/path/to/project
のブランチを表示します。
defaultValue
"."
に設定されているので、
--repo
が指定されなければ現在のディレクトリが使われます。


複数依存関係

派生パーサが複数オプションから値を取得する必要がある場合は

deriveFrom()
を利用します:

import {
  choice,
  dependency,
  deriveFrom,
  message,
  object,
  option,
} from "@optique/core";

function getAvailableServices(env: string, region: string): string[] {
  return [`${env}-api-${region}`, `${env}-web-${region}`];
}

const envParser = dependency(choice(["dev", "staging", "prod"] as const));
const regionParser = dependency(choice(["us-east", "eu-west"] as const));

const serviceParser = deriveFrom({
  dependencies: [envParser, regionParser] as const,
  metavar: "SERVICE",
  factory: (env, region) => {
    const services = getAvailableServices(env, region);
    return choice(services);
  },
  defaultValues: () => ["dev", "us-east"] as const,
});

const parser = object({
  env: option("--env", envParser, {
    description: message`Deployment environment`,
  }),
  region: option("--region", regionParser, {
    description: message`Cloud region`,
  }),
  service: option("--service", serviceParser, {
    description: message`Service to deploy`,
  }),
});

factory
は依存配列と同じ順序で値を受け取り、いずれかが未指定の場合は
defaultValues
が使用されます。


非同期サポート

実際の依存解決では I/O(Git 読み込み、API 呼び出し、データベースアクセス)が必要になることがあります。
Optique は非同期バージョンを用意しています:

import { dependency, string } from "@optique/core";
import { gitBranch } from "@optique/git";

const repoParser = dependency(string());

const branchParser = repoParser.deriveAsync({
  metavar: "BRANCH",
  factory: (repoPath) => gitBranch({ dir: repoPath }),
  defaultValue: () => ".",
});

@optique/git
isomorphic‑git を内部で使用しているため、Node.js と Deno 両方で
gitBranch()
,
gitTag()
,
gitRef()
が動作します。
同期的に処理したい場合は
deriveSync()
、複数非同期依存を扱う場合は
deriveFromAsync()
を使用できます。


まとめ

依存関係システムを使えば、オプション同士が互いの値を認識し、検証だけでなくシェル補完も正しく機能する CLI が構築できます。
型安全性は TypeScript によって保証されるため、無効な組み合わせはコンパイル時に検出されます。

Git リポジトリやクラウドプロバイダ、データベース、コンテナレジストリなど、実行時まで有効値が分からない外部システムと対話するツールで特に有用です。
ユーザーが既に入力した情報を元に補完候補を動的に生成できるため、より直感的な UX を提供できます。


利用方法

この機能は Optique 0.10.0 で利用可能です。

プリリリース版の試用

deno add jsr:@optique/core@0.10.0-dev.311

または npm:

npm install @optique/core@0.10.0-dev.311

詳細は公式ドキュメントをご覧ください。

同じ日のほかのニュース

一覧に戻る →

2026/01/17 2:16

東ドイツのバルーン脱走(「East Germany Balloon Escape」)

## Japanese Translation: (すべての重要ポイントを含む)** この物語は、1979年9月16日に東ドイツから西ドイツへと2家族が自作熱気球で大胆に脱出したことを記述しています。目的地は西ドイツ近郊のナイラで、計画には18か月以上の準備が必要でした:3つの熱気球、800 m² のタフタ素材、2本のプロパンタンク、ブロワー、および家庭用ガスボトルから作ったバーナー。7月3日の以前の試行では、熱気球は国境から180 m 先に着陸し失敗しましたが、その朝、当局は放置された装備を発見しました。 9 月の飛行は28分間続き、高度2,500 m に達し、西ドイツへと横断。最終的に1 人だけ怪我(ウェッツェルの足首骨折)で着陸しました。この脱出直後、東ドイツは国境警備を強化しました:小型空港が閉鎖され、プロパンや布地の購入も厳しく管理されました。 飛行後、ストレリク兄弟はポツダムで逮捕され、ストレリクと彼女の妹マリア、そしてその夫は2年半の刑を受けましたが、アモニティ・インターナショナルの圧力により後に釈放されました。家族はナイラに定住し(ウェッツェルは自動車整備士、ストレリクはテレビ修理店を経営)、1985 年にスタジが脅迫したためスイスへ移住しました。1990 年のドイツ統一後、再びポエスネックに戻りました。 この物語はディズニー映画「ナイト・クロッシング」(1982)やマイケル・ヘルビグの「バルーン」(2018)、BBC Outlook および PBS Nova のドキュメンタリーにもインスピレーションを与えました。2017 年には、レゲンブルクにあるハウズ・デア・バイエリッヒェン・ギセヒト博物館で熱気球が常設展示され、同年ピーター・ストレリクは長い病気の後に74 歳で亡くなりました。 この改訂された概要は、リストからすべての主要ポイントを取り入れつつ、明確かつ曖昧さのない表現を保っています。

2026/01/16 23:25

**Cloudflare が Astro を買収** Cloudflare は、Astro の買収を発表し、エッジコンピューティング機能を拡充するとともに、ウェブパフォーマンス市場での地位を強化しました。今回の取引は、Astro の技術を Cloudflare のサービス群へ統合することが見込まれ、顧客にはモダンな Web アプリケーション向けに高速・セキュリティ・信頼性が向上したソリューションが提供されます。

## Japanese Translation: Cloudflare は公式に Astro のフルタイムチームを吸収し、同社は全リソースをオープンソースの Astro フレームワークの開発と保守に注力できるようになりました。これにより Cloudflare のグローバルインフラストラクチャを活用しつつ、Astro はウェブ体験の中心にコンテンツを置くというビジョンを共有する長年のスポンサーシップに続くパートナーシップが実現します。 Astro は MIT ライセンスであり、オープンガバナンスモデルに従い、任意のプラットフォーム上で無料で利用できます。採用率は毎年倍増しており、ほぼ 100 万件の週次ダウンロードが Webflow、Wix、Microsoft、Google などのサイトを支えています。ホストされたプリミティブ、Astro DB、または e‑commerce レイヤーによる収益化試みは成功せず、コアフレームワークから注意が逸れました。 Astro 6 beta は既に公開されており、チームは正式リリースを計画し、その後 2026 年のロードマップでコンテンツ主導型ウェブ構築、パフォーマンス、スケーラビリティ、信頼性、および開発者体験(特に AI コーディングツールが登場する中)を強調します。この協力関係により Astro は有料エコシステムモデル(ホスティングや CMS)を追求することを止め、コンテンツ中心のウェブサイト向けフレームワークの改善に専念できます。 結果として、さらに高速で信頼性の高いオープンソース ソリューションが実現し、ベンダー非依存のままで開発者と企業はベンダーロックインなしで高性能サイトを構築できるようになり、ウェブエコシステム全体にわたってパフォーマンス、スケール、信頼性、および開発者体験が向上します。

2026/01/17 7:15

## Install.md LLM実行可能ファイルのインストール規格。

## Japanese Translation: **install.md** は、AI アシスタントがソフトウェアインストール手順を自動的に読み取り実行できる軽量 Markdown フォーマットであり、手動設定を排除します。 ファイルはプロジェクトルートまたは `/docs` ディレクトリに配置されるべきです。Mintlify は `https://<your-docs-url>/install.md` で自動生成しますが、開発者は必要に応じて上書きや無効化を行うことができます。 典型的な install.md はヘッダー(製品名)、説明ブロッククオート、アクションプロンプト(「[Product] をインストールしてほしい」)、**OBJECTIVE**、**DONE WHEN** の基準、TODO チェックリスト、詳細ステップセクション(コードブロック付き)および **EXECUTE NOW** コール・トゥ・アクションを含みます。 このフォーマットは言語非依存であり、バイナリ、パッケージ、スクリプトのいずれもサポートします。ステップ内の条件付きロジックにより、npm/pnpm、macOS/Linux、Arch Linux などの環境に適応できます。 Mintlify のツールは既存ドキュメントからインストール知識を自動検出し、エージェント向けの install.md を合成・ホストします。開発者はメインドキュメントを煩雑にせずにエッジケース処理を組み込むことが可能です。 ユーザーは `curl -fsSL https://www.example.com/docs/install.md | claude` のような簡単なコマンドでファイルを取得し、任意の LLM に貼り付けるか、オートノーマルエージェントへ直接パイプして実行し、ステップごとの承認を選択できます。 仕様はオープンソース(spec: installmd.org, GitHub: github.com/mintlify/install-md)であり、カスタマイズ可能です。開発者はバージョン固有ファイルのホスティングや検出ロジックの追加を行えます。 セキュリティ上の配慮として、ファイルは人間が読める形式で、ステップごとの承認を許可し、自然言語で結果を明示するため、`curl | bash` スクリプトに比べて隠れた悪意ある動作を減らします。 多くの設定オプションを必要とする高度な統合の場合は専用ウィザードがまだ優先されることがありますが、それ以外では install.md がほぼすべてのメリットを提供し、エンジニアリング労力を削減します。 任意で、`llms.txt` ファイルを install.md と併用してインストール中に追加情報やトラブルシューティング情報を提供できます。

CLI の補完機能は、既に入力されたオプションを認識できるようになっているべきです。 | そっか~ニュース