From 36ee744c7f3ba1f99928726dbafe31a078c464d4 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 11:53:58 +0900 Subject: [PATCH 1/3] dev: update markdownlint config --- .markdownlint-cli2.yaml | 3 --- .markdownlint.jsonc | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) delete mode 100644 .markdownlint-cli2.yaml create mode 100644 .markdownlint.jsonc diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml deleted file mode 100644 index 4e6106f..0000000 --- a/.markdownlint-cli2.yaml +++ /dev/null @@ -1,3 +0,0 @@ -config: - MD013: - code_blocks: false diff --git a/.markdownlint.jsonc b/.markdownlint.jsonc new file mode 100644 index 0000000..9accf7a --- /dev/null +++ b/.markdownlint.jsonc @@ -0,0 +1,14 @@ +{ + // Unordered list indentation + "MD007": { + "start_indented": true + }, + // Dollar signs used before commands without showing output + "MD013": false, + // Line Length + "MD014": false, + // Multiple headings with the same content + "MD024": false, + // First line in a file should be a top-level heading + "MD041": false +} From 36b92d86c0d0b59a5b16b68abca06d27f9836bbb Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 11:54:02 +0900 Subject: [PATCH 2/3] chore: lintfix --- .claude/skills/create-pr/SKILL.md | 6 +- .claude/skills/review-pr/SKILL.md | 86 +++++++++--------- CHANGELOG.md | 24 ++--- docs/dev/review-guideline.md | 146 +++++++++++++++--------------- 4 files changed, 130 insertions(+), 132 deletions(-) diff --git a/.claude/skills/create-pr/SKILL.md b/.claude/skills/create-pr/SKILL.md index 99a31c0..d9a46af 100644 --- a/.claude/skills/create-pr/SKILL.md +++ b/.claude/skills/create-pr/SKILL.md @@ -58,6 +58,6 @@ description: GitHub PR作成コマンド ## 注意事項 -- ベースブランチは通常 `develop` ですが、確認してください -- PR 本文には必ず PR-Agent のコマンドを含めてください -- 必要に応じて、複数のコミットに分けることも検討してください + - ベースブランチは通常 `develop` ですが、確認してください + - PR 本文には必ず PR-Agent のコマンドを含めてください + - 必要に応じて、複数のコミットに分けることも検討してください diff --git a/.claude/skills/review-pr/SKILL.md b/.claude/skills/review-pr/SKILL.md index bce4a8d..cf66101 100644 --- a/.claude/skills/review-pr/SKILL.md +++ b/.claude/skills/review-pr/SKILL.md @@ -10,7 +10,7 @@ Github MCP を用いて PR の内容を取得し、品質憲章や各種ガイ ## 必須引数 -- `$PR_URL`: Github Pull Request URL (例: ) + - `$PR_URL`: Github Pull Request URL (例: ) ## 動作フロー @@ -23,37 +23,37 @@ Github MCP を用いて PR の内容を取得し、品質憲章や各種ガイ ### 🔍 基本チェック項目 -- **命名規則の遵守** - - 変数・関数・クラス名が意図を明確に表現しているか + - **命名規則の遵守** + - 変数・関数・クラス名が意図を明確に表現しているか - - 日本語のローマ字変換を避けているか - -- **CLEANなコード** - - 凝集度(Cohesion)が高いか - - 疎結合(Loose Coupling)になっているか - - 適切にカプセル化されているか - - 抽象化のレベルが適切か - - 冗長性がないか(DRY原則) -- **関数・クラス設計** - - 単一責任の原則を守っているか - - 引数の数が適切か - - フラグ引数を使っていないか + - 日本語のローマ字変換を避けているか + + - **CLEANなコード** + - 凝集度(Cohesion)が高いか + - 疎結合(Loose Coupling)になっているか + - 適切にカプセル化されているか + - 抽象化のレベルが適切か + - 冗長性がないか(DRY原則) + - **関数・クラス設計** + - 単一責任の原則を守っているか + - 引数の数が適切か + - フラグ引数を使っていないか ### 📝 コメント・ドキュメント -- コメントよりコードで表現されているか -- 必要なコメントは背景・理由を説明しているか -- テーブル・カラムにコメントが記載されているか + - コメントよりコードで表現されているか + - 必要なコメントは背景・理由を説明しているか + - テーブル・カラムにコメントが記載されているか ### 🧪 テスト -- テストコードが追加・修正されているか -- F.I.R.S.Tなテストになっているか - - Fast(高速) - - Independent(独立) - - Repeatable(再現性) - - Self-Validating(自己検証) - - Timely(適時性) + - テストコードが追加・修正されているか + - F.I.R.S.Tなテストになっているか + - Fast(高速) + - Independent(独立) + - Repeatable(再現性) + - Self-Validating(自己検証) + - Timely(適時性) ## プロダクト構成とドキュメント @@ -61,16 +61,16 @@ PR の diff 箇所に合わせて、下記を参照してください。 ### 📋 ガイドライン -- **レビューガイドライン**: `docs/dev/review-guideline.md` + - **レビューガイドライン**: `docs/dev/review-guideline.md` ## レビューお作法 -- Github MCPを通じてレビューを行うこと -- `mcp__github__pull_request_review_write` で pending review を作成 -- `mcp__github__add_comment_to_pending_review` を用いてファイル、行指定で該当箇所にコメントを入れていくこと -- 一通りのコメントを終えたタイミングで、 `submit_pending_pull_request_review` を用いてレビュー送信すること -- すでにインラインでPR作成車によってコメントがされている箇所がある場合、そのコメントに対して反応すること -- いずれの場合も、「Claude Code によるコメント」である旨を明記すること + - Github MCPを通じてレビューを行うこと + - `mcp__github__pull_request_review_write` で pending review を作成 + - `mcp__github__add_comment_to_pending_review` を用いてファイル、行指定で該当箇所にコメントを入れていくこと + - 一通りのコメントを終えたタイミングで、 `submit_pending_pull_request_review` を用いてレビュー送信すること + - すでにインラインでPR作成車によってコメントがされている箇所がある場合、そのコメントに対して反応すること + - いずれの場合も、「Claude Code によるコメント」である旨を明記すること ### `submit_pending_pull_request_review` 時のテンプレート @@ -94,10 +94,10 @@ PR の diff 箇所に合わせて、下記を参照してください。 ## エラーハンドリング -- **PR が存在しない場合**: エラーメッセージを表示し、PR番号の確認を促す -- **アクセス権限がない場合**: 権限設定の確認を促す -- **ネットワークエラー**: リトライまたは手動でのレビューを促す -- **差分が大きすぎる場合**: 重要な変更に絞ってレビューを実施 + - **PR が存在しない場合**: エラーメッセージを表示し、PR番号の確認を促す + - **アクセス権限がない場合**: 権限設定の確認を促す + - **ネットワークエラー**: リトライまたは手動でのレビューを促す + - **差分が大きすぎる場合**: 重要な変更に絞ってレビューを実施 ## 使用例 @@ -107,13 +107,13 @@ PR の diff 箇所に合わせて、下記を参照してください。 /review:review-pr https://github.com/offich/sangria/pull/10 ``` -- PRの変更内容を取得 -- コーディングガイドラインに基づいてレビュー -- 改善点をGitHubにコメント投稿 + - PRの変更内容を取得 + - コーディングガイドラインに基づいてレビュー + - 改善点をGitHubにコメント投稿 ## 注意事項 -- レビューは自動生成の提案であり、最終的な判断は人間が行うこと -- ビジネスロジックの妥当性は判断できないため、技術的な観点のみレビュー -- 大規模なPRの場合、重要度の高い指摘に絞ってコメント -- 既存コードのスタイルに合わせることを優先 + - レビューは自動生成の提案であり、最終的な判断は人間が行うこと + - ビジネスロジックの妥当性は判断できないため、技術的な観点のみレビュー + - 大規模なPRの場合、重要度の高い指摘に絞ってコメント + - 既存コードのスタイルに合わせることを優先 diff --git a/CHANGELOG.md b/CHANGELOG.md index fe8a68f..dc0a5db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,36 +2,36 @@ ## 0.3.0 -* Add the following lint: - * `use_widget_ref_synchronously` + * Add the following lint: + * `use_widget_ref_synchronously` ## 0.2.0 -* Added the following lint: - * `no_disabled_tests` + * Added the following lint: + * `no_disabled_tests` ## 0.1.0 -* Added the following lint: - * `avoid_empty_container` + * Added the following lint: + * `avoid_empty_container` ## 0.0.3 -* Publish with example directory included. + * Publish with example directory included. ## 0.0.2 -* Improve score on pub.dev -* Fix automatic deployment by GitHub Actions + * Improve score on pub.dev + * Fix automatic deployment by GitHub Actions ## 0.0.1 -* Modify README.md + * Modify README.md ## 0.0.1-dev.2 -* Downgraded required dart sdk version to 3.6.2. + * Downgraded required dart sdk version to 3.6.2. ## 0.0.1-dev.1 -* Initial release. This package is under construction. + * Initial release. This package is under construction. diff --git a/docs/dev/review-guideline.md b/docs/dev/review-guideline.md index c79a59c..d6cd34e 100644 --- a/docs/dev/review-guideline.md +++ b/docs/dev/review-guideline.md @@ -2,11 +2,11 @@ DevTools Extension のコードをレビューし、以下の観点で指摘してください。 -- `Effective Dart のベストプラクティス遵守` -- `バグやクラッシュにつながる可能性` -- `VM Service / DTD との通信パターンの正確性` -- `非同期処理の危険パターン` -- `アイソレート変化・ホットリロードへの対応` + - `Effective Dart のベストプラクティス遵守` + - `バグやクラッシュにつながる可能性` + - `VM Service / DTD との通信パターンの正確性` + - `非同期処理の危険パターン` + - `アイソレート変化・ホットリロードへの対応` 特に **致命的バグパターン** の検出を最優先設定。DevTools 内でクラッシュ・フリーズ・データ化け・メモリリークを引き起こす可能性のある問題を重点的にチェックしてください。 @@ -14,11 +14,11 @@ DevTools Extension のコードをレビューし、以下の観点で指摘し DevTools Extension は Flutter **Web** アプリとして iFrame 内で動作し、通常の Flutter アプリとは異なる制約があります。 -- **通信はすべて非同期 RPC**: Extension ↔ DevTools ↔ VM Service ↔ 対象アプリ -- **ファイルシステムへの直接アクセス不可**: 必ず DTD (Dart Tooling Daemon) 経由 -- **アイソレートはホットリロードで変わる**: リスナーが古いアイソレートを参照し続けると不具合 -- **iFrame サンドボックス**: `postMessage` 以外の親ウィンドウへのアクセスは不可 -- **`requiresConnection`** が `true`(デフォルト)のとき、未接続状態で Extension は無効化される + - **通信はすべて非同期 RPC**: Extension ↔ DevTools ↔ VM Service ↔ 対象アプリ + - **ファイルシステムへの直接アクセス不可**: 必ず DTD (Dart Tooling Daemon) 経由 + - **アイソレートはホットリロードで変わる**: リスナーが古いアイソレートを参照し続けると不具合 + - **iFrame サンドボックス**: `postMessage` 以外の親ウィンドウへのアクセスは不可 + - **`requiresConnection`** が `true`(デフォルト)のとき、未接続状態で Extension は無効化される --- @@ -26,72 +26,70 @@ DevTools Extension は Flutter **Web** アプリとして iFrame 内で動作し ### VM Service / DTD 通信 -- [ ] **サービス呼び出しのエラーハンドリング** - - [ ] `serviceManager.callServiceExtension()` に - `try-catch` / `.catchError()` があるか - - [ ] 切断中・未接続時に呼び出しが発生しないよう `isServiceAvailable` を確認しているか - - [ ] タイムアウトが設定されており、長時間ブロックしないか -- [ ] **サービス拡張のレスポンス** - - [ ] ハンドラが必ず `ServiceExtensionResponse.result()` または `.error()` を返すか - - [ ] Future が複数回完了する(ホットリスタート時の二重完了)パターンがないか - - [ ] パラメータの JSON デコードで例外が起きてもクラッシュしないか -- [ ] **DTD 利用** - - [ ] `dtdManager` が利用不可の場合に適切にフォールバックしているか - - [ ] ファイル操作が DTD 経由になっているか(直接 `dart:io` は使えない) + - [ ] **サービス呼び出しのエラーハンドリング** + - [ ] `serviceManager.callServiceExtension()` に `try-catch` / `.catchError()` があるか + - [ ] 切断中・未接続時に呼び出しが発生しないよう `isServiceAvailable` を確認しているか + - [ ] タイムアウトが設定されており、長時間ブロックしないか + - [ ] **サービス拡張のレスポンス** + - [ ] ハンドラが必ず `ServiceExtensionResponse.result()` または `.error()` を返すか + - [ ] Future が複数回完了する(ホットリスタート時の二重完了)パターンがないか + - [ ] パラメータの JSON デコードで例外が起きてもクラッシュしないか + - [ ] **DTD 利用** + - [ ] `dtdManager` が利用不可の場合に適切にフォールバックしているか + - [ ] ファイル操作が DTD 経由になっているか(直接 `dart:io` は使えない) ### アイソレート変化・ホットリロード -- [ ] **古いアイソレート参照** - - [ ] アイソレート変化時にリスナーを再登録しているか - - [ ] `selectedIsolate` の変化を `addListener` で監視し、処理を切り替えているか -- [ ] **ストリームの再購読** - - [ ] ホットリロード後にストリームが無効化されていないか - - [ ] `initState` で購読し `dispose` でキャンセルしているか + - [ ] **古いアイソレート参照** + - [ ] アイソレート変化時にリスナーを再登録しているか + - [ ] `selectedIsolate` の変化を `addListener` で監視し、処理を切り替えているか + - [ ] **ストリームの再購読** + - [ ] ホットリロード後にストリームが無効化されていないか + - [ ] `initState` で購読し `dispose` でキャンセルしているか ### リスナー・サブスクリプションのリーク -- [ ] **dispose 漏れ** - - [ ] `serviceManager` / `extensionManager` / `dtdManager` - へのリスナーが `dispose()` でキャンセルされているか - - [ ] `StreamSubscription` が未キャンセルで放置されていないか - - [ ] タイマー・ポーリングが Extension タブを閉じると停止するか + - [ ] **dispose 漏れ** + - [ ] `serviceManager` / `extensionManager` / `dtdManager` へのリスナーが `dispose()` でキャンセルされているか + - [ ] `StreamSubscription` が未キャンセルで放置されていないか + - [ ] タイマー・ポーリングが Extension タブを閉じると停止するか ### 接続状態管理 -- [ ] **未接続時の動作** - - [ ] `requiresConnection: true` の場合、未接続でサービス呼び出しを行っていないか - - [ ] 接続・切断イベントで UI 状態が正しく更新されるか -- [ ] **非同期処理中の切断** - - [ ] 長時間の処理中に切断が発生した場合にハンドリングされているか + - [ ] **未接続時の動作** + - [ ] `requiresConnection: true` の場合、未接続でサービス呼び出しを行っていないか + - [ ] 接続・切断イベントで UI 状態が正しく更新されるか + - [ ] **非同期処理中の切断** + - [ ] 長時間の処理中に切断が発生した場合にハンドリングされているか ### 非同期処理の一般的な危険パターン -- [ ] **unawaited Future** - - [ ] `initState` や `afterBuild` で `await` 漏れがないか - - [ ] 例外がサイレントに握りつぶされていないか -- [ ] **並行処理の管理** - - [ ] 複数の `callServiceExtension` を直列で呼ぶ必要があるとき、順序保証されているか - - [ ] `Future.wait` で一件失敗時に残りの処理が中断されないか + - [ ] **unawaited Future** + - [ ] `initState` や `afterBuild` で `await` 漏れがないか + - [ ] 例外がサイレントに握りつぶされていないか + - [ ] **並行処理の管理** + - [ ] 複数の `callServiceExtension` を直列で呼ぶ必要があるとき、順序保証されているか + - [ ] `Future.wait` で一件失敗時に残りの処理が中断されないか --- ### 一般的なコード品質 -- [ ] 可読性・保守性 -- [ ] 設計原理の遵守 -- [ ] **null 安全・型安全** - - [ ] サービスレスポンスの JSON パースで null クラッシュがないか - - [ ] `serviceManager` / `dtdManager` が null のまま使われていないか -- [ ] テスト可能性 -- [ ] セキュリティ(サービス拡張のパラメータバリデーション) + - [ ] 可読性・保守性 + - [ ] 設計原理の遵守 + - [ ] **null 安全・型安全** + - [ ] サービスレスポンスの JSON パースで null クラッシュがないか + - [ ] `serviceManager` / `dtdManager` が null のまま使われていないか + - [ ] テスト可能性 + - [ ] セキュリティ(サービス拡張のパラメータバリデーション) ### プロジェクト固有 -- [ ] 命名規則の統一 - - [ ] サービス拡張のメソッド名が `ext..` 形式か -- [ ] `config.yaml` に必須フィールド(`name`, `version`, `issueTracker`, `materialIconCodePoint`)があるか -- [ ] `DevToolsExtension` ウィジェットがルートに配置されているか -- [ ] 既存コードの整合性 + - [ ] 命名規則の統一 + - [ ] サービス拡張のメソッド名が `ext..` 形式か + - [ ] `config.yaml` に必須フィールド(`name`, `version`, `issueTracker`, `materialIconCodePoint`)があるか + - [ ] `DevToolsExtension` ウィジェットがルートに配置されているか + - [ ] 既存コードの整合性 --- @@ -99,30 +97,30 @@ DevTools Extension は Flutter **Web** アプリとして iFrame 内で動作し ### 1. **致命的問題の指摘** -- クラッシュ・フリーズ・メモリリークの可能性 -- VM Service / DTD の不正な使用 -- データ損失リスク(アイソレート変化時の状態喪失など) -- セキュリティ上の問題 + - クラッシュ・フリーズ・メモリリークの可能性 + - VM Service / DTD の不正な使用 + - データ損失リスク(アイソレート変化時の状態喪失など) + - セキュリティ上の問題 ### 2. **致命的バグ・クラッシュの検出パターン** -- **dispose 漏れ**: タブを閉じてもリスナーが残り続けメモリを消費 -- **二重完了 Future**: ホットリスタートでハンドラが二度呼ばれ例外 -- **古いアイソレート参照**: ホットリロード後に無効なアイソレートへアクセス -- **切断中のサービス呼び出し**: 切断後に `callServiceExtension` してクラッシュ -- **unawaited Future**: 例外が握りつぶされてサイレント失敗 -- **JSON パースクラッシュ**: 不正なパラメータで `jsonDecode` が例外 + - **dispose 漏れ**: タブを閉じてもリスナーが残り続けメモリを消費 + - **二重完了 Future**: ホットリスタートでハンドラが二度呼ばれ例外 + - **古いアイソレート参照**: ホットリロード後に無効なアイソレートへアクセス + - **切断中のサービス呼び出し**: 切断後に `callServiceExtension` してクラッシュ + - **unawaited Future**: 例外が握りつぶされてサイレント失敗 + - **JSON パースクラッシュ**: 不正なパラメータで `jsonDecode` が例外 ### 3. **改善提案** -- より堅牢な実装方法 -- 適切な例外処理パターン -- エラー回復戦略の提案 + - より堅牢な実装方法 + - 適切な例外処理パターン + - エラー回復戦略の提案 ### 4. **具体的修正コード例** -- 修正前後のコード比較 -- 推奨実装パターン + - 修正前後のコード比較 + - 推奨実装パターン --- @@ -245,6 +243,6 @@ Future handler(String method, Map para ## オプション -- `--pre-commit` : コミット前チェックモード(より厳密なレビュー) -- `--focus=performance` : 特定の観点に絞ったレビュー -- `--japanese` : 日本語でのレビュー結果出力 + - `--pre-commit` : コミット前チェックモード(より厳密なレビュー) + - `--focus=performance` : 特定の観点に絞ったレビュー + - `--japanese` : 日本語でのレビュー結果出力 From 70fef6f7888563c0ae7dfa04cb577633c5298ef1 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 12:44:38 +0900 Subject: [PATCH 3/3] fix: fix cache path --- .github/workflows/docs-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs-analysis.yml b/.github/workflows/docs-analysis.yml index cbea7d0..6fc5481 100644 --- a/.github/workflows/docs-analysis.yml +++ b/.github/workflows/docs-analysis.yml @@ -40,7 +40,7 @@ jobs: - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 id: pnpm-cache with: - path: ${{ steps.pnpm-store.outputs.path }} + path: './node_modules' key: pnpm-${{ hashFiles('pnpm-lock.yaml') }} - name: install dependencies