@did-btcr2/cli 0.10.3 → 0.12.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 (94) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/cjs/index.js +1028 -114
  3. package/dist/esm/src/cli.js +31 -13
  4. package/dist/esm/src/cli.js.map +1 -1
  5. package/dist/esm/src/commands/completion.js +36 -0
  6. package/dist/esm/src/commands/completion.js.map +1 -0
  7. package/dist/esm/src/commands/config.js +69 -0
  8. package/dist/esm/src/commands/config.js.map +1 -0
  9. package/dist/esm/src/commands/create.js +109 -30
  10. package/dist/esm/src/commands/create.js.map +1 -1
  11. package/dist/esm/src/commands/deactivate.js +21 -8
  12. package/dist/esm/src/commands/deactivate.js.map +1 -1
  13. package/dist/esm/src/commands/index.js +4 -0
  14. package/dist/esm/src/commands/index.js.map +1 -1
  15. package/dist/esm/src/commands/key.js +175 -0
  16. package/dist/esm/src/commands/key.js.map +1 -0
  17. package/dist/esm/src/commands/profile.js +63 -0
  18. package/dist/esm/src/commands/profile.js.map +1 -0
  19. package/dist/esm/src/commands/update.js +19 -9
  20. package/dist/esm/src/commands/update.js.map +1 -1
  21. package/dist/esm/src/config.js +119 -12
  22. package/dist/esm/src/config.js.map +1 -1
  23. package/dist/esm/src/keystore/atomic.js +64 -0
  24. package/dist/esm/src/keystore/atomic.js.map +1 -0
  25. package/dist/esm/src/keystore/envelope.js +123 -0
  26. package/dist/esm/src/keystore/envelope.js.map +1 -0
  27. package/dist/esm/src/keystore/error.js +16 -0
  28. package/dist/esm/src/keystore/error.js.map +1 -0
  29. package/dist/esm/src/keystore/file-backed-key-manager.js +78 -0
  30. package/dist/esm/src/keystore/file-backed-key-manager.js.map +1 -0
  31. package/dist/esm/src/keystore/file-key-store.js +184 -0
  32. package/dist/esm/src/keystore/file-key-store.js.map +1 -0
  33. package/dist/esm/src/keystore/passphrase.js +87 -0
  34. package/dist/esm/src/keystore/passphrase.js.map +1 -0
  35. package/dist/esm/src/keystore/paths.js +20 -0
  36. package/dist/esm/src/keystore/paths.js.map +1 -0
  37. package/dist/esm/src/keystore/resolve-key-ref.js +47 -0
  38. package/dist/esm/src/keystore/resolve-key-ref.js.map +1 -0
  39. package/dist/types/src/cli.d.ts +6 -2
  40. package/dist/types/src/cli.d.ts.map +1 -1
  41. package/dist/types/src/commands/completion.d.ts +5 -0
  42. package/dist/types/src/commands/completion.d.ts.map +1 -0
  43. package/dist/types/src/commands/config.d.ts +5 -0
  44. package/dist/types/src/commands/config.d.ts.map +1 -0
  45. package/dist/types/src/commands/create.d.ts +19 -1
  46. package/dist/types/src/commands/create.d.ts.map +1 -1
  47. package/dist/types/src/commands/deactivate.d.ts.map +1 -1
  48. package/dist/types/src/commands/index.d.ts +4 -0
  49. package/dist/types/src/commands/index.d.ts.map +1 -1
  50. package/dist/types/src/commands/key.d.ts +10 -0
  51. package/dist/types/src/commands/key.d.ts.map +1 -0
  52. package/dist/types/src/commands/profile.d.ts +5 -0
  53. package/dist/types/src/commands/profile.d.ts.map +1 -0
  54. package/dist/types/src/commands/update.d.ts.map +1 -1
  55. package/dist/types/src/config.d.ts +57 -5
  56. package/dist/types/src/config.d.ts.map +1 -1
  57. package/dist/types/src/keystore/atomic.d.ts +19 -0
  58. package/dist/types/src/keystore/atomic.d.ts.map +1 -0
  59. package/dist/types/src/keystore/envelope.d.ts +64 -0
  60. package/dist/types/src/keystore/envelope.d.ts.map +1 -0
  61. package/dist/types/src/keystore/error.d.ts +14 -0
  62. package/dist/types/src/keystore/error.d.ts.map +1 -0
  63. package/dist/types/src/keystore/file-backed-key-manager.d.ts +41 -0
  64. package/dist/types/src/keystore/file-backed-key-manager.d.ts.map +1 -0
  65. package/dist/types/src/keystore/file-key-store.d.ts +52 -0
  66. package/dist/types/src/keystore/file-key-store.d.ts.map +1 -0
  67. package/dist/types/src/keystore/passphrase.d.ts +20 -0
  68. package/dist/types/src/keystore/passphrase.d.ts.map +1 -0
  69. package/dist/types/src/keystore/paths.d.ts +13 -0
  70. package/dist/types/src/keystore/paths.d.ts.map +1 -0
  71. package/dist/types/src/keystore/resolve-key-ref.d.ts +19 -0
  72. package/dist/types/src/keystore/resolve-key-ref.d.ts.map +1 -0
  73. package/dist/types/src/types.d.ts +93 -5
  74. package/dist/types/src/types.d.ts.map +1 -1
  75. package/package.json +9 -4
  76. package/src/cli.ts +37 -12
  77. package/src/commands/completion.ts +40 -0
  78. package/src/commands/config.ts +84 -0
  79. package/src/commands/create.ts +140 -52
  80. package/src/commands/deactivate.ts +25 -12
  81. package/src/commands/index.ts +4 -0
  82. package/src/commands/key.ts +193 -0
  83. package/src/commands/profile.ts +65 -0
  84. package/src/commands/update.ts +23 -13
  85. package/src/config.ts +165 -20
  86. package/src/keystore/atomic.ts +73 -0
  87. package/src/keystore/envelope.ts +172 -0
  88. package/src/keystore/error.ts +16 -0
  89. package/src/keystore/file-backed-key-manager.ts +99 -0
  90. package/src/keystore/file-key-store.ts +242 -0
  91. package/src/keystore/passphrase.ts +99 -0
  92. package/src/keystore/paths.ts +20 -0
  93. package/src/keystore/resolve-key-ref.ts +62 -0
  94. package/src/types.ts +31 -18
