Skip to content

docs: Claude Code AI tooling configuration#2977

Open
9clg6 wants to merge 5 commits intomainfrom
feat/claude-ai-tooling
Open

docs: Claude Code AI tooling configuration#2977
9clg6 wants to merge 5 commits intomainfrom
feat/claude-ai-tooling

Conversation

@9clg6
Copy link
Copy Markdown
Collaborator

@9clg6 9clg6 commented Mar 31, 2026

Summary

  • Adds .claude/CLAUDE.md — project-specific instructions for Claude Code (workflow, task management, core principles)
  • Adds .claude/SETUP.md — setup guide for the AI tooling
  • Adds 14 specialized agents under .claude/agents/ : code-reviewer, zeus, rodin-tech, flutter-architect, flutter-testing, flutter-state-management, flutter-performance-analyzer/optimizer, flutter-device-orchestrator, silent-failure-hunter, pr-test-analyzer, type-design-analyzer, comment-analyzer, code-simplifier

Test plan

  • Verify Claude Code picks up CLAUDE.md instructions in project context
  • Verify agents are available via slash commands

Summary by CodeRabbit

  • Documentation

    • Added comprehensive workflow and setup guidance covering planning, verification, lessons learned, and development tool configuration.
  • Chores

    • Added dev-tool server configurations for browser and Flutter inspection/automation.
    • Introduced a suite of specialized assistant agents for code review, simplification, comments, testing, architecture, state management, performance, device orchestration, and error detection.

CLAUDE.md, SETUP.md et agents spécialisés pour le projet :
code-reviewer, zeus, rodin-tech, flutter-*, silent-failure-hunter, etc.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 31, 2026

Walkthrough

This PR adds a Claude Code workflow and extensive agent/tooling configuration for the repository. New files include .claude/CLAUDE.md and .claude/SETUP.md, an .mcp.json with MCP server entries, an executable .claude/run-patrol script, and 16 agent definition files under .claude/agents/ (e.g., code-reviewer, flutter-architect, flutter-testing, performance analyzers, etc.). The additions define agent behaviors, MCP server invocation details (chrome-devtools, flutter-inspector, patrol), testing/inspection tooling guidance, and task-management conventions; no exported/public code entities were modified.

Possibly related PRs

Suggested reviewers

  • hoangdat
  • dab246
  • nqhhdev
  • tddang-linagora
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning PR description provides a clear summary and test plan but does not match the required template structure with sections for Ticket, Root cause, Solution, Impact, Test recommendations, Pre-merge, and Resolved. Restructure the description to match the repository template, including all required sections (Ticket, Root cause, Solution, Impact description, Test recommendations, Pre-merge, Resolved) even if some sections are marked as N/A.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed Title is concise, clear, and directly summarizes the primary change: adding Claude Code AI tooling configuration documentation.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/claude-ai-tooling

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

This PR has been deployed to https://linagora.github.io/twake-on-matrix/2977

@9clg6 9clg6 marked this pull request as ready for review April 1, 2026 07:20
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 13

🧹 Nitpick comments (2)
.claude/agents/code-simplifier.md (1)

55-56: Soften the blanket guidance on try/catch usage.

Line 55 currently discourages try/catch broadly; that can push readers away from explicit, structured error handling. Recommend rewording to discourage empty/swallowing catches instead of catch usage itself.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.claude/agents/code-simplifier.md around lines 55 - 56, The guidance
currently discourages try/catch broadly; change the wording to discourage empty
or swallowing catches rather than avoid try/catch entirely by rephrasing the
bullet to recommend using structured error handling and avoiding catch blocks
that swallow errors or suppress useful diagnostic info (mention "try/catch"
explicitly so readers know the target) and suggest alternatives like propagating
errors, using typed error handling, or centralized error handlers where
appropriate.
.claude/agents/flutter-device-orchestrator.md (1)

417-418: Use machine-readable Flutter output for device ID extraction.

Line 417 and Line 418 rely on positional awk fields from human output; this is fragile. Parse flutter devices --machine JSON instead.

