neozip-cli 0.80.0 → 0.90.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,65 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ **Release notes** for each version are documented here (not in a separate “what’s new” file).
9
+
10
+ ## [0.90.0] - 2026-03-18
11
+
12
+ ### Added
13
+
14
+ - **Full AES-256 encryption support** — create, list, and extract password-protected archives with WinZip-compatible AES-256 (default) or legacy PKZIP encryption.
15
+
16
+ #### Creating encrypted archives
17
+
18
+ - **AES-256 (default)** — use `-e` / `--encrypt` or `--aes256`.
19
+
20
+ ```bash
21
+ neozip -e secure.nzip file.txt
22
+ neozip -e -P "mypassword" secure.nzip file.txt
23
+ neozip --aes256 -P "mypassword" secure.nzip file.txt folder/
24
+ ```
25
+
26
+ - **Legacy PKZIP** — use `--pkzip` or `--pkzip-encrypt` only for older-tool compatibility (weak; prefer AES-256 for sensitive data).
27
+
28
+ ```bash
29
+ neozip --pkzip -P "mypassword" legacy.nzip file.txt
30
+ ```
31
+
32
+ #### Listing encrypted archives
33
+
34
+ - **neolist** lists contents; filenames are visible without a password. Encryption method (AES-256 or PKZIP) is shown where applicable. Extraction requires the password.
35
+
36
+ #### Extracting encrypted archives
37
+
38
+ - **neounzip** auto-detects AES-256 vs PKZIP. Use `-P` / `--password`.
39
+
40
+ ```bash
41
+ neounzip -P "mypassword" secure.nzip output/
42
+ neounzip --in-memory -P "mypassword" secure.nzip output/
43
+ ```
44
+
45
+ - Wrong password yields a clear error (e.g. bad password / decryption failed).
46
+
47
+ #### Compatibility
48
+
49
+ - **AES-256**: WinZip, 7-Zip, and other tools supporting ZIP AES extension (AE-2).
50
+ - **PKZIP** (ZipCrypto): create/extract legacy archives only.
51
+
52
+ #### Encryption options summary
53
+
54
+ | Command | Option | Effect |
55
+ |-----------|--------------------|--------|
56
+ | neozip | `-e`, `--encrypt` | AES-256 (default); prompt if no `-P` |
57
+ | neozip | `--aes256` | Explicit AES-256 |
58
+ | neozip | `--pkzip` | Legacy PKZIP encryption |
59
+ | neozip | `-P`, `--password`| Encryption password |
60
+ | neounzip | `-P`, `--password` | Decryption password (AES-256/PKZIP auto-detected) |
61
+ | neounzip | `--pkzip-decrypt` | Force legacy PKZip 2.0 decryption |
62
+
63
+ See [README.md](README.md) and [DOCUMENTATION.md](DOCUMENTATION.md) for more examples.
64
+
65
+ ---
66
+
8
67
  ## [0.80.0] - 2026-03-04
9
68
 
10
69
  ### Added
@@ -18,21 +77,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
18
77
  - **Configuration**
19
78
  - `neozip config` and `neozip init` work when run via ts-node (fixed dynamic import resolution for `.ts` vs `.js`)
20
79
 
21
- ### Changed
22
-
23
- - User-facing copy now uses "blockchain" instead of "Ethereum blockchain" for Zipstamp and mint flows
24
- - Zipstamp verification in `neounzip` shows "Zipstamp (blockchain timestamp)" instead of "Ethereum timestamp"
25
- - Help text: `-ts, --timestamp` described as "Enable Zipstamp timestamp (blockchain)"
26
-
27
80
  ### Fixed
28
81
 
29
82
  - `neozip config` / `neozip init` no longer fail with "Cannot find module './config/ConfigSetup.js'" when run via `yarn neozip-config` or ts-node
30
83
 
31
- ### Security
32
-
33
- - `.env.*` (including `.env.local`, `.env.local.rem`) added to `.gitignore` to avoid committing secrets
34
- - Documented how to purge env files from git history if they were ever committed
35
-
36
84
  ---
37
85
 
38
86
  ## [0.70.0-alpha] - 2025-11-21
