@interop/did-cli 0.6.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.
Files changed (116) hide show
  1. package/CHANGELOG.md +341 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +1307 -0
  4. package/dist/commands/did.d.ts +3 -0
  5. package/dist/commands/did.d.ts.map +1 -0
  6. package/dist/commands/did.js +605 -0
  7. package/dist/commands/did.js.map +1 -0
  8. package/dist/commands/key.d.ts +3 -0
  9. package/dist/commands/key.d.ts.map +1 -0
  10. package/dist/commands/key.js +430 -0
  11. package/dist/commands/key.js.map +1 -0
  12. package/dist/commands/vc.d.ts +79 -0
  13. package/dist/commands/vc.d.ts.map +1 -0
  14. package/dist/commands/vc.js +528 -0
  15. package/dist/commands/vc.js.map +1 -0
  16. package/dist/commands/wallet.d.ts +14 -0
  17. package/dist/commands/wallet.d.ts.map +1 -0
  18. package/dist/commands/wallet.js +48 -0
  19. package/dist/commands/wallet.js.map +1 -0
  20. package/dist/commands/was.d.ts +500 -0
  21. package/dist/commands/was.d.ts.map +1 -0
  22. package/dist/commands/was.js +1833 -0
  23. package/dist/commands/was.js.map +1 -0
  24. package/dist/commands/zcap.d.ts +85 -0
  25. package/dist/commands/zcap.d.ts.map +1 -0
  26. package/dist/commands/zcap.js +447 -0
  27. package/dist/commands/zcap.js.map +1 -0
  28. package/dist/index.d.ts +3 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +20 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/keys/ecdsa.d.ts +40 -0
  33. package/dist/keys/ecdsa.d.ts.map +1 -0
  34. package/dist/keys/ecdsa.js +73 -0
  35. package/dist/keys/ecdsa.js.map +1 -0
  36. package/dist/meta.d.ts +164 -0
  37. package/dist/meta.d.ts.map +1 -0
  38. package/dist/meta.js +286 -0
  39. package/dist/meta.js.map +1 -0
  40. package/dist/storage.d.ts +191 -0
  41. package/dist/storage.d.ts.map +1 -0
  42. package/dist/storage.js +307 -0
  43. package/dist/storage.js.map +1 -0
  44. package/dist/table.d.ts +43 -0
  45. package/dist/table.d.ts.map +1 -0
  46. package/dist/table.js +61 -0
  47. package/dist/table.js.map +1 -0
  48. package/dist/vc/fixtures/welcomeCredential.d.ts +22 -0
  49. package/dist/vc/fixtures/welcomeCredential.d.ts.map +1 -0
  50. package/dist/vc/fixtures/welcomeCredential.js +25 -0
  51. package/dist/vc/fixtures/welcomeCredential.js.map +1 -0
  52. package/dist/vc/issue.d.ts +24 -0
  53. package/dist/vc/issue.d.ts.map +1 -0
  54. package/dist/vc/issue.js +211 -0
  55. package/dist/vc/issue.js.map +1 -0
  56. package/dist/vc/registries.d.ts +30 -0
  57. package/dist/vc/registries.d.ts.map +1 -0
  58. package/dist/vc/registries.js +53 -0
  59. package/dist/vc/registries.js.map +1 -0
  60. package/dist/vc/registryManager.d.ts +25 -0
  61. package/dist/vc/registryManager.d.ts.map +1 -0
  62. package/dist/vc/registryManager.js +29 -0
  63. package/dist/vc/registryManager.js.map +1 -0
  64. package/dist/vc/suites/expirationSuite.d.ts +23 -0
  65. package/dist/vc/suites/expirationSuite.d.ts.map +1 -0
  66. package/dist/vc/suites/expirationSuite.js +84 -0
  67. package/dist/vc/suites/expirationSuite.js.map +1 -0
  68. package/dist/vc/suites/issuerDetailsSuite.d.ts +22 -0
  69. package/dist/vc/suites/issuerDetailsSuite.d.ts.map +1 -0
  70. package/dist/vc/suites/issuerDetailsSuite.js +69 -0
  71. package/dist/vc/suites/issuerDetailsSuite.js.map +1 -0
  72. package/dist/vc/verify.d.ts +46 -0
  73. package/dist/vc/verify.d.ts.map +1 -0
  74. package/dist/vc/verify.js +147 -0
  75. package/dist/vc/verify.js.map +1 -0
  76. package/dist/was/address.d.ts +44 -0
  77. package/dist/was/address.d.ts.map +1 -0
  78. package/dist/was/address.js +98 -0
  79. package/dist/was/address.js.map +1 -0
  80. package/dist/was/capability.d.ts +65 -0
  81. package/dist/was/capability.d.ts.map +1 -0
  82. package/dist/was/capability.js +108 -0
  83. package/dist/was/capability.js.map +1 -0
  84. package/dist/was/client.d.ts +108 -0
  85. package/dist/was/client.d.ts.map +1 -0
  86. package/dist/was/client.js +142 -0
  87. package/dist/was/client.js.map +1 -0
  88. package/dist/was/io.d.ts +71 -0
  89. package/dist/was/io.d.ts.map +1 -0
  90. package/dist/was/io.js +146 -0
  91. package/dist/was/io.js.map +1 -0
  92. package/dist/was/registry.d.ts +79 -0
  93. package/dist/was/registry.d.ts.map +1 -0
  94. package/dist/was/registry.js +99 -0
  95. package/dist/was/registry.js.map +1 -0
  96. package/dist/zcap/create.d.ts +20 -0
  97. package/dist/zcap/create.d.ts.map +1 -0
  98. package/dist/zcap/create.js +29 -0
  99. package/dist/zcap/create.js.map +1 -0
  100. package/dist/zcap/delegate.d.ts +44 -0
  101. package/dist/zcap/delegate.d.ts.map +1 -0
  102. package/dist/zcap/delegate.js +77 -0
  103. package/dist/zcap/delegate.js.map +1 -0
  104. package/dist/zcap/encoding.d.ts +17 -0
  105. package/dist/zcap/encoding.d.ts.map +1 -0
  106. package/dist/zcap/encoding.js +37 -0
  107. package/dist/zcap/encoding.js.map +1 -0
  108. package/dist/zcap/signer.d.ts +20 -0
  109. package/dist/zcap/signer.d.ts.map +1 -0
  110. package/dist/zcap/signer.js +62 -0
  111. package/dist/zcap/signer.js.map +1 -0
  112. package/dist/zcap/ttl.d.ts +19 -0
  113. package/dist/zcap/ttl.d.ts.map +1 -0
  114. package/dist/zcap/ttl.js +40 -0
  115. package/dist/zcap/ttl.js.map +1 -0
  116. package/package.json +64 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,341 @@
