{"id":47637716,"url":"https://github.com/turtlekazu/crai","last_synced_at":"2026-04-02T00:26:15.455Z","repository":{"id":340505980,"uuid":"1165373204","full_name":"turtlekazu/crai","owner":"turtlekazu","description":"A handy CLI tool that notifies you when your AI CLI finishes its response. ","archived":false,"fork":false,"pushed_at":"2026-03-21T13:08:06.000Z","size":3180,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-22T02:32:46.787Z","etag":null,"topics":["ai-agent","cli","developer-tools","golang","llm","macos","notification","productivity","pty"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/turtlekazu.png","metadata":{"files":{"readme":"README-ja.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-24T05:11:13.000Z","updated_at":"2026-03-21T13:08:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/turtlekazu/crai","commit_stats":null,"previous_names":["turtlekazu/crai"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/turtlekazu/crai","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turtlekazu%2Fcrai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turtlekazu%2Fcrai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turtlekazu%2Fcrai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turtlekazu%2Fcrai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/turtlekazu","download_url":"https://codeload.github.com/turtlekazu/crai/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/turtlekazu%2Fcrai/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31293376,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","cli","developer-tools","golang","llm","macos","notification","productivity","pty"],"created_at":"2026-04-02T00:26:13.184Z","updated_at":"2026-04-02T00:26:15.447Z","avatar_url":"https://github.com/turtlekazu.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"| [English](README.md) | 日本語 |\n|:---:|:---:|\n\n# crai (catcher in the rAI)\n\n---\n\n```\n   ______  ____    ___     ____\n  / ____/ / __ \\  /   |   /  _/\n / /     / /_/ / / /| |   / /\n/ /___  / _, _/ / ___ | _/ /\n\\____/ /_/ |_| /_/  |_|/___/\n catcher in the rAI\n```\n\nAI CLI が注意を引くべきタイミングで、音とバナーで通知する CLI ツールです。対応 CLI にはネイティブな Hook/notify をインストールでき、現時点では Codex、Claude Code、Gemini CLI をサポートしています。非対応のAI CLIでも、PTY ラッパーモードで動作させることで、通知させることができます。\n\nそれはまるで、半導体畑の捕手のように —— もっとも、崖の淵で捕まえているのは、無邪気に走り回るAIエージェントであり、同時に、別のコンテキストの深みへと落ちていきそうなあなた自身の意識なのかもしれません。\n\n\u003e *「ぼくはこうしようと思った。耳が聞こえないふりをするんだ……AIが考え終わるまで。」*\n\n---\n\n## Install\n\n\u003cimg alt=\"version badge\" src=\"https://img.shields.io/github/v/release/turtlekazu/crai?filter=*.*.*\"\u003e\n\n```sh\nbrew install turtlekazu/tap/crai\n```\n\nソースからビルドする場合：\n\n```sh\ngit clone https://github.com/turtlekazu/crai\ncd crai\ngo build -o crai .\nsudo mv crai /usr/local/bin/\n```\n\n## Quick Start\n\n```sh\n# Claude Code\ncrai install claude\nclaude\n\n# Codex\ncrai install codex\ncodex\n\n# Gemini CLI\ncrai install gemini\ngemini\n```\n\n## Uninstall\n\n```sh\nbrew uninstall crai\nbrew untap turtlekazu/tap\n```\n\n## Hook モード\n\n```text\n +----------+                         +---------------------------+\n |  You     | -- one-time setup ----\u003e | crai install \u003cagent\u003e      |\n |  (human) |                         | writes hook / notify      |\n +----------+                         +-------------+-------------+\n                                                   |\n                                                   v\n                                  +----------------+----------------+\n                                  | AI CLI config                   |\n                                  | claude: ~/.claude/settings.json |\n                                  | codex:  ~/.codex/config.toml    |\n                                  | gemini: ~/.gemini/settings.json |\n                                  +----------------+----------------+\n                                                   |\n                                                   v\n +----------+   normal usage   +-----------+   hook/notify   +-----------------------------+\n |  You     | ---------------\u003e | AI CLI    | -------------\u003e | crai notify --source \u003cagent\u003e |\n |  (human) |                  |           |                +---------------+---------------+\n +----------+                  +-----------+                                |\n                                                                            v\n                                                              * Play Sound\n                                                              * Notification Center Banner\n                                                              * Terminal Bell (\\a)\n```\n\nまず一度だけ対応 CLI に通知コマンドを設定します。\n\n```sh\ncrai install claude\ncrai install codex\ncrai install gemini\n```\n\n以後は普通に `claude` や `codex` を使うだけです。\n\n- `crai install claude` は `~/.claude/settings.json` の `Stop` hook に command hook を追加します\n- `crai install codex` は `~/.codex/config.toml` に `notify` を書き込みます\n- `crai install gemini` は `~/.gemini/settings.json` の `AfterAgent` hook に command hook を追加します\n\nどちらも最終的には次のコマンドが呼ばれます。\n\n```sh\ncrai notify --source \u003cagent\u003e\n```\n\n補助コマンド：\n\n```sh\ncrai status claude\ncrai status codex\ncrai status gemini\ncrai uninstall claude\ncrai uninstall codex\ncrai uninstall gemini\n```\n\nすでに `~/.codex/config.toml` に `crai` 以外の `notify` が入っている場合、`crai install codex` は上書きせずに停止します。\n`crai install \u003cagent\u003e` は何度実行しても安全で、`crai` 管理の hook が drift していればその場で修復します。\n\n## 従来の PTY モード\n\n元のラッパーモードも引き続き使えますが、いまの主役は Hook ベースのモードです。\n\n```\n +----------+   raw stdin   +-------------+   PTY   +-----------+\n |  You     | ------------\u003e |    crai     | ------\u003e |  claude   |\n |  (human) | \u003c------------ |  (watcher)  | \u003c------ |  (AI CLI) |\n +----------+   raw stdout  +------+------+         +-----------+\n                                   |\n                   AI output \u003e= 1500ms silence\n                                   |\n                                   v\n                    * Play Sound\n                    * Notification Center Banner\n                    * Terminal Bell (\\a)\n```\n\n1. コマンドを**疑似端末（PTY）**の中で起動します\n2. raw な stdin/stdout を変換なしでブリッジします\n3. 出力ストリームの**沈黙**を監視し——1500ms 以上新しい出力がなければ AI が完了したと判断します\n4. 完了時：サウンド、通知センターバナー、ターミナルベルの3つを同時に発火します\n\n### スマートフィルタリング\n\n- **1対1プロンプト対応** — Enter を押すたびに通知が1つだけ予約されます。対応するプロンプトのない AI 出力（起動時のバナー、自発的な出力）は無視されます\n- **エコー除去** — キー入力から 100ms 以内に届いた出力は PTY のエコーとして扱い、AI 出力とみなしません\n- **短時間応答の抑制** — AI が 5 秒以内に応答した場合は通知しません（まだ画面を見ているものと判断します）\n- **入力中の抑制** — 次のメッセージを作成中は通知しません\n\n---\n\n## PTYモードの使い方\n\n```sh\n# claude を直接ラップする\ncrai claude\n\n# 引数はそのまま透過される\ncrai claude --dangerously-skip-permissions\n```\n\nすべてそのまま透過されます。色、スピナー、キーバインド——すべて無傷で動作します。`crai` は必要な時まで存在感を主張しません。\n\n---\n\n## エイリアス設定(PTYモード用)\n\nシェルの設定ファイル（`~/.zshrc` または `~/.bashrc`）に以下を追加してください：\n\n```sh\nalias claude=\"crai claude \"\n```\n\n\u003e **末尾のスペースについて**\n\u003e bash と zsh では、エイリアスの値の末尾にスペースがあると、次の単語もエイリアスとして展開されます。これにより、`claude` の後に渡す引数もエイリアス展開の対象となり、エイリアスチェーンが完全に機能します。\n\n設定後は、いつも通り `claude` をご利用いただけます。`crai` は静かに見守っています。\n\n---\n\n## オプション\n\n| フラグ | 説明 |\n|--------|------|\n| `--no-banner` | 通知センターバナーを無効化します |\n| `--no-sound` | サウンドを無効化します |\n| `--sound \u003cpath\u003e` | 完了時に再生するサウンドファイルのパス（デフォルト: `Glass.aiff`） |\n| `--silence \u003cms\u003e` | 通知を発火するまでの沈黙時間（ミリ秒、デフォルト: `1500`） |\n\nmacOS には `/System/Library/Sounds/` に以下のサウンドが収録されています：\n\n```\nBasso  Blow  Bottle  Frog  Funk  Glass  Hero\nMorse  Ping  Pop     Purr  Sosumi  Submarine  Tink\n```\n\n```sh\ncrai --sound /System/Library/Sounds/Ping.aiff claude\n```\n\n`.aiff` や `.mp3` など任意のファイルを指定することも可能です。\n\n---\n\n## 動作環境\n\n- macOS（音声に `afplay`、通知センターに `terminal-notifier` を使用）\n- 任意のコマンドライン AI ツール（Claude Code, Codex, Gemini CLI など）\n\n### 通知の設定（推奨）\n\n安定した通知のために、[`terminal-notifier`](https://github.com/julienXX/terminal-notifier) のインストールを推奨します。システム設定への正式な登録と、おやすみモードの制御が正しく機能します：\n\n```sh\nbrew install terminal-notifier\n```\n\n`terminal-notifier` がインストールされていない場合は `osascript` にフォールバックします。ただし `osascript` による通知はシステム設定の通知一覧で「スクリプトエディタ」として登録されるため、設定項目が見つけにくいという問題があります。\n\n`terminal-notifier` をインストールすると、初回の通知時に**システム設定 → 通知 → terminal-notifier** として登録され、そこから動作を調整できます。\n\n---\n\n## ライセンス\n\n[MIT](LICENSE.md).\n\n---\n\n*「誰にも何も話すな。話したら、みんなが恋しくなるから。」*\n— J.D. サリンジャー、『ライ麦畑でつかまえて』\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fturtlekazu%2Fcrai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fturtlekazu%2Fcrai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fturtlekazu%2Fcrai/lists"}