package/DOCUMENTATION.md CHANGED
@@ -47,11 +47,9 @@ neolist --help # Show listing help
47
47
  - NeoZip ecosystem overview
48
48
  - Technical innovations
49
49
 
50
- - **[CHANGELOG.md](CHANGELOG.md)** - Version history
51
- - Release notes
52
- - Feature additions
53
- - Known limitations
54
- - Breaking changes
50
+ - **[CHANGELOG.md](CHANGELOG.md)** - Version history and release notes
51
+ - Detailed changes per version (including feature guides, e.g. AES-256 in v0.90.0)
52
+ - Known limitations and breaking changes
55
53
 
56
54
  - **[env.example](env.example)** - Environment variable configuration
57
55
  - Wallet configuration
@@ -98,10 +96,15 @@ neolist --help # Show listing help
98
96
  - No compression (fastest)
99
97
  - Useful for already-compressed files
100
98
 
101
- - **PKZIP Encryption**
102
- - Legacy encryption for maximum compatibility
99
+ - **AES-256 Encryption** (default, recommended)
100
+ - Strong WinZip-compatible AES-256 encryption
103
101
  - Password-protected archives
104
- - InfoZip-compatible encrypted archives
102
+ - Compatible with WinZip, 7-Zip, and other AES-capable tools
103
+
104
+ - **PKZIP Encryption** (legacy)
105
+ - Traditional encryption for maximum compatibility
106
+ - Use `--pkzip` flag to select
107
+ - Not recommended for sensitive data
105
108
 
106
109
  ### Blockchain Features
107
110
 