1
+ # History
2
+
3
+ ## 0.7.0 - TBD
4
+
5
+ ### Changed
6
+
7
+ - **BREAKING**: Move the default wallet storage directory from `~/.wallet/` to
8
+ `~/.config/did-cli-wallet/` (honoring `$XDG_CONFIG_HOME` when set), to avoid
9
+ colliding with other tools that use the generic `~/.wallet` name. Existing
10
+ data can be moved with `mv ~/.wallet ~/.config/did-cli-wallet`. The
11
+ `WALLET_DIR` and `DIDS_DIR` environment variables still override the default
12
+ as before.
13
+ - `di --version` now reports the version from `package.json` instead of a
14
+ hardcoded string.
15
+ - Relax the `engines` requirement from Node `>=24` to `>=22` (the oldest
16
+ currently supported LTS line).
17
+
18
+ ## 0.6.0 - 2026-06-11
19
+
20
+ ### Added
21
+
22
+ - Add a `was` command group: a CLI for Wallet Attached Storage (WAS) servers
23
+ via `@interop/was-client`, signing every request with a locally stored
24
+ `did:key` DID (Ed25519 keys only for now). Commands take a single positional
25
+ WAS path -- `SPACE[/COLLECTION[/RESOURCE]]` -- where the space part is a
26
+ local registry handle, a bare space id, or a full space https URL.
27
+ - Add `was space create/list/show/update/delete/forget/add` subcommands
28
+ (`update` aliases `configure`; `delete` aliases `rm`; `show` aliases
29
+ `view`/`cat`). `create --save` and `add` register the space in a local
30
+ space registry (`~/.wallet/was-spaces/`, with the usual `.meta.json`
31
+ handle/description sidecars); `space list` reads the registry (servers do
32
+ not implement List Spaces yet; `--remote` asks the server anyway), and
33
+ `forget` removes only the registry entry while `delete` deletes the space
34
+ on the server.
35
+ - Add `was collection create/list/show/update/delete` subcommands (group
36
+ alias `coll`; `update` aliases `configure`, `delete` aliases `rm`) and
37
+ `was resource add/put/get/list/delete` subcommands (group alias `res`,
38
+ same `delete` alias). Resource payloads come from a file argument or
39
+ stdin: `*.json` files (and content that parses to a JSON object/array)
40
+ are sent as JSON, anything else as binary `application/octet-stream`,
41
+ and an explicit `--content-type` sends the bytes as-is with that type.
42
+ `resource get` pretty-prints JSON to stdout and writes binary raw
43
+ (`--output <file>` to save either to a file).
44
+ - Add top-level shorthand verbs that dispatch on the path depth:
45
+ `was ls <path>` (collections of a space, or resources of a collection),
46
+ `was get` / `was put` (resource shorthands), and `was rm <path>`
47
+ (uniform delete of whatever the path points at).
48
+ - Add `was grant <path> --to <did> --action <verb...>` to delegate access
49
+ to a space, collection, or resource. Actions are HTTP verbs (lowercase
50
+ accepted); expiration via `--ttl` (default `1y`) or an explicit
51
+ `--expires`. Prints `{ delegatedCapability, encoded }` (the same shape
52
+ as `zcap delegate`); `--save` (with `--handle` / `--description`)
53
+ stores the capability in the existing zcap store (`~/.wallet/zcaps/`).
54
+ - Add `--capability <ref>` to `was ls`/`get`/`put`/`rm` and
55
+ `was resource add/get/put` for the receiving side of delegation: the
56
+ ref is a multibase-encoded capability string, a capability JSON file,
57
+ or the id/handle of a stored zcap. The capability's invocation target
58
+ supplies the server URL and the operation depth (no path argument
59
+ needed), and the signing DID falls back from `--did` / `WAS_DID` to the
60
+ capability's controller (the delegatee).
61
+ - Add `was policy show/set/clear` to manage access-control policies at
62
+ space, collection, or resource depth (`set` takes `--type <type>` for a
63
+ simple type-only policy, or a policy JSON file), plus the
64
+ `was publish <path>` / `was unpublish <path>` sugar: `publish` makes
65
+ the path world-readable (`PublicCanRead`) and prints its public URL;
66
+ `unpublish` reverts it to capability-only access.
67
+ - Add `was space export <space> [--output <file.tar>]` (tar to a file or
68
+ raw to stdout) and `was space import <space> [file.tar]` (tar from a
69
+ file or stdin; prints the import stats summary).
70
+ - Add an env-gated end-to-end integration test of the whole `was` flow
71
+ (space/collection/resource round-trip, delegation, capability read,
72
+ publish + unauthenticated fetch); it is skipped unless
73
+ `WAS_TEST_SERVER_URL` points at a running WAS server.
74
+ - Registered spaces supply the server URL and signing controller DID
75
+ defaults; otherwise they resolve from `--server` / `WAS_SERVER_URL` and
76
+ `--did` / `WAS_DID` (or the origin of a full space URL address).
77
+ - Exit codes: `0` success, `1` operation error (typed WAS errors,
78
+ not-found/not-visible reads), `2` input error (bad path syntax, unknown
79
+ handle/DID, missing server URL).
80
+ - Bring `zcap` storage features in line with the `key` and `did` commands:
81
+ - Add metadata support for locally stored zcaps, persisted as `.meta.json`
82
+ sidecar files next to the stored capability
83
+ (`~/.wallet/zcaps/<storageId>.meta.json`). `zcap create --save` and
84
+ `zcap delegate --save` now write a sidecar with the `created` timestamp,
85
+ and accept `--handle` / `--description` (exit `1` without `--save`).
86
+ - Add `zcap show <id>` (aliases: `view`, `cat`) to print a stored capability
87
+ by capability id or metadata handle, with `--meta` to display its metadata
88
+ (plus controller, invocation target, and expiration) as a field/value
89
+ table, or as JSON with `--meta --json`.
90
+ - Add `zcap meta <id>` to show or edit the metadata of a stored zcap (no
91
+ options prints the current metadata; an empty string value clears a field;
92
+ metadata edits never rewrite the stored capability file).
93
+ - Add `zcap remove <id>` (aliases: `delete`, `rm`) to remove a stored zcap
94
+ and its metadata sidecar. Note that removal does not revoke a delegated
95
+ capability that has already been handed out.
96
+ - `zcap show`, `zcap meta`, and `zcap remove` accept a metadata handle in
97
+ place of a capability id (exit `1` when the handle is ambiguous).
98
+ - Add local wallet storage for Verifiable Credentials
99
+ (`~/.wallet/credentials/`, with the usual `.meta.json` handle/description
100
+ sidecars), mirroring the zcap storage features:
101
+ - Add a `vc import` command that stores an existing credential, read from a
102
+ file argument, an http(s) URL, or stdin. The input's `type` must include
103
+ `VerifiableCredential`; it is stored as-is (not verified on import). The
104
+ file is named after the credential's `id`; an id-less credential is
105
+ stored under a digest of its content, so re-importing it overwrites
106
+ rather than duplicates. Exit codes: `0` imported, `1` not a credential,
107
+ `2` fetch/read/parse error.
108
+ - Add `--save` to `vc issue` to store the freshly issued credential;
109
+ `--handle` / `--description` tag it (exit `1` without `--save`).
110
+ - Add `vc list` (`--json` / `--plain`) to render a metadata table of the
111
+ stored credentials (`HANDLE | TYPE | ISSUER | CREATED | ID |
112
+ DESCRIPTION`), `vc show <id>` (aliases: `view`, `cat`; `--meta` for the
113
+ metadata, `--meta --json` for it as JSON), `vc meta <id>` to edit the
114
+ metadata sidecar, and `vc remove <id>` (aliases: `delete`, `rm`). All
115
+ accept a credential id, a storage id (for id-less credentials), or a
116
+ metadata handle.
117
+ - `vc verify` and `vc issue` also accept an http(s) URL as the credential
118
+ source now, in addition to a file argument or stdin.
119
+
120
+ ### Changed
121
+
122
+ - **BREAKING**: Saved DIDs now live under the wallet directory:
123
+ `~/.wallet/dids/<method>/` instead of `~/.dids/<method>/`. Existing data can
124
+ be moved with `mv ~/.dids ~/.wallet/dids`. The `DIDS_DIR` environment
125
+ variable still overrides the DIDs location when set; its default is now
126
+ derived from `WALLET_DIR` (`$WALLET_DIR/dids`).
127
+ - **BREAKING**: `zcap list` now prints a metadata table by default
128
+ (`HANDLE | TYPE | CREATED | ID | DESCRIPTION`, where TYPE is `root` or
129
+ `delegated`), matching `did list`. Pass the new `--plain` flag for the
130
+ previous one-id-per-line output.
131
+ - **BREAKING**: `zcap list --json` now outputs an array of objects with
132
+ metadata (`{id, type, created?, handle?, description?}`) instead of an
133
+ array of plain id strings.
134
+
135
+ ## 0.5.0 - 2026-06-11
136
+
137
+ ### Added
138
+
139
+ - Add `key remove <id>` and `did remove <did>` commands (aliases: `delete`,
140
+ `rm`) to remove a locally stored key or DID from wallet storage, looked up
141
+ by fingerprint/DID or by metadata handle. `key remove` deletes the key file
142
+ and its `.meta.json` metadata sidecar; `did remove` deletes the DID
143
+ document, its `.keys.json` key file, and its `.meta.json` metadata sidecar,
144
+ and also scrubs the removed DID from the cached `dids` associations of any
145
+ matching wallet keys (the inverse of the caching done by
146
+ `did create --save` and `did add-key`).
147
+ - Add metadata support for locally stored keys and DIDs, persisted as
148
+ `.meta.json` sidecar files next to the stored item (`~/.wallet/keys/
149
+ <storageId>.meta.json` and `~/.dids/<method>/<did>.meta.json`, following the
150
+ existing `.keys.json` sidecar pattern). Metadata fields: `created` (ISO 8601
151
+ timestamp written at `--save` time), `handle` (a short user-defined tag),
152
+ `description` (longer free text), and -- for keys -- `dids`, a cache of the
153
+ stored DIDs whose documents reference the key. Stored key files and DID
154
+ documents remain spec-pure Multikey / DID document JSON; a missing sidecar
155
+ means "no metadata" (no migration needed) and orphaned sidecars are ignored.
156
+ - Add `--handle` / `--description` options to `key create --save` and
157
+ `did create --save` (exit `1` without `--save`), and new `key meta <id>` /
158
+ `did meta <did>` commands to show or edit metadata after the fact (no
159
+ options prints the current metadata; an empty string value clears a field;
160
+ metadata edits never rewrite the stored key/DID file). `key meta` backfills
161
+ `created` from the storage file name's date prefix for keys saved before
162
+ metadata support.
163
+ - `key show`, `key meta`, `did show`, and `did meta` now also accept a
164
+ metadata handle in place of a fingerprint/DID (exit `1` when the handle is
165
+ ambiguous -- handles are not required to be unique).
166
+ - Add `--meta` to `key show` and `did show` to display the item's metadata as
167
+ a vertical field/value table (or as JSON with `--meta --json`). The DIDs
168
+ shown for a key are always derived by scanning the locally stored DID
169
+ documents for the key's `publicKeyMultibase`, so they cannot go stale; the
170
+ cached `dids` list is refreshed by `did create --save`, `did add-key`, and
171
+ every `key meta` write.
172
+ - Add `did show <did>` and `key show <id>` commands to display a locally stored
173
+ DID document or key (aliases: `view`, `cat`). `did show` prints the stored DID
174
+ document (which holds no secret material). `key show` looks up a stored key by
175
+ its `publicKeyMultibase` fingerprint and prints the public key object only --
176
+ it re-imports the stored key pair and re-exports the public half, so the secret
177
+ key never appears in the output. These are distinct from a future `get`
178
+ command, which will resolve DIDs/keys rather than read local storage.
179
+
180
+ ### Changed
181
+
182
+ - **BREAKING**: `key list` and `did list` now print a metadata table by
183
+ default (`HANDLE | TYPE | CREATED | FINGERPRINT | DIDS | DESCRIPTION` for
184
+ keys; `HANDLE | METHOD | CREATED | DID | DESCRIPTION` for DIDs), ordered by
185
+ storage file name (chronological for keys) instead of by fingerprint. Pass
186
+ the new `--plain` flag for the previous one-item-per-line output.
187
+ - **BREAKING**: `key list --json` and `did list --json` now output an array of
188
+ objects with metadata (`{fingerprint, storageId, type, curve?, created?,
189
+ handle?, description?, dids}` for keys; `{did, method, created?, handle?,
190
+ description?}` for DIDs) instead of an array of plain strings.
191
+
192
+ ## 0.4.0 - 2026-06-09
193
+
194
+ ### Added
195
+
196
+ - Add ECDSA key support via `@interop/ecdsa-multikey`, selected with
197
+ `--type ecdsa`, to `key create`, `did create key`, `did create web`, and
198
+ `did add-key`. The curve is chosen with `--curve` (defaults to `p256`;
199
+ supported: `p256`, `p384`, `p521`, each also accepted in hyphenated `p-256`
200
+ and SECG `secp256r1` spellings, case-insensitively). Keys are serialized as
201
+ Multikey, the same as Ed25519. ECDSA key generation is non-deterministic, so
202
+ `--with-seed` / `SECRET_KEY_SEED` are rejected (exit `1`) with `--type ecdsa`.
203
+ ECDSA `did:key`s are minted via the driver's `fromKeyPair()` (no suite
204
+ registration required).
205
+ - Support issuing Verifiable Credentials with ECDSA keys in `vc issue`. The
206
+ signing key's type is detected from its `publicKeyMultibase` header, and ECDSA
207
+ keys sign with the `ecdsa-rdfc-2019` cryptosuite (via `@interop/ecdsa-signature`).
208
+ `--suite` now defaults per key type (`eddsa-rdfc-2022` for ed25519,
209
+ `ecdsa-rdfc-2019` for ecdsa) instead of always defaulting to `eddsa-rdfc-2022`.
210
+ - Warn at key creation time (`key create`, `did create key`, `did create web`,
211
+ `did add-key`) when a `p521` ECDSA key is generated: P-521 keys can be created
212
+ but cannot issue Verifiable Credentials, because the `ecdsa-rdfc-2019`
213
+ cryptosuite supports P-256 and P-384 only.
214
+ - `vc verify` now verifies ECDSA (`ecdsa-rdfc-2019`) credentials, completing the
215
+ ECDSA issue/verify round trip. This required upstream support in
216
+ `@interop/verifier-core` `^3.2.0` (ECDSA `did:key` resolution and the
217
+ `ecdsa-rdfc-2019` suite in its defaults), so the previous CLI-side crypto-suite
218
+ injection was removed in favor of verifier-core's defaults.
219
+
220
+ ### Changed
221
+
222
+ - Update to the `@interop/data-integrity-core` `^7.0.0` chain, in which
223
+ `AbstractKeyPair.export()` is now `async`: `@interop/data-integrity-core`
224
+ `^7.0.0`, `@interop/data-integrity-proof` `^3.3.0`, `@interop/did-method-key`
225
+ `^7.3.1`, `@interop/did-web-resolver` `^6.2.1`, `@interop/ecdsa-multikey`
226
+ `^2.3.0`, and `@interop/ed25519-verification-key` `^8.0.0`. All
227
+ `keyPair.export(...)` call sites now `await` the result.
228
+
229
+ ## 0.3.0 - 2026-06-09
230
+
231
+ ### Added
232
+
233
+ - Add `did:web` support to `did create` (`./di did create web --url <url>`):
234
+ generates a `did:web` DID with a single Ed25519 verification key (wired into
235
+ `authentication`, `assertionMethod`, `capabilityDelegation`, and
236
+ `capabilityInvocation`) via `@interop/did-web-resolver`'s `driver().generate()`.
237
+ `--url` is required (a `did:web` DID is tied to a domain). The key is derived
238
+ from a seed exactly as `did:key` is (`SECRET_KEY_SEED` env var or `--with-seed`).
239
+ `--save` writes the DID document and key material to `~/.dids/web/`, with the
240
+ key file stored as an object keyed by verification method id so additional keys
241
+ can be appended later.
242
+ - Add `did add-key <did>` command: adds a new verification key to an existing,
243
+ locally stored `did:web` DID via `@interop/did-web-resolver`'s
244
+ `addVerificationMethod()`, updating both the stored DID document and its
245
+ key file (keyed by verification method id) in place. The key is derived from a
246
+ seed (`SECRET_KEY_SEED` env var or `--with-seed`). `--purpose <purpose...>`
247
+ selects the verification relationships to wire the key into (defaults to
248
+ `authentication`, `assertionMethod`, `capabilityDelegation`, and
249
+ `capabilityInvocation`). Only `did:web` DIDs are supported; exits `1`
250
+ on an unknown DID, a non-`did:web` DID, or an unsupported purpose.
251
+
252
+ ### Fixed
253
+
254
+ - `vc issue --did <did:web:...>` now works. Issuance read the `<did>.keys.json`
255
+ file as a single exported key pair (the `did:key` shape), but `did:web` stores
256
+ keys as a map keyed by verification method id, so the secret-key lookup always
257
+ failed with "No stored secret key found". The issuer now resolves the signing
258
+ key from either storage shape.
259
+
260
+ ## 0.2.0 - 2026-06-08
261
+
262
+ ### Changed
263
+
264
+ - **BREAKING**: Rename the CLI binary from `did` to `di` (bin script and `package.json`
265
+ `bin` entry), so commands now read `./di key create`, `./di vc verify`, etc.
266
+ - **BREAKING**: Rename the `id` command group to `did`, so DID commands now read
267
+ `./di did create` and `./di did list`.
268
+ - Bump `@interop/verifier-core` to `^3.1.0`, which reports an explicit
269
+ `ISSUER_PROOF_MISMATCH` problem (title `Issuer / Proof Mismatch`) when a
270
+ credential's `issuer` does not match the controller of its proof's
271
+ verification method, instead of a generic `INVALID_SIGNATURE`.
272
+
273
+ ### Added
274
+
275
+ - Implement `zcap create` command: builds an unsigned root Authorization
276
+ Capability (zcap) for an invocation target via `@interop/zcap`'s
277
+ `createRootCapability`, printing `{ rootCapability, encoded }` to stdout (the
278
+ `encoded` field is the capability JSON as a multibase base58btc string). Takes
279
+ a required `--controller` (the controller DID) and `--url` (the
280
+ `invocationTarget`); `--save` writes the capability to local wallet storage
281
+ (`~/.wallet/zcaps/`). Exits `0` / `1` for success / error.
282
+ - Implement `zcap delegate` command: signs a delegated capability via
283
+ `@interop/ezcap`'s `ZcapClient`, printing `{ delegatedCapability, encoded }`
284
+ to stdout. Supports a first-level delegation from the root capability for a
285
+ `--url`, or a further (attenuated) delegation of an existing `--capability`
286
+ (a multibase string or a JSON file path), narrowed with `--invocation-target`.
287
+ Takes a required `--delegatee` (the delegated capability's controller),
288
+ optional `--allow <action...>` (defaults to inheriting the parent's actions),
289
+ and either `--ttl` (duration, default `1y`) or an `--expires` ISO 8601
290
+ override. The signing key is sourced from a stored DID (`--did`) or, as a
291
+ fallback, the `ZCAP_CONTROLLER_KEY_SEED` env var together with `--controller`
292
+ (the seed-derived `did:key` is verified against `--controller`). `--save`
293
+ writes the capability to `~/.wallet/zcaps/`. Exits `0` / `1` for success /
294
+ error.
295
+ - Implement `vc issue` command: reads an unsigned Verifiable Credential as JSON
296
+ from a file or stdin and issues (signs) it with a locally-stored DID via
297
+ `@interop/vc`, printing the issued credential to stdout (appending a proof if
298
+ one already exists). The credential's `issuer` is set to the signing DID when
299
+ absent, and must match the signing DID when present (otherwise issuance is
300
+ aborted). Takes a required `--did`, an optional `--key` (a verification method
301
+ id, validated against the DID's `assertionMethod` array; defaults to the first
302
+ `assertionMethod` key), and an optional `--suite` (`eddsa-rdfc-2022` by
303
+ default, or `Ed25519Signature2020`). Exits `0` / `1` / `2` for issued /
304
+ issuance error / read error. Adds `loadDidDocument()` and `loadDidKeys()`
305
+ storage helpers.
306
+ - Implement `key list` command: prints the fingerprints (multibase-encoded
307
+ public keys) of key pairs saved in local wallet storage (one per line to
308
+ stdout, nothing if empty), or as a JSON array with `--json`. Adds
309
+ `listCollection()` and `loadFromCollection()` storage helpers.
310
+ - Implement `id list` command: prints the DIDs saved in local storage across all
311
+ method subdirectories (one per line to stdout, nothing if empty), or as a JSON
312
+ array with `--json`. Adds a `listDids()` storage helper.
313
+ - Implement `zcap list` command: prints the ids (the `urn:zcap:...` values) of
314
+ capabilities saved in local wallet storage (`~/.wallet/zcaps/`), one per line
315
+ to stdout (nothing if empty), or as a JSON array with `--json`. Reuses the
316
+ `listCollection()` and `loadFromCollection()` storage helpers.
317
+ - Add `vc verify` command: reads a Verifiable Credential as JSON from a file or
318
+ stdin and runs full verification via `@interop/verifier-core` plus
319
+ `@digitalcredentials/issuer-registry-client` (cryptographic signature,
320
+ expiration, revocation / status, and issuer registry recognition). Prints the
321
+ full verifier-core result by default, or a compact object with `--summary`,
322
+ and exits `0` / `1` / `2` for verified / not-verified / read error.
323
+
324
+ ## 0.1.0 - 2026-06-01
325
+
326
+ ### Changed
327
+
328
+ - Update to latest refactored `@interop/*` deps (`did-method-key@7.1.0`,
329
+ `ed25519-verification-key@7.0.1`, which pull in `did-io@4.0.1` and
330
+ `data-integrity-core@6.1.0`).
331
+
332
+ ### Removed
333
+
334
+ - Remove unused `@digitalcredentials/ssi` dependency (no longer imported; the
335
+ `@interop/*` forks now use `@interop/data-integrity-core` instead).
336
+
337
+ ## 0.0.1 -
338
+
339
+ ### Added
340
+
341
+ - Initial commits
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ # MIT License
2
+
3
+ Copyright (c) 2026 Interop Alliance
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.