neozip-cli 0.90.0 → 0.95.1
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/AGENTS.md +93 -0
- package/CHANGELOG.md +70 -1
- package/DOCUMENTATION.md +22 -30
- package/README.md +214 -48
- package/dist/src/account/account-state.js +95 -0
- package/dist/src/account/format-account-status.js +62 -0
- package/dist/src/account/identity-provision.js +79 -0
- package/dist/src/account/identity-wrap.js +106 -0
- package/dist/src/account/profile-crypto.js +85 -0
- package/dist/src/account/profile-store.js +129 -0
- package/dist/src/account/require-account.js +32 -0
- package/dist/src/account/token-service-funding.js +151 -0
- package/dist/src/account/token-service-identity.js +488 -0
- package/dist/src/account/types.js +3 -0
- package/dist/src/account/wallet-evm.js +46 -0
- package/dist/src/account/wallet-setup.js +33 -0
- package/dist/src/archive/crypto-self.js +117 -0
- package/dist/src/archive/identity-key.js +217 -0
- package/dist/src/archive/recipient-lookup.js +61 -0
- package/dist/src/cli/output.js +100 -0
- package/dist/src/cli/params.js +122 -0
- package/dist/src/cli/schema.js +186 -0
- package/dist/src/cli/validate.js +119 -0
- package/dist/src/commands/mintTimestampProof.js +26 -14
- package/dist/src/commands/verifyEmail.js +9 -9
- package/dist/src/config/ConfigSetup.js +82 -423
- package/dist/src/config/ConfigStore.js +0 -33
- package/dist/src/connect/command.js +364 -0
- package/dist/src/connection/bootstrap.js +50 -0
- package/dist/src/connection/cli-guidance.js +101 -0
- package/dist/src/connection/cli-prefs.js +180 -0
- package/dist/src/connection/cli-settings.js +140 -0
- package/dist/src/connection/cli-types.js +14 -0
- package/dist/src/connection/coordinator.js +83 -0
- package/dist/src/connection/credentials.js +33 -0
- package/dist/src/connection/crypto.js +96 -0
- package/dist/src/connection/dump.js +117 -0
- package/dist/src/connection/funding.js +187 -0
- package/dist/src/connection/incomplete-setup.js +89 -0
- package/dist/src/connection/interactive.js +871 -0
- package/dist/src/connection/legacy-profile-reader.js +87 -0
- package/dist/src/connection/magic-link.js +142 -0
- package/dist/src/connection/migrate.js +115 -0
- package/dist/src/connection/onboarding.js +616 -0
- package/dist/src/connection/origin.js +69 -0
- package/dist/src/connection/phase.js +101 -0
- package/dist/src/connection/phone.js +26 -0
- package/dist/src/connection/promote-active.js +56 -0
- package/dist/src/connection/reset.js +56 -0
- package/dist/src/connection/status-report.js +52 -0
- package/dist/src/connection/store.js +406 -0
- package/dist/src/connection/token-auth.js +44 -0
- package/dist/src/connection/types.js +3 -0
- package/dist/src/connection/wallet-json-migration.js +155 -0
- package/dist/src/connection/wallet-login.js +65 -0
- package/dist/src/connection/wallet-setup.js +83 -0
- package/dist/src/constants/wallet-identity.js +14 -0
- package/dist/src/exit-codes.js +54 -10
- package/dist/src/neolist.js +93 -9
- package/dist/src/neounzip.js +217 -59
- package/dist/src/neozip/blockchain.js +18 -18
- package/dist/src/neozip/createZip.js +114 -91
- package/dist/src/neozip/upgradeZip.js +14 -11
- package/dist/src/neozip.js +252 -75
- package/dist/src/skills/command.js +256 -0
- package/dist/src/skills/locate.js +99 -0
- package/dist/src/util/mask.js +34 -0
- package/dist/src/util/token-service-fetch.js +26 -0
- package/env.example +18 -85
- package/package.json +89 -82
- package/skills/neozip-connect/SKILL.md +95 -0
- package/skills/neozip-create/SKILL.md +57 -0
- package/skills/neozip-extract/SKILL.md +58 -0
- package/skills/neozip-legacy/SKILL.md +48 -0
- package/skills/neozip-list/SKILL.md +56 -0
- package/skills/neozip-shared/SKILL.md +60 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "neozip-cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"release_date": "2026-
|
|
3
|
+
"version": "0.95.1",
|
|
4
|
+
"release_date": "2026-07-07",
|
|
5
5
|
"description": "A full-featured command-line ZIP application with NeoZipKit integration",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -17,82 +17,86 @@
|
|
|
17
17
|
"LICENSE",
|
|
18
18
|
"CHANGELOG.md",
|
|
19
19
|
"DOCUMENTATION.md",
|
|
20
|
-
"WHY_NEOZIP.md"
|
|
20
|
+
"WHY_NEOZIP.md",
|
|
21
|
+
"AGENTS.md",
|
|
22
|
+
"skills/"
|
|
21
23
|
],
|
|
22
24
|
"preferGlobal": true,
|
|
23
25
|
"publishConfig": {
|
|
24
26
|
"access": "public"
|
|
25
27
|
},
|
|
26
28
|
"scripts": {
|
|
27
|
-
"start": "
|
|
28
|
-
"dev": "
|
|
29
|
+
"start": "pnpm exec ts-node src/neozip.ts tests/output/calgary.nzip tests/fixtures/calgary/*",
|
|
30
|
+
"dev": "pnpm exec ts-node --inspect src/neozip.ts tests/output/calgary.nzip tests/fixtures/calgary/*",
|
|
29
31
|
"build": "echo '🔨 Building TypeScript...' && tsc --pretty && echo '🧹 Removing neozipkit from dist (if present)...' && rm -rf dist/neozipkit && echo '✅ Build completed successfully!'",
|
|
30
32
|
"build:clean": "echo '🧹 Cleaning dist directory...' && rm -rf dist && echo '🔨 Building TypeScript...' && tsc --pretty && echo '✅ Clean build completed successfully!'",
|
|
31
33
|
"type-check": "tsc --noEmit",
|
|
32
34
|
"clean": "rm -rf dist/* tests/output/*",
|
|
33
|
-
"pack": "
|
|
34
|
-
"pack:dry-run": "
|
|
35
|
+
"pack": "pnpm run build && echo '📦 Creating package tarball...' && pnpm pack && echo '✅ Package created successfully!'",
|
|
36
|
+
"pack:dry-run": "pnpm run build && echo '📦 Previewing package contents...' && pnpm exec npm pack --dry-run",
|
|
35
37
|
"pack:clean": "rm -f neozip-cli-*.tgz && echo '🧹 Cleaned up package tarballs'",
|
|
36
|
-
"package": "
|
|
37
|
-
"prepublishOnly": "
|
|
38
|
-
"neozip": "
|
|
39
|
-
"neozip-sepolia": "
|
|
40
|
-
"neozip-base-sepolia": "
|
|
41
|
-
"neozip-base": "
|
|
42
|
-
"neozip-arbitrum-sepolia": "
|
|
43
|
-
"neozip-arbitrum": "
|
|
44
|
-
"neozip-deflate": "
|
|
45
|
-
"neozip-inmem": "
|
|
46
|
-
"neozip-store": "
|
|
47
|
-
"neozip-ots": "
|
|
48
|
-
"neozip-stamp": "
|
|
38
|
+
"package": "pnpm run build && pnpm run pack",
|
|
39
|
+
"prepublishOnly": "pnpm run build",
|
|
40
|
+
"neozip": "pnpm exec ts-node src/neozip.ts -b -T tests/output/calgary.nzip tests/fixtures/calgary/*",
|
|
41
|
+
"neozip-sepolia": "pnpm exec ts-node src/neozip.ts -b -T --network sepolia-testnet tests/output/calgary.nzip tests/fixtures/calgary/*",
|
|
42
|
+
"neozip-base-sepolia": "pnpm exec ts-node src/neozip.ts -b -T --network base-sepolia tests/output/calgary.nzip tests/fixtures/calgary/*",
|
|
43
|
+
"neozip-base": "pnpm exec ts-node src/neozip.ts -b -T --network base-mainnet tests/output/calgary.nzip tests/fixtures/calgary/*",
|
|
44
|
+
"neozip-arbitrum-sepolia": "pnpm exec ts-node src/neozip.ts -b -T --network arbitrum-sepolia tests/output/calgary.nzip tests/fixtures/calgary/*",
|
|
45
|
+
"neozip-arbitrum": "pnpm exec ts-node src/neozip.ts -b -T --network arbitrum-one tests/output/calgary.nzip tests/fixtures/calgary/*",
|
|
46
|
+
"neozip-deflate": "pnpm exec ts-node src/neozip.ts --deflate -T tests/output/calgary.nzip tests/fixtures/calgary/*",
|
|
47
|
+
"neozip-inmem": "pnpm exec ts-node src/neozip.ts -b --in-memory -T tests/output/calgary.nzip tests/fixtures/calgary/*",
|
|
48
|
+
"neozip-store": "pnpm exec ts-node src/neozip.ts --level 0 -T tests/output/calgary-stored.nzip tests/fixtures/calgary/*",
|
|
49
|
+
"neozip-ots": "pnpm exec ts-node src/neozip.ts -ots -T tests/output/calgary-ots.nzip tests/fixtures/calgary/*",
|
|
50
|
+
"neozip-stamp": "pnpm exec ts-node src/neozip.ts -ts -T tests/output/calgary-stamp.nzip tests/fixtures/calgary/*",
|
|
49
51
|
"neozip-mint": "node dist/src/neozip.js mint -o tests/output/calgary-stamp-upgrade.nzip tests/output/calgary-stamp-nft.nzip",
|
|
50
|
-
"neozip-encrypt": "
|
|
51
|
-
"neozip-encrypt-sm": "
|
|
52
|
-
"neozip-encrypt-aes": "
|
|
53
|
-
"neozip-encrypt-aes-sm": "
|
|
54
|
-
"neozip-encrypt-aes-explicit": "
|
|
52
|
+
"neozip-encrypt": "pnpm exec ts-node src/neozip.ts --pkzip -P 'pass123' -T tests/output/calgary-encrypted.nzip tests/fixtures/calgary/*",
|
|
53
|
+
"neozip-encrypt-sm": "pnpm exec ts-node src/neozip.ts --pkzip -P 'pass123' -T tests/output/encrypted-sm.nzip tests/fixtures/test-sm/*",
|
|
54
|
+
"neozip-encrypt-aes": "pnpm exec ts-node src/neozip.ts -e -P 'pass123' tests/output/calgary-encrypted-aes.nzip tests/fixtures/calgary/*",
|
|
55
|
+
"neozip-encrypt-aes-sm": "pnpm exec ts-node src/neozip.ts -e -P 'pass123' tests/output/encrypted-aes-sm.nzip tests/fixtures/test-sm/*",
|
|
56
|
+
"neozip-encrypt-aes-explicit": "pnpm exec ts-node src/neozip.ts --aes256 -P 'pass123' tests/output/calgary-encrypted-aes-explicit.nzip tests/fixtures/calgary/*",
|
|
55
57
|
"neozip-update": "node tests/scripts/test-update-option.js",
|
|
56
|
-
"neozip-sm": "
|
|
57
|
-
"neozip-init": "
|
|
58
|
-
"neozip-
|
|
59
|
-
"
|
|
60
|
-
"neozip-
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"neounzip
|
|
64
|
-
"neounzip-
|
|
65
|
-
"neounzip-
|
|
66
|
-
"neounzip-
|
|
67
|
-
"neounzip-
|
|
68
|
-
"neounzip-
|
|
69
|
-
"neounzip-
|
|
70
|
-
"neounzip-
|
|
71
|
-
"neounzip-
|
|
72
|
-
"neounzip-
|
|
73
|
-
"neounzip-
|
|
74
|
-
"neounzip-
|
|
75
|
-
"neounzip-decrypt
|
|
76
|
-
"neounzip-decrypt-
|
|
77
|
-
"neounzip-decrypt-
|
|
78
|
-
"neounzip-decrypt-
|
|
79
|
-
"neounzip-decrypt-
|
|
80
|
-
"neounzip-decrypt-
|
|
81
|
-
"neounzip-decrypt-aes
|
|
82
|
-
"neounzip-
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"neolist
|
|
86
|
-
"neolist-
|
|
87
|
-
"neolist-
|
|
88
|
-
"neolist-
|
|
89
|
-
"neolist-
|
|
90
|
-
"neolist-
|
|
91
|
-
"neolist-
|
|
92
|
-
"neolist-
|
|
93
|
-
"neolist-
|
|
94
|
-
"neolist-
|
|
95
|
-
"neolist-
|
|
58
|
+
"neozip-sm": "pnpm exec ts-node src/neozip.ts -T tests/output/test-sm.nzip tests/fixtures/test-sm/*",
|
|
59
|
+
"neozip-init": "pnpm exec ts-node src/neozip.ts init",
|
|
60
|
+
"neozip-connect": "pnpm exec ts-node src/neozip.ts connect",
|
|
61
|
+
"neozip-skills": "pnpm exec ts-node src/neozip.ts skills",
|
|
62
|
+
"neozip-config": "pnpm exec ts-node src/neozip.ts config",
|
|
63
|
+
"neozip-fund": "pnpm exec ts-node src/neozip.ts connect fund",
|
|
64
|
+
"neozip-help": "pnpm exec ts-node src/neozip.ts --help",
|
|
65
|
+
"neounzip": "pnpm exec ts-node src/neounzip.ts tests/output/calgary.nzip -t",
|
|
66
|
+
"neounzip-inmem": "pnpm exec ts-node src/neounzip.ts --in-memory -l tests/output/calgary.nzip -t",
|
|
67
|
+
"neounzip-bad": "pnpm exec ts-node src/neounzip.ts tests/output/calgary-bad.nzip -t",
|
|
68
|
+
"neounzip-bad-inmem": "pnpm exec ts-node src/neounzip.ts --in-memory tests/output/calgary-bad.nzip -t",
|
|
69
|
+
"neounzip-sm": "pnpm exec ts-node src/neounzip.ts -o tests/output/test-sm.nzip",
|
|
70
|
+
"neounzip-skip-blockchain": "pnpm exec ts-node src/neounzip.ts --skip-blockchain tests/output/calgary.nzip -t",
|
|
71
|
+
"neounzip-lg": "pnpm exec ts-node src/neounzip.ts tests/output/large.nzip -t",
|
|
72
|
+
"neounzip-stamp": "pnpm exec ts-node src/neounzip.ts tests/output/calgary-stamp.nzip -t",
|
|
73
|
+
"neounzip-stamp-upgrade": "pnpm exec ts-node src/neounzip.ts tests/output/calgary-stamp-upgrade.nzip -t",
|
|
74
|
+
"neounzip-ots": "pnpm exec ts-node src/neounzip.ts tests/output/calgary-ots.nzip -t",
|
|
75
|
+
"neounzip-ots-skip-blockchain": "pnpm exec ts-node src/neounzip.ts --skip-blockchain tests/output/calgary-ots.nzip -t",
|
|
76
|
+
"neounzip-streaming": "pnpm exec ts-node src/neounzip.ts --buffer-size 16384 --verbose tests/output/merged-test.nzip -t",
|
|
77
|
+
"neounzip-decrypt": "pnpm exec ts-node src/neounzip.ts --password 'pass123' tests/output/calgary-encrypted.nzip -t",
|
|
78
|
+
"neounzip-decrypt-inmem": "pnpm exec ts-node src/neounzip.ts --in-memory --password 'pass123' tests/output/calgary-encrypted.nzip -t",
|
|
79
|
+
"neounzip-decrypt-stored": "pnpm exec ts-node src/neounzip.ts --in-memory --password 'pass123' tests/output/calgary-encrypted-stored.nzip -t",
|
|
80
|
+
"neounzip-decrypt-sm": "pnpm exec ts-node src/neounzip.ts --password 'pass123' tests/output/encrypted-sm.nzip -t",
|
|
81
|
+
"neounzip-decrypt-sm-inmem": "pnpm exec ts-node src/neounzip.ts --in-memory --password 'pass123' tests/output/encrypted-sm.nzip -t",
|
|
82
|
+
"neounzip-decrypt-pkzip": "pnpm exec ts-node src/neounzip.ts --pkzip-decrypt --password 'legacy-test-123' tests/output/calgary-pkzip.nzip -t",
|
|
83
|
+
"neounzip-decrypt-aes": "pnpm exec ts-node src/neounzip.ts --password 'pass123' tests/output/calgary-encrypted-aes.nzip -t",
|
|
84
|
+
"neounzip-decrypt-aes-inmem": "pnpm exec ts-node src/neounzip.ts --in-memory --password 'pass123' tests/output/calgary-encrypted-aes.nzip -t",
|
|
85
|
+
"neounzip-decrypt-aes-sm": "pnpm exec ts-node src/neounzip.ts --password 'pass123' tests/output/encrypted-aes-sm.nzip -t",
|
|
86
|
+
"neounzip-help": "pnpm exec ts-node src/neounzip.ts --help",
|
|
87
|
+
"neolist": "pnpm exec ts-node src/neolist.ts tests/output/calgary.nzip",
|
|
88
|
+
"neolist-inmem": "pnpm exec ts-node src/neolist.ts --in-memory tests/output/calgary.nzip",
|
|
89
|
+
"neolist-basic": "pnpm exec ts-node src/neolist.ts -b tests/output/calgary.nzip",
|
|
90
|
+
"neolist-verbose": "pnpm exec ts-node src/neolist.ts -v tests/output/calgary.nzip",
|
|
91
|
+
"neolist-demo": "pnpm exec ts-node src/neolist.ts tests/output/calgary.nzip",
|
|
92
|
+
"neolist-short": "pnpm exec ts-node src/neolist.ts -s tests/output/calgary.nzip",
|
|
93
|
+
"neolist-unix": "pnpm exec ts-node src/neolist.ts -u tests/output/calgary.nzip",
|
|
94
|
+
"neolist-json": "pnpm exec ts-node src/neolist.ts -j tests/output/calgary.nzip",
|
|
95
|
+
"neolist-zip64": "pnpm exec ts-node src/neolist.ts tests/fixtures/calgary-zip64.zip",
|
|
96
|
+
"neolist-stamp": "pnpm exec ts-node src/neolist.ts tests/output/calgary-stamp.nzip",
|
|
97
|
+
"neolist-stamp-upgrade": "pnpm exec ts-node src/neolist.ts tests/output/calgary-stamp-upgrade.nzip",
|
|
98
|
+
"neolist-encrypted-aes": "pnpm exec ts-node src/neolist.ts -v tests/output/calgary-encrypted-aes.nzip",
|
|
99
|
+
"neolist-help": "pnpm exec ts-node src/neolist.ts --help",
|
|
96
100
|
"infozip-encrypt-zip": "zip -e -P 'pass123' -r tests/fixtures/infozip/calgary-encrypted.zip tests/fixtures/calgary/*",
|
|
97
101
|
"infozip-encrypt-sm": "zip -e -P 'pass123' -0 tests/fixtures/infozip/encrypted-sm.zip tests/fixtures/test-sm/*",
|
|
98
102
|
"infozip-encrypt-stored": "zip -e -P 'pass123' -0 tests/fixtures/infozip/calgary-encrypted-stored.zip tests/fixtures/calgary/bib",
|
|
@@ -105,20 +109,20 @@
|
|
|
105
109
|
"test:neozip": "node tests/scripts/comprehensive/test-neozip-options.js",
|
|
106
110
|
"test:neounzip": "node tests/scripts/comprehensive/test-neounzip-options.js",
|
|
107
111
|
"test:neolist": "node tests/scripts/comprehensive/test-neolist-options.js",
|
|
108
|
-
"test:encryption": "
|
|
109
|
-
"test:encryption-aes": "
|
|
110
|
-
"test:stamp": "echo '=== Testing Timestamp Support ===' &&
|
|
111
|
-
"test:infozip-decrypt": "
|
|
112
|
+
"test:encryption": "pnpm run neozip-encrypt-aes && pnpm run neounzip-decrypt-aes && pnpm run neozip-encrypt && pnpm run neounzip-decrypt && echo '✅ All encryption tests (AES-256 + PKZIP) completed successfully!'",
|
|
113
|
+
"test:encryption-aes": "pnpm run neozip-encrypt-aes && pnpm run neounzip-decrypt-aes && pnpm run neounzip-decrypt-aes-inmem && echo '✅ AES-256 encryption tests completed successfully!'",
|
|
114
|
+
"test:stamp": "echo '=== Testing Timestamp Support ===' && pnpm run neozip-ots && pnpm run neounzip-ots && echo '' && echo '--- Token Service (may fail if server unreachable) ---' && (pnpm run neozip-stamp && pnpm run neounzip-stamp && echo '✅ Token Service tests completed') || echo '⚠️ Token Service skipped (server may be unreachable)' && echo '' && echo '✅ Timestamp tests completed successfully!'",
|
|
115
|
+
"test:infozip-decrypt": "pnpm exec ts-node tests/scripts/test-infozip-decrypt.ts",
|
|
112
116
|
"test:comments": "node tests/scripts/comprehensive/test-comments-options.js",
|
|
113
117
|
"test:update": "node tests/scripts/test-update-option.js",
|
|
114
|
-
"test:symlinks": "echo '=== Testing Symbolic Links ===' && rm -rf tests/output/symlinks-temp && rm -rf tests/output/symlinks* 2>/dev/null; rm -rf tests/output/symlinks*.nzip 2>/dev/null; mkdir -p tests/output/symlinks-temp && echo 'This is the target file content' > tests/output/symlinks-temp/target.txt && ln -sf target.txt tests/output/symlinks-temp/symlink.txt && echo -e '\\n--- Original files ---' && ls -la tests/output/symlinks-temp/ && echo -e '\\n--- Creating ZIP with -y (store symlinks) ---' &&
|
|
115
|
-
"test:hardlinks": "echo '=== Testing Hard Links ===' && rm -rf tests/output/hardlinks-temp && rm -rf tests/output/hardlinks* 2>/dev/null; rm -rf tests/output/hardlinks*.nzip 2>/dev/null; mkdir -p tests/output/hardlinks-temp && echo 'This is the original file content for hard link testing' > tests/output/hardlinks-temp/original.txt && ln tests/output/hardlinks-temp/original.txt tests/output/hardlinks-temp/hardlink1.txt && ln tests/output/hardlinks-temp/original.txt tests/output/hardlinks-temp/hardlink2.txt && echo -e '\\n--- Original files (note same inode numbers) ---' && ls -li tests/output/hardlinks-temp/ && echo -e '\\n--- Creating ZIP with -H (detect hard links) ---' &&
|
|
116
|
-
"test:stdin": "echo '=== Testing Stdin Filenames ===' && mkdir -p tests/output/stdin-temp && echo 'Test file 1' > tests/output/stdin-temp/file1.txt && echo 'Test file 2' > tests/output/stdin-temp/file2.txt && echo 'Test file 3' > tests/output/stdin-temp/file3.txt && echo '' && echo '--- Testing stdin filenames with -@ ---' && printf 'tests/output/stdin-temp/file1.txt\\ntests/output/stdin-temp/file2.txt\\ntests/output/stdin-temp/file3.txt\\n' |
|
|
117
|
-
"test:eocd": "
|
|
118
|
-
"test:copy-entry": "
|
|
119
|
-
"test:tampered-zip": "
|
|
120
|
-
"test:upgrade-zip": "echo '=== Testing ZIP Upgrade ===' && mkdir -p tests/output && echo '' && echo '--- Creating initial ZIP with Calgary corpus files (deflate compression) ---' &&
|
|
121
|
-
"test:pre-verify": "echo '=== Testing Pre-Verify Option (-T) ===' && echo '' && echo '--- Testing pre-verify on tokenized ZIP ---' &&
|
|
118
|
+
"test:symlinks": "echo '=== Testing Symbolic Links ===' && rm -rf tests/output/symlinks-temp && rm -rf tests/output/symlinks* 2>/dev/null; rm -rf tests/output/symlinks*.nzip 2>/dev/null; mkdir -p tests/output/symlinks-temp && echo 'This is the target file content' > tests/output/symlinks-temp/target.txt && ln -sf target.txt tests/output/symlinks-temp/symlink.txt && echo -e '\\n--- Original files ---' && ls -la tests/output/symlinks-temp/ && echo -e '\\n--- Creating ZIP with -y (store symlinks) ---' && pnpm exec ts-node src/neozip.ts -y tests/output/symlinks-test.nzip tests/output/symlinks-temp/* && echo -e '\\n--- Extracting with -y (restore symlinks) ---' && mkdir -p tests/output/symlinks && pnpm exec ts-node src/neounzip.ts -y tests/output/symlinks-test.nzip tests/output/symlinks/ && echo -e '\\n--- Extracted files ---' && ls -la tests/output/symlinks/tests/output/symlinks-temp/ 2>/dev/null || ls -la tests/output/symlinks/ && echo -e '\\n--- Testing symlink functionality ---' && (test -L tests/output/symlinks/tests/output/symlinks-temp/symlink.txt 2>/dev/null && cat tests/output/symlinks/tests/output/symlinks-temp/symlink.txt > /dev/null 2>&1 && echo '✅ PASS: Symlink test completed successfully') || (test -L tests/output/symlinks/symlink.txt 2>/dev/null && cat tests/output/symlinks/symlink.txt > /dev/null 2>&1 && echo '✅ PASS: Symlink test completed successfully') || echo '❌ FAIL: Symlink was not created or does not work' && echo -e '\\n--- Creating ZIP without -y (follow symlinks) ---' && pnpm exec ts-node src/neozip.ts tests/output/symlinks-follow.nzip tests/output/symlinks-temp/* && echo -e '\\n--- Extracting without -y (regular files) ---' && mkdir -p tests/output/symlinks-follow && pnpm exec ts-node src/neounzip.ts tests/output/symlinks-follow.nzip tests/output/symlinks-follow/ && echo -e '\\n--- Extracted files (no symlinks) ---' && ls -la tests/output/symlinks-follow/tests/output/symlinks-temp/ 2>/dev/null || ls -la tests/output/symlinks-follow/ && rm -rf tests/output/symlinks-temp && rm -rf tests/output/symlinks* 2>/dev/null; rm -rf tests/output/symlinks*.nzip 2>/dev/null",
|
|
119
|
+
"test:hardlinks": "echo '=== Testing Hard Links ===' && rm -rf tests/output/hardlinks-temp && rm -rf tests/output/hardlinks* 2>/dev/null; rm -rf tests/output/hardlinks*.nzip 2>/dev/null; mkdir -p tests/output/hardlinks-temp && echo 'This is the original file content for hard link testing' > tests/output/hardlinks-temp/original.txt && ln tests/output/hardlinks-temp/original.txt tests/output/hardlinks-temp/hardlink1.txt && ln tests/output/hardlinks-temp/original.txt tests/output/hardlinks-temp/hardlink2.txt && echo -e '\\n--- Original files (note same inode numbers) ---' && ls -li tests/output/hardlinks-temp/ && echo -e '\\n--- Creating ZIP with -H (detect hard links) ---' && pnpm exec ts-node src/neozip.ts -H tests/output/hardlinks-test.nzip tests/output/hardlinks-temp/* && echo -e '\\n--- Extracting with -H (restore hard links) ---' && mkdir -p tests/output/hardlinks && pnpm exec ts-node src/neounzip.ts -H tests/output/hardlinks-test.nzip tests/output/hardlinks/ && echo -e '\\n--- Extracted files (note same inode numbers) ---' && ls -li tests/output/hardlinks/tests/output/hardlinks-temp/ 2>/dev/null || ls -li tests/output/hardlinks/ && echo -e '\\n--- Testing hard link functionality ---' && HARD_LINK1=\"tests/output/hardlinks/tests/output/hardlinks-temp/hardlink1.txt\"; HARD_LINK2=\"tests/output/hardlinks/tests/output/hardlinks-temp/hardlink2.txt\"; ORIGINAL=\"tests/output/hardlinks/tests/output/hardlinks-temp/original.txt\"; test -f \"$HARD_LINK1\" || HARD_LINK1=\"tests/output/hardlinks/hardlink1.txt\"; test -f \"$HARD_LINK2\" || HARD_LINK2=\"tests/output/hardlinks/hardlink2.txt\"; test -f \"$ORIGINAL\" || ORIGINAL=\"tests/output/hardlinks/original.txt\"; (test -f \"$HARD_LINK1\" && test -f \"$ORIGINAL\" && echo 'Modified content' >> \"$HARD_LINK1\" 2>/dev/null && cat \"$ORIGINAL\" > /dev/null 2>&1 && echo '✅ PASS: Hard links test (with -H) completed') || echo '⚠️ WARN: Hard links extraction may have issues' && echo -e '\\n--- Creating ZIP without -H (store as copies) ---' && pnpm exec ts-node src/neozip.ts tests/output/hardlinks-copies.nzip tests/output/hardlinks-temp/* && echo -e '\\n--- Extracting without -H (separate files) ---' && mkdir -p tests/output/hardlinks-copies && pnpm exec ts-node src/neounzip.ts tests/output/hardlinks-copies.nzip tests/output/hardlinks-copies/ && echo -e '\\n--- Extracted files (different inodes) ---' && ls -li tests/output/hardlinks-copies/tests/output/hardlinks-temp/ 2>/dev/null || ls -li tests/output/hardlinks-copies/ && echo -e '\\n=== TEST SUMMARY ===' && (test -f tests/output/hardlinks-copies/tests/output/hardlinks-temp/original.txt 2>/dev/null || test -f tests/output/hardlinks-copies/original.txt 2>/dev/null) && echo '✅ PASS: Hard links test completed successfully' || echo '❌ FAIL: Some hard link tests failed' && rm -rf tests/output/hardlinks-temp && rm -rf tests/output/hardlinks* 2>/dev/null; rm -rf tests/output/hardlinks*.nzip 2>/dev/null",
|
|
120
|
+
"test:stdin": "echo '=== Testing Stdin Filenames ===' && mkdir -p tests/output/stdin-temp && echo 'Test file 1' > tests/output/stdin-temp/file1.txt && echo 'Test file 2' > tests/output/stdin-temp/file2.txt && echo 'Test file 3' > tests/output/stdin-temp/file3.txt && echo '' && echo '--- Testing stdin filenames with -@ ---' && printf 'tests/output/stdin-temp/file1.txt\\ntests/output/stdin-temp/file2.txt\\ntests/output/stdin-temp/file3.txt\\n' | pnpm exec ts-node src/neozip.ts -@ tests/output/test-stdin.zip && echo '' && echo '--- Verifying archive contents ---' && pnpm exec ts-node src/neolist.ts tests/output/test-stdin.zip && echo '' && echo '--- Testing with find command ---' && find tests/output/stdin-temp -name '*.txt' | pnpm exec ts-node src/neozip.ts -@ tests/output/test-stdin-find.zip && pnpm exec ts-node src/neolist.ts tests/output/test-stdin-find.zip && echo '' && echo '--- Cleanup ---' && rm -rf tests/output/stdin-temp tests/output/test-stdin.zip tests/output/test-stdin-find.zip && echo '✅ Stdin filenames test completed successfully!'",
|
|
121
|
+
"test:eocd": "pnpm exec ts-node tests/scripts/test-eocd-loading.ts",
|
|
122
|
+
"test:copy-entry": "pnpm exec ts-node tests/scripts/test-copy-entry-streaming.ts",
|
|
123
|
+
"test:tampered-zip": "pnpm exec ts-node tests/scripts/test-tampered-verification.ts",
|
|
124
|
+
"test:upgrade-zip": "echo '=== Testing ZIP Upgrade ===' && mkdir -p tests/output && echo '' && echo '--- Creating initial ZIP with Calgary corpus files (deflate compression) ---' && pnpm exec ts-node src/neozip.ts --deflate tests/output/test-upgrade.nzip tests/fixtures/calgary/bib tests/fixtures/calgary/book1 tests/fixtures/calgary/book2 && echo '' && echo '--- Upgrading ZIP for tokenization ---' && pnpm exec ts-node src/neozip.ts --upgrade tests/output/test-upgrade.nzip && echo '' && echo '--- Listing upgraded ZIP contents ---' && pnpm exec ts-node src/neolist.ts tests/output/test-upgrade-tokenized.nzip && echo '' && echo '--- Verifying upgraded ZIP with neounzip -t ---' && pnpm exec ts-node src/neounzip.ts -t tests/output/test-upgrade-tokenized.nzip && echo '' && echo '✅ ZIP upgrade test completed successfully!'",
|
|
125
|
+
"test:pre-verify": "echo '=== Testing Pre-Verify Option (-T) ===' && echo '' && echo '--- Testing pre-verify on tokenized ZIP ---' && pnpm exec ts-node src/neounzip.ts -T tests/output/test-upgrade-tokenized.nzip tests/output/preverify/ && echo '' && echo '--- Testing pre-verify on non-tokenized ZIP ---' && pnpm exec ts-node src/neozip.ts --deflate tests/output/test-preverify-nontoken.nzip tests/fixtures/calgary/bib tests/fixtures/calgary/book1 tests/fixtures/calgary/book2 && pnpm exec ts-node src/neounzip.ts -T tests/output/test-preverify-nontoken.nzip tests/output/preverify-nontoken/ && rm -rf tests/output/preverify* tests/output/test-preverify-nontoken.nzip 2>/dev/null && echo '' && echo '✅ Pre-verify test completed successfully!'",
|
|
122
126
|
"test:package": "node tests/scripts/test-package.js",
|
|
123
127
|
"switch:neozipkit:dev": "node scripts/switch-neozip-blockchain.js dev neozipkit",
|
|
124
128
|
"switch:neozipkit:prod": "node scripts/switch-neozip-blockchain.js prod neozipkit",
|
|
@@ -154,9 +158,8 @@
|
|
|
154
158
|
"minimatch": "^10.0.3",
|
|
155
159
|
"moment": "^2.29.4",
|
|
156
160
|
"moment-timezone": "^0.5.43",
|
|
157
|
-
"neozip-blockchain": "
|
|
158
|
-
"
|
|
159
|
-
"neozipkit": "npm:neozipkit@latest",
|
|
161
|
+
"neozip-blockchain": "^0.8.0",
|
|
162
|
+
"neozipkit": "^0.8.0",
|
|
160
163
|
"opentimestamps": "^0.4.9",
|
|
161
164
|
"ora": "^5.4.1",
|
|
162
165
|
"pako": "^2.1.0",
|
|
@@ -175,7 +178,8 @@
|
|
|
175
178
|
"esbuild": "^0.27.0"
|
|
176
179
|
},
|
|
177
180
|
"engines": {
|
|
178
|
-
"node": ">=16.0.0"
|
|
181
|
+
"node": ">=16.0.0",
|
|
182
|
+
"pnpm": ">=10.0.0"
|
|
179
183
|
},
|
|
180
184
|
"repository": {
|
|
181
185
|
"type": "git",
|
|
@@ -185,5 +189,8 @@
|
|
|
185
189
|
"url": "https://github.com/NeoWareInc/neozip-support/issues"
|
|
186
190
|
},
|
|
187
191
|
"homepage": "https://github.com/NeoWareInc/neozip-cli#readme",
|
|
188
|
-
"packageManager": "
|
|
192
|
+
"packageManager": "pnpm@10.12.1",
|
|
193
|
+
"pnpm": {
|
|
194
|
+
"overrides": {}
|
|
195
|
+
}
|
|
189
196
|
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: neozip-connect
|
|
3
|
+
description: "Set up the NeoZip Token Service account and wallet via neozip connect, required before blockchain tokenization/timestamping operations."
|
|
4
|
+
metadata:
|
|
5
|
+
version: 0.90.0
|
|
6
|
+
openclaw:
|
|
7
|
+
category: "productivity"
|
|
8
|
+
requires:
|
|
9
|
+
bins:
|
|
10
|
+
- neozip
|
|
11
|
+
skills:
|
|
12
|
+
- neozip-shared
|
|
13
|
+
cliHelp: "neozip connect --help"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Token Service setup (`neozip connect`)
|
|
17
|
+
|
|
18
|
+
Blockchain features (`neozip -b`, `-ts`, `mint`) require a connection in
|
|
19
|
+
`~/.neozip/connection/` (shared with NeoZip Desktop and the neozip-mcp server).
|
|
20
|
+
|
|
21
|
+
## Structured output
|
|
22
|
+
|
|
23
|
+
Pass `--json` to any non-interactive subcommand for a `ConnectCliResult`:
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{ "phase": "...", "connectionId": "...", "message": "...", "nextCommand": "..." }
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
The bare wizard (`neozip connect` with no subcommand) requires a TTY — do not
|
|
30
|
+
call it from a non-interactive agent; use the explicit subcommands instead.
|
|
31
|
+
|
|
32
|
+
## Common subcommands
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
neozip connect status --json
|
|
36
|
+
neozip connect register --email you@example.com --json
|
|
37
|
+
neozip connect verify --email you@example.com --code 123456 --json
|
|
38
|
+
neozip connect refresh --email you@example.com --json # sends a code
|
|
39
|
+
neozip connect refresh --email you@example.com --code 123456 --json
|
|
40
|
+
neozip connect wallet create --ack-backup --json
|
|
41
|
+
neozip connect finish --json
|
|
42
|
+
neozip connect migrate --json
|
|
43
|
+
neozip connect fund --json # request gas (default)
|
|
44
|
+
neozip connect fund status --json # eligibility, no spend
|
|
45
|
+
neozip connect fund policy --json # grant size/cooldown, no auth
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Funding the Data Wallet (`neozip connect fund`)
|
|
49
|
+
|
|
50
|
+
On-chain operations (`-b`, `-ts`, `-ots`, `mint`) need native gas in the local
|
|
51
|
+
Data Wallet. The Token Service can send a small fixed grant to your **primary
|
|
52
|
+
linked wallet** (recipient is server-authoritative — the client cannot redirect
|
|
53
|
+
funds). Policy is fixed per chain (e.g. 0.001 ETH per grant, 4-hour cooldown).
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
neozip connect fund policy --json # grant size + cooldown (no auth)
|
|
57
|
+
neozip connect fund status --json # recipient, last/next-eligible, recent grants
|
|
58
|
+
neozip connect fund --json # request a grant (default action)
|
|
59
|
+
neozip connect fund --chain 84532 --json # target a specific chain id
|
|
60
|
+
neozip connect fund --network base-sepolia --json
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
- The chain defaults to the connection's `defaultNetwork` (override with
|
|
64
|
+
`--network NAME` or `--chain ID`).
|
|
65
|
+
- `status` and `request` need a current access token; an expired one is silently
|
|
66
|
+
renewed via wallet signature first (same as `connect refresh`).
|
|
67
|
+
- A second `request` inside the cooldown returns a non-zero exit with an
|
|
68
|
+
`errorCode: "COOLDOWN"` and `nextEligibleAt` — not a double spend.
|
|
69
|
+
- Older Token Service deployments without funding return a clear message and
|
|
70
|
+
point to the public faucet as a fallback.
|
|
71
|
+
|
|
72
|
+
## Expired access tokens
|
|
73
|
+
|
|
74
|
+
The Token Service access token expires over time. `connect status --json --verbose`
|
|
75
|
+
reports it per account as `accessTokenExpired` / `accessTokenExpiresAt`.
|
|
76
|
+
|
|
77
|
+
- An expired token blocks **`-ts`** (Token Service timestamp) but **not** `-b`
|
|
78
|
+
tokenization or `mint`, which sign on-chain with the local wallet key.
|
|
79
|
+
- `connect refresh` prefers a **silent wallet-signature login**: it signs a
|
|
80
|
+
challenge with the local Data Wallet key and receives a fresh token with no
|
|
81
|
+
email round-trip. Just run `neozip connect refresh --json` (no code needed).
|
|
82
|
+
- `-ts` also auto-renews an expired token via wallet signature before failing,
|
|
83
|
+
so timestamping usually needs no manual step.
|
|
84
|
+
- Fallback (older Token Service without wallet login, or no local wallet key):
|
|
85
|
+
the email OTP flow. `connect refresh --email …` sends a 6-digit code, then
|
|
86
|
+
`connect refresh --email … --code 123456` completes it (or pass `--magic-token`).
|
|
87
|
+
- Either way only the access token is replaced, so a `ready` account stays
|
|
88
|
+
`ready` (wallet and identity are untouched).
|
|
89
|
+
|
|
90
|
+
## Rules
|
|
91
|
+
|
|
92
|
+
1. When a `neozip`/`neounzip` blockchain operation fails with a config error,
|
|
93
|
+
the JSON `error.nextCommand` will point here (`neozip connect`).
|
|
94
|
+
2. Follow `result.nextCommand` to advance the setup phase step by step.
|
|
95
|
+
3. `connect dump` prints a no-secrets snapshot of the connection store.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: neozip-create
|
|
3
|
+
description: "Create or update ZIP archives with NeoZip: compression levels, AES/PKZIP encryption, include/exclude, and optional blockchain tokenization."
|
|
4
|
+
metadata:
|
|
5
|
+
version: 0.90.0
|
|
6
|
+
openclaw:
|
|
7
|
+
category: "productivity"
|
|
8
|
+
requires:
|
|
9
|
+
bins:
|
|
10
|
+
- neozip
|
|
11
|
+
skills:
|
|
12
|
+
- neozip-shared
|
|
13
|
+
cliHelp: "neozip --help"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Create archives with `neozip`
|
|
17
|
+
|
|
18
|
+
## Quick reference
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
neozip [options] <archive> <files...>
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Agent-style (JSON-driven):
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
neozip --format json \
|
|
28
|
+
--params '{"level":9,"recurse":true}' \
|
|
29
|
+
--json '{"archive":"out.zip","files":["src/","README.md"],"exclude":["*.log"]}'
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Key `--params` fields
|
|
33
|
+
|
|
34
|
+
- `level` (0-9, 0=store), `compression` ("zstd" | "deflate")
|
|
35
|
+
- `encrypt` (bool), `password` (string), `encryptionMethod` ("aes256" | "pkzip")
|
|
36
|
+
- `recurse`, `junkPaths`, `include[]`, `exclude[]`
|
|
37
|
+
- `blockchain`, `blockchainOts`, `blockchainTokenService`, `network`
|
|
38
|
+
- `legacy` (bool) — see the `neozip-legacy` skill
|
|
39
|
+
|
|
40
|
+
## Rules
|
|
41
|
+
|
|
42
|
+
1. Run `neozip schema neozip` first if unsure of a field.
|
|
43
|
+
2. Always `--dry-run` before creating to confirm the resolved plan.
|
|
44
|
+
3. Default compression is zstd (not InfoZip-readable). Use `legacy` for stock
|
|
45
|
+
`unzip` compatibility.
|
|
46
|
+
4. Blockchain features (`blockchain`, `-ots`, `-ts`) require `neozip connect`
|
|
47
|
+
first; on a config error the JSON `error.nextCommand` will be `neozip connect`.
|
|
48
|
+
5. Passwords on the command line are visible in the process list — prefer
|
|
49
|
+
interactive prompts for sensitive data when a human is present.
|
|
50
|
+
|
|
51
|
+
## Success output
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{ "ok": true, "command": "neozip", "action": "create", "archive": "out.zip",
|
|
55
|
+
"size": 1234, "fileCount": 2, "legacy": false, "compression": "zstd",
|
|
56
|
+
"encrypted": false, "blockchain": false }
|
|
57
|
+
```
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: neozip-extract
|
|
3
|
+
description: "Extract, test, and verify ZIP archives with neounzip: target directory, overwrite policy, entry filters, password, and zip-slip-safe extraction."
|
|
4
|
+
metadata:
|
|
5
|
+
version: 0.90.0
|
|
6
|
+
openclaw:
|
|
7
|
+
category: "productivity"
|
|
8
|
+
requires:
|
|
9
|
+
bins:
|
|
10
|
+
- neounzip
|
|
11
|
+
skills:
|
|
12
|
+
- neozip-shared
|
|
13
|
+
cliHelp: "neounzip --help"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Extract archives with `neounzip`
|
|
17
|
+
|
|
18
|
+
## Quick reference
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
neounzip [options] <archive> [destination]
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Agent-style:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
neounzip --format json \
|
|
28
|
+
--params '{"exdir":"out","overwrite":true}' \
|
|
29
|
+
--json '{"archive":"in.zip","filePatterns":["docs/*"]}'
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Modes (via `--params`)
|
|
33
|
+
|
|
34
|
+
- `testOnly` — verify integrity without extracting
|
|
35
|
+
- `listOnly` — list contents (JSON entries when `--format json`)
|
|
36
|
+
- `preVerify` — verify integrity + blockchain before extracting (abort on fail)
|
|
37
|
+
- default — extract
|
|
38
|
+
|
|
39
|
+
## Key `--params` fields
|
|
40
|
+
|
|
41
|
+
- `exdir` (target dir), `overwrite`, `never`, `junkPaths`
|
|
42
|
+
- `include[]`, `exclude[]`, `password`
|
|
43
|
+
- `skipBlockchain`, `inMemory`
|
|
44
|
+
|
|
45
|
+
## Rules
|
|
46
|
+
|
|
47
|
+
1. Always `--dry-run` first: it returns the exact output path of every entry.
|
|
48
|
+
2. Extraction is **zip-slip-safe** — entries that would escape `exdir` are
|
|
49
|
+
refused with a `ZIP_FORMAT_ERROR` (exit 2/3). Do not try to bypass this.
|
|
50
|
+
3. For encrypted archives provide `password`, or expect exit `82` (bad password).
|
|
51
|
+
4. Prefer a dedicated `exdir` (e.g. a temp dir) over extracting into the CWD.
|
|
52
|
+
|
|
53
|
+
## Success output (extract)
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{ "ok": true, "command": "neounzip", "action": "extract", "archive": "in.zip",
|
|
57
|
+
"destination": "out", "allFilesValid": true, "failedFiles": [] }
|
|
58
|
+
```
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: neozip-legacy
|
|
3
|
+
description: "Produce InfoZip/PKZIP-compatible archives with neozip --legacy so stock unzip and other standard tools can read them."
|
|
4
|
+
metadata:
|
|
5
|
+
version: 0.90.0
|
|
6
|
+
openclaw:
|
|
7
|
+
category: "productivity"
|
|
8
|
+
requires:
|
|
9
|
+
bins:
|
|
10
|
+
- neozip
|
|
11
|
+
skills:
|
|
12
|
+
- neozip-create
|
|
13
|
+
cliHelp: "neozip --help"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# InfoZip / PKZIP compatibility (`--legacy`)
|
|
17
|
+
|
|
18
|
+
By default `neozip` uses **zstd** compression (method 93), which stock InfoZip
|
|
19
|
+
`unzip` cannot read. When the consumer is a standard ZIP tool, use `--legacy`.
|
|
20
|
+
|
|
21
|
+
## What `--legacy` does
|
|
22
|
+
|
|
23
|
+
- Forces **deflate** (method 8), or **store** (method 0) at `-0`.
|
|
24
|
+
- Forces **PKZIP** (ZipCrypto) encryption when encrypting (AES-256 is not
|
|
25
|
+
InfoZip-readable).
|
|
26
|
+
- Disables all NeoZip extensions: zstd, blockchain (`-b`/`-bd`/`-bm`),
|
|
27
|
+
OpenTimestamps (`-ots`), Token Service (`-ts`).
|
|
28
|
+
|
|
29
|
+
## Use it
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Standard, broadly-compatible archive
|
|
33
|
+
neozip --legacy -9 out.zip src/
|
|
34
|
+
|
|
35
|
+
# JSON-driven
|
|
36
|
+
neozip --format json --params '{"legacy":true,"level":9}' \
|
|
37
|
+
--json '{"archive":"out.zip","files":["src/"]}'
|
|
38
|
+
|
|
39
|
+
# Legacy + encryption (PKZIP)
|
|
40
|
+
neozip --legacy -e -P 's3cret' out.zip secret.txt
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Rules
|
|
44
|
+
|
|
45
|
+
1. `--legacy` with any blockchain feature is a hard error (exit 10). Choose one.
|
|
46
|
+
2. To confirm compatibility, the resulting archive opens with stock `unzip`:
|
|
47
|
+
`unzip -t out.zip`.
|
|
48
|
+
3. If you need both tokenization and broad compatibility, produce two archives.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: neozip-list
|
|
3
|
+
description: "List ZIP archive contents as JSON with neolist: file metadata, sizes, compression method, encryption flags, and tokenization status."
|
|
4
|
+
metadata:
|
|
5
|
+
version: 0.90.0
|
|
6
|
+
openclaw:
|
|
7
|
+
category: "productivity"
|
|
8
|
+
requires:
|
|
9
|
+
bins:
|
|
10
|
+
- neolist
|
|
11
|
+
skills:
|
|
12
|
+
- neozip-shared
|
|
13
|
+
cliHelp: "neolist --help"
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# List archives with `neolist`
|
|
17
|
+
|
|
18
|
+
## Quick reference
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
neolist --format json <archive>
|
|
22
|
+
# equivalent legacy flag:
|
|
23
|
+
neolist -j <archive>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
With options as JSON:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
neolist --format json --params '{"sortBy":"size","exclude":["*.tmp"]}' in.zip
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Key `--params` fields
|
|
33
|
+
|
|
34
|
+
- `sortBy` ("name" | "size" | "date")
|
|
35
|
+
- `include[]`, `exclude[]`
|
|
36
|
+
- `noComments`, `inMemory`, `verbose`
|
|
37
|
+
|
|
38
|
+
## Output shape
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"archive": "in.zip",
|
|
43
|
+
"size": 278,
|
|
44
|
+
"fileCount": 2,
|
|
45
|
+
"files": [ { "name": "a.txt", "size": 12, "compressedSize": 14,
|
|
46
|
+
"method": "deflate", "isEncrypted": false } ],
|
|
47
|
+
"summary": { "totalSize": 24, "compressionRatio": 0 },
|
|
48
|
+
"tokenized": false
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Notes
|
|
53
|
+
|
|
54
|
+
- `neolist` is the richest JSON listing surface; prefer it over `neounzip -l`
|
|
55
|
+
for metadata.
|
|
56
|
+
- On `neolist`, `-j` / `--json` is the legacy alias for `--format json`.
|