@@ -1,7 +1,7 @@
1
+ import { DidMethodError } from '@did-btcr2/common';
1
2
  import { Command, CommanderError } from 'commander';
2
- import { registerCreateCommand, registerDeactivateCommand, registerResolveCommand, registerUpdateCommand, } from './commands/index.js';
3
- import { defaultApiFactory } from './config.js';
4
- import { CLIError } from './error.js';
3
+ import { registerCompletionCommand, registerConfigCommand, registerCreateCommand, registerDeactivateCommand, registerKeyCommand, registerProfileCommand, registerResolveCommand, registerUpdateCommand, } from './commands/index.js';
4
+ import { defaultApiFactory, keystoreApiFactory } from './config.js';
5
5
  import { VERSION } from './version.js';
6
6
  /**
7
7
  * CLI tool for the did:btcr2 method.
@@ -16,9 +16,13 @@ export class DidBtcr2Cli {
16
16
  * {@link defaultApiFactory} which uses public endpoints (mempool.space)
17
17
  * for known networks and localhost Polar for regtest.
18
18
  *
19
- * @param factory - Optional API factory. Defaults to {@link defaultApiFactory}.
19
+ * @param factory - Optional API factory for keystore-free commands (create,
20
+ * resolve). Defaults to {@link defaultApiFactory}.
21
+ * @param keystoreFactory - Optional keystore-aware API factory for commands
22
+ * that need a signing identity (key, update, deactivate). Defaults to
23
+ * {@link keystoreApiFactory}.
20
24
  */
