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.
Files changed (76) hide show
  1. package/AGENTS.md +93 -0
  2. package/CHANGELOG.md +70 -1
  3. package/DOCUMENTATION.md +22 -30
  4. package/README.md +214 -48
  5. package/dist/src/account/account-state.js +95 -0
  6. package/dist/src/account/format-account-status.js +62 -0
  7. package/dist/src/account/identity-provision.js +79 -0
  8. package/dist/src/account/identity-wrap.js +106 -0
  9. package/dist/src/account/profile-crypto.js +85 -0
  10. package/dist/src/account/profile-store.js +129 -0
  11. package/dist/src/account/require-account.js +32 -0
  12. package/dist/src/account/token-service-funding.js +151 -0
  13. package/dist/src/account/token-service-identity.js +488 -0
  14. package/dist/src/account/types.js +3 -0
  15. package/dist/src/account/wallet-evm.js +46 -0
  16. package/dist/src/account/wallet-setup.js +33 -0
  17. package/dist/src/archive/crypto-self.js +117 -0
  18. package/dist/src/archive/identity-key.js +217 -0
  19. package/dist/src/archive/recipient-lookup.js +61 -0
  20. package/dist/src/cli/output.js +100 -0
  21. package/dist/src/cli/params.js +122 -0
  22. package/dist/src/cli/schema.js +186 -0
  23. package/dist/src/cli/validate.js +119 -0
  24. package/dist/src/commands/mintTimestampProof.js +26 -14
  25. package/dist/src/commands/verifyEmail.js +9 -9
  26. package/dist/src/config/ConfigSetup.js +82 -423
  27. package/dist/src/config/ConfigStore.js +0 -33
  28. package/dist/src/connect/command.js +364 -0
  29. package/dist/src/connection/bootstrap.js +50 -0
  30. package/dist/src/connection/cli-guidance.js +101 -0
  31. package/dist/src/connection/cli-prefs.js +180 -0
  32. package/dist/src/connection/cli-settings.js +140 -0
  33. package/dist/src/connection/cli-types.js +14 -0
  34. package/dist/src/connection/coordinator.js +83 -0
  35. package/dist/src/connection/credentials.js +33 -0
  36. package/dist/src/connection/crypto.js +96 -0
  37. package/dist/src/connection/dump.js +117 -0
  38. package/dist/src/connection/funding.js +187 -0
  39. package/dist/src/connection/incomplete-setup.js +89 -0
  40. package/dist/src/connection/interactive.js +871 -0
  41. package/dist/src/connection/legacy-profile-reader.js +87 -0
  42. package/dist/src/connection/magic-link.js +142 -0
  43. package/dist/src/connection/migrate.js +115 -0
  44. package/dist/src/connection/onboarding.js +616 -0
  45. package/dist/src/connection/origin.js +69 -0
  46. package/dist/src/connection/phase.js +101 -0
  47. package/dist/src/connection/phone.js +26 -0
  48. package/dist/src/connection/promote-active.js +56 -0
  49. package/dist/src/connection/reset.js +56 -0
  50. package/dist/src/connection/status-report.js +52 -0
  51. package/dist/src/connection/store.js +406 -0
  52. package/dist/src/connection/token-auth.js +44 -0
  53. package/dist/src/connection/types.js +3 -0
  54. package/dist/src/connection/wallet-json-migration.js +155 -0
  55. package/dist/src/connection/wallet-login.js +65 -0
  56. package/dist/src/connection/wallet-setup.js +83 -0
  57. package/dist/src/constants/wallet-identity.js +14 -0
  58. package/dist/src/exit-codes.js +54 -10
  59. package/dist/src/neolist.js +93 -9
  60. package/dist/src/neounzip.js +217 -59
  61. package/dist/src/neozip/blockchain.js +18 -18
  62. package/dist/src/neozip/createZip.js +114 -91
  63. package/dist/src/neozip/upgradeZip.js +14 -11
  64. package/dist/src/neozip.js +252 -75
  65. package/dist/src/skills/command.js +256 -0
  66. package/dist/src/skills/locate.js +99 -0
  67. package/dist/src/util/mask.js +34 -0
  68. package/dist/src/util/token-service-fetch.js +26 -0
  69. package/env.example +18 -85
  70. package/package.json +89 -82
  71. package/skills/neozip-connect/SKILL.md +95 -0
  72. package/skills/neozip-create/SKILL.md +57 -0
  73. package/skills/neozip-extract/SKILL.md +58 -0
  74. package/skills/neozip-legacy/SKILL.md +48 -0
  75. package/skills/neozip-list/SKILL.md +56 -0
  76. 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.90.0",
