Slackで空気を読み、必要な時だけ発言し、頼まれた仕事は最後までやり切る AI 同僚。
「最後までやって」と言えば自律で動き続け、進捗は Slack の Canvas にライブ表示。
Claude Code v2.1.139+ の /goal Stop hook と Agent View をネイティブに Slack に橋渡しした、
Slackファースト・日本語ファーストの常駐AIゲートウェイです。
🪶 OpenRyokoは Jinn(MIT License, by Hristo Stoyanov)の AI 組織・cron・Web ダッシュボードといった土台レイヤーを継承しつつ、Slack 上での振る舞い — 空気読み・自律完遂・状態可視化 — に集中して大きく前進した設計です。
社内 Slack に AI を住まわせると、すぐ3つの壁にぶつかります:
- 「うざい」問題 — 雑談に割り込んでくる、誰宛か分からない発言に毎回反応する
- 「中途半端」問題 — 1ターンで返事して止まる。長い作業の途中でユーザーが「続けて」「次は?」を投げ続けないといけない
- 「見えない」問題 — 何が動いてるのか、何が詰まってるのか、Slack の会話ログを遡らないと分からない
OpenRyoko はこの3つをSlack側のメカニズムごと用意して解決します:
| 問題 | OpenRyoko の解 | 実装 |
|---|---|---|
| ① うざい | 空気読みトリアージ — メッセージ毎に Haiku が silent/react/reply を判定。確信度60%未満は黙る | slack/triage.ts |
| ② 中途半端 | 自然言語 /goal — 「最後までやって」等を Haiku が検出 → Claude Code の Stop hook を自動起動 → 各ターンの応答が個別 Slack メッセージで届く |
slack/goal-extractor.ts + engines/claude.ts |
| ③ 見えない | Agents View Canvas — running/waiting/errored/idle の全セッションを Slack チャンネルのタブとして30秒毎ライブ同期 | slack/agents-canvas.ts |
npm install -g openryoko
ryoko setup
ryoko startブラウザで http://localhost:7777 → Settings → Slack に Bot Token を貼って保存。
WebUI の onboarding wizard が /goal / Canvas / triage を案内するので、迷わず有効化できます。
💡 Slack 機能をフルに使うには Claude Code v2.1.139 以降が必要です(
/goalコマンド対応)。npm install -g @anthropic-ai/claude-code@latestで最新化してください。
Jinn からは「常駐デーモン + マルチエンジン + AI組織 + Webダッシュボード + Cron + Skills + MCP」の枠を継承していますが、Slack 上で AI同僚として実用に耐える挙動は OpenRyoko のためにフルに作り直しました。
- 🌸 空気読みトリアージ — Haiku で
silent / react / replyを判定。雑談・横の会話には介入しない保守的設計 - 🎯 自然言語
/goal— 「最後までやって」「完成するまで止まらないで」「終わったら教えて」等の意図を Haiku が拾い、Claude Code の Stop hook を起動 - 🖼️ Agents View Canvas — 全 Ryoko セッションを Slack の Canvas タブにライブ同期。設定 UI から channel picker でワンクリック有効化
- 💬 ターン毎の個別投稿 —
/goalで多ターン回した時、Claude の各ターンの応答が個別の Slack メッセージとして到着(進捗が見える) - 👤 発言者認識 — Slack ID から display name を解決し、operator と他者を system prompt 上で明示区別
- 🧵 DM-equivalent 検出 — チャンネル内でも「ボット + 自分だけの会話」を検出して triage を skip、自然な対話を実現
- 📡 Telegram コネクタ — Jinn には無い 4 つ目のコネクタ
- 🔒 Loopback Host header guard + 限定 CORS — DNS rebinding 対策。
gateway.host = 127.0.0.1デフォルトで安全 - 🌐 会話型オンボーディング — Ryoko 自身が新規ユーザーに名前・役割・好みを聞いて
~/.ryoko/knowledge/に保存 - ✨ Onboarding ウィザード — Web UI 初回起動時に Slack 機能(
/goal/ Canvas / triage)を視覚的に紹介 - 💡 Inline discovery hint — Slack tokens 設定済みで Canvas 未有効なら設定画面で気づかせる
- 🧠 Persona / Memory レイヤー —
ryoko updateで自動マイグレーションされる人格・記憶テンプレート - 🏠
~/.ryokoホームディレクトリ —~/.jinnからの自動マイグレーション付き、日本語ファースト
- 🔌 3エンジン対応 — Claude Code CLI + Codex SDK + Gemini CLI
- 💬 マルチコネクタ — Slack / Discord / WhatsApp / Telegram
- 👥 AI 組織システム — 部門・階級・マネージャー・従業員・タスクボード
- 🌐 Web ダッシュボード — チャット / 組織図 / カンバン / コスト追跡 / cron 可視化
- ⏰ Cron スケジューリング — ホットリロード対応
- 🔄 ホットリロード — config / cron / org ファイルを再起動なしで反映
- 🛠️ 自己改変 — エージェントが自分の設定・スキル・組織を実行中に編集可能
- 📦 スキルシステム — Markdown プレイブックでエンジンが native に従う
- 🏢 マルチインスタンス — 複数の Ryoko を並列起動
- 🔗 MCP 対応 — 任意の MCP サーバーに接続
OpenRyoko は Claude Code CLI を子プロセスとして起動するため、Anthropic の公式クライアントとして扱われ、月額$200の Max サブスクリプションの枠内で動作します。APIトークン従量課金ではありません。
空気読みトリアージと /goal 抽出は軽量 Haiku を使いますが、これも Claude Code CLI 経由なので Max サブスクに含まれます($0)。
OpenRyoko は独自のプロンプトエンジニアリング層を持ちません。Claude Code が既にツール利用・ファイル編集・マルチステップ推論・記憶・/goal の Stop hook を担当しているので、OpenRyoko はそれを外の世界(Slack、cron、WebUI、Canvas)に接続するだけ。Claude Code が進化すれば、OpenRyoko も自動的に強くなります。
受信メッセージ
├─ DM? ──→ 常に返信
├─ @メンション? ──→ 常に返信
├─ DM相当の会話? ──→ 常に返信(一度engage済み + 1ユーザーだけの会話)
└─ グレーゾーン ──→ Haiku でトリアージ
├─ silent → 何もしない
├─ react → 絵文字スタンプだけ付ける
└─ reply → 本エンジンで返信
判定基準(デフォルトプロンプトより):
- 明らかに自分宛 → reply
- 自分の専門領域で役に立てる → reply
- 単なる同意・感謝 → react(絵文字のみ)
- それ以外 → silent(雑談には絶対に割り込まない)
確信度 60% 未満なら silent に倒す保守的設計です。
npm install -g openryoko
ryoko setup
ryoko startアップデートは ryoko update。
git clone https://github.com/rsensui2/OpenRyoko.git
cd OpenRyoko
pnpm install
pnpm build
npm install -g ./packages/jimmy
ryoko setup
ryoko startブラウザで http://localhost:7777 を開くとダッシュボードが表示されます。
+----------------+
| ryoko CLI |
+-------+--------+
|
+-------v--------+
| ゲートウェイ |
| デーモン |
+--+--+--+--+---+
| | | |
+--------------+ | | +--------------+
| | | |
+-------v-------+ +------v------+ +-----------v---+
| エンジン | | コネクタ | | Web UI |
|Claude|Codex|Gem| | Slack|WA|DC | | localhost:7777|
+----------------+ +-------------+ +---------------+
| |
+-------v-------+ +------v------+
| Cron | | 組織 |
| スケジューラ | | システム |
+---------------+ +-------------+
CLI がゲートウェイデーモンにコマンドを送信。デーモンがAIエンジンへ作業を振り分け、コネクタ統合を管理し、cron ジョブを実行し、Web ダッシュボードを配信します。
OpenRyokoは ~/.ryoko/config.yaml から設定を読み込みます(~/.jinn/ が既存の場合、初回起動時に自動マイグレーション)。
gateway:
port: 7777
engines:
claude:
enabled: true
codex:
enabled: false
connectors:
slack:
app_token: xapp-...
bot_token: xoxb-...
# 空気読みトリアージ(メンションなしメッセージへの過剰反応を抑制)
triage:
enabled: true
model: claude-haiku-4-5
timeoutMs: 20000
threadContextLimit: 10
cron:
jobs:
- name: daily-review
schedule: "0 9 * * *"
task: "PRをレビューして要約を投稿"
portal:
portalName: Ryoko
operatorName: 亮介
language: Japanese
org:
agents:
- name: reviewer
role: code-reviewOpenRyoko/
packages/
jimmy/ # ゲートウェイデーモン + CLI(パッケージ名: openryoko)
web/ # Web ダッシュボード(パッケージ名: @openryoko/web)
turbo.json
pnpm-workspace.yaml
git clone https://github.com/rsensui2/OpenRyoko.git
cd OpenRyoko
pnpm install
pnpm setup # 一回限り: 全パッケージビルド + ~/.ryoko 作成
pnpm dev # ゲートウェイ + Next.js dev サーバーをホットリロードで起動http://localhost:3000 で Web ダッシュボードが開けます。
前提条件: Node.js 22+、pnpm 10+、Claude Code CLI(
npm install -g @anthropic-ai/claude-code)
| コマンド | 説明 |
|---|---|
pnpm setup |
全パッケージビルド + ~/.ryoko 初期化(一回限り) |
pnpm dev |
ゲートウェイ(:7777)と Next.js dev サーバー(:3000)をホットリロードで起動 |
pnpm start |
クリーンビルド後にゲートウェイを :7777 で起動 |
pnpm stop |
稼働中のゲートウェイデーモンを停止 |
pnpm status |
ゲートウェイの稼働状態を確認 |
pnpm build |
全パッケージをビルド |
pnpm typecheck |
TypeScript 型チェックを実行 |
pnpm lint |
全パッケージを lint |
pnpm clean |
ビルド成果物を削除 |
VPS等で 24/7 稼働させたい場合、scripts/systemd/ に systemd unit テンプレートと
インストーラを用意しています。これを使えば「spawn claude ENOENT」「rootだとClaude
CLIに弾かれる」「クラッシュ後に手動で立ち上げ直し」といったお決まりの落とし穴を
回避できます。
# 1. 専用ユーザーを作成(rootで動かさない)
sudo useradd -m -s /bin/bash ryoko
# 2. その ryoko ユーザーで Node 22+ と OpenRyoko をインストール
sudo -u ryoko -i bash -lc '
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
source ~/.nvm/nvm.sh
nvm install 22
npm install -g openryoko @anthropic-ai/claude-code
ryoko setup
'
# 3. systemd unit を /etc/systemd/system/ に配置して enable
sudo ./scripts/systemd/install.sh ryoko
# 4. ログ追跡
journalctl -u openryoko -finstall.sh は対象ユーザーの PATH(nvm の Node ディレクトリ含む)を自動検出して
unit ファイルに焼き込みます。手動で openryoko.service をコピーする場合は、
テンプレート先頭のコメント(User / WorkingDirectory / Environment=PATH=… /
ExecStart)を必ず編集してください。
rootで動かしたい場合: 非推奨ですが、OpenRyoko が
IS_SANDBOX=1を自動付与 するので Claude CLI の root 拒否はバイパスされます。それでも専用ユーザー運用を強く推奨します。
ダッシュボードの Settings 画面で Slack トークン等を保存すると、~/.ryoko/config.yaml
が更新されたあと自動でコネクタが再接続されます(v0.9.5 以降)。デーモン再起動は
不要です。手動で再接続したい場合は POST /api/connectors/reload を叩けます。
Claude Code v2.1.139+ で追加された /goal コマンドを、Slackの自然な日本語/英語から
自動起動できます。
例えば DM や @メンションで:
5社の人事SaaSの料金/機能を比較した表をこのスレッドに投げて、最後までやって
と頼むと、OpenRyoko は内部で Haiku を呼んで完了条件を一文に蒸留し、Claude Code への
プロンプトに /goal X を前置します。Claude は /goal の Stop hook を立て、条件が
満たされるまで複数ターンに渡って自律的に作業を続けます。各ターンの応答はそれぞれ
独立した Slack メッセージとして投稿されるので、進捗が見える形で届きます。
トリガーは決定論的なフレーズ(「最後まで」「止まらないで」「完成するまで」「終わったら 教えて」「keep going」「until done」等)に加え、文中に 埋め込まれた停止条件 (「完了と書いたら止まる」「Xになるまで」「別々のターンで」等)にも反応します。 意味判定は Haiku が行うので、対応フレーズを覚える必要はありません。
💡 Claude Code は v2.1.139 以降が必須 です(古いバージョンだと
/goal isn't available in this environmentになります)。npm install -g @anthropic-ai/claude-code@latestで最新化してください。
設定で有効化すると、Ryoko は指定した Slack チャンネルに 「Ryoko Agents View」 というタブ付き Canvas を自動作成し、現在動いている全セッションを30秒ごとに更新 します。Running / Waiting / Errored / Interrupted / Idle のグループに分かれて、 チャンネル上部のタブから即座に「いま何が走っているか」が把握できます。
- Slack App に scope を追加 — Settings ページの「Slack App Manifest」ブロックを
コピーして自分の Slack App に貼り直し、Reinstall to Workspace を実行。これで
canvases:write/canvases:readを含む必要 scope がすべて揃います - Settings → Slack → Agents View Canvas で:
- 「有効化」をON
- 「表示先チャンネル」のドロップダウンから対象チャンネル選択(Bot が member の channel のみ表示されます)
- 必要に応じてタイトル・更新間隔・表示件数を調整
- 保存すると30秒以内に指定チャンネルに Canvas が出現します
設定はホットリロード対応なので、デーモン再起動は不要です。
OpenRyoko は 個人マシン or 信頼境界内の VPS で 1 人 / 1 チームが使う前提で 設計されています。本番運用する場合は以下を必ず守ってください:
gateway.hostはデフォルト127.0.0.1のままにする。外部公開する場合は必ず 前段に 認証付きリバースプロキシ(Tailscale Funnel + nginx basic auth、Cloudflare Access、Caddy with mTLS 等)を置く。daemon 自体は API 認証を持たない。connectors.slack.allowFromを必ず設定する。空欄だとワークスペース全員が Ryoko を駆動でき、/goalの自然言語起動と組み合わさると秘密情報の流出経路に なり得る。trusted user の Slack ID をホワイトリストで明示すること。- Slack Bot の権限はそのまま Ryoko の権限。Bot に
chat:writefiles:read等が 付与されている以上、Slack の任意ユーザが promptインジェクション経由で Ryoko に これらを使わせる可能性は理論上残る。allowFromの絞り込みが第一防御線。 - Loopback Host header guard / 限定 CORS を v2026.5.13 から有効化。
gateway.hostが127.0.0.1の時は loopback origin 以外からの API 呼び出しを 421 で拒否する。 これにより DNS rebinding によるローカルブラウザ経由の attack をブロック。
既に ~/.jinn/ で Jinn を運用している場合、OpenRyoko は初回起動時に自動でディレクトリを ~/.ryoko/ にリネームします。トークン・セッション履歴・スキル・組織ファイルはすべてそのまま引き継がれます。
環境変数で古い設定を尊重することもできます:
JINN_HOME— 指定パスをホームとして使用(後方互換)JINN_INSTANCE— インスタンス名指定(後方互換)RYOKO_HOME/RYOKO_INSTANCE— 新推奨
元の著作権表記(Jimmy AI Contributors / Hristo Stoyanov)は LICENSE ファイルに保持されています。OpenRyoko の追加変更も同じく MIT ライセンスで提供されます。
- デーモン・組織・cron・Webダッシュボード・skills・MCP といった土台レイヤーは Jinn by Hristo Stoyanov のコードを継承しています。素晴らしい基盤を公開してくれた Hristo 氏に感謝します
- Web ダッシュボードの UI コンポーネントは ClawPort UI by John Rice を基礎にしています
/goal自然言語化・Slack Canvas 同期・空気読みトリアージ等 Slack 振る舞い系の機能は OpenRyoko 独自実装で、上流に汎用化できる部分は Jinn に PR を送る方針です
本リポジトリは現在、個人利用に合わせた日本語ファーストの実験的派生版です。上流 Jinn に還元できる汎用的な改善は積極的に PR を送る方針です。
