tether-name-cli 1.0.0 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +76 -30
- package/dist/cli.js +164 -5
- package/dist/cli.js.map +1 -1
- package/package.json +4 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Commit 451
|
|
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.
|
package/README.md
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# tether-name-cli
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/tether-name-cli)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
3
6
|
CLI for [tether.name](https://tether.name) — AI agent identity verification.
|
|
4
7
|
|
|
5
8
|
## Install
|
|
@@ -8,6 +11,12 @@ CLI for [tether.name](https://tether.name) — AI agent identity verification.
|
|
|
8
11
|
npm install -g tether-name-cli
|
|
9
12
|
```
|
|
10
13
|
|
|
14
|
+
Or use without installing:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npx tether-name-cli verify
|
|
18
|
+
```
|
|
19
|
+
|
|
11
20
|
Requires Node.js >= 18.
|
|
12
21
|
|
|
13
22
|
## Quick Start
|
|
@@ -24,31 +33,22 @@ tether verify
|
|
|
24
33
|
|
|
25
34
|
### `tether init`
|
|
26
35
|
|
|
27
|
-
Interactive setup wizard. Walks you through
|
|
28
|
-
|
|
29
|
-
1. Entering your credential ID (or reads `TETHER_CREDENTIAL_ID`)
|
|
30
|
-
2. Providing a private key path (or reads `TETHER_PRIVATE_KEY_PATH`)
|
|
31
|
-
3. Optionally generating a new RSA-2048 keypair
|
|
36
|
+
Interactive setup wizard. Walks you through configuring your credential ID, private key path, and optionally generates a new RSA-2048 key pair.
|
|
32
37
|
|
|
33
38
|
Saves configuration to `~/.tether/config.json`.
|
|
34
39
|
|
|
35
40
|
### `tether verify`
|
|
36
41
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
1. Requests a challenge from the Tether API
|
|
40
|
-
2. Signs it with your private key
|
|
41
|
-
3. Submits proof and displays the result
|
|
42
|
+
Perform a full identity verification — requests a challenge, signs it, submits proof, and displays the result.
|
|
42
43
|
|
|
43
44
|
```bash
|
|
44
45
|
tether verify
|
|
45
|
-
tether verify --json
|
|
46
|
-
tether verify --verbose # Debug output
|
|
46
|
+
tether verify --json # Machine-readable output
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
### `tether status`
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
Show your current configuration — credential ID (masked), key file path, and API URL.
|
|
52
52
|
|
|
53
53
|
```bash
|
|
54
54
|
tether status
|
|
@@ -57,7 +57,7 @@ tether status --json
|
|
|
57
57
|
|
|
58
58
|
### `tether challenge`
|
|
59
59
|
|
|
60
|
-
Request a challenge code from the API and print it.
|
|
60
|
+
Request a new challenge code from the Tether API and print it.
|
|
61
61
|
|
|
62
62
|
```bash
|
|
63
63
|
tether challenge
|
|
@@ -68,7 +68,7 @@ tether challenge
|
|
|
68
68
|
Sign a challenge string with your private key and print the proof.
|
|
69
69
|
|
|
70
70
|
```bash
|
|
71
|
-
tether sign
|
|
71
|
+
tether sign "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
|
|
72
72
|
```
|
|
73
73
|
|
|
74
74
|
### `tether check <code>`
|
|
@@ -76,36 +76,82 @@ tether sign abc123
|
|
|
76
76
|
Check the status of a challenge by its code.
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
-
tether check
|
|
80
|
-
tether check
|
|
79
|
+
tether check "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
|
|
80
|
+
tether check "a1b2c3d4-e5f6-7890-abcd-ef1234567890" --json
|
|
81
81
|
```
|
|
82
82
|
|
|
83
83
|
## Configuration
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
The CLI resolves configuration in this order (first wins):
|
|
86
86
|
|
|
87
87
|
1. **CLI flags** — `--credential-id`, `--key-path`, `--api-url`
|
|
88
88
|
2. **Environment variables** — `TETHER_CREDENTIAL_ID`, `TETHER_PRIVATE_KEY_PATH`, `TETHER_API_URL`
|
|
89
|
-
3. **Config file** — `~/.tether/config.json`
|
|
89
|
+
3. **Config file** — `~/.tether/config.json` (created by `tether init`)
|
|
90
90
|
|
|
91
|
-
###
|
|
91
|
+
### Global Flags
|
|
92
92
|
|
|
93
|
-
|
|
|
93
|
+
| Flag | Description |
|
|
94
94
|
|---|---|
|
|
95
|
-
|
|
|
96
|
-
|
|
|
97
|
-
|
|
|
95
|
+
| `--credential-id <id>` | Override credential ID |
|
|
96
|
+
| `--key-path <path>` | Override private key file path |
|
|
97
|
+
| `--api-url <url>` | Override API base URL |
|
|
98
|
+
| `--verbose` | Enable debug output |
|
|
99
|
+
| `--json` | Machine-readable JSON output (on supported commands) |
|
|
98
100
|
|
|
99
|
-
##
|
|
101
|
+
## Example Workflow
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# 1. Set up credentials
|
|
105
|
+
tether init
|
|
106
|
+
|
|
107
|
+
# 2. Check your config
|
|
108
|
+
tether status
|
|
109
|
+
|
|
110
|
+
# 3. Verify your identity
|
|
111
|
+
tether verify
|
|
112
|
+
|
|
113
|
+
# 4. Debug: manually request and sign a challenge
|
|
114
|
+
tether challenge
|
|
115
|
+
tether sign "the-challenge-code"
|
|
116
|
+
tether check "the-challenge-code"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Publishing
|
|
120
|
+
|
|
121
|
+
Published to npm automatically via GitHub Actions when a release is created.
|
|
122
|
+
|
|
123
|
+
### Version checklist
|
|
124
|
+
|
|
125
|
+
Update the version in:
|
|
126
|
+
|
|
127
|
+
1. `package.json` → `"version"`
|
|
128
|
+
2. `src/cli.ts` → `VERSION` constant
|
|
129
|
+
|
|
130
|
+
### Steps
|
|
131
|
+
|
|
132
|
+
1. Update version numbers above (they must match)
|
|
133
|
+
2. Commit and push to `main`
|
|
134
|
+
3. Create a GitHub release with a matching tag (e.g. `v1.0.0`)
|
|
135
|
+
4. CI builds and publishes to npm automatically
|
|
136
|
+
|
|
137
|
+
### Manual publish (if needed)
|
|
100
138
|
|
|
101
139
|
```bash
|
|
102
|
-
git clone https://github.com/tether-name/tether-name-cli.git
|
|
103
|
-
cd tether-name-cli
|
|
104
|
-
npm install
|
|
105
140
|
npm run build
|
|
106
|
-
npm
|
|
141
|
+
npm publish --access public
|
|
107
142
|
```
|
|
108
143
|
|
|
144
|
+
## Documentation
|
|
145
|
+
|
|
146
|
+
Full documentation at [docs.tether.name](https://docs.tether.name/cli/).
|
|
147
|
+
|
|
109
148
|
## License
|
|
110
149
|
|
|
111
|
-
MIT
|
|
150
|
+
[MIT](LICENSE)
|
|
151
|
+
|
|
152
|
+
## Links
|
|
153
|
+
|
|
154
|
+
- 🌐 [Tether Website](https://tether.name)
|
|
155
|
+
- 📘 [Documentation](https://docs.tether.name)
|
|
156
|
+
- 📦 [npm Package](https://www.npmjs.com/package/tether-name-cli)
|
|
157
|
+
- 💻 [GitHub](https://github.com/tether-name/tether-name-cli)
|
package/dist/cli.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/cli.ts
|
|
4
4
|
import { Command } from "commander";
|
|
5
|
-
import
|
|
5
|
+
import chalk7 from "chalk";
|
|
6
6
|
|
|
7
7
|
// src/utils/display.ts
|
|
8
8
|
import chalk from "chalk";
|
|
@@ -138,7 +138,8 @@ function resolveConfig(flags = {}) {
|
|
|
138
138
|
return {
|
|
139
139
|
credentialId: flags.credentialId || process.env.TETHER_CREDENTIAL_ID || file.credentialId || "",
|
|
140
140
|
keyPath: flags.keyPath || process.env.TETHER_PRIVATE_KEY_PATH || file.keyPath || "",
|
|
141
|
-
apiUrl: flags.apiUrl || process.env.TETHER_API_URL || file.apiUrl || DEFAULT_API_URL
|
|
141
|
+
apiUrl: flags.apiUrl || process.env.TETHER_API_URL || file.apiUrl || DEFAULT_API_URL,
|
|
142
|
+
apiKey: flags.apiKey || process.env.TETHER_API_KEY || file.apiKey || ""
|
|
142
143
|
};
|
|
143
144
|
}
|
|
144
145
|
|
|
@@ -370,12 +371,160 @@ async function checkCommand(code, opts) {
|
|
|
370
371
|
}
|
|
371
372
|
}
|
|
372
373
|
|
|
374
|
+
// src/commands/agent-create.ts
|
|
375
|
+
import chalk4 from "chalk";
|
|
376
|
+
import { TetherClient as TetherClient3 } from "tether-name";
|
|
377
|
+
async function agentCreateCommand(name, opts) {
|
|
378
|
+
const config = resolveConfig(opts);
|
|
379
|
+
if (!config.apiKey) {
|
|
380
|
+
printError("No API key configured. Set TETHER_API_KEY or pass --api-key.");
|
|
381
|
+
process.exitCode = 1;
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
const verbose = opts.verbose ?? false;
|
|
385
|
+
try {
|
|
386
|
+
printVerbose(`API URL: ${config.apiUrl}`, verbose);
|
|
387
|
+
printVerbose(`Creating agent "${name}"...`, verbose);
|
|
388
|
+
const client = new TetherClient3({
|
|
389
|
+
apiKey: config.apiKey,
|
|
390
|
+
baseUrl: config.apiUrl
|
|
391
|
+
});
|
|
392
|
+
const agent2 = await client.createAgent(name, opts.description || "");
|
|
393
|
+
if (opts.json) {
|
|
394
|
+
console.log(JSON.stringify(agent2, null, 2));
|
|
395
|
+
} else {
|
|
396
|
+
console.log();
|
|
397
|
+
console.log(chalk4.green.bold(" \u2713 Agent created"));
|
|
398
|
+
console.log(chalk4.dim(" " + "\u2500".repeat(40)));
|
|
399
|
+
console.log(` ID: ${agent2.id}`);
|
|
400
|
+
console.log(` Name: ${agent2.agentName}`);
|
|
401
|
+
if (agent2.description) {
|
|
402
|
+
console.log(` Description: ${agent2.description}`);
|
|
403
|
+
}
|
|
404
|
+
console.log(` Registration Token: ${chalk4.yellow(agent2.registrationToken)}`);
|
|
405
|
+
console.log();
|
|
406
|
+
console.log(chalk4.dim(" Save the registration token \u2014 it cannot be retrieved later."));
|
|
407
|
+
console.log();
|
|
408
|
+
}
|
|
409
|
+
} catch (err) {
|
|
410
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
411
|
+
if (opts.json) {
|
|
412
|
+
console.log(JSON.stringify({ error: message }, null, 2));
|
|
413
|
+
} else {
|
|
414
|
+
printError(message);
|
|
415
|
+
}
|
|
416
|
+
process.exitCode = 1;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// src/commands/agent-list.ts
|
|
421
|
+
import chalk5 from "chalk";
|
|
422
|
+
import { TetherClient as TetherClient4 } from "tether-name";
|
|
423
|
+
async function agentListCommand(opts) {
|
|
424
|
+
const config = resolveConfig(opts);
|
|
425
|
+
if (!config.apiKey) {
|
|
426
|
+
printError("No API key configured. Set TETHER_API_KEY or pass --api-key.");
|
|
427
|
+
process.exitCode = 1;
|
|
428
|
+
return;
|
|
429
|
+
}
|
|
430
|
+
const verbose = opts.verbose ?? false;
|
|
431
|
+
try {
|
|
432
|
+
printVerbose(`API URL: ${config.apiUrl}`, verbose);
|
|
433
|
+
printVerbose("Listing agents...", verbose);
|
|
434
|
+
const client = new TetherClient4({
|
|
435
|
+
apiKey: config.apiKey,
|
|
436
|
+
baseUrl: config.apiUrl
|
|
437
|
+
});
|
|
438
|
+
const agents = await client.listAgents();
|
|
439
|
+
if (opts.json) {
|
|
440
|
+
console.log(JSON.stringify(agents, null, 2));
|
|
441
|
+
} else if (agents.length === 0) {
|
|
442
|
+
console.log();
|
|
443
|
+
console.log(chalk5.dim(" No agents found."));
|
|
444
|
+
console.log();
|
|
445
|
+
} else {
|
|
446
|
+
console.log();
|
|
447
|
+
console.log(chalk5.bold(` Agents (${agents.length})`));
|
|
448
|
+
console.log(chalk5.dim(" " + "\u2500".repeat(40)));
|
|
449
|
+
for (const agent2 of agents) {
|
|
450
|
+
const date = formatDate2(agent2.createdAt);
|
|
451
|
+
console.log(` ${chalk5.cyan(agent2.agentName)} ${chalk5.dim(`(${agent2.id})`)}`);
|
|
452
|
+
if (agent2.description) {
|
|
453
|
+
console.log(` ${agent2.description}`);
|
|
454
|
+
}
|
|
455
|
+
console.log(` Created: ${date}`);
|
|
456
|
+
if (agent2.lastVerifiedAt) {
|
|
457
|
+
console.log(` Last verified: ${formatDate2(agent2.lastVerifiedAt)}`);
|
|
458
|
+
}
|
|
459
|
+
console.log();
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
} catch (err) {
|
|
463
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
464
|
+
if (opts.json) {
|
|
465
|
+
console.log(JSON.stringify({ error: message }, null, 2));
|
|
466
|
+
} else {
|
|
467
|
+
printError(message);
|
|
468
|
+
}
|
|
469
|
+
process.exitCode = 1;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
function formatDate2(ts) {
|
|
473
|
+
try {
|
|
474
|
+
return new Date(ts).toLocaleDateString("en-US", {
|
|
475
|
+
year: "numeric",
|
|
476
|
+
month: "long",
|
|
477
|
+
day: "numeric"
|
|
478
|
+
});
|
|
479
|
+
} catch {
|
|
480
|
+
return String(ts);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// src/commands/agent-delete.ts
|
|
485
|
+
import chalk6 from "chalk";
|
|
486
|
+
import { TetherClient as TetherClient5 } from "tether-name";
|
|
487
|
+
async function agentDeleteCommand(id, opts) {
|
|
488
|
+
const config = resolveConfig(opts);
|
|
489
|
+
if (!config.apiKey) {
|
|
490
|
+
printError("No API key configured. Set TETHER_API_KEY or pass --api-key.");
|
|
491
|
+
process.exitCode = 1;
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
const verbose = opts.verbose ?? false;
|
|
495
|
+
try {
|
|
496
|
+
printVerbose(`API URL: ${config.apiUrl}`, verbose);
|
|
497
|
+
printVerbose(`Deleting agent ${id}...`, verbose);
|
|
498
|
+
const client = new TetherClient5({
|
|
499
|
+
apiKey: config.apiKey,
|
|
500
|
+
baseUrl: config.apiUrl
|
|
501
|
+
});
|
|
502
|
+
await client.deleteAgent(id);
|
|
503
|
+
if (opts.json) {
|
|
504
|
+
console.log(JSON.stringify({ deleted: true, id }, null, 2));
|
|
505
|
+
} else {
|
|
506
|
+
console.log();
|
|
507
|
+
console.log(chalk6.green.bold(" \u2713 Agent deleted"));
|
|
508
|
+
console.log(chalk6.dim(` ID: ${id}`));
|
|
509
|
+
console.log();
|
|
510
|
+
}
|
|
511
|
+
} catch (err) {
|
|
512
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
513
|
+
if (opts.json) {
|
|
514
|
+
console.log(JSON.stringify({ error: message }, null, 2));
|
|
515
|
+
} else {
|
|
516
|
+
printError(message);
|
|
517
|
+
}
|
|
518
|
+
process.exitCode = 1;
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
373
522
|
// src/cli.ts
|
|
374
|
-
var VERSION = "
|
|
523
|
+
var VERSION = "1.0.4";
|
|
375
524
|
var program = new Command();
|
|
376
|
-
program.name("tether").description("CLI for tether.name \u2014 AI agent identity verification").version(
|
|
525
|
+
program.name("tether").description("CLI for tether.name \u2014 AI agent identity verification").version(chalk7.cyan(BANNER) + ` v${VERSION}
|
|
377
526
|
`, "-v, --version", "Show version");
|
|
378
|
-
var addGlobalOpts = (cmd) => cmd.option("--credential-id <id>", "Credential ID").option("--key-path <path>", "Path to private key file").option("--api-url <url>", "Tether API base URL").option("--verbose", "Enable debug output");
|
|
527
|
+
var addGlobalOpts = (cmd) => cmd.option("--credential-id <id>", "Credential ID").option("--key-path <path>", "Path to private key file").option("--api-url <url>", "Tether API base URL").option("--api-key <key>", "API key for management operations").option("--verbose", "Enable debug output");
|
|
379
528
|
program.command("init").description("Interactive setup wizard").option("--verbose", "Enable debug output").action((opts) => initCommand(opts));
|
|
380
529
|
addGlobalOpts(
|
|
381
530
|
program.command("verify").description("Perform a full identity verification").option("--json", "Output result as JSON")
|
|
@@ -392,5 +541,15 @@ addGlobalOpts(
|
|
|
392
541
|
addGlobalOpts(
|
|
393
542
|
program.command("check <code>").description("Check the status of a challenge by code").option("--json", "Output result as JSON")
|
|
394
543
|
).action((code, opts) => checkCommand(code, opts));
|
|
544
|
+
var agent = program.command("agent").description("Manage agents");
|
|
545
|
+
addGlobalOpts(
|
|
546
|
+
agent.command("create <name>").description("Create a new agent").option("--description <text>", "Agent description").option("--json", "Output result as JSON")
|
|
547
|
+
).action((name, opts) => agentCreateCommand(name, opts));
|
|
548
|
+
addGlobalOpts(
|
|
549
|
+
agent.command("list").description("List all agents").option("--json", "Output result as JSON")
|
|
550
|
+
).action((opts) => agentListCommand(opts));
|
|
551
|
+
addGlobalOpts(
|
|
552
|
+
agent.command("delete <id>").description("Delete an agent by ID").option("--json", "Output result as JSON")
|
|
553
|
+
).action((id, opts) => agentDeleteCommand(id, opts));
|
|
395
554
|
program.parse();
|
|
396
555
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/utils/display.ts","../src/commands/init.ts","../src/config.ts","../src/commands/verify.ts","../src/commands/status.ts","../src/commands/challenge.ts","../src/commands/sign.ts","../src/commands/check.ts"],"sourcesContent":["import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { BANNER } from './utils/display.js';\nimport { initCommand } from './commands/init.js';\nimport { verifyCommand } from './commands/verify.js';\nimport { statusCommand } from './commands/status.js';\nimport { challengeCommand } from './commands/challenge.js';\nimport { signCommand } from './commands/sign.js';\nimport { checkCommand } from './commands/check.js';\n\nconst VERSION = '0.1.0';\n\nconst program = new Command();\n\nprogram\n .name('tether')\n .description('CLI for tether.name — AI agent identity verification')\n .version(chalk.cyan(BANNER) + ` v${VERSION}\\n`, '-v, --version', 'Show version');\n\n// Global options\nconst addGlobalOpts = (cmd: Command): Command =>\n cmd\n .option('--credential-id <id>', 'Credential ID')\n .option('--key-path <path>', 'Path to private key file')\n .option('--api-url <url>', 'Tether API base URL')\n .option('--verbose', 'Enable debug output');\n\n// tether init\nprogram\n .command('init')\n .description('Interactive setup wizard')\n .option('--verbose', 'Enable debug output')\n .action((opts) => initCommand(opts));\n\n// tether verify\naddGlobalOpts(\n program\n .command('verify')\n .description('Perform a full identity verification')\n .option('--json', 'Output result as JSON'),\n).action((opts) => verifyCommand(opts));\n\n// tether status\naddGlobalOpts(\n program\n .command('status')\n .description('Show current configuration')\n .option('--json', 'Output result as JSON'),\n).action((opts) => statusCommand(opts));\n\n// tether challenge\naddGlobalOpts(\n program\n .command('challenge')\n .description('Request a challenge code from the API'),\n).action((opts) => challengeCommand(opts));\n\n// tether sign <challenge>\naddGlobalOpts(\n program\n .command('sign <challenge>')\n .description('Sign a challenge string and print the proof'),\n).action((challenge, opts) => signCommand(challenge, opts));\n\n// tether check <code>\naddGlobalOpts(\n program\n .command('check <code>')\n .description('Check the status of a challenge by code')\n .option('--json', 'Output result as JSON'),\n).action((code, opts) => checkCommand(code, opts));\n\nprogram.parse();\n","import chalk from 'chalk';\nimport type { VerificationResult } from 'tether-name';\nimport type { TetherConfig } from '../config.js';\n\nexport function maskId(id: string): string {\n if (id.length <= 4) return id;\n return '••••' + id.slice(-4);\n}\n\nexport function printVerifyResult(result: VerificationResult): void {\n const width = 48;\n const hr = '─'.repeat(width);\n\n console.log();\n if (result.verified) {\n console.log(chalk.green('┌' + hr + '┐'));\n console.log(chalk.green('│') + center(chalk.green.bold('✓ Identity Verified'), width, 19) + chalk.green('│'));\n console.log(chalk.green('├' + hr + '┤'));\n\n if (result.agentName) {\n console.log(chalk.green('│') + padLine(` Agent: ${result.agentName}`, width) + chalk.green('│'));\n }\n if (result.verifyUrl) {\n console.log(chalk.green('│') + padLine(` URL: ${result.verifyUrl}`, width) + chalk.green('│'));\n }\n if (result.registeredSince) {\n const date = formatDate(result.registeredSince);\n console.log(chalk.green('│') + padLine(` Since: ${date}`, width) + chalk.green('│'));\n }\n\n console.log(chalk.green('└' + hr + '┘'));\n } else {\n console.log(chalk.red('┌' + hr + '┐'));\n console.log(chalk.red('│') + center(chalk.red.bold('✗ Verification Failed'), width, 21) + chalk.red('│'));\n console.log(chalk.red('├' + hr + '┤'));\n\n if (result.error) {\n console.log(chalk.red('│') + padLine(` ${result.error}`, width) + chalk.red('│'));\n }\n\n console.log(chalk.red('└' + hr + '┘'));\n }\n console.log();\n}\n\nexport function printVerifyResultJSON(result: VerificationResult): void {\n console.log(JSON.stringify(result, null, 2));\n}\n\nexport function printStatus(config: TetherConfig, keyExists: boolean): void {\n console.log();\n console.log(chalk.bold(' Tether Configuration'));\n console.log(chalk.dim(' ' + '─'.repeat(30)));\n console.log(` Credential: ${config.credentialId ? maskId(config.credentialId) : chalk.dim('(not set)')}`);\n console.log(` Key path: ${config.keyPath || chalk.dim('(not set)')}`);\n if (config.keyPath) {\n console.log(` Key exists: ${keyExists ? chalk.green('yes') : chalk.red('no')}`);\n }\n console.log(` API URL: ${config.apiUrl}`);\n console.log();\n}\n\nexport function printStatusJSON(config: TetherConfig, keyExists: boolean): void {\n console.log(JSON.stringify({\n credentialId: config.credentialId ? maskId(config.credentialId) : null,\n keyPath: config.keyPath || null,\n keyExists,\n apiUrl: config.apiUrl,\n }, null, 2));\n}\n\nexport function printError(message: string): void {\n console.error(chalk.red(`Error: ${message}`));\n}\n\nexport function printVerbose(message: string, verbose: boolean): void {\n if (verbose) {\n console.error(chalk.dim(`[debug] ${message}`));\n }\n}\n\nexport const BANNER = `\n ╔╦╗╔═╗╔╦╗╦ ╦╔═╗╦═╗\n ║ ║╣ ║ ╠═╣║╣ ╠╦╝\n ╩ ╚═╝ ╩ ╩ ╩╚═╝╩╚═\n`;\n\nfunction padLine(text: string, width: number): string {\n const visible = stripAnsi(text);\n const pad = width - visible.length;\n return text + ' '.repeat(Math.max(0, pad));\n}\n\nfunction center(text: string, width: number, visibleLength: number): string {\n const leftPad = Math.floor((width - visibleLength) / 2);\n const rightPad = width - visibleLength - leftPad;\n return ' '.repeat(leftPad) + text + ' '.repeat(rightPad);\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\nfunction formatDate(iso: string): string {\n try {\n return new Date(iso).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n } catch {\n return iso;\n }\n}\n","import { createInterface } from 'readline';\nimport { generateKeyPairSync } from 'crypto';\nimport { writeFileSync, existsSync } from 'fs';\nimport { resolve } from 'path';\nimport chalk from 'chalk';\nimport { saveConfig, getConfigPath } from '../config.js';\n\nfunction prompt(rl: ReturnType<typeof createInterface>, question: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(question, (answer) => resolve(answer.trim()));\n });\n}\n\nexport async function initCommand(opts: { verbose?: boolean }): Promise<void> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n try {\n console.log();\n console.log(chalk.bold(' Tether Setup'));\n console.log(chalk.dim(' ' + '─'.repeat(30)));\n console.log();\n\n // Credential ID\n const envCredential = process.env.TETHER_CREDENTIAL_ID;\n let credentialId: string;\n if (envCredential) {\n console.log(chalk.dim(` Using TETHER_CREDENTIAL_ID from environment`));\n credentialId = envCredential;\n } else {\n credentialId = await prompt(rl, ' Credential ID: ');\n }\n\n if (!credentialId) {\n console.log(chalk.red('\\n Credential ID is required.'));\n return;\n }\n\n // Private key\n const envKeyPath = process.env.TETHER_PRIVATE_KEY_PATH;\n let keyPath: string;\n\n if (envKeyPath) {\n console.log(chalk.dim(` Using TETHER_PRIVATE_KEY_PATH from environment`));\n keyPath = envKeyPath;\n } else {\n const genAnswer = await prompt(rl, ' Generate a new RSA keypair? (y/N): ');\n\n if (genAnswer.toLowerCase() === 'y') {\n keyPath = await generateKeypair(opts.verbose);\n } else {\n keyPath = await prompt(rl, ' Path to private key: ');\n }\n }\n\n if (!keyPath) {\n console.log(chalk.red('\\n Private key path is required.'));\n return;\n }\n\n keyPath = resolve(keyPath);\n\n if (!existsSync(keyPath)) {\n console.log(chalk.yellow(`\\n Warning: Key file not found at ${keyPath}`));\n }\n\n // Save config\n saveConfig({ credentialId, keyPath });\n\n console.log();\n console.log(chalk.green(' ✓ Configuration saved to ' + getConfigPath()));\n console.log();\n } finally {\n rl.close();\n }\n}\n\nfunction generateKeypair(verbose?: boolean): string {\n const privatePath = resolve('.tether-private-key.pem');\n const publicPath = resolve('.tether-public-key.pem');\n\n if (verbose) {\n console.log(chalk.dim(` [debug] Generating RSA-2048 keypair...`));\n }\n\n const { publicKey, privateKey } = generateKeyPairSync('rsa', {\n modulusLength: 2048,\n publicKeyEncoding: { type: 'spki', format: 'pem' },\n privateKeyEncoding: { type: 'pkcs1', format: 'pem' },\n });\n\n writeFileSync(privatePath, privateKey, { mode: 0o600 });\n writeFileSync(publicPath, publicKey);\n\n console.log(chalk.green(` ✓ Private key: ${privatePath}`));\n console.log(chalk.green(` ✓ Public key: ${publicPath}`));\n console.log();\n console.log(chalk.dim(' Upload the public key to tether.name to complete registration.'));\n\n return privatePath;\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport interface TetherConfig {\n credentialId: string;\n keyPath: string;\n apiUrl: string;\n}\n\nexport interface CLIFlags {\n credentialId?: string;\n keyPath?: string;\n apiUrl?: string;\n}\n\nconst CONFIG_DIR = join(homedir(), '.tether');\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.json');\nconst DEFAULT_API_URL = 'https://api.tether.name';\n\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nexport function loadConfigFile(): Partial<TetherConfig> {\n try {\n if (!existsSync(CONFIG_FILE)) {\n return {};\n }\n const raw = readFileSync(CONFIG_FILE, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return {};\n }\n}\n\nexport function saveConfig(config: Partial<TetherConfig>): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\nexport function resolveConfig(flags: CLIFlags = {}): TetherConfig {\n const file = loadConfigFile();\n\n return {\n credentialId:\n flags.credentialId ||\n process.env.TETHER_CREDENTIAL_ID ||\n file.credentialId ||\n '',\n keyPath:\n flags.keyPath ||\n process.env.TETHER_PRIVATE_KEY_PATH ||\n file.keyPath ||\n '',\n apiUrl:\n flags.apiUrl ||\n process.env.TETHER_API_URL ||\n file.apiUrl ||\n DEFAULT_API_URL,\n };\n}\n","import { TetherClient } from 'tether-name';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printVerifyResult, printVerifyResultJSON, printError, printVerbose } from '../utils/display.js';\n\nexport async function verifyCommand(opts: CLIFlags & { json?: boolean; verbose?: boolean }): Promise<void> {\n const config = resolveConfig(opts);\n\n if (!config.credentialId) {\n printError('No credential ID configured. Run \"tether init\" or set TETHER_CREDENTIAL_ID.');\n process.exitCode = 1;\n return;\n }\n\n if (!config.keyPath) {\n printError('No private key path configured. Run \"tether init\" or set TETHER_PRIVATE_KEY_PATH.');\n process.exitCode = 1;\n return;\n }\n\n const verbose = opts.verbose ?? false;\n\n try {\n printVerbose(`Credential ID: ${config.credentialId}`, verbose);\n printVerbose(`Key path: ${config.keyPath}`, verbose);\n printVerbose(`API URL: ${config.apiUrl}`, verbose);\n\n const client = new TetherClient({\n credentialId: config.credentialId,\n privateKeyPath: config.keyPath,\n baseUrl: config.apiUrl,\n });\n\n printVerbose('Requesting challenge...', verbose);\n const challenge = await client.requestChallenge();\n printVerbose(`Challenge: ${challenge}`, verbose);\n\n printVerbose('Signing challenge...', verbose);\n const proof = client.sign(challenge);\n printVerbose(`Proof: ${proof.slice(0, 32)}...`, verbose);\n\n printVerbose('Submitting proof...', verbose);\n const result = await client.submitProof(challenge, proof);\n\n if (opts.json) {\n printVerifyResultJSON(result);\n } else {\n printVerifyResult(result);\n }\n\n if (!result.verified) {\n process.exitCode = 1;\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (opts.json) {\n console.log(JSON.stringify({ verified: false, error: message }, null, 2));\n } else {\n printError(message);\n }\n process.exitCode = 1;\n }\n}\n","import { existsSync } from 'fs';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printStatus, printStatusJSON } from '../utils/display.js';\n\nexport function statusCommand(opts: CLIFlags & { json?: boolean }): void {\n const config = resolveConfig(opts);\n const keyExists = config.keyPath ? existsSync(config.keyPath) : false;\n\n if (opts.json) {\n printStatusJSON(config, keyExists);\n } else {\n printStatus(config, keyExists);\n }\n}\n","import { TetherClient } from 'tether-name';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printError, printVerbose } from '../utils/display.js';\n\nexport async function challengeCommand(opts: CLIFlags & { verbose?: boolean }): Promise<void> {\n const config = resolveConfig(opts);\n\n if (!config.credentialId) {\n printError('No credential ID configured. Run \"tether init\" or set TETHER_CREDENTIAL_ID.');\n process.exitCode = 1;\n return;\n }\n\n if (!config.keyPath) {\n printError('No private key path configured. Run \"tether init\" or set TETHER_PRIVATE_KEY_PATH.');\n process.exitCode = 1;\n return;\n }\n\n try {\n printVerbose(`API URL: ${config.apiUrl}`, opts.verbose ?? false);\n\n const client = new TetherClient({\n credentialId: config.credentialId,\n privateKeyPath: config.keyPath,\n baseUrl: config.apiUrl,\n });\n\n const code = await client.requestChallenge();\n console.log(code);\n } catch (err) {\n printError(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n}\n","import { loadPrivateKey, signChallenge } from 'tether-name';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printError, printVerbose } from '../utils/display.js';\n\nexport function signCommand(challenge: string, opts: CLIFlags & { verbose?: boolean }): void {\n const config = resolveConfig(opts);\n\n if (!config.keyPath) {\n printError('No private key path configured. Run \"tether init\" or set TETHER_PRIVATE_KEY_PATH.');\n process.exitCode = 1;\n return;\n }\n\n try {\n printVerbose(`Key path: ${config.keyPath}`, opts.verbose ?? false);\n\n const privateKey = loadPrivateKey({ keyPath: config.keyPath });\n const proof = signChallenge(privateKey, challenge);\n console.log(proof);\n } catch (err) {\n printError(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n}\n","import chalk from 'chalk';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printError, printVerbose } from '../utils/display.js';\n\ninterface ChallengeStatusResponse {\n code: string;\n status: string;\n credentialId?: string;\n createdAt?: string;\n verifiedAt?: string;\n [key: string]: unknown;\n}\n\nexport async function checkCommand(\n code: string,\n opts: CLIFlags & { json?: boolean; verbose?: boolean },\n): Promise<void> {\n const config = resolveConfig(opts);\n const baseUrl = config.apiUrl;\n const verbose = opts.verbose ?? false;\n\n try {\n const url = `${baseUrl}/challenge/${encodeURIComponent(code)}`;\n printVerbose(`GET ${url}`, verbose);\n\n const response = await fetch(url, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n printError(`API returned ${response.status}: ${text || response.statusText}`);\n process.exitCode = 1;\n return;\n }\n\n const data = (await response.json()) as ChallengeStatusResponse;\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log();\n console.log(chalk.bold(' Challenge Status'));\n console.log(chalk.dim(' ' + '─'.repeat(30)));\n console.log(` Code: ${data.code}`);\n console.log(` Status: ${data.status}`);\n if (data.createdAt) {\n console.log(` Created: ${data.createdAt}`);\n }\n if (data.verifiedAt) {\n console.log(` Verified: ${data.verifiedAt}`);\n }\n console.log();\n }\n } catch (err) {\n printError(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n}\n"],"mappings":"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","names":["chalk","writeFileSync","existsSync","chalk","resolve","chalk","existsSync","writeFileSync","existsSync","existsSync","TetherClient","TetherClient","chalk","chalk","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/utils/display.ts","../src/commands/init.ts","../src/config.ts","../src/commands/verify.ts","../src/commands/status.ts","../src/commands/challenge.ts","../src/commands/sign.ts","../src/commands/check.ts","../src/commands/agent-create.ts","../src/commands/agent-list.ts","../src/commands/agent-delete.ts"],"sourcesContent":["import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { BANNER } from './utils/display.js';\nimport { initCommand } from './commands/init.js';\nimport { verifyCommand } from './commands/verify.js';\nimport { statusCommand } from './commands/status.js';\nimport { challengeCommand } from './commands/challenge.js';\nimport { signCommand } from './commands/sign.js';\nimport { checkCommand } from './commands/check.js';\nimport { agentCreateCommand } from './commands/agent-create.js';\nimport { agentListCommand } from './commands/agent-list.js';\nimport { agentDeleteCommand } from './commands/agent-delete.js';\n\nconst VERSION = '1.0.4';\n\nconst program = new Command();\n\nprogram\n .name('tether')\n .description('CLI for tether.name — AI agent identity verification')\n .version(chalk.cyan(BANNER) + ` v${VERSION}\\n`, '-v, --version', 'Show version');\n\n// Global options\nconst addGlobalOpts = (cmd: Command): Command =>\n cmd\n .option('--credential-id <id>', 'Credential ID')\n .option('--key-path <path>', 'Path to private key file')\n .option('--api-url <url>', 'Tether API base URL')\n .option('--api-key <key>', 'API key for management operations')\n .option('--verbose', 'Enable debug output');\n\n// tether init\nprogram\n .command('init')\n .description('Interactive setup wizard')\n .option('--verbose', 'Enable debug output')\n .action((opts) => initCommand(opts));\n\n// tether verify\naddGlobalOpts(\n program\n .command('verify')\n .description('Perform a full identity verification')\n .option('--json', 'Output result as JSON'),\n).action((opts) => verifyCommand(opts));\n\n// tether status\naddGlobalOpts(\n program\n .command('status')\n .description('Show current configuration')\n .option('--json', 'Output result as JSON'),\n).action((opts) => statusCommand(opts));\n\n// tether challenge\naddGlobalOpts(\n program\n .command('challenge')\n .description('Request a challenge code from the API'),\n).action((opts) => challengeCommand(opts));\n\n// tether sign <challenge>\naddGlobalOpts(\n program\n .command('sign <challenge>')\n .description('Sign a challenge string and print the proof'),\n).action((challenge, opts) => signCommand(challenge, opts));\n\n// tether check <code>\naddGlobalOpts(\n program\n .command('check <code>')\n .description('Check the status of a challenge by code')\n .option('--json', 'Output result as JSON'),\n).action((code, opts) => checkCommand(code, opts));\n\n// tether agent (subcommand group)\nconst agent = program\n .command('agent')\n .description('Manage agents');\n\n// tether agent create <name>\naddGlobalOpts(\n agent\n .command('create <name>')\n .description('Create a new agent')\n .option('--description <text>', 'Agent description')\n .option('--json', 'Output result as JSON'),\n).action((name, opts) => agentCreateCommand(name, opts));\n\n// tether agent list\naddGlobalOpts(\n agent\n .command('list')\n .description('List all agents')\n .option('--json', 'Output result as JSON'),\n).action((opts) => agentListCommand(opts));\n\n// tether agent delete <id>\naddGlobalOpts(\n agent\n .command('delete <id>')\n .description('Delete an agent by ID')\n .option('--json', 'Output result as JSON'),\n).action((id, opts) => agentDeleteCommand(id, opts));\n\nprogram.parse();\n","import chalk from 'chalk';\nimport type { VerificationResult } from 'tether-name';\nimport type { TetherConfig } from '../config.js';\n\nexport function maskId(id: string): string {\n if (id.length <= 4) return id;\n return '••••' + id.slice(-4);\n}\n\nexport function printVerifyResult(result: VerificationResult): void {\n const width = 48;\n const hr = '─'.repeat(width);\n\n console.log();\n if (result.verified) {\n console.log(chalk.green('┌' + hr + '┐'));\n console.log(chalk.green('│') + center(chalk.green.bold('✓ Identity Verified'), width, 19) + chalk.green('│'));\n console.log(chalk.green('├' + hr + '┤'));\n\n if (result.agentName) {\n console.log(chalk.green('│') + padLine(` Agent: ${result.agentName}`, width) + chalk.green('│'));\n }\n if (result.verifyUrl) {\n console.log(chalk.green('│') + padLine(` URL: ${result.verifyUrl}`, width) + chalk.green('│'));\n }\n if (result.registeredSince) {\n const date = formatDate(result.registeredSince);\n console.log(chalk.green('│') + padLine(` Since: ${date}`, width) + chalk.green('│'));\n }\n\n console.log(chalk.green('└' + hr + '┘'));\n } else {\n console.log(chalk.red('┌' + hr + '┐'));\n console.log(chalk.red('│') + center(chalk.red.bold('✗ Verification Failed'), width, 21) + chalk.red('│'));\n console.log(chalk.red('├' + hr + '┤'));\n\n if (result.error) {\n console.log(chalk.red('│') + padLine(` ${result.error}`, width) + chalk.red('│'));\n }\n\n console.log(chalk.red('└' + hr + '┘'));\n }\n console.log();\n}\n\nexport function printVerifyResultJSON(result: VerificationResult): void {\n console.log(JSON.stringify(result, null, 2));\n}\n\nexport function printStatus(config: TetherConfig, keyExists: boolean): void {\n console.log();\n console.log(chalk.bold(' Tether Configuration'));\n console.log(chalk.dim(' ' + '─'.repeat(30)));\n console.log(` Credential: ${config.credentialId ? maskId(config.credentialId) : chalk.dim('(not set)')}`);\n console.log(` Key path: ${config.keyPath || chalk.dim('(not set)')}`);\n if (config.keyPath) {\n console.log(` Key exists: ${keyExists ? chalk.green('yes') : chalk.red('no')}`);\n }\n console.log(` API URL: ${config.apiUrl}`);\n console.log();\n}\n\nexport function printStatusJSON(config: TetherConfig, keyExists: boolean): void {\n console.log(JSON.stringify({\n credentialId: config.credentialId ? maskId(config.credentialId) : null,\n keyPath: config.keyPath || null,\n keyExists,\n apiUrl: config.apiUrl,\n }, null, 2));\n}\n\nexport function printError(message: string): void {\n console.error(chalk.red(`Error: ${message}`));\n}\n\nexport function printVerbose(message: string, verbose: boolean): void {\n if (verbose) {\n console.error(chalk.dim(`[debug] ${message}`));\n }\n}\n\nexport const BANNER = `\n ╔╦╗╔═╗╔╦╗╦ ╦╔═╗╦═╗\n ║ ║╣ ║ ╠═╣║╣ ╠╦╝\n ╩ ╚═╝ ╩ ╩ ╩╚═╝╩╚═\n`;\n\nfunction padLine(text: string, width: number): string {\n const visible = stripAnsi(text);\n const pad = width - visible.length;\n return text + ' '.repeat(Math.max(0, pad));\n}\n\nfunction center(text: string, width: number, visibleLength: number): string {\n const leftPad = Math.floor((width - visibleLength) / 2);\n const rightPad = width - visibleLength - leftPad;\n return ' '.repeat(leftPad) + text + ' '.repeat(rightPad);\n}\n\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\nfunction formatDate(iso: string): string {\n try {\n return new Date(iso).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n } catch {\n return iso;\n }\n}\n","import { createInterface } from 'readline';\nimport { generateKeyPairSync } from 'crypto';\nimport { writeFileSync, existsSync } from 'fs';\nimport { resolve } from 'path';\nimport chalk from 'chalk';\nimport { saveConfig, getConfigPath } from '../config.js';\n\nfunction prompt(rl: ReturnType<typeof createInterface>, question: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(question, (answer) => resolve(answer.trim()));\n });\n}\n\nexport async function initCommand(opts: { verbose?: boolean }): Promise<void> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n\n try {\n console.log();\n console.log(chalk.bold(' Tether Setup'));\n console.log(chalk.dim(' ' + '─'.repeat(30)));\n console.log();\n\n // Credential ID\n const envCredential = process.env.TETHER_CREDENTIAL_ID;\n let credentialId: string;\n if (envCredential) {\n console.log(chalk.dim(` Using TETHER_CREDENTIAL_ID from environment`));\n credentialId = envCredential;\n } else {\n credentialId = await prompt(rl, ' Credential ID: ');\n }\n\n if (!credentialId) {\n console.log(chalk.red('\\n Credential ID is required.'));\n return;\n }\n\n // Private key\n const envKeyPath = process.env.TETHER_PRIVATE_KEY_PATH;\n let keyPath: string;\n\n if (envKeyPath) {\n console.log(chalk.dim(` Using TETHER_PRIVATE_KEY_PATH from environment`));\n keyPath = envKeyPath;\n } else {\n const genAnswer = await prompt(rl, ' Generate a new RSA keypair? (y/N): ');\n\n if (genAnswer.toLowerCase() === 'y') {\n keyPath = await generateKeypair(opts.verbose);\n } else {\n keyPath = await prompt(rl, ' Path to private key: ');\n }\n }\n\n if (!keyPath) {\n console.log(chalk.red('\\n Private key path is required.'));\n return;\n }\n\n keyPath = resolve(keyPath);\n\n if (!existsSync(keyPath)) {\n console.log(chalk.yellow(`\\n Warning: Key file not found at ${keyPath}`));\n }\n\n // Save config\n saveConfig({ credentialId, keyPath });\n\n console.log();\n console.log(chalk.green(' ✓ Configuration saved to ' + getConfigPath()));\n console.log();\n } finally {\n rl.close();\n }\n}\n\nfunction generateKeypair(verbose?: boolean): string {\n const privatePath = resolve('.tether-private-key.pem');\n const publicPath = resolve('.tether-public-key.pem');\n\n if (verbose) {\n console.log(chalk.dim(` [debug] Generating RSA-2048 keypair...`));\n }\n\n const { publicKey, privateKey } = generateKeyPairSync('rsa', {\n modulusLength: 2048,\n publicKeyEncoding: { type: 'spki', format: 'pem' },\n privateKeyEncoding: { type: 'pkcs1', format: 'pem' },\n });\n\n writeFileSync(privatePath, privateKey, { mode: 0o600 });\n writeFileSync(publicPath, publicKey);\n\n console.log(chalk.green(` ✓ Private key: ${privatePath}`));\n console.log(chalk.green(` ✓ Public key: ${publicPath}`));\n console.log();\n console.log(chalk.dim(' Upload the public key to tether.name to complete registration.'));\n\n return privatePath;\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\n\nexport interface TetherConfig {\n credentialId: string;\n keyPath: string;\n apiUrl: string;\n apiKey: string;\n}\n\nexport interface CLIFlags {\n credentialId?: string;\n keyPath?: string;\n apiUrl?: string;\n apiKey?: string;\n}\n\nconst CONFIG_DIR = join(homedir(), '.tether');\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.json');\nconst DEFAULT_API_URL = 'https://api.tether.name';\n\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\nexport function loadConfigFile(): Partial<TetherConfig> {\n try {\n if (!existsSync(CONFIG_FILE)) {\n return {};\n }\n const raw = readFileSync(CONFIG_FILE, 'utf-8');\n return JSON.parse(raw);\n } catch {\n return {};\n }\n}\n\nexport function saveConfig(config: Partial<TetherConfig>): void {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + '\\n', 'utf-8');\n}\n\nexport function resolveConfig(flags: CLIFlags = {}): TetherConfig {\n const file = loadConfigFile();\n\n return {\n credentialId:\n flags.credentialId ||\n process.env.TETHER_CREDENTIAL_ID ||\n file.credentialId ||\n '',\n keyPath:\n flags.keyPath ||\n process.env.TETHER_PRIVATE_KEY_PATH ||\n file.keyPath ||\n '',\n apiUrl:\n flags.apiUrl ||\n process.env.TETHER_API_URL ||\n file.apiUrl ||\n DEFAULT_API_URL,\n apiKey:\n flags.apiKey ||\n process.env.TETHER_API_KEY ||\n file.apiKey ||\n '',\n };\n}\n","import { TetherClient } from 'tether-name';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printVerifyResult, printVerifyResultJSON, printError, printVerbose } from '../utils/display.js';\n\nexport async function verifyCommand(opts: CLIFlags & { json?: boolean; verbose?: boolean }): Promise<void> {\n const config = resolveConfig(opts);\n\n if (!config.credentialId) {\n printError('No credential ID configured. Run \"tether init\" or set TETHER_CREDENTIAL_ID.');\n process.exitCode = 1;\n return;\n }\n\n if (!config.keyPath) {\n printError('No private key path configured. Run \"tether init\" or set TETHER_PRIVATE_KEY_PATH.');\n process.exitCode = 1;\n return;\n }\n\n const verbose = opts.verbose ?? false;\n\n try {\n printVerbose(`Credential ID: ${config.credentialId}`, verbose);\n printVerbose(`Key path: ${config.keyPath}`, verbose);\n printVerbose(`API URL: ${config.apiUrl}`, verbose);\n\n const client = new TetherClient({\n credentialId: config.credentialId,\n privateKeyPath: config.keyPath,\n baseUrl: config.apiUrl,\n });\n\n printVerbose('Requesting challenge...', verbose);\n const challenge = await client.requestChallenge();\n printVerbose(`Challenge: ${challenge}`, verbose);\n\n printVerbose('Signing challenge...', verbose);\n const proof = client.sign(challenge);\n printVerbose(`Proof: ${proof.slice(0, 32)}...`, verbose);\n\n printVerbose('Submitting proof...', verbose);\n const result = await client.submitProof(challenge, proof);\n\n if (opts.json) {\n printVerifyResultJSON(result);\n } else {\n printVerifyResult(result);\n }\n\n if (!result.verified) {\n process.exitCode = 1;\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (opts.json) {\n console.log(JSON.stringify({ verified: false, error: message }, null, 2));\n } else {\n printError(message);\n }\n process.exitCode = 1;\n }\n}\n","import { existsSync } from 'fs';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printStatus, printStatusJSON } from '../utils/display.js';\n\nexport function statusCommand(opts: CLIFlags & { json?: boolean }): void {\n const config = resolveConfig(opts);\n const keyExists = config.keyPath ? existsSync(config.keyPath) : false;\n\n if (opts.json) {\n printStatusJSON(config, keyExists);\n } else {\n printStatus(config, keyExists);\n }\n}\n","import { TetherClient } from 'tether-name';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printError, printVerbose } from '../utils/display.js';\n\nexport async function challengeCommand(opts: CLIFlags & { verbose?: boolean }): Promise<void> {\n const config = resolveConfig(opts);\n\n if (!config.credentialId) {\n printError('No credential ID configured. Run \"tether init\" or set TETHER_CREDENTIAL_ID.');\n process.exitCode = 1;\n return;\n }\n\n if (!config.keyPath) {\n printError('No private key path configured. Run \"tether init\" or set TETHER_PRIVATE_KEY_PATH.');\n process.exitCode = 1;\n return;\n }\n\n try {\n printVerbose(`API URL: ${config.apiUrl}`, opts.verbose ?? false);\n\n const client = new TetherClient({\n credentialId: config.credentialId,\n privateKeyPath: config.keyPath,\n baseUrl: config.apiUrl,\n });\n\n const code = await client.requestChallenge();\n console.log(code);\n } catch (err) {\n printError(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n}\n","import { loadPrivateKey, signChallenge } from 'tether-name';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printError, printVerbose } from '../utils/display.js';\n\nexport function signCommand(challenge: string, opts: CLIFlags & { verbose?: boolean }): void {\n const config = resolveConfig(opts);\n\n if (!config.keyPath) {\n printError('No private key path configured. Run \"tether init\" or set TETHER_PRIVATE_KEY_PATH.');\n process.exitCode = 1;\n return;\n }\n\n try {\n printVerbose(`Key path: ${config.keyPath}`, opts.verbose ?? false);\n\n const privateKey = loadPrivateKey({ keyPath: config.keyPath });\n const proof = signChallenge(privateKey, challenge);\n console.log(proof);\n } catch (err) {\n printError(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n}\n","import chalk from 'chalk';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printError, printVerbose } from '../utils/display.js';\n\ninterface ChallengeStatusResponse {\n code: string;\n status: string;\n credentialId?: string;\n createdAt?: string;\n verifiedAt?: string;\n [key: string]: unknown;\n}\n\nexport async function checkCommand(\n code: string,\n opts: CLIFlags & { json?: boolean; verbose?: boolean },\n): Promise<void> {\n const config = resolveConfig(opts);\n const baseUrl = config.apiUrl;\n const verbose = opts.verbose ?? false;\n\n try {\n const url = `${baseUrl}/challenge/${encodeURIComponent(code)}`;\n printVerbose(`GET ${url}`, verbose);\n\n const response = await fetch(url, {\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n printError(`API returned ${response.status}: ${text || response.statusText}`);\n process.exitCode = 1;\n return;\n }\n\n const data = (await response.json()) as ChallengeStatusResponse;\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log();\n console.log(chalk.bold(' Challenge Status'));\n console.log(chalk.dim(' ' + '─'.repeat(30)));\n console.log(` Code: ${data.code}`);\n console.log(` Status: ${data.status}`);\n if (data.createdAt) {\n console.log(` Created: ${data.createdAt}`);\n }\n if (data.verifiedAt) {\n console.log(` Verified: ${data.verifiedAt}`);\n }\n console.log();\n }\n } catch (err) {\n printError(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n }\n}\n","import chalk from 'chalk';\nimport { TetherClient } from 'tether-name';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printError, printVerbose } from '../utils/display.js';\n\nexport async function agentCreateCommand(\n name: string,\n opts: CLIFlags & { description?: string; json?: boolean; verbose?: boolean },\n): Promise<void> {\n const config = resolveConfig(opts);\n\n if (!config.apiKey) {\n printError('No API key configured. Set TETHER_API_KEY or pass --api-key.');\n process.exitCode = 1;\n return;\n }\n\n const verbose = opts.verbose ?? false;\n\n try {\n printVerbose(`API URL: ${config.apiUrl}`, verbose);\n printVerbose(`Creating agent \"${name}\"...`, verbose);\n\n const client = new TetherClient({\n apiKey: config.apiKey,\n baseUrl: config.apiUrl,\n });\n\n const agent = await client.createAgent(name, opts.description || '');\n\n if (opts.json) {\n console.log(JSON.stringify(agent, null, 2));\n } else {\n console.log();\n console.log(chalk.green.bold(' ✓ Agent created'));\n console.log(chalk.dim(' ' + '─'.repeat(40)));\n console.log(` ID: ${agent.id}`);\n console.log(` Name: ${agent.agentName}`);\n if (agent.description) {\n console.log(` Description: ${agent.description}`);\n }\n console.log(` Registration Token: ${chalk.yellow(agent.registrationToken)}`);\n console.log();\n console.log(chalk.dim(' Save the registration token — it cannot be retrieved later.'));\n console.log();\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (opts.json) {\n console.log(JSON.stringify({ error: message }, null, 2));\n } else {\n printError(message);\n }\n process.exitCode = 1;\n }\n}\n","import chalk from 'chalk';\nimport { TetherClient } from 'tether-name';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printError, printVerbose } from '../utils/display.js';\n\nexport async function agentListCommand(\n opts: CLIFlags & { json?: boolean; verbose?: boolean },\n): Promise<void> {\n const config = resolveConfig(opts);\n\n if (!config.apiKey) {\n printError('No API key configured. Set TETHER_API_KEY or pass --api-key.');\n process.exitCode = 1;\n return;\n }\n\n const verbose = opts.verbose ?? false;\n\n try {\n printVerbose(`API URL: ${config.apiUrl}`, verbose);\n printVerbose('Listing agents...', verbose);\n\n const client = new TetherClient({\n apiKey: config.apiKey,\n baseUrl: config.apiUrl,\n });\n\n const agents = await client.listAgents();\n\n if (opts.json) {\n console.log(JSON.stringify(agents, null, 2));\n } else if (agents.length === 0) {\n console.log();\n console.log(chalk.dim(' No agents found.'));\n console.log();\n } else {\n console.log();\n console.log(chalk.bold(` Agents (${agents.length})`));\n console.log(chalk.dim(' ' + '─'.repeat(40)));\n for (const agent of agents) {\n const date = formatDate(agent.createdAt);\n console.log(` ${chalk.cyan(agent.agentName)} ${chalk.dim(`(${agent.id})`)}`);\n if (agent.description) {\n console.log(` ${agent.description}`);\n }\n console.log(` Created: ${date}`);\n if (agent.lastVerifiedAt) {\n console.log(` Last verified: ${formatDate(agent.lastVerifiedAt)}`);\n }\n console.log();\n }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (opts.json) {\n console.log(JSON.stringify({ error: message }, null, 2));\n } else {\n printError(message);\n }\n process.exitCode = 1;\n }\n}\n\nfunction formatDate(ts: number): string {\n try {\n return new Date(ts).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n } catch {\n return String(ts);\n }\n}\n","import chalk from 'chalk';\nimport { TetherClient } from 'tether-name';\nimport { resolveConfig, type CLIFlags } from '../config.js';\nimport { printError, printVerbose } from '../utils/display.js';\n\nexport async function agentDeleteCommand(\n id: string,\n opts: CLIFlags & { json?: boolean; verbose?: boolean },\n): Promise<void> {\n const config = resolveConfig(opts);\n\n if (!config.apiKey) {\n printError('No API key configured. Set TETHER_API_KEY or pass --api-key.');\n process.exitCode = 1;\n return;\n }\n\n const verbose = opts.verbose ?? false;\n\n try {\n printVerbose(`API URL: ${config.apiUrl}`, verbose);\n printVerbose(`Deleting agent ${id}...`, verbose);\n\n const client = new TetherClient({\n apiKey: config.apiKey,\n baseUrl: config.apiUrl,\n });\n\n await client.deleteAgent(id);\n\n if (opts.json) {\n console.log(JSON.stringify({ deleted: true, id }, null, 2));\n } else {\n console.log();\n console.log(chalk.green.bold(' ✓ Agent deleted'));\n console.log(chalk.dim(` ID: ${id}`));\n console.log();\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (opts.json) {\n console.log(JSON.stringify({ error: message }, null, 2));\n } else {\n printError(message);\n }\n process.exitCode = 1;\n }\n}\n"],"mappings":"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","names":["chalk","writeFileSync","existsSync","chalk","resolve","chalk","existsSync","writeFileSync","existsSync","existsSync","TetherClient","TetherClient","chalk","chalk","chalk","TetherClient","TetherClient","agent","chalk","chalk","TetherClient","TetherClient","chalk","agent","formatDate","chalk","TetherClient","TetherClient","chalk","chalk"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tether-name-cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "CLI for tether.name - AI agent identity verification",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"ai",
|
|
27
27
|
"cli"
|
|
28
28
|
],
|
|
29
|
-
"author": "Commit 451
|
|
29
|
+
"author": "Commit 451",
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"homepage": "https://tether.name",
|
|
32
32
|
"repository": {
|
|
@@ -37,12 +37,12 @@
|
|
|
37
37
|
"url": "https://github.com/tether-name/tether-name-cli/issues"
|
|
38
38
|
},
|
|
39
39
|
"engines": {
|
|
40
|
-
"node": ">=
|
|
40
|
+
"node": ">=20.0.0"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"chalk": "^5.4.1",
|
|
44
44
|
"commander": "^13.1.0",
|
|
45
|
-
"tether-name": "^1.0.
|
|
45
|
+
"tether-name": "^1.0.2"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@types/node": "^22.13.0",
|