Proposed fix
-IOS_ID=$(flutter devices | grep "iPhone 15 Pro" | awk '{print $5}' | tr -d '•')
-ANDROID_ID=$(flutter devices | grep "Pixel 8" | awk '{print $5}' | tr -d '•')
+IOS_ID=$(flutter devices --machine | jq -r '.[] | select(.name=="iPhone 15 Pro") | .id' | head -1)
+ANDROID_ID=$(flutter devices --machine | jq -r '.[] | select(.id | startswith("emulator-")) | .id' | head -1)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.claude/agents/flutter-device-orchestrator.md around lines 417 - 418, The
current IOS_ID and ANDROID_ID assignment lines (IOS_ID=$(flutter devices | grep
"iPhone 15 Pro" | awk '{print $5}' | tr -d '•') and ANDROID_ID=$(flutter devices
| grep "Pixel 8" | awk '{print $5}' | tr -d '•')) are fragile; replace them to
parse JSON from flutter devices --machine and extract the id where the "name"
equals "iPhone 15 Pro" or "Pixel 8". Run flutter devices --machine and filter
the JSON array for objects with "name" matching the target device, then read the
"id" field (using jq, Python, or another JSON tool) and assign that to
IOS_ID/ANDROID_ID so the script uses machine-readable device IDs reliably.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.claude/agents/flutter-architect.md:
- Line 35: Several fenced code blocks in the document use bare triple-backticks
(```) and trigger markdownlint MD040; locate the four occurrences of those bare
fences (the code blocks that start with just ``` and contain plain text or
markdown) and update each opening fence to declare a language (for example
change ``` to ```text or ```markdown as appropriate for the block content) so
that all fenced blocks specify a language and satisfy MD040.
- Around line 1154-1160: Update the agent references in the "Outside this
agent's scope" list: replace the invalid agent name flutter-testing-expert with
the correct flutter-testing, and remove (or replace with a valid existing agent)
the nonexistent flutter-ui-implementer entry; locate the two entries in the
block containing "State management implementation details → Use
`flutter-state-management`" and edit the lines for "UI implementation → Use
`flutter-ui-implementer`" and the testing line to use the corrected token so the
guidance points to real agents.

In @.claude/agents/flutter-device-orchestrator.md:
- Around line 62-64: The simctl create command is using an invalid runtime
string "iOS18.0"; update the runtime argument in the simulated device creation
lines (the xcrun simctl create "iPhone 16 Pro Test" "iPhone 16 Pro" "iOS18.0"
occurrence and any duplicates around lines 542–551) to a valid runtime such as
the hyphenated "iOS-18-0" or the full identifier
"com.apple.CoreSimulator.SimRuntime.iOS-18-0", or simply remove the runtime
parameter to let simctl auto-select the newest compatible runtime.
- Around line 231-235: The multiline emulator command uses backslashes with
trailing spaces which break shell line continuation; edit the emulator command
starting at "emulator -avd Pixel_9_API_35" and remove the trailing whitespace
after the backslashes on the "-no-snapshot-load \", "-no-audio \", and any other
continued lines so the backslash is the last character on the line and the flags
(-no-snapshot-load, -no-audio, -gpu swiftshader_indirect) are passed as
arguments rather than separate commands.

In @.claude/agents/flutter-performance-analyzer.md:
- Line 52: Locate the fenced code block that contains the line "# Press 'v' to
open DevTools in browser" and add an explicit language label to the opening
fence (for example change ``` to ```text or ```console) so the block is no
longer unlabeled; update the opening fence near that content in the
flutter-performance-analyzer markdown to include the chosen language.

In @.claude/agents/flutter-performance-optimizer.md:
- Line 649: The fenced code block at the end of the example-output in
.claude/agents/flutter-performance-optimizer.md is missing a language tag
(triggers MD040); edit the triple-backtick fence around the example-output and
add an explicit language identifier such as "markdown" or "text" (e.g., replace
``` with ```markdown) so the block is properly annotated.

