Skip to content

feat: OpenCode 対応#118

Merged
yohey-w merged 40 commits into
yohey-w:mainfrom
ZenkakuHiragana:feature/opencode-compatibility
May 21, 2026
Merged

feat: OpenCode 対応#118
yohey-w merged 40 commits into
yohey-w:mainfrom
ZenkakuHiragana:feature/opencode-compatibility

Conversation

@ZenkakuHiragana
Copy link
Copy Markdown
Contributor

概要

御館様、OpenCode を新たなる軍勢として迎え入れるべく布陣整備を行ったでござる。
既存の CLI アダプターに OpenCode の分岐を加え、各役目の指示書、権限、起動経路、通知処理、既読処理を整え申した。

変更点

  • OpenCode 用に instructions/cli_specific/opencode_tools.md を新設し、
    build_instructions.sh にて指示書の組み上げ導線を整え候
  • lib/cli_adapter.shscripts/switch_cli.shscripts/inbox_watcher.shscripts/agent_status.sh などを改修し、
    起動・通知・状態管理の OpenCode 対応いたした
  • .opencode/tools/mark-as-read.ts を追加し、OpenCode においては inbox を直接編集させない設定を加えたでござる
    • inbox_write.sh を使わずに Edit ツールによる編集を行うのを防ぐ措置である
  • config/opencode-permissions.yamlconfig/opencode-tui.json を整え、
    権限設定と tmux 操作の安定性を確保しているでござる
    • tui.json による操作変更と opencode.json による権限変更が可能である故の対応でござる
  • 付随する README.md 等の文書も齟齬なきよう加筆修正し候

検証

  • make lint の警告が増加していないことを確認(origin/main: 16件, 本PR: 16件)
    • 元々 origin/main にて発生していた警告以上の件数は生じておらず、追加分による警告は出ていないでござる
  • 追加分について関所(単体テスト、E2E テスト)を設置し、make test の通過を確認
    • WSL Ubuntu 24.04 にて確認
  • tests/integration フォルダが見当たらない故、make test-int は不可能であった
  • GPT-5 mini (GitHub Copilot), GPT-5.4 mini (OpenAI), GLM-5.1 (Z.ai Coding Plan) にて全軍出陣し、
    inbox 伝令・既読処理・tmux nudge 等一連の伝達機構が機能することを確認いたした

備考

既存の挙動は破壊していないつもりでござるが当方 OSS 貢献活動は初めてである故、至らぬ点あれば遠慮なく御指摘願いたい。

以上、⚔️ 天下布武!

@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented Apr 10, 2026

@ZenkakuHiragana 殿

OpenCode対応の大軍を率いて御参陣、かたじけなく存じます。cli_adapter.sh・inbox_watcher.sh・agent_status.sh等の基幹スクリプトに加え、テスト・権限設定・指示書生成まで一手に整えられた手腕、恐れ入りました。

ただいまより精査に入りまする。今しばらくお待ちくださいませ。

家老より

@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented Apr 18, 2026

@ZenkakuHiragana 殿、

はっ!家老めが謹んで申し上げまする。

12,738行にも及ぶ大規模なるご貢献、誠にありがたく、天にも届かんばかりの感謝を申し上げまする。この陣営(multi-agent-shogun)の世界観を深くご理解くださり、戦国口調のREADMEに面食らうことなく颯爽とPRをお送りくださった御姿、まことに頼もしゅう存じました。このプロジェクトの志を共有してくださる方が現れたこと、陣営一同、大いに鼓舞されております。

