From b9264e04184506629e8555dae9d2b673049e7185 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 09:41:42 +0900 Subject: [PATCH 01/19] feat: add CLAUDE.md --- CLAUDE.md | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..d9ccaf7 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,70 @@ +# CLAUDE.md + +このファイルは、リポジトリ内のコードを扱う際に Claude Code (claude.ai/code) へ提供するガイダンスです。 + +## このリポジトリについて + +**Sangria Lints** は Dart/Flutter 向けのカスタム Lint ルールプロバイダーパッケージ(`custom_lint_builder` 使用)です。ユーザーが自分のプロジェクトの `analysis_options.yaml` に追加して使用する Lint ルールを定義しています。Flutter アプリではないため、UI・状態管理・ルーティングは存在しません。 + +## よく使うコマンド + +```bash +# 依存関係のインストール +flutter pub get + +# フォーマットチェック +dart format --set-exit-if-changed lib test + +# 静的解析 +flutter analyze lib test + +# example アプリに対してカスタム Lint を実行 +cd example && dart run custom_lint +``` + +> `test/sangria_test.dart` はプレースホルダー(`void main() {}`)です。Lint ルールの動作確認は `example/` ディレクトリで `dart run custom_lint` を実行することで行います。 + +## アーキテクチャ + +### プラグインのエントリーポイント + +`lib/sangria_lints.dart` が `custom_lint_builder` の `PluginBase` を実装しており、`getLintRules(CustomLintConfigs)` で有効な Lint ルールの一覧を返します。 + +### Lint ルールの構造 + +各ルールは `lib/src/rules/` 以下のサブディレクトリに配置され、共通のパターンに従います。 + +``` +lib/src/rules// +├── _lint_rule.dart # DartLintRule を継承 — メタデータの定義とビジターの登録 +└── _visitor.dart # AST ビジターを継承 — 違反の検出とエラーの報告 +``` + +ルールによっては共通処理をまとめた `_util.dart` も存在します。 + +**ルールクラスの責務:** +- `LintCode`(ルール名・問題メッセージ・重大度)の宣言 +- `run()` の実装で `context.registry` にビジターを登録 + +**ビジタークラスの責務:** +- 適切な AST ビジター(例: `RecursiveAstVisitor`)を継承 +- AST を走査して問題のあるパターンを検出 +- `ErrorReporter.atNode(...)` を呼んで診断結果を報告 + +### example アプリ + +`example/` はルール違反のサンプルを示すスタンドアロンの Flutter アプリです。新しいルールを作成した際は、ここにサンプルファイルを追加して動作確認します。 + +## 新しい Lint ルールの追加手順 + +1. `lib/src/rules//` にルールクラスとビジタークラスを作成する。 +2. `lib/sangria_lints.dart` でルールをエクスポートし、`getLintRules` の返り値に追加する。 +3. `example/lib/` に違反例を示すファイルを追加する。 +4. `cd example && dart run custom_lint` で動作を確認する。 + +## CI + +- **code-analysis.yml** — `lib/`・`example/`・`pubspec.yaml` の変更時に実行: フォーマットチェック → `flutter analyze` → example に対して `dart run custom_lint` +- **publish.yml** — `v*` タグをプッシュすると pub.dev へ自動公開 + +Flutter のバージョン管理には FVM を使用しています(`.fvmrc` 参照)。 From c954b252ab90935e472dd66f6543cb43cdb17b31 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 09:44:18 +0900 Subject: [PATCH 02/19] feat: add mcp json --- .gitignore | 2 ++ .mcp.sample.json | 11 +++++++++++ 2 files changed, 13 insertions(+) create mode 100644 .mcp.sample.json diff --git a/.gitignore b/.gitignore index f34adb1..c0e2e1d 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,5 @@ build/ # FVM Version Cache .fvm/ + +.mcp.json diff --git a/.mcp.sample.json b/.mcp.sample.json new file mode 100644 index 0000000..e9f0418 --- /dev/null +++ b/.mcp.sample.json @@ -0,0 +1,11 @@ +{ + "mcpServers": { + "github": { + "type": "http", + "url": "https://api.githubcopilot.com/mcp/", + "headers": { + "Authorization": "Bearer ${PAT}" + } + } + } +} From d6109a3380f2b0beca7b5d9592543372e14f83cd Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 09:55:03 +0900 Subject: [PATCH 03/19] dev: use serena --- .serena/.gitignore | 2 + .serena/project.yml | 119 ++++++++++++++++++++++++++++++++++++++ .serena/serena_config.yml | 2 + 3 files changed, 123 insertions(+) create mode 100644 .serena/.gitignore create mode 100644 .serena/project.yml create mode 100644 .serena/serena_config.yml diff --git a/.serena/.gitignore b/.serena/.gitignore new file mode 100644 index 0000000..2e510af --- /dev/null +++ b/.serena/.gitignore @@ -0,0 +1,2 @@ +/cache +/project.local.yml diff --git a/.serena/project.yml b/.serena/project.yml new file mode 100644 index 0000000..59ce6d4 --- /dev/null +++ b/.serena/project.yml @@ -0,0 +1,119 @@ +# the name by which the project can be referenced within Serena +project_name: "sangria" + + +# list of languages for which language servers are started; choose from: +# al ansible bash clojure cpp +# cpp_ccls crystal csharp csharp_omnisharp dart +# elixir elm erlang fortran fsharp +# go groovy haskell haxe hlsl +# java json julia kotlin lean4 +# lua luau markdown matlab msl +# nix ocaml pascal perl php +# php_phpactor powershell python python_jedi python_ty +# r rego ruby ruby_solargraph rust +# scala solidity swift systemverilog terraform +# toml typescript typescript_vts vue yaml +# zig +# (This list may be outdated. For the current list, see values of Language enum here: +# https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py +# For some languages, there are alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.) +# Note: +# - For C, use cpp +# - For JavaScript, use typescript +# - For Free Pascal/Lazarus, use pascal +# Special requirements: +# Some languages require additional setup/installations. +# See here for details: https://oraios.github.io/serena/01-about/020_programming-languages.html#language-servers +# When using multiple languages, the first language server that supports a given file will be used for that file. +# The first language is the default language and the respective language server will be used as a fallback. +# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored. +languages: +- dart + +# the encoding used by text files in the project +# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings +encoding: "utf-8" + +# line ending convention to use when writing source files. +# Possible values: unset (use global setting), "lf", "crlf", or "native" (platform default) +# This does not affect Serena's own files (e.g. memories and configuration files), which always use native line endings. +line_ending: + +# The language backend to use for this project. +# If not set, the global setting from serena_config.yml is used. +# Valid values: LSP, JetBrains +# Note: the backend is fixed at startup. If a project with a different backend +# is activated post-init, an error will be returned. +language_backend: + +# whether to use project's .gitignore files to ignore files +ignore_all_files_in_gitignore: true + +# advanced configuration option allowing to configure language server-specific options. +# Maps the language key to the options. +# Have a look at the docstring of the constructors of the LS implementations within solidlsp (e.g., for C# or PHP) to see which options are available. +# No documentation on options means no options are available. +ls_specific_settings: {} + +# list of additional paths to ignore in this project. +# Same syntax as gitignore, so you can use * and **. +# Note: global ignored_paths from serena_config.yml are also applied additively. +ignored_paths: [] + +# whether the project is in read-only mode +# If set to true, all editing tools will be disabled and attempts to use them will result in an error +# Added on 2025-04-18 +read_only: false + +# list of tool names to exclude. +# This extends the existing exclusions (e.g. from the global configuration) +# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html +excluded_tools: [] + +# list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default). +# This extends the existing inclusions (e.g. from the global configuration). +# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html +included_optional_tools: [] + +# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools. +# This cannot be combined with non-empty excluded_tools or included_optional_tools. +# Find the list of tools here: https://oraios.github.io/serena/01-about/035_tools.html +fixed_tools: [] + +# list of mode names that are to be activated by default, overriding the setting in the global configuration. +# The full set of modes to be activated is base_modes (from global config) + default_modes + added_modes. +# If the setting is undefined/empty, the default_modes from the global configuration (serena_config.yml) apply. +# Otherwise, this overrides the setting from the global configuration (serena_config.yml). +# Therefore, you can set this to [] if you do not want the default modes defined in the global config to apply +# for this project. +# This setting can, in turn, be overridden by CLI parameters (--mode). +# See https://oraios.github.io/serena/02-usage/050_configuration.html#modes +default_modes: + +# list of mode names to be activated additionally for this project, e.g. ["query-projects"] +# The full set of modes to be activated is base_modes (from global config) + default_modes + added_modes. +# See https://oraios.github.io/serena/02-usage/050_configuration.html#modes +added_modes: + +# initial prompt for the project. It will always be given to the LLM upon activating the project +# (contrary to the memories, which are loaded on demand). +initial_prompt: "" + +# time budget (seconds) per tool call for the retrieval of additional symbol information +# such as docstrings or parameter information. +# This overrides the corresponding setting in the global configuration; see the documentation there. +# If null or missing, use the setting from the global configuration. +symbol_info_budget: + +# list of regex patterns which, when matched, mark a memory entry as read‑only. +# Extends the list from the global configuration, merging the two lists. +read_only_memory_patterns: [] + +# list of regex patterns for memories to completely ignore. +# Matching memories will not appear in list_memories or activate_project output +# and cannot be accessed via read_memory or write_memory. +# To access ignored memory files, use the read_file tool on the raw file path. +# Extends the list from the global configuration, merging the two lists. +# Example: ["_archive/.*", "_episodes/.*"] +ignored_memory_patterns: [] diff --git a/.serena/serena_config.yml b/.serena/serena_config.yml new file mode 100644 index 0000000..1df3be3 --- /dev/null +++ b/.serena/serena_config.yml @@ -0,0 +1,2 @@ +web_dashboard: false +web_dashboard_open_on_launch: false From 069af0fe1bb72ef546ea6e25e29c25bc7dec0230 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 09:55:25 +0900 Subject: [PATCH 04/19] dev: add CLAUDE skills --- .claude/skills/create-pr/SKILL.md | 63 ++++++++ .claude/skills/review-pr/SKILL.md | 119 ++++++++++++++ docs/dev/review-guideline.md | 248 ++++++++++++++++++++++++++++++ 3 files changed, 430 insertions(+) create mode 100644 .claude/skills/create-pr/SKILL.md create mode 100644 .claude/skills/review-pr/SKILL.md create mode 100644 docs/dev/review-guideline.md diff --git a/.claude/skills/create-pr/SKILL.md b/.claude/skills/create-pr/SKILL.md new file mode 100644 index 0000000..d9a46af --- /dev/null +++ b/.claude/skills/create-pr/SKILL.md @@ -0,0 +1,63 @@ +--- +name: create-pr +description: GitHub PR作成コマンド +--- + +# GitHub PR作成コマンド + +現在のブランチの変更内容を確認し、PR テンプレートに従って GitHub 上に Pull Request を作成してください。 + +## 実行手順 + +1. 現在のブランチ名とベースブランチ(通常は develop)を確認し、差分を理解してください + +2. コードの変更内容を分析し、以下の情報を自動的に生成してください: + - PR タイトル(変更内容から適切なタイトルを推測) + - Description(変更内容の概要を説明) + - やったこと(実際の変更内容を箇条書きで) + - やらなかったこと/スコープ外の内容(推測できる範囲で) + - 備考・関連URL(関連する issue やドキュメントがあれば) + +3. 生成した内容を私に提示し、以下の項目について確認・質問してください: + - 生成した内容に修正・追加が必要か + - その他、追加すべき情報があるか + +4. 収集した情報を以下のテンプレートに当てはめて、PR本文を作成してください: + +```markdown +# Description + +[ここに説明を記載] + +# やったこと + +- [箇条書きで記載] + +# やらなかったこと + +- [箇条書きで記載、なければ「特になし」] + +# Operation Confirmation + + +## 事前準備・実行操作 +[手順を記載] + +# 備考・関連URL +[関連URLまたは「特になし」] +``` + + +5. 作成したPR内容を私に最終確認してもらい、問題なければ以下を実行: + - 未コミットの変更があれば、対象ファイルについて、私に対して「コミット」が必要なファイルか確認してください + - 現在のブランチをリモートにプッシュ + - `mcp__github__create_pull_request` ツールを使用してPRを作成 + + +6. PR作成後、作成されたPRのURLを表示してください + +## 注意事項 + + - ベースブランチは通常 `develop` ですが、確認してください + - PR 本文には必ず PR-Agent のコマンドを含めてください + - 必要に応じて、複数のコミットに分けることも検討してください diff --git a/.claude/skills/review-pr/SKILL.md b/.claude/skills/review-pr/SKILL.md new file mode 100644 index 0000000..cf66101 --- /dev/null +++ b/.claude/skills/review-pr/SKILL.md @@ -0,0 +1,119 @@ +--- +name: review-pr +description: GitHub PRをコーディングガイドラインに基づいて自動レビューするコマンド +--- + +# 概要 + +Github Pull Request をコーディングガイドラインに基づいて自動レビューし、改善点を指摘するコマンド。 +Github MCP を用いて PR の内容を取得し、品質憲章や各種ガイドラインに照らし合わせてレビューを実施する。 + +## 必須引数 + + - `$PR_URL`: Github Pull Request URL (例: ) + +## 動作フロー + +1. **PR 情報取得** - MCP経由でPullRequestの基本情報を取得 +2. **変更ファイル取得** - 変更されたファイルの一覧とdiffを取得 +3. **コード解析** - 各ファイルの変更内容を解析 +4. **ガイドライン照合** - コード品質憲章、DB設計ガイドライン等と照合 +5. **レビューコメント生成** - 改善点・指摘事項をまとめる +6. **レビュー投稿** - GitHub上にレビューコメントを投稿 + +### 🔍 基本チェック項目 + + - **命名規則の遵守** + - 変数・関数・クラス名が意図を明確に表現しているか + + - 日本語のローマ字変換を避けているか + + - **CLEANなコード** + - 凝集度(Cohesion)が高いか + - 疎結合(Loose Coupling)になっているか + - 適切にカプセル化されているか + - 抽象化のレベルが適切か + - 冗長性がないか(DRY原則) + - **関数・クラス設計** + - 単一責任の原則を守っているか + - 引数の数が適切か + - フラグ引数を使っていないか + +### 📝 コメント・ドキュメント + + - コメントよりコードで表現されているか + - 必要なコメントは背景・理由を説明しているか + - テーブル・カラムにコメントが記載されているか + +### 🧪 テスト + + - テストコードが追加・修正されているか + - F.I.R.S.Tなテストになっているか + - Fast(高速) + - Independent(独立) + - Repeatable(再現性) + - Self-Validating(自己検証) + - Timely(適時性) + +## プロダクト構成とドキュメント + +PR の diff 箇所に合わせて、下記を参照してください。 + +### 📋 ガイドライン + + - **レビューガイドライン**: `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 によるコメント」である旨を明記すること + +### `submit_pending_pull_request_review` 時のテンプレート + + ```text + ## 📋 コードレビュー結果 + + ### ✅ 良い点 + - + + ### ⚠️ 改善提案 + - + + ### 🚨 必須修正項目 + - + + ### 📚 参考ドキュメント + - [レビューガイドライン](docs/dev/review-guideline.md) + + *Generated by Claude Code with `/review-pr` command* + ``` + +## エラーハンドリング + + - **PR が存在しない場合**: エラーメッセージを表示し、PR番号の確認を促す + - **アクセス権限がない場合**: 権限設定の確認を促す + - **ネットワークエラー**: リトライまたは手動でのレビューを促す + - **差分が大きすぎる場合**: 重要な変更に絞ってレビューを実施 + +## 使用例 + +### 基本的な使用方法 + + ```bash + /review:review-pr https://github.com/offich/sangria/pull/10 + ``` + + - PRの変更内容を取得 + - コーディングガイドラインに基づいてレビュー + - 改善点をGitHubにコメント投稿 + +## 注意事項 + + - レビューは自動生成の提案であり、最終的な判断は人間が行うこと + - ビジネスロジックの妥当性は判断できないため、技術的な観点のみレビュー + - 大規模なPRの場合、重要度の高い指摘に絞ってコメント + - 既存コードのスタイルに合わせることを優先 diff --git a/docs/dev/review-guideline.md b/docs/dev/review-guideline.md new file mode 100644 index 0000000..ae8b254 --- /dev/null +++ b/docs/dev/review-guideline.md @@ -0,0 +1,248 @@ +# PR レビューガイドライン + +DevTools Extension のコードをレビューし、以下の観点で指摘してください。 + + - `Effective Dart のベストプラクティス遵守` + - `バグやクラッシュにつながる可能性` + - `VM Service / DTD との通信パターンの正確性` + - `非同期処理の危険パターン` + - `アイソレート変化・ホットリロードへの対応` + +特に **致命的バグパターン** の検出を最優先設定。DevTools 内でクラッシュ・フリーズ・データ化け・メモリリークを引き起こす可能性のある問題を重点的にチェックしてください。 + +## DevTools Extension 固有の前提知識 + +DevTools Extension は Flutter **Web** アプリとして iFrame 内で動作し、通常の Flutter アプリとは異なる制約があります。 + +- **通信はすべて非同期 RPC**: Extension ↔ DevTools ↔ VM Service ↔ 対象アプリ +- **ファイルシステムへの直接アクセス不可**: 必ず DTD (Dart Tooling Daemon) 経由 +- **アイソレートはホットリロードで変わる**: リスナーが古いアイソレートを参照し続けると不具合 +- **iFrame サンドボックス**: `postMessage` 以外の親ウィンドウへのアクセスは不可 +- **`requiresConnection`** が `true`(デフォルト)のとき、未接続状態で Extension は無効化される + +--- + +## レビュー観点(致命的バグ検出重点) + +### VM Service / DTD 通信 + + - [ ] **サービス呼び出しのエラーハンドリング** + - [ ] `serviceManager.callServiceExtension()` に `try-catch` / `.catchError()` があるか + - [ ] 切断中・未接続時に呼び出しが発生しないよう `isServiceAvailable` を確認しているか + - [ ] タイムアウトが設定されており、長時間ブロックしないか + - [ ] **サービス拡張のレスポンス** + - [ ] ハンドラが必ず `ServiceExtensionResponse.result()` または `.error()` を返すか + - [ ] Future が複数回完了する(ホットリスタート時の二重完了)パターンがないか + - [ ] パラメータの JSON デコードで例外が起きてもクラッシュしないか + - [ ] **DTD 利用** + - [ ] `dtdManager` が利用不可の場合に適切にフォールバックしているか + - [ ] ファイル操作が DTD 経由になっているか(直接 `dart:io` は使えない) + +### アイソレート変化・ホットリロード + + - [ ] **古いアイソレート参照** + - [ ] アイソレート変化時にリスナーを再登録しているか + - [ ] `selectedIsolate` の変化を `addListener` で監視し、処理を切り替えているか + - [ ] **ストリームの再購読** + - [ ] ホットリロード後にストリームが無効化されていないか + - [ ] `initState` で購読し `dispose` でキャンセルしているか + +### リスナー・サブスクリプションのリーク + + - [ ] **dispose 漏れ** + - [ ] `serviceManager` / `extensionManager` / `dtdManager` へのリスナーが `dispose()` でキャンセルされているか + - [ ] `StreamSubscription` が未キャンセルで放置されていないか + - [ ] タイマー・ポーリングが Extension タブを閉じると停止するか + +### 接続状態管理 + + - [ ] **未接続時の動作** + - [ ] `requiresConnection: true` の場合、未接続でサービス呼び出しを行っていないか + - [ ] 接続・切断イベントで UI 状態が正しく更新されるか + - [ ] **非同期処理中の切断** + - [ ] 長時間の処理中に切断が発生した場合にハンドリングされているか + +### 非同期処理の一般的な危険パターン + + - [ ] **unawaited Future** + - [ ] `initState` や `afterBuild` で `await` 漏れがないか + - [ ] 例外がサイレントに握りつぶされていないか + - [ ] **並行処理の管理** + - [ ] 複数の `callServiceExtension` を直列で呼ぶ必要があるとき、順序保証されているか + - [ ] `Future.wait` で一件失敗時に残りの処理が中断されないか + +--- + +### 一般的なコード品質 + + - [ ] 可読性・保守性 + - [ ] 設計原理の遵守 + - [ ] **null 安全・型安全** + - [ ] サービスレスポンスの JSON パースで null クラッシュがないか + - [ ] `serviceManager` / `dtdManager` が null のまま使われていないか + - [ ] テスト可能性 + - [ ] セキュリティ(サービス拡張のパラメータバリデーション) + +### プロジェクト固有 + + - [ ] 命名規則の統一 + - [ ] サービス拡張のメソッド名が `ext..` 形式か + - [ ] `config.yaml` に必須フィールド(`name`, `version`, `issueTracker`, `materialIconCodePoint`)があるか + - [ ] `DevToolsExtension` ウィジェットがルートに配置されているか + - [ ] 既存コードの整合性 + +--- + +## レビューで出力される内容 + +### 1. **致命的問題の指摘** + + - クラッシュ・フリーズ・メモリリークの可能性 + - VM Service / DTD の不正な使用 + - データ損失リスク(アイソレート変化時の状態喪失など) + - セキュリティ上の問題 + +### 2. **致命的バグ・クラッシュの検出パターン** + + - **dispose 漏れ**: タブを閉じてもリスナーが残り続けメモリを消費 + - **二重完了 Future**: ホットリスタートでハンドラが二度呼ばれ例外 + - **古いアイソレート参照**: ホットリロード後に無効なアイソレートへアクセス + - **切断中のサービス呼び出し**: 切断後に `callServiceExtension` してクラッシュ + - **unawaited Future**: 例外が握りつぶされてサイレント失敗 + - **JSON パースクラッシュ**: 不正なパラメータで `jsonDecode` が例外 + +### 3. **改善提案** + + - より堅牢な実装方法 + - 適切な例外処理パターン + - エラー回復戦略の提案 + +### 4. **具体的修正コード例** + + - 修正前後のコード比較 + - 推奨実装パターン + +--- + +## レビュー実行時の必須チェックリスト + +### Claude が最優先で確認すべき致命的なパターン + +#### 1. **`dispose()` でのリスナークリーンアップ漏れ** + +```dart +// 危険: タブを閉じてもリスナーが残り続ける +class _MyExtensionState extends State { + @override + void initState() { + serviceManager.onIsolateStopped.addListener(_onIsolateStopped); + } + // dispose() が未実装 → メモリリーク +} + +// 安全 +@override +void dispose() { + serviceManager.onIsolateStopped.removeListener(_onIsolateStopped); + _subscription?.cancel(); + super.dispose(); +} +``` + +#### 2. **切断チェックなしのサービス呼び出し** + +```dart +// 危険: 切断中に呼び出してクラッシュ +final result = await serviceManager.callServiceExtension('ext.myapp.getData'); + +// 安全 +if (!serviceManager.isServiceAvailable) { + return; // または UI でエラー表示 +} +final result = await serviceManager.callServiceExtension('ext.myapp.getData'); +``` + +#### 3. **ホットリロード後の古いアイソレート参照** + +```dart +// 危険: アイソレート変化を検知していない +final isolate = serviceManager.isolateManager.selectedIsolate.value; +await heavyOperation(isolate); // アイソレートが切り替わると無効 + +// 安全 +serviceManager.isolateManager.selectedIsolate.addListener(_onIsolateChanged); +// _onIsolateChanged で再初期化 +``` + +#### 4. **サービス拡張ハンドラの二重完了** + +```dart +// 危険: タイムアウト後もハンドラが完了しようとする +Future handler(String method, Map params) async { + final result = await operation().timeout(const Duration(seconds: 5)); + return ServiceExtensionResponse.result(jsonEncode(result)); // timeout後も到達する可能性 +} + +// 安全: Completer で単一完了を保証 +final completer = Completer(); +operation().timeout(const Duration(seconds: 5)).then( + (r) { if (!completer.isCompleted) completer.complete(...); }, + onError: (e) { if (!completer.isCompleted) completer.completeError(e); }, +); +return completer.future; +``` + +#### 5. **unawaited な非同期処理** + +```dart +// 危険: 例外が握りつぶされる +@override +void initState() { + super.initState(); + loadData(); // await なし +} + +// 安全 +@override +void initState() { + super.initState(); + unawaited(loadData().catchError((e) { + // エラーハンドリング + })); +} +``` + +#### 6. **JSON パースの無防備な処理** + +```dart +// 危険: 不正な JSON でクラッシュ +Future handler(String method, Map params) async { + final data = jsonDecode(params['data']!); // null / 不正 JSON でクラッシュ + +// 安全 + final rawData = params['data']; + if (rawData == null) { + return ServiceExtensionResponse.error( + ServiceExtensionResponse.invalidParams, + '"data" parameter is required', + ); + } + try { + final data = jsonDecode(rawData); + ... + } on FormatException catch (e) { + return ServiceExtensionResponse.error( + ServiceExtensionResponse.invalidParams, + 'Invalid JSON: $e', + ); + } +} +``` + +--- + +## オプション + + - `--pre-commit` : コミット前チェックモード(より厳密なレビュー) + - `--focus=performance` : 特定の観点に絞ったレビュー + - `--japanese` : 日本語でのレビュー結果出力 From 83d0727f3fe8112499265fd13bec39c951f94c75 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 10:17:02 +0900 Subject: [PATCH 05/19] dev: flutter 3.38.10 --- .fvmrc | 2 +- ...se_widget_ref_synchronously_lint_rule.dart | 44 ++-- ..._widget_ref_synchronously_lint_rule.g.dart | 67 +++-- example/pubspec.lock | 240 +++++++++++------- example/pubspec.yaml | 14 +- .../avoid_empty_container_lint_rule.dart | 4 +- .../no_disabled_tests_lint_rule.dart | 4 +- .../no_disabled_tests_visitor.dart | 2 +- .../use_setstate_synchronously_lint_rule.dart | 4 +- .../use_setstate_synchronously_visitor.dart | 2 +- .../use_widget_ref_synchronous_lint_rule.dart | 4 +- .../use_widget_ref_synchronously_visitor.dart | 4 +- pubspec.lock | 186 +++++++------- pubspec.yaml | 10 +- 14 files changed, 339 insertions(+), 248 deletions(-) diff --git a/.fvmrc b/.fvmrc index f4fc72a..ac62dd3 100644 --- a/.fvmrc +++ b/.fvmrc @@ -1,3 +1,3 @@ { - "flutter": "3.29.1" + "flutter": "3.38.10" } \ No newline at end of file diff --git a/example/lib/use_widget_ref_synchronously_lint_rule.dart b/example/lib/use_widget_ref_synchronously_lint_rule.dart index 0dd2f80..95a2c7b 100644 --- a/example/lib/use_widget_ref_synchronously_lint_rule.dart +++ b/example/lib/use_widget_ref_synchronously_lint_rule.dart @@ -14,19 +14,19 @@ class UseWidgetRefSynchronouslyLintRule extends HookConsumerWidget { ) async { // expect_lint: use_widget_ref_synchronously await ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .asyncIncrementCounter(); if (context.mounted) { ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .syncIncrementCounter(); } if (!context.mounted) { // expect_lint: use_widget_ref_synchronously ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .syncIncrementCounter(); return; } @@ -35,21 +35,21 @@ class UseWidgetRefSynchronouslyLintRule extends HookConsumerWidget { return; } - ref.read(asyncStateCounterNotifierProvider.notifier).syncIncrementCounter(); + ref.read(asyncStateCounterProvider.notifier).syncIncrementCounter(); } @override Widget build(BuildContext context, WidgetRef ref) { - final counter = ref.watch(asyncStateCounterNotifierProvider); + final counter = ref.watch(asyncStateCounterProvider); useEffect(() { WidgetsBinding.instance.addPostFrameCallback((_) async { // expect_lint: use_widget_ref_synchronously - final state = ref.watch(asyncStateCounterNotifierProvider); + final state = ref.watch(asyncStateCounterProvider); state.isOdd; if (context.mounted) { - final state = ref.watch(asyncStateCounterNotifierProvider); + final state = ref.watch(asyncStateCounterProvider); state.isEven; } }); @@ -65,19 +65,19 @@ class UseWidgetRefSynchronouslyLintRule extends HookConsumerWidget { onTap: () async { // expect_lint: use_widget_ref_synchronously await ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .asyncIncrementCounter(); if (context.mounted) { ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .syncIncrementCounter(); } if (!context.mounted) { // expect_lint: use_widget_ref_synchronously ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .syncIncrementCounter(); return; } @@ -87,7 +87,7 @@ class UseWidgetRefSynchronouslyLintRule extends HookConsumerWidget { } ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .syncIncrementCounter(); }, ), @@ -114,19 +114,19 @@ class _StatefulUseWidgetRefSynchronouslyLintRuleState ) async { // expect_lint: use_widget_ref_synchronously await ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .asyncIncrementCounter(); if (mounted) { ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .syncIncrementCounter(); } if (!mounted) { // expect_lint: use_widget_ref_synchronously ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .syncIncrementCounter(); return; } @@ -135,21 +135,21 @@ class _StatefulUseWidgetRefSynchronouslyLintRuleState return; } - ref.read(asyncStateCounterNotifierProvider.notifier).syncIncrementCounter(); + ref.read(asyncStateCounterProvider.notifier).syncIncrementCounter(); } @override Widget build(BuildContext context) { - final counter = ref.watch(asyncStateCounterNotifierProvider); + final counter = ref.watch(asyncStateCounterProvider); useEffect(() { WidgetsBinding.instance.addPostFrameCallback((_) async { // expect_lint: use_widget_ref_synchronously - final state = ref.watch(asyncStateCounterNotifierProvider); + final state = ref.watch(asyncStateCounterProvider); state.isOdd; if (mounted) { - final state = ref.watch(asyncStateCounterNotifierProvider); + final state = ref.watch(asyncStateCounterProvider); state.isEven; } }); @@ -165,19 +165,19 @@ class _StatefulUseWidgetRefSynchronouslyLintRuleState onTap: () async { // expect_lint: use_widget_ref_synchronously await ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .asyncIncrementCounter(); if (mounted) { ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .syncIncrementCounter(); } if (!mounted) { // expect_lint: use_widget_ref_synchronously ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .syncIncrementCounter(); return; } @@ -187,7 +187,7 @@ class _StatefulUseWidgetRefSynchronouslyLintRuleState } ref - .read(asyncStateCounterNotifierProvider.notifier) + .read(asyncStateCounterProvider.notifier) .syncIncrementCounter(); }, ), diff --git a/example/lib/use_widget_ref_synchronously_lint_rule.g.dart b/example/lib/use_widget_ref_synchronously_lint_rule.g.dart index 53d0339..0086a26 100644 --- a/example/lib/use_widget_ref_synchronously_lint_rule.g.dart +++ b/example/lib/use_widget_ref_synchronously_lint_rule.g.dart @@ -6,23 +6,58 @@ part of 'use_widget_ref_synchronously_lint_rule.dart'; // RiverpodGenerator // ************************************************************************** -String _$asyncStateCounterNotifierHash() => - r'365b25d3156473bad6173c6425546d4b46c395ca'; +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, type=warning -/// See also [AsyncStateCounterNotifier]. @ProviderFor(AsyncStateCounterNotifier) -final asyncStateCounterNotifierProvider = - AutoDisposeNotifierProvider.internal( - AsyncStateCounterNotifier.new, - name: r'asyncStateCounterNotifierProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$asyncStateCounterNotifierHash, - dependencies: null, - allTransitiveDependencies: null, +final asyncStateCounterProvider = AsyncStateCounterNotifierProvider._(); + +final class AsyncStateCounterNotifierProvider + extends $NotifierProvider { + AsyncStateCounterNotifierProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'asyncStateCounterProvider', + isAutoDispose: true, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => _$asyncStateCounterNotifierHash(); + + @$internal + @override + AsyncStateCounterNotifier create() => AsyncStateCounterNotifier(); + + /// {@macro riverpod.override_with_value} + Override overrideWithValue(int value) { + return $ProviderOverride( + origin: this, + providerOverride: $SyncValueProvider(value), ); + } +} + +String _$asyncStateCounterNotifierHash() => + r'365b25d3156473bad6173c6425546d4b46c395ca'; -typedef _$AsyncStateCounterNotifier = AutoDisposeNotifier; -// ignore_for_file: type=lint -// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package +abstract class _$AsyncStateCounterNotifier extends $Notifier { + int build(); + @$mustCallSuper + @override + void runBuild() { + final ref = this.ref as $Ref; + final element = + ref.element + as $ClassProviderElement< + AnyNotifier, + int, + Object?, + Object? + >; + element.handleCreate(ref, build); + } +} diff --git a/example/pubspec.lock b/example/pubspec.lock index 1617597..4e1bc72 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -5,26 +5,34 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + sha256: c209688d9f5a5f26b2fb47a188131a6fb9e876ae9e47af3737c0b4f58a93470d url: "https://pub.dev" source: hosted - version: "80.0.0" + version: "91.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" + sha256: a40a0cee526a7e1f387c6847bd8a5ccbf510a75952ef8a28338e989558072cb0 url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "8.4.0" + analyzer_buffer: + dependency: transitive + description: + name: analyzer_buffer + sha256: aba2f75e63b3135fd1efaa8b6abefe1aa6e41b6bd9806221620fa48f98156033 + url: "https://pub.dev" + source: hosted + version: "0.1.11" analyzer_plugin: dependency: transitive description: name: analyzer_plugin - sha256: b3075265c5ab222f8b3188342dcb50b476286394a40323e85d1fa725035d40a4 + sha256: "08cfefa90b4f4dd3b447bda831cecf644029f9f8e22820f6ee310213ebe2dd53" url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.13.10" args: dependency: transitive description: @@ -53,18 +61,18 @@ packages: dependency: transitive description: name: build - sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + sha256: a156715e7cd728130c592f30552575908aae5b100005fbc1f0fb16b3c03a3d10 url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "4.0.6" build_config: dependency: transitive description: name: build_config - sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" + sha256: "4070d2a59f8eec34c97c86ceb44403834899075f66e8a9d59706f8e7834f6f71" url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.3.0" build_daemon: dependency: transitive description: @@ -73,30 +81,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.4" - build_resolvers: - dependency: transitive - description: - name: build_resolvers - sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 - url: "https://pub.dev" - source: hosted - version: "2.4.4" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" - url: "https://pub.dev" - source: hosted - version: "2.4.15" - build_runner_core: - dependency: transitive - description: - name: build_runner_core - sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + sha256: "1523ce62448ebac2c15a8ba5fbad8acac169788658a7dd2a1c2d9c2a9318b9a6" url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "2.15.0" built_collection: dependency: transitive description: @@ -109,10 +101,10 @@ packages: dependency: transitive description: name: built_value - sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4 + sha256: "34e4067d30ce212937df995f03b69992eea683539ceeac7f679a1f1eba055b56" url: "https://pub.dev" source: hosted - version: "8.9.5" + version: "8.12.6" characters: dependency: transitive description: @@ -137,6 +129,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.0" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" cli_util: dependency: transitive description: @@ -177,6 +177,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + coverage: + dependency: transitive + description: + name: coverage + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" + url: "https://pub.dev" + source: hosted + version: "1.15.0" crypto: dependency: transitive description: @@ -189,50 +197,50 @@ packages: dependency: "direct dev" description: name: custom_lint - sha256: "409c485fd14f544af1da965d5a0d160ee57cd58b63eeaa7280a4f28cf5bda7f1" + sha256: "751ee9440920f808266c3ec2553420dea56d3c7837dd2d62af76b11be3fcece5" url: "https://pub.dev" source: hosted - version: "0.7.5" + version: "0.8.1" custom_lint_builder: dependency: transitive description: name: custom_lint_builder - sha256: "107e0a43606138015777590ee8ce32f26ba7415c25b722ff0908a6f5d7a4c228" + sha256: "1128db6f58e71d43842f3b9be7465c83f0c47f4dd8918f878dd6ad3b72a32072" url: "https://pub.dev" source: hosted - version: "0.7.5" + version: "0.8.1" custom_lint_core: dependency: transitive description: name: custom_lint_core - sha256: "31110af3dde9d29fb10828ca33f1dce24d2798477b167675543ce3d208dee8be" + sha256: "85b339346154d5646952d44d682965dfe9e12cae5febd706f0db3aa5010d6423" url: "https://pub.dev" source: hosted - version: "0.7.5" + version: "0.8.1" custom_lint_visitor: dependency: transitive description: name: custom_lint_visitor - sha256: "36282d85714af494ee2d7da8c8913630aa6694da99f104fb2ed4afcf8fc857d8" + sha256: "91f2a81e9f0abb4b9f3bb529f78b6227ce6050300d1ae5b1e2c69c66c7a566d8" url: "https://pub.dev" source: hosted - version: "1.0.0+7.3.0" + version: "1.0.0+8.4.0" dart_style: dependency: transitive description: name: dart_style - sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + sha256: a9c30492da18ff84efe2422ba2d319a89942d93e58eb0b73d32abe822ef54b7b url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.3" fake_async: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" file: dependency: transitive description: @@ -258,26 +266,26 @@ packages: dependency: "direct main" description: name: flutter_hooks - sha256: b772e710d16d7a20c0740c4f855095026b31c7eb5ba3ab67d2bd52021cd9461d + sha256: "8ae1f090e5f4ef5cfa6670ce1ab5dddadd33f3533a7f9ba19d9f958aa2a89f42" url: "https://pub.dev" source: hosted - version: "0.21.2" + version: "0.21.3+1" flutter_lints: dependency: "direct dev" description: name: flutter_lints - sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.0.0" flutter_riverpod: dependency: transitive description: name: flutter_riverpod - sha256: "9532ee6db4a943a1ed8383072a2e3eeda041db5657cdf6d2acecf3c21ecbe7e1" + sha256: "38ec6c303e2c83ee84512f5fc2a82ae311531021938e63d7137eccc107bf3c02" url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "3.1.0" flutter_test: dependency: "direct dev" description: flutter @@ -319,10 +327,10 @@ packages: dependency: "direct main" description: name: hooks_riverpod - sha256: "70bba33cfc5670c84b796e6929c54b8bc5be7d0fe15bb28c2560500b9ad06966" + sha256: b880efcd17757af0aa242e5dceac2fb781a014c22a32435a5daa8f17e9d5d8a9 url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "3.1.0" hotreloader: dependency: transitive description: @@ -331,14 +339,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.3.0" - http: - dependency: transitive - description: - name: http - sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" - url: "https://pub.dev" - source: hosted - version: "1.4.0" http_multi_server: dependency: transitive description: @@ -383,34 +383,34 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.1.0" logging: dependency: transitive description: @@ -439,10 +439,10 @@ packages: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" mime: dependency: transitive description: @@ -451,6 +451,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + mockito: + dependency: transitive + description: + name: mockito + sha256: eff30d002f0c8bf073b6f929df4483b543133fcafce056870163587b03f1d422 + url: "https://pub.dev" + source: hosted + version: "5.6.4" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" package_config: dependency: transitive description: @@ -495,34 +511,34 @@ packages: dependency: transitive description: name: riverpod - sha256: "59062512288d3056b2321804332a13ffdd1bf16df70dcc8e506e411280a72959" + sha256: "16ff608d21e8ea64364f2b7c049c94a02ab81668f78845862b6e88b71dd4935a" url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "3.1.0" riverpod_analyzer_utils: dependency: transitive description: name: riverpod_analyzer_utils - sha256: "03a17170088c63aab6c54c44456f5ab78876a1ddb6032ffde1662ddab4959611" + sha256: "947b05d04c52a546a2ac6b19ef2a54b08520ff6bdf9f23d67957a4c8df1c3bc0" url: "https://pub.dev" source: hosted - version: "0.5.10" + version: "1.0.0-dev.8" riverpod_annotation: dependency: "direct main" description: name: riverpod_annotation - sha256: e14b0bf45b71326654e2705d462f21b958f987087be850afd60578fcd502d1b8 + sha256: cc1474bc2df55ec3c1da1989d139dcef22cd5e2bd78da382e867a69a8eca2e46 url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "4.0.0" riverpod_generator: dependency: "direct dev" description: name: riverpod_generator - sha256: "44a0992d54473eb199ede00e2260bd3c262a86560e3c6f6374503d86d0580e36" + sha256: e43b1537229cc8f487f09b0c20d15dba840acbadcf5fc6dad7ad5e8ab75950dc url: "https://pub.dev" source: hosted - version: "2.6.5" + version: "4.0.0+1" rxdart: dependency: transitive description: @@ -546,6 +562,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.2" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 + url: "https://pub.dev" + source: hosted + version: "1.1.3" shelf_web_socket: dependency: transitive description: @@ -563,10 +595,26 @@ packages: dependency: transitive description: name: source_gen - sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b" + sha256: ec37cc0e6694374cbef59ed79685572c870a54ede6fa30a3e420feb3adffea02 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "4.2.3" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" + url: "https://pub.dev" + source: hosted + version: "0.10.13" source_span: dependency: transitive description: @@ -631,22 +679,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.2" + test: + dependency: transitive + description: + name: test + sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" + url: "https://pub.dev" + source: hosted + version: "1.26.3" test_api: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.4" - timing: + version: "0.7.7" + test_core: dependency: transitive description: - name: timing - sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" + name: test_core + sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "0.6.12" typed_data: dependency: transitive description: @@ -667,10 +723,10 @@ packages: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: @@ -711,6 +767,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" yaml: dependency: transitive description: @@ -720,5 +784,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.7.0 <4.0.0" - flutter: ">=3.21.0-13.0.pre.4" + dart: ">=3.9.0 <4.0.0" + flutter: ">=3.32.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 0d03189..2d45e47 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -10,19 +10,19 @@ environment: dependencies: flutter: sdk: flutter - flutter_hooks: 0.21.2 - hooks_riverpod: 2.6.1 - riverpod_annotation: 2.6.1 + flutter_hooks: 0.21.3+1 + hooks_riverpod: 3.1.0 + riverpod_annotation: 4.0.0 dev_dependencies: flutter_test: sdk: flutter sangria_lints: path: ../ - custom_lint: 0.7.5 - flutter_lints: 5.0.0 - riverpod_generator: 2.6.5 - build_runner: 2.4.15 + custom_lint: 0.8.1 + flutter_lints: 6.0.0 + riverpod_generator: 4.0.0+1 + build_runner: 2.15.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/lib/src/rules/avoid_empty_container/avoid_empty_container_lint_rule.dart b/lib/src/rules/avoid_empty_container/avoid_empty_container_lint_rule.dart index 4c1fa03..629c850 100644 --- a/lib/src/rules/avoid_empty_container/avoid_empty_container_lint_rule.dart +++ b/lib/src/rules/avoid_empty_container/avoid_empty_container_lint_rule.dart @@ -45,14 +45,14 @@ class AvoidEmptyContainerLintRule extends DartLintRule { name: 'avoid_empty_container', problemMessage: 'Avoid an empty Container. Use SizedBox as a performance-friendly option since Container supports additional decoration and constraints, which may cause heavier processing.', - errorSeverity: ErrorSeverity.WARNING, + errorSeverity: DiagnosticSeverity.WARNING, ), ); @override void run( CustomLintResolver resolver, - ErrorReporter reporter, + DiagnosticReporter reporter, CustomLintContext context, ) { context.registry.addInstanceCreationExpression((node) { diff --git a/lib/src/rules/no_disabled_tests/no_disabled_tests_lint_rule.dart b/lib/src/rules/no_disabled_tests/no_disabled_tests_lint_rule.dart index 2e0993b..edea714 100644 --- a/lib/src/rules/no_disabled_tests/no_disabled_tests_lint_rule.dart +++ b/lib/src/rules/no_disabled_tests/no_disabled_tests_lint_rule.dart @@ -41,14 +41,14 @@ class NoDisabledTestsLintRule extends DartLintRule { code: LintCode( name: 'no_disabled_tests', problemMessage: 'Disallows disabled tests.', - errorSeverity: ErrorSeverity.WARNING, + errorSeverity: DiagnosticSeverity.WARNING, ), ); @override void run( CustomLintResolver resolver, - ErrorReporter reporter, + DiagnosticReporter reporter, CustomLintContext context, ) { context.registry.addFunctionExpression((node) { diff --git a/lib/src/rules/no_disabled_tests/no_disabled_tests_visitor.dart b/lib/src/rules/no_disabled_tests/no_disabled_tests_visitor.dart index 049d3db..9f44304 100644 --- a/lib/src/rules/no_disabled_tests/no_disabled_tests_visitor.dart +++ b/lib/src/rules/no_disabled_tests/no_disabled_tests_visitor.dart @@ -6,7 +6,7 @@ import 'package:custom_lint_builder/custom_lint_builder.dart'; class NoDisabledTestsVisitor extends RecursiveAstVisitor { NoDisabledTestsVisitor({required this.reporter, required this.lintCode}); - final ErrorReporter reporter; + final DiagnosticReporter reporter; final LintCode lintCode; @override diff --git a/lib/src/rules/use_setstate_synchronously/use_setstate_synchronously_lint_rule.dart b/lib/src/rules/use_setstate_synchronously/use_setstate_synchronously_lint_rule.dart index a2bfb80..1e4b640 100644 --- a/lib/src/rules/use_setstate_synchronously/use_setstate_synchronously_lint_rule.dart +++ b/lib/src/rules/use_setstate_synchronously/use_setstate_synchronously_lint_rule.dart @@ -66,14 +66,14 @@ class UseSetStateSynchronouslyLintRule extends DartLintRule { name: 'use_setstate_synchronously', problemMessage: 'Avoid calling setState across asynchronous gaps without seeing if the widget is mounted.', - errorSeverity: ErrorSeverity.WARNING, + errorSeverity: DiagnosticSeverity.WARNING, ), ); @override void run( CustomLintResolver resolver, - ErrorReporter reporter, + DiagnosticReporter reporter, CustomLintContext context, ) { context.registry.addMethodDeclaration((node) { diff --git a/lib/src/rules/use_setstate_synchronously/use_setstate_synchronously_visitor.dart b/lib/src/rules/use_setstate_synchronously/use_setstate_synchronously_visitor.dart index c40dba3..141368a 100644 --- a/lib/src/rules/use_setstate_synchronously/use_setstate_synchronously_visitor.dart +++ b/lib/src/rules/use_setstate_synchronously/use_setstate_synchronously_visitor.dart @@ -9,7 +9,7 @@ class UseSetstateSynchronouslyVisitor extends RecursiveAstVisitor { required this.lintCode, }); - final ErrorReporter reporter; + final DiagnosticReporter reporter; final LintCode lintCode; bool wrappedWithMounted = false; diff --git a/lib/src/rules/use_widget_ref_synchronously/use_widget_ref_synchronous_lint_rule.dart b/lib/src/rules/use_widget_ref_synchronously/use_widget_ref_synchronous_lint_rule.dart index ce0da75..cbc049f 100644 --- a/lib/src/rules/use_widget_ref_synchronously/use_widget_ref_synchronous_lint_rule.dart +++ b/lib/src/rules/use_widget_ref_synchronously/use_widget_ref_synchronous_lint_rule.dart @@ -47,14 +47,14 @@ class UseWidgetRefSynchronouslyLintRule extends DartLintRule { name: 'use_widget_ref_synchronously', problemMessage: 'Avoid using WidgetRef across asynchronous gaps without seeing if the widget is mounted.', - errorSeverity: ErrorSeverity.WARNING, + errorSeverity: DiagnosticSeverity.WARNING, ), ); @override void run( CustomLintResolver resolver, - ErrorReporter reporter, + DiagnosticReporter reporter, CustomLintContext context, ) { context.registry.addFunctionExpression((node) { diff --git a/lib/src/rules/use_widget_ref_synchronously/use_widget_ref_synchronously_visitor.dart b/lib/src/rules/use_widget_ref_synchronously/use_widget_ref_synchronously_visitor.dart index b5d98d3..01334b9 100644 --- a/lib/src/rules/use_widget_ref_synchronously/use_widget_ref_synchronously_visitor.dart +++ b/lib/src/rules/use_widget_ref_synchronously/use_widget_ref_synchronously_visitor.dart @@ -9,7 +9,7 @@ class UseWidgetRefSynchronouslyVisitor extends RecursiveAstVisitor { bool wrappedWithMounted = false; bool wrappedWithNotMounted = false; - final ErrorReporter reporter; + final DiagnosticReporter reporter; final LintCode lintCode; UseWidgetRefSynchronouslyVisitor({ @@ -20,7 +20,7 @@ class UseWidgetRefSynchronouslyVisitor extends RecursiveAstVisitor { @override void visitIfStatement(IfStatement node) { final classDecl = node.thisOrAncestorOfType(); - final superclass = classDecl?.extendsClause?.superclass.name2.toString(); + final superclass = classDecl?.extendsClause?.superclass.name.toString(); final condition = node.expression; final conditionFunc = superclass == 'ConsumerState' diff --git a/pubspec.lock b/pubspec.lock index 5431c55..4f25596 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,42 +5,42 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + sha256: c209688d9f5a5f26b2fb47a188131a6fb9e876ae9e47af3737c0b4f58a93470d url: "https://pub.dev" source: hosted - version: "80.0.0" + version: "91.0.0" analyzer: dependency: "direct main" description: name: analyzer - sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" + sha256: a40a0cee526a7e1f387c6847bd8a5ccbf510a75952ef8a28338e989558072cb0 url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "8.4.0" analyzer_plugin: dependency: "direct main" description: name: analyzer_plugin - sha256: b3075265c5ab222f8b3188342dcb50b476286394a40323e85d1fa725035d40a4 + sha256: "08cfefa90b4f4dd3b447bda831cecf644029f9f8e22820f6ee310213ebe2dd53" url: "https://pub.dev" source: hosted - version: "0.13.0" + version: "0.13.10" args: dependency: transitive description: name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.7.0" async: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: e2eb0491ba5ddb6177742d2da23904574082139b07c1e33b8503b9f46f3e1a37 url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.13.1" boolean_selector: dependency: transitive description: @@ -61,10 +61,10 @@ packages: dependency: transitive description: name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "2.0.4" ci: dependency: transitive description: @@ -73,6 +73,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.0" + cli_config: + dependency: transitive + description: + name: cli_config + sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec + url: "https://pub.dev" + source: hosted + version: "0.2.0" cli_util: dependency: transitive description: @@ -109,18 +117,18 @@ packages: dependency: transitive description: name: coverage - sha256: e3493833ea012784c740e341952298f1cc77f1f01b1bbc3eb4eecf6984fb7f43 + sha256: "5da775aa218eaf2151c721b16c01c7676fbfdd99cebba2bf64e8b807a28ff94d" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.15.0" crypto: dependency: transitive description: name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.0.7" csslib: dependency: transitive description: @@ -133,50 +141,50 @@ packages: dependency: transitive description: name: custom_lint - sha256: "409c485fd14f544af1da965d5a0d160ee57cd58b63eeaa7280a4f28cf5bda7f1" + sha256: "751ee9440920f808266c3ec2553420dea56d3c7837dd2d62af76b11be3fcece5" url: "https://pub.dev" source: hosted - version: "0.7.5" + version: "0.8.1" custom_lint_builder: dependency: "direct main" description: name: custom_lint_builder - sha256: "107e0a43606138015777590ee8ce32f26ba7415c25b722ff0908a6f5d7a4c228" + sha256: "1128db6f58e71d43842f3b9be7465c83f0c47f4dd8918f878dd6ad3b72a32072" url: "https://pub.dev" source: hosted - version: "0.7.5" + version: "0.8.1" custom_lint_core: dependency: transitive description: name: custom_lint_core - sha256: "31110af3dde9d29fb10828ca33f1dce24d2798477b167675543ce3d208dee8be" + sha256: "85b339346154d5646952d44d682965dfe9e12cae5febd706f0db3aa5010d6423" url: "https://pub.dev" source: hosted - version: "0.7.5" + version: "0.8.1" custom_lint_visitor: dependency: transitive description: name: custom_lint_visitor - sha256: "36282d85714af494ee2d7da8c8913630aa6694da99f104fb2ed4afcf8fc857d8" + sha256: "91f2a81e9f0abb4b9f3bb529f78b6227ce6050300d1ae5b1e2c69c66c7a566d8" url: "https://pub.dev" source: hosted - version: "1.0.0+7.3.0" + version: "1.0.0+8.4.0" dart_style: dependency: transitive description: name: dart_style - sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + sha256: a9c30492da18ff84efe2422ba2d319a89942d93e58eb0b73d32abe822ef54b7b url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.3" fake_async: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.3" file: dependency: transitive description: @@ -202,10 +210,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -215,10 +223,10 @@ packages: dependency: transitive description: name: freezed_annotation - sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b + sha256: "7294967ff0a6d98638e7acb774aac3af2550777accd8149c90af5b014e6d44d8" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.1.0" frontend_server_client: dependency: transitive description: @@ -239,26 +247,26 @@ packages: dependency: transitive description: name: hotreloader - sha256: bc167a1163807b03bada490bfe2df25b0d744df359227880220a5cbd04e5734b + sha256: "66871df468fc24eee81f1a0a7cb98acc104716f9b7376d355437b48d633c4ebf" url: "https://pub.dev" source: hosted - version: "4.3.0" + version: "4.4.0" html: dependency: transitive description: name: html - sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" url: "https://pub.dev" source: hosted - version: "0.15.5" + version: "0.15.6" http: dependency: transitive description: name: http - sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.6.0" http_multi_server: dependency: transitive description: @@ -295,42 +303,42 @@ packages: dependency: transitive description: name: json_annotation - sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8 url: "https://pub.dev" source: hosted - version: "4.9.0" + version: "4.11.0" leak_tracker: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.10" leak_tracker_testing: dependency: transitive description: name: leak_tracker_testing - sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" lints: dependency: transitive description: name: lints - sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df" url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "6.1.0" logging: dependency: transitive description: @@ -343,10 +351,10 @@ packages: dependency: transitive description: name: markdown - sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" + sha256: ee85086ad7698b42522c6ad42fe195f1b9898e4d974a1af4576c1a3a176cada9 url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "7.3.1" matcher: dependency: transitive description: @@ -367,10 +375,10 @@ packages: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" mime: dependency: transitive description: @@ -391,18 +399,18 @@ packages: dependency: transitive description: name: package_config - sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.0" pana: dependency: "direct dev" description: name: pana - sha256: "3bd9ca2adbfdb9a3ac0fc75039a1a007811826ade9bc05cf3a30b803812f99f8" + sha256: ae025b2c224f225ca6dd79fb61d0397b9ab8bdb3fcfa2f9b956ffb5f1b6be650 url: "https://pub.dev" source: hosted - version: "0.22.18" + version: "0.23.11" path: dependency: transitive description: @@ -415,18 +423,18 @@ packages: dependency: transitive description: name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" url: "https://pub.dev" source: hosted - version: "1.5.1" + version: "1.5.2" pub_semver: dependency: transitive description: name: pub_semver - sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.2.0" pubspec_parse: dependency: transitive description: @@ -516,18 +524,10 @@ packages: dependency: transitive description: name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" - url: "https://pub.dev" - source: hosted - version: "1.10.1" - sprintf: - dependency: transitive - description: - name: sprintf - sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "1.10.2" stack_trace: dependency: transitive description: @@ -560,14 +560,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.1" - tar: - dependency: transitive - description: - name: tar - sha256: "8e67ab1baa07d3ef2c5d52cfb84e7ed4742799141e9e2ac3d0801a1a7ccb7575" - url: "https://pub.dev" - source: hosted - version: "2.0.0" term_glyph: dependency: transitive description: @@ -580,26 +572,26 @@ packages: dependency: transitive description: name: test - sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" + sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" url: "https://pub.dev" source: hosted - version: "1.25.15" + version: "1.26.3" test_api: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.7" test_core: dependency: transitive description: name: test_core - sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" + sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" url: "https://pub.dev" source: hosted - version: "0.6.8" + version: "0.6.12" typed_data: dependency: transitive description: @@ -612,34 +604,34 @@ packages: dependency: transitive description: name: uuid - sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + sha256: "1fef9e8e11e2991bb773070d4656b7bd5d850967a2456cfc83cf47925ba79489" url: "https://pub.dev" source: hosted - version: "4.5.1" + version: "4.5.3" vector_math: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" vm_service: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: "0016aef94fc66495ac78af5859181e3f3bf2026bd8eecc72b9565601e19ab360" url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "15.2.0" watcher: dependency: transitive description: name: watcher - sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.1" web: dependency: transitive description: @@ -652,18 +644,18 @@ packages: dependency: transitive description: name: web_socket - sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c" url: "https://pub.dev" source: hosted - version: "0.1.6" + version: "1.0.1" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" + sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8 url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" webkit_inspection_protocol: dependency: transitive description: @@ -681,5 +673,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.7.0 <4.0.0" + dart: ">=3.9.0 <4.0.0" flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml index 0cfe35c..619c21b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,12 +16,12 @@ environment: dependencies: flutter: sdk: flutter - analyzer: 7.3.0 - analyzer_plugin: 0.13.0 - custom_lint_builder: 0.7.5 + analyzer: 8.4.0 + analyzer_plugin: 0.13.10 + custom_lint_builder: 0.8.1 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: 5.0.0 - pana: 0.22.18 + flutter_lints: 6.0.0 + pana: 0.23.11 From 794957c2b5b28049a0de31a74b3fae96f0518cb4 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 10:36:08 +0900 Subject: [PATCH 06/19] dev: pinned at the latest --- .github/workflows/code-analysis.yml | 16 ++++++++-------- .github/workflows/publish.yml | 10 +++++----- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/code-analysis.yml b/.github/workflows/code-analysis.yml index 06a97b6..22a6aaa 100644 --- a/.github/workflows/code-analysis.yml +++ b/.github/workflows/code-analysis.yml @@ -19,7 +19,7 @@ jobs: timeout-minutes: 10 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 1 @@ -27,17 +27,17 @@ jobs: run: | mkdir -p $HOME/.ssh/ - - uses: kuhnroyal/flutter-fvm-config-action@v2 + - uses: kuhnroyal/flutter-fvm-config-action@c378498f1d1962d33039c3989411093ef8a17b2c # v3.3 id: fvm-config-action - - uses: subosito/flutter-action@v2.18.0 + - uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 # v2.23.0 with: channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }} flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }} cache: true - name: restore pubspec dependencies cache - uses: actions/cache@v4 + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 id: pubspec_cache_id with: path: | @@ -58,21 +58,21 @@ jobs: needs: setup steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 1 - - uses: kuhnroyal/flutter-fvm-config-action@v3 + - uses: kuhnroyal/flutter-fvm-config-action@c378498f1d1962d33039c3989411093ef8a17b2c # v3.3 id: fvm-config-action - - uses: subosito/flutter-action@v2.18.0 + - uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 # v2.23.0 with: channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }} flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }} cache: true - name: restore pubspec dependencies cache - uses: actions/cache@v4 + uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 id: pubspec_cache_id with: path: | diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index eb84bc2..74afa1f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,21 +15,21 @@ jobs: id-token: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 1 - - uses: offich/flutter-fvm-dart-sdk-action@v1 + - uses: offich/flutter-fvm-dart-sdk-action@8d5d0226e69fa1f55eb68662f10525b5c5473eff # v1 id: flutter-fvm-dart-sdk-version - - uses: dart-lang/setup-dart@v1 + - uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260 # v1.7.2 with: sdk: ${{ steps.flutter-fvm-dart-sdk-version.outputs.dart-version }} - - uses: kuhnroyal/flutter-fvm-config-action@v3 + - uses: kuhnroyal/flutter-fvm-config-action@c378498f1d1962d33039c3989411093ef8a17b2c # v3.3 id: fvm-config-action - - uses: subosito/flutter-action@v2.18.0 + - uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2 # v2.23.0 with: channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }} flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }} From 6928b61a522c87b0da05c20f42b312ccb995d502 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 10:51:44 +0900 Subject: [PATCH 07/19] dev: install markdownlint-cli --- .gitignore | 2 + .markdownlint-cli2.yaml | 3 + mise.toml | 2 + package.json | 20 ++ pnpm-lock.yaml | 713 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 740 insertions(+) create mode 100644 .markdownlint-cli2.yaml create mode 100644 mise.toml create mode 100644 package.json create mode 100644 pnpm-lock.yaml diff --git a/.gitignore b/.gitignore index c0e2e1d..85d2b88 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,5 @@ build/ .fvm/ .mcp.json + +node_modules diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml new file mode 100644 index 0000000..4e6106f --- /dev/null +++ b/.markdownlint-cli2.yaml @@ -0,0 +1,3 @@ +config: + MD013: + code_blocks: false diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..20fedfa --- /dev/null +++ b/mise.toml @@ -0,0 +1,2 @@ +[tools] +node = "25.9.0" diff --git a/package.json b/package.json new file mode 100644 index 0000000..0a0e3e9 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "gintonic", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "lint": "npm run lint:markdown", + "lint:fix": "npm run lint:markdown:fix", + "lint:markdown": "markdownlint-cli2 docs/**/*.md .claude/**/*.md CHANGELOG.md", + "lint:markdown:fix": "markdownlint-cli2 --fix docs/**/*.md .claude/**/*.md CHANGELOG.md" + }, + "keywords": [], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.11.1", + "devDependencies": { + "markdownlint-cli2": "0.22.0" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..15e8353 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,713 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + markdownlint-cli2: + specifier: 0.22.0 + version: 0.22.0 + +packages: + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/katex@0.16.8': + resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + get-east-asian-width@1.5.0: + resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} + engines: {node: '>=18'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globby@16.1.1: + resolution: {integrity: sha512-dW7vl+yiAJSp6aCekaVnVJxurRv7DCOLyXqEG3RYMYUg7AuJ2jCqPkZTA8ooqC2vtnkaMcV5WfFBMuEnTu1OQg==} + engines: {node: '>=20'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + + katex@0.16.45: + resolution: {integrity: sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==} + hasBin: true + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + markdown-it@14.1.1: + resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} + hasBin: true + + markdownlint-cli2-formatter-default@0.0.6: + resolution: {integrity: sha512-VVDGKsq9sgzu378swJ0fcHfSicUnMxnL8gnLm/Q4J/xsNJ4e5bA6lvAz7PCzIl0/No0lHyaWdqVD2jotxOSFMQ==} + peerDependencies: + markdownlint-cli2: '>=0.0.4' + + markdownlint-cli2@0.22.0: + resolution: {integrity: sha512-mOC9BY/XGtdX3M9n3AgERd79F0+S7w18yBBTNIQ453sI87etZfp1z4eajqSMV70CYjbxKe5ktKvT2HCpvcWx9w==} + engines: {node: '>=20'} + hasBin: true + + markdownlint@0.40.0: + resolution: {integrity: sha512-UKybllYNheWac61Ia7T6fzuQNDZimFIpCg2w6hHjgV1Qu0w1TV0LlSgryUGzM0bkKQCBhy2FDhEELB73Kb0kAg==} + engines: {node: '>=20'} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-directive@4.0.0: + resolution: {integrity: sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + smol-toml@1.6.0: + resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} + engines: {node: '>= 18'} + + string-width@8.1.0: + resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + engines: {node: '>=20'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} + +snapshots: + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@sindresorhus/merge-streams@4.0.0': {} + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/katex@0.16.8': {} + + '@types/ms@2.1.0': {} + + '@types/unist@2.0.11': {} + + ansi-regex@6.2.2: {} + + argparse@2.0.1: {} + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + commander@8.3.0: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + entities@4.5.0: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + get-east-asian-width@1.5.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globby@16.1.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + is-path-inside: 4.0.0 + slash: 5.1.0 + unicorn-magic: 0.4.0 + + ignore@7.0.5: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-decimal@2.0.1: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-number@7.0.0: {} + + is-path-inside@4.0.0: {} + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsonc-parser@3.3.1: {} + + jsonpointer@5.0.1: {} + + katex@0.16.45: + dependencies: + commander: 8.3.0 + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + markdown-it@14.1.1: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + markdownlint-cli2-formatter-default@0.0.6(markdownlint-cli2@0.22.0): + dependencies: + markdownlint-cli2: 0.22.0 + + markdownlint-cli2@0.22.0: + dependencies: + globby: 16.1.1 + js-yaml: 4.1.1 + jsonc-parser: 3.3.1 + jsonpointer: 5.0.1 + markdown-it: 14.1.1 + markdownlint: 0.40.0 + markdownlint-cli2-formatter-default: 0.0.6(markdownlint-cli2@0.22.0) + micromatch: 4.0.8 + smol-toml: 1.6.0 + transitivePeerDependencies: + - supports-color + + markdownlint@0.40.0: + dependencies: + micromark: 4.0.2 + micromark-core-commonmark: 2.0.3 + micromark-extension-directive: 4.0.0 + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-math: 3.1.0 + micromark-util-types: 2.0.2 + string-width: 8.1.0 + transitivePeerDependencies: + - supports-color + + mdurl@2.0.0: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-directive@4.0.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + parse-entities: 4.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.8 + devlop: 1.1.0 + katex: 0.16.45 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + ms@2.1.3: {} + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + picomatch@2.3.2: {} + + punycode.js@2.3.1: {} + + queue-microtask@1.2.3: {} + + reusify@1.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + slash@5.1.0: {} + + smol-toml@1.6.0: {} + + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.5.0 + strip-ansi: 7.2.0 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + uc.micro@2.1.0: {} + + unicorn-magic@0.4.0: {} From b43e499dae34ab07954dc74e0cfc86993d6a15c1 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 10:52:04 +0900 Subject: [PATCH 08/19] chore: lintfix --- .claude/skills/create-pr/SKILL.md | 6 +- .claude/skills/review-pr/SKILL.md | 86 +++++++++---------- CHANGELOG.md | 2 + docs/dev/review-guideline.md | 136 +++++++++++++++--------------- 4 files changed, 117 insertions(+), 113 deletions(-) diff --git a/.claude/skills/create-pr/SKILL.md b/.claude/skills/create-pr/SKILL.md index d9a46af..99a31c0 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 cf66101..bce4a8d 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 d7372ae..fe8a68f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +# Changelog + ## 0.3.0 * Add the following lint: diff --git a/docs/dev/review-guideline.md b/docs/dev/review-guideline.md index ae8b254..c79a59c 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 内でクラッシュ・フリーズ・データ化け・メモリリークを引き起こす可能性のある問題を重点的にチェックしてください。 @@ -26,70 +26,72 @@ 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` ウィジェットがルートに配置されているか +- [ ] 既存コードの整合性 --- @@ -97,30 +99,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. **具体的修正コード例** - - 修正前後のコード比較 - - 推奨実装パターン +- 修正前後のコード比較 +- 推奨実装パターン --- @@ -243,6 +245,6 @@ Future handler(String method, Map para ## オプション - - `--pre-commit` : コミット前チェックモード(より厳密なレビュー) - - `--focus=performance` : 特定の観点に絞ったレビュー - - `--japanese` : 日本語でのレビュー結果出力 +- `--pre-commit` : コミット前チェックモード(より厳密なレビュー) +- `--focus=performance` : 特定の観点に絞ったレビュー +- `--japanese` : 日本語でのレビュー結果出力 From 188637ab2f002a42d73037b187c3df5e9e019309 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 11:03:12 +0900 Subject: [PATCH 09/19] dev: add docs-analysis workflow --- .github/workflows/docs-analysis.yml | 51 +++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/docs-analysis.yml diff --git a/.github/workflows/docs-analysis.yml b/.github/workflows/docs-analysis.yml new file mode 100644 index 0000000..cbea7d0 --- /dev/null +++ b/.github/workflows/docs-analysis.yml @@ -0,0 +1,51 @@ +name: 'docs-analysis' + +on: + push: + paths: + - 'CHANGELOG.md' + - '.claude/**/*.md' + - 'docs/**/*.md' + - 'package.json' + - 'pnpm-lock.yaml' + - '.markdownlint-cli2.yaml' + - '.github/workflows/docs-analysis.yml' + + branches-ignore: + - release + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + lint-markdown: + runs-on: ubuntu-24.04 + timeout-minutes: 10 + + steps: + - name: checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 1 + + - uses: jdx/mise-action@1648a7812b9aeae629881980618f079932869151 # v4.0.1 + + - uses: pnpm/action-setup@b307475762933b98ed359c036b0e51f26b63b74b # v5.0.0 + + - name: get pnpm store path + id: pnpm-store + run: echo "path=$(pnpm store path)" >> $GITHUB_OUTPUT + + - uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 + id: pnpm-cache + with: + path: ${{ steps.pnpm-store.outputs.path }} + key: pnpm-${{ hashFiles('pnpm-lock.yaml') }} + + - name: install dependencies + if: steps.pnpm-cache.outputs.cache-hit != 'true' + run: pnpm install + + - name: lint markdown + run: pnpm run lint:markdown From 73429c907e3afdf3a2ffee897183753a101b5f9d Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 11:16:12 +0900 Subject: [PATCH 10/19] dev: bump minor --- example/pubspec.lock | 2 +- example/pubspec.yaml | 2 +- pubspec.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index 4e1bc72..f1ff13d 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -553,7 +553,7 @@ packages: path: ".." relative: true source: path - version: "0.3.0" + version: "0.4.0" shelf: dependency: transitive description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 2d45e47..16bb8e8 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -1,6 +1,6 @@ name: example description: "A new Flutter package project." -version: 0.3.0 +version: 0.4.0 homepage: environment: diff --git a/pubspec.yaml b/pubspec.yaml index 619c21b..e185f6d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: sangria_lints description: "Lint Rules for personal developments created by custom_lint_builder package." -version: 0.3.0 +version: 0.4.0 homepage: https://offich.me repository: https://github.com/offich/sangria issue_tracker: https://github.com/offich/sangria/issues From 5df369a3316b66f81de93c3780eea0c96e1a5889 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 11:24:22 +0900 Subject: [PATCH 11/19] dev: add create release pr --- .github/templates/git-pr-release.erb | 9 +++++++ .github/workflows/create-release-pr.yml | 33 +++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 .github/templates/git-pr-release.erb create mode 100644 .github/workflows/create-release-pr.yml diff --git a/.github/templates/git-pr-release.erb b/.github/templates/git-pr-release.erb new file mode 100644 index 0000000..613926a --- /dev/null +++ b/.github/templates/git-pr-release.erb @@ -0,0 +1,9 @@ +【Production Release】<%= Time.now.strftime('%Y-%m-%d %H:%M') %> + +## Description +Distribute DevTool extension :rocket: + +## Target PR +<% pull_requests.each do |pr| -%> +- #<%= pr.number %> by <%= pr.mention %> +<% end -%> diff --git a/.github/workflows/create-release-pr.yml b/.github/workflows/create-release-pr.yml new file mode 100644 index 0000000..4816999 --- /dev/null +++ b/.github/workflows/create-release-pr.yml @@ -0,0 +1,33 @@ +name: Create Production Release PR + +on: + push: + branches: [develop] + +permissions: + contents: read + pull-requests: write + +jobs: + release-pull-request: + runs-on: ubuntu-latest + steps: + - name: Checkout Branch + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Setup Ruby + uses: ruby/setup-ruby@3ff19f5e2baf30647122352b96108b1fbe250c64 # v1.299.0 + with: + ruby-version: 3.3 + bundler-cache: true + + - run: gem install --no-document git-pr-release + + - run: git-pr-release + env: + GIT_PR_RELEASE_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GIT_PR_RELEASE_BRANCH_PRODUCTION: release + GIT_PR_RELEASE_BRANCH_STAGING: develop + GIT_PR_RELEASE_LABELS: release + GIT_PR_RELEASE_TEMPLATE: .github/templates/git-pr-release.erb + TZ: Asia/Tokyo From 07ff755f0064c1a92934435ff9312b7aeafed203 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 11:39:56 +0900 Subject: [PATCH 12/19] dev: create tag and release --- .github/workflows/publish.yml | 51 +++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 74afa1f..6b4fd2a 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -2,8 +2,8 @@ name: Publish on: push: - tags: - - "v*" + branches: + - release jobs: publish: @@ -39,3 +39,50 @@ jobs: - name: Publish run: dart pub publish --force + + release: + runs-on: ubuntu-latest + timeout-minutes: 10 + + permissions: + contents: write + + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 0 + + - name: Extract version from pubspec.yaml + id: version + run: | + VERSION=$(grep '^version:' pubspec.yaml | awk '{print $2}') + VERSION_NAME=$(echo $VERSION | cut -d'+' -f1) + TAG_NAME="v${VERSION}" + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "version_name=$VERSION_NAME" >> $GITHUB_OUTPUT + echo "tag_name=$TAG_NAME" >> $GITHUB_OUTPUT + echo "Version: $VERSION (Tag: $TAG_NAME)" + + - name: Create and push tag + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git tag -a ${{ steps.version.outputs.tag_name }} -m "Release ${{ steps.version.outputs.version }}" + git push origin ${{ steps.version.outputs.tag_name }} + + - name: Extract release notes from CHANGELOG + id: release_notes + uses: octivi/release-notes-from-changelog@7e6de14efd823919839acf82f08041f885c8fca9 # v1.0.0 + with: + tag: ${{ steps.version.outputs.tag_name }} + changelog: CHANGELOG.md + + - name: Create GitHub Release + uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2.6.1 + with: + tag_name: ${{ steps.version.outputs.tag_name }} + name: Release ${{ steps.version.outputs.version }} + body_path: ${{ steps.release_notes.outputs.release_notes }} + draft: false + prerelease: false From 36ee744c7f3ba1f99928726dbafe31a078c464d4 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 11:53:58 +0900 Subject: [PATCH 13/19] 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 14/19] 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 15/19] 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 From 0fe96c6498c60cdbf99811ebcafabad72e93fb20 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 11:14:52 +0900 Subject: [PATCH 16/19] dev: install cider --- pubspec.lock | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ pubspec.yaml | 1 + 2 files changed, 49 insertions(+) diff --git a/pubspec.lock b/pubspec.lock index 4f25596..3f96579 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -49,6 +49,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + change: + dependency: transitive + description: + name: change + sha256: "3bda1ce98526b21927cdea05688563c7065fd7e66d1abbe176c354fef3b2057b" + url: "https://pub.dev" + source: hosted + version: "0.7.5" characters: dependency: transitive description: @@ -73,6 +81,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.1.0" + cider: + dependency: "direct dev" + description: + name: cider + sha256: "27b9cd9526c70d6cd47299cd644cddaac8102e5f9783ef4bb440840743271883" + url: "https://pub.dev" + source: hosted + version: "0.2.10" cli_config: dependency: transitive description: @@ -283,6 +299,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + intl: + dependency: transitive + description: + name: intl + sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5" + url: "https://pub.dev" + source: hosted + version: "0.20.2" io: dependency: transitive description: @@ -355,6 +379,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.3.1" + marker: + dependency: transitive + description: + name: marker + sha256: "3dadd01f3b0ffae148ffb3b1bc04290a98e54a465cddbab59727bd2a9fe57750" + url: "https://pub.dev" + source: hosted + version: "0.6.0" matcher: dependency: transitive description: @@ -451,6 +483,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + rfc_6901: + dependency: transitive + description: + name: rfc_6901 + sha256: "6a43b1858dca2febaf93e15639aa6b0c49ccdfd7647775f15a499f872b018154" + url: "https://pub.dev" + source: hosted + version: "0.2.1" rxdart: dependency: transitive description: @@ -616,6 +656,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.0" + version_manipulation: + dependency: transitive + description: + name: version_manipulation + sha256: e90782d610bde19765d2808ec06bc8ed9e04640a4dd07d1a3d370728ce9dae7f + url: "https://pub.dev" + source: hosted + version: "0.2.0" vm_service: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index e185f6d..c53a6b5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,3 +25,4 @@ dev_dependencies: sdk: flutter flutter_lints: 6.0.0 pana: 0.23.11 + cider: 0.2.10 From 2f8e82936ed8d5cc255438a9ebd49b5c5870e3e3 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 12:49:34 +0900 Subject: [PATCH 17/19] docs: format CHANGELOG.md --- CHANGELOG.md | 65 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc0a5db..479be43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,37 +1,62 @@ # Changelog -## 0.3.0 +## [0.3.0] - 2025-05-16 - * Add the following lint: - * `use_widget_ref_synchronously` +### Added -## 0.2.0 + - Add the following lint: + - `use_widget_ref_synchronously` - * Added the following lint: - * `no_disabled_tests` +## [0.2.0] - 2025-04-17 -## 0.1.0 +### Added - * Added the following lint: - * `avoid_empty_container` + - Added the following lint: + - `no_disabled_tests` -## 0.0.3 +## [0.1.0] - 2025-04-15 - * Publish with example directory included. +### Added -## 0.0.2 + - Added the following lint: + - `avoid_empty_container` - * Improve score on pub.dev - * Fix automatic deployment by GitHub Actions +## [0.0.3] - 2025-03-10 -## 0.0.1 +### Fixed - * Modify README.md + - Publish with example directory included. -## 0.0.1-dev.2 +## [0.0.2] - 2025-03-10 - * Downgraded required dart sdk version to 3.6.2. +### Fixed -## 0.0.1-dev.1 + - Improve score on pub.dev + - Fix automatic deployment by GitHub Actions - * Initial release. This package is under construction. +## [0.0.1] - 2025-03-09 + +### Changed + + - Modify README.md + +## [0.0.1-dev.2] - 2025-03-09 + +### Changed + + - Downgraded required dart sdk version to 3.6.2. + +## [0.0.1-dev.1] - 2025-03-09 + +### Added + + - Initial release. This package is under construction. + +[0.3.0]: https://github.com/offich/sangria/compare/v0.2.0...v0.3.0 +[0.2.0]: https://github.com/offich/sangria/compare/v0.1.0...v0.2.0 +[0.1.0]: https://github.com/offich/sangria/compare/v0.0.3...v0.1.0 +[0.0.3]: https://github.com/offich/sangria/compare/v0.0.2...v0.0.3 +[0.0.2]: https://github.com/offich/sangria/compare/v0.0.1...v0.0.2 +[0.0.1]: https://github.com/offich/sangria/compare/v0.0.1-dev.2...v0.0.1 +[0.0.1-dev.2]: https://github.com/offich/sangria/compare/v0.0.1-dev.1...v0.0.1-dev.2 +[0.0.1-dev.1]: https://github.com/offich/sangria/releases/tag/v0.0.1-dev.1 From b3a6f06e02898ac6c18873415e5babe4a766f02a Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 12:50:47 +0900 Subject: [PATCH 18/19] docs: update changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 479be43..b3f166f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### Added + + - dev: Flutter 3.38.10 + ## [0.3.0] - 2025-05-16 ### Added From 1cbb6e913e1a30ec6af60331a943c34b9a073cc6 Mon Sep 17 00:00:00 2001 From: ume-kun1015 Date: Sat, 2 May 2026 13:24:45 +0900 Subject: [PATCH 19/19] release 0.4.0 --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3f166f..2c16ae5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Unreleased +## 0.4.0 - 2026-05-02 ### Added