In @.claude/agents/flutter-state-management.md:
- Line 55: Two fenced code blocks are missing language labels (one contains the
text "❌ Requires careful dispose management" and another similar block later),
triggering markdownlint MD040; edit those fenced blocks in
.claude/agents/flutter-state-management.md to add an appropriate fence language
after the opening backticks (for example ```text or ```markdown) so each fenced
block is labeled, ensuring the markdown linter passes.
- Around line 531-549: The code treats authProvider as returning AuthState but
it actually returns AsyncValue<AuthState>; update the watch/listen handling to
unwrap or pattern-match the AsyncValue: use ref.watch(authProvider) to get
AsyncValue<AuthState> (authState), then check authState.isLoading or use
authState.when(...) to show the loading spinner and show LoginForm for
data/error; in ref.listen<AuthState>(authProvider, ...) accept
AsyncValue<AuthState> (e.g., previous/next are AsyncValue<AuthState>) and
inspect next.value (or next.whenData) to detect Authenticated/AuthError and
perform Navigator.pushReplacementNamed or showSnackBar accordingly so you
compare against Authenticated/AuthError/AuthLoading on the unwrapped AuthState.

In @.claude/agents/flutter-testing.md:
- Around line 934-946: The test body uses await (await useCase.call()) but the
callback is not async; change the test declaration to an async callback (e.g.,
test('description', () async { ... })) so the await is valid, and ensure mocked
async methods like when(repository.getData()).thenAnswer(...) return Futures as
shown; update any related closures to async as needed to avoid invalid await
usage with useCase.call and repository.getData.
- Around line 692-703: Replace the direct flutter test/drive examples with
instructions to run the repo’s integration test wrapper so the required env file
is loaded; specifically, direct users to run the existing script named
scripts/integration_test_patrol.sh (which invokes flutter with
--dart-define-from-file pointing at integration_test/.env.local.do-not-commit)
instead of raw flutter test or flutter drive, and mention the fallback only if
the user manually supplies the same --dart-define-from-file flag and path when
invoking flutter test/drive.

