diff --git a/.claude/rules/coding-style.md b/.claude/rules/coding-style.md new file mode 100644 index 0000000..598e8eb --- /dev/null +++ b/.claude/rules/coding-style.md @@ -0,0 +1,129 @@ +--- +paths: ["lib/**", "test/**"] +--- + +# コーディング規約 (Coding Standards) + +本ドキュメントでは,SmTIAS-Capture プロジェクトの Dart / Flutter コーディング規約を定義する. +基本方針として [Effective Dart](https://dart.dev/effective-dart) に準拠し,プロジェクト固有のルールのみ本書で定める. + +## フォーマット (Formatting) + +- `dart format` のデフォルト設定に従う(行幅 80 文字) +- VS Code の「保存時フォーマット」を有効にする(`.vscode/settings.json` で設定済み) +- 手動でのフォーマット調整は行わない + +## 命名規則 (Naming Conventions) + +Effective Dart の命名規則に従う.プロジェクト固有の補足は以下の通り. + +| 対象 | 規則 | 例 | +| --- | --- | --- | +| ファイル名 | snake_case | `camera_provider.dart` | +| クラス名 | UpperCamelCase | `CameraProvider` | +| 変数・関数 | lowerCamelCase | `takePhoto()` | +| 定数 | lowerCamelCase | `defaultImageQuality` | +| プライベート | 先頭に `_` | `_controller` | +| Provider | `〇〇Provider` | `CameraProvider` | +| Service | `〇〇Service` | `FileService` | +| Screen(画面) | `〇〇Screen` | `CaptureScreen` | +| Widget(部品) | 機能を表す名前 | `ShutterButton` | + +## import 順序 (Import Order) + +以下の順序で記述し,各グループ間は空行で区切る. + +```dart +// 1. Dart SDK +import 'dart:async'; +import 'dart:io'; + +// 2. Flutter SDK +import 'package:flutter/material.dart'; + +// 3. 外部パッケージ(pub.dev) +import 'package:camera/camera.dart'; +import 'package:provider/provider.dart'; + +// 4. プロジェクト内 +import 'package:smtias_capture/providers/camera_provider.dart'; +import 'package:smtias_capture/services/file_service.dart'; +``` + +※ `dart fix --apply` および `dart format` で自動整列されるため,手動調整は不要. + +## ディレクトリ構造 (Directory Structure) + +[SPEC_03 アーキテクチャと非機能](../../docs/04_SPEC/SPEC_03_アーキテクチャと非機能.md) のアーキテクチャセクションで定義したディレクトリ構成に従う. + +```text +lib/ +├── main.dart # エントリポイント,Provider 登録 +├── app.dart # MaterialApp,テーマ +├── providers/ # 状態管理(ChangeNotifier) +├── screens/ # 画面(Scaffold 単位) +├── widgets/ # 再利用可能な UI 部品 +└── services/ # 外部リソースとの橋渡し +``` + +### 配置ルール + +- **1 ファイル 1 クラス** を原則とする.ファイル名はクラス名の snake_case 版 +- **screens/**: 各画面に対応する 1 ファイル.画面固有のロジックは対応する Provider に置く +- **widgets/**: 複数画面で再利用する UI 部品,または画面ファイルが大きくなった場合に切り出す部品 +- **providers/**: 画面または機能ごとに 1 ファイル.ChangeNotifier を継承する +- **services/**: プラットフォーム API やファイルシステムへのアクセスを担う + +## 型の使い方 (Type Usage) + +- ローカル変数は型推論(`var` / `final`)を活用する +- 関数の引数・戻り値には明示的に型を記述する +- `dynamic` は避け,`Object?` を使用する +- `final` をデフォルトとし,再代入が必要な場合のみ `var` を使用する + +## エラーハンドリング (Error Handling) + +### 基本方針 + +- **Service 層**: 例外をキャッチし,呼び出し元に結果を返す.想定外の例外はそのまま上位に伝播させる +- **Provider 層**: Service の結果を受け取り,状態(エラーメッセージ等)として保持する +- **Screen 層**: Provider の状態を参照し,ユーザーにフィードバックを表示する(スナックバー等) + +### 想定するエラー + +| エラー | 発生箇所 | 対処 | +| --- | --- | --- | +| カメラ初期化失敗 | CameraProvider | エラーメッセージを画面に表示 | +| パーミッション拒否 | PermissionService | 設定画面への誘導を表示 | +| ストレージ書き込み失敗 | FileService | スナックバーでエラー通知 | +| ファイル削除失敗 | FileService | スナックバーでエラー通知 | + +### ログ出力 + +- 開発中は `debugPrint()` を使用する(リリースビルドでは自動的に無効化される) +- `print()` は使用しない + +## ドキュメント (Documentation) + +### コード内コメント + +- **DartDoc コメント(`///`)**: 公開 API(public なクラス・メソッド)に記述する +- **実装コメント(`//`)**: ロジックが自明でない箇所にのみ記述する +- 「何をしているか」ではなく「なぜそうしているか」を書く + +### DartDoc の書き方 + +```dart +/// 撮影画像を PNG 形式で共有ストレージに保存する. +/// +/// [imageBytes] は JPEG エンコード済みの画像データ. +/// 保存先は `Pictures/MiniTIAS/` ディレクトリ. +/// 同秒の重複ファイルが存在する場合は連番サフィックスを付与する. +Future saveImage(Uint8List imageBytes) async { + // ... +} +``` + +- 1 行目は動詞で始める簡潔な要約(句点で終わる) +- 詳細が必要な場合は空行を挟んで続ける +- パラメータの説明は `[paramName]` 記法を使用する diff --git a/.claude/rules/testing.md b/.claude/rules/testing.md new file mode 100644 index 0000000..38368f0 --- /dev/null +++ b/.claude/rules/testing.md @@ -0,0 +1,97 @@ +--- +paths: ["test/**", "**/*_test.dart"] +--- + +# テスト方針 (Testing Strategy) + +本ドキュメントでは,SmTIAS-Capture プロジェクトのテスト方針を定義する. + +## 基本方針 (Principles) + +- 初期フェーズではカメラ・ストレージ等のハードウェア依存が大きいため,**実機での手動確認を主体** とする +- ハードウェアに依存しないロジック(ファイル命名,重複回避等)には **Unit テスト** を書く +- テストは `flutter test` で実行できる状態を維持する +- ネイティブ(Kotlin)コードは原則として実機手動確認に委ねるが,**研究データの正確性に直結する純粋な数理ロジック**(例: 画素統計の mean/max/p99/飽和率)は Android Framework に依存しない形に分離し,**JUnit で単体テスト**する(実機不要・`./gradlew test` で実行) + +## テストの種類と対象 (Test Types) + +| 種類 | 対象 | 実施方法 | +| --- | --- | --- | +| Unit テスト | Service 層のロジック(ファイル命名,重複回避等) | `flutter test` | +| Widget テスト | 画面の基本的な UI 構成(ボタンの存在等) | `flutter test` | +| 手動確認 | カメラプレビュー,撮影,保存,削除の E2E 動作 | 実機(AQUOS sense3) | + +※ Integration テスト(`flutter drive`)は初期フェーズでは導入しない. + +## Unit テスト + +### 対象 + +- `FileService` — ファイル名生成ロジック,重複回避ロジック +- `PermissionService` — パーミッション状態の判定ロジック(モック使用) + +### ファイル配置 + +```text +test/ +├── services/ +│ ├── file_service_test.dart +│ └── permission_service_test.dart +└── providers/ + └── gallery_provider_test.dart +``` + +### 命名規則 + +- テストファイル名: `{対象ファイル名}_test.dart` +- テストグループ: `group('クラス名',)` でクラス単位にまとめる +- テスト名: 日本語で「〜の場合,〜する」形式 + +```dart +group('FileService', () { + test('同秒のファイルが存在しない場合,サフィックスなしのファイル名を返す', () { + // ... + }); + + test('同秒のファイルが存在する場合,連番サフィックスを付与する', () { + // ... + }); +}); +``` + +## Widget テスト + +### 対象 + +- 画面に必要な UI 要素が存在すること(シャッターボタン,ナビゲーションバー等) +- ボタンタップ時に Provider のメソッドが呼ばれること(モック使用) + +### 方針 + +- カメラプレビューはモック化する(`camera` パッケージのウィジェットは Widget テストで動作しない) +- Provider は `ChangeNotifierProvider.value` でモックを注入する + +## 手動確認 (Manual Testing) + +### 確認項目 + +実装完了時に以下を実機で確認する. + +- [ ] カメラプレビューが正しく表示される(180° 回転) +- [ ] シャッターボタンで撮影できる +- [ ] 撮影画像が `Pictures/MiniTIAS/` に PNG で保存される +- [ ] ファイル名が命名規則に従っている +- [ ] 連続撮影が正常に動作する +- [ ] 一覧画面にサムネイルが表示される +- [ ] サムネイルタップで拡大表示される +- [ ] 画像の削除ができる +- [ ] パーミッション拒否時に適切なメッセージが表示される +- [ ] アプリをバックグラウンド→復帰してもカメラが正常に動作する + +## テスト実行タイミング (When to Test) + +| タイミング | 実施内容 | +| --- | --- | +| 機能実装完了時 | 対応する Unit / Widget テストを作成・実行 | +| コミット前 | `flutter test` を実行し全テストが通ることを確認 | +| PR 作成前 | 手動確認項目のうち関連するものを実機で確認 | diff --git a/.claude/template-sync-sha b/.claude/template-sync-sha index f621bff..3244957 100644 --- a/.claude/template-sync-sha +++ b/.claude/template-sync-sha @@ -1 +1 @@ -4dfcf605e72eb6cc3cf7d39b9b0e7513b161a5e8 +061d1c4503651fc60c87587458d1cd583f5586a6 diff --git a/.gitignore b/.gitignore index 9a16574..3066bac 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,9 @@ .claude/auto-refactor-skip.md .claude/auto-refactor-doc-review.md .claude/auto-refactor-test-review.md +# 個人・マシン固有の Claude 設定(共有 settings.json を汚さない) +.claude/settings.local.json +# /auto-audit のローカル運用状態(報告台帳・修正済み台帳・スキップ台帳) +.claude/auto-audit-report.md +.claude/auto-audit-fixed.md +.claude/auto-audit-skip.md diff --git a/CLAUDE.md b/CLAUDE.md index 57dd59c..544bc6e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,33 +5,34 @@ ## 開発進捗 最新: CameraProvider をテスト可能化(依存注入・撮影フロー特性化テスト・takePicture 分割) -※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは GUIDE_05「進捗記録の運用ルール(CLAUDE.md / PROGRESS.md)」を参照. +※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは `.claude/rules/progress-log.md` を参照(該当ファイル編集時に自動ロードされる). ## 必須ルール(コード実装時) -### コーディング規約(GUIDE_06 準拠) +### コーディング規約(.claude/rules/coding-style.md 準拠) -- Effective Dart に準拠.プロジェクト固有ルールは GUIDE_06 を参照 +- Effective Dart に準拠.プロジェクト固有ルールは `.claude/rules/coding-style.md`(`lib/**`・`test/**` 編集時に自動ロード)を参照 - `dart format` + `dart analyze` を必ず実行してからコミットする - 1 ファイル 1 クラス.命名は Provider / Service / Screen の接尾辞ルールに従う - エラー処理: Service → Provider → Screen の順で伝播し,画面でユーザーに通知 -### コミット前チェック(GUIDE_08 準拠) +### コミット前チェック 1. `dart analyze` — 警告・エラー 0 件 2. `dart format .` — 差分なし 3. `flutter test` — 全テスト通過 4. ドキュメント更新(仕様変更がある場合) -### Git 運用(GUIDE_04 準拠) +### Git 運用(.claude/rules/git-conventions.md 準拠) -- ブランチ名: `feature/`/`fix/`/`docs/`/`chore/` + 英単語 2〜4 語(kebab-case) -- コミットメッセージ: `[add]`/`[update]`/`[fix]`/`[remove]`/`[clean]` + 日本語 -- コミット・push 後は `gh pr create` で PR を作成する +- ブランチ名・コミットメッセージの書式は `.claude/rules/git-conventions.md` に従う(常時ロードされる) +- コミットは `/commit` を使用する(push・PR 作成は `/commit push`) - **`/commit` はユーザーが明示的に指示した時のみ実行する.Claude が自発的に `/commit` や `git commit` を呼んではならない**(`/implement` 完了後も,案内するだけで自分ではコミットしない) - - **例外**: `/auto-refactor`(無人運転のリファクタ/ドキュメント整理ループ)はユーザー承認済みの例外として `refactor/` 専用ブランチに自律コミットする.ただし push・PR・マージ・`main` への操作はしない(取り込みは人間が `/commit push` 等で行う) + - **例外**: 以下の無人運転ループはユーザー承認済みの例外として専用ブランチに自律コミットする.いずれも push・PR・マージ・`main` への操作はしない(取り込みは人間が `/commit push` 等で行う) + - `/auto-refactor`(リファクタ/ドキュメント整理ループ)→ `refactor/` 専用ブランチ + - `/auto-audit`(バグ/脆弱性の巡回監査ループ)→ `fix/` 専用ブランチ -### エージェントチーム(GUIDE_05 準拠) +### エージェントチーム(GUIDE_02 準拠) - 実装は `/implement <タスク>` で開始する(コーディング → テスト → リファクタリング → ドキュメント更新) - Phase 1 後に人間が動作確認,Phase 2 でテスト失敗時のみ方針判断 @@ -51,16 +52,21 @@ 設計・規約に関する情報は docs/ にある. コードを書く前に関連するファイルを読むこと. -### 01_GUIDE(規約・ルール) +### 01_GUIDE(運用フロー・ガイド) - プロジェクト立ち上げフロー: docs/01_GUIDE/GUIDE_01_プロジェクト立ち上げフロー.md -- ドキュメント作成規約: docs/01_GUIDE/GUIDE_02_ドキュメント作成ガイド.md -- ファイル命名規則: docs/01_GUIDE/GUIDE_03_ファイル命名規則.md -- Git 運用ルール: docs/01_GUIDE/GUIDE_04_Git運用ルール.md -- エージェント運用ルール: docs/01_GUIDE/GUIDE_05_エージェント運用ルール.md -- コーディング規約: docs/01_GUIDE/GUIDE_06_コーディング規約.md -- テスト方針: docs/01_GUIDE/GUIDE_07_テスト方針.md -- 実装完了フロー: docs/01_GUIDE/GUIDE_08_実装完了フロー.md +- エージェント運用ルール: docs/01_GUIDE/GUIDE_02_エージェント運用ルール.md +- ※ GUIDE_03 は team モード専用(チーム開発ルール).solo モードでは配置されない +- ※ 実装完了フロー・コミット前チェックは GUIDE_02 と `/implement` で定義(本ファイル上部「必須ルール」も参照) + +### .claude/rules(常時/編集時に自動ロードされる規約) + +- Git 運用: .claude/rules/git-conventions.md(常時ロード) +- ドキュメント書式: .claude/rules/markdown-style.md(`**/*.md` 編集時) +- ファイル命名: .claude/rules/docs-naming.md(`docs/**` 編集時) +- 進捗記録: .claude/rules/progress-log.md(CLAUDE.md・docs/PROGRESS.md 編集時) +- コーディング規約: .claude/rules/coding-style.md(`lib/**`・`test/**` 編集時) +- テスト方針: .claude/rules/testing.md(`test/**` 編集時) ### 02_ENV(環境) diff --git a/README.md b/README.md index 1732676..718660c 100644 --- a/README.md +++ b/README.md @@ -105,8 +105,8 @@ - [画面機能仕様書](docs/04_SPEC/SPEC_01_画面機能仕様書.md) / [カメラ撮影仕様書](docs/04_SPEC/SPEC_02_カメラ撮影仕様書.md) / [アーキテクチャと非機能](docs/04_SPEC/SPEC_03_アーキテクチャと非機能.md) - [定量モード設計の経緯と合意](docs/05_TECH/TECH_01_定量モード設計の経緯と合意.md) - [開発進捗ログ](docs/PROGRESS.md) -- [Git 運用ルール](docs/01_GUIDE/GUIDE_04_Git運用ルール.md) -- [コーディング規約](docs/01_GUIDE/GUIDE_06_コーディング規約.md) -- [テスト方針](docs/01_GUIDE/GUIDE_07_テスト方針.md) +- [Git 運用ルール](.claude/rules/git-conventions.md) +- [コーディング規約](.claude/rules/coding-style.md) +- [テスト方針](.claude/rules/testing.md) diff --git "a/docs/01_GUIDE/GUIDE_06_\343\202\263\343\203\274\343\203\207\343\202\243\343\203\263\343\202\260\350\246\217\347\264\204.md" "b/docs/01_GUIDE/GUIDE_06_\343\202\263\343\203\274\343\203\207\343\202\243\343\203\263\343\202\260\350\246\217\347\264\204.md" deleted file mode 100644 index 93ad50a..0000000 --- "a/docs/01_GUIDE/GUIDE_06_\343\202\263\343\203\274\343\203\207\343\202\243\343\203\263\343\202\260\350\246\217\347\264\204.md" +++ /dev/null @@ -1,125 +0,0 @@ -# コーディング規約 (Coding Standards) - -本ドキュメントでは,SmTIAS-Capture プロジェクトの Dart / Flutter コーディング規約を定義する. -基本方針として [Effective Dart](https://dart.dev/effective-dart) に準拠し,プロジェクト固有のルールのみ本書で定める. - -## フォーマット (Formatting) - -- `dart format` のデフォルト設定に従う(行幅 80 文字) -- VS Code の「保存時フォーマット」を有効にする(`.vscode/settings.json` で設定済み) -- 手動でのフォーマット調整は行わない - -## 命名規則 (Naming Conventions) - -Effective Dart の命名規則に従う.プロジェクト固有の補足は以下の通り. - -| 対象 | 規則 | 例 | -| --- | --- | --- | -| ファイル名 | snake_case | `camera_provider.dart` | -| クラス名 | UpperCamelCase | `CameraProvider` | -| 変数・関数 | lowerCamelCase | `takePhoto()` | -| 定数 | lowerCamelCase | `defaultImageQuality` | -| プライベート | 先頭に `_` | `_controller` | -| Provider | `〇〇Provider` | `CameraProvider` | -| Service | `〇〇Service` | `FileService` | -| Screen(画面) | `〇〇Screen` | `CaptureScreen` | -| Widget(部品) | 機能を表す名前 | `ShutterButton` | - -## import 順序 (Import Order) - -以下の順序で記述し,各グループ間は空行で区切る. - -```dart -// 1. Dart SDK -import 'dart:async'; -import 'dart:io'; - -// 2. Flutter SDK -import 'package:flutter/material.dart'; - -// 3. 外部パッケージ(pub.dev) -import 'package:camera/camera.dart'; -import 'package:provider/provider.dart'; - -// 4. プロジェクト内 -import 'package:smtias_capture/providers/camera_provider.dart'; -import 'package:smtias_capture/services/file_service.dart'; -``` - -※ `dart fix --apply` および `dart format` で自動整列されるため,手動調整は不要. - -## ディレクトリ構造 (Directory Structure) - -[SPEC_03 アーキテクチャと非機能](../04_SPEC/SPEC_03_アーキテクチャと非機能.md) のアーキテクチャセクションで定義したディレクトリ構成に従う. - -```text -lib/ -├── main.dart # エントリポイント,Provider 登録 -├── app.dart # MaterialApp,テーマ -├── providers/ # 状態管理(ChangeNotifier) -├── screens/ # 画面(Scaffold 単位) -├── widgets/ # 再利用可能な UI 部品 -└── services/ # 外部リソースとの橋渡し -``` - -### 配置ルール - -- **1 ファイル 1 クラス** を原則とする.ファイル名はクラス名の snake_case 版 -- **screens/**: 各画面に対応する 1 ファイル.画面固有のロジックは対応する Provider に置く -- **widgets/**: 複数画面で再利用する UI 部品,または画面ファイルが大きくなった場合に切り出す部品 -- **providers/**: 画面または機能ごとに 1 ファイル.ChangeNotifier を継承する -- **services/**: プラットフォーム API やファイルシステムへのアクセスを担う - -## 型の使い方 (Type Usage) - -- ローカル変数は型推論(`var` / `final`)を活用する -- 関数の引数・戻り値には明示的に型を記述する -- `dynamic` は避け,`Object?` を使用する -- `final` をデフォルトとし,再代入が必要な場合のみ `var` を使用する - -## エラーハンドリング (Error Handling) - -### 基本方針 - -- **Service 層**: 例外をキャッチし,呼び出し元に結果を返す.想定外の例外はそのまま上位に伝播させる -- **Provider 層**: Service の結果を受け取り,状態(エラーメッセージ等)として保持する -- **Screen 層**: Provider の状態を参照し,ユーザーにフィードバックを表示する(スナックバー等) - -### 想定するエラー - -| エラー | 発生箇所 | 対処 | -| --- | --- | --- | -| カメラ初期化失敗 | CameraProvider | エラーメッセージを画面に表示 | -| パーミッション拒否 | PermissionService | 設定画面への誘導を表示 | -| ストレージ書き込み失敗 | FileService | スナックバーでエラー通知 | -| ファイル削除失敗 | FileService | スナックバーでエラー通知 | - -### ログ出力 - -- 開発中は `debugPrint()` を使用する(リリースビルドでは自動的に無効化される) -- `print()` は使用しない - -## ドキュメント (Documentation) - -### コード内コメント - -- **DartDoc コメント(`///`)**: 公開 API(public なクラス・メソッド)に記述する -- **実装コメント(`//`)**: ロジックが自明でない箇所にのみ記述する -- 「何をしているか」ではなく「なぜそうしているか」を書く - -### DartDoc の書き方 - -```dart -/// 撮影画像を PNG 形式で共有ストレージに保存する. -/// -/// [imageBytes] は JPEG エンコード済みの画像データ. -/// 保存先は `Pictures/MiniTIAS/` ディレクトリ. -/// 同秒の重複ファイルが存在する場合は連番サフィックスを付与する. -Future saveImage(Uint8List imageBytes) async { - // ... -} -``` - -- 1 行目は動詞で始める簡潔な要約(句点で終わる) -- 詳細が必要な場合は空行を挟んで続ける -- パラメータの説明は `[paramName]` 記法を使用する diff --git "a/docs/01_GUIDE/GUIDE_07_\343\203\206\343\202\271\343\203\210\346\226\271\351\207\235.md" "b/docs/01_GUIDE/GUIDE_07_\343\203\206\343\202\271\343\203\210\346\226\271\351\207\235.md" deleted file mode 100644 index cca870c..0000000 --- "a/docs/01_GUIDE/GUIDE_07_\343\203\206\343\202\271\343\203\210\346\226\271\351\207\235.md" +++ /dev/null @@ -1,93 +0,0 @@ -# テスト方針 (Testing Strategy) - -本ドキュメントでは,SmTIAS-Capture プロジェクトのテスト方針を定義する. - -## 基本方針 (Principles) - -- 初期フェーズではカメラ・ストレージ等のハードウェア依存が大きいため,**実機での手動確認を主体** とする -- ハードウェアに依存しないロジック(ファイル命名,重複回避等)には **Unit テスト** を書く -- テストは `flutter test` で実行できる状態を維持する -- ネイティブ(Kotlin)コードは原則として実機手動確認に委ねるが,**研究データの正確性に直結する純粋な数理ロジック**(例: 画素統計の mean/max/p99/飽和率)は Android Framework に依存しない形に分離し,**JUnit で単体テスト**する(実機不要・`./gradlew test` で実行) - -## テストの種類と対象 (Test Types) - -| 種類 | 対象 | 実施方法 | -| --- | --- | --- | -| Unit テスト | Service 層のロジック(ファイル命名,重複回避等) | `flutter test` | -| Widget テスト | 画面の基本的な UI 構成(ボタンの存在等) | `flutter test` | -| 手動確認 | カメラプレビュー,撮影,保存,削除の E2E 動作 | 実機(AQUOS sense3) | - -※ Integration テスト(`flutter drive`)は初期フェーズでは導入しない. - -## Unit テスト - -### 対象 - -- `FileService` — ファイル名生成ロジック,重複回避ロジック -- `PermissionService` — パーミッション状態の判定ロジック(モック使用) - -### ファイル配置 - -```text -test/ -├── services/ -│ ├── file_service_test.dart -│ └── permission_service_test.dart -└── providers/ - └── gallery_provider_test.dart -``` - -### 命名規則 - -- テストファイル名: `{対象ファイル名}_test.dart` -- テストグループ: `group('クラス名',)` でクラス単位にまとめる -- テスト名: 日本語で「〜の場合,〜する」形式 - -```dart -group('FileService', () { - test('同秒のファイルが存在しない場合,サフィックスなしのファイル名を返す', () { - // ... - }); - - test('同秒のファイルが存在する場合,連番サフィックスを付与する', () { - // ... - }); -}); -``` - -## Widget テスト - -### 対象 - -- 画面に必要な UI 要素が存在すること(シャッターボタン,ナビゲーションバー等) -- ボタンタップ時に Provider のメソッドが呼ばれること(モック使用) - -### 方針 - -- カメラプレビューはモック化する(`camera` パッケージのウィジェットは Widget テストで動作しない) -- Provider は `ChangeNotifierProvider.value` でモックを注入する - -## 手動確認 (Manual Testing) - -### 確認項目 - -実装完了時に以下を実機で確認する. - -- [ ] カメラプレビューが正しく表示される(180° 回転) -- [ ] シャッターボタンで撮影できる -- [ ] 撮影画像が `Pictures/MiniTIAS/` に PNG で保存される -- [ ] ファイル名が命名規則に従っている -- [ ] 連続撮影が正常に動作する -- [ ] 一覧画面にサムネイルが表示される -- [ ] サムネイルタップで拡大表示される -- [ ] 画像の削除ができる -- [ ] パーミッション拒否時に適切なメッセージが表示される -- [ ] アプリをバックグラウンド→復帰してもカメラが正常に動作する - -## テスト実行タイミング (When to Test) - -| タイミング | 実施内容 | -| --- | --- | -| 機能実装完了時 | 対応する Unit / Widget テストを作成・実行 | -| コミット前 | `flutter test` を実行し全テストが通ることを確認 | -| PR 作成前 | 手動確認項目のうち関連するものを実機で確認 | diff --git "a/docs/01_GUIDE/GUIDE_08_\345\256\237\350\243\205\345\256\214\344\272\206\343\203\225\343\203\255\343\203\274.md" "b/docs/01_GUIDE/GUIDE_08_\345\256\237\350\243\205\345\256\214\344\272\206\343\203\225\343\203\255\343\203\274.md" deleted file mode 100644 index a534c2e..0000000 --- "a/docs/01_GUIDE/GUIDE_08_\345\256\237\350\243\205\345\256\214\344\272\206\343\203\225\343\203\255\343\203\274.md" +++ /dev/null @@ -1,79 +0,0 @@ -# 実装完了フロー (Implementation Completion Flow) - -本ドキュメントでは,機能実装の完了からコミット・PR 作成までの手順を定義する. -リファクタリングの判断基準もここで定める. - -## コミット前チェックリスト (Pre-commit Checklist) - -機能実装が完了したら,以下を順番に実施する. - -### 1. 静的解析 - -```bash -dart analyze -``` - -- 警告・エラーが 0 件であることを確認する -- `// ignore:` で抑制する場合は理由をコメントに記述する - -### 2. フォーマット - -```bash -dart format . -``` - -- 差分がないことを確認する(VS Code の保存時フォーマットが有効なら通常は差分なし) - -### 3. テスト実行 - -```bash -flutter test -``` - -- 全テストが通ることを確認する -- 新しいロジックを追加した場合はテストも追加する([GUIDE_07](GUIDE_07_テスト方針.md) 参照) - -### 4. ドキュメント確認 - -- 仕様変更がある場合は `docs/` のドキュメントを先に更新する -- 新しいファイルを追加した場合は CLAUDE.md の参照パスを更新する - -### 5. コミット・PR - -- [GUIDE_04](GUIDE_04_Git運用ルール.md) に従ってコミット・push・PR 作成を行う - -## 実装完了の基準 (Definition of Done) - -以下をすべて満たした場合に「実装完了」とする. - -- [ ] 要求された機能が動作する -- [ ] `dart analyze` で警告・エラーが 0 件 -- [ ] `dart format` で差分がない -- [ ] `flutter test` で全テストが通る -- [ ] 新しいロジックに対するテストが追加されている -- [ ] 関連ドキュメントが更新されている - -## リファクタリング方針 (Refactoring Policy) - -### 実施タイミング - -- **機能実装中**: 実装対象のコードに限り,必要に応じてリファクタリングする -- **機能実装後**: 動作確認が完了してからリファクタリングを行う(動くコードを壊さない) -- **独立した作業として**: 機能追加と同じコミットに混ぜない.`[clean]` タグで別コミットにする - -### 判断基準 - -以下のいずれかに該当する場合にリファクタリングを検討する. - -| 基準 | 例 | -| --- | --- | -| 同じコードが 3 箇所以上に重複している | 共通ロジックのメソッド抽出 | -| 1 ファイルが 300 行を超えている | クラスやウィジェットの分割 | -| 1 メソッドが 50 行を超えている | メソッドの分割 | -| クラスの責務が 2 つ以上混在している | クラスの分割 | - -### やらないこと - -- 動作に問題のないコードの「予防的」リファクタリング -- 将来の要件を見越した過度な抽象化 -- 機能追加と同一コミットでのリファクタリング diff --git "a/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" "b/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" index 3dad683..146504d 100644 --- "a/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" +++ "b/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" @@ -144,11 +144,11 @@ ### テスト - 全 Unit / Widget テストの通過確認 -- [GUIDE_07](../01_GUIDE/GUIDE_07_テスト方針.md) の手動確認項目を実機で確認 +- [testing ルール](../../.claude/rules/testing.md) の手動確認項目を実機で確認 ### 完了基準 -- GUIDE_07 の手動確認項目がすべて OK +- testing ルールの手動確認項目がすべて OK - `dart analyze` / `flutter test` がクリーン - 白板・舌模型の撮影ができ,PC から USB 経由で画像にアクセスできる diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 1bfbb29..a6bce5d 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -6,8 +6,8 @@ - 最新エントリは下に追記する(時系列順.古いものが上,新しいものが下) - CLAUDE.md の「開発進捗」セクションは最新 1 行のみ(上書き運用) - 詳細・失敗パターン・設計判断はすべて本ファイルに残す -- 書式・運用ルールは docs/01_GUIDE/GUIDE_05_エージェント運用ルール.md - 「進捗記録の運用ルール(CLAUDE.md / PROGRESS.md)」を参照 +- 書式・運用ルールは .claude/rules/progress-log.md を参照 + (本ファイルの編集時に自動ロードされる) --> ## Step 1〜5: 撮影・保存・一覧・削除の実装