プログラミング
Show HN: Aict – AIエージェント向けに構築された、XML/JSONを出力するUnixコアユーティリティ
Show HN: Aict – Unix coreutils that output XML/JSON, built for AI agents (github.com)
要約
aictは、33のUnixコアユーティリティを再実装し、AIエージェントが直接読み取れるXMLまたはJSON形式で構造化されたデータを出力するツールです。これにより、AIエージェントは人間が読めるプレーンテキストを解析する際のトークン消費や処理の脆弱性を回避できます。aictは、ファイルサイズ、言語、MIMEタイプなどの詳細情報を付与し、AIのタスク実行効率と精度を向上させます。
全文翻訳
AIエージェントはls、grep、catなどを実行し、人間が読めるプレーンテキストを受け取ります。その後、トークンを消費して列の位置を推測したり、フィールドの不整合なフォーマットを処理したりします。これは脆弱で無駄が多いです。
-rw-r--r-- 1 user staff 2048 Apr 6 10:00 main.go ← サイズはどの列か?
-rw-r--r-- 1 user staff 1024 Apr 6 10:00 utils.go ← 言語は何か?
drwxr-xr-x 5 user staff 160 Apr 6 10:00 internal ← これはディレクトリか?
解決策
aictは33のUnixツールを再実装し、エージェントが直接読み取れる構造化された出力を提供します。解析は不要です。
$ aict ls src/
<ls timestamp="1746123456" total_entries="3">
<file name="main.go" path="src/main.go" absolute="/project/src/main.go" size_bytes="2048" size_human="2.0K" language="go" mime="text/x-go" binary="false" executable="false" modified="1746120000" modified_ago_s="3456"/>
<file name="utils.go" path="src/utils.go" absolute="/project/src/utils.go" size_bytes="1024" size_human="1.0K" language="go" mime="text/x-go" binary="false" executable="false" modified="1746120000" modified_ago_s="3456"/>
<directory name="internal" path="src/internal" modified="1746120000"/>
</ls>
すべてのフィールドにラベルが付いています。パスは常に絶対パスです。タイムスタンプはUnix整数です。言語とMIMEタイプは自動検出されます。解析は一切不要です。
インストール
Homebrew (macOS)
brew tap synseqack/aict
brew install aict
これにより、aictとbashおよびzsh用のシェル補完がインストールされます。
MCPサーバーが組み込まれています:
aict mcp
Goインストール
go install github.com/synseqack/aict@latest
ソースからビルド
git clone https://github.com/synseqack/aict
cd aict
go build -o aict .
インストール確認: aict --help で利用可能なすべてのツールが表示されるはずです。
クイックスタート
# デフォルト: XML出力 (AIエージェントに最適)
aict ls src/
aict grep "func" . -r
aict cat main.go
aict diff old.go new.go
# JSON出力
aict ls src/ --json
# プレーンテキスト (元のUnixツールと同じ)
aict ls src/ --plain
# すべてのaict呼び出しでXMLをグローバルに有効にする
export AICT_XML=1
ツール
6つのカテゴリにわたる33のツール。すべてのツールは --xml (デフォルト)、--json、および --plain をサポートします。
カテゴリ ツール
ファイル検査 cat head tail file stat wc
検索 & 比較 ls find grep diff
パスユーティリティ realpath basename dirname pwd
テキスト処理 sort uniq cut tr sed awk
データ & アーカイブ jq tar
システム & 環境 env system ps df du
チェックサム checksums md5sum sha1sum sha256sum
追加: git (status, diff, log, ls-files, blame) ・補完 (bash/zsh/fish) ・doctor (自己診断)
出力フォーマット
すべてのツールは同じ規約に従います:
フィールド規約
パス 常に絶対パス (absolute属性)
タイムスタンプ Unixエポック整数 + _ago_s のコンパニオン
サイズ バイト単位 (size_bytes) + 人間が読める形式 (size_human)
ブール値 "true" / "false" 文字列
エラー <error code="" msg=""/> 要素 — stderrは使用しない
空の結果 カウントゼロの有効なXML、エラーは発生しない
MCPサーバー
aict mcp は、stdioトランスポートを介してすべてのツールを呼び出し可能なMCP関数として公開します。AIアシスタントはシェルラッパーなしでネイティブに呼び出せます。MCPサーバーはメインバイナリのサブコマンドです。
Claude Desktopの設定 (~/.config/claude/claude_desktop_config.json):
{
"mcpServers": {
"aict": {
"command": "aict",
"args": ["mcp"]
}
}
}
aictがPATHにない場合は、フルパスを使用します:
{
"mcpServers": {
"aict": {
"command": "/usr/local/bin/aict",
"args": ["mcp"]
}
}
}
Claude Code連携
~/.claude.json に追加します:
{
"mcpServers": {
"aict": {
"command": "aict",
"args": ["mcp"]
}
}
}
接続後、Claude Codeはls、grep、diff、およびその他のすべてのツールを、型付き引数と構造化されたJSON結果を持つネイティブ関数として呼び出すことができます。
トークンコスト
まず正直な数字を提示します: aictの出力は、タスクあたり1.1〜7.8倍のトークンを消費します (tiktoken o200k_baseで測定)。これらのトークンが購入するもの: ラウンドトリップの削減と解析の曖昧さの解消。プレーンテキストでは2〜4回の連鎖呼び出し (ls、次に言語を取得するためのfile) が必要な場合、aictは1回で応答します。
タスク | GNU | aict | トークン (GNU → aict)
---|---|---|---
サイズ/タイプ/言語付きディレクトリ一覧 | 2回 | 1回 | 246 → 820 ・ 3.3倍
ファイル読み込み + 行数 + タイプ | 3回 | 1回 | 173 → 274 ・ 1.6倍
サイズ/mtime付き.goファイル検索 | 4回 | 1回 | 47 → 367 ・ 7.8倍
ファイル/行/コンテキスト付きgrep | 1回 | 1回 | 141 → 326 ・ 2.3倍
変更タイプ付きdiff | 1回 | 1回 | 167 → 192 ・ 1.2倍
各プレーンテキスト呼び出しは、エージェントの完全なターンです。モデル推論、ツール呼び出しのオーバーヘッド、および中間出力はすべてコンテキストウィンドウに収まります。上記のトークン数には、これらは含まれていません。そして、このベンチマークでは、file(1)はGoソースファイルを「Cソース」と誤認識しましたが、aictはそれをgoとラベル付けしました。ライブエージェント評価 (opencode、同じタスクをツールチェーンごとに3回実行) では、aict搭載エージェントは約46%少ない出力トークン (中央値 265 vs 487) を生成し、3回中3回正解しました。GNU搭載エージェントはfile(1)の言語検出を信頼した実行で不完全なレポートを出力しました。両方の方法論については benchmarks/TOKENS.md を参照してください。トークンベンチマークは go run ./cmd/tokenbench で再現できます。生のコンテンツのみが必要な場合は --plain を使用してください。
ベンチマーク
aictは、一部の速度をセマンティックなリッチネス (言語検出、MIMEタイプ、絶対パス) と引き換えにしています。オーバーヘッドは意図的です。起動コストは呼び出しあたり約3.6ミリ秒です。
ツール | GNU | --plain | --xml | メモ
diff (1000行) | 0.9 ms | 1.9 ms ・ 2.1倍 | 2.1 ms ・ 2.4倍 | ✅ Myers O(ND)
wc (100k行) | 6.1 ms | 16 ms ・ 2.6倍 | 17 ms ・ 2.7倍 | ✅ awk (10k行) | 4.1 ms | 12 ms ・ 2.9倍 | 11 ms ・ 2.6倍 | ✅ sed (10k行) | 3.3 ms | 14 ms ・ 4.2倍 | 16 ms ・ 4.9倍 | ✅ find (ディープツリー) | 1.9 ms | 13 ms ・ 6.8倍 | 15 ms ・ 8.0倍 | ✅ ls (1000ファイル) | 4.0 ms | 51 ms ・ 12.9倍 | 70 ms ・ 17.7倍 | MIME+言語検出/ファイルごと
cat (100k行) | 1.4 ms | 24 ms ・ 16.4倍 | 31 ms ・ 21.6倍 | 行ごとのスキャン + エンコーディング検出
grep (100k行) | 1.3 ms | 119 ms ・ 88倍 | 130 ms ・ 96倍 | Go正規表現 vs GNU SIMD
Linux/amd64での5回の実行の中央値です。方法論については benchmarks/ を参照し、make bench で再現してください。生のコンテンツのみが必要でエンリッチメントをスキップする場合は --plain を使用してください。
FAQ
デフォルトでXMLなのはなぜですか?JSONではないのですか?
XML属性はコンテキストウィンドウ内でより高密度です。<file size="1024" lang="go"/> は {"size":1024,"lang":"go"} より短いです。JSONを好む場合は --json を使用してください。構造は同一です。
なぜGNUツールをjqにパイプしないのですか?
ls、cat、stat、find、diff、wcはJSONを出力しません。jqはそれらを助けられません。aictはツールチェーン全体に対して構造化された出力を提供します。grepだけではありません。(aictはJSONファイルをパス式でクエリするための独自のjqも提供します。)
ripgrepと比較してどうですか?
ripgrepは純粋な検索においてははるかに高速です。aict grepは、言語検出、MIMEタイプ、および他のすべてのツールと共有される一貫した出力フォーマットを追加します。速度が重要な検索にはripgrepを、エージェントが構造化されたコンテキストを必要とする場合はaictを使用してください。
eza / lsdと比較してどうですか?
ezaとlsdは人間にとってより良いlsです。素晴らしい色とフォーマットを提供します。aictはフォーマットされたテーブルではなく、データ構造を出力します。これらは異なる問題を解決しています。
Windowsで動作しますか?
ls、cat、stat、wc、find、diff、grep、head、tail、sort、uniq、cut、tr、sed、awk、jq、tar、checksums、df、およびパスユーティリティはWindowsで動作します。systemはLinux/macOSです。psはLinuxのみです (これは /proc を読み取ります)。サポートされていないプラットフォームでは、クラッシュではなく構造化された <error> 要素が表示されます。
サンドボックス化された環境で実行しても安全ですか?
はい。aictは厳密に読み取り専用です。ネットワークリクエストはありません (MIME検出はHTTPではなくGo標準ライブラリを使用します)。テレメトリはありません。データ収集はありません。明示的に渡されたパスのみを読み取ります。
依存関係はいくつありますか?
1つだけです。aict mcp サブコマンドで使用される公式MCP Go SDKです。33のツールとすべての内部パッケージは純粋なGo標準ライブラリです。これはAGENTS.mdでハードコンストレイントとして強制されています。
貢献
バグレポート、機能リクエスト、プルリクエストを歓迎します。ガイドライン、コードスタイル、ツール実装パターンについては、CONTRIBUTING.mdを参照してください。Issuesでgood first issueとタグ付けされたものは、開始するのに良い場所です。
ライセンス
MIT — すべてAIツールによって、AIツールのために構築されました。