diff --git a/pkg/dartdev/lib/src/commands/fix.dart b/pkg/dartdev/lib/src/commands/fix.dart
index f93be4c..59424b9 100644
--- a/pkg/dartdev/lib/src/commands/fix.dart
+++ b/pkg/dartdev/lib/src/commands/fix.dart
@@ -19,17 +19,37 @@
 
   static final NumberFormat _numberFormat = NumberFormat.decimalPattern();
 
+  // todo (pq): add go link once redirect is live (https://github.com/dart-lang/sdk/issues/44261)
+  static const String cmdDescription = '''Fix Dart source code.
+
+This tool looks for and fixes analysis issues that have associated automated
+fixes or issues that have associated package API migration information.
+
+To use the tool, run one of:
+- 'dart fix --dry-run' for a preview of the proposed changes for a project
+- 'dart fix --apply' to apply the changes''';
+
   /// This command is hidden as it's currently experimental.
-  FixCommand() : super(cmdName, 'Fix Dart source code.', hidden: true) {
+  FixCommand() : super(cmdName, cmdDescription, hidden: true) {
     argParser.addFlag('dry-run',
         abbr: 'n',
         defaultsTo: false,
+        negatable: false,
         help: 'Show which files would be modified but make no changes.');
-    argParser.addFlag('compare-to-golden',
-        defaultsTo: false,
-        help:
-            'Compare the result of applying fixes to a golden file for testing.',
-        hide: true);
+    argParser.addFlag(
+      'apply',
+      defaultsTo: false,
+      negatable: false,
+      help: 'Apply the proposed changes.',
+    );
+    argParser.addFlag(
+      'compare-to-golden',
+      defaultsTo: false,
+      negatable: false,
+      help:
+          'Compare the result of applying fixes to a golden file for testing.',
+      hide: true,
+    );
   }
 
   @override
@@ -39,12 +59,18 @@
 
     var dryRun = argResults['dry-run'];
     var testMode = argResults['compare-to-golden'];
+    var apply = argResults['apply'];
     var arguments = argResults.rest;
     var argumentCount = arguments.length;
     if (argumentCount > 1) {
       usageException('Only one file or directory is expected.');
     }
 
+    if (!apply && !dryRun && !testMode) {
+      printUsage();
+      return 0;
+    }
+
     var dir =
         argumentCount == 0 ? io.Directory.current : io.Directory(arguments[0]);
     if (!dir.existsSync()) {
diff --git a/pkg/dartdev/test/commands/fix_test.dart b/pkg/dartdev/test/commands/fix_test.dart
index b0a1a70..d948b77 100644
--- a/pkg/dartdev/test/commands/fix_test.dart
+++ b/pkg/dartdev/test/commands/fix_test.dart
@@ -5,6 +5,8 @@
 import 'dart:io';
 
 import 'package:cli_util/cli_logging.dart';
+import 'package:dartdev/src/commands/fix.dart';
+import 'package:path/path.dart' as path;
 import 'package:test/test.dart';
 
 import '../utils.dart';
@@ -13,6 +15,9 @@
   group('fix', defineFix, timeout: longTimeout);
 }
 
+/// Enable to run from local source (useful in development).
+const runFromSource = false;
+
 void defineFix() {
   TestProject p;
 
@@ -22,15 +27,35 @@
 
   tearDown(() => p?.dispose());
 
+  ProcessResult runFix(List<String> args, {String workingDir}) {
+    if (runFromSource) {
+      var binary = path.join(Directory.current.path, 'bin', 'dartdev.dart');
+      return p.runSync(binary, ['fix', ...?args], workingDir: workingDir);
+    }
+    return p.runSync('fix', args, workingDir: workingDir);
+  }
+
   test('none', () {
     p = project(mainSrc: 'int get foo => 1;\n');
-    var result = p.runSync('fix', [p.dirPath]);
+
+    var result = runFix([p.dirPath]);
+
+    expect(result.exitCode, 0);
+    expect(result.stderr, isEmpty);
+    expect(result.stdout, contains(FixCommand.cmdDescription));
+  });
+
+  test('--apply (none)', () {
+    p = project(mainSrc: 'int get foo => 1;\n');
+
+    var result = runFix(['--apply', p.dirPath]);
+
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Nothing to fix!'));
   });
 
-  test('no args', () {
+  test('--apply (no args)', () {
     p = project(
       mainSrc: '''
 var x = "";
@@ -41,7 +66,7 @@
     - prefer_single_quotes
 ''',
     );
-    var result = p.runSync('fix', [], workingDir: p.dirPath);
+    var result = runFix(['--apply'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(
@@ -53,10 +78,10 @@
         ]));
   });
 
-  test('dry-run', () {
+  test('--dry-run', () {
     p = project(
       mainSrc: '''
-class A { 
+class A {
   String a() => "";
 }
 
@@ -67,11 +92,11 @@
       analysisOptions: '''
 linter:
   rules:
-    - annotate_overrides  
+    - annotate_overrides
     - prefer_single_quotes
 ''',
     );
-    var result = p.runSync('fix', ['--dry-run', '.'], workingDir: p.dirPath);
+    var result = runFix(['--dry-run', '.'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(
@@ -84,7 +109,7 @@
         ]));
   });
 
-  test('.', () {
+  test('--apply (.)', () {
     p = project(
       mainSrc: '''
 var x = "";
@@ -95,7 +120,7 @@
     - prefer_single_quotes
 ''',
     );
-    var result = p.runSync('fix', ['.'], workingDir: p.dirPath);
+    var result = runFix(['--apply', '.'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(
@@ -108,7 +133,7 @@
         ]));
   });
 
-  test('excludes', () {
+  test('--apply (excludes)', () {
     p = project(
       mainSrc: '''
 var x = "";
@@ -122,13 +147,13 @@
     - prefer_single_quotes
 ''',
     );
-    var result = p.runSync('fix', ['.'], workingDir: p.dirPath);
+    var result = runFix(['--apply', '.'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Nothing to fix!'));
   });
 
-  test('ignores', () {
+  test('--apply (ignores)', () {
     p = project(
       mainSrc: '''
 // ignore: prefer_single_quotes
@@ -140,7 +165,7 @@
     - prefer_single_quotes
 ''',
     );
-    var result = p.runSync('fix', ['.'], workingDir: p.dirPath);
+    var result = runFix(['--apply', '.'], workingDir: p.dirPath);
     expect(result.exitCode, 0);
     expect(result.stderr, isEmpty);
     expect(result.stdout, contains('Nothing to fix!'));
@@ -150,7 +175,7 @@
     test('different', () {
       p = project(
         mainSrc: '''
-class A { 
+class A {
   String a() => "";
 }
 
@@ -161,12 +186,12 @@
         analysisOptions: '''
 linter:
   rules:
-    - annotate_overrides  
+    - annotate_overrides
     - prefer_single_quotes
 ''',
       );
       p.file('lib/main.dart.expect', '''
-class A { 
+class A {
   String a() => '';
 }
 
@@ -174,8 +199,7 @@
   String a() => '';
 }
 ''');
-      var result =
-          p.runSync('fix', ['--compare-to-golden', '.'], workingDir: p.dirPath);
+      var result = runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
       expect(result.exitCode, 1);
       expect(result.stderr, isEmpty);
     });
@@ -183,7 +207,7 @@
     test('same', () {
       p = project(
         mainSrc: '''
-class A { 
+class A {
   String a() => "";
 }
 
@@ -194,12 +218,12 @@
         analysisOptions: '''
 linter:
   rules:
-    - annotate_overrides  
+    - annotate_overrides
     - prefer_single_quotes
 ''',
       );
       p.file('lib/main.dart.expect', '''
-class A { 
+class A {
   String a() => '';
 }
 
@@ -208,8 +232,7 @@
   String a() => '';
 }
 ''');
-      var result =
-          p.runSync('fix', ['--compare-to-golden', '.'], workingDir: p.dirPath);
+      var result = runFix(['--compare-to-golden', '.'], workingDir: p.dirPath);
       expect(result.exitCode, 0);
       expect(result.stderr, isEmpty);
     });
diff --git a/tools/VERSION b/tools/VERSION
index 2069731..073e310 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 12
 PATCH 0
-PRERELEASE 64
+PRERELEASE 65
 PRERELEASE_PATCH 0
\ No newline at end of file