21
- constructor(factory = defaultApiFactory) {
25
+ constructor(factory = defaultApiFactory, keystoreFactory = keystoreApiFactory) {
22
26
  this.program = new Command('btcr2')
23
27
  .version(`btcr2 ${VERSION}`, '-v, --version', 'Output the current version')
24
28
  .description('CLI tool for the did:btcr2 method')
@@ -31,12 +35,19 @@ export class DidBtcr2Cli {
31
35
  .option('--btc-rpc-url <url>', 'Override Bitcoin Core RPC endpoint')
32
36
  .option('--btc-rpc-user <user>', 'Bitcoin Core RPC username')
33
37
  .option('--btc-rpc-pass <pass>', 'Bitcoin Core RPC password')
34
- .option('--cas-gateway <url>', 'IPFS HTTP gateway for CAS reads');
38
+ .option('--cas-gateway <url>', 'IPFS HTTP gateway for CAS reads')
39
+ .option('--keystore <path>', 'Path to the keystore file (default: $XDG_DATA_HOME/btcr2/keystore.json)')
40
+ .option('--passphrase-file <path>', 'Read the keystore passphrase from a file (unattended use)')
41
+ .option('--signing-key <ref>', 'Key for update/deactivate signing: a URN, fingerprint prefix, or name');
35
42
  const globals = () => this.program.opts();
36
- registerCreateCommand(this.program, factory, globals);
43
+ registerCreateCommand(this.program, factory, keystoreFactory, globals);
37
44
  registerResolveCommand(this.program, factory, globals);
38
- registerUpdateCommand(this.program, factory, globals);
39
- registerDeactivateCommand(this.program, factory, globals);
45
+ registerUpdateCommand(this.program, keystoreFactory, globals);
46
+ registerDeactivateCommand(this.program, keystoreFactory, globals);
47
+ registerKeyCommand(this.program, keystoreFactory, globals);
48
+ registerConfigCommand(this.program, globals);
49
+ registerProfileCommand(this.program, globals);
50
+ registerCompletionCommand(this.program, globals);
40
51
  }
41
52
  /**
42
53
  * Runs the CLI with the provided argv or process.argv.
@@ -51,7 +62,7 @@ export class DidBtcr2Cli {
51
62
  this.program.outputHelp();
52
63
  }
53
64
  catch (error) {
54
- handleError(error);
65
+ handleError(error, Boolean(this.program.opts().verbose));
55
66
  }
56
67
  }
57
68
  }
@@ -69,16 +80,23 @@ function normalizeArgv(argv) {
69
80
  }
70
81
  /**
71
82
  * Handles errors thrown during CLI execution.
83
+ *
84
+ * Known method errors ({@link DidMethodError} and its subclasses, including
85
+ * {@link CLIError} and the keystore errors) print only their message, never the
86
+ * stack or the structured `data` payload, so internal shapes are not leaked.
87
+ * The full error object and stack are shown only under `--verbose`.
88
+ *
72
89
  * @param {unknown} error - The error to handle.
90
+ * @param {boolean} verbose - Whether to print the full error object and stack.
73
91
  * @returns {void}
74
92
  */
75
- function handleError(error) {
93
+ function handleError(error, verbose) {
76
94
  if (error instanceof CommanderError &&
77
95
  (error.code === 'commander.helpDisplayed' || error.code === 'commander.help')) {
78
96
  return;
79
97
  }
80
- if (error instanceof CLIError) {
81
- console.error(error.message);
98
+ if (error instanceof DidMethodError) {
99
+ console.error(verbose ? error : error.message);
82
100
  process.exitCode ??= 1;
83
101
  return;
84
102
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { CLIError } from '../error.js';
2
+ const COMMANDS = 'create resolve read update deactivate delete key config profile completion';
3
+ /** Registers the `completion` command, which prints a shell completion script to stdout. */
4
+ export function registerCompletionCommand(program, _globals) {
5
+ program
6
+ .command('completion [shell]')
7
+ .description('Print a shell completion script (bash, zsh, or fish) to stdout.')
8
+ .action((shell = 'bash') => {
9
+ console.log(completionScript(shell));
10
+ });
11
+ }
12
+ /** Returns a completion script for the given shell. */
13
+ function completionScript(shell) {
14
+ switch (shell) {
15
+ case 'bash':
16
+ return [
17
+ '# btcr2 bash completion. Install with: eval "$(btcr2 completion bash)"',
18
+ '_btcr2() { COMPREPLY=( $(compgen -W "' + COMMANDS + '" -- "${COMP_WORDS[COMP_CWORD]}") ); }',
19
+ 'complete -F _btcr2 btcr2',
20
+ ].join('\n');
21
+ case 'zsh':
22
+ return [
23
+ '# btcr2 zsh completion. Install with: eval "$(btcr2 completion zsh)"',
24
+ '_btcr2() { compadd ' + COMMANDS + ' }',
25
+ 'compdef _btcr2 btcr2',
26
+ ].join('\n');
27
+ case 'fish':
28
+ return [
29
+ '# btcr2 fish completion. Save to ~/.config/fish/completions/btcr2.fish',
30
+ 'complete -c btcr2 -f -a "' + COMMANDS + '"',
31
+ ].join('\n');
32
+ default:
33
+ throw new CLIError(`Unsupported shell "${shell}". Use bash, zsh, or fish.`, 'INVALID_ARGUMENT_ERROR', { shell });
34
+ }
35
+ }
36
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../../src/commands/completion.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,QAAQ,GAAG,4EAA4E,CAAC;AAE9F,4FAA4F;AAC5F,MAAM,UAAU,yBAAyB,CAAC,OAAgB,EAAE,QAA6B;IACvF,OAAO;SACJ,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,CAAC,KAAK,GAAG,MAAM,EAAE,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC;AAED,uDAAuD;AACvD,SAAS,gBAAgB,CAAC,KAAa;IACrC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO;gBACL,wEAAwE;gBACxE,uCAAuC,GAAG,QAAQ,GAAG,wCAAwC;gBAC7F,0BAA0B;aAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,KAAK;YACR,OAAO;gBACL,sEAAsE;gBACtE,qBAAqB,GAAG,QAAQ,GAAG,IAAI;gBACvC,sBAAsB;aACvB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,KAAK,MAAM;YACT,OAAO;gBACL,wEAAwE;gBACxE,2BAA2B,GAAG,QAAQ,GAAG,GAAG;aAC7C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf;YACE,MAAM,IAAI,QAAQ,CAAC,sBAAsB,KAAK,4BAA4B,EAAE,wBAAwB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACrH,CAAC;AACH,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ import { CONFIG_SCHEMA_VERSION, defaultConfigPath, getConfigPath, readConfigFile, setConfigPath, unsetConfigPath, writeConfigFile, } from '../config.js';
4
+ import { CLIError } from '../error.js';
5
+ import { ensureDir, writeFileAtomic } from '../keystore/atomic.js';
6
+ import { formatResult } from '../output.js';
7
+ import { SUPPORTED_NETWORKS } from '../types.js';
8
+ /** Registers the `config` command group for reading and writing CLI configuration. */
9
+ export function registerConfigCommand(program, globals) {
10
+ const config = program.command('config').description('Read and write CLI configuration.');
11
+ const path = () => globals().config ?? defaultConfigPath();
12
+ const print = (result) => console.log(formatResult(result, globals()));
13
+ config
14
+ .command('init')
15
+ .description('Create a default config file with one profile per network.')
16
+ .option('--force', 'Overwrite an existing config file.', false)
17
+ .action((options) => {
18
+ const p = path();
19
+ if (existsSync(p) && !options.force) {
20
+ throw new CLIError(`Config already exists at ${p}. Use --force to overwrite.`, 'INVALID_ARGUMENT_ERROR', { path: p });
21
+ }
22
+ const scaffold = {
23
+ schemaVersion: CONFIG_SCHEMA_VERSION,
24
+ defaults: { output: 'text' },
25
+ profiles: Object.fromEntries(SUPPORTED_NETWORKS.map(n => [n, {}])),
26
+ };
27
+ ensureDir(dirname(p), 0o700);
28
+ writeFileAtomic(p, `${JSON.stringify(scaffold, null, 2)}\n`, 0o600);
29
+ print({ action: 'config-init', data: { path: p } });
30
+ });
31
+ config
32
+ .command('get [path]')
33
+ .description('Print a value at a dotted path, or the whole config.')
34
+ .action((dotted) => {
35
+ const file = (readConfigFile(path()) ?? {});
36
+ print({ action: 'config-get', data: (dotted ? getConfigPath(file, dotted) : file) ?? null });
37
+ });
38
+ config
39
+ .command('set <path> <value>')
40
+ .description('Set a value at a dotted path. The value is parsed as JSON when valid, else stored as a string.')
41
+ .action((dotted, value) => {
42
+ writeConfigFile(path(), raw => setConfigPath(raw, dotted, parseValue(value)));
43
+ print({ action: 'config-set', data: { path: dotted } });
44
+ });
45
+ config
46
+ .command('unset <path>')
47
+ .description('Delete a value at a dotted path.')
48
+ .action((dotted) => {
49
+ writeConfigFile(path(), raw => unsetConfigPath(raw, dotted));
50
+ print({ action: 'config-unset', data: { path: dotted } });
51
+ });
52
+ config
53
+ .command('list')
54
+ .alias('ls')
55
+ .description('Print the entire config file.')
56
+ .action(() => {
57
+ print({ action: 'config-list', data: readConfigFile(path()) ?? {} });
58
+ });
59
+ }
60
+ /** Parses a value as JSON when valid, otherwise treats it as a plain string. */
61
+ function parseValue(value) {
62
+ try {
63
+ return JSON.parse(value);
64
+ }
65
+ catch {
66
+ return value;
67
+ }
68
+ }
69
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -1,49 +1,128 @@
1
+ import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js';
2
+ import { resolveDefaultNetwork } from '../config.js';
1
3
  import { CLIError } from '../error.js';
4
+ import { resolveKeyRef } from '../keystore/resolve-key-ref.js';
2
5
  import { formatResult } from '../output.js';
3
- import { SUPPORTED_NETWORKS, } from '../types.js';
6
+ import { SUPPORTED_NETWORKS } from '../types.js';
4
7
  /** Expected byte length per identifier type: compressed secp256k1 = 33, SHA-256 hash = 32. */
5
8
  const EXPECTED_BYTES = {
6
9
  k: { length: 33, label: 'secp256k1 compressed public key (33 bytes)' },
7
10
  x: { length: 32, label: 'SHA-256 hash (32 bytes)' },
8
11
  };
9
- export function registerCreateCommand(program, factory, globals) {
12
+ /**
13
+ * Registers the `create` command.
14
+ *
15
+ * A deterministic (`-t k`) identifier has three mutually-exclusive input modes,
16
+ * selected by which is present:
17
+ * - generate (neither `--bytes` nor `--signing-key`): mint a fresh key, persist
18
+ * it to the keystore, set it active, and print the identifier. Sealing the
19
+ * secret prompts for the keystore passphrase.
20
+ * - existing (`--signing-key <ref>`): use a stored key's public key as the
21
+ * genesis bytes. Reading a public key never decrypts, so this never prompts.
22
+ * - raw (`--bytes <hex>`): a 33-byte public key as hex. Offline, keystore-free.
23
+ *
24
+ * An external (`-t x`) identifier is raw-bytes-only: a 32-byte genesis-document
25
+ * hash via `--bytes`. Generation and `--signing-key` apply only to `-t k`.
26
+ *
27
+ * The keystore-free `factory` serves the raw-bytes path; the keystore-aware
28
+ * `keystoreFactory` serves the generate and existing-key paths.
29
+ */
30
+ export function registerCreateCommand(program, factory, keystoreFactory, globals) {
10
31
  program
11
32
  .command('create')
12
33
  .description('Create an identifier and initial DID document')
13
- .requiredOption('-t, --type <type>', 'Identifier type <k|x>', 'k')
14
- .requiredOption('-n, --network <network>', 'Identifier bitcoin network <bitcoin|testnet3|testnet4|signet|mutinynet|regtest>')
15
- .requiredOption('-b, --bytes <bytes>', 'Genesis bytes as a hex string. ' +
16
- 'If type=k, MUST be secp256k1 public key. ' +
17
- 'If type=x, MUST be SHA-256 hash of a genesis document')
34
+ .option('-t, --type <type>', 'Identifier type <k|x>', 'k')
35
+ .option('-n, --network <network>', 'Identifier bitcoin network <bitcoin|testnet3|testnet4|signet|mutinynet|regtest> '
36
+ + '(default: config defaults.network, else regtest)')
37
+ .option('-b, --bytes <bytes>', 'Genesis bytes as a hex string. '
38
+ + 'For type=k, a 33-byte secp256k1 public key (omit to generate a key). '
39
+ + 'For type=x, the 32-byte SHA-256 hash of a genesis document.')
18
40
  .action(async (options) => {
19
- const parsed = validateCreateOptions(options);
20
- const api = factory();
21
- const type = parsed.type === 'k' ? 'deterministic' : 'external';
22
- const genesisBytes = Buffer.from(parsed.bytes, 'hex');
23
- const data = api.createDid(type, genesisBytes, { network: parsed.network });
24
- const result = { action: 'create', data };
25
- console.log(formatResult(result, globals()));
41
+ const g = globals();
42
+ if (options.type !== 'k' && options.type !== 'x') {
43
+ throw new CLIError('Invalid type. Must be "k" or "x".', 'INVALID_ARGUMENT_ERROR', options);
44
+ }
45
+ const overrides = overridesFromGlobals(g);
46
+ const network = resolveNetwork(options.network, overrides);
47
+ const signingKey = g.signingKey;
48
+ /** Prints the result, plus a stderr provenance line in text mode. */
49
+ const print = (result, note) => {
50
+ console.log(formatResult(result, g));
51
+ if (note && g.output !== 'json')
52
+ process.stderr.write(`${note}\n`);
53
+ };
54
+ // External: raw-bytes only.
55
+ if (options.type === 'x') {
56
+ if (signingKey) {
57
+ throw new CLIError('--signing-key applies only to deterministic identifiers (-t k).', 'INVALID_ARGUMENT_ERROR');
58
+ }
59
+ if (options.bytes === undefined) {
60
+ throw new CLIError('External identifiers (-t x) require --bytes <hex>, the 32-byte genesis document hash. '
61
+ + 'Key generation is only available for -t k.', 'INVALID_ARGUMENT_ERROR');
62
+ }
63
+ const genesisBytes = parseGenesisBytes(options.bytes, 'x');
64
+ const did = factory().createDid('external', genesisBytes, { network });
65
+ print({ action: 'create', data: did });
66
+ return;
67
+ }
68
+ // Deterministic (KEY): three mutually-exclusive modes.
69
+ if (options.bytes !== undefined && signingKey) {
70
+ throw new CLIError('Provide at most one of --bytes or --signing-key.', 'INVALID_ARGUMENT_ERROR');
71
+ }
72
+ // Raw bytes: keystore-free, offline.
73
+ if (options.bytes !== undefined) {
74
+ const genesisBytes = parseGenesisBytes(options.bytes, 'k');
75
+ const did = factory().createDid('deterministic', genesisBytes, { network });
76
+ print({ action: 'create', data: did });
77
+ return;
78
+ }
79
+ // Existing key: read its public key from the keystore (no passphrase prompt).
80
+ if (signingKey) {
81
+ const api = keystoreFactory(undefined, overrides);
82
+ const keyId = resolveKeyRef(api.kms.kms, signingKey);
83
+ const publicKey = api.kms.getPublicKey(keyId);
84
+ const did = api.createDid('deterministic', publicKey, { network });
85
+ print({ action: 'create', data: did, keyId, publicKey: bytesToHex(publicKey) }, `Using stored key ${keyId}.`);
86
+ return;
87
+ }
88
+ // Generate: mint a fresh key, persist it, and set it active (passphrase prompt).
89
+ const api = keystoreFactory(undefined, overrides);
90
+ const { did, keyId } = api.generateDid({ network, setActive: true });
91
+ const publicKey = bytesToHex(api.kms.getPublicKey(keyId));
92
+ print({ action: 'create', data: did, keyId, publicKey }, `Generated and stored key ${keyId} (now the active key).`);
26
93
  });
27
94
  }
28
- function validateCreateOptions(options) {
29
- if (!['k', 'x'].includes(options.type)) {
30
- throw new CLIError('Invalid type. Must be "k" or "x".', 'INVALID_ARGUMENT_ERROR', options);
95
+ /** Builds the keystore- and config-resolution overrides from the global flags. */
96
+ function overridesFromGlobals(g) {
97
+ return {
98
+ config: g.config,
99
+ profile: g.profile,
100
+ keystore: g.keystore,
101
+ passphraseFile: g.passphraseFile,
102
+ };
103
+ }
104
+ /** Validates an explicit `--network`, or resolves the default from configuration. */
105
+ function resolveNetwork(explicit, overrides) {
106
+ if (!explicit)
107
+ return resolveDefaultNetwork(overrides);
108
+ if (!SUPPORTED_NETWORKS.includes(explicit)) {
109
+ throw new CLIError('Invalid network. Must be one of "bitcoin", "testnet3", "testnet4", "signet", "mutinynet", or "regtest".', 'INVALID_ARGUMENT_ERROR', { network: explicit });
31
110
  }
32
- if (!SUPPORTED_NETWORKS.includes(options.network)) {
33
- throw new CLIError('Invalid network. Must be one of "bitcoin", "testnet3", "testnet4", "signet", "mutinynet", or "regtest".', 'INVALID_ARGUMENT_ERROR', options);
111
+ return explicit;
112
+ }
113
+ /** Parses and length-checks hex genesis bytes for the given identifier type. */
114
+ function parseGenesisBytes(hex, type) {
115
+ const expected = EXPECTED_BYTES[type];
116
+ let bytes;
117
+ try {
118
+ bytes = hexToBytes(hex.trim());
34
119
  }
35
- const buf = Buffer.from(options.bytes, 'hex');
36
- if (buf.length === 0) {
37
- throw new CLIError('Invalid bytes. Must be a non-empty hex string.', 'INVALID_ARGUMENT_ERROR', options);
120
+ catch {
121
+ throw new CLIError(`Invalid bytes: not valid hex. Expected ${expected.label}.`, 'INVALID_ARGUMENT_ERROR', { bytes: hex });
38
122
  }
39
- const expected = EXPECTED_BYTES[options.type];
40
- if (buf.length !== expected.length) {
41
- throw new CLIError(`Invalid bytes length for type="${options.type}": expected ${expected.label}, got ${buf.length} bytes.`, 'INVALID_ARGUMENT_ERROR', options);
123
+ if (bytes.length !== expected.length) {
124
+ throw new CLIError(`Invalid bytes length for type="${type}": expected ${expected.label}, got ${bytes.length} bytes.`, 'INVALID_ARGUMENT_ERROR', { bytes: hex });
42
125
  }
43
- return {
44
- type: options.type,
45
- network: options.network,
46
- bytes: options.bytes,
47
- };
126
+ return bytes;
48
127
  }
49
128
  //# sourceMappingURL=create.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/commands/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,8 @@
1
+ import { KeyManagerSigner } from '@did-btcr2/key-manager';
1
2
  import { deriveNetwork } from '../config.js';
2
3
  import { CLIError } from '../error.js';
4
+ import { resolveKeyRef } from '../keystore/resolve-key-ref.js';
5
+ import { formatResult } from '../output.js';
3
6
  /** The JSON Patch that marks a DID document as permanently deactivated. */
4
7
  const DEACTIVATION_PATCH = [{ op: 'add', path: '/deactivated', value: true }];
5
8
  export function registerDeactivateCommand(program, factory, globals) {
@@ -12,6 +15,9 @@ export function registerDeactivateCommand(program, factory, globals) {
12
15
  .requiredOption('-m, --verification-method-id <id>', 'DID document verification method ID used to sign the deactivation')
13
16
  .requiredOption('-b, --beacon-id <json>', 'Beacon ID as a JSON string', parseJsonArg('--beacon-id'))
14
17
  .action(async (options) => {
18
+ if (!/^\d+$/.test(options.sourceVersionId)) {
19
+ throw new CLIError('--source-version-id must be a non-negative integer.', 'INVALID_ARGUMENT_ERROR', { value: options.sourceVersionId });
20
+ }
15
21
  const parsed = {
16
22
  sourceDocument: options.sourceDocument,
17
23
  patches: DEACTIVATION_PATCH,
@@ -23,14 +29,21 @@ export function registerDeactivateCommand(program, factory, globals) {
23
29
  if (!did) {
24
30
  throw new CLIError('Source document must contain an "id" field.', 'INVALID_ARGUMENT_ERROR', options);
25
31
  }
26
- // CLI signing is not yet wired up; deactivate uses the same update path
27
- // and inherits the same gap. Drive the SDK directly with a `Signer` for now.
28
- // Variables above are kept so command parsing + validation still works.
29
- void deriveNetwork(did);
30
- void factory;
31
- void globals;
32
- void parsed;
33
- throw new CLIError('CLI signing is not yet implemented. Use @did-btcr2/api with a Signer directly.', 'NOT_IMPLEMENTED_ERROR', { command: 'deactivate' });
32
+ // Deactivation is an update that applies the deactivation patch. The core
33
+ // method has no separate deactivate path, so this routes through update.
34
+ const network = deriveNetwork(did);
35
+ const api = factory(network, globals());
36
+ const keyId = resolveKeyRef(api.kms.kms, globals().signingKey);
37
+ const signer = new KeyManagerSigner(api.kms.kms, keyId);
38
+ const data = await api.btcr2.update({
39
+ sourceDocument: parsed.sourceDocument,
40
+ patches: parsed.patches,
41
+ sourceVersionId: parsed.sourceVersionId,
42
+ verificationMethodId: parsed.verificationMethodId,
43
+ beaconId: parsed.beaconId,
44
+ signer,
45
+ });
46
+ console.log(formatResult({ action: 'deactivate', data }, globals()));
34
47
  });
35
48
  }
36
49
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"deactivate.js","sourceRoot":"","sources":["../../../../src/commands/deactivate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAmB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,2EAA2E;AAC3E,MAAM,kBAAkB,GAAG,CAAC,EAAE,EAAE,EAAE,KAAc,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEvF,MAAM,UAAU,yBAAyB,CACvC,OAAiB,EACjB,OAAoB,EACpB,OAA6B;IAE7B,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,KAAK,CAAC,QAAQ,CAAC;SACf,WAAW,CAAC,wEAAwE,CAAC;SACrF,cAAc,CACb,8BAA8B,EAC9B,qCAAqC,EACrC,YAAY,CAAC,mBAAmB,CAAC,CAClC;SACA,cAAc,CACb,8BAA8B,EAC9B,wCAAwC,CACzC;SACA,cAAc,CACb,mCAAmC,EACnC,mEAAmE,CACpE;SACA,cAAc,CACb,wBAAwB,EACxB,4BAA4B,EAC5B,YAAY,CAAC,aAAa,CAAC,CAC5B;SACA,MAAM,CAAC,KAAK,EAAE,OAKd,EAAE,EAAE;QACH,MAAM,MAAM,GAAyB;YACnC,cAAc,EAAS,OAAO,CAAC,cAAwD;YACvF,OAAO,EAAgB,kBAAkB;YACzC,eAAe,EAAQ,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;YACtD,oBAAoB,EAAG,OAAO,CAAC,oBAAoB;YACnD,QAAQ,EAAe,OAAO,CAAC,QAA4C;SAC5E,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,QAAQ,CAChB,6CAA6C,EAC7C,wBAAwB,EACxB,OAAO,CACR,CAAC;QACJ,CAAC;QACD,wEAAwE;QACxE,6EAA6E;QAC7E,wEAAwE;QACxE,KAAK,aAAa,CAAC,GAAG,CAAC,CAAC;QACxB,KAAK,OAAO,CAAC;QACb,KAAK,OAAO,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,MAAM,IAAI,QAAQ,CAChB,gFAAgF,EAChF,uBAAuB,EACvB,EAAE,OAAO,EAAE,YAAY,EAAE,CAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,CAAC,KAAa,EAAW,EAAE;QAChC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,QAAQ,CAChB,oBAAoB,QAAQ,gCAAgC,EAC5D,wBAAwB,EACxB,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"deactivate.js","sourceRoot":"","sources":["../../../../src/commands/deactivate.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,8 @@ export { registerCreateCommand } from './create.js';
2
2
  export { registerResolveCommand } from './resolve.js';
3
3
  export { registerUpdateCommand } from './update.js';
4
4
  export { registerDeactivateCommand } from './deactivate.js';
5
+ export { registerKeyCommand } from './key.js';
6
+ export { registerConfigCommand } from './config.js';
7
+ export { registerProfileCommand } from './profile.js';
8
+ export { registerCompletionCommand } from './completion.js';
5
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}