diff --git a/.github/ISSUE_TEMPLATE/translation.yml b/.github/ISSUE_TEMPLATE/translation.yml
new file mode 100644
index 00000000..ae8557b5
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/translation.yml
@@ -0,0 +1,54 @@
+name: Translation issue
+description: Report an incorrect or unclear translation in the herdr docs.
+labels: ["translation"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Docs translations are LLM-generated from the English source. Reports about wrong, unclear, or unnatural translations are welcome here.
+
+ For bugs in herdr itself, use the bug report template instead.
+
+ - type: checkboxes
+ id: translation-confirmation
+ attributes:
+ label: Is this a translation issue?
+ description: Bugs belong in the bug report template. Feature requests, ideas, and questions belong in Discussions.
+ options:
+ - label: I confirm this is a translation issue in the herdr docs, not a bug report, feature request, or question.
+ required: true
+
+ - type: input
+ id: page
+ attributes:
+ label: Page
+ description: URL of the affected docs page.
+ placeholder: https://herdr.dev/ja/docs/quick-start/
+ validations:
+ required: true
+
+ - type: dropdown
+ id: language
+ attributes:
+ label: Language
+ options:
+ - 日本語 (Japanese)
+ - 简体中文 (Simplified Chinese)
+ validations:
+ required: true
+
+ - type: textarea
+ id: problem
+ attributes:
+ label: What is wrong
+ description: Quote the incorrect or unclear text and explain the problem. Writing in Japanese or Chinese is fine.
+ validations:
+ required: true
+
+ - type: textarea
+ id: suggestion
+ attributes:
+ label: Suggested correction
+ description: Optional. How should it read instead?
+ validations:
+ required: false
diff --git a/.github/workflows/issue-gate.yml b/.github/workflows/issue-gate.yml
index ff7a22d9..dd93e02b 100644
--- a/.github/workflows/issue-gate.yml
+++ b/.github/workflows/issue-gate.yml
@@ -120,6 +120,16 @@ jobs:
}
const body = issue.body || '';
+ const translationConfirmationPattern = /^\s*-\s*\[[xX]\]\s*I confirm this is a translation issue in the herdr docs, not a bug report, feature request, or question\.\s*$/m;
+ const translationSections = ['### Page', '### Language', '### What is wrong'];
+ if (
+ translationConfirmationPattern.test(body) &&
+ translationSections.every((section) => body.includes(section))
+ ) {
+ console.log(`#${issue.number} matches the translation issue template; leaving issue open`);
+ return;
+ }
+
const hasBugConfirmation = bugConfirmationPattern.test(body);
const hasBugTemplate = requiredSections.every((section) => body.includes(section));
const allowedHeadings = new Set(requiredSections);
diff --git a/justfile b/justfile
index 51b11154..97c02d0e 100644
--- a/justfile
+++ b/justfile
@@ -93,6 +93,22 @@ release-docs-check:
exit 1; \
fi; \
done
+ @for file in website/src/content/docs/*.mdx; do \
+ for locale in ja zh-cn; do \
+ translated="website/src/content/docs/$locale/$(basename "$file")"; \
+ if [ ! -f "$translated" ]; then \
+ echo "error: $translated is missing; translate stable docs before releasing"; \
+ exit 1; \
+ fi; \
+ done; \
+ done
+ @for file in website/src/content/docs/ja/*.mdx website/src/content/docs/zh-cn/*.mdx; do \
+ released="website/src/content/docs/$(basename "$file")"; \
+ if [ ! -f "$released" ]; then \
+ echo "error: $file has no matching english doc; remove the stale translation"; \
+ exit 1; \
+ fi; \
+ done
# Prepare the release commit without tagging or pushing (usage: just release-prepare 0.1.1)
release-prepare version:
diff --git a/website/astro.config.mjs b/website/astro.config.mjs
index 1f30a8dc..6e981d8c 100644
--- a/website/astro.config.mjs
+++ b/website/astro.config.mjs
@@ -49,11 +49,21 @@ function walk(node, visitor) {
export default defineConfig({
site: 'https://herdr.dev',
+ redirects: {
+ '/ja': '/ja/docs/',
+ '/zh-cn': '/zh-cn/docs/',
+ },
integrations: [
starlight({
title: 'herdr',
description: 'Terminal-native agent runtime and multiplexer.',
favicon: '/assets/favicon.png?v=14',
+ defaultLocale: 'root',
+ locales: {
+ root: { label: 'English', lang: 'en' },
+ ja: { label: '日本語', lang: 'ja' },
+ 'zh-cn': { label: '简体中文', lang: 'zh-CN' },
+ },
social: [
{
icon: 'github',
@@ -62,12 +72,43 @@ export default defineConfig({
},
],
components: {
+ Banner: './src/components/Banner.astro',
Header: './src/components/Header.astro',
Sidebar: './src/components/Sidebar.astro',
SiteTitle: './src/components/SiteTitle.astro',
},
customCss: ['./src/styles/starlight.css'],
head: [
+ {
+ // First-visit locale redirect: honors browser language order, then
+ // remembers the last locale the reader actually used.
+ tag: 'script',
+ content: `(function () {
+ try {
+ var KEY = 'herdr-docs-lang';
+ var path = location.pathname;
+ var m = path.match(/^\\/(ja|zh-cn)(?=\\/|$)/);
+ var current = m ? m[1] : path.indexOf('/docs') === 0 ? 'en' : null;
+ if (!current) return;
+ if (!localStorage.getItem(KEY) && current === 'en') {
+ var langs = navigator.languages && navigator.languages.length ? navigator.languages : [navigator.language || ''];
+ var target = null;
+ for (var i = 0; i < langs.length && !target; i++) {
+ var l = String(langs[i]).toLowerCase();
+ if (l === 'ja' || l.indexOf('ja-') === 0) target = 'ja';
+ else if (l === 'zh' || l.indexOf('zh-') === 0) target = 'zh-cn';
+ else if (l.indexOf('en') === 0) break;
+ }
+ if (target) {
+ localStorage.setItem(KEY, target);
+ location.replace('/' + target + path + location.search + location.hash);
+ return;
+ }
+ }
+ localStorage.setItem(KEY, current);
+ } catch (e) {}
+})();`,
+ },
{
tag: 'meta',
attrs: { property: 'og:image', content: 'https://herdr.dev/assets/og-card-v8.png' },
@@ -101,45 +142,50 @@ export default defineConfig({
sidebar: [
{
label: 'Start here',
+ translations: { ja: 'はじめに', 'zh-CN': '从这里开始' },
items: [
- { label: 'Overview', slug: 'docs' },
- { label: 'Install', slug: 'docs/install' },
- { label: 'Quick start', slug: 'docs/quick-start' },
- { label: 'Concepts', slug: 'docs/concepts' },
- { label: 'Keyboard', slug: 'docs/keyboard' },
- { label: 'How to work with Herdr', slug: 'docs/how-to-work' },
+ { label: 'Overview', translations: { ja: '概要', 'zh-CN': '概览' }, slug: 'docs' },
+ { label: 'Install', translations: { ja: 'インストール', 'zh-CN': '安装' }, slug: 'docs/install' },
+ { label: 'Quick start', translations: { ja: 'クイックスタート', 'zh-CN': '快速开始' }, slug: 'docs/quick-start' },
+ { label: 'Concepts', translations: { ja: 'コンセプト', 'zh-CN': '核心概念' }, slug: 'docs/concepts' },
+ { label: 'Keyboard', translations: { ja: 'キーボード', 'zh-CN': '键盘' }, slug: 'docs/keyboard' },
+ { label: 'How to work with Herdr', translations: { ja: 'Herdr での作業の進め方', 'zh-CN': '使用 Herdr 的工作方式' }, slug: 'docs/how-to-work' },
],
},
{
label: 'Core guides',
+ translations: { ja: 'コアガイド', 'zh-CN': '核心指南' },
items: [
- { label: 'Agents', slug: 'docs/agents' },
- { label: 'Session state and restore', slug: 'docs/session-state' },
- { label: 'Persistence and remote access', slug: 'docs/persistence-remote' },
- { label: 'Configuration', slug: 'docs/configuration' },
+ { label: 'Agents', translations: { ja: 'エージェント', 'zh-CN': '智能体' }, slug: 'docs/agents' },
+ { label: 'Session state and restore', translations: { ja: 'セッション状態と復元', 'zh-CN': '会话状态与恢复' }, slug: 'docs/session-state' },
+ { label: 'Persistence and remote access', translations: { ja: '永続化とリモートアクセス', 'zh-CN': '持久化与远程访问' }, slug: 'docs/persistence-remote' },
+ { label: 'Configuration', translations: { ja: '設定', 'zh-CN': '配置' }, slug: 'docs/configuration' },
],
},
{
label: 'Plugins',
+ translations: { ja: 'プラグイン', 'zh-CN': '插件' },
items: [
- { label: 'Plugins', slug: 'docs/plugins' },
- { label: 'Marketplace', slug: 'docs/marketplace' },
+ { label: 'Plugins', translations: { ja: 'プラグイン', 'zh-CN': '插件' }, slug: 'docs/plugins' },
+ { label: 'Marketplace', translations: { ja: 'マーケットプレイス', 'zh-CN': '插件市场' }, slug: 'docs/marketplace' },
],
},
{
label: 'Reference',
+ translations: { ja: 'リファレンス', 'zh-CN': '参考' },
items: [
- { label: 'CLI reference', slug: 'docs/cli-reference' },
- { label: 'Socket API', slug: 'docs/socket-api' },
- { label: 'Integrations', slug: 'docs/integrations' },
- { label: 'Agent skill file', slug: 'docs/agent-skill' },
- { label: 'Windows beta', slug: 'docs/windows-beta' },
+ { label: 'CLI reference', translations: { ja: 'CLI リファレンス', 'zh-CN': 'CLI 参考' }, slug: 'docs/cli-reference' },
+ { label: 'Socket API', translations: { ja: 'ソケット API', 'zh-CN': 'Socket API' }, slug: 'docs/socket-api' },
+ { label: 'Integrations', translations: { ja: 'インテグレーション', 'zh-CN': '集成' }, slug: 'docs/integrations' },
+ { label: 'Agent skill file', translations: { ja: 'エージェントスキルファイル', 'zh-CN': '智能体技能文件' }, slug: 'docs/agent-skill' },
+ { label: 'Windows beta', translations: { ja: 'Windows ベータ', 'zh-CN': 'Windows 测试版' }, slug: 'docs/windows-beta' },
],
},
{
label: 'Updates',
+ translations: { ja: '更新情報', 'zh-CN': '更新' },
items: [
- { label: 'Preview docs', slug: 'docs/preview' },
+ { label: 'Preview docs', translations: { ja: 'プレビュー版ドキュメント', 'zh-CN': '预览版文档' }, slug: 'docs/preview' },
],
},
],
diff --git a/website/src/components/Banner.astro b/website/src/components/Banner.astro
new file mode 100644
index 00000000..8a4bad22
--- /dev/null
+++ b/website/src/components/Banner.astro
@@ -0,0 +1,48 @@
+---
+const { entry, locale, isFallback } = Astro.locals.starlightRoute;
+const { banner } = entry.data;
+
+const issuesUrl = 'https://github.com/ogulcancelik/herdr/issues/new?template=translation.yml';
+const translationNotices = {
+ ja: `このページの翻訳は LLM によって生成されています。誤りに気づいた場合は GitHub で issue を開いてお知らせください。`,
+ 'zh-cn': `本页面的翻译由 LLM 生成。如果你发现翻译有误,请在 GitHub 上提交 issue 告诉我们。`,
+};
+const translationNotice = locale && !isFallback ? translationNotices[locale] : undefined;
+---
+
+{banner &&
}
+{translationNotice && (
+
+)}
+
+
diff --git a/website/src/components/SiteTitle.astro b/website/src/components/SiteTitle.astro
index f6a3b7d0..576e7635 100644
--- a/website/src/components/SiteTitle.astro
+++ b/website/src/components/SiteTitle.astro
@@ -1,7 +1,8 @@
---
-const { siteTitle, siteTitleHref } = Astro.locals.starlightRoute;
+const { siteTitle, siteTitleHref, locale } = Astro.locals.starlightRoute;
const isPreview = Astro.url.pathname === '/docs/preview/' || Astro.url.pathname.startsWith('/docs/preview/');
-const docsHref = isPreview ? '/docs/preview/' : '/docs/';
+const localePrefix = locale ? `/${locale}` : '';
+const docsHref = isPreview ? '/docs/preview/' : `${localePrefix}/docs/`;
---
diff --git a/website/src/content.config.ts b/website/src/content.config.ts
index bb0f2d8a..e84e3781 100644
--- a/website/src/content.config.ts
+++ b/website/src/content.config.ts
@@ -3,9 +3,17 @@ import { glob } from 'astro/loaders';
import { docsLoader } from '@astrojs/starlight/loaders';
import { docsSchema } from '@astrojs/starlight/schema';
+const docsLocales = ['ja', 'zh-cn'];
+
function docsPath({ entry }: { entry: string }) {
const slug = entry.replace(/\.(md|mdx|markdown|mdown|mkdn|mkd|mdwn)$/i, '');
const normalized = slug.replace(/\/index$/, '');
+ for (const locale of docsLocales) {
+ if (normalized === locale) return `${locale}/docs`;
+ if (normalized.startsWith(`${locale}/`)) {
+ return `${locale}/docs/${normalized.slice(locale.length + 1)}`;
+ }
+ }
return normalized === 'index' ? 'docs' : `docs/${normalized}`;
}
diff --git a/website/src/content/docs/ja/agent-skill.mdx b/website/src/content/docs/ja/agent-skill.mdx
new file mode 100644
index 00000000..1fc6405d
--- /dev/null
+++ b/website/src/content/docs/ja/agent-skill.mdx
@@ -0,0 +1,65 @@
+---
+title: エージェントスキルファイル
+description: Claude Code などのコーディングエージェントに Herdr の使い方をインストールします。
+---
+
+Herdr は再利用可能なエージェントスキルファイルを [`SKILL.md`](https://github.com/ogulcancelik/herdr/blob/master/SKILL.md) として提供しています。
+
+このファイルを、再利用可能なスキルやカスタム指示に対応した任意のコーディングエージェントにインストールしてください。このスキルは、Herdr のペイン内から Herdr を制御する方法をエージェントに教えます。
+
+Herdr は別の用途向けに [`herdr.dev/agent-guide.md`](https://herdr.dev/agent-guide.md) というガイドも提供しています。こちらは、人間が Herdr を学習・セットアップ・トラブルシューティングするのをエージェントが手伝うためのものです。スキルは Herdr を操作するエージェントのため、ガイドは人間に教えるエージェントのためのものです。
+
+## スキルがすること
+
+このスキルは、`HERDR_ENV=1` が設定されているときに `herdr` CLI を使うようエージェントに指示します。これは、エージェントが Herdr 管理下のペイン内で動作しており、ローカルの Herdr ソケットと安全に通信できることを意味します。
+
+スキルをインストールすると、エージェントは次のことができます:
+
+- ワークスペース、タブ、ペイン、隣のエージェントを調べる
+- フォーカスを奪わずにペインを分割してコマンドを実行する
+- ペインの出力と最近のログを読む
+- サーバー、テスト、別のエージェントの完了を待つ
+- 隣のペインでヘルパーエージェントを起動する
+
+このスキルは独立したアプリやサービスではありません。エージェント向けの markdown 指示ファイルです。
+
+## インストールする
+
+`npx skills` でスキルをインストールします:
+
+```bash
+npx skills add ogulcancelik/herdr --skill herdr -g
+```
+
+`-g` フラグは、対応エージェントにグローバルインストールします。現在のプロジェクトにインストールする場合は `-g` を省略してください。
+
+手動でのフォールバックおよび信頼できるソースとしては、リポジトリのコピーを使ってください:
+
+```text
+https://github.com/ogulcancelik/herdr/blob/master/SKILL.md
+```
+
+スキルシステムを持つエージェントには、このファイルを `herdr` という名前のスキルとしてインストールしてください。スキルシステムを持たないエージェントには、ファイルの内容をプロジェクト指示またはユーザー指示に貼り付けてください。
+
+インストール後、Herdr の中でエージェントを起動します:
+
+```bash
+herdr
+claude
+```
+
+他のコーディングエージェントを Herdr のペインで使っても構いません。重要なのは、エージェントのプロセスが Herdr 内で動作していて `HERDR_ENV=1` が利用できることです。
+
+## 安全ルール
+
+このスキルはひとつのガードレールから始まります: `HERDR_ENV=1` が設定されていない場合、エージェントは停止して、Herdr 管理下のペイン内で動作していないと伝えるべきです。
+
+これにより、Herdr の外にいるエージェントが自分のものではないセッションを制御しようとするのを防ぎます。
+
+## エージェント向けリファレンス
+
+コマンドの完全なガイドはスキルファイル自体にあります。ペイン ID、`pane split`、`pane run`、`pane read`、`wait output`、`wait agent-status`、ワークスペースとタブのコマンド、協調動作のレシピを扱っています。
+
+ソースファイルはこちら:
+
+[GitHub で `SKILL.md` を開く →](https://github.com/ogulcancelik/herdr/blob/master/SKILL.md)
diff --git a/website/src/content/docs/ja/agents.mdx b/website/src/content/docs/ja/agents.mdx
new file mode 100644
index 00000000..60a6451c
--- /dev/null
+++ b/website/src/content/docs/ja/agents.mdx
@@ -0,0 +1,163 @@
+---
+title: エージェント
+description: Herdr が何を検出できるか、エージェント状態の仕組み、インテグレーションによる精度向上。
+---
+
+Herdr は複数のコーディングエージェントを同時に動かすために作られています。各エージェントは、シェル、ログ、プロンプト、実行中プロセスをそのまま保った実際のターミナルペインの中にいます。Herdr はどのペインにエージェントがいるかを追跡し、その状態をタブとワークスペースに集約し、すべてのターミナルを手作業で見回る代わりに、注意が必要なペインへ直接ジャンプできるようにします。
+
+## 対応エージェント
+
+一般的なコーディングエージェントは、追加設定なしで自動検出されます。重要な違いは Herdr がエージェントを見えるかどうかではありません。どのシグナルが `idle`、`working`、`blocked` を決定する権限を持つかです。
+
+| エージェント | 状態の権威 | インテグレーションの役割 |
+| --- | --- | --- |
+| Pi | インストール時はライフサイクルフック。それ以外はスクリーンマニフェスト | 状態とセッション |
+| OMP | インストール時はライフサイクルフック | 状態 |
+| GitHub Copilot CLI | スクリーンマニフェスト | セッション |
+| Devin CLI | スクリーンマニフェスト | セッション |
+| Kimi Code CLI | インストール時はライフサイクルフック。それ以外はスクリーンマニフェスト | 状態とセッション |
+| Hermes Agent | インストール時はライフサイクルフック。それ以外はスクリーンマニフェスト | 状態とセッション |
+| Qoder CLI | スクリーンマニフェスト | セッション |
+| Droid | スクリーンマニフェスト | セッション |
+| OpenCode | インストール時はライフサイクルプラグイン。それ以外はスクリーンマニフェスト | 状態とセッション |
+| Kilo Code CLI | インストール時はライフサイクルプラグイン。それ以外はスクリーンマニフェスト | 状態とセッション |
+| Claude Code | スクリーンマニフェスト | セッション |
+| Codex | スクリーンマニフェスト | セッション |
+| Cursor Agent CLI | スクリーンマニフェスト | セッション |
+| Amp | スクリーンマニフェスト | なし |
+| Grok CLI | スクリーンマニフェスト | なし |
+| Antigravity CLI | スクリーンマニフェスト | なし |
+| Kiro CLI | スクリーンマニフェスト | なし |
+
+検出されるもののテストが薄いもの: Gemini CLI と Cline。未対応のエージェントも通常のターミナルプロセスとして問題なく動きます。ただし、インテグレーションを追加するかソケット API で状態を報告しない限り、詳細な状態は得られない可能性があります。
+
+## 状態の権威
+
+Herdr はまず各ペインのフォアグラウンドプロセスを検出します。その後、各ペインはひとつの状態権威を持ちます。
+
+完全なライフサイクルフックを持つエージェントでは、インテグレーションがインストールされ、実行中のペインについて能動的に報告している間は、インテグレーションが権威です。Herdr はそのフック報告を `idle`、`working`、`blocked` とセッション識別に使います。同じライフサイクル権威に対してスクリーンマニフェストのフォールバックを並走させることはしません。これにより、真実の情報源が 2 つ競合する状況を避けます。
+
+完全なライフサイクルフックを持たないエージェントでは、Herdr はフォアグラウンドプロセスを識別し、ライブの下部バッファのスクリーンスナップショットを読みます。そのスナップショットに対して TOML マニフェストを評価し、`idle`、`working`、`blocked` を分類します。それらを発するエージェントでは、マニフェストはターミナルタイトルと進捗 (OSC) シーケンスも検出の証拠としてマッチできます。その証拠がない場合は、スクリーンルールが単独で検出を担います。
+
+スクリーンスナップショットは、スクロールされたビューポートではなく、ペインバッファの直近の下部から取得されます。Herdr でスクロールバックしても、検出は下部のライブなエージェント UI を追い続けます。
+
+Claude Code、Codex、GitHub Copilot CLI、Droid、Qoder CLI、Cursor Agent CLI のインテグレーションは、意図的にライフサイクル権威にしていません。これらは復元のためのネイティブセッション識別を提供しますが、フックがライフサイクル全体をカバーしていません。許可承認の結果、Esc による中断、その他の遷移を見逃すことがあります。これらのエージェントでは、Herdr は引き続きスクリーンマニフェスト検出を使います。
+
+## VM とサンドボックスラッパー
+
+Linux では、VM、Bubblewrap、`fence` のようなラッパーがホストの `/proc` から実際のエージェントプロセスを隠すことがあります。コマンドに `HERDR_AGENT=
` を設定して (例: `HERDR_AGENT=claude fence -- claude`)、どの既存エージェントのスクリーンマニフェストを使うべきか Herdr に伝えてください。このヒントはそのフォアグラウンドプロセスにスコープされます。継承されるすべてのフォアグラウンドプロセスをそのエージェントとして扱いたいのでない限り、シェルからグローバルに export するのは避けてください。
+
+## blocked 状態
+
+スクリーンマニフェスト方式のエージェントでは、blocked の検出は意図的に厳格です。Herdr が `blocked` と判定するのは、ライブの下部バッファスナップショットが既知の承認・質問・許可 UI にマッチしたときだけです。既知のエージェントでどのマニフェストルールにもマッチしない場合、Herdr は `idle` にフォールバックし、explain の出力ではそのフォールバックに `default_known_agent_idle_fallback` というラベルを付けます。
+
+つまり、見慣れない新しいエージェントプロンプトは、Herdr がその画面の形を学習するまで、最初は `blocked` ではなく `idle` と表示されることがあります。こうしたやり取りによって Herdr が入力を送ったり破壊的な操作をしたりすることはありません。影響するのは表示上の状態と wait だけです。
+
+## 検出マニフェスト
+
+バンドルされたマニフェストは Herdr の内部にあります。Herdr は herdr.dev でリモートマニフェストの更新も確認し、有効なエージェント別ルール更新を Herdr の再起動なしで自動適用します。リモートマニフェストは Herdr の state ディレクトリに保存されます。バックグラウンドのリモートマニフェスト確認を無効にするには `[update] manifest_check = false` を設定します。
+
+ローカルオーバーライドは、プラットフォームの設定ディレクトリからリモートまたはバンドルのマニフェストを置き換えられます:
+
+```text
+~/.config/herdr/agent-detection/.toml
+```
+
+ローカルオーバーライドが常に優先されます。ローカルオーバーライドがない場合、Herdr はキャッシュされたリモートマニフェストと実行中バイナリにバンドルされたマニフェストのうち、新しくて互換性のある方を使います。デバッグビルドでは、同じ設定ヘルパーが `herdr-dev` のような開発用ディレクトリを使うことがあります。無効なオーバーライドファイルは警告付きで無視され、Herdr はそのエージェントについてキャッシュされたリモートまたはバンドルのマニフェストにフォールバックします。
+
+リモートマニフェストは、Herdr がすでに識別方法を知っているエージェントの検出ルールにパッチを当てるものです。完全に新しいエージェントの追加には、プロセス検出、ラベル、インテグレーション挙動のために Herdr バイナリのアップデートが引き続き必要です。
+
+実行中のサーバーは起動時にアクティブなマニフェストをメモリに読み込みます。リモートマニフェストの自動更新は、新しいルールが書き込まれた後にそのメモリ内キャッシュをリロードします。`herdr server update-agent-manifests` を実行すると、リモートマニフェストの更新を即座に取得して実行中のサーバーをリロードします。ローカルオーバーライドを手で編集した後は、Herdr を再起動するか `herdr server reload-agent-manifests` を実行して、実行中のサーバーにファイルを適用してください。
+
+ペインの状態表示がおかしいときは `herdr agent explain` を使ってください:
+
+```bash
+herdr agent explain
+herdr agent explain --file screen.txt --agent codex --json
+```
+
+ライブの explain は実行中のサーバーが評価するので、アクティブなマニフェストキャッシュを反映します。explain の出力には次が表示されます: エージェント、最終状態、完全なライフサイクル権威によってスクリーン検出がスキップされたかどうか、マニフェストのソースとバージョン、キャッシュされたリモートバージョン、ローカルオーバーライドによるシャドーイング、リモート更新の状況、マッチしたルール、可視の証拠フラグ、評価されたルールのマッチャーとリージョンの証拠、トランスクリプトビューアーでの更新スキップ理由、そしてどのルールにもマッチしなかったときの idle フォールバック理由です。
+
+Herdr は外側のターミナル環境として tmux の中で動かせます。エージェント検出は、Herdr のペイン内で起動された tmux セッションの中までは調べません。シェルフレームワークが Herdr 内で自動的に tmux に入る場合、Herdr はペインのプロセスとして背後のエージェントではなく `tmux` を見ることになります。
+
+## 状態のロールアップ
+
+サイドバーは状態を上位へ集約します。
+
+blocked なエージェントは、そのペイン、タブ、ワークスペースを blocked に見せます。working なエージェントはワークスペースをアクティブに見せます。done なエージェントは、あなたが確認するまで表示され続けます。
+
+これが Herdr の中心的なワークフローです: 複数のエージェントを起動し、並行して働かせ、サイドバーでどのプロジェクトが判断を必要としているか、どれがまだ実行中か、どれがレビュー待ちかを把握します。
+
+## ダイレクトインテグレーション
+
+使っている各エージェントのインテグレーションをインストールしてください。スクリーン検出だけに頼らず、フックやプラグインの報告を Herdr に提供します:
+
+```bash
+herdr integration install claude
+herdr integration status
+```
+
+対応エージェントごとに、インテグレーションの名前と挙動は異なります。エージェント別の詳細と完全なインストール一覧は[インテグレーション](/ja/docs/integrations/)を参照してください。
+
+## カスタムエージェントラベル
+
+表示用にエージェントターゲットの名前を変えられます:
+
+```bash
+herdr agent rename w1:p1 reviewer
+herdr agent rename reviewer --clear
+```
+
+ターゲットにはターミナル ID、一意なエージェント名、検出または報告されたエージェントラベル、レガシーなペイン ID が使えます。
+
+## カスタムステータスラベル
+
+インテグレーションは、意味的な状態を変えずに表示用ステータスラベルを報告できます。
+
+```bash
+herdr pane report-agent w1:p1 \
+ --source custom:indexer \
+ --agent docs-bot \
+ --state working \
+ --custom-status indexing
+```
+
+`state` は wait、通知、ロールアップを制御します。`custom-status` は表示テキストだけです。
+
+## CLI からエージェントを起動する
+
+ターミナルをエージェントターゲットとして扱いたいときは `herdr agent ...` コマンドを使います。エージェントターゲットは `agent list` に表示され、エージェント名で読み取りや入力送信ができ、エージェント状態で wait でき、直接アタッチできます。
+
+スクリプトから Herdr にエージェントを起動します:
+
+```bash
+herdr agent start reviewer --cwd ~/project --split right -- pi
+```
+
+特定のワークスペースやタブに配置することもできます:
+
+```bash
+herdr agent start docs --workspace w1 --tab w1:t1 -- claude
+```
+
+通常のターミナル、サーバー、テスト、シェル、低レベルなターミナル入力には `herdr pane ...` コマンドを使ってください。たとえば `cargo test` には `agent start` ではなく `pane split` と `pane run` を使います。そのターミナルを意図的にエージェントターゲットとして扱うのでない限り。
+
+## エージェントに直接アタッチする
+
+完全な Herdr UI ではなく、ひとつのエージェントターミナルに現在のターミナルをアタッチします:
+
+```bash
+herdr agent attach reviewer
+```
+
+`ctrl+b q` でデタッチします。リテラルの `ctrl+b` は `ctrl+b ctrl+b` で送ります。
+
+マウスホイールまたは通常の page up/page down でスクロールします。通常の入力をすると最下部に戻ります。
+
+別のダイレクトアタッチクライアントがすでに入力を所有している場合は `--takeover` を使います:
+
+```bash
+herdr agent attach reviewer --takeover
+```
+
+エージェントではないターミナルで同じダイレクトアタッチ挙動が欲しいときは `herdr terminal attach ` を使ってください。
diff --git a/website/src/content/docs/ja/cli-reference.mdx b/website/src/content/docs/ja/cli-reference.mdx
new file mode 100644
index 00000000..53559ea0
--- /dev/null
+++ b/website/src/content/docs/ja/cli-reference.mdx
@@ -0,0 +1,356 @@
+---
+title: CLI リファレンス
+description: セッション、ワークスペース、タブ、ペイン、通知、エージェント、wait、インテグレーション、ステータスのための Herdr コマンド。
+---
+
+Herdr の CLI は、インテグレーションやエージェントが使うのと同じローカルソケット API を通じて、実行中のサーバーと通信します。
+
+ほとんどのコマンドは JSON レスポンスを出力します。決定的な自動化が欲しいときはスクリプトから使ってください。
+
+## 起動とステータス
+
+```bash
+herdr # デフォルトセッションを起動またはアタッチ
+herdr --session work # 名前付きセッションを起動またはアタッチ
+herdr --remote workbox # SSH 越しにアタッチ (ローカルのキーバインドを使用)
+herdr --remote workbox --remote-keybindings server
+herdr --remote workbox --handoff
+herdr --no-session # シングルプロセスの逃げ道
+herdr --default-config # デフォルト設定を表示
+herdr update # 設定済みチャンネルからダウンロードしてインストール
+herdr update --handoff # 対応する実行中サーバーでライブハンドオフにオプトイン
+herdr channel show # stable または preview を表示
+herdr channel set preview # プレビュービルドにオプトイン
+herdr channel set stable # Linux/macOS の直接インストールを安定版に戻す
+herdr --version # バージョンを表示
+```
+
+ステータスコマンド:
+
+```bash
+herdr status
+herdr status server
+herdr status client
+```
+
+## サーバー
+
+```bash
+herdr server
+herdr server stop
+herdr server reload-config
+herdr server agent-manifests [--json]
+herdr server update-agent-manifests [--json]
+herdr server reload-agent-manifests
+```
+
+`herdr server` はヘッドレスサーバーを明示的に起動します。監視下やサービス的な構成で使ってください。`reload-config` はペインを再起動せずにリロード可能な設定を適用します。`agent-manifests` は、アクティブなエージェント検出マニフェストのソース、キャッシュされたリモートバージョン、直近のリモート更新結果を表示します。`update-agent-manifests` はリモートマニフェストの更新を即座に取得し、実行中のサーバーにリロードして、更新後のマニフェスト状態を表示します。生のステータスレスポンスが欲しいときは `--json` を渡してください。`reload-agent-manifests` は、ローカルオーバーライドの編集後にエージェント検出マニフェストを実行中のサーバーにリロードします。
+
+## 通知
+
+```bash
+herdr notification show [--body TEXT] [--position top-left|top-right|bottom-left|bottom-right] [--sound none|done|request]
+```
+
+`notification show` は設定済みの `[ui.toast]` 配信を使います。`--position` はアプリ内の Herdr トーストにのみ影響します。`--sound` のデフォルトは `none` で、`done` と `request` は通知が表示されたときにのみ、既存の完了音と要注意音を再生します。
+
+## セッション
+
+```bash
+herdr session list [--json]
+herdr session attach
+herdr session stop [--json]
+herdr session delete [--json]
+```
+
+デフォルトセッションを明示的に停止する必要があるときは、セッション名として `default` を使ってください。
+
+## ワークスペース
+
+```bash
+herdr workspace list
+herdr workspace create [--cwd PATH] [--label TEXT] [--env KEY=VALUE] [--focus] [--no-focus]
+herdr workspace get
+herdr workspace focus
+herdr workspace rename