Skip to content

docs: CLAUDE.md facts from replor, and fix man hanging without a terminal - #373

Merged
halkn merged 3 commits into
mainfrom
docs/claude-md-env-facts
Oct 14, 2026
Merged

halkn merged 3 commits into
mainfrom
docs/claude-md-env-facts

Conversation

@halkn

@halkn halkn commented Oct 14, 2026

Copy link
Copy Markdown
Owner

変更理由

Closes #369

  • replor の P0 で得た環境の事実を CLAUDE.md に追記するか検討する #369: replor の作業で得た事実のうち、複数のリポジトリで判断を変えるものだけを claude/CLAUDE.md に反映する。候補 A〜F の扱いは次のとおり(判断基準は docs/claude-code.md の「CLAUDE.md の基準」)
    • E(仕様に由来する表・定数は一次資料から取る)・F(開発ツールは言語の標準に合わせる): 追記した
    • A(手元は macOS だけ): ローカル固有の事情なので書かない
    • B(Bash は zsh): システムプロンプトが既に示しているので書かない
    • C(pty を開けない): openpty: Operation not permitted でその場で失敗し、TUI を手で確かめる流れは「報告」節で足りるので書かない
    • D(global の git 設定がテスト用のリポジトリにも効く): 大半は拒否のメッセージで気付け、隔離は各リポジトリのテストの helper が持つものなので書かない
  • AGENTS.md: 「ツールが無ければ先に mise install」が、claude/CLAUDE.md の「依存の取得(mise install など)も ! で頼む」と食い違っていた
  • MANPAGER: agent の Bash で man git が 120 秒のタイムアウトまで戻らなかった
    • 症状: tty の無い場所で man を実行すると止まる
    • 原因: .zshrc が MANPAGER='nvim +Man!' を設定し、Claude Code の shell snapshot がそれを引き継ぐ。macOS の /usr/bin/man はシェルスクリプトで、stdout が端末でなくても eval "… | $MANPAGER" で pager に流す。nvim は来ない UI を待ち続ける。ユーザーのターミナルでの man ls | rg … も同じ経路を通る

変更内容

  • docs: add cross-repo facts from replor to CLAUDE.md. — 「開発」に F、「仕様の確認」に E を 1 行ずつ追加
  • docs: ask the user to run mise install in AGENTS.md. — mise install はユーザーに頼む形に揃えた
  • fix: fall back to cat when man output is not a terminal. — MANPAGER を、stdout が端末のときだけ nvim を起動し、それ以外は cat に流す形にした

影響範囲

対象: claude / zsh

  • claude/CLAUDE.md は全プロジェクトの Claude Code のセッションに効く
  • MANPAGER の変更は、新しく起動する zsh と、次の Claude Code のセッションから効く。端末で man を開いたときの挙動(nvim で開く)は変わらない
  • 権限・sandbox・hook は変えていない

レビューの着目点

  • F の理由(「clone した人と CI が言語の手順だけで再現できるように」)が、方針の意図と合っているか
  • MANPAGER の値は、macOS の man が eval で展開する前提で sh -c "…" にしている。MANPAGER をシェルを通さずに単語分割して実行するプログラムでは動かない。このリポジトリの環境で MANPAGER を読むのは /usr/bin/man だけと見ている
  • CLAUDECODE で agent のセッションだけ外す案は採らなかった。ユーザーのターミナルでのパイプも同じ原因で壊れるため

確認手順

macOS(Darwin 25.6.0)、Claude Code 2.1.296 の Bash(sandbox 内、stdout は端末でない)で実行した。

$ MANPAGER='sh -c "echo PAGER_CALLED; cat >/dev/null"' man ls | head -3
PAGER_CALLED

stdout がパイプでも man は MANPAGER を呼ぶ。

$ MANPAGER='sh -c "if [ -t 1 ]; then exec nvim +Man!; else exec cat; fi"' man ls | head -4
LS(1)                       General Commands Manual                      LS(1)

NNAAMMEE
     llss – list directory contents

変更後の値では、すぐに本文が返る(終了コード 0)。値は .zshrc の nvim の節を zsh で source して取り出したもの。

$ mise run lint
(グリーン)

手動確認

sandbox では pty を開けないため、端末での挙動は確認していない。

  1. 新しいターミナルを開き、echo $MANPAGER が sh -c "if [ -t 1 ]; then exec nvim +Man!; else exec cat; fi" になっていることを確かめる
  2. man ls を実行し、これまでどおり nvim で開くことを確かめる
  3. man ls | head -3 を実行し、止まらずに先頭の 3 行が出ることを確かめる

範囲外 / 既知の問題

@halkn
halkn merged commit 1aeb984 into main Oct 14, 2026
1 check passed
@halkn
halkn deleted the docs/claude-md-env-facts branch October 14, 2026 14:24
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.

replor の P0 で得た環境の事実を CLAUDE.md に追記するか検討する

1 participant