Make `mode` required

This avoids the questionable default of `0`.
Closes #34.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fa57a25..0eac290 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 2.0.0
+
+- Require the `mode` parameter when creating `TarHeader`s. Previously the field
+  had an implicit default value of `0`, which made it easy to inadvertently
+  create archives with entries that are hard to delete when extracted with
+  other tar programs.
+
 ## 1.0.5
 
 - Migrate to recommended lints from `package:lints`.
diff --git a/lib/src/header.dart b/lib/src/header.dart
index f35130c..68643c5 100644
--- a/lib/src/header.dart
+++ b/lib/src/header.dart
@@ -145,14 +145,14 @@
     }
   }
 
-  /// Creates a tar header from the individual field.
+  /// Creates a tar header from the individual fields.
   factory TarHeader({
     required String name,
+    required int mode,
     TarFormat? format,
     TypeFlag? typeFlag,
     DateTime? modified,
     String? linkName,
-    int mode = 0,
     int size = -1,
     String? userName,
     int userId = 0,
diff --git a/pubspec.yaml b/pubspec.yaml
index 91b1724..03d4f49 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,6 +1,6 @@
 name: tar
 description: Memory-efficient, streaming implementation of the tar file format
-version: 1.0.5
+version: 2.0.0
 repository: https://github.com/simolus3/tar/
 topics:
  - tar
diff --git a/test/reader_test.dart b/test/reader_test.dart
index 87b791e..1bdfe6f 100644
--- a/test/reader_test.dart
+++ b/test/reader_test.dart
@@ -616,6 +616,7 @@
             modified: millisecondsSinceEpoch(1597756829000),
             typeFlag: TypeFlag.symlink,
             format: TarFormat.gnu,
+            mode: 0,
           )
         ],
       },
@@ -682,6 +683,7 @@
             modified: millisecondsSinceEpoch(0),
             typeFlag: TypeFlag.symlink,
             format: TarFormat.pax,
+            mode: 0,
           )
         ]
       },
@@ -798,6 +800,7 @@
         'headers': [
           TarHeader(
             name: 'nil-sparse-data',
+            mode: 0,
             typeFlag: TypeFlag.gnuSparse,
             userId: 1000,
             groupId: 1000,
@@ -813,6 +816,7 @@
         'headers': [
           TarHeader(
             name: 'nil-sparse-hole',
+            mode: 0,
             typeFlag: TypeFlag.gnuSparse,
             size: 1000,
             userId: 1000,
@@ -828,6 +832,7 @@
         'headers': [
           TarHeader(
             name: 'sparse',
+            mode: 0,
             typeFlag: TypeFlag.reg,
             size: 1000,
             userId: 1000,
@@ -843,6 +848,7 @@
         'headers': [
           TarHeader(
             name: 'sparse.txt',
+            mode: 0,
             typeFlag: TypeFlag.reg,
             size: 1000,
             userId: 1000,
@@ -857,6 +863,7 @@
         'headers': [
           TarHeader(
             typeFlag: TypeFlag.dir,
+            mode: 0,
             size: 0,
             name: '987654321/' * 30,
             modified: millisecondsSinceEpoch(0),
diff --git a/test/windows_integration_test.dart b/test/windows_integration_test.dart
index 39d621b..85132a8 100644
--- a/test/windows_integration_test.dart
+++ b/test/windows_integration_test.dart
@@ -11,7 +11,7 @@
 void main() {
   test('emits long file names that are understood by 7zip', () async {
     final name = 'name' * 40;
-    final entry = TarEntry.data(TarHeader(name: name), []);
+    final entry = TarEntry.data(TarHeader(name: name, mode: 0), []);
     final file = File('${Directory.systemTemp.path}\\tar_test.tar');
     addTearDown(file.delete);
 
diff --git a/test/writer_test.dart b/test/writer_test.dart
index c31e9a2..e61bd55 100644
--- a/test/writer_test.dart
+++ b/test/writer_test.dart
@@ -172,6 +172,7 @@
           tar.TarHeader(
             name: 'file.txt',
             userName: 'this name is longer than 32 chars, which is not allowed',
+            mode: 0,
           ),
           [],
         ),