بنقرة واحدة
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 で呼ぶ)