diff --git a/script/tool/CHANGELOG.md b/script/tool/CHANGELOG.md
index db9ecf4..9e9538c 100644
--- a/script/tool/CHANGELOG.md
+++ b/script/tool/CHANGELOG.md
@@ -7,6 +7,8 @@
   new output format.
 - Fixed some cases where a failure in a command for a single package would
   immediately abort the test.
+- Deprecated `--plugins` in favor of new `--packages`. `--plugins` continues to
+  work for now, but will be removed in the future.
 
 ## 0.3.0
 
diff --git a/script/tool/README.md b/script/tool/README.md
index c0ee875..5629dc5 100644
--- a/script/tool/README.md
+++ b/script/tool/README.md
@@ -58,21 +58,21 @@
 
 ```sh
 cd <repository root>
-dart run ./script/tool/bin/flutter_plugin_tools.dart format --plugins plugin_name
+dart run ./script/tool/bin/flutter_plugin_tools.dart format --packages plugin_name
 ```
 
 ### Run the Dart Static Analyzer
 
 ```sh
 cd <repository root>
-dart run ./script/tool/bin/flutter_plugin_tools.dart analyze --plugins plugin_name
+dart run ./script/tool/bin/flutter_plugin_tools.dart analyze --packages plugin_name
 ```
 
 ### Run Dart Unit Tests
 
 ```sh
 cd <repository root>
-dart run ./script/tool/bin/flutter_plugin_tools.dart test --plugins plugin_name
+dart run ./script/tool/bin/flutter_plugin_tools.dart test --packages plugin_name
 ```
 
 ### Run XCTests
@@ -80,9 +80,9 @@
 ```sh
 cd <repository root>
 # For iOS:
-dart run ./script/tool/bin/flutter_plugin_tools.dart xctest --ios --plugins plugin_name
+dart run ./script/tool/bin/flutter_plugin_tools.dart xctest --ios --packages plugin_name
 # For macOS:
-dart run ./script/tool/bin/flutter_plugin_tools.dart xctest --macos --plugins plugin_name
+dart run ./script/tool/bin/flutter_plugin_tools.dart xctest --macos --packages plugin_name
 ```
 
 ### Publish a Release
diff --git a/script/tool/lib/src/common/plugin_command.dart b/script/tool/lib/src/common/plugin_command.dart
index 43d0d0b..74f607d 100644
--- a/script/tool/lib/src/common/plugin_command.dart
+++ b/script/tool/lib/src/common/plugin_command.dart
@@ -24,11 +24,12 @@
     GitDir? gitDir,
   }) : _gitDir = gitDir {
     argParser.addMultiOption(
-      _pluginsArg,
+      _packagesArg,
       splitCommas: true,
       help:
-          'Specifies which plugins the command should run on (before sharding).',
-      valueHelp: 'plugin1,plugin2,...',
+          'Specifies which packages the command should run on (before sharding).\n',
+      valueHelp: 'package1,package2,...',
+      aliases: <String>[_pluginsArg],
     );
     argParser.addOption(
       _shardIndexArg,
@@ -51,7 +52,7 @@
     );
     argParser.addFlag(_runOnChangedPackagesArg,
         help: 'Run the command on changed packages/plugins.\n'
-            'If the $_pluginsArg is specified, this flag is ignored.\n'
+            'If the $_packagesArg is specified, this flag is ignored.\n'
             'If no packages have changed, or if there have been changes that may\n'
             'affect all packages, the command runs on all packages.\n'
             'The packages excluded with $_excludeArg is also excluded even if changed.\n'
@@ -63,6 +64,7 @@
   }
 
   static const String _pluginsArg = 'plugins';
+  static const String _packagesArg = 'packages';
   static const String _shardIndexArg = 'shardIndex';
   static const String _shardCountArg = 'shardCount';
   static const String _excludeArg = 'exclude';
@@ -203,7 +205,7 @@
   ///    is a sibling of the packages directory. This is used for a small number
   ///    of packages in the flutter/packages repository.
   Stream<Directory> _getAllPlugins() async* {
-    Set<String> plugins = Set<String>.from(getStringListArg(_pluginsArg));
+    Set<String> plugins = Set<String>.from(getStringListArg(_packagesArg));
     final Set<String> excludedPlugins =
         Set<String>.from(getStringListArg(_excludeArg));
     final bool runOnChangedPackages = getBoolArg(_runOnChangedPackagesArg);
diff --git a/script/tool/test/common/plugin_command_test.dart b/script/tool/test/common/plugin_command_test.dart
index 0c949da..3f1f1ad 100644
--- a/script/tool/test/common/plugin_command_test.dart
+++ b/script/tool/test/common/plugin_command_test.dart
@@ -69,6 +69,22 @@
       expect(plugins, unorderedEquals(<String>[plugin1.path, plugin2.path]));
     });
 
+    test('includes both plugins and packages', () async {
+      final Directory plugin1 = createFakePlugin('plugin1', packagesDir);
+      final Directory plugin2 = createFakePlugin('plugin2', packagesDir);
+      final Directory package3 = createFakePackage('package3', packagesDir);
+      final Directory package4 = createFakePackage('package4', packagesDir);
+      await runCapturingPrint(runner, <String>['sample']);
+      expect(
+          plugins,
+          unorderedEquals(<String>[
+            plugin1.path,
+            plugin2.path,
+            package3.path,
+            package4.path,
+          ]));
+    });
+
     test('all plugins includes third_party/packages', () async {
       final Directory plugin1 = createFakePlugin('plugin1', packagesDir);
       final Directory plugin2 = createFakePlugin('plugin2', packagesDir);
@@ -79,15 +95,48 @@
           unorderedEquals(<String>[plugin1.path, plugin2.path, plugin3.path]));
     });
 