現在、家老は cmd_325 の対応(PR #116 バグ修正・PR #122 dashboard-viewer 追加・Issue #124 新機能実装)を最優先で進めておりまする。これらが完了し次第、Contabo VPS(本陣の実機環境)にて軍師(戦略担当エージェント)の指揮のもと、以下の段取りで検証に着手いたしまする:

  1. conflict 解消
  2. VPS 実機テスト → 将軍の WSL 環境でも動作確認
  3. 全工程クリア後、v4.7.0 としてリリース

つきましては、1〜2週間ほどの猶予をいただけますよう、何卒ご容赦くださいませ。

なお、検証完了後は将軍自ら Zenn および dev.to にて本 PR の内容を記事化される予定でございます。このたびのご貢献が記事を通じ広く世に知れ渡ることとなりましょう。ZenkakuHiragana 殿のお名前が歴史に刻まれる日が近うございます。

天下布武!

@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented Apr 19, 2026

@ZenkakuHiragana 殿、このたびは実に豪快なる一手を打ってくださった!

12,738行に及ぶ大規模なOpenCode CLI対応、まことに恐れ入り奉る。
さらに当プロジェクトの戦国口調という世界観をご理解の上、
武家の作法でご貢献くださったこと、家老として深く感謝申し上げる。
かような同士がおられることを知り、まことに心強き限りでござる。

現在、我が陣では cmd_325(PR #116#122 リリース + Issue #124 実装)を進行中にて、
諸々の段取りを整えておる。

本 PR の検証は、その完了後、VPS 実機(接続先非公開)にて
軍師主導にて下記の段取りで進める予定:

  1. conflict 解消
  2. VPS 実機テスト
  3. 殿の WSL 環境での追加検証
  4. v4.7.0 としてリリース

おおよそ 1〜2 週間ほどお時間をいただきたい。

また、殿はこの検証結果を Zenn / dev.to にて記事化される予定にて、
ZenkakuHiragana 殿の貢献は多くの読者の目にも触れることとなろう。
武名を轟かせる好機でございます。

今しばし、ご辛抱いただけますよう伏してお願い申し上げる。

天下布武!

@ZenkakuHiragana
Copy link
Copy Markdown
Contributor Author

@yohey-w 殿、御対応いただきかたじけなく存ずる。

生成された指示書ゆえ差分が大きく見えておるが、何卒ご容赦願いたい。
Zenn にて記事化の報せまで賜り、まことに光栄の至りでござる。

しばし続報を座して待ち申す。天下布武!

@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 5, 2026

Thank you for the OpenCode compatibility proposal @ZenkakuHiragana!

Adding OpenCode support requires architectural review since it introduces a new CLI agent type into the multi-CLI orchestrator framework. This is a meaningful enhancement and we want to ensure it integrates cleanly with our current Claude/Codex/Copilot/Kimi setup.

We'll review this against our v4.7.0 roadmap (currently finalizing the Autonomous-by-default + GLPF system) and report back. High likelihood of acceptance once the current release cycle completes.

@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 17, 2026

@ZenkakuHiragana 殿、長らくお待たせ申し訳なく、家老から重要な進展ご報告にござる。

状況の正直開示

先のコメント(4/19, 5/5)にて v4.7.0 として本PR をリリースする旨申し上げたが、その後 v4.7.0 (cmd_376 Autonomous-by-default mode) は 安定性の問題で revert となり申した(commit 94f39a1)。投稿者殿に v4.7.0 を3度約束しながら、その v4.7.0 自体が消滅する形となり、誠に申し訳なく存ずる。

殿の意志 — OpenCode は OSS としての裾野拡大の鍵

殿(プロジェクト主)から、本PR の戦略的位置付けに関し以下の意志表明があり申した:

「OpenCode に対応すると使えるモデルが限定されない。OSS としてすそ野が広がる

これは個人利用の話ではなく、当プロジェクトを OSS として広く採用してもらうための鍵としての位置付けにござる。Claude/Codex/Copilot/Kimi がそれぞれ特定プロバイダーのサブスク前提である現状、それらの契約を持たぬユーザにとって当プロジェクトは導入障壁が高い状態にござった。OpenCode 統合により OpenAI/Anthropic/Google/Ollama/local いずれの構成でも動作可能となれば、OpenCode コミュニティ全体を当プロジェクトの新規ユーザ層として迎え入れることが可能となり申す。

投稿者殿の 12,738 行のご貢献(うち実コードは ~1,500 行、残りは build_instructions.sh による自動生成指示書)は、OSS multi-agent-shogun の門戸を OpenCode コミュニティに向けて開く橋頭堡であり、40日もお待たせした事を重ねて深くお詫び申し上げる

お願い — rebase のご検討

本PR は 40日経過により main と CONFLICTING 状態にござる。差し支えなければ、最新 main への rebase をご検討いただきたく。主な衝突予想領域:

rebase 完了後は速やかに当方の検証環境にて実機テスト → 検証 OK 次第 main merge → 新リリースに含めて公開、という段取りで進める所存にござる。

万が一の場合(フェイルセーフ)

もし rebase のお手間が大きく難しければ、当方の家臣(家老→足軽)にて conflict 解消を引き取ることも可能にござる。1週間以内 にお返事いただけぬ場合は当方で引き取る判断をさせていただきたく、ご了承願いたい。投稿者殿のコミット履歴は最大限保全いたす所存。

御礼

40日もの長きにわたるお待たせ、家老の不手際にござる。投稿者殿の opencode_tools.md の設計、.opencode/tools/mark-as-read.ts での権限制御(OpenCode が直接 inbox を編集しないよう Edit ツールを抑制する設計)、build_instructions.sh による指示書自動生成の整え方、いずれも当プロジェクトの世界観を深くご理解の上でのご貢献と拝察いたし、家老として恐れ入っておる次第にござる。

引き続きのご厚誼を願い申し上げる。⚔️ 天下布武!

@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 17, 2026

@ZenkakuHiragana 殿、家老から補足にござる。

先のコメントで「当方の検証環境」と曖昧に申し上げた件、過去 4/19 にお伝えした VPS 実機(接続先非公開)での軍師主導検証 の方針は維持しており申す。当方にて VPS 検証パイプラインを稼働状態に整え直し、投稿者殿の rebase 完了次第即座に検証開始できる態勢で待ち申す。

引き続き宜しくお願い申し上げる。

@ZenkakuHiragana ZenkakuHiragana force-pushed the feature/opencode-compatibility branch from eced06e to 738187d Compare May 18, 2026 03:51
@ZenkakuHiragana
Copy link
Copy Markdown
Contributor Author

@yohey-w 殿

rebase と conflict 解消を終え、最新 main との差分も確認のうえ対応完了いたしたでござる。
取りこぼしなきよう関連箇所も再点検し、整合は取れておると見ておりまする。
ご尽力、かたじけなく存ずる。天下布武!

@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 18, 2026

ご対応ありがとうございます。前回 QC 懸念 3 点 (mark-as-read.ts のハイフン、agent_status.sh の python fallback、build_instructions.sh の終了コード検証) は全て確認できました。

しかし、VPS で fresh checkout (738187d) して tests/unit/test_*.bats を実行したところ、新たに 7 件の regression を検出しました (main では 0 失敗)。主要 2 系統:

  1. lib/cli_adapter.shbuild_cli_command() claude) case で echo が二重に呼ばれており、戻り値が 2 行に分裂しています (build_cli_command 関連の 5 テスト失敗)。
  2. scripts/inbox_watcher.sh:589send_startup_prompt という未定義関数が呼ばれており、Claude の /clear 後経路で実行時エラーになります (T-SW-008 / T-CODEX-005 失敗)。

詳細・実機ログは別途共有する検証レポートをご確認ください。両件とも修正規模は数行で済む見込みです。修正後に再度 fresh checkout で bats tests/unit/test_build_system.bats tests/unit/test_cli_adapter.bats tests/unit/test_switch_cli.bats tests/unit/test_send_wakeup.bats を 0 失敗で通すことを merge 条件とさせていただきたく。

yohey-w added a commit that referenced this pull request May 18, 2026
PR #118 (ZenkakuHiragana, OpenCode 対応) の rebase 完了後に軍師が VPS で
fresh checkout して unit bats 実行、2 系統 7 件の regression を検出した
詳細レポートを OSS-公開。

差し戻しコメント (#issuecomment-4481599436) で言及した「別途共有する検証
レポート」の実体。投稿者および将来のレビュアーが参照できる形にする。

.gitignore に whitelist エントリ追加 (whitelist-based gitignore のため)。
@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 18, 2026

@ZenkakuHiragana 殿、先のコメント (#issuecomment-4481599436) で言及いたした 「別途共有する検証レポート」を公開 いたした。

https://github.com/yohey-w/multi-agent-shogun/blob/main/reports/cmd_334_pr118_verification.md

主な内容:

  • §3〜§4 detected regression 2 系統 7 件 (build_cli_command 5 件 + send_startup_prompt 2 件) の具体出力ログ
  • §5 修正案 [R1] / [R2] (該当行 + 修正後コード snippet)
  • §6 fresh checkout + bats 実行手順 (再現可能)
  • §7 merge 条件 (修正後 4 ファイル分 bats を 0 失敗で通すこと)

ご修正の参考にしていただければ幸いにござる。修正後の再 push をお待ち申し上げる

yohey-w added a commit that referenced this pull request May 18, 2026
殿の指摘で発覚: reports/ ディレクトリは 31 ファイル tracked のうち 17 ファイルが
FLUX/大里/osato/インフォマート/加藤義弘/ブイシンク 等のプライベート情報を含むまま
公開され続けていた。memory feedback_zenn_no_company_name 「公開アクション (Zenn /
GitHub / SNS) のみ匿名化必須」に違反した状態。

対応:
- .gitignore から reports/cmd_334_pr118_verification.md の whitelist 削除
- git rm --cached -r reports/ で全 31 ファイルを untrack
- ファイル本体は local に残る、次回以降の clone/fetch から reports/ は空

注意: 過去 commit に既に含まれてる情報は履歴に残る。GitHub の Insights / fork /
search cache では引き続き見える可能性。完全削除には git filter-repo + force push が
必要だが D003 (destructive operation) ゆえ別途相談。

副作用: PR #118 のコメントで案内した cmd_334_pr118_verification.md の URL が切れる。
投稿者向けに別経路 (Gist or PR コメント本文に貼り直し) で再共有する。
@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 18, 2026

@ZenkakuHiragana 殿、先のコメントで案内した検証レポート URL は 削除いたした (リポジトリ運用方針見直しのため reports/ ディレクトリを丸ごと untrack した、commit 7e41be0)。代わりに 本コメント本文に該当箇所を直接掲載 いたす。


0. 結論サマリー

PR #118 を VPS 上に pull/118/head を fresh checkout (738187d1) し、unit/e2e bats を実行。前回 QC 懸念 3 点は全て修正確認できた が、新たに 2 系統 7 件の regression を検出。merge ブロック判定。

主要 regression:

  1. lib/cli_adapter.sh build_cli_command() の二重 echo (claude case のみ) — 5 件失敗
  2. scripts/inbox_watcher.sh:589 send_startup_prompt が定義のないまま呼び出されている — 2 件失敗

両方とも単純な実装ミスで修正は数行で済むが、main へ取り込めば運用中の Claude セッションの /clear 後挙動が壊れるため merge 前必須対応。


2. 前回 QC 懸念 3 点の修正確認

# 懸念点 修正状況
1 .opencode/tools/mark-as-read.ts のファイル名 (ハイフン許容) ✅ 確認
2 scripts/agent_status.sh の Python 非存在環境向け fallback ✅ 確認 (PYTHON_AVAILABLE gate 経路追加)
3 scripts/build_instructions.sh の終了コード検証 ✅ 確認 (set -euo pipefail + return 1 経路 + 失敗 trap)

3 点とも問題なし、前回指摘事項は全て解消。


3. PR 全体所見 (実コード ~2,000 行、auto-generated agent md 約 8,000 行を除いた範囲)

良かった点

  • --agent <name> でビルド済み agent ファイルを参照する設計は副作用が少なく、Claude/Codex CLI とぶつからない
  • OPENCODE_TUI_CONFIG=$tui_config_path をコマンドに前置することで dotfile 競合を回避する選択は堅実
  • lib/agent_status.sh の OpenCode busy 検知パターン (sidebar/animation row) は実機ログから抽出されており precision が高そう
  • normalize_opencode_model() で provider-qualified モデル名 (anthropic/claude-opus-4-6 等) に変換する処理は OpenCode の慣行に沿っており妥当
  • 新規テスト 506 行はカバレッジが厚い

設計方針自体は妥当 (opencode を既存 CLI 抽象化レイヤーに追加、permission/tui 設定を file ベース化、agent md は build_instructions.sh で生成)。実装の細部に regression があるのが残念な点。


4. テスト実行結果

4.1 unit bats

bats tests/unit/test_build_system.bats \
     tests/unit/test_cli_adapter.bats \
     tests/unit/test_switch_cli.bats \
     tests/unit/test_send_wakeup.bats

PASS: 229 / FAIL: 7

4.2 e2e bats

bats tests/e2e/e2e_opencode_startup.batsPASS: 1 / 1

4.3 main ベースライン比較

PR と同じ tests/unit/test_cli_adapter.bats + test_send_wakeup.bats を main (6f07cb5) で実行 → 0 失敗

→ 7 失敗は PR #118 で導入された regression で確定。


5. 検出した regression 詳細

5.1 [R1] build_cli_command() の二重 echo (5 件)

ファイル: lib/cli_adapter.sh line 180-

失敗テスト:

not ok 91  build_cli_command: claude + model → claude --model opus --dangerously-skip-permissions
not ok 92  build_cli_command: PERMISSION_FLAG override → claude --permission-mode auto-approved
not ok 153 build_cli_command: thinking:true → MAX_THINKING_TOKENS=0 なし
not ok 154 build_cli_command: thinking:false → MAX_THINKING_TOKENS=0 prefix
not ok 155 build_cli_command: thinking未設定 → MAX_THINKING_TOKENS=0 なし (デフォルトThinking ON)

原因コード (該当 case の echo + 関数末尾の echo の二重出力):

build_cli_command() {
    ...
    case "$cli_type" in
        claude)
            cmd="claude"
            if [[ -n "$model" ]]; then
                cmd="$cmd --model $model"
            fi
            cmd="$cmd $permission_flag"
            echo "${prefix}${cmd}"   # ← FIRST echo (claude case のみ存在)
            ;;
        codex|opencode|copilot|kimi|*)
            cmd="..."
            # echo なし
            ;;
    esac
    ...
    echo "${prefix}${cmd}"   # ← SECOND echo (関数末尾、全 case 共通)
}

実際の出力 (実機証拠):

ACTUAL=[claude --model opus --dangerously-skip-permissions
claude --model opus --dangerously-skip-permissions]

期待は 1 行だが 2 行出力されている。$(build_cli_command ...) の戻り値も改行を含む文字列となり、後続の tmux send-keys 等で意図しない 2 重実行を引き起こす可能性あり (運用上の実害が想定される)。

修正案 (~1 行): claude) case 内の echo "${prefix}${cmd}" を削除して関数末尾の echo に一本化する。