4
- "release_date": "2026-03-18",
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": "npx ts-node src/neozip.ts tests/output/calgary.nzip tests/fixtures/calgary/*",
28
- "dev": "npx ts-node --inspect src/neozip.ts tests/output/calgary.nzip tests/fixtures/calgary/*",
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": "npm run build && echo '📦 Creating package tarball...' && npm pack && echo '✅ Package created successfully!'",
34
- "pack:dry-run": "npm run build && echo '📦 Previewing package contents...' && npm 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": "npm run build && npm run pack",
37
- "prepublishOnly": "npm run build",
38
- "neozip": "npx ts-node src/neozip.ts -b -T tests/output/calgary.nzip tests/fixtures/calgary/*",
39
- "neozip-sepolia": "npx ts-node src/neozip.ts -b -T --network sepolia-testnet tests/output/calgary.nzip tests/fixtures/calgary/*",
40
- "neozip-base-sepolia": "npx ts-node src/neozip.ts -b -T --network base-sepolia tests/output/calgary.nzip tests/fixtures/calgary/*",
41
- "neozip-base": "npx ts-node src/neozip.ts -b -T --network base-mainnet tests/output/calgary.nzip tests/fixtures/calgary/*",
42
- "neozip-arbitrum-sepolia": "npx ts-node src/neozip.ts -b -T --network arbitrum-sepolia tests/output/calgary.nzip tests/fixtures/calgary/*",
43
- "neozip-arbitrum": "npx ts-node src/neozip.ts -b -T --network arbitrum-one tests/output/calgary.nzip tests/fixtures/calgary/*",
44
- "neozip-deflate": "npx ts-node src/neozip.ts --deflate -T tests/output/calgary.nzip tests/fixtures/calgary/*",
45
- "neozip-inmem": "npx ts-node src/neozip.ts -b --in-memory -T tests/output/calgary.nzip tests/fixtures/calgary/*",
46
- "neozip-store": "npx ts-node src/neozip.ts --level 0 -T tests/output/calgary-stored.nzip tests/fixtures/calgary/*",
47
- "neozip-ots": "npx ts-node src/neozip.ts -ots -T tests/output/calgary-ots.nzip tests/fixtures/calgary/*",
48
- "neozip-stamp": "npx ts-node src/neozip.ts -ts -T tests/output/calgary-stamp.nzip tests/fixtures/calgary/*",
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": "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
+ "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": "npx ts-node src/neozip.ts -T tests/output/test-sm.nzip tests/fixtures/test-sm/*",
57
- "neozip-init": "npx ts-node src/neozip.ts init",
58
- "neozip-config": "npx ts-node src/neozip.ts config",
59
- "verify-email": "node dist/src/neozip.js verify-email",
60
- "neozip-help": "npx ts-node src/neozip.ts --help",
61
- "neounzip": "npx ts-node src/neounzip.ts tests/output/calgary.nzip -t",
62
- "neounzip-inmem": "npx ts-node src/neounzip.ts --in-memory -l tests/output/calgary.nzip -t",
63
- "neounzip-bad": "npx ts-node src/neounzip.ts tests/output/calgary-bad.nzip -t",
64
- "neounzip-bad-inmem": "npx ts-node src/neounzip.ts --in-memory tests/output/calgary-bad.nzip -t",
65
- "neounzip-sm": "npx ts-node src/neounzip.ts -o tests/output/test-sm.nzip",
66
- "neounzip-skip-blockchain": "npx ts-node src/neounzip.ts --skip-blockchain tests/output/calgary.nzip -t",
67
- "neounzip-lg": "npx ts-node src/neounzip.ts tests/output/large.nzip -t",
68
- "neounzip-stamp": "npx ts-node src/neounzip.ts tests/output/calgary-stamp.nzip -t",
69
- "neounzip-stamp-upgrade": "npx ts-node src/neounzip.ts tests/output/calgary-stamp-upgrade.nzip -t",
70
- "neounzip-ots": "npx ts-node src/neounzip.ts tests/output/calgary-ots.nzip -t",
71
- "neounzip-ots-skip-blockchain": "npx ts-node src/neounzip.ts --skip-blockchain tests/output/calgary-ots.nzip -t",
72
- "neounzip-streaming": "npx ts-node src/neounzip.ts --buffer-size 16384 --verbose tests/output/merged-test.nzip -t",
73
- "neounzip-decrypt": "npx ts-node src/neounzip.ts --password 'pass123' tests/output/calgary-encrypted.nzip -t",
74
- "neounzip-decrypt-inmem": "npx ts-node src/neounzip.ts --in-memory --password 'pass123' tests/output/calgary-encrypted.nzip -t",
75
- "neounzip-decrypt-stored": "npx ts-node src/neounzip.ts --in-memory --password 'pass123' tests/output/calgary-encrypted-stored.nzip -t",
76
- "neounzip-decrypt-sm": "npx ts-node src/neounzip.ts --password 'pass123' tests/output/encrypted-sm.nzip -t",
77
- "neounzip-decrypt-sm-inmem": "npx ts-node src/neounzip.ts --in-memory --password 'pass123' tests/output/encrypted-sm.nzip -t",
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",
82
- "neounzip-help": "npx ts-node src/neounzip.ts --help",
83
- "neolist": "npx ts-node src/neolist.ts tests/output/calgary.nzip",
84
- "neolist-inmem": "npx ts-node src/neolist.ts --in-memory tests/output/calgary.nzip",
85
- "neolist-basic": "npx ts-node src/neolist.ts -b tests/output/calgary.nzip",
86
- "neolist-verbose": "npx ts-node src/neolist.ts -v tests/output/calgary.nzip",
87
- "neolist-demo": "npx ts-node src/neolist.ts tests/output/calgary.nzip",
88
- "neolist-short": "npx ts-node src/neolist.ts -s tests/output/calgary.nzip",
89
- "neolist-unix": "npx ts-node src/neolist.ts -u tests/output/calgary.nzip",
90
- "neolist-json": "npx ts-node src/neolist.ts -j tests/output/calgary.nzip",
91
- "neolist-zip64": "npx ts-node src/neolist.ts tests/fixtures/calgary-zip64.zip",
92
- "neolist-stamp": "npx ts-node src/neolist.ts tests/output/calgary-stamp.nzip",
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",
95
- "neolist-help": "npx ts-node src/neolist.ts --help",
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": "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!'",
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!'",
111
- "test:infozip-decrypt": "npx ts-node tests/scripts/test-infozip-decrypt.ts",
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) ---' && npx 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 && npx 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) ---' && npx 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 && npx 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",
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) ---' && npx 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 && npx 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) ---' && npx 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 && npx 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",
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' | npx ts-node src/neozip.ts -@ tests/output/test-stdin.zip && echo '' && echo '--- Verifying archive contents ---' && npx ts-node src/neolist.ts tests/output/test-stdin.zip && echo '' && echo '--- Testing with find command ---' && find tests/output/stdin-temp -name '*.txt' | npx ts-node src/neozip.ts -@ tests/output/test-stdin-find.zip && npx 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!'",
117
- "test:eocd": "npx ts-node tests/scripts/test-eocd-loading.ts",
118
- "test:copy-entry": "npx ts-node tests/scripts/test-copy-entry-streaming.ts",
119
- "test:tampered-zip": "npx ts-node tests/scripts/test-tampered-verification.ts",
120
- "test:upgrade-zip": "echo '=== Testing ZIP Upgrade ===' && mkdir -p tests/output && echo '' && echo '--- Creating initial ZIP with Calgary corpus files (deflate compression) ---' && npx 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 ---' && npx ts-node src/neozip.ts --upgrade tests/output/test-upgrade.nzip && echo '' && echo '--- Listing upgraded ZIP contents ---' && npx ts-node src/neolist.ts tests/output/test-upgrade-tokenized.nzip && echo '' && echo '--- Verifying upgraded ZIP with neounzip -t ---' && npx ts-node src/neounzip.ts -t tests/output/test-upgrade-tokenized.nzip && echo '' && echo '✅ ZIP upgrade test completed successfully!'",
121
- "test:pre-verify": "echo '=== Testing Pre-Verify Option (-T) ===' && echo '' && echo '--- Testing pre-verify on tokenized ZIP ---' && npx ts-node src/neounzip.ts -T tests/output/test-upgrade-tokenized.nzip tests/output/preverify/ && echo '' && echo '--- Testing pre-verify on non-tokenized ZIP ---' && npx ts-node src/neozip.ts --deflate tests/output/test-preverify-nontoken.nzip tests/fixtures/calgary/bib tests/fixtures/calgary/book1 tests/fixtures/calgary/book2 && npx 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!'",
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": "npm:neozip-blockchain@latest",
158
- "neozip-cli": "^0.80.0",
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": "yarn@4.12.0"
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`.