-    test('exclude plugins when plugins flag is specified', () async {
+    test('--packages limits packages', () async {
+      final Directory plugin1 = createFakePlugin('plugin1', packagesDir);
+      createFakePlugin('plugin2', packagesDir);
+      createFakePackage('package3', packagesDir);
+      final Directory package4 = createFakePackage('package4', packagesDir);
+      await runCapturingPrint(
+          runner, <String>['sample', '--packages=plugin1,package4']);
+      expect(
+          plugins,
+          unorderedEquals(<String>[
+            plugin1.path,
+            package4.path,
+          ]));
+    });
+
+    test('--plugins acts as an alias to --packages', () async {
+      final Directory plugin1 = createFakePlugin('plugin1', packagesDir);
+      createFakePlugin('plugin2', packagesDir);
+      createFakePackage('package3', packagesDir);
+      final Directory package4 = createFakePackage('package4', packagesDir);
+      await runCapturingPrint(
+          runner, <String>['sample', '--plugins=plugin1,package4']);
+      expect(
+          plugins,
+          unorderedEquals(<String>[
+            plugin1.path,
+            package4.path,
+          ]));
+    });
+
+    test('exclude packages when packages flag is specified', () async {
       createFakePlugin('plugin1', packagesDir);
       final Directory plugin2 = createFakePlugin('plugin2', packagesDir);
-      await runCapturingPrint(runner,
-          <String>['sample', '--plugins=plugin1,plugin2', '--exclude=plugin1']);
+      await runCapturingPrint(runner, <String>[
+        'sample',
+        '--packages=plugin1,plugin2',
+        '--exclude=plugin1'
+      ]);
       expect(plugins, unorderedEquals(<String>[plugin2.path]));
     });
 
-    test('exclude plugins when plugins flag isn\'t specified', () async {
+    test('exclude packages when packages flag isn\'t specified', () async {
       createFakePlugin('plugin1', packagesDir);
       createFakePlugin('plugin2', packagesDir);
       await runCapturingPrint(
@@ -95,24 +144,24 @@
       expect(plugins, unorderedEquals(<String>[]));
     });
 
-    test('exclude federated plugins when plugins flag is specified', () async {
+    test('exclude federated plugins when packages flag is specified', () async {
       createFakePlugin('plugin1', packagesDir.childDirectory('federated'));
       final Directory plugin2 = createFakePlugin('plugin2', packagesDir);
       await runCapturingPrint(runner, <String>[
         'sample',
-        '--plugins=federated/plugin1,plugin2',
+        '--packages=federated/plugin1,plugin2',
         '--exclude=federated/plugin1'
       ]);
       expect(plugins, unorderedEquals(<String>[plugin2.path]));
     });
 
-    test('exclude entire federated plugins when plugins flag is specified',
+    test('exclude entire federated plugins when packages flag is specified',
         () async {
       createFakePlugin('plugin1', packagesDir.childDirectory('federated'));
       final Directory plugin2 = createFakePlugin('plugin2', packagesDir);
       await runCapturingPrint(runner, <String>[
         'sample',
-        '--plugins=federated/plugin1,plugin2',
+        '--packages=federated/plugin1,plugin2',
         '--exclude=federated'
       ]);
       expect(plugins, unorderedEquals(<String>[plugin2.path]));
@@ -315,7 +364,8 @@
         expect(plugins, unorderedEquals(<String>[plugin1.path]));
       });
 
-      test('--plugins flag overrides the behavior of --run-on-changed-packages',
+      test(
+          '--packages flag overrides the behavior of --run-on-changed-packages',
           () async {
         gitDiffResponse = '''
 packages/plugin1/plugin1.dart
@@ -328,7 +378,7 @@
         createFakePlugin('plugin3', packagesDir);
         await runCapturingPrint(runner, <String>[
           'sample',
-          '--plugins=plugin1,plugin2',
+          '--packages=plugin1,plugin2',
           '--base-sha=master',
           '--run-on-changed-packages'
         ]);
diff --git a/script/tool/test/list_command_test.dart b/script/tool/test/list_command_test.dart
index 22f00ea..836d066 100644
--- a/script/tool/test/list_command_test.dart
+++ b/script/tool/test/list_command_test.dart
@@ -139,7 +139,7 @@
       );
     });
 
-    test('can filter plugins with the --plugins argument', () async {
+    test('can filter plugins with the --packages argument', () async {
       createFakePlugin('plugin1', packagesDir);
 
       // Create a federated plugin by creating a directory under the packages
@@ -157,7 +157,7 @@
       createFakePubspec(macLibrary);
 
       List<String> plugins = await runCapturingPrint(
-          runner, <String>['list', '--plugins=plugin1']);
+          runner, <String>['list', '--packages=plugin1']);
       expect(
         plugins,
         unorderedEquals(<String>[
@@ -166,7 +166,7 @@
       );
 
       plugins = await runCapturingPrint(
-          runner, <String>['list', '--plugins=my_plugin']);
+          runner, <String>['list', '--packages=my_plugin']);
       expect(
         plugins,
         unorderedEquals(<String>[
@@ -177,7 +177,7 @@
       );
 
       plugins = await runCapturingPrint(
-          runner, <String>['list', '--plugins=my_plugin/my_plugin_web']);
+          runner, <String>['list', '--packages=my_plugin/my_plugin_web']);
       expect(
         plugins,
         unorderedEquals(<String>[
@@ -186,7 +186,7 @@
       );
 
       plugins = await runCapturingPrint(runner,
-          <String>['list', '--plugins=my_plugin/my_plugin_web,plugin1']);
+          <String>['list', '--packages=my_plugin/my_plugin_web,plugin1']);
       expect(
         plugins,
         unorderedEquals(<String>[
