Support use-flutter option in groundskeeper workflow (#444)
diff --git a/.github/workflows/groundskeeper.yml b/.github/workflows/groundskeeper.yml
index 20aac3c..d6856ff 100644
--- a/.github/workflows/groundskeeper.yml
+++ b/.github/workflows/groundskeeper.yml
@@ -5,10 +5,15 @@
   workflow_call:
     inputs:
       sdk:
-        description: 'Dart SDK version'
+        description: 'Dart SDK version or Flutter channel'
         required: false
         type: string
         default: 'dev'
+      use-flutter:
+        description: 'Whether to use Flutter for this package'
+        required: false
+        type: boolean
+        default: false
       directory:
         description: 'The directory to tidy'
         required: false
@@ -63,19 +68,30 @@
         with:
           client-id: ${{ vars.ECOSYSTEM_BOT_CLIENT_ID }}
           private-key: ${{ secrets.ECOSYSTEM_BOT_PRIVATE_KEY }}
+          permission-contents: write
+          permission-pull-requests: write
 
       - name: Checkout caller repo
         uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
         with:
           token: ${{ steps.generate-token.outputs.token }}
+          persist-credentials: false
 
       - name: Checkout ecosystem (for tidy script)
         uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0
         with:
           repository: dart-lang/ecosystem
           path: .github/ecosystem-helper
+          persist-credentials: false
+
+      - uses: subosito/flutter-action@1a449444c387b1966244ae4d4f8c696479add0b2
+        if: ${{ inputs.use-flutter }}
+        with:
+          channel: ${{ inputs.sdk == 'dev' && 'master' || inputs.sdk }}
+          cache: true
 
       - uses: dart-lang/setup-dart@65eb853c7ba17dde3be364c3d2858773e7144260
+        if: ${{ !inputs.use-flutter }}
         with:
           sdk: ${{ inputs.sdk }}
 
@@ -85,10 +101,15 @@
 
       - name: Run Tidy Script
         working-directory: ${{ inputs.directory }}
+        env:
+          RUN_FORMAT: ${{ inputs.run-format }}
+          RUN_FIX: ${{ inputs.run-fix }}
+          USE_FLUTTER: ${{ inputs.use-flutter }}
         run: |
           dart $GITHUB_WORKSPACE/.github/ecosystem-helper/pkgs/firehose/bin/groundskeeper.dart \
-            --format=${{ inputs.run-format }} \
-            --fix=${{ inputs.run-fix }}
+            --format="$RUN_FORMAT" \
+            --fix="$RUN_FIX" \
+            --use-flutter="$USE_FLUTTER"
 
       - name: Check for changes
         id: check_changes
@@ -103,9 +124,12 @@
       - name: Update changelog
         if: ${{ inputs.update-changelog && steps.check_changes.outputs.changed == 'true' }}
         working-directory: .github/ecosystem-helper/pkgs/repo_manage
+        env:
+          DIRECTORY: ${{ inputs.directory }}
+          CHANGELOG_MESSAGE: ${{ inputs.changelog-message }}
         run: |
           dart pub get
-          dart run bin/report.dart changelog --changelog "../../../../${{ inputs.directory }}/CHANGELOG.md" "${{ inputs.changelog-message }}"
+          dart run bin/report.dart changelog --changelog "../../../../$DIRECTORY/CHANGELOG.md" "$CHANGELOG_MESSAGE"
 
       - name: Clean up helper
         run: rm -rf .github/ecosystem-helper
diff --git a/pkgs/firehose/CHANGELOG.md b/pkgs/firehose/CHANGELOG.md
index 4f05be3..509cfe5 100644
--- a/pkgs/firehose/CHANGELOG.md
+++ b/pkgs/firehose/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## 0.13.2-wip
 
+- Support `use-flutter` option in `groundskeeper` workflow to allow tidying Flutter packages.
 - Log full `dart_apitool` failure output to the workflow log instead of dumping
   multi-line stack traces into the PR health comment Markdown table.
 - Document Zizmor compatibility and ignore syntax for `post_summaries.yaml`.
diff --git a/pkgs/firehose/bin/groundskeeper.dart b/pkgs/firehose/bin/groundskeeper.dart
index cf902f5..9ae3cae 100644
--- a/pkgs/firehose/bin/groundskeeper.dart
+++ b/pkgs/firehose/bin/groundskeeper.dart
@@ -4,13 +4,17 @@
 
 import 'dart:io';
 import 'package:args/args.dart';
-import 'package:firehose/firehose.dart';
 import 'package:path/path.dart' as path;
 
 void main(List<String> args) async {
   final parser = ArgParser()
     ..addOption('format', defaultsTo: 'true', allowed: ['true', 'false'])
-    ..addOption('fix', defaultsTo: 'true', allowed: ['true', 'false']);
+    ..addOption('fix', defaultsTo: 'true', allowed: ['true', 'false'])
+    ..addOption(
+      'use-flutter',
+      defaultsTo: 'false',
+      allowed: ['true', 'false'],
+    );
 
   final argResults = parser.parse(args);
 
@@ -18,10 +22,12 @@
   final pkgPath = targetDirectory.path;
   final runFormat = argResults['format'] != 'false';
   final runFix = argResults['fix'] != 'false';
+  final useFlutter = argResults['use-flutter'] == 'true';
 
   print('Target Directory: ${targetDirectory.absolute.path}');
   print('Run format: $runFormat');
   print('Run fix: $runFix');
+  print('Use Flutter: $useFlutter');
 
   final pubspecFile = File(path.join(targetDirectory.path, 'pubspec.yaml'));
   final isPackage = pubspecFile.existsSync();
@@ -33,15 +39,10 @@
   }
 
   if (isPackage) {
-    final repo = Repository(targetDirectory);
-    final pkg = Package(targetDirectory, repo);
+    final tool = useFlutter ? 'flutter' : 'dart';
 
-    // Detect if it is a Flutter package
-    final isFlutter = pkg.pubspec.dependencies.containsKey('flutter') ||
-        pkg.pubspec.devDependencies.containsKey('flutter');
-    final tool = isFlutter ? 'flutter' : 'dart';
-
-    print('Tidying package in $pkgPath (${isFlutter ? 'Flutter' : 'Dart'})...');
+    print(
+        'Tidying package in $pkgPath (${useFlutter ? 'Flutter' : 'Dart'})...');
 
     print('  Running $tool pub get...');
     final pubGetResult =