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 +59 -11
- package/DOCUMENTATION.md +11 -8
- package/README.md +33 -21
- package/dist/src/neolist.js +7 -1
- package/dist/src/neounzip.js +19 -6
- package/dist/src/neozip/createZip.js +4 -3
- package/dist/src/neozip.js +20 -19
- package/package.json +14 -5
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
|
-
-
|
|
52
|
-
-
|
|
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
|
-
- **
|
|
102
|
-
-
|
|
99
|
+
- **AES-256 Encryption** (default, recommended)
|
|
100
|
+
- Strong WinZip-compatible AES-256 encryption
|
|
103
101
|
- Password-protected archives
|
|
104
|
-
-
|
|
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
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
[](https://nodejs.org/)
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Release Notice
|
|
10
10
|
|
|
11
|
-
**
|
|
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
|
-
- **
|
|
45
|
+
- **AES-256**: Strong encryption (default, recommended)
|
|
46
|
+
- **PKZIP**: Legacy encryption (for compatibility only)
|
|
46
47
|
- Password-protected archives
|
|
47
|
-
-
|
|
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
|
|
74
|
+
### Install from npm
|
|
74
75
|
|
|
75
76
|
```bash
|
|
76
|
-
npm install -g neozip-cli
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
483
|
-
neozip --pkzip
|
|
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
|
|
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**:
|
|
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.
|
|
515
|
-
**Status**:
|
|
516
|
-
**Last Updated**:
|
|
526
|
+
**Version**: 0.90.0
|
|
527
|
+
**Status**: Release (see [CHANGELOG.md](CHANGELOG.md) for latest changes)
|
|
528
|
+
**Last Updated**: March 18, 2026
|
package/dist/src/neolist.js
CHANGED
|
@@ -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;
|
package/dist/src/neounzip.js
CHANGED
|
@@ -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
|
|
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 || '
|
|
411
|
-
|
|
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
|
|
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
|
package/dist/src/neozip.js
CHANGED
|
@@ -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 = '
|
|
265
|
+
options.encryptionMethod = 'aes256';
|
|
268
266
|
}
|
|
269
|
-
// Only prompt for password if not already provided
|
|
270
267
|
if (!options.password) {
|
|
271
|
-
options.password = 'PROMPT';
|
|
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 = '
|
|
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';
|
|
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 -
|
|
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 (
|
|
523
|
-
-P, --password [pwd] Encrypt files with password
|
|
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.
|
|
4
|
-
"release_date": "2026-03-
|
|
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 --
|
|
51
|
-
"neozip-encrypt-sm": "npx ts-node src/neozip.ts --
|
|
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",
|