wish-ssh-code-review について
wish-ssh-code-reviewは、Wishで構築されたGoアプリ向けのコードレビュー用スキルです。サーバー設定、ミドルウェア、セッション処理、ターミナルUIをコード上の根拠に基づいて確認します。
主な機能
- 01順序付きのレビューゲート
- 02Wishサーバーの入口確認
- 03ホストキーとミドルウェアのレビュー
- 04セッションとPTY処理の確認
- 05ソース位置を示す指摘形式
活用シーン
- 01Wishサーバー初期化のレビュー
- 02ミドルウェア順序とホストキー設定の確認
- 03セッション状態とグレースフルシャットダウンの評価
- 04ターミナルUIのPTYサイズ処理の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ existential-birds/ beagle --skill wish-ssh-code-reviewインストール後、Claude Code で/wish-ssh-code-reviewを入力して読み込まれたか確認します。
同梱ファイルreferences/server.mdreferences/sessions.md
詳細
Wish SSH コードレビュー
クイックリファレンス
| 問題の種類 | リファレンス |
|---|---|
| サーバーのセットアップ、ミドルウェア | references/server.md |
| セッションの処理、セキュリティ | references/sessions.md |
レビューゲート
レビューを文書で作成する際は、以下を順番に実行してください。レビュー対象のコードについて、現在のステップの 合格条件 を満たすまでは、後続のステップで不具合を指摘しないでください。
- Wish のエントリーポイントを特定する — 合格条件: サーバーの各サーフェスについて、
wish.NewServer、wish.WithMiddleware、bubbletea.Middlewareの登録、またはトップレベルのssh.Handlerチェーンの定義を行っているリポジトリ内のパスを少なくとも1つ特定していること(パスを明示的に列挙してください)。 - サーバーセットアップの根拠を記録する — 合格条件: ステップ1で特定した各パスについて、実際の
wish.WithHostKey*/ホストキー設定と、ソースに記載されたミドルウェアの全リストを記載順に記録していること(記憶に頼らないでください)。グレースフルシャットダウンが実装されている場合は、ListenAndServeとShutdownを実行するファイルを記録してください。 - セッション/TUI の根拠を記録する — 合格条件: 各
teaHandler(または同等のもの)について、ウィンドウサイズを使用する前にソースでs.Pty()がチェックされているか、また Lipgloss のスタイルが適用される箇所でセッションごとのレンダラー(bubbletea.MakeRenderer)が使用されているかを記録していること。 - 指摘事項を記述する — 合格条件: 各指摘事項が
[FILE:LINE] ISSUE_TITLEの形式で記載され(必要に応じて行の範囲も指定できます)、クイックリファレンスの該当する行(またはreferences/内の対応するセクション)を示していること。
レビューチェックリスト
レビューゲートと併用してください。文書でレビューする場合は、各項目を引用元のソースに結び付けられるよう、まずゲートを完了してください。
- ホストキーがファイルから読み込まれている、または安全に生成されている
- ミドルウェアの順序が適切(最初にロギング、早い段階で認証)
- セッションコンテキストが接続ごとの状態に使用されている
- グレースフルシャットダウンでアクティブなセッションが処理される
- ターミナルアプリで PTY リクエストが処理される
- 接続数の上限によってリソース枯渇を防止している
- タイムアウトミドルウェアによって接続のハングを防止している
- BubbleTea ミドルウェアが正しく設定されている
重要なパターン
サーバーのセットアップ
// GOOD - complete server setup
s, err := wish.NewServer(
wish.WithAddress(fmt.Sprintf("%s:%d", host, port)),
wish.WithHostKeyPath(".ssh/id_ed25519"),
wish.WithMiddleware(
logging.Middleware(), // first: log all connections
activeterm.Middleware(), // handle terminal sizing
bubbletea.Middleware(teaHandler),
),
)
if err != nil {
return fmt.Errorf("creating server: %w", err)
}
グレースフルシャットダウン
// BAD - abrupt shutdown
log.Fatal(s.ListenAndServe())
// GOOD - graceful shutdown
done := make(chan os.Signal, 1)
signal.Notify(done, os.Interrupt, syscall.SIGTERM)
go func() {
if err := s.ListenAndServe(); err != nil && !errors.Is(err, ssh.ErrServerClosed) {
log.Error("server error", "error", err)
}
}()
<-done
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := s.Shutdown(ctx); err != nil {
log.Error("shutdown error", "error", err)
}
BubbleTea ハンドラー
func teaHandler(s ssh.Session) (tea.Model, []tea.ProgramOption) {
pty, _, _ := s.Pty()
model := NewModel(pty.Window.Width, pty.Window.Height)
return model, []tea.ProgramOption{
tea.WithAltScreen(),
tea.WithMouseCellMotion(),
}
}
リファレンスを読み込むタイミング
- サーバーの初期化をレビューする場合 → server.md
- 認証やセッション状態をレビューする場合 → sessions.md
レビューの質問
- ホストキーは安全に処理されていますか?
- ミドルウェアの順序は適切ですか?
- グレースフルシャットダウンは実装されていますか?
- PTY のウィンドウサイズは TUI に渡されていますか?
- 接続タイムアウトは設定されていますか?
コメント
Markdown 対応