package/README.md CHANGED
@@ -6,9 +6,9 @@
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
7
  [![Node.js Version](https://img.shields.io/badge/node-%3E%3D16.0.0-brightgreen)](https://nodejs.org/)
8
8
 
9
- ## ⚠️ Beta Release Notice
9
+ ## Release Notice
10
10
 
11
- **This is a beta release (v0.75.0-beta).** This software is in active development and may contain bugs or incomplete features. While more stable than alpha releases, please use with caution in production environments.
11
+ **Current version: v0.90.0.** This release adds full AES-256 encryption support. See [CHANGELOG.md](CHANGELOG.md) for details.
12
12
 
13
13
  - **API Stability**: Command-line interface is becoming more stable but may still change
14
14
  - **Testing**: Please test thoroughly and report any issues
@@ -21,7 +21,7 @@ NeoZip CLI is a modern, full-featured ZIP utility that provides:
21
21
  - **Standard ZIP Compatibility**: ~99% compatible with InfoZip utilities
22
22
  - **Blockchain Integration**: Tokenize archives and verify integrity on-chain
23
23
  - **Advanced Compression**: Zstd, Deflate, and Store compression methods
24
- - **Encryption Support**: PKZIP encryption
24
+ - **Encryption Support**: AES-256 (default) and PKZIP encryption
25
25
  - **Cross-Platform**: Works on macOS, Linux, and Windows
26
26
 
27
27
  ## Features
@@ -42,9 +42,10 @@ NeoZip CLI is a modern, full-featured ZIP utility that provides:
42
42
  - Compression levels: 0-9 (0=store, 9=best compression)
43
43
 
44
44
  ### Encryption
45
- - **PKZIP**: Legacy encryption (maximum compatibility)
45
+ - **AES-256**: Strong encryption (default, recommended)
46
+ - **PKZIP**: Legacy encryption (for compatibility only)
46
47
  - Password-protected archives
47
- - InfoZip-compatible encrypted archives
48
+ - Auto-detection of encryption method during extraction
48
49
 
49
50
  ### Blockchain Features
50
51
  - **Tokenization**: Create on-chain tokens for archives
@@ -70,10 +71,10 @@ NeoZip CLI is a modern, full-featured ZIP utility that provides:
70
71
  - Node.js 16.0.0 or higher
71
72
  - npm or yarn package manager
72
73
 
73
- ### Install from npm (Beta Release)
74
+ ### Install from npm
74
75
 
75
76
  ```bash
76
- npm install -g neozip-cli@beta
77
+ npm install -g neozip-cli
77
78
  ```
78
79
 
79
80
  After installation, the following commands will be available:
@@ -138,13 +139,19 @@ neozip -0 output.nzip ./src/
138
139
  ### Encryption Examples
139
140
 
140
141
  ```bash
141
- # Create encrypted archive (will prompt for password)
142
+ # Create AES-256 encrypted archive (default, will prompt for password)
142
143
  neozip -e secure.nzip file.txt
143
144
 
144
- # Create encrypted archive with password
145
+ # Create AES-256 encrypted archive with password
145
146
  neozip -e -P "mypassword" secure.nzip file.txt
146
147
 
147
- # Extract encrypted archive
148
+ # Explicitly use AES-256
149
+ neozip --aes256 -P "mypassword" secure.nzip file.txt
150
+
151
+ # Use legacy PKZIP encryption (weak, for compatibility only)
152
+ neozip --pkzip -P "mypassword" legacy.nzip file.txt
153
+
154
+ # Extract encrypted archive (auto-detects AES-256 or PKZIP)
148
155
  neounzip -P "mypassword" secure.nzip tests/extracted/
149
156
  ```
150
157
 
@@ -183,8 +190,10 @@ neozip [options] <archive> [files...]
183
190
  - `-0` to `-9` - Compression level (0=store, 9=best)
184
191
  - `-x, --exclude <pattern>` - Exclude files matching pattern
185
192
  - `-i, --include <pattern>` - Include only matching files
186
- - `-e, --encrypt` - Encrypt files (will prompt for password)
193
+ - `-e, --encrypt` - Encrypt files with AES-256 (default, will prompt for password)
187
194
  - `-P, --password <pwd>` - Encrypt with password
195
+ - `--aes256` - Use AES-256 encryption (default, recommended)
196
+ - `--pkzip` - Use legacy PKZIP encryption (weak, for compatibility only)
188
197
  - `-b, --blockchain` - Enable blockchain tokenization
189
198
  - `-ots, --opentimestamp` - Enable OpenTimestamp proof (Bitcoin)
190
199
  - `-ts, --timestamp` - Enable Zipstamp timestamp (Ethereum)
@@ -232,7 +241,7 @@ neounzip [options] <archive> [output]
232
241
  - `-o, --overwrite` - Overwrite files without prompting
233
242
  - `-t, --test` - Test archive integrity
234
243
  - `-l, --list` - List contents without extracting
235
- - `-P, --password <pwd>` - Password for encrypted archives
244
+ - `-P, --password <pwd>` - Password for encrypted archives (AES-256 and PKZIP auto-detected)
236
245
  - `-x, --exclude <pattern>` - Exclude files from extraction
237
246
  - `-i, --include <pattern>` - Include only matching files
238
247
  - `-j, --junk-paths` - Extract files without directory structure
@@ -376,10 +385,13 @@ neozip -r -x "node_modules" -x "*.log" project.nzip ./
376
385
  ### Encryption
377
386
 
378
387
  ```bash
379
- # Create encrypted archive
388
+ # Create AES-256 encrypted archive (default)
380
389
  neozip -e -P "secure-password" secret.nzip sensitive-files/
381
390
 
382
- # Extract encrypted archive
391
+ # Create legacy PKZIP encrypted archive
392
+ neozip --pkzip -P "secure-password" legacy.nzip sensitive-files/
393
+
394
+ # Extract encrypted archive (auto-detects encryption method)
383
395
  neounzip -P "secure-password" secret.nzip decrypted/
384
396
  ```
385
397
 
@@ -479,19 +491,19 @@ neozip init
479
491
  # Verify password is correct
480
492
  neounzip -P "your-password" archive.nzip
481
493
 
482
- # Try different encryption method
483
- neozip --pkzip-encrypt -P "password" archive.nzip files/
494
+ # Use legacy PKZIP if AES-256 is not supported by target tool
495
+ neozip --pkzip -P "password" archive.nzip files/
484
496
  ```
485
497
 
486
498
  ## Contributing
487
499
 
488
- We welcome feedback and contributions! Since this is a beta release, we're actively seeking input:
500
+ We welcome feedback and contributions:
489
501
 
490
502
  1. **Report Issues**: Use [GitHub Issues](https://github.com/NeoWareInc/neozip-support/issues) or email [support@neozip.io](mailto:support@neozip.io)
491
503
  2. **Suggest Features**: Share your ideas and use cases
492
504
  3. **Test and Provide Feedback**: Help us improve by testing and reporting your experience
493
505
 
494
- **Important**: This is a beta release. API and behavior may still change. Please test thoroughly.
506
+ **Important**: Please test thoroughly and report issues. See [CHANGELOG.md](CHANGELOG.md) for version history.
495
507
 
496
508
  ## License
497
509
 
@@ -511,6 +523,6 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
511
523
 
512
524
  ---
513
525
 
514
- **Version**: 0.75.0-beta
515
- **Status**: Beta Release
516
- **Last Updated**: December 26, 2025
526
+ **Version**: 0.90.0
527
+ **Status**: Release (see [CHANGELOG.md](CHANGELOG.md) for latest changes)
528
+ **Last Updated**: March 18, 2026
@@ -461,8 +461,11 @@ function outputVerbose(entries, archivePath, zip, options = { verbose: false, qu
461
461
  entries.forEach((entry, index) => {
462
462
  // Use ZipEntry's showVerboseInfo() method for detailed information
463
463
  log(`File ${index + 1}: ${formatEntryName(entry)}`, options);
464
- // Call showVerboseInfo() directly - it will output to console
465
464
  entry.showVerboseInfo();
465
+ if (entry.isEncrypted) {
466
+ const method = entry.aesVersion > 0 ? 'AES-256' : 'PKZIP';
467
+ log(` Encryption method: ${method}`, options);
468
+ }
466
469
  log('', options);
467
470
  });
468
471
  // Summary
@@ -715,6 +718,9 @@ function outputJson(entries, archivePath, zip, options = { verbose: false, quiet
715
718
  if (entry.isStrongEncrypt !== undefined) {
716
719
  fileInfo.isStrongEncrypt = entry.isStrongEncrypt;
717
720
  }
721
+ if (entry.isEncrypted) {
722
+ fileInfo.encryptionMethod = entry.aesVersion > 0 ? 'AES-256' : 'PKZIP';
723
+ }
718
724
  // Add symbolic link information if present
719
725
  if (entry.isSymlink !== undefined) {
720
726
  fileInfo.isSymlink = entry.isSymlink;
@@ -625,14 +625,17 @@ async function testArchive(zip, options) {
625
625
  throw new Error('ZIP file not loaded. Cannot determine backend type.');
626
626
  }
627
627
  // Report success
628
+ const encTag = entry.isEncrypted
629
+ ? (entry.aesVersion > 0 ? ' [AES-256]' : ' [PKZIP]')
630
+ : '';
628
631
  if (entry.sha256 && !options.skipBlockchain) {
629
- console.log(`testing: ${name} ...OK SHA-256`);
632
+ console.log(`testing: ${name} ...OK SHA-256${encTag}`);
630
633
  }
631
634
  else if (entry.sha256 && options.skipBlockchain) {
632
- console.log(`testing: ${name} ...OK (SHA-256 skipped)`);
635
+ console.log(`testing: ${name} ...OK (SHA-256 skipped)${encTag}`);
633
636
  }
634
637
  else {
635
- console.log(`testing: ${name} ...OK`);
638
+ console.log(`testing: ${name} ...OK${encTag}`);
636
639
  }
637
640
  }
638
641
  catch (err) {
@@ -1036,10 +1039,13 @@ async function extractArchive(zip, destination, options) {
1036
1039
  totalBytes += result.bytesExtracted;
1037
1040
  const hasSha = entry.sha256 ? true : false;
1038
1041
  const suffix = hasSha ? (options.skipBlockchain ? ' (SHA-256 skipped)' : ' (SHA-256 OK)') : '';
1042
+ const encTag = entry.isEncrypted
1043
+ ? (entry.aesVersion > 0 ? ' [AES-256]' : ' [PKZIP]')
1044
+ : '';
1039
1045
  if (options.verbose)
1040
- log(`extracting: ${filename} (${result.bytesExtracted} bytes)${suffix}`, options);
1046
+ log(`extracting: ${filename} (${result.bytesExtracted} bytes)${suffix}${encTag}`, options);
1041
1047
  else
1042
- log(`extracting: ${filename}${suffix}`, options);
1048
+ log(`extracting: ${filename}${suffix}${encTag}`, options);
1043
1049
  // Collect verified SHA-256 hash for merkle root calculation (single pass - no double check)
1044
1050
  // Only if this is a content file (not metadata) and SHA-256 verification was performed
1045
1051
  if (!options.skipBlockchain && hasSha) {
@@ -2086,7 +2092,7 @@ Options:
2086
2092
  --progress Enable enhanced progress reporting
2087
2093
  --debug Enable debug output
2088
2094
  -sf, --show-files Show files as they are extracted
2089
- -P, --password [pwd] Password for encrypted files. Provide password or will prompt
2095
+ -P, --password [pwd] Password for encrypted files (AES-256 and PKZIP supported)
2090
2096
  -x, --exclude <pattern> Exclude files matching pattern (can be used multiple times)
2091
2097
  -i, --include <pattern> Include only files matching pattern (can be used multiple times)
2092
2098
  -j, --junk-paths Extract files without directory structure (flatten to destination)
@@ -2270,6 +2276,13 @@ async function main() {
2270
2276
  log(`🚀 NEOUNZIP v${version_1.APP_VERSION} (${version_1.APP_RELEASE_DATE})`, options);
2271
2277
  log(`📦 Archive: ${archive}`, options);
2272
2278
  log(`📁 Destination: ${extractDestination}`, options);
2279
+ const allEntries = zip.getDirectory();
2280
+ const hasEncrypted = allEntries.some((e) => e.isEncrypted);
2281
+ if (hasEncrypted) {
2282
+ const hasAes = allEntries.some((e) => e.isEncrypted && e.aesVersion > 0);
2283
+ const encLabel = hasAes ? 'AES-256' : 'PKZIP';
2284
+ log(`🔐 Encryption: ${encLabel}`, options);
2285
+ }
2273
2286
  if (options.debug) {
2274
2287
  // Set global Logger level to 'debug' for debug output
2275
2288
  // Note: Individual class logging is controlled by their loggingEnabled static property
@@ -407,8 +407,9 @@ class ZipCreator {
407
407
  if (!this.options.blockchainZipstamp && !this.options.blockchainOts) {
408
408
  (0, utils_1.log)(`🔗 Tokenization: ${this.options.blockchain ? 'enabled' : 'disabled'}`, this.options);
409
409
  }
410
- const encryptionMethod = this.options.encryptionMethod || 'pkzip';
411
- (0, utils_1.log)(`🔐 Encryption: ${this.options.encrypt ? `${encryptionMethod.toUpperCase()} enabled` : 'disabled'}`, this.options);
410
+ const encryptionMethod = this.options.encryptionMethod || 'aes256';
411
+ const encryptionLabel = encryptionMethod === 'aes256' ? 'AES-256' : 'PKZIP';
412
+ (0, utils_1.log)(`🔐 Encryption: ${this.options.encrypt ? `${encryptionLabel} enabled` : 'disabled'}`, this.options);
412
413
  (0, utils_1.log)('', this.options);
413
414
  if (this.options.debug) {
414
415
  (0, utils_1.logDebug)('Debug mode enabled', this.options);
@@ -822,7 +823,7 @@ class ZipCreator {
822
823
  useZstd: level === 0 ? false : (this.options.compression || 'zstd') === 'zstd',
823
824
  useSHA256: this.options.blockchain || this.options.blockchainOts || this.options.blockchainZipstamp || false,
824
825
  password: this.options.encrypt ? this.options.password : null,
825
- encryptionMethod: this.options.encryptionMethod || 'pkzip'
826
+ encryptionMethod: (this.options.encryptionMethod === 'pkzip' ? 'zipcrypto' : 'aes256')
826
827
  };
827
828
  // Get entries from zip.getDirectory() (populated by processFiles())
828
829
  // This is the single source of truth for entry order
@@ -260,45 +260,45 @@ function parseArgs(args) {
260
260
  break;
261
261
  case '-e':
262
262
  case '--encrypt':
263
- // InfoZip-compatible encryption option
264
263
  options.encrypt = true;
265
- // Only set encryption method if not already set
266
264
  if (!options.encryptionMethod) {
267
- options.encryptionMethod = 'pkzip'; // Default to PKZIP (InfoZip compatible)
265
+ options.encryptionMethod = 'aes256';
268
266
  }
269
- // Only prompt for password if not already provided
270
267
  if (!options.password) {
271
- options.password = 'PROMPT'; // Will prompt for password
268
+ options.password = 'PROMPT';
272
269
  }
273
270
  break;
274
271
  case '-P':
275
272
  case '--password':
276
- // InfoZip-compatible password option (uppercase P)
277
273
  options.encrypt = true;
278
- // Only set encryption method if not already set (e.g., by --pkzip-encrypt)
279
274
  if (!options.encryptionMethod) {
280
- options.encryptionMethod = 'pkzip'; // Default to PKZIP
275
+ options.encryptionMethod = 'aes256';
281
276
  }
282
277
  if (i + 1 < args.length && !args[i + 1].startsWith('-')) {
283
- // Password provided directly
284
278
  options.password = args[++i];
285
279
  }
286
280
  else {
287
- // No password provided, will prompt later
288
281
  options.password = 'PROMPT';
289
282
  }
290
283
  break;
291
284
  case '-p':
292
285
  case '--show-progress':
293
- // InfoZip-compatible show-progress option (lowercase p)
294
286
  options.showFiles = true;
295
287
  break;
288
+ case '--aes256':
289
+ case '--aes-256':
290
+ options.encrypt = true;
291
+ options.encryptionMethod = 'aes256';
292
+ if (!options.password) {
293
+ options.password = 'PROMPT';
294
+ }
295
+ break;
296
+ case '--pkzip':
296
297
  case '--pkzip-encrypt':
297
298
  options.encrypt = true;
298
299
  options.encryptionMethod = 'pkzip';
299
- // Only prompt for password if not already provided
300
300
  if (!options.password) {
301
- options.password = 'PROMPT'; // Will prompt for password
301
+ options.password = 'PROMPT';
302
302
  }
303
303
  break;
304
304
  case '-x':
@@ -432,10 +432,10 @@ function parseArgs(args) {
432
432
  break;
433
433
  }
434
434
  }
435
- // -ots and -ts are mutually exclusive (choose Bitcoin OTS or Zipstamp)
435
+ // -ots and -ts are mutually exclusive (choose Bitcoin OTS or Ethereum Zipstamp)
436
436
  if (options.blockchainOts && options.blockchainZipstamp) {
437
437
  console.error('Error: Cannot use both -ots (OpenTimestamps) and -ts (Zipstamp) in the same run');
438
- console.error(' Use -ots for Bitcoin timestamping or -ts for Zipstamp timestamping');
438
+ console.error(' Use -ts for Zipstamp timestamping or -ots for Bitcoin timestamping');
439
439
  (0, exit_codes_1.exitZip)(exit_codes_1.ZIP_EXIT_CODES.PARAMETER_ERROR);
440
440
  }
441
441
  if (!archive) {
@@ -508,7 +508,7 @@ Options:
508
508
  -bd, --blockchain-default Auto-select default token option (use existing or mint new)
509
509
  -bm, --blockchain-mint Force mint new token (skip existing token selection)
510
510
  -ots, --opentimestamp Enable OpenTimestamp proof on Bitcoin blockchain
511
- -ts, --timestamp Enable Zipstamp timestamp (blockchain)
511
+ -ts, --timestamp Enable Ethereum Zipstamp timestamp (blockchain)
512
512
  --timestamp-email <email> Email for Zipstamp server (some servers require verified email)
513
513
  -n, --network <network> Blockchain network (base-sepolia, base-mainnet, default: base-sepolia)
514
514
  -w, --wallet-key <key> Wallet private key (overrides NEOZIP_WALLET_PASSKEY)
@@ -519,10 +519,11 @@ Options:
519
519
  --block-size <bytes> Block size for streaming (default: 131072)
520
520
  --no-progress Disable progress reporting
521
521
  --progress Enable enhanced progress reporting
522
- -e, --encrypt Encrypt files (InfoZip-compatible). Will prompt for password
523
- -P, --password [pwd] Encrypt files with password (InfoZip-compatible). Provide password or will prompt
522
+ -e, --encrypt Encrypt files with AES-256 (default). Will prompt for password
523
+ -P, --password [pwd] Encrypt files with password. Provide password or will prompt
524
+ --aes256 Use AES-256 encryption (default, recommended)
525
+ --pkzip, --pkzip-encrypt Use legacy PKZIP encryption (weak, for compatibility only)
524
526
  -p, --show-progress Show progress during compression (InfoZip-compatible)
525
- --pkzip-encrypt Use PKZIP encryption (legacy compatibility only, same as -e)
526
527
  -x, --exclude <pattern> Exclude files matching pattern (can be used multiple times)
527
528
  -i, --include <pattern> Include only files matching pattern (can be used multiple times)
528
529
  --suffixes <list> Don't compress files with these suffixes (can be used multiple times)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "neozip-cli",
3
- "version": "0.80.0",
4
- "release_date": "2026-03-04",
3
+ "version": "0.90.0",
4
+ "release_date": "2026-03-18",
5
5
  "description": "A full-featured command-line ZIP application with NeoZipKit integration",
6
6
  "main": "dist/src/index.js",
7
7
  "bin": {
@@ -47,8 +47,11 @@
47
47
  "neozip-ots": "npx ts-node src/neozip.ts -ots -T tests/output/calgary-ots.nzip tests/fixtures/calgary/*",
48
48
  "neozip-stamp": "npx ts-node src/neozip.ts -ts -T tests/output/calgary-stamp.nzip tests/fixtures/calgary/*",
49
49
  "neozip-mint": "node dist/src/neozip.js mint -o tests/output/calgary-stamp-upgrade.nzip tests/output/calgary-stamp-nft.nzip",
50
- "neozip-encrypt": "npx ts-node src/neozip.ts --encrypt -P 'pass123' -T tests/output/calgary-encrypted.nzip tests/fixtures/calgary/*",
51
- "neozip-encrypt-sm": "npx ts-node src/neozip.ts --encrypt -P 'pass123' -T tests/output/encrypted-sm.nzip tests/fixtures/test-sm/*",
50
+ "neozip-encrypt": "npx ts-node src/neozip.ts --pkzip -P 'pass123' -T tests/output/calgary-encrypted.nzip tests/fixtures/calgary/*",
51
+ "neozip-encrypt-sm": "npx ts-node src/neozip.ts --pkzip -P 'pass123' -T tests/output/encrypted-sm.nzip tests/fixtures/test-sm/*",
52
+ "neozip-encrypt-aes": "npx ts-node src/neozip.ts -e -P 'pass123' tests/output/calgary-encrypted-aes.nzip tests/fixtures/calgary/*",
53
+ "neozip-encrypt-aes-sm": "npx ts-node src/neozip.ts -e -P 'pass123' tests/output/encrypted-aes-sm.nzip tests/fixtures/test-sm/*",
54
+ "neozip-encrypt-aes-explicit": "npx ts-node src/neozip.ts --aes256 -P 'pass123' tests/output/calgary-encrypted-aes-explicit.nzip tests/fixtures/calgary/*",
52
55
  "neozip-update": "node tests/scripts/test-update-option.js",
53
56
  "neozip-sm": "npx ts-node src/neozip.ts -T tests/output/test-sm.nzip tests/fixtures/test-sm/*",
54
57
  "neozip-init": "npx ts-node src/neozip.ts init",
@@ -73,6 +76,9 @@
73
76
  "neounzip-decrypt-sm": "npx ts-node src/neounzip.ts --password 'pass123' tests/output/encrypted-sm.nzip -t",
74
77
  "neounzip-decrypt-sm-inmem": "npx ts-node src/neounzip.ts --in-memory --password 'pass123' tests/output/encrypted-sm.nzip -t",
75
78
  "neounzip-decrypt-pkzip": "npx ts-node src/neounzip.ts --pkzip-decrypt --password 'legacy-test-123' tests/output/calgary-pkzip.nzip -t",
79
+ "neounzip-decrypt-aes": "npx ts-node src/neounzip.ts --password 'pass123' tests/output/calgary-encrypted-aes.nzip -t",
80
+ "neounzip-decrypt-aes-inmem": "npx ts-node src/neounzip.ts --in-memory --password 'pass123' tests/output/calgary-encrypted-aes.nzip -t",
81
+ "neounzip-decrypt-aes-sm": "npx ts-node src/neounzip.ts --password 'pass123' tests/output/encrypted-aes-sm.nzip -t",
76
82
  "neounzip-help": "npx ts-node src/neounzip.ts --help",
77
83
  "neolist": "npx ts-node src/neolist.ts tests/output/calgary.nzip",
78
84
  "neolist-inmem": "npx ts-node src/neolist.ts --in-memory tests/output/calgary.nzip",
@@ -85,6 +91,7 @@
85
91
  "neolist-zip64": "npx ts-node src/neolist.ts tests/fixtures/calgary-zip64.zip",
86
92
  "neolist-stamp": "npx ts-node src/neolist.ts tests/output/calgary-stamp.nzip",
87
93
  "neolist-stamp-upgrade": "npx ts-node src/neolist.ts tests/output/calgary-stamp-upgrade.nzip",
94
+ "neolist-encrypted-aes": "npx ts-node src/neolist.ts -v tests/output/calgary-encrypted-aes.nzip",
88
95
  "neolist-help": "npx ts-node src/neolist.ts --help",
89
96
  "infozip-encrypt-zip": "zip -e -P 'pass123' -r tests/fixtures/infozip/calgary-encrypted.zip tests/fixtures/calgary/*",
90
97
  "infozip-encrypt-sm": "zip -e -P 'pass123' -0 tests/fixtures/infozip/encrypted-sm.zip tests/fixtures/test-sm/*",
@@ -98,7 +105,8 @@
98
105
  "test:neozip": "node tests/scripts/comprehensive/test-neozip-options.js",
99
106
  "test:neounzip": "node tests/scripts/comprehensive/test-neounzip-options.js",
100
107
  "test:neolist": "node tests/scripts/comprehensive/test-neolist-options.js",
101
- "test:encryption": "npm run neozip-encrypt && npm run neounzip-decrypt && echo '✅ All encryption tests completed successfully!'",
108
+ "test:encryption": "npm run neozip-encrypt-aes && npm run neounzip-decrypt-aes && npm run neozip-encrypt && npm run neounzip-decrypt && echo '✅ All encryption tests (AES-256 + PKZIP) completed successfully!'",
109
+ "test:encryption-aes": "npm run neozip-encrypt-aes && npm run neounzip-decrypt-aes && npm run neounzip-decrypt-aes-inmem && echo '✅ AES-256 encryption tests completed successfully!'",
102
110
  "test:stamp": "echo '=== Testing Timestamp Support ===' && npm run neozip-ots && npm run neounzip-ots && echo '' && echo '--- Zipstamp (may fail if server unreachable) ---' && (npm run neozip-zipstamp && npm run neounzip-zipstamp && echo '✅ Zipstamp tests completed') || echo '⚠️ Zipstamp skipped (server may be unreachable)' && echo '' && echo '✅ Timestamp tests completed successfully!'",
103
111
  "test:infozip-decrypt": "npx ts-node tests/scripts/test-infozip-decrypt.ts",
104
112
  "test:comments": "node tests/scripts/comprehensive/test-comments-options.js",
@@ -147,6 +155,7 @@
147
155
  "moment": "^2.29.4",
148
156
  "moment-timezone": "^0.5.43",
149
157
  "neozip-blockchain": "npm:neozip-blockchain@latest",
158
+ "neozip-cli": "^0.80.0",
150
159
  "neozipkit": "npm:neozipkit@latest",
151
160
  "opentimestamps": "^0.4.9",
152
161
  "ora": "^5.4.1",