ワンクリックで
pj-checklist
fude.nvim プロジェクト固有の実装・レビューチェックリスト。Lua/Neovim パターン、非同期処理、state 管理の注意点。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
fude.nvim プロジェクト固有の実装・レビューチェックリスト。Lua/Neovim パターン、非同期処理、state 管理の注意点。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
fude.nvim のローカルレビューセッションを監視し、新しいレビューコメントに自動で応答する。人間が Neovim でコメントを書くと、このセッションが検知してコード修正や返信を JSONL に追記する。「レビュー待受して」「fude watch して」等で起動する。
ハーネス点検ワークフロー。直近 PR レビューから pj-checklist の発火率と review-lessons.md の健全性を評価し、harness の改善案をユーザーに提示する。
PR レビューコメントへの対応ワークフロー。レビュー指摘の分析、コード修正、セルフレビュー、動作確認後の返信・push までを一貫して行う。
開発ワークフロー。計画から実装、テスト、ドキュメント、セルフレビュー、PR作成までを一貫して行う。
コミット分割、コミット実行、draft PR 作成を行う。
3ラウンドのセルフレビュー。プロジェクト固有チェックリスト(2ラウンド)と /review 汎用レビュー(1ラウンド)で変更品質を検証する。
| name | pj-checklist |
| description | fude.nvim プロジェクト固有の実装・レビューチェックリスト。Lua/Neovim パターン、非同期処理、state 管理の注意点。 |
このスキルは /self-review から読み込まれ、fude.nvim 固有のチェック項目を提供する。
/develop Phase 3(実装)や /self-review のラウンド1〜2(レビュー)で参照される。
コードを実装する際に確認すべきプロジェクト固有のパターン:
vim.system() コールバック + vim.schedule() で安全な UI 更新を行うconfig.state に集約する。新フィールド追加時は reset_state() での初期化も忘れないことbuild_*, find_*, parse_*, format_*, should_*, make_*, calculate_* として抽出する"fude" を使用する| 交替なし、エスケープは \ ではなく %(例: %. %()、文字クラスは %d %a %w 等。量指定子は *(0 回以上) +(1 回以上) -(0 回以上・最短一致)のみで、? は量指定子ではなくリテラル ? を表す。CRLF 行末は text = text:gsub("\r\n", "\n") で \r\n を \n に正規化し、必要に応じて text = text:gsub("\r", "\n") で単独 \r も処理する等の段階的な変換で扱うstring.gsub、string.find 等は複数の値を返す。戻り値として1つだけ必要な場合は括弧で囲む: return (str:gsub(...)) — 括弧なしだと2番目以降の値(置換回数等)が呼び出し元に漏れるconfig.opts の該当設定を参照するvim.o.eventignore や vim.o.diffopt 等のグローバルオプションを一時変更する場合、pcall で囲んで必ず復元する:
local saved = vim.o.eventignore
vim.o.eventignore = "all"
local ok, err = pcall(function() ... end)
vim.o.eventignore = saved
if not ok then error(err) end
state.pending_review_id = nil と state.pending_comments = {})。cleanup/stop 時だけでなく通常の操作フロー中でも不整合が起きうるWinClosed は対象ウィンドウIDを pattern で指定する。複数IDは pattern = { tostring(win1), tostring(win2) } のテーブル形式を推奨。固定名 augroup + clear = true は既存ハンドラを消すため、ウィンドウIDを含むユニーク名にするreset_state() は state テーブルを丸ごと差し替えるため、旧テーブルに格納された handle への参照が失われリークする。stop() で明示的に停止してから reset_state() を呼ぶ順序になっているか確認する
start_reload_timer() が既存 timer を未停止で新規作成 → リーク。reset_state() が timer の stop()/close() をしない → リーク計画・実装時に検討すべきエッジケース:
config.state を読み書きする場合、発火時にセッションが同一であることを保証する。手順:
vim.system callback, vim.schedule, timer callback)を列挙するstop() → reset_state() が呼ばれている可能性を検討するlocal captured_state = config.state を取得し、コールバック内で if config.state ~= captured_state then return end で打ち切るreloading 等)がないか確認する。旧 state テーブルのフラグは不要だが、config.state のフラグは解放が必要reload() でセッション不一致 early return → reloading が永続的に true のまま残ったnvim_open_win に渡す前にクランプが必要か検討するdiff を以下の観点で確認する。過去のPRレビュー56件の分析に基づく頻出指摘パターン:
@param/@return 等)と実装シグネチャが一致しているか(引数追加・型変更・削除が LuaDoc にも反映されているか)doc/fude.txt, README.md, CLAUDE.md, CONTRIBUTING.md の 4 ファイルに対し grep し、説明の追従・削除漏れがないか確認したかopen_comment_input / open_edit_window / open_reply_window / comment_browser 等)を Grep で列挙して各実装に存在するか確認したか。並行する複数実装はドリフトしやすい% エスケープか、文字クラスが十分か)string.gsub 等の多値返却が意図せず漏れていないか(括弧で囲む)pairs() でテーブルを走査して順序が意味を持つ配列を生成していないか(表示用データ・テスト出力は vim.tbl_keys + table.sort + ipairs を使う)repo_root 等)を helper 経由で再取得していないか(引数を取る低レベル関数 diff.make_relative 等を直接呼ぶ)drafts.json 等の永続化ファイル)を楽観的に更新/削除していないか(失敗時のロールバック有無)。「先に削除→ API 待ち」は危険、「API 成功後に削除」が正解eventignore 等)の一時変更が pcall で保護されているかvim.api.nvim_get_current_buf() ではなく ev.buf で対象バッファを明示しているか(vim.schedule 越しでも誤バッファ適用を防ぐ)reloading, opening 等の排他制御フラグ)vim.notify 等を Grep 確認)tonumber() 等)が必要な箇所にあるかconfig.format_path 等)の戻り値を pcall + type チェックで保護し、元の値にフォールバックしているかpcall 保護をしているか(コールバック発火時に閉じられている可能性)vim.trim 等で意図しない差分を生まないか(読み込み→保存の往復で同一になるか)gh pr view / gh pr edit 呼出で detached HEAD 対策を適用しているか(ブランチ推論を避け、PR 番号を事前解決して渡す)first: N / --limit N 等の上限値を指定する際、想定する最大件数(コメント数 100+ 等)を超えないか、超えた場合の取りこぼし対策があるか確認したかoutdated.show=false、auto_reload.enabled=false 等)、関連する重い処理(GraphQL 呼出、データ取得、タイマー起動等)もスキップされているか確認したかvim.api.nvim_get_current_buf() に依存する副作用(extmark 再描画等)を直接呼んでいないか。close 前に走るパスでは vim.schedule() で遅延させ、フォーカスが元バッファへ戻った後に走らせるdrafts.json 等)からロードした値は、ソース(getter/loader)で型を検証してから返しているか。JSON として妥当でもフィールド型が想定外(body が数値、混在型等)になり得るため、外部入力として扱い、不正な型は安全側(nil 返却 / スキップ)に倒すvim.wait(timeout, function() return invoked end) で condition 不成立を検出する)vim.cmd("edit ...") 等の架空バッファを作っていないか(helpers.mock(vim, "cmd", capture_fn) でコマンド文字列をキャプチャする)vim.schedule 経由のモックコールバックを helpers.wait_for で待つテストで、CI 負荷下でも安定するタイムアウトを使っているか(helpers.wait_for のデフォルト 5000ms をそのまま使う。短時間で失敗させたい「呼ばれない」検証は vim.wait を直接 50-100ms で呼ぶ)