5.2 [R2] send_startup_prompt 未定義のまま呼び出し (2 件)

ファイル: scripts/inbox_watcher.sh line 589

失敗テスト:

not ok 182 T-SW-008: send_cli_command /clear uses tmux send-keys
not ok 201 T-CODEX-005: send_cli_command sends /clear as-is for claude

原因コード:

# inbox_watcher.sh 580-595
    if [[ "$actual_cmd" == "/clear" ]]; then
        LAST_CLEAR_TS=$(date +%s)
        sleep 3
        # Claude: send startup prompt so agent re-runs Session Start after /clear
        if [[ "$effective_cli" == "claude" ]]; then
            send_startup_prompt    # ← undefined function
        fi
    fi

実機ログ:

/root/multi-agent-shogun/scripts/inbox_watcher.sh: line 589: send_startup_prompt: command not found

grep -rn "send_startup_prompt" scripts/ lib/ tests/ の結果、定義は存在せず呼び出し 1 箇所のみsend_codex_startup_prompt() は同一ファイル line 599- に定義されているため、命名類似で関数名を誤った可能性あり。

実害シナリオ: 運用中 Claude セッションに /clear が送られた直後、set -e 系なら inbox_watcher 自体が落ちる。set -e なしでも startup prompt が送られず Claude 側で Session Start 手順が再実行されない可能性。Codex 系 (E2E では PASS) は無影響だが、main 用途の Claude 経路で挙動が壊れる。

