Update package:args, more consistent helper usage (#4219)

diff --git a/lib/src/command.dart b/lib/src/command.dart
index 3849468..61f8cde 100644
--- a/lib/src/command.dart
+++ b/lib/src/command.dart
@@ -68,7 +68,7 @@
 
   String get directory {
     return (argResults.options.contains('directory')
-            ? argResults.optionWithoutDefault('directory')
+            ? argResults.option('directory')
             : null) ??
         _pubTopLevel.directory;
   }
@@ -315,7 +315,7 @@
     if (!argResults.wasParsed('color')) {
       forceColors = ForceColorOption.auto;
     } else {
-      forceColors = argResults['color'] as bool
+      forceColors = argResults.flag('color')
           ? ForceColorOption.always
           : ForceColorOption.never;
     }
diff --git a/lib/src/command/add.dart b/lib/src/command/add.dart
index 5a78500..a310515 100644
--- a/lib/src/command/add.dart
+++ b/lib/src/command/add.dart
@@ -371,7 +371,7 @@
   /// Split [arg] on ':' and interpret it with the flags in [argResult] either as
   /// an old-style or a new-style descriptor to produce a PackageRef].
   _ParseResult _parsePackage(String arg, ArgResults argResults) {
-    var isDev = argResults['dev'] as bool;
+    var isDev = argResults.flag('dev');
     var isOverride = false;
 
     final match = _argRegExp.firstMatch(arg);
diff --git a/lib/src/command/cache_add.dart b/lib/src/command/cache_add.dart
index 25508ec..cbcbda1 100644
--- a/lib/src/command/cache_add.dart
+++ b/lib/src/command/cache_add.dart
@@ -51,9 +51,10 @@
 
     // Parse the version constraint, if there is one.
     var constraint = VersionConstraint.any;
-    if (argResults['version'] != null) {
+    final versionArg = argResults.option('version');
+    if (versionArg != null) {
       try {
-        constraint = VersionConstraint.parse(argResults['version'] as String);
+        constraint = VersionConstraint.parse(versionArg);
       } on FormatException catch (error) {
         usageException(error.message);
       }
diff --git a/lib/src/command/cache_clean.dart b/lib/src/command/cache_clean.dart
index d981b1f..3d1b9d2 100644
--- a/lib/src/command/cache_clean.dart
+++ b/lib/src/command/cache_clean.dart
@@ -6,7 +6,6 @@
 import '../command_runner.dart';
 import '../io.dart';
 import '../log.dart' as log;
-import '../utils.dart';
 
 class CacheCleanCommand extends PubCommand {
   @override
diff --git a/lib/src/command/deps.dart b/lib/src/command/deps.dart
index 9258545..313d8a5 100644
--- a/lib/src/command/deps.dart
+++ b/lib/src/command/deps.dart
@@ -163,7 +163,7 @@
           buffer.writeln("${log.bold('${sdk.name} SDK')} ${sdk.version}");
         }
 
-        switch (argResults['style']) {
+        switch (argResults.optionWithDefault('style')) {
           case 'compact':
             await _outputCompact(buffer);
             break;
diff --git a/lib/src/command/downgrade.dart b/lib/src/command/downgrade.dart
index 940a2ec..6055d5f 100644
--- a/lib/src/command/downgrade.dart
+++ b/lib/src/command/downgrade.dart
@@ -7,7 +7,6 @@
 import '../command.dart';
 import '../log.dart' as log;
 import '../solver.dart';
-import '../utils.dart';
 
 /// Handles the `downgrade` pub command.
 class DowngradeCommand extends PubCommand {
diff --git a/lib/src/command/get.dart b/lib/src/command/get.dart
index 700472f..c795ec7 100644
--- a/lib/src/command/get.dart
+++ b/lib/src/command/get.dart
@@ -7,7 +7,6 @@
 import '../command.dart';
 import '../log.dart' as log;
 import '../solver.dart';
-import '../utils.dart';
 
 /// Handles the `get` pub command.
 class GetCommand extends PubCommand {
@@ -82,7 +81,7 @@
     );
 
     var example = entrypoint.example;
-    if ((argResults['example'] as bool? ?? false) && example != null) {
+    if ((argResults.flag('example')) && example != null) {
       await example.acquireDependencies(
         SolveType.get,
         dryRun: argResults.flag('dry-run'),
diff --git a/lib/src/command/global_activate.dart b/lib/src/command/global_activate.dart
index 7d92471..47d290a 100644
--- a/lib/src/command/global_activate.dart
+++ b/lib/src/command/global_activate.dart
@@ -87,13 +87,13 @@
         usageException('Cannot pass both --no-executables and --executable.');
       }
 
-      executables = argResults['executable'] as List<String>?;
+      executables = argResults.multiOption('executable');
     } else if (argResults.flag('no-executables')) {
       // An empty list means no executables.
       executables = [];
     }
 
-    final overwrite = argResults['overwrite'] as bool;
+    final overwrite = argResults.flag('overwrite');
 
     Iterable<String> args = argResults.rest;
 
@@ -111,14 +111,15 @@
       usageException('Unexpected $arguments ${toSentence(unexpected)}.');
     }
 
-    if (argResults['source'] != 'git' &&
-        (argResults['git-path'] != null || argResults['git-ref'] != null)) {
+    if (argResults.optionWithDefault('source') != 'git' &&
+        (argResults.option('git-path') != null ||
+            argResults.option('git-ref') != null)) {
       usageException(
         'Options `--git-path` and `--git-ref` can only be used with --source=git.',
       );
     }
 
-    switch (argResults['source']) {
+    switch (argResults.optionWithDefault('source')) {
       case 'git':
         var repo = readArg('No Git repository given.');
         validateNoExtraArgs();
@@ -126,8 +127,8 @@
           repo,
           executables,
           overwriteBinStubs: overwrite,
-          path: argResults['git-path'] as String?,
-          ref: argResults['git-ref'] as String?,
+          path: argResults.option('git-path'),
+          ref: argResults.option('git-ref'),
         );
 
       case 'hosted':
@@ -136,7 +137,7 @@
         PackageRef ref;
         try {
           ref = cache.hosted
-              .refFor(package, url: argResults['hosted-url'] as String?);
+              .refFor(package, url: argResults.option('hosted-url'));
         } on FormatException catch (e) {
           usageException('Invalid hosted-url: $e');
         }
diff --git a/lib/src/command/lish.dart b/lib/src/command/lish.dart
index 5b2a379..af4a042 100644
--- a/lib/src/command/lish.dart
+++ b/lib/src/command/lish.dart
@@ -75,9 +75,8 @@
 
   bool get skipValidation => argResults.flag('skip-validation');
 
-  late final String? _fromArchive =
-      argResults.optionWithoutDefault('from-archive');
-  late final String? _toArchive = argResults.optionWithoutDefault('to-archive');
+  late final String? _fromArchive = argResults.option('from-archive');
+  late final String? _toArchive = argResults.option('to-archive');
 
   LishCommand() {
     argParser.addFlag(
diff --git a/lib/src/command/outdated.dart b/lib/src/command/outdated.dart
index bd65385..283cb7b 100644
--- a/lib/src/command/outdated.dart
+++ b/lib/src/command/outdated.dart
@@ -114,7 +114,7 @@
 
   @override
   Future<void> runProtected() async {
-    if (argResults['mode'] == 'null-safety') {
+    if (argResults.option('mode') == 'null-safety') {
       dataError('''The `--mode=null-safety` option is no longer supported.
 Consider using the Dart 2.19 sdk to migrate to null safety.''');
     }
diff --git a/lib/src/command/remove.dart b/lib/src/command/remove.dart
index 2dd1b79..0b1c2c6 100644
--- a/lib/src/command/remove.dart
+++ b/lib/src/command/remove.dart
@@ -10,7 +10,6 @@
 import '../log.dart' as log;
 import '../pubspec.dart';
 import '../solver.dart';
-import '../utils.dart';
 
 /// Handles the `remove` pub command. Removes dependencies from `pubspec.yaml`,
 /// and performs an operation similar to `pub get`. Unlike `pub add`, this
diff --git a/lib/src/command/token_add.dart b/lib/src/command/token_add.dart
index c15a51e..a194cbc 100644
--- a/lib/src/command/token_add.dart
+++ b/lib/src/command/token_add.dart
@@ -37,7 +37,7 @@
   @override
   String get docUrl => 'https://dart.dev/tools/pub/cmd/pub-token';
 
-  String? get envVar => argResults['env-var'] as String?;
+  String? get envVar => argResults.option('env-var');
 
   TokenAddCommand() {
     argParser.addOption(
diff --git a/lib/src/command/token_remove.dart b/lib/src/command/token_remove.dart
index f3f20c0..101214e 100644
--- a/lib/src/command/token_remove.dart
+++ b/lib/src/command/token_remove.dart
@@ -6,7 +6,6 @@
 import '../exceptions.dart';
 import '../log.dart' as log;
 import '../source/hosted.dart';
-import '../utils.dart';
 
 /// Handles the `token remove` pub command.
 class TokenRemoveCommand extends PubCommand {
diff --git a/lib/src/command/unpack.dart b/lib/src/command/unpack.dart
index 803d34c..0190d22 100644
--- a/lib/src/command/unpack.dart
+++ b/lib/src/command/unpack.dart
@@ -117,7 +117,7 @@
     final id = versions.last;
     final name = id.name;
 
-    final outputArg = argResults['output'] as String;
+    final outputArg = argResults.optionWithDefault('output');
     final destinationDir = p.join(outputArg, '$name-${id.version}');
     if (entryExists(destinationDir)) {
       if (argResults.flag('force')) {
@@ -138,7 +138,7 @@
       destinationDir,
       cache,
     );
-    if (argResults['resolve'] as bool) {
+    if (argResults.flag('resolve')) {
       try {
         await e.acquireDependencies(SolveType.get);
       } finally {
diff --git a/lib/src/command_runner.dart b/lib/src/command_runner.dart
index 2f4728e..ee10f74 100644
--- a/lib/src/command_runner.dart
+++ b/lib/src/command_runner.dart
@@ -50,7 +50,7 @@
   bool get captureStackChains {
     return argResults.flag('trace') ||
         argResults.flag('verbose') ||
-        argResults.optionWithoutDefault('verbosity') == 'all';
+        argResults.option('verbosity') == 'all';
   }
 
   @override
diff --git a/lib/src/executable.dart b/lib/src/executable.dart
index dc2b901..feaf10c 100644
--- a/lib/src/executable.dart
+++ b/lib/src/executable.dart
@@ -24,7 +24,7 @@
 
 /// Extracting vm arguments from arguments.
 List<String> vmArgsFromArgResults(ArgResults argResults) {
-  final experiments = argResults['enable-experiment'] as List;
+  final experiments = argResults.multiOption('enable-experiment');
   return [
     if (experiments.isNotEmpty) "--enable-experiment=${experiments.join(',')}",
   ];
diff --git a/lib/src/utils.dart b/lib/src/utils.dart
index 3093fce..2912b5f 100644
--- a/lib/src/utils.dart
+++ b/lib/src/utils.dart
@@ -766,10 +766,7 @@
 }
 
 extension RetrieveFlags on ArgResults {
-  bool flag(String name) => this[name] as bool;
-
-  String optionWithDefault(String name) => this[name] as String;
-  String? optionWithoutDefault(String name) => this[name] as String?;
+  String optionWithDefault(String name) => option(name)!;
 }
 
 /// Limits the range of characters and length.
diff --git a/pubspec.yaml b/pubspec.yaml
index 3fe357c..4a3f3b8 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -5,7 +5,7 @@
 
 dependencies:
   analyzer: ^6.3.0
-  args: ^2.4.2
+  args: ^2.5.0
   async: ^2.11.0
   cli_util: ^0.4.1
   collection: ^1.18.0
diff --git a/test/testdata/goldens/embedding/embedding_test/logfile is written with --verbose and on unexpected exceptions.txt b/test/testdata/goldens/embedding/embedding_test/logfile is written with --verbose and on unexpected exceptions.txt
index bc70c20..dc9a51d 100644
--- a/test/testdata/goldens/embedding/embedding_test/logfile is written with --verbose and on unexpected exceptions.txt
+++ b/test/testdata/goldens/embedding/embedding_test/logfile is written with --verbose and on unexpected exceptions.txt
@@ -305,7 +305,7 @@
 [E] package:pub/src/command.dart $LINE:$COL   PubCommand.run
 [E] package:args/command_runner.dart $LINE:$COL   CommandRunner.runCommand
 [E]  tool/test-bin/pub_command_runner.dart $LINE:$COL  Runner.runCommand
-[E]  tool/test-bin/pub_command_runner.dart $LINE:$COL  Runner.run
+[E]  tool/test-bin/pub_command_runner.dart $LINE:$COL   Runner.run
 [E]  tool/test-bin/pub_command_runner.dart $LINE:$COL  main
 [E] This is an unexpected error. The full log and other details are collected in:
 [E] 
@@ -346,7 +346,7 @@
    | package:pub/src/command.dart $LINE:$COL   PubCommand.run
    | package:args/command_runner.dart $LINE:$COL   CommandRunner.runCommand
    | tool/test-bin/pub_command_runner.dart $LINE:$COL  Runner.runCommand
-   | tool/test-bin/pub_command_runner.dart $LINE:$COL  Runner.run
+   | tool/test-bin/pub_command_runner.dart $LINE:$COL   Runner.run
    | tool/test-bin/pub_command_runner.dart $LINE:$COL  main
 ERR : This is an unexpected error. The full log and other details are collected in:
    | 
diff --git a/tool/test-bin/pub_command_runner.dart b/tool/test-bin/pub_command_runner.dart
index e6d84e7..186d905 100644
--- a/tool/test-bin/pub_command_runner.dart
+++ b/tool/test-bin/pub_command_runner.dart
@@ -13,7 +13,6 @@
 import 'package:pub/src/command.dart';
 import 'package:pub/src/exit_codes.dart' as exit_codes;
 import 'package:pub/src/log.dart' as log;
-import 'package:pub/src/utils.dart';
 
 /// A command for explicitly throwing an exception, to test the handling of
 /// unexpected exceptions.