mcpField
W
wish-ssh-code-review

wish-ssh-code-review

github.com/existential-birdsテスト・品質85114 回インストール11 週間前に更新
リポジトリ

wish-ssh-code-review について

wish-ssh-code-reviewは、Wishで構築されたGoアプリ向けのコードレビュー用スキルです。サーバー設定、ミドルウェア、セッション処理、ターミナルUIをコード上の根拠に基づいて確認します。

主な機能

  1. 01順序付きのレビューゲート
  2. 02Wishサーバーの入口確認
  3. 03ホストキーとミドルウェアのレビュー
  4. 04セッションとPTY処理の確認
  5. 05ソース位置を示す指摘形式

活用シーン

  1. 01Wishサーバー初期化のレビュー
  2. 02ミドルウェア順序とホストキー設定の確認
  3. 03セッション状態とグレースフルシャットダウンの評価
  4. 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

レビューゲート

レビューを文書で作成する際は、以下を順番に実行してください。レビュー対象のコードについて、現在のステップの 合格条件 を満たすまでは、後続のステップで不具合を指摘しないでください。

  1. Wish のエントリーポイントを特定する — 合格条件: サーバーの各サーフェスについて、wish.NewServer、wish.WithMiddleware、bubbletea.Middleware の登録、またはトップレベルの ssh.Handler チェーンの定義を行っているリポジトリ内のパスを少なくとも1つ特定していること(パスを明示的に列挙してください)。
  2. サーバーセットアップの根拠を記録する — 合格条件: ステップ1で特定した各パスについて、実際の wish.WithHostKey*/ホストキー設定と、ソースに記載されたミドルウェアの全リストを記載順に記録していること(記憶に頼らないでください)。グレースフルシャットダウンが実装されている場合は、ListenAndServe と Shutdown を実行するファイルを記録してください。
  3. セッション/TUI の根拠を記録する — 合格条件: 各 teaHandler(または同等のもの)について、ウィンドウサイズを使用する前にソースで s.Pty() がチェックされているか、また Lipgloss のスタイルが適用される箇所でセッションごとのレンダラー(bubbletea.MakeRenderer)が使用されているかを記録していること。
  4. 指摘事項を記述する — 合格条件: 各指摘事項が [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

レビューの質問

  1. ホストキーは安全に処理されていますか?
  2. ミドルウェアの順序は適切ですか?
  3. グレースフルシャットダウンは実装されていますか?
  4. PTY のウィンドウサイズは TUI に渡されていますか?
  5. 接続タイムアウトは設定されていますか?

コメント