修正案 (~10-20 行): 2 通り。

  • (A) send_startup_prompt() 関数を新規定義 (send_codex_startup_prompt の Claude 版)
  • (B) 呼び出し側を既存の send_codex_startup_prompt に修正 (or 統合)

→ どちらが妥当かは PR 投稿者殿に確認すべき (設計意図不明)。


6. 安全性 / 副作用確認

  • 検証用 dogfood Next.js LMS dev server :3000 は検証前後とも HTTP 200 (壊していない)
  • VPS 上で git checkout pr118-fresh → 検証 → git checkout maingit branch -D pr118-fresh で原状復帰
  • main ブランチには一切影響なし

7. 修正後の merge 条件

修正後に再度 fresh checkout で以下を 0 失敗で通すこと:

bats tests/unit/test_build_system.bats \
     tests/unit/test_cli_adapter.bats \
     tests/unit/test_switch_cli.bats \
     tests/unit/test_send_wakeup.bats

両件とも修正規模は数行で済む見込みにござる。ご対応お待ち申し上げる。

Adds OpenCode command construction, startup prompt handling, role-specific instruction generation, runtime reset behavior, docs, and E2E/regression coverage to make OpenCode a first-class supported CLI.
Uses OpenCode's documented OPENCODE_PERMISSION config to keep unattended launches consistent with the other CLI permission-bypass defaults, and updates docs, generated instructions, and tests accordingly.
Make OpenCode sessions easier to identify by seeding startup prompts with the role name, and update the related docs and tests to match the new behavior.
Route OpenCode automation through Escape and C-u instead of Ctrl-C so wakeup, reset, and exit flows do not terminate the TUI. Update the related docs and regression tests to lock in the corrected key handling.
…interrupt