In @.claude/agents/zeus.md:
- Around line 54-80: The fenced code blocks in the Zeus Report template (the
blocks that start with ``` and contain the "# Zeus Report — [date] — [context:
file(s) or PR]" and the later "# Zeus Report — [date] — [context]" sections) are
missing language identifiers and trigger markdownlint MD040; fix by adding the
language identifier (e.g., "markdown") after the opening backticks for those
code fences so they become ```markdown, and apply the same change to the other
fenced block(s) referenced (the ones around the template sections) to satisfy
the linter.

In @.claude/SETUP.md:
- Around line 44-45: Add an explicit security warning near the flags
(--enable-vm-service and --disable-service-auth-codes) explaining that using
--disable-service-auth-codes makes the VM service unauthenticated and must only
be used on trusted local-only interfaces (e.g., localhost) or behind strict
firewalls/SSH port forwarding; instruct readers not to expose this to public or
untrusted networks and mention using the default authenticated mode or secure
tunneling instead as safer alternatives.

In @.mcp.json:
- Line 11: The VM service port in the launch args is mismatched with the
documented run command: update the argument value "--dart-vm-port=8181" in
.mcp.json to use the documented VM service port ("--dart-vm-port=8182") so the
VM service and DDS ports align (DDS stays on 8181) and inspector attachment
works; locate the string "--dart-vm-port=8181" in .mcp.json and replace it with
"--dart-vm-port=8182".

---

Nitpick comments:
In @.claude/agents/code-simplifier.md:
- Around line 55-56: The guidance currently discourages try/catch broadly;
change the wording to discourage empty or swallowing catches rather than avoid
try/catch entirely by rephrasing the bullet to recommend using structured error
handling and avoiding catch blocks that swallow errors or suppress useful
diagnostic info (mention "try/catch" explicitly so readers know the target) and
suggest alternatives like propagating errors, using typed error handling, or
centralized error handlers where appropriate.

In @.claude/agents/flutter-device-orchestrator.md:
- Around line 417-418: The current IOS_ID and ANDROID_ID assignment lines
(IOS_ID=$(flutter devices | grep "iPhone 15 Pro" | awk '{print $5}' | tr -d '•')
and ANDROID_ID=$(flutter devices | grep "Pixel 8" | awk '{print $5}' | tr -d
'•')) are fragile; replace them to parse JSON from flutter devices --machine and
extract the id where the "name" equals "iPhone 15 Pro" or "Pixel 8". Run flutter
devices --machine and filter the JSON array for objects with "name" matching the
target device, then read the "id" field (using jq, Python, or another JSON tool)
and assign that to IOS_ID/ANDROID_ID so the script uses machine-readable device
IDs reliably.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 1bca326b-4ebc-40e9-84da-41560a91a419

📥 Commits

Reviewing files that changed from the base of the PR and between e769953 and 9cea2a3.

📒 Files selected for processing (17)
  • .claude/CLAUDE.md
  • .claude/SETUP.md
  • .claude/agents/code-reviewer.md
  • .claude/agents/code-simplifier.md
  • .claude/agents/comment-analyzer.md
  • .claude/agents/flutter-architect.md
  • .claude/agents/flutter-device-orchestrator.md
  • .claude/agents/flutter-performance-analyzer.md
  • .claude/agents/flutter-performance-optimizer.md
  • .claude/agents/flutter-state-management.md
  • .claude/agents/flutter-testing.md
  • .claude/agents/pr-test-analyzer.md
  • .claude/agents/rodin-tech.md
  • .claude/agents/silent-failure-hunter.md
  • .claude/agents/type-design-analyzer.md
  • .claude/agents/zeus.md
  • .mcp.json

@hoangdat
Copy link
Copy Markdown
Member

hoangdat commented Apr 1, 2026

hi @9clg6 , very first comment on the metadata of skill

CF: https://platform.claude.com/docs/en/agents-and-tools/agent-skills/best-practices

image

I found maybe your description is too long and too specific. Metadata will be loaded at startup, so dont need too verbose

Clement Guyon added 3 commits April 1, 2026 12:46
- Add .claude/run-patrol launcher script (auto-detects FVM)
- Add patrol entry in .mcp.json
- Document setup in SETUP.md with pub.dev link and activation instructions
- code-simplifier: rephrase error handling guidance to target swallowing
  catches rather than discouraging try/catch broadly
- flutter-device-orchestrator: replace fragile awk device ID parsing with
  flutter devices --machine | jq for reliable machine-readable output
Replace verbose descriptions (with inline <example> blocks) with
concise third-person descriptions following the what+when pattern.
Reduces startup token cost and improves agent routing accuracy.
@9clg6
Copy link
Copy Markdown
Collaborator Author

9clg6 commented Apr 1, 2026

@hoangdat fixed — agent descriptions have been shortened in commit 27a944e to match the Anthropic best practices guide (name ≤ 5 words, description ≤ 1 short sentence triggering when-to-use).

@9clg6
Copy link
Copy Markdown
Collaborator Author

9clg6 commented Apr 1, 2026

Fixed the two remaining CodeRabbit nitpicks in commit 2eb9e0c:

  • code-simplifier.md: rephrased error handling guidance to target swallowing catches specifically rather than discouraging try/catch broadly
  • flutter-device-orchestrator.md: replaced fragile awk-based device ID extraction with flutter devices --machine | jq for reliable machine-readable parsing

Copy link
Copy Markdown

@codescene-delta-analysis codescene-delta-analysis bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No application code in the PR — skipped Code Health checks.

See analysis details in CodeScene

Quality Gate Profile: The Bare Minimum
Install CodeScene MCP: safeguard and uplift AI-generated code. Catch issues early with our IDE extension and CLI tool.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

♻️ Duplicate comments (6)
.claude/agents/flutter-state-management.md (2)

1218-1218: ⚠️ Potential issue | 🟡 Minor

Add a language label to the fenced block to satisfy MD040.

Line 1218 starts an unlabeled fenced code block; add a label like text.

Suggested patch
-```
+```text
 ✓ Recommended: BLoC Pattern
 ✓ Reasoning: Large app, event-driven architecture needed
 ✓ Files created: auth_bloc.dart, auth_event.dart, auth_state.dart
 ✓ Performance: Optimized with selective rebuilds
 ✓ Testing: blocTest examples provided
 ✓ Next: Implement remaining features following same pattern
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @.claude/agents/flutter-state-management.md at line 1218, The unlabeled
fenced code block starting at the opening triple-backticks needs a language
label to satisfy MD040; update the opening fence to include a label such as text
(e.g., change totext) so the block containing the checklist lines ("✓
Recommended: BLoC Pattern" etc.) is a labeled fenced code block.


</details>

---

`534-548`: _⚠️ Potential issue_ | _🟠 Major_

**Fix `AsyncNotifierProvider` usage to handle `AsyncValue<AuthState>` correctly.**

Line 534 and Line 546 treat `authProvider` as `AuthState`, but `AsyncNotifierProvider<AuthNotifier, AuthState>` yields `AsyncValue<AuthState>`. These checks won’t match as written.

<details>
<summary>Suggested patch</summary>

```diff
-    ref.listen<AuthState>(authProvider, (previous, next) {
-      if (next is Authenticated) {
-        Navigator.of(context).pushReplacementNamed('/home');
-      } else if (next is AuthError) {
-        ScaffoldMessenger.of(context).showSnackBar(
-          SnackBar(content: Text(next.message)),
-        );
-      }
-    });
+    ref.listen<AsyncValue<AuthState>>(authProvider, (previous, next) {
+      next.whenData((state) {
+        if (state is Authenticated) {
+          Navigator.of(context).pushReplacementNamed('/home');
+        } else if (state is AuthError) {
+          ScaffoldMessenger.of(context).showSnackBar(
+            SnackBar(content: Text(state.message)),
+          );
+        }
+      });
+    });
@@
-      body: authState is AuthLoading
-          ? const Center(child: CircularProgressIndicator())
-          : const LoginForm(),
+      body: authState.when(
+        loading: () => const Center(child: CircularProgressIndicator()),
+        error: (_, __) => const LoginForm(),
+        data: (_) => const LoginForm(),
+      ),
```
</details>

  

```web
In Riverpod 3, for AsyncNotifierProvider<AuthNotifier, AuthState>, what are the exact types returned by ref.watch(authProvider) and passed to ref.listen(authProvider, ...)?
```

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In @.claude/agents/flutter-state-management.md around lines 534 - 548, The code
is treating authProvider as AuthState but authProvider is an
AsyncNotifierProvider and yields AsyncValue<AuthState>; update usages to handle
AsyncValue<AuthState>: change the listener signature to
ref.listen<AsyncValue<AuthState>>(authProvider, (previous, next) => { use
next.whenData((state) => { if (state is Authenticated)
Navigator.of(context).pushReplacementNamed('/home'); else if (state is
AuthError) ScaffoldMessenger.of(context).showSnackBar(...); }); }); and update
the UI consumer variable (where you call authState) to an AsyncValue<AuthState>
and use authState.isLoading / authState.when or authState.whenData to show the
loading spinner or return LoginForm accordingly.
```

</details>

</blockquote></details>
<details>
<summary>.claude/agents/flutter-device-orchestrator.md (2)</summary><blockquote>

`63-63`: _⚠️ Potential issue_ | _🟠 Major_

**Use valid `simctl` runtime identifiers (`iOS-18-0`), not `iOS18.0`.**

`xcrun simctl create` examples on Line 63 and Lines 542–551 use an invalid runtime token. Use the hyphenated runtime or omit runtime to auto-pick a compatible one.  
  

<details>
<summary>Proposed fix</summary>

```diff
-xcrun simctl create "iPhone 16 Pro Test" "iPhone 16 Pro" "iOS18.0"
+xcrun simctl create "iPhone 16 Pro Test" "iPhone 16 Pro" "iOS-18-0"
...
-xcrun simctl create "iPhone SE Test" "iPhone SE (3rd generation)" "iOS18.0"
+xcrun simctl create "iPhone SE Test" "iPhone SE (3rd generation)" "iOS-18-0"
...
-xcrun simctl create "iPhone 16 Pro Max Test" "iPhone 16 Pro Max" "iOS18.0"
+xcrun simctl create "iPhone 16 Pro Max Test" "iPhone 16 Pro Max" "iOS-18-0"
...
-xcrun simctl create "iPad Pro Test" "iPad Pro 13-inch (M4)" "iOS18.0"
+xcrun simctl create "iPad Pro Test" "iPad Pro 13-inch (M4)" "iOS-18-0"
```
</details>


Also applies to: 542-551

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In @.claude/agents/flutter-device-orchestrator.md at line 63, Replace invalid
simctl runtime tokens like "iOS18.0" used in xcrun simctl create invocations
with the hyphenated runtime form "iOS-18-0" (or remove the runtime argument to
let simctl auto-select a compatible runtime); update every occurrence of the
command shown (the lines containing the literal command starting with "xcrun
simctl create" and referencing "iPhone 16 Pro Test" / "iPhone 16 Pro" and
similar samples) so they use "iOS-18-0" instead of "iOS18.0".
```

</details>

---

`231-234`: _⚠️ Potential issue_ | _🟠 Major_

**Fix shell line continuations in the emulator command.**

On Lines 232–233, backslashes are followed by spaces/comments, which breaks continuation when pasted into shell. Keep `\` as the last character and move comments to separate lines.  
  

<details>
<summary>Proposed fix</summary>

```diff
 emulator -avd Pixel_9_API_35 \
-  -no-snapshot-load \  # Don't load from snapshot
-  -no-audio \          # Disable audio
-  -gpu swiftshader_indirect  # Software rendering
+  # Don't load from snapshot
+  -no-snapshot-load \
+  # Disable audio
+  -no-audio \
+  # Software rendering
+  -gpu swiftshader_indirect
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In @.claude/agents/flutter-device-orchestrator.md around lines 231 - 234, The
shell command for starting the emulator (the multi-line "emulator -avd
Pixel_9_API_35" invocation) has backslashes followed by spaces and inline
comments which break line continuation; fix it by placing each backslash as the
final character on its line and moving comments to their own separate lines (or
above the command lines) so the continuation slashes are not followed by any
whitespace or inline text. Update the lines containing "-no-snapshot-load \",
"-no-audio \", and "-gpu swiftshader_indirect" accordingly so each trailing "\"
is the last character on the line and comments are on separate lines.
```

</details>

</blockquote></details>
<details>
<summary>.claude/agents/flutter-testing.md (2)</summary><blockquote>

`934-946`: _⚠️ Potential issue_ | _🟠 Major_

**Fix invalid Dart sample: `await` requires an async callback.**

Line 940 uses `await` inside a non-`async` `test(...)` body, so the example is invalid as written.  
  

<details>
<summary>Proposed fix</summary>

```diff
-test('description', () {
+test('description', () async {
   // Arrange: Set up test data and mocks
   final repository = MockRepository();
   when(repository.getData()).thenAnswer((_) async => testData);
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In @.claude/agents/flutter-testing.md around lines 934 - 946, The sample test
uses await inside a non-async test callback; update the test declaration to an
async callback so awaits are valid — change the test(...) closure to async
(e.g., test('description', () async { ... })) and ensure the call to
useCase.call() and the when(repository.getData()).thenAnswer(...) remain awaited
as shown; locate the test block referencing test('description', useCase.call(),
MockRepository, repository.getData) and make the closure async to fix the
invalid Dart sample.
```

</details>

---

`692-703`: _⚠️ Potential issue_ | _🟠 Major_

**Use the repo integration wrapper as the primary command path.**

Lines 692–703 currently recommend raw `flutter test`/`flutter drive`, but this repo’s integration flow depends on env loading through the wrapper script. Please make `bash scripts/integration_test_patrol.sh` the default instruction and keep raw commands only as fallback with explicit `--dart-define-from-file`.  
 

<details>
<summary>Proposed fix</summary>

```diff
-# Run on connected device
-flutter test integration_test/app_test.dart
-
-# Run on specific device
-flutter test integration_test/app_test.dart -d <device-id>
-
-# Run with driver (for reports)
-flutter drive \
-  --driver=test_driver/integration_test.dart \
-  --target=integration_test/app_test.dart
+# Preferred: project wrapper (loads env defines)
+bash scripts/integration_test_patrol.sh
+
+# Manual fallback (must pass env file explicitly)
+flutter test integration_test/app_test.dart \
+  --dart-define-from-file=integration_test/.env.local.do-not-commit
+
+flutter test integration_test/app_test.dart -d <device-id> \
+  --dart-define-from-file=integration_test/.env.local.do-not-commit
+
+flutter drive \
+  --driver=test_driver/integration_test.dart \
+  --target=integration_test/app_test.dart \
+  --dart-define-from-file=integration_test/.env.local.do-not-commit
```
</details>

Based on learnings, integration tests in this repo load sensitive config from `integration_test/.env.local.do-not-commit` via `--dart-define-from-file` in `scripts/integration_test_patrol.sh`.

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In @.claude/agents/flutter-testing.md around lines 692 - 703, Update the
instructions to make the repository wrapper script the primary command: replace
the raw example commands with "bash scripts/integration_test_patrol.sh" as the
default and retain the raw `flutter test`/`flutter drive` lines only as
fallbacks that explicitly include the env file via
`--dart-define-from-file=integration_test/.env.local.do-not-commit`;
specifically update the examples around the current flutter test/drive snippets
so readers are directed to run scripts/integration_test_patrol.sh first and, if
using raw commands, append the `--dart-define-from-file` flag to both `flutter
test integration_test/app_test.dart` and the `flutter drive` invocation to load
the repo’s env.
```

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>🤖 Prompt for all review comments with AI agents</summary>

Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.claude/agents/flutter-device-orchestrator.md:

  • Line 596: Add a language identifier to the fenced code block that currently
    begins with triple backticks () so the markdown linter rule MD040 is satisfied; locate the fenced block (the opening with no language) and change
    it to include the appropriate language token (for example bash, sh,
    yaml, or json depending on the content) ensuring the chosen identifier
    matches the block's contents.

In @.claude/agents/flutter-state-management.md:

  • Around line 1200-1202: Replace the invalid agent names: change
    flutter-testing-expert to the existing flutter-testing, and for
    flutter-ui-implementer either remove that UI implementation line or replace it
    with flutter-architect depending on whether you want a high-level architect
    role (use flutter-architect) or no substitute (remove the line); update the
    list entries accordingly so all referenced agents exist.

In @.claude/agents/flutter-testing.md:

  • Line 55: The fenced code block used for the folder-structure example is
    missing a language tag (causing MD040); edit the block surrounding the folder
    listing in flutter-testing.md and add an appropriate language identifier (e.g.,
    text, bash, or console) immediately after the opening triple backticks so the
    block is tagged and the linter warning is resolved.
  • Line 1016: The fenced code block labeled "example-output" is missing a
    language tag and triggers MD040; update that fenced block by adding an
    appropriate language/format tag (e.g., text, output, or ```console)
    immediately after the opening backticks so the block is properly tagged and the
    MD040 warning is resolved.
  • Line 357: The sample imports 'package:provider/provider.dart' but the widget
    test uses BlocProvider (e.g., BlocProvider in the test widget trees at lines
    shown), so replace the incorrect import with the flutter_bloc package import:
    remove the 'provider' import and add the
    'package:flutter_bloc/flutter_bloc.dart' import so BlocProvider and related
    classes resolve; ensure any Provider-specific usages are updated to Bloc
    equivalents if present.

Duplicate comments:
In @.claude/agents/flutter-device-orchestrator.md:

  • Line 63: Replace invalid simctl runtime tokens like "iOS18.0" used in xcrun
    simctl create invocations with the hyphenated runtime form "iOS-18-0" (or remove
    the runtime argument to let simctl auto-select a compatible runtime); update
    every occurrence of the command shown (the lines containing the literal command
    starting with "xcrun simctl create" and referencing "iPhone 16 Pro Test" /
    "iPhone 16 Pro" and similar samples) so they use "iOS-18-0" instead of
    "iOS18.0".
  • Around line 231-234: The shell command for starting the emulator (the
    multi-line "emulator -avd Pixel_9_API_35" invocation) has backslashes followed
    by spaces and inline comments which break line continuation; fix it by placing
    each backslash as the final character on its line and moving comments to their
    own separate lines (or above the command lines) so the continuation slashes are
    not followed by any whitespace or inline text. Update the lines containing
    "-no-snapshot-load ", "-no-audio ", and "-gpu swiftshader_indirect"
    accordingly so each trailing "" is the last character on the line and comments
    are on separate lines.

In @.claude/agents/flutter-state-management.md:

  • Line 1218: The unlabeled fenced code block starting at the opening
    triple-backticks needs a language label to satisfy MD040; update the opening
    fence to include a label such as text (e.g., change totext) so the block
    containing the checklist lines ("✓ Recommended: BLoC Pattern" etc.) is a labeled
    fenced code block.
  • Around line 534-548: The code is treating authProvider as AuthState but
    authProvider is an AsyncNotifierProvider and yields AsyncValue;
    update usages to handle AsyncValue: change the listener signature to
    ref.listen<AsyncValue>(authProvider, (previous, next) => { use
    next.whenData((state) => { if (state is Authenticated)
    Navigator.of(context).pushReplacementNamed('/home'); else if (state is
    AuthError) ScaffoldMessenger.of(context).showSnackBar(...); }); }); and update
    the UI consumer variable (where you call authState) to an AsyncValue
    and use authState.isLoading / authState.when or authState.whenData to show the
    loading spinner or return LoginForm accordingly.

In @.claude/agents/flutter-testing.md:

  • Around line 934-946: The sample test uses await inside a non-async test
    callback; update the test declaration to an async callback so awaits are valid —
    change the test(...) closure to async (e.g., test('description', () async { ...
    })) and ensure the call to useCase.call() and the
    when(repository.getData()).thenAnswer(...) remain awaited as shown; locate the
    test block referencing test('description', useCase.call(), MockRepository,
    repository.getData) and make the closure async to fix the invalid Dart sample.
  • Around line 692-703: Update the instructions to make the repository wrapper
    script the primary command: replace the raw example commands with "bash
    scripts/integration_test_patrol.sh" as the default and retain the raw flutter test/flutter drive lines only as fallbacks that explicitly include the env
    file via --dart-define-from-file=integration_test/.env.local.do-not-commit;
    specifically update the examples around the current flutter test/drive snippets
    so readers are directed to run scripts/integration_test_patrol.sh first and, if
    using raw commands, append the --dart-define-from-file flag to both flutter test integration_test/app_test.dart and the flutter drive invocation to load
    the repo’s env.

</details>

<details>
<summary>🪄 Autofix (Beta)</summary>

Fix all unresolved CodeRabbit comments on this PR:

- [ ] <!-- {"checkboxId": "4b0d0e0a-96d7-4f10-b296-3a18ea78f0b9"} --> Push a commit to this branch (recommended)
- [ ] <!-- {"checkboxId": "ff5b1114-7d8c-49e6-8ac1-43f82af23a33"} --> Create a new PR with the fixes

</details>

---

<details>
<summary>ℹ️ Review info</summary>

<details>
<summary>⚙️ Run configuration</summary>

**Configuration used**: Organization UI

**Review profile**: CHILL

**Plan**: Pro

**Run ID**: `27deca7b-a214-4a45-b0ed-a23a0aeb9072`

</details>

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 9cea2a3b9f4471a395876c02c9d553ea43f7aaab and 27a944eb59b6dd8499f054ef4d243358b6dc6b62.

</details>

<details>
<summary>📒 Files selected for processing (8)</summary>

* `.claude/SETUP.md`
* `.claude/agents/code-simplifier.md`
* `.claude/agents/flutter-architect.md`
* `.claude/agents/flutter-device-orchestrator.md`
* `.claude/agents/flutter-state-management.md`
* `.claude/agents/flutter-testing.md`
* `.claude/run-patrol`
* `.mcp.json`

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (2)</summary>

* .mcp.json
* .claude/SETUP.md

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants