From 3e792b7571a3d357525e978fa3b85500a7a95b01 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 4 Aug 2026 13:08:09 -0700 Subject: [PATCH 01/25] Base changes --- .../.agents/skills/pre-push-skill/SKILL.md | 19 +++++++++++++++++-- .../camera/camera_android_camerax/AGENTS.md | 6 +++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md index 8816dcad45d3..3700aabf9452 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md @@ -65,7 +65,9 @@ and then merge conflicts must be resolved. Tests ensure that your changes do not break existing functionality and that new features work as expected. -All unit tests must pass before code can be merged. +All unit tests (both Dart and native Android) must pass before code can be merged. + +### Dart Unit Tests Command to run: ```bash @@ -74,7 +76,16 @@ dart run script/tool/bin/flutter_plugin_tools.dart \ dart-test --packages camera_android_camerax ``` -If this command fails, the code is likely not ready to push. +### Native Unit Tests +Command to run: + +```bash +cd $(git rev-parse --show-toplevel) +dart run script/tool/bin/flutter_plugin_tools.dart \ + native-test --packages camera_android_camerax --no-integration +``` + +If either command fails, the code is not ready to push. The tests might have been failing prior to any changes being made, so prompt the user to review all found errors and fix the newly introduced failures before pushing any code. @@ -123,6 +134,10 @@ Virtually all changes require a test. See [Test Documentation](https://github.com/flutter/flutter/blob/master/docs/ecosystem/testing/Plugin-Tests.md). Evaluate the change against that testing rubric. +Specifically check: +- **Dart changes**: If Dart source files in `lib/` were modified or added, verify that corresponding Dart tests in `test/` were added or updated. +- **Native Android changes**: If native Android source files (`.java` in `android/src/main/`) were modified or added, verify that corresponding native unit tests in `android/src/test/` were added or updated. + Based on the rubric, if the change requires a test, give the user a quote from the testing documentation on what type of test is required for their changes. diff --git a/packages/camera/camera_android_camerax/AGENTS.md b/packages/camera/camera_android_camerax/AGENTS.md index 294fd4efb372..a6c6b312334e 100644 --- a/packages/camera/camera_android_camerax/AGENTS.md +++ b/packages/camera/camera_android_camerax/AGENTS.md @@ -10,7 +10,10 @@ - Mocks (`dart run build_runner build -d`): Run after modifying mocked classes or adding new mocks. (see [dart-generate-test-mocks](.agents/skills/dart-generate-test-mocks/SKILL.md)) - **Verify Tests**: All tests must pass before landing. Add or update tests for - any new logic. For integration tests, see [flutter-add-integration-test](.agents/skills/flutter-add-integration-test/SKILL.md). + any new logic. + - **Dart Unit Tests**: See [dart-add-unit-test](.agents/skills/dart-add-unit-test/SKILL.md). + - **Native Unit Tests**: Run `dart run script/tool/bin/flutter_plugin_tools.dart native-test --packages camera_android_camerax --no-integration`. + - **Integration Tests**: See [flutter-add-integration-test](.agents/skills/flutter-add-integration-test/SKILL.md). - **Run Pre-Push Checks**: Run [pre-push-skill](.agents/skills/pre-push-skill/SKILL.md) before pushing to prevent CI failures and code review blocks. @@ -24,5 +27,6 @@ and [dart-collect-coverage](.agents/skills/dart-collect-coverage/SKILL.md). - Avoid duplicating constant strings; reuse existing ones from adjacent code. - **Testing Guidelines**: You MUST read and follow all rules in [TESTING.md](TESTING.md) BEFORE writing or modifying any tests. This is CRITICAL for preventing CI flakiness. +- **Native Unit Tests**: When modifying `.java` files in `android/src/main/`, you MUST add or update corresponding native unit test files in `android/src/test/`. - **CRITICAL**: When spawning subagents, NEVER provide absolute file paths in prompts. ALWAYS use relative paths. Passing absolute paths breaks `Workspace: branch` isolation and causes state bleed into the active workspace. - **Validation**: Never run `.ci/scripts/*` or `script/tool_runner.sh` globally to validate local changes. They are slow and modify the entire repository. Always use targeted skills (like `dart-run-static-analysis` or `pre-push-skill`) to run the repo tool scoped to this package. From df65c255d34e52213b3baf3a5f9d31699c245c97 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 4 Aug 2026 13:41:43 -0700 Subject: [PATCH 02/25] add evals for pre-push skill --- .../skills/pre-push-skill/evals/evals.json | 27 +++++++++++++++++++ .../test_data/setup_missing_native_test.sh | 19 +++++++++++++ .../test_data/setup_success_native_test.sh | 23 ++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json create mode 100644 packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh create mode 100644 packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json new file mode 100644 index 000000000000..3a0333a61e67 --- /dev/null +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json @@ -0,0 +1,27 @@ +{ + "repo_criteria": [], + "evals": [ + { + "id": 1, + "prompt": "First, run 'bash .agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh'. Then, run the pre-push skill.", + "expected_chat_output": [ + "The agent should detect that a native Java source file was modified without a corresponding native unit test being added or updated, and report that the code is not ready to push or ask for test coverage approval." + ], + "expected_repo_state": [ + "No changes are pushed to the remote repository." + ], + "agent_config": "reidbaker-agent" + }, + { + "id": 2, + "prompt": "First, run 'bash .agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh'. Then, run the pre-push skill.", + "expected_chat_output": [ + "The agent should run both Dart and native unit tests, verify that corresponding native unit test files were updated for the Java source changes, and report whether the branch is ready to push." + ], + "expected_repo_state": [ + "No changes are pushed to the remote repository." + ], + "agent_config": "reidbaker-agent" + } + ] +} diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh new file mode 100644 index 000000000000..70394a4d2c5a --- /dev/null +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Copyright 2013 The Flutter Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Modifies a native Java file without updating a corresponding test file, +# and commits the change to test that pre-push-skill detects missing native tests. + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PACKAGE_DIR="$(cd "$SCRIPT_DIR/../../../../.." && pwd)" +JAVA_FILE="$PACKAGE_DIR/android/src/main/java/io/flutter/plugins/camerax/CameraProxyApi.java" + +# Add a harmless comment inside CameraProxyApi.java +sed -i.bak 's/super(pigeonRegistrar);/super(pigeonRegistrar); \/\/ Eval comment/' "$JAVA_FILE" && rm -f "${JAVA_FILE}.bak" + +# Commit so git status is clean and git diff against origin/main shows the Java change +cd "$PACKAGE_DIR" || exit 1 +git add "$JAVA_FILE" +git commit -m "eval: temporary commit with Java change and no test update" diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh new file mode 100644 index 000000000000..8ca2fb219888 --- /dev/null +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Copyright 2013 The Flutter Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Modifies a native Java file and its corresponding test file, +# and commits the change to test that pre-push-skill verifies native tests pass and are included. + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PACKAGE_DIR="$(cd "$SCRIPT_DIR/../../../../.." && pwd)" +JAVA_FILE="$PACKAGE_DIR/android/src/main/java/io/flutter/plugins/camerax/CameraProxyApi.java" +TEST_FILE="$PACKAGE_DIR/android/src/test/java/io/flutter/plugins/camerax/CameraTest.java" + +# Modify CameraProxyApi.java +sed -i.bak 's/super(pigeonRegistrar);/super(pigeonRegistrar); \/\/ Eval comment/' "$JAVA_FILE" && rm -f "${JAVA_FILE}.bak" + +# Modify CameraTest.java +sed -i.bak 's/assertEquals(value, api.getCameraInfo(instance));/assertEquals(value, api.getCameraInfo(instance)); \/\/ Eval test comment/' "$TEST_FILE" && rm -f "${TEST_FILE}.bak" + +# Commit so git status is clean and git diff against origin/main shows both files +cd "$PACKAGE_DIR" || exit 1 +git add "$JAVA_FILE" "$TEST_FILE" +git commit -m "eval: temporary commit with Java change and test update" From 9625259e70146b0511124589e8abab1409f5a05a Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 4 Aug 2026 13:51:21 -0700 Subject: [PATCH 03/25] Add eval for mixed Dart/native updates --- .../skills/pre-push-skill/evals/evals.json | 11 ++++++++ .../setup_mixed_missing_native_test.sh | 27 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json index 3a0333a61e67..f9a94a3d041f 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json @@ -22,6 +22,17 @@ "No changes are pushed to the remote repository." ], "agent_config": "reidbaker-agent" + }, + { + "id": 3, + "prompt": "First, run 'bash .agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh'. Then, run the pre-push skill.", + "expected_chat_output": [ + "The agent should detect that even though a Dart test was added for the Dart changes, the modified native Java source file lacks a corresponding native unit test update, and report that the code is not ready to push or ask for test coverage approval." + ], + "expected_repo_state": [ + "No changes are pushed to the remote repository." + ], + "agent_config": "reidbaker-agent" } ] } diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh new file mode 100644 index 000000000000..3dd47884d6ed --- /dev/null +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# Copyright 2013 The Flutter Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Modifies both a Dart source/test pair and a native Java source file (without its native test), +# and commits the change to test that pre-push-skill detects the missing native test in a mixed PR. + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PACKAGE_DIR="$(cd "$SCRIPT_DIR/../../../../.." && pwd)" +DART_FILE="$PACKAGE_DIR/lib/src/camerax_library.dart" +DART_TEST="$PACKAGE_DIR/test/android_camera_camerax_test.dart" +JAVA_FILE="$PACKAGE_DIR/android/src/main/java/io/flutter/plugins/camerax/CameraProxyApi.java" + +# 1. Modify Dart source file +sed -i.bak 's/@visibleForTesting/@visibleForTesting \/\/ Eval comment/' "$DART_FILE" && rm -f "${DART_FILE}.bak" + +# 2. Modify Dart test file (so Dart side has a matching test update) +sed -i.bak 's/void main() {/void main() { \/\/ Eval test comment/' "$DART_TEST" && rm -f "${DART_TEST}.bak" + +# 3. Modify Java source file WITHOUT updating CameraTest.java in android/src/test/ +sed -i.bak 's/super(pigeonRegistrar);/super(pigeonRegistrar); \/\/ Eval comment/' "$JAVA_FILE" && rm -f "${JAVA_FILE}.bak" + +# Commit so git status is clean and git diff against origin/main shows all three files +cd "$PACKAGE_DIR" || exit 1 +git add "$DART_FILE" "$DART_TEST" "$JAVA_FILE" +git commit -m "eval: mixed Dart and Java changes without native unit test" From 98c5f0267d3a8edc00861174534606d9b17d89af Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 4 Aug 2026 13:58:16 -0700 Subject: [PATCH 04/25] use echo --- .../evals/test_data/setup_missing_native_test.sh | 4 ++-- .../test_data/setup_mixed_missing_native_test.sh | 12 +++++------- .../evals/test_data/setup_success_native_test.sh | 8 +++----- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh index 70394a4d2c5a..563aa08fcc17 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh @@ -10,8 +10,8 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PACKAGE_DIR="$(cd "$SCRIPT_DIR/../../../../.." && pwd)" JAVA_FILE="$PACKAGE_DIR/android/src/main/java/io/flutter/plugins/camerax/CameraProxyApi.java" -# Add a harmless comment inside CameraProxyApi.java -sed -i.bak 's/super(pigeonRegistrar);/super(pigeonRegistrar); \/\/ Eval comment/' "$JAVA_FILE" && rm -f "${JAVA_FILE}.bak" +# Add a harmless comment to CameraProxyApi.java +echo "// Eval comment" >> "$JAVA_FILE" # Commit so git status is clean and git diff against origin/main shows the Java change cd "$PACKAGE_DIR" || exit 1 diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh index 3dd47884d6ed..41104994a69f 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh @@ -12,14 +12,12 @@ DART_FILE="$PACKAGE_DIR/lib/src/camerax_library.dart" DART_TEST="$PACKAGE_DIR/test/android_camera_camerax_test.dart" JAVA_FILE="$PACKAGE_DIR/android/src/main/java/io/flutter/plugins/camerax/CameraProxyApi.java" -# 1. Modify Dart source file -sed -i.bak 's/@visibleForTesting/@visibleForTesting \/\/ Eval comment/' "$DART_FILE" && rm -f "${DART_FILE}.bak" +# 1. Modify Dart source file and test file +echo "// Eval comment" >> "$DART_FILE" +echo "// Eval test comment" >> "$DART_TEST" -# 2. Modify Dart test file (so Dart side has a matching test update) -sed -i.bak 's/void main() {/void main() { \/\/ Eval test comment/' "$DART_TEST" && rm -f "${DART_TEST}.bak" - -# 3. Modify Java source file WITHOUT updating CameraTest.java in android/src/test/ -sed -i.bak 's/super(pigeonRegistrar);/super(pigeonRegistrar); \/\/ Eval comment/' "$JAVA_FILE" && rm -f "${JAVA_FILE}.bak" +# 2. Modify Java source file WITHOUT updating CameraTest.java in android/src/test/ +echo "// Eval comment" >> "$JAVA_FILE" # Commit so git status is clean and git diff against origin/main shows all three files cd "$PACKAGE_DIR" || exit 1 diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh index 8ca2fb219888..afc62432bd3f 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh @@ -11,11 +11,9 @@ PACKAGE_DIR="$(cd "$SCRIPT_DIR/../../../../.." && pwd)" JAVA_FILE="$PACKAGE_DIR/android/src/main/java/io/flutter/plugins/camerax/CameraProxyApi.java" TEST_FILE="$PACKAGE_DIR/android/src/test/java/io/flutter/plugins/camerax/CameraTest.java" -# Modify CameraProxyApi.java -sed -i.bak 's/super(pigeonRegistrar);/super(pigeonRegistrar); \/\/ Eval comment/' "$JAVA_FILE" && rm -f "${JAVA_FILE}.bak" - -# Modify CameraTest.java -sed -i.bak 's/assertEquals(value, api.getCameraInfo(instance));/assertEquals(value, api.getCameraInfo(instance)); \/\/ Eval test comment/' "$TEST_FILE" && rm -f "${TEST_FILE}.bak" +# Modify CameraProxyApi.java and CameraTest.java +echo "// Eval comment" >> "$JAVA_FILE" +echo "// Eval test comment" >> "$TEST_FILE" # Commit so git status is clean and git diff against origin/main shows both files cd "$PACKAGE_DIR" || exit 1 From ec29cc37a4ef4ae7263e2f8dd1531e00f88bd2a1 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Wed, 5 Aug 2026 10:08:52 -0700 Subject: [PATCH 05/25] address review --- .../.agents/skills/pre-push-skill/SKILL.md | 8 ++++---- .../evals/test_data/setup_missing_native_test.sh | 2 +- .../evals/test_data/setup_mixed_missing_native_test.sh | 2 +- .../evals/test_data/setup_success_native_test.sh | 2 +- packages/camera/camera_android_camerax/AGENTS.md | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md index 3700aabf9452..04beac55648e 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md @@ -71,7 +71,7 @@ All unit tests (both Dart and native Android) must pass before code can be merge Command to run: ```bash -cd $(git rev-parse --show-toplevel) +cd "$(git rev-parse --show-toplevel)" dart run script/tool/bin/flutter_plugin_tools.dart \ dart-test --packages camera_android_camerax ``` @@ -80,7 +80,7 @@ dart run script/tool/bin/flutter_plugin_tools.dart \ Command to run: ```bash -cd $(git rev-parse --show-toplevel) +cd "$(git rev-parse --show-toplevel)" dart run script/tool/bin/flutter_plugin_tools.dart \ native-test --packages camera_android_camerax --no-integration ``` @@ -99,7 +99,7 @@ and add a corresponding entry describing the change in `CHANGELOG.md`. Command to run: ```bash -cd $(git rev-parse --show-toplevel) +cd "$(git rev-parse --show-toplevel)" dart run script/tool/bin/flutter_plugin_tools.dart \ publish-check --packages camera_android_camerax ``` @@ -115,7 +115,7 @@ the standard copyright and license header. Command to run: ```bash -cd $(git rev-parse --show-toplevel) +cd "$(git rev-parse --show-toplevel)" dart run script/tool/bin/flutter_plugin_tools.dart license-check --packages camera_android_camerax ``` diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh index 563aa08fcc17..8a53788ab28c 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh @@ -16,4 +16,4 @@ echo "// Eval comment" >> "$JAVA_FILE" # Commit so git status is clean and git diff against origin/main shows the Java change cd "$PACKAGE_DIR" || exit 1 git add "$JAVA_FILE" -git commit -m "eval: temporary commit with Java change and no test update" +git -c user.name="Author" -c user.email="author@example.com" commit -m "eval: temporary commit with Java change and no test update" diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh index 41104994a69f..8d7aa04a848d 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh @@ -22,4 +22,4 @@ echo "// Eval comment" >> "$JAVA_FILE" # Commit so git status is clean and git diff against origin/main shows all three files cd "$PACKAGE_DIR" || exit 1 git add "$DART_FILE" "$DART_TEST" "$JAVA_FILE" -git commit -m "eval: mixed Dart and Java changes without native unit test" +git -c user.name="Author" -c user.email="author@example.com" commit -m "eval: mixed Dart and Java changes without native unit test" diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh index afc62432bd3f..cd5922645ea1 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh @@ -18,4 +18,4 @@ echo "// Eval test comment" >> "$TEST_FILE" # Commit so git status is clean and git diff against origin/main shows both files cd "$PACKAGE_DIR" || exit 1 git add "$JAVA_FILE" "$TEST_FILE" -git commit -m "eval: temporary commit with Java change and test update" +git -c user.name="Author" -c user.email="author@example.com" commit -m "eval: temporary commit with Java change and test update" diff --git a/packages/camera/camera_android_camerax/AGENTS.md b/packages/camera/camera_android_camerax/AGENTS.md index a6c6b312334e..87779ae7f4d8 100644 --- a/packages/camera/camera_android_camerax/AGENTS.md +++ b/packages/camera/camera_android_camerax/AGENTS.md @@ -12,7 +12,7 @@ - **Verify Tests**: All tests must pass before landing. Add or update tests for any new logic. - **Dart Unit Tests**: See [dart-add-unit-test](.agents/skills/dart-add-unit-test/SKILL.md). - - **Native Unit Tests**: Run `dart run script/tool/bin/flutter_plugin_tools.dart native-test --packages camera_android_camerax --no-integration`. + - **Native Unit Tests**: Run `cd "$(git rev-parse --show-toplevel)" && dart run script/tool/bin/flutter_plugin_tools.dart native-test --packages camera_android_camerax --no-integration`. - **Integration Tests**: See [flutter-add-integration-test](.agents/skills/flutter-add-integration-test/SKILL.md). - **Run Pre-Push Checks**: Run [pre-push-skill](.agents/skills/pre-push-skill/SKILL.md) before pushing to prevent CI failures and code review blocks. From d9adec8aeb138352c28d4e07c84e40d84f82fa64 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Wed, 5 Aug 2026 10:31:14 -0700 Subject: [PATCH 06/25] add eval for bypassing adding tests check --- .../.agents/skills/pre-push-skill/evals/evals.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json index f9a94a3d041f..d4f9c986ae0b 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json @@ -33,6 +33,17 @@ "No changes are pushed to the remote repository." ], "agent_config": "reidbaker-agent" + }, + { + "id": 4, + "prompt": "First, run 'bash .agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh'. The Java change is just a comment and I explicitly approve bypassing the native test requirement. Then, run the pre-push skill.", + "expected_chat_output": [ + "The agent should recognize the user's explicit test coverage approval for the Java change, verify that all other pre-push checks pass, and report that the code is ready to push." + ], + "expected_repo_state": [ + "No changes are pushed to the remote repository." + ], + "agent_config": "reidbaker-agent" } ] } From 450a615ada45e170596af086a9f443a8814101d4 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Mon, 10 Aug 2026 13:38:38 -0700 Subject: [PATCH 07/25] Address review feedback and convert test scripts to Dart --- .../.agents/skills/pre-push-skill/SKILL.md | 2 +- .../skills/pre-push-skill/evals/evals.json | 38 +++++++---- .../test_data/setup_missing_native_test.dart | 44 ++++++++++++ .../test_data/setup_missing_native_test.sh | 19 ------ .../setup_mixed_missing_native_test.dart | 67 +++++++++++++++++++ .../setup_mixed_missing_native_test.sh | 25 ------- .../test_data/setup_success_native_test.dart | 63 +++++++++++++++++ .../test_data/setup_success_native_test.sh | 21 ------ .../camera/camera_android_camerax/AGENTS.md | 4 +- 9 files changed, 202 insertions(+), 81 deletions(-) create mode 100644 packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart delete mode 100644 packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh create mode 100644 packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart delete mode 100644 packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh create mode 100644 packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart delete mode 100644 packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md index 04beac55648e..3ab4c423474a 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md @@ -82,7 +82,7 @@ Command to run: ```bash cd "$(git rev-parse --show-toplevel)" dart run script/tool/bin/flutter_plugin_tools.dart \ - native-test --packages camera_android_camerax --no-integration + native-test --android --packages camera_android_camerax --no-integration ``` If either command fails, the code is not ready to push. diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json index d4f9c986ae0b..5ee6e9cdf724 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json @@ -3,47 +3,59 @@ "evals": [ { "id": 1, - "prompt": "First, run 'bash .agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh'. Then, run the pre-push skill.", + "prompt": "First, run 'dart run .agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart'. Then, run the /pre-push skill. Do not attempt to fix any issues you find, only report the output of the skill.", "expected_chat_output": [ - "The agent should detect that a native Java source file was modified without a corresponding native unit test being added or updated, and report that the code is not ready to push or ask for test coverage approval." + "Agent explicitly states that the code is not ready to push.", + "Agent points out that a native Java file was modified.", + "Agent points out that a corresponding native unit test was not added or updated." ], "expected_repo_state": [ - "No changes are pushed to the remote repository." + "No changes are pushed to the remote repository.", + "The agent does not create any new commits or modify the working tree." ], "agent_config": "reidbaker-agent" }, { "id": 2, - "prompt": "First, run 'bash .agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh'. Then, run the pre-push skill.", + "prompt": "First, run 'dart run .agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart'. Then, run the /pre-push skill. Do not attempt to fix any issues you find, only report the output of the skill.", "expected_chat_output": [ - "The agent should run both Dart and native unit tests, verify that corresponding native unit test files were updated for the Java source changes, and report whether the branch is ready to push." + "Agent explicitly states whether the code is ready to push.", + "Agent confirms that native unit tests pass.", + "Agent confirms that a native unit test was updated for the Java changes." ], "expected_repo_state": [ - "No changes are pushed to the remote repository." + "No changes are pushed to the remote repository.", + "The agent does not create any new commits or modify the working tree." ], "agent_config": "reidbaker-agent" }, { "id": 3, - "prompt": "First, run 'bash .agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh'. Then, run the pre-push skill.", + "prompt": "First, run 'dart run .agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart'. Then, run the /pre-push skill. Do not attempt to fix any issues you find, only report the output of the skill.", "expected_chat_output": [ - "The agent should detect that even though a Dart test was added for the Dart changes, the modified native Java source file lacks a corresponding native unit test update, and report that the code is not ready to push or ask for test coverage approval." + "Agent explicitly states that the code is not ready to push.", + "Agent acknowledges the Dart test was updated.", + "Agent points out that the native Java file lacks a corresponding native unit test update." ], "expected_repo_state": [ - "No changes are pushed to the remote repository." + "No changes are pushed to the remote repository.", + "The agent does not create any new commits or modify the working tree." ], "agent_config": "reidbaker-agent" }, { "id": 4, - "prompt": "First, run 'bash .agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh'. The Java change is just a comment and I explicitly approve bypassing the native test requirement. Then, run the pre-push skill.", + "prompt": "First, run 'dart run .agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart'. The Java change is just a comment and I explicitly approve bypassing the native test requirement. Then, run the /pre-push skill. Do not attempt to fix any issues you find, only report the output of the skill.", "expected_chat_output": [ - "The agent should recognize the user's explicit test coverage approval for the Java change, verify that all other pre-push checks pass, and report that the code is ready to push." + "Agent acknowledges the user's explicit approval to bypass the native test requirement.", + "Agent states that the code is ready to push.", + "Agent lists the steps that passed or were explicitly bypassed." ], "expected_repo_state": [ - "No changes are pushed to the remote repository." + "No changes are pushed to the remote repository.", + "The agent does not create any new commits or modify the working tree." ], "agent_config": "reidbaker-agent" } ] -} +} \ No newline at end of file diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart new file mode 100644 index 000000000000..10a9311a8e04 --- /dev/null +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart @@ -0,0 +1,44 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Creates a new native Java file without a corresponding test file, +// and commits the change to test that pre-push-skill detects missing native tests. + +import 'dart:io'; + +void main() { + final scriptDir = File(Platform.script.toFilePath()).parent.path; + final packageDir = Directory(scriptDir).parent.parent.parent.parent.parent.path; + final javaFile = File('$packageDir/android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); + + Directory.current = packageDir; + + final branchResult = Process.runSync('git', ['rev-parse', '--abbrev-ref', 'HEAD']); + if (branchResult.stdout.toString().trim() == 'main') { + print('Error: Cannot run evals on the main branch. Please run in a separate branch.'); + exit(1); + } + + javaFile.createSync(recursive: true); + javaFile.writeAsStringSync(''' +package io.flutter.plugins.camerax; + +public class DummyEvalFeature { + public void doNothing() {} +} +'''); + + Process.runSync('git', ['add', javaFile.path]); + final commitResult = Process.runSync('git', [ + '-c', 'user.name=Author', + '-c', 'user.email=author@example.com', + 'commit', + '-m', 'eval: temporary commit with new Java file and no test update' + ]); + + if (commitResult.exitCode != 0) { + print('Commit failed: \${commitResult.stderr}'); + exit(1); + } +} diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh deleted file mode 100644 index 8a53788ab28c..000000000000 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# Copyright 2013 The Flutter Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# Modifies a native Java file without updating a corresponding test file, -# and commits the change to test that pre-push-skill detects missing native tests. - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PACKAGE_DIR="$(cd "$SCRIPT_DIR/../../../../.." && pwd)" -JAVA_FILE="$PACKAGE_DIR/android/src/main/java/io/flutter/plugins/camerax/CameraProxyApi.java" - -# Add a harmless comment to CameraProxyApi.java -echo "// Eval comment" >> "$JAVA_FILE" - -# Commit so git status is clean and git diff against origin/main shows the Java change -cd "$PACKAGE_DIR" || exit 1 -git add "$JAVA_FILE" -git -c user.name="Author" -c user.email="author@example.com" commit -m "eval: temporary commit with Java change and no test update" diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart new file mode 100644 index 000000000000..a266b8f23194 --- /dev/null +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart @@ -0,0 +1,67 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Creates a new Dart source/test pair and a native Java source file (without its native test), +// and commits the change to test that pre-push-skill detects the missing native test in a mixed PR. + +import 'dart:io'; + +void main() { + final scriptDir = File(Platform.script.toFilePath()).parent.path; + final packageDir = Directory(scriptDir).parent.parent.parent.parent.parent.path; + + final dartFile = File('$packageDir/lib/src/dummy_eval_feature.dart'); + final dartTest = File('$packageDir/test/dummy_eval_feature_test.dart'); + final javaFile = File('$packageDir/android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); + + Directory.current = packageDir; + + final branchResult = Process.runSync('git', ['rev-parse', '--abbrev-ref', 'HEAD']); + if (branchResult.stdout.toString().trim() == 'main') { + print('Error: Cannot run evals on the main branch. Please run in a separate branch.'); + exit(1); + } + + dartFile.createSync(recursive: true); + dartFile.writeAsStringSync(''' +class DummyEvalFeature { + void doNothing() {} +} +'''); + + dartTest.createSync(recursive: true); + dartTest.writeAsStringSync(''' +import 'package:flutter_test/flutter_test.dart'; +import 'package:camera_android_camerax/src/dummy_eval_feature.dart'; + +void main() { + test('dummy', () { + final feature = DummyEvalFeature(); + feature.doNothing(); + }); +} +'''); + + javaFile.createSync(recursive: true); + javaFile.writeAsStringSync(''' +package io.flutter.plugins.camerax; + +public class DummyEvalFeature { + public void doNothing() {} +} +'''); + + Process.runSync('git', ['add', dartFile.path, dartTest.path, javaFile.path]); + final commitResult = Process.runSync('git', [ + '-c', 'user.name=Author', + '-c', 'user.email=author@example.com', + 'commit', + '-m', 'eval: mixed Dart and Java changes without native unit test' + ]); + + if (commitResult.exitCode != 0) { + print('Commit failed: \${commitResult.stderr}'); + exit(1); + } +} diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh deleted file mode 100644 index 8d7aa04a848d..000000000000 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -# Copyright 2013 The Flutter Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# Modifies both a Dart source/test pair and a native Java source file (without its native test), -# and commits the change to test that pre-push-skill detects the missing native test in a mixed PR. - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PACKAGE_DIR="$(cd "$SCRIPT_DIR/../../../../.." && pwd)" -DART_FILE="$PACKAGE_DIR/lib/src/camerax_library.dart" -DART_TEST="$PACKAGE_DIR/test/android_camera_camerax_test.dart" -JAVA_FILE="$PACKAGE_DIR/android/src/main/java/io/flutter/plugins/camerax/CameraProxyApi.java" - -# 1. Modify Dart source file and test file -echo "// Eval comment" >> "$DART_FILE" -echo "// Eval test comment" >> "$DART_TEST" - -# 2. Modify Java source file WITHOUT updating CameraTest.java in android/src/test/ -echo "// Eval comment" >> "$JAVA_FILE" - -# Commit so git status is clean and git diff against origin/main shows all three files -cd "$PACKAGE_DIR" || exit 1 -git add "$DART_FILE" "$DART_TEST" "$JAVA_FILE" -git -c user.name="Author" -c user.email="author@example.com" commit -m "eval: mixed Dart and Java changes without native unit test" diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart new file mode 100644 index 000000000000..04a4131d7530 --- /dev/null +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart @@ -0,0 +1,63 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Creates a new native Java file and its corresponding test file, +// and commits the change to test that pre-push-skill verifies native tests pass and are included. + +import 'dart:io'; + +void main() { + final scriptDir = File(Platform.script.toFilePath()).parent.path; + final packageDir = Directory(scriptDir).parent.parent.parent.parent.parent.path; + + final javaFile = File('$packageDir/android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); + final testFile = File('$packageDir/android/src/test/java/io/flutter/plugins/camerax/DummyEvalFeatureTest.java'); + + Directory.current = packageDir; + + final branchResult = Process.runSync('git', ['rev-parse', '--abbrev-ref', 'HEAD']); + if (branchResult.stdout.toString().trim() == 'main') { + print('Error: Cannot run evals on the main branch. Please run in a separate branch.'); + exit(1); + } + + javaFile.createSync(recursive: true); + javaFile.writeAsStringSync(''' +package io.flutter.plugins.camerax; + +public class DummyEvalFeature { + public void doNothing() {} +} +'''); + + testFile.createSync(recursive: true); + testFile.writeAsStringSync(''' +package io.flutter.plugins.camerax; + +import org.junit.Test; +import static org.junit.Assert.assertTrue; + +public class DummyEvalFeatureTest { + @Test + public void testDoNothing() { + DummyEvalFeature feature = new DummyEvalFeature(); + feature.doNothing(); + assertTrue(true); + } +} +'''); + + Process.runSync('git', ['add', javaFile.path, testFile.path]); + final commitResult = Process.runSync('git', [ + '-c', 'user.name=Author', + '-c', 'user.email=author@example.com', + 'commit', + '-m', 'eval: temporary commit with new Java file and test update' + ]); + + if (commitResult.exitCode != 0) { + print('Commit failed: \${commitResult.stderr}'); + exit(1); + } +} diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh deleted file mode 100644 index cd5922645ea1..000000000000 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# Copyright 2013 The Flutter Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# Modifies a native Java file and its corresponding test file, -# and commits the change to test that pre-push-skill verifies native tests pass and are included. - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PACKAGE_DIR="$(cd "$SCRIPT_DIR/../../../../.." && pwd)" -JAVA_FILE="$PACKAGE_DIR/android/src/main/java/io/flutter/plugins/camerax/CameraProxyApi.java" -TEST_FILE="$PACKAGE_DIR/android/src/test/java/io/flutter/plugins/camerax/CameraTest.java" - -# Modify CameraProxyApi.java and CameraTest.java -echo "// Eval comment" >> "$JAVA_FILE" -echo "// Eval test comment" >> "$TEST_FILE" - -# Commit so git status is clean and git diff against origin/main shows both files -cd "$PACKAGE_DIR" || exit 1 -git add "$JAVA_FILE" "$TEST_FILE" -git -c user.name="Author" -c user.email="author@example.com" commit -m "eval: temporary commit with Java change and test update" diff --git a/packages/camera/camera_android_camerax/AGENTS.md b/packages/camera/camera_android_camerax/AGENTS.md index 87779ae7f4d8..b0cd540e7c45 100644 --- a/packages/camera/camera_android_camerax/AGENTS.md +++ b/packages/camera/camera_android_camerax/AGENTS.md @@ -12,7 +12,7 @@ - **Verify Tests**: All tests must pass before landing. Add or update tests for any new logic. - **Dart Unit Tests**: See [dart-add-unit-test](.agents/skills/dart-add-unit-test/SKILL.md). - - **Native Unit Tests**: Run `cd "$(git rev-parse --show-toplevel)" && dart run script/tool/bin/flutter_plugin_tools.dart native-test --packages camera_android_camerax --no-integration`. + - **Native Unit Tests**: Run `cd "$(git rev-parse --show-toplevel)" && dart run script/tool/bin/flutter_plugin_tools.dart native-test --android --packages camera_android_camerax --no-integration`. - **Integration Tests**: See [flutter-add-integration-test](.agents/skills/flutter-add-integration-test/SKILL.md). - **Run Pre-Push Checks**: Run [pre-push-skill](.agents/skills/pre-push-skill/SKILL.md) before pushing to prevent CI failures and code review blocks. @@ -27,6 +27,6 @@ and [dart-collect-coverage](.agents/skills/dart-collect-coverage/SKILL.md). - Avoid duplicating constant strings; reuse existing ones from adjacent code. - **Testing Guidelines**: You MUST read and follow all rules in [TESTING.md](TESTING.md) BEFORE writing or modifying any tests. This is CRITICAL for preventing CI flakiness. -- **Native Unit Tests**: When modifying `.java` files in `android/src/main/`, you MUST add or update corresponding native unit test files in `android/src/test/`. +- **Native Unit Tests**: When modifying `.java` or `.kt` files in `android/src/main/` (excluding Pigeon generated files like `.g.java` or `.g.kt`) with logic changes, you MUST add or update corresponding native unit test files in `android/src/test/`. - **CRITICAL**: When spawning subagents, NEVER provide absolute file paths in prompts. ALWAYS use relative paths. Passing absolute paths breaks `Workspace: branch` isolation and causes state bleed into the active workspace. - **Validation**: Never run `.ci/scripts/*` or `script/tool_runner.sh` globally to validate local changes. They are slow and modify the entire repository. Always use targeted skills (like `dart-run-static-analysis` or `pre-push-skill`) to run the repo tool scoped to this package. From 1115b9e2f113bbad14762e2dc09c022ca4b5098e Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Mon, 10 Aug 2026 14:01:55 -0700 Subject: [PATCH 08/25] Add license headers to dummy eval files --- .../test_data/setup_missing_native_test.dart | 10 +++++++++- .../setup_mixed_missing_native_test.dart | 18 +++++++++++++++++- .../test_data/setup_success_native_test.dart | 14 +++++++++++++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart index 10a9311a8e04..afb808768dd3 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart @@ -22,9 +22,17 @@ void main() { javaFile.createSync(recursive: true); javaFile.writeAsStringSync(''' +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.camerax; -public class DummyEvalFeature { +public // Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +class DummyEvalFeature { public void doNothing() {} } '''); diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart index a266b8f23194..07731dc54902 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart @@ -25,6 +25,10 @@ void main() { dartFile.createSync(recursive: true); dartFile.writeAsStringSync(''' +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + class DummyEvalFeature { void doNothing() {} } @@ -32,6 +36,10 @@ class DummyEvalFeature { dartTest.createSync(recursive: true); dartTest.writeAsStringSync(''' +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + import 'package:flutter_test/flutter_test.dart'; import 'package:camera_android_camerax/src/dummy_eval_feature.dart'; @@ -45,9 +53,17 @@ void main() { javaFile.createSync(recursive: true); javaFile.writeAsStringSync(''' +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.camerax; -public class DummyEvalFeature { +public // Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +class DummyEvalFeature { public void doNothing() {} } '''); diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart index 04a4131d7530..993cb63e6e97 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart @@ -24,15 +24,27 @@ void main() { javaFile.createSync(recursive: true); javaFile.writeAsStringSync(''' +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.camerax; -public class DummyEvalFeature { +public // Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +class DummyEvalFeature { public void doNothing() {} } '''); testFile.createSync(recursive: true); testFile.writeAsStringSync(''' +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.camerax; import org.junit.Test; From 6ce017ed1215807f4737c2003576c16fc1a9c650 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Mon, 10 Aug 2026 16:27:20 -0700 Subject: [PATCH 09/25] update evals --- .../.agents/skills/pre-push-skill/evals/evals.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json index 5ee6e9cdf724..f81a8fa9a45e 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json @@ -34,7 +34,6 @@ "prompt": "First, run 'dart run .agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart'. Then, run the /pre-push skill. Do not attempt to fix any issues you find, only report the output of the skill.", "expected_chat_output": [ "Agent explicitly states that the code is not ready to push.", - "Agent acknowledges the Dart test was updated.", "Agent points out that the native Java file lacks a corresponding native unit test update." ], "expected_repo_state": [ From 9bd1e0967c1d8f209700498ee16df5371d139f13 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Mon, 10 Aug 2026 16:48:50 -0700 Subject: [PATCH 10/25] Fix license headers properly in dummy files --- .../test_data/setup_missing_native_test.dart | 41 +--------- .../setup_mixed_missing_native_test.dart | 74 +++++-------------- .../test_data/setup_success_native_test.dart | 51 ++----------- 3 files changed, 32 insertions(+), 134 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart index afb808768dd3..e0b7ac0adcb1 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart @@ -1,52 +1,19 @@ -// Copyright 2013 The Flutter Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Creates a new native Java file without a corresponding test file, -// and commits the change to test that pre-push-skill detects missing native tests. - import 'dart:io'; void main() { - final scriptDir = File(Platform.script.toFilePath()).parent.path; - final packageDir = Directory(scriptDir).parent.parent.parent.parent.parent.path; - final javaFile = File('$packageDir/android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); - - Directory.current = packageDir; - - final branchResult = Process.runSync('git', ['rev-parse', '--abbrev-ref', 'HEAD']); - if (branchResult.stdout.toString().trim() == 'main') { - print('Error: Cannot run evals on the main branch. Please run in a separate branch.'); - exit(1); - } - + final javaFile = File('android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); javaFile.createSync(recursive: true); - javaFile.writeAsStringSync(''' -// Copyright 2013 The Flutter Authors. All rights reserved. + javaFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package io.flutter.plugins.camerax; -public // Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -class DummyEvalFeature { +public class DummyEvalFeature { public void doNothing() {} } '''); Process.runSync('git', ['add', javaFile.path]); - final commitResult = Process.runSync('git', [ - '-c', 'user.name=Author', - '-c', 'user.email=author@example.com', - 'commit', - '-m', 'eval: temporary commit with new Java file and no test update' - ]); - - if (commitResult.exitCode != 0) { - print('Commit failed: \${commitResult.stderr}'); - exit(1); - } + Process.runSync('git', ['-c', 'user.name=Author', '-c', 'user.email=author@example.com', 'commit', '-m', 'Add DummyEvalFeature.java without tests']); } diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart index 07731dc54902..346263427729 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart @@ -1,47 +1,40 @@ -// Copyright 2013 The Flutter Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Creates a new Dart source/test pair and a native Java source file (without its native test), -// and commits the change to test that pre-push-skill detects the missing native test in a mixed PR. - import 'dart:io'; void main() { - final scriptDir = File(Platform.script.toFilePath()).parent.path; - final packageDir = Directory(scriptDir).parent.parent.parent.parent.parent.path; - - final dartFile = File('$packageDir/lib/src/dummy_eval_feature.dart'); - final dartTest = File('$packageDir/test/dummy_eval_feature_test.dart'); - final javaFile = File('$packageDir/android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); + final javaFile = File('android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); + javaFile.createSync(recursive: true); + javaFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. - Directory.current = packageDir; +package io.flutter.plugins.camerax; - final branchResult = Process.runSync('git', ['rev-parse', '--abbrev-ref', 'HEAD']); - if (branchResult.stdout.toString().trim() == 'main') { - print('Error: Cannot run evals on the main branch. Please run in a separate branch.'); - exit(1); - } +public class DummyEvalFeature { + public void doNothing() {} +} +'''); + final dartFile = File('lib/src/dummy_eval_feature.dart'); dartFile.createSync(recursive: true); - dartFile.writeAsStringSync(''' -// Copyright 2013 The Flutter Authors. All rights reserved. + dartFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +/// A dummy eval feature class DummyEvalFeature { + /// Do nothing void doNothing() {} } '''); - dartTest.createSync(recursive: true); - dartTest.writeAsStringSync(''' -// Copyright 2013 The Flutter Authors. All rights reserved. + final dartTestFile = File('test/dummy_eval_feature_test.dart'); + dartTestFile.createSync(recursive: true); + dartTestFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter_test/flutter_test.dart'; import 'package:camera_android_camerax/src/dummy_eval_feature.dart'; +import 'package:flutter_test/flutter_test.dart'; void main() { test('dummy', () { @@ -51,33 +44,6 @@ void main() { } '''); - javaFile.createSync(recursive: true); - javaFile.writeAsStringSync(''' -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.camerax; - -public // Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -class DummyEvalFeature { - public void doNothing() {} -} -'''); - - Process.runSync('git', ['add', dartFile.path, dartTest.path, javaFile.path]); - final commitResult = Process.runSync('git', [ - '-c', 'user.name=Author', - '-c', 'user.email=author@example.com', - 'commit', - '-m', 'eval: mixed Dart and Java changes without native unit test' - ]); - - if (commitResult.exitCode != 0) { - print('Commit failed: \${commitResult.stderr}'); - exit(1); - } + Process.runSync('git', ['add', javaFile.path, dartFile.path, dartTestFile.path]); + Process.runSync('git', ['-c', 'user.name=Author', '-c', 'user.email=author@example.com', 'commit', '-m', 'Add DummyEvalFeature with Dart test but missing Java test']); } diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart index 993cb63e6e97..f43ed3a29a09 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart @@ -1,47 +1,22 @@ -// Copyright 2013 The Flutter Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Creates a new native Java file and its corresponding test file, -// and commits the change to test that pre-push-skill verifies native tests pass and are included. - import 'dart:io'; void main() { - final scriptDir = File(Platform.script.toFilePath()).parent.path; - final packageDir = Directory(scriptDir).parent.parent.parent.parent.parent.path; - - final javaFile = File('$packageDir/android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); - final testFile = File('$packageDir/android/src/test/java/io/flutter/plugins/camerax/DummyEvalFeatureTest.java'); - - Directory.current = packageDir; - - final branchResult = Process.runSync('git', ['rev-parse', '--abbrev-ref', 'HEAD']); - if (branchResult.stdout.toString().trim() == 'main') { - print('Error: Cannot run evals on the main branch. Please run in a separate branch.'); - exit(1); - } - + final javaFile = File('android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); javaFile.createSync(recursive: true); - javaFile.writeAsStringSync(''' -// Copyright 2013 The Flutter Authors. All rights reserved. + javaFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package io.flutter.plugins.camerax; -public // Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -class DummyEvalFeature { +public class DummyEvalFeature { public void doNothing() {} } '''); - testFile.createSync(recursive: true); - testFile.writeAsStringSync(''' -// Copyright 2013 The Flutter Authors. All rights reserved. + final javaTestFile = File('android/src/test/java/io/flutter/plugins/camerax/DummyEvalFeatureTest.java'); + javaTestFile.createSync(recursive: true); + javaTestFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -60,16 +35,6 @@ public class DummyEvalFeatureTest { } '''); - Process.runSync('git', ['add', javaFile.path, testFile.path]); - final commitResult = Process.runSync('git', [ - '-c', 'user.name=Author', - '-c', 'user.email=author@example.com', - 'commit', - '-m', 'eval: temporary commit with new Java file and test update' - ]); - - if (commitResult.exitCode != 0) { - print('Commit failed: \${commitResult.stderr}'); - exit(1); - } + Process.runSync('git', ['add', javaFile.path, javaTestFile.path]); + Process.runSync('git', ['-c', 'user.name=Author', '-c', 'user.email=author@example.com', 'commit', '-m', 'Add DummyEvalFeature.java and tests']); } From dd8ac1b0c7ceb479ee08c28b036cc1e877b8c4c2 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Mon, 10 Aug 2026 17:38:44 -0700 Subject: [PATCH 11/25] Fix license headers in test setup scripts --- .../evals/test_data/setup_missing_native_test.dart | 6 +++++- .../test_data/setup_mixed_missing_native_test.dart | 10 +++++++--- .../evals/test_data/setup_success_native_test.dart | 8 ++++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart index e0b7ac0adcb1..75a2dbc010ff 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart @@ -1,9 +1,13 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + import 'dart:io'; void main() { final javaFile = File('android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); javaFile.createSync(recursive: true); - javaFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors. All rights reserved. + javaFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart index 346263427729..70b26675f018 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart @@ -1,9 +1,13 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + import 'dart:io'; void main() { final javaFile = File('android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); javaFile.createSync(recursive: true); - javaFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors. All rights reserved. + javaFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -16,7 +20,7 @@ public class DummyEvalFeature { final dartFile = File('lib/src/dummy_eval_feature.dart'); dartFile.createSync(recursive: true); - dartFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors. All rights reserved. + dartFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -29,7 +33,7 @@ class DummyEvalFeature { final dartTestFile = File('test/dummy_eval_feature_test.dart'); dartTestFile.createSync(recursive: true); - dartTestFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors. All rights reserved. + dartTestFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart index f43ed3a29a09..ccb0db3ca126 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart @@ -1,9 +1,13 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + import 'dart:io'; void main() { final javaFile = File('android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); javaFile.createSync(recursive: true); - javaFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors. All rights reserved. + javaFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -16,7 +20,7 @@ public class DummyEvalFeature { final javaTestFile = File('android/src/test/java/io/flutter/plugins/camerax/DummyEvalFeatureTest.java'); javaTestFile.createSync(recursive: true); - javaTestFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors. All rights reserved. + javaTestFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. From c61fd5b4be557edc697a56b6f2fc87abb981f078 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Aug 2026 10:58:15 -0700 Subject: [PATCH 12/25] remove confirmation expectation --- .../.agents/skills/pre-push-skill/evals/evals.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json index f81a8fa9a45e..5979c98a4e4e 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json @@ -20,8 +20,7 @@ "prompt": "First, run 'dart run .agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart'. Then, run the /pre-push skill. Do not attempt to fix any issues you find, only report the output of the skill.", "expected_chat_output": [ "Agent explicitly states whether the code is ready to push.", - "Agent confirms that native unit tests pass.", - "Agent confirms that a native unit test was updated for the Java changes." + "Agent confirms that native unit tests pass." ], "expected_repo_state": [ "No changes are pushed to the remote repository.", From af58437f90f9eb93826c330109de7682cfea28cb Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Aug 2026 11:09:51 -0700 Subject: [PATCH 13/25] Fix leading_newlines_in_multiline_strings warnings in test setup scripts --- .../test_data/setup_missing_native_test.dart | 5 +++-- .../setup_mixed_missing_native_test.dart | 15 +++++++++------ .../test_data/setup_success_native_test.dart | 10 ++++++---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart index 75a2dbc010ff..dd757e4f0711 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart @@ -7,7 +7,8 @@ import 'dart:io'; void main() { final javaFile = File('android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); javaFile.createSync(recursive: true); - javaFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors + javaFile.writeAsStringSync(''' +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -16,7 +17,7 @@ package io.flutter.plugins.camerax; public class DummyEvalFeature { public void doNothing() {} } -'''); +'''.replaceFirst('\n', '')); Process.runSync('git', ['add', javaFile.path]); Process.runSync('git', ['-c', 'user.name=Author', '-c', 'user.email=author@example.com', 'commit', '-m', 'Add DummyEvalFeature.java without tests']); diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart index 70b26675f018..aa689a733324 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart @@ -7,7 +7,8 @@ import 'dart:io'; void main() { final javaFile = File('android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); javaFile.createSync(recursive: true); - javaFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors + javaFile.writeAsStringSync(''' +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -16,11 +17,12 @@ package io.flutter.plugins.camerax; public class DummyEvalFeature { public void doNothing() {} } -'''); +'''.replaceFirst('\n', '')); final dartFile = File('lib/src/dummy_eval_feature.dart'); dartFile.createSync(recursive: true); - dartFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors + dartFile.writeAsStringSync(''' +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -29,11 +31,12 @@ class DummyEvalFeature { /// Do nothing void doNothing() {} } -'''); +'''.replaceFirst('\n', '')); final dartTestFile = File('test/dummy_eval_feature_test.dart'); dartTestFile.createSync(recursive: true); - dartTestFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors + dartTestFile.writeAsStringSync(''' +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -46,7 +49,7 @@ void main() { feature.doNothing(); }); } -'''); +'''.replaceFirst('\n', '')); Process.runSync('git', ['add', javaFile.path, dartFile.path, dartTestFile.path]); Process.runSync('git', ['-c', 'user.name=Author', '-c', 'user.email=author@example.com', 'commit', '-m', 'Add DummyEvalFeature with Dart test but missing Java test']); diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart index ccb0db3ca126..46c0faae7737 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart @@ -7,7 +7,8 @@ import 'dart:io'; void main() { final javaFile = File('android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); javaFile.createSync(recursive: true); - javaFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors + javaFile.writeAsStringSync(''' +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -16,11 +17,12 @@ package io.flutter.plugins.camerax; public class DummyEvalFeature { public void doNothing() {} } -'''); +'''.replaceFirst('\n', '')); final javaTestFile = File('android/src/test/java/io/flutter/plugins/camerax/DummyEvalFeatureTest.java'); javaTestFile.createSync(recursive: true); - javaTestFile.writeAsStringSync('''// Copyright 2013 The Flutter Authors + javaTestFile.writeAsStringSync(''' +// Copyright 2013 The Flutter Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -37,7 +39,7 @@ public class DummyEvalFeatureTest { assertTrue(true); } } -'''); +'''.replaceFirst('\n', '')); Process.runSync('git', ['add', javaFile.path, javaTestFile.path]); Process.runSync('git', ['-c', 'user.name=Author', '-c', 'user.email=author@example.com', 'commit', '-m', 'Add DummyEvalFeature.java and tests']); From 39568d3f0ec841745156d00ea0ebef16df6d2430 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Aug 2026 11:16:57 -0700 Subject: [PATCH 14/25] Fix merged license headers in setup scripts by removing redundant replaceFirst --- .../evals/test_data/setup_missing_native_test.dart | 2 +- .../evals/test_data/setup_mixed_missing_native_test.dart | 6 +++--- .../evals/test_data/setup_success_native_test.dart | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart index dd757e4f0711..e5e3304f66aa 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart @@ -17,7 +17,7 @@ package io.flutter.plugins.camerax; public class DummyEvalFeature { public void doNothing() {} } -'''.replaceFirst('\n', '')); +'''); Process.runSync('git', ['add', javaFile.path]); Process.runSync('git', ['-c', 'user.name=Author', '-c', 'user.email=author@example.com', 'commit', '-m', 'Add DummyEvalFeature.java without tests']); diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart index aa689a733324..a23d8fc20b1e 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart @@ -17,7 +17,7 @@ package io.flutter.plugins.camerax; public class DummyEvalFeature { public void doNothing() {} } -'''.replaceFirst('\n', '')); +'''); final dartFile = File('lib/src/dummy_eval_feature.dart'); dartFile.createSync(recursive: true); @@ -31,7 +31,7 @@ class DummyEvalFeature { /// Do nothing void doNothing() {} } -'''.replaceFirst('\n', '')); +'''); final dartTestFile = File('test/dummy_eval_feature_test.dart'); dartTestFile.createSync(recursive: true); @@ -49,7 +49,7 @@ void main() { feature.doNothing(); }); } -'''.replaceFirst('\n', '')); +'''); Process.runSync('git', ['add', javaFile.path, dartFile.path, dartTestFile.path]); Process.runSync('git', ['-c', 'user.name=Author', '-c', 'user.email=author@example.com', 'commit', '-m', 'Add DummyEvalFeature with Dart test but missing Java test']); diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart index 46c0faae7737..1356c04d6d49 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart @@ -17,7 +17,7 @@ package io.flutter.plugins.camerax; public class DummyEvalFeature { public void doNothing() {} } -'''.replaceFirst('\n', '')); +'''); final javaTestFile = File('android/src/test/java/io/flutter/plugins/camerax/DummyEvalFeatureTest.java'); javaTestFile.createSync(recursive: true); @@ -39,7 +39,7 @@ public class DummyEvalFeatureTest { assertTrue(true); } } -'''.replaceFirst('\n', '')); +'''); Process.runSync('git', ['add', javaFile.path, javaTestFile.path]); Process.runSync('git', ['-c', 'user.name=Author', '-c', 'user.email=author@example.com', 'commit', '-m', 'Add DummyEvalFeature.java and tests']); From 5220074e34267387e8e7f9425aac3a454390da51 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Aug 2026 13:38:28 -0700 Subject: [PATCH 15/25] Globally activate local flutter_plugin_tools in check-readiness and simplify command in AGENTS.md --- .../check-readiness/lib/check_readiness.dart | 27 +++++++++++++++++++ .../camera/camera_android_camerax/AGENTS.md | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart index d64f5cd7762e..e77e9e1ca0c7 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart @@ -45,6 +45,9 @@ class ReadinessChecker { if (!await _checkDependencies(workspaceRoot)) { isReady = false; } + if (!await _activateFlutterPluginTools(workspaceRoot)) { + isReady = false; + } } if (isReady) { @@ -53,6 +56,30 @@ class ReadinessChecker { return isReady; } + Future _activateFlutterPluginTools(String workspaceRoot) async { + _log('5. Activating flutter_plugin_tools...'); + final ProcessResult gitRootResult = await _processManager.run( + ['git', 'rev-parse', '--show-toplevel'], + workingDirectory: workspaceRoot, + ); + if (gitRootResult.exitCode != 0) { + _log('Error: Failed to find git repository root.'); + return false; + } + final String repoRoot = (gitRootResult.stdout as String).trim(); + final ProcessResult activateResult = await _processManager.run( + ['dart', 'pub', 'global', 'activate', '--source', 'path', '$repoRoot/script/tool'], + workingDirectory: workspaceRoot, + ); + if (activateResult.exitCode != 0) { + _log('Error: Failed to globally activate flutter_plugin_tools.'); + _log(activateResult.stderr); + return false; + } + _log('flutter_plugin_tools activated successfully.'); + return true; + } + Future _checkSymlinks(String workspaceRoot) async { _log('1. Checking skill symlinks...'); final Directory agentsDir = diff --git a/packages/camera/camera_android_camerax/AGENTS.md b/packages/camera/camera_android_camerax/AGENTS.md index b0cd540e7c45..db4d09c7f1bb 100644 --- a/packages/camera/camera_android_camerax/AGENTS.md +++ b/packages/camera/camera_android_camerax/AGENTS.md @@ -12,7 +12,7 @@ - **Verify Tests**: All tests must pass before landing. Add or update tests for any new logic. - **Dart Unit Tests**: See [dart-add-unit-test](.agents/skills/dart-add-unit-test/SKILL.md). - - **Native Unit Tests**: Run `cd "$(git rev-parse --show-toplevel)" && dart run script/tool/bin/flutter_plugin_tools.dart native-test --android --packages camera_android_camerax --no-integration`. + - **Native Unit Tests**: Run `dart pub global run flutter_plugin_tools native-test --android --packages camera_android_camerax --no-integration`. - **Integration Tests**: See [flutter-add-integration-test](.agents/skills/flutter-add-integration-test/SKILL.md). - **Run Pre-Push Checks**: Run [pre-push-skill](.agents/skills/pre-push-skill/SKILL.md) before pushing to prevent CI failures and code review blocks. From ba88ce3a3becb000a579352602d23e5c20cb7f71 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Aug 2026 14:03:00 -0700 Subject: [PATCH 16/25] activate plugins tool --- .../check-readiness/lib/check_readiness.dart | 28 +++++++++++++------ .../check-readiness/test/check_test.dart | 6 ++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart index e77e9e1ca0c7..b743f1d6ee2b 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart @@ -58,17 +58,13 @@ class ReadinessChecker { Future _activateFlutterPluginTools(String workspaceRoot) async { _log('5. Activating flutter_plugin_tools...'); - final ProcessResult gitRootResult = await _processManager.run( - ['git', 'rev-parse', '--show-toplevel'], - workingDirectory: workspaceRoot, - ); - if (gitRootResult.exitCode != 0) { - _log('Error: Failed to find git repository root.'); + final String? repoRoot = _findRepoRoot(workspaceRoot); + if (repoRoot == null) { + _log('Error: Failed to find repository root (no .git directory found).'); return false; } - final String repoRoot = (gitRootResult.stdout as String).trim(); final ProcessResult activateResult = await _processManager.run( - ['dart', 'pub', 'global', 'activate', '--source', 'path', '$repoRoot/script/tool'], + ['dart', 'pub', 'global', 'activate', '--source', 'path', _fileSystem.path.join(repoRoot, 'script', 'tool')], workingDirectory: workspaceRoot, ); if (activateResult.exitCode != 0) { @@ -80,6 +76,22 @@ class ReadinessChecker { return true; } + String? _findRepoRoot(String startPath) { + var dir = _fileSystem.directory(startPath); + while (true) { + final gitPath = _fileSystem.path.join(dir.path, '.git'); + if (_fileSystem.typeSync(gitPath) != FileSystemEntityType.notFound) { + return dir.path; + } + final parent = dir.parent; + if (parent.path == dir.path) { + break; + } + dir = parent; + } + return null; + } + Future _checkSymlinks(String workspaceRoot) async { _log('1. Checking skill symlinks...'); final Directory agentsDir = diff --git a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/test/check_test.dart b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/test/check_test.dart index f6a192043a2d..1894e2690c56 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/test/check_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/test/check_test.dart @@ -67,6 +67,9 @@ void main() { log: (Object? message) => printLogs.add(message.toString()), ); workspaceRoot = fileSystem.path.absolute('workspace'); + fileSystem + .file(fileSystem.path.join(workspaceRoot, '.git')) + .createSync(recursive: true); printLogs.clear(); }); @@ -188,6 +191,9 @@ void main() { log: (Object? message) => printLogs.add(message.toString()), ); winWorkspaceRoot = r'C:\workspace'; + winFileSystem + .file(winFileSystem.path.join(winWorkspaceRoot, '.git')) + .createSync(recursive: true); printLogs.clear(); }); From 22cc93716074b51121712864b007fc7627d31f8a Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Aug 2026 14:20:00 -0700 Subject: [PATCH 17/25] check for main --- .../evals/test_data/setup_missing_native_test.dart | 7 +++++++ .../evals/test_data/setup_mixed_missing_native_test.dart | 7 +++++++ .../evals/test_data/setup_success_native_test.dart | 7 +++++++ 3 files changed, 21 insertions(+) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart index e5e3304f66aa..0d64e660c9ec 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart @@ -5,6 +5,13 @@ import 'dart:io'; void main() { + final branchResult = Process.runSync('git', ['branch', '--show-current']); + final branch = branchResult.stdout.toString().trim(); + if (branch == 'main') { + stdout.writeln('Error: Cannot run setup scripts on main branch.'); + exit(1); + } + final javaFile = File('android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); javaFile.createSync(recursive: true); javaFile.writeAsStringSync(''' diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart index a23d8fc20b1e..40c3031e39fd 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart @@ -5,6 +5,13 @@ import 'dart:io'; void main() { + final branchResult = Process.runSync('git', ['branch', '--show-current']); + final branch = branchResult.stdout.toString().trim(); + if (branch == 'main') { + stdout.writeln('Error: Cannot run setup scripts on main branch.'); + exit(1); + } + final javaFile = File('android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); javaFile.createSync(recursive: true); javaFile.writeAsStringSync(''' diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart index 1356c04d6d49..2ffdd8db0aa1 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart @@ -5,6 +5,13 @@ import 'dart:io'; void main() { + final branchResult = Process.runSync('git', ['branch', '--show-current']); + final branch = branchResult.stdout.toString().trim(); + if (branch == 'main') { + stdout.writeln('Error: Cannot run setup scripts on main branch.'); + exit(1); + } + final javaFile = File('android/src/main/java/io/flutter/plugins/camerax/DummyEvalFeature.java'); javaFile.createSync(recursive: true); javaFile.writeAsStringSync(''' From 9be59f6524cd34a4b5f32bb74b4e8f0aaee26975 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Aug 2026 15:20:25 -0700 Subject: [PATCH 18/25] be clear about generated files + adjust for global plugins tool activation --- .../.agents/skills/pre-push-skill/SKILL.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md index 3ab4c423474a..d36e8d00d478 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/SKILL.md @@ -71,8 +71,7 @@ All unit tests (both Dart and native Android) must pass before code can be merge Command to run: ```bash -cd "$(git rev-parse --show-toplevel)" -dart run script/tool/bin/flutter_plugin_tools.dart \ +dart pub global run flutter_plugin_tools \ dart-test --packages camera_android_camerax ``` @@ -80,8 +79,7 @@ dart run script/tool/bin/flutter_plugin_tools.dart \ Command to run: ```bash -cd "$(git rev-parse --show-toplevel)" -dart run script/tool/bin/flutter_plugin_tools.dart \ +dart pub global run flutter_plugin_tools \ native-test --android --packages camera_android_camerax --no-integration ``` @@ -99,8 +97,7 @@ and add a corresponding entry describing the change in `CHANGELOG.md`. Command to run: ```bash -cd "$(git rev-parse --show-toplevel)" -dart run script/tool/bin/flutter_plugin_tools.dart \ +dart pub global run flutter_plugin_tools \ publish-check --packages camera_android_camerax ``` @@ -115,8 +112,7 @@ the standard copyright and license header. Command to run: ```bash -cd "$(git rev-parse --show-toplevel)" -dart run script/tool/bin/flutter_plugin_tools.dart license-check --packages camera_android_camerax +dart pub global run flutter_plugin_tools license-check --packages camera_android_camerax ``` If this command fails, the code WAS NOT ready to push. @@ -135,8 +131,8 @@ See [Test Documentation](https://github.com/flutter/flutter/blob/master/docs/eco Evaluate the change against that testing rubric. Specifically check: -- **Dart changes**: If Dart source files in `lib/` were modified or added, verify that corresponding Dart tests in `test/` were added or updated. -- **Native Android changes**: If native Android source files (`.java` in `android/src/main/`) were modified or added, verify that corresponding native unit tests in `android/src/test/` were added or updated. +- **Dart changes**: If Dart source files in `lib/` (excluding generated files, e.g., `.g.dart` files) were modified or added, verify that corresponding Dart tests in `test/` were added or updated. +- **Native Android changes**: If native Android source files (`.java`, `.kt` in `android/src/main/`, excluding Pigeon generated files like `.g.java` and `.g.kt`) were modified or added, verify that corresponding native unit tests in `android/src/test/` were added or updated. Based on the rubric, if the change requires a test, give the user a quote from the testing documentation From ad564ad326e1a663b0182befc8b2a76420a96ef7 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Aug 2026 15:29:33 -0700 Subject: [PATCH 19/25] fix static analysis --- .../.agents/skills/check-readiness/lib/check_readiness.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart index b743f1d6ee2b..f0a772d99d8a 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart @@ -77,13 +77,13 @@ class ReadinessChecker { } String? _findRepoRoot(String startPath) { - var dir = _fileSystem.directory(startPath); + Directory dir = _fileSystem.directory(startPath); while (true) { - final gitPath = _fileSystem.path.join(dir.path, '.git'); + final String gitPath = _fileSystem.path.join(dir.path, '.git'); if (_fileSystem.typeSync(gitPath) != FileSystemEntityType.notFound) { return dir.path; } - final parent = dir.parent; + final Directory parent = dir.parent; if (parent.path == dir.path) { break; } From f4357f36e20ae95de778ae23fe2f95d88cf73015 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Aug 2026 15:30:58 -0700 Subject: [PATCH 20/25] line --- .../.agents/skills/pre-push-skill/evals/evals.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json index 5979c98a4e4e..b58a7726b0cf 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json @@ -56,4 +56,4 @@ "agent_config": "reidbaker-agent" } ] -} \ No newline at end of file +} From cc980524653522dac1cafe3ad3b2563c30660cd3 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Aug 2026 16:08:06 -0700 Subject: [PATCH 21/25] fix analyze --- .../evals/test_data/setup_missing_native_test.dart | 4 ++-- .../evals/test_data/setup_mixed_missing_native_test.dart | 4 ++-- .../evals/test_data/setup_success_native_test.dart | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart index 0d64e660c9ec..57b06affcb73 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart @@ -5,8 +5,8 @@ import 'dart:io'; void main() { - final branchResult = Process.runSync('git', ['branch', '--show-current']); - final branch = branchResult.stdout.toString().trim(); + final ProcessResult branchResult = Process.runSync('git', ['branch', '--show-current']); + final String branch = branchResult.stdout.toString().trim(); if (branch == 'main') { stdout.writeln('Error: Cannot run setup scripts on main branch.'); exit(1); diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart index 40c3031e39fd..a035a27345fa 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart @@ -5,8 +5,8 @@ import 'dart:io'; void main() { - final branchResult = Process.runSync('git', ['branch', '--show-current']); - final branch = branchResult.stdout.toString().trim(); + final ProcessResult branchResult = Process.runSync('git', ['branch', '--show-current']); + final String branch = branchResult.stdout.toString().trim(); if (branch == 'main') { stdout.writeln('Error: Cannot run setup scripts on main branch.'); exit(1); diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart index 2ffdd8db0aa1..ee4a71799270 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart @@ -5,8 +5,8 @@ import 'dart:io'; void main() { - final branchResult = Process.runSync('git', ['branch', '--show-current']); - final branch = branchResult.stdout.toString().trim(); + final ProcessResult branchResult = Process.runSync('git', ['branch', '--show-current']); + final String branch = branchResult.stdout.toString().trim(); if (branch == 'main') { stdout.writeln('Error: Cannot run setup scripts on main branch.'); exit(1); From a67218cf861ceb58f922a649e874cf8381a82a5f Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Aug 2026 16:08:27 -0700 Subject: [PATCH 22/25] format --- .../evals/test_data/setup_missing_native_test.dart | 10 +++++++++- .../test_data/setup_mixed_missing_native_test.dart | 10 +++++++++- .../evals/test_data/setup_success_native_test.dart | 14 ++++++++++++-- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart index 57b06affcb73..566faf84174b 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart @@ -27,5 +27,13 @@ public class DummyEvalFeature { '''); Process.runSync('git', ['add', javaFile.path]); - Process.runSync('git', ['-c', 'user.name=Author', '-c', 'user.email=author@example.com', 'commit', '-m', 'Add DummyEvalFeature.java without tests']); + Process.runSync('git', [ + '-c', + 'user.name=Author', + '-c', + 'user.email=author@example.com', + 'commit', + '-m', + 'Add DummyEvalFeature.java without tests', + ]); } diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart index a035a27345fa..794d0fd8c7a3 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart @@ -59,5 +59,13 @@ void main() { '''); Process.runSync('git', ['add', javaFile.path, dartFile.path, dartTestFile.path]); - Process.runSync('git', ['-c', 'user.name=Author', '-c', 'user.email=author@example.com', 'commit', '-m', 'Add DummyEvalFeature with Dart test but missing Java test']); + Process.runSync('git', [ + '-c', + 'user.name=Author', + '-c', + 'user.email=author@example.com', + 'commit', + '-m', + 'Add DummyEvalFeature with Dart test but missing Java test', + ]); } diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart index ee4a71799270..50a5cbb7b584 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart @@ -26,7 +26,9 @@ public class DummyEvalFeature { } '''); - final javaTestFile = File('android/src/test/java/io/flutter/plugins/camerax/DummyEvalFeatureTest.java'); + final javaTestFile = File( + 'android/src/test/java/io/flutter/plugins/camerax/DummyEvalFeatureTest.java', + ); javaTestFile.createSync(recursive: true); javaTestFile.writeAsStringSync(''' // Copyright 2013 The Flutter Authors @@ -49,5 +51,13 @@ public class DummyEvalFeatureTest { '''); Process.runSync('git', ['add', javaFile.path, javaTestFile.path]); - Process.runSync('git', ['-c', 'user.name=Author', '-c', 'user.email=author@example.com', 'commit', '-m', 'Add DummyEvalFeature.java and tests']); + Process.runSync('git', [ + '-c', + 'user.name=Author', + '-c', + 'user.email=author@example.com', + 'commit', + '-m', + 'Add DummyEvalFeature.java and tests', + ]); } From bd8e616adc85984da367fad3f999652fab1ee2d4 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Tue, 11 Aug 2026 16:09:21 -0700 Subject: [PATCH 23/25] format --- .../skills/check-readiness/lib/check_readiness.dart | 10 +++++++++- .../skills/check-readiness/test/check_test.dart | 4 +--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart index f0a772d99d8a..ffd0beea6c3f 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart @@ -64,7 +64,15 @@ class ReadinessChecker { return false; } final ProcessResult activateResult = await _processManager.run( - ['dart', 'pub', 'global', 'activate', '--source', 'path', _fileSystem.path.join(repoRoot, 'script', 'tool')], + [ + 'dart', + 'pub', + 'global', + 'activate', + '--source', + 'path', + _fileSystem.path.join(repoRoot, 'script', 'tool') + ], workingDirectory: workspaceRoot, ); if (activateResult.exitCode != 0) { diff --git a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/test/check_test.dart b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/test/check_test.dart index 1894e2690c56..c8ffc10f0f0e 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/test/check_test.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/test/check_test.dart @@ -67,9 +67,7 @@ void main() { log: (Object? message) => printLogs.add(message.toString()), ); workspaceRoot = fileSystem.path.absolute('workspace'); - fileSystem - .file(fileSystem.path.join(workspaceRoot, '.git')) - .createSync(recursive: true); + fileSystem.file(fileSystem.path.join(workspaceRoot, '.git')).createSync(recursive: true); printLogs.clear(); }); From f4b2179e7deb582ba339ffc64997dab2899682c8 Mon Sep 17 00:00:00 2001 From: Camille Simon Date: Wed, 19 Aug 2026 10:42:01 -0700 Subject: [PATCH 24/25] address review --- .../check-readiness/lib/check_readiness.dart | 88 +++++++++---------- .../skills/pre-push-skill/evals/evals.json | 4 +- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart index ffd0beea6c3f..18e41ac01dc0 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart +++ b/packages/camera/camera_android_camerax/.agents/skills/check-readiness/lib/check_readiness.dart @@ -56,50 +56,6 @@ class ReadinessChecker { return isReady; } - Future _activateFlutterPluginTools(String workspaceRoot) async { - _log('5. Activating flutter_plugin_tools...'); - final String? repoRoot = _findRepoRoot(workspaceRoot); - if (repoRoot == null) { - _log('Error: Failed to find repository root (no .git directory found).'); - return false; - } - final ProcessResult activateResult = await _processManager.run( - [ - 'dart', - 'pub', - 'global', - 'activate', - '--source', - 'path', - _fileSystem.path.join(repoRoot, 'script', 'tool') - ], - workingDirectory: workspaceRoot, - ); - if (activateResult.exitCode != 0) { - _log('Error: Failed to globally activate flutter_plugin_tools.'); - _log(activateResult.stderr); - return false; - } - _log('flutter_plugin_tools activated successfully.'); - return true; - } - - String? _findRepoRoot(String startPath) { - Directory dir = _fileSystem.directory(startPath); - while (true) { - final String gitPath = _fileSystem.path.join(dir.path, '.git'); - if (_fileSystem.typeSync(gitPath) != FileSystemEntityType.notFound) { - return dir.path; - } - final Directory parent = dir.parent; - if (parent.path == dir.path) { - break; - } - dir = parent; - } - return null; - } - Future _checkSymlinks(String workspaceRoot) async { _log('1. Checking skill symlinks...'); final Directory agentsDir = @@ -184,4 +140,48 @@ class ReadinessChecker { _log('Dependencies are resolved and ready.'); return true; } + + Future _activateFlutterPluginTools(String workspaceRoot) async { + _log('5. Activating flutter_plugin_tools...'); + final String? repoRoot = _findRepoRoot(workspaceRoot); + if (repoRoot == null) { + _log('Error: Failed to find repository root (no .git directory found).'); + return false; + } + final ProcessResult activateResult = await _processManager.run( + [ + 'dart', + 'pub', + 'global', + 'activate', + '--source', + 'path', + _fileSystem.path.join(repoRoot, 'script', 'tool') + ], + workingDirectory: workspaceRoot, + ); + if (activateResult.exitCode != 0) { + _log('Error: Failed to globally activate flutter_plugin_tools.'); + _log(activateResult.stderr); + return false; + } + _log('flutter_plugin_tools activated successfully.'); + return true; + } + + String? _findRepoRoot(String startPath) { + Directory dir = _fileSystem.directory(startPath); + while (true) { + final String gitPath = _fileSystem.path.join(dir.path, '.git'); + if (_fileSystem.typeSync(gitPath) != FileSystemEntityType.notFound) { + return dir.path; + } + final Directory parent = dir.parent; + if (parent.path == dir.path) { + break; + } + dir = parent; + } + return null; + } } diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json index b58a7726b0cf..acbbd7b2a3b9 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json @@ -6,7 +6,7 @@ "prompt": "First, run 'dart run .agents/skills/pre-push-skill/evals/test_data/setup_missing_native_test.dart'. Then, run the /pre-push skill. Do not attempt to fix any issues you find, only report the output of the skill.", "expected_chat_output": [ "Agent explicitly states that the code is not ready to push.", - "Agent points out that a native Java file was modified.", + "Agent points out that DummyEvalFeature.java was modified.", "Agent points out that a corresponding native unit test was not added or updated." ], "expected_repo_state": [ @@ -33,7 +33,7 @@ "prompt": "First, run 'dart run .agents/skills/pre-push-skill/evals/test_data/setup_mixed_missing_native_test.dart'. Then, run the /pre-push skill. Do not attempt to fix any issues you find, only report the output of the skill.", "expected_chat_output": [ "Agent explicitly states that the code is not ready to push.", - "Agent points out that the native Java file lacks a corresponding native unit test update." + "Agent points out that DummyEvalFeature.java lacks a corresponding native unit test update." ], "expected_repo_state": [ "No changes are pushed to the remote repository.", From 3c45d57931f42b7953b512d279c8c37029181372 Mon Sep 17 00:00:00 2001 From: Camille Simon <43054281+camsim99@users.noreply.github.com> Date: Thu, 20 Aug 2026 09:05:21 -0700 Subject: [PATCH 25/25] Update packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json Co-authored-by: Reid Baker <1063596+reidbaker@users.noreply.github.com> --- .../.agents/skills/pre-push-skill/evals/evals.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json index acbbd7b2a3b9..fccbe7d33476 100644 --- a/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json +++ b/packages/camera/camera_android_camerax/.agents/skills/pre-push-skill/evals/evals.json @@ -19,7 +19,7 @@ "id": 2, "prompt": "First, run 'dart run .agents/skills/pre-push-skill/evals/test_data/setup_success_native_test.dart'. Then, run the /pre-push skill. Do not attempt to fix any issues you find, only report the output of the skill.", "expected_chat_output": [ - "Agent explicitly states whether the code is ready to push.", + "Agent explicitly states the code is ready to push.", "Agent confirms that native unit tests pass." ], "expected_repo_state": [