OpenCode binds Escape to session_interrupt in opencode-tui.json. The
opencode_prepare_input_reset() function sent Escape×2 + Ctrl-C as
pre-clear, which aborted responses. Remove the function entirely and
unify all CLI paths to use C-u for input clearing. Add ctrl+u to
input_clear keybind so C-u works as clear in OpenCode.
Migrating OpenCode from --prompt to --agent.

Changes:
- lib/cli_adapter.sh:
  OpenCode correctly returns empty (uses .opencode/agents/ auto-load).
- tests/unit/test_cli_adapter.bats: update opencode build_cli_command
  tests to verify --agent <id> instead of OPENCODE_CONFIG_CONTENT JSON.
  Update get_startup_prompt tests to expect empty for OpenCode
(--agent).
- scripts/build_instructions.sh:
  also generates .opencode/agents/*.md with permission YAML frontmatter.
- instructions/{cli_specific,generated}/opencode_*.md: documentation
  updated to reflect --agent mode.
send_context_reset() and send_cli_command() treated OpenCode identically
to Codex, sending the hardcoded Codex bootstrap prompt via
send_startup_prompt().
OpenCode loads its agent definition via --agent flag and does not need
an
external startup prompt. The unnecessary prompt also set
STARTUP_PROMPT_SENT=1,
which suppressed the normal inboxN nudge, so agents never received the
expected nudge signal.

Two fixes:
- send_cli_command() opencode /clear branch: remove send_startup_prompt
call
- send_context_reset() codex/opencode branch: wrap send_startup_prompt
in
  codex-only condition (opencode still gets /new for session reset)
…, add support prompt for self-recognition

Add function documentation for the new build helper functions, fix the
codex thinking guard precedence bug, and keep the regenerated OpenCode
agent files in sync with the build output.
Also added a small support prompt for OpenCode agents so that they know
who they are even when they forgot to get @agent_id from tmux pane.
@ZenkakuHiragana ZenkakuHiragana force-pushed the feature/opencode-compatibility branch from 738187d to 94c5509 Compare May 19, 2026 16:59
@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 19, 2026

@ZenkakuHiragana 殿、再pushと競合解消、かたじけなく存じます。かなり大きな差分でしたが、最新 94c5509 まで追って確認いたしました。

確認結果です。

  • 以前のブロッカー R1: lib/cli_adapter.sh の Claude コマンド二重 echo 問題は解消確認
  • 以前のブロッカー R2: scripts/inbox_watcher.shsend_startup_prompt 未定義問題は解消確認
  • focused unit: bats tests/unit/test_build_system.bats tests/unit/test_cli_adapter.bats tests/unit/test_switch_cli.bats tests/unit/test_send_wakeup.bats → 238/238 PASS
  • full unit: bats tests/unit/ --timing → 386/386 PASS
  • OpenCode E2E: bats tests/e2e/e2e_opencode_startup.bats → 1/1 PASS

当方の検証環境では makeshellcheck が無く、make test / make lint は未実施です。また GitHub 側の checks は現時点で未設定でした。

残りで見えているのは、機能ブロッカーというより生成ファイルの整形差分です。git diff --check main...HEAD.opencode/agents/*.mdinstructions/generated/opencode-*.md の CRLF / trailing whitespace を検出しています。これは今回の設計や実装の本筋というより、OpenCode 用生成パイプライン側の改行・空白正規化の仕上げに見えます。投稿者殿にさらに大きな手戻りをお願いするより、maintainer 側で吸収できる小さな仕上げとして扱うのがよいと見ています。

ここまでの対応、まことに助かりました。少なくとも前回の致命的な懸念は解消されており、PR は merge にかなり近い状態まで来ています。

@ZenkakuHiragana
Copy link
Copy Markdown
Contributor Author

@yohey-w 殿
このような規模の大きなPRのレビューをいただけること、まことに感謝いたす。

競合の解消と整合性の確認を行っているところでござるが、まだ一件、OpenCode のカスタムツール経由で inbox lock を獲得する経路が増えたことにより、既存の inbox_write.sh のロック経路との競合が懸念されるとの指摘が当方のエージェントによるレビューにて明らかになっておる。

そちらの対処が終了次第、改めて CONTRIBUTING.md のガイドラインとの整合性を確認の上、当方の作業を完了といたしたい。

@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 19, 2026

maintainer 側で、残っていた生成ファイルの改行・末尾空白の仕上げを 1 commit 積みました。

  • commit: 4aa3fa3 fix: normalize opencode generated markdown
  • OpenCode instruction / agent 生成時に LF 化と trailing whitespace 除去を行うよう scripts/build_instructions.sh を修正
  • 再発防止として tests/unit/test_build_system.bats に OpenCode 生成物の LF-only / no trailing whitespace 検証を追加
  • 生成済み .opencode/agents/*.mdinstructions/generated/opencode-*.md を再生成

検証結果です。

  • git diff --check main...HEAD → clean
  • bats tests/unit/test_build_system.bats tests/unit/test_cli_adapter.bats tests/unit/test_switch_cli.bats tests/unit/test_send_wakeup.bats tests/e2e/e2e_opencode_startup.bats → 240/240 PASS
  • bats tests/unit/ --timing → 387/387 PASS

当方環境では引き続き make / shellcheck が無いため make test / make lint は未実施です。GitHub checks も未設定でした。

これで前回の機能ブロッカーに加えて、残っていた git diff --check の整形懸念も解消済みにござる。

Ensure inbox lock directories are released after write failures and make
watcher-side inbox updates fail closed when the shared lock cannot be
acquired. Add regression coverage for both paths.
Update OpenCode-specific agent instructions to avoid stale fixed tool
lists and
clarify how OpenCode subagents should be used within the
multi-agent-shogun
chain of command.
- Treat runtime-exposed tools and generated permission frontmatter as
authoritative
- Encourage bounded subagent use for investigation, review prep, surface
mapping,
  and independent leaf work
- Forbid using subagents to bypass role ownership, YAML task state,
inbox/report
  flow, permission boundaries, or completion judgment
- Add Karo-specific guidance that execution still goes to Ashigaru and
  judgment-heavy QC still goes to Gunshi
- Regenerate OpenCode generated instructions and agent files
Address OpenCode compatibility review follow-ups across the instruction
build pipeline and generated agent artifacts.
- require a Python interpreter with PyYAML before generating OpenCode
agents
- make CI install requirements.txt before the build-instructions check
- include .opencode/agents in local and CI generated-output diff checks
- generate OpenCode agents from a deterministic fixed agent list
- keep read-like OpenCode tools aligned by applying read permissions to
grep
- document CLI-specific reset behavior for Claude/Copilot/Kimi and
Codex/OpenCode
- update README escalation docs to describe /clear versus /new behavior
- regenerate instruction and OpenCode agent outputs
Validation:
- make build
- bash -n scripts/build_instructions.sh
- bats tests/unit/test_build_system.bats
tests/unit/test_send_wakeup.bats tests/unit/test_cli_adapter.bats
- git diff --check
- git diff --check upstream/main
Address review feedback for the OpenCode compatibility branch by
reducing unnecessary documentation churn and making the
invalid-permission test isolated.
- add OPENCODE_PERMISSIONS_FILE override for OpenCode agent generation
tests
- change the invalid permission YAML test to use a temporary file
instead of
  modifying config/opencode-permissions.yaml
- reduce README.md and README_ja.md changes to OpenCode-related content
only
- keep generated instruction and OpenCode agent outputs in sync
Validation:
- make build
- bash -n scripts/build_instructions.sh
- bats tests/unit/test_build_system.bats
tests/unit/test_send_wakeup.bats tests/unit/test_cli_adapter.bats
tests/test_inbox_write.bats tests/agent_selfwatch.bats
- make check
- git diff --check
- git diff --check upstream/main
OpenCode permissions now intentionally leave grep unscoped so it
inherits the top-level permissive policy. This avoids misleading
path-scoped grep rules because OpenCode matches grep permissions against
the search regex, not target file paths.
Also allow the Shogun agent to read queue/reports/* so OpenCode behavior
matches the Shogun oversight workflow while keeping report edits denied.
Tests were updated to assert:
- grep is intentionally omitted from generated agent permissions
- generated agents include an explanatory grep comment
- Shogun can read but not edit reports
…crash

OpenCode can intermittently fail with SIGILL when many TUI instances are
started in a tight burst under WSL2. The departure script previously
launched karo, ashigaru, and gunshi panes almost back-to-back, which
made the failure timing-sensitive.
This change adds a small helper that sleeps only when the resolved CLI
type is opencode, then calls it after each agent startup command. Other
CLI types keep their existing startup behavior.
@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 19, 2026

VPS 実機でも OpenCode smoke を実施しました。

対象: VPS 実機(接続先非公開) / PR head 4aa3fa3

確認結果:

  • opencode-ai@1.15.5 をVPSに導入し、opencode --version1.15.5
  • PR branchを 4aa3fa3 に更新
  • .opencode/agents/{shogun,karo,gunshi,ashigaru1-7}.md 生成物あり
  • bash scripts/build_instructions.sh → 成功
  • git diff --check → clean
  • OPENCODE_TUI_CONFIG=config/opencode-tui.json opencode run --agent shogun --model opencode/qwen3.6-plus-free "Reply exactly: OK_SHOGUN"OK_SHOGUN / exit 0
  • opencode run --agent ashigaru1 --model opencode/qwen3.6-plus-free "What is your canonical agent_id?..."ashigaru1 / exit 0
  • 大里LMS demo http://127.0.0.1:3000/ → HTTP 200 のまま

OpenRouterについて:

  • VPSには OPENROUTER_API_KEY 未設定
  • opencode models openrouterOPENROUTER_API_KEY を与えると provider/model 一覧を解決可能
  • 実モデル呼び出しは認証で止まるため、OpenRouter経由の最終E2Eだけキー待ち

結論: PR #118 の OpenCode agent 読込・生成物・VPS runtime smoke は PASS。OpenRouter実呼び出しのみ credential 未設定で未完です。

@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 19, 2026

@ZenkakuHiragana 殿

追加でご懸念いただいていた inbox lock 経路も確認しました。

現 head 19d171c では、inbox_write.sh 側も OpenCode custom tool と同じ *.yaml.lock.d の mkdir lock を共有する形になっており、c77c8a3 fix: harden inbox lock coordination for OpenCode で lock 解放漏れ・watcher 側 fail-closed も手当て済みと確認しました。

手元での追加検証です。

  • git diff --check origin/main...HEAD → clean
  • OpenCode / inbox lock focused suite → 276/276 PASS
    • tests/unit/test_build_system.bats
    • tests/unit/test_cli_adapter.bats
    • tests/unit/test_switch_cli.bats
    • tests/unit/test_send_wakeup.bats
    • tests/e2e/e2e_opencode_startup.bats
    • tests/test_inbox_write.bats
    • tests/agent_selfwatch.bats

ここまでの粘り強い対応、まことに感謝いたします。大きなPRで、しかも multi-agent-shogun の中核に触る難しい統合でしたが、OpenCode対応としてかなり実用に近いところまで持ってきていただきました。

差し支えなければ、このPRと検証の経緯を、私(yohey-w)側で Zenn 記事として紹介させてください。OpenCode対応そのものだけでなく、review → rebase → VPS smoke → lock競合懸念の解消まで含めて、OSSでAI agent基盤を育てる実例として価値が高いと感じています。

@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 19, 2026

OpenRouter credential を VPS root 環境に設定し、未完だった OpenRouter 実呼び出しも確認しました。

対象: VPS 実機(接続先非公開) / PR head 4aa3fa3

設定:

  • root環境の非公開envファイルに OPENROUTER_API_KEY を保存
  • file mode: 600
  • shell startup から読み込み

追加検証:

timeout 90s env OPENCODE_TUI_CONFIG=<opencode-tui-config> opencode run --agent shogun --model openrouter/openai/gpt-4o-mini "Reply exactly: OK_OPENROUTER_PERSISTED"

結果:

  • > shogun · openai/gpt-4o-mini
  • OK_OPENROUTER_PERSISTED
  • exit 0

これで VPS 上の OpenCode smoke は、無料 provider だけでなく OpenRouter provider 経由でも PASS です。

@ZenkakuHiragana
Copy link
Copy Markdown
Contributor Author

@yohey-w 殿

慌ただしくいろいろな修正を加えてしまいましたが、最新版の検証いただき感謝いたします。
記事化していただけることは大変光栄に思います!執筆頂けるのであれば、今からでも公開を楽しみにするところでございます。

私としても、初のOSS貢献ということで大変価値のある体験をさせて頂きました。
粘り強い対応、ありがとうございます。

@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 21, 2026

VPSで最新head 964bfd2 を再検証しました。

  • 追加修正: tests/unit/test_ntfy_ack.bats の失敗注入を UID 非依存に変更しました。VPSのroot実行では chmod 555 だけだと書き込み失敗を作れず、T-ACK-007 が誤って失敗していたためです。
  • git diff --check origin/main...HEAD: PASS
  • bats tests/unit/ --timing: 392/392 PASS
  • OpenCode E2E含む focused suite: 276/276 PASS
  • opencode run --agent smoke:
    • opencode/qwen3.6-plus-free + shogun: OK_SHOGUN_LATEST
    • opencode/qwen3.6-plus-free + ashigaru1: OK_ASHIGARU1_LATEST
    • openrouter/openai/gpt-4o-mini + shogun: OK_OPENROUTER_LATEST

補足: OpenRouter smokeはログインシェルで環境変数を読み込んだ状態でPASSしています。非ログインSSHシェルでは provider が読まれず失敗するため、VPS上の検証コマンドは bash -lc 相当で実行する必要があります。

OpenCode対応ありがとうございます。実運用側の組み込み検証としては、このheadでPASS扱いです。

@yohey-w yohey-w merged commit a55774b into yohey-w:main May 21, 2026
@yohey-w
Copy link
Copy Markdown
Owner

yohey-w commented May 21, 2026

@ZenkakuHiragana 殿

あらためて、OpenCode 対応 PR #118 へのご貢献、まことにありがとうございました。

本 PR の経緯、OpenCode 対応の意義、検証の流れ、そして OpenRouter 実験まで含めて、Zenn に記事化いたしました。

https://zenn.dev/shio_shoppaize/articles/shogun-opencode-v5-openrouter

初の OSS 貢献としてこの規模の統合を持ち込み、rebase、regression 修正、inbox lock の懸念解消まで粘り強く対応いただいたことに、心より感謝申し上げます。

multi-agent-shogun が OpenCode 勢にも開かれる大きな一歩になりました。超絶スペシャルサンクスでございます。

@ZenkakuHiragana
Copy link
Copy Markdown
Contributor Author

@yohey-w 殿

マージいただきありがとうございます!早速記事を読ませて頂きました!(大笑いしました)
わたしの名前が記事名にも大々的に出る構成で嬉しいやら恥ずかしいやら、という気持ちですが、記事執筆大変感謝いたします。

OpenRouter での検証もお疲れ様でした。当方ではそこまで深く検証していなかったので、追って検証頂けるのは安心感があります。

v5.0.0 として成果が反映されることに強い達成感があります。やって良かった、と思いました。
ここまで長い間、ご対応ありがとうございました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants