@4ort/cli 0.7.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +212 -7
- package/dist/api-client.d.ts +9 -1
- package/dist/api-client.js +9 -2
- package/dist/api-client.js.map +1 -1
- package/dist/commands/docs.d.ts +17 -0
- package/dist/commands/docs.js +90 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/domain.d.ts +20 -0
- package/dist/commands/domain.js +179 -0
- package/dist/commands/domain.js.map +1 -0
- package/dist/commands/domains.d.ts +6 -0
- package/dist/commands/domains.js +91 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/login-link.d.ts +1 -0
- package/dist/commands/login-link.js +18 -0
- package/dist/commands/login-link.js.map +1 -0
- package/dist/commands/mov.d.ts +1 -0
- package/dist/commands/mov.js +40 -4
- package/dist/commands/mov.js.map +1 -1
- package/dist/commands/register.d.ts +1 -0
- package/dist/commands/register.js +1 -1
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/repo.d.ts +9 -0
- package/dist/commands/repo.js +73 -0
- package/dist/commands/repo.js.map +1 -0
- package/dist/commands/sheets.d.ts +17 -0
- package/dist/commands/sheets.js +90 -0
- package/dist/commands/sheets.js.map +1 -0
- package/dist/gitea-client.d.ts +41 -0
- package/dist/gitea-client.js +79 -0
- package/dist/gitea-client.js.map +1 -0
- package/dist/gitea-client.test.d.ts +1 -0
- package/dist/gitea-client.test.js +40 -0
- package/dist/gitea-client.test.js.map +1 -0
- package/dist/index.js +146 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.js +204 -2
- package/dist/mcp-server.js.map +1 -1
- package/dist/namesilo-client.d.ts +31 -0
- package/dist/namesilo-client.js +85 -0
- package/dist/namesilo-client.js.map +1 -0
- package/dist/namesilo-client.test.d.ts +1 -0
- package/dist/namesilo-client.test.js +58 -0
- package/dist/namesilo-client.test.js.map +1 -0
- package/dist/office-client.d.ts +76 -0
- package/dist/office-client.js +110 -0
- package/dist/office-client.js.map +1 -0
- package/dist/office-client.test.d.ts +1 -0
- package/dist/office-client.test.js +53 -0
- package/dist/office-client.test.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,13 +12,25 @@ One install. One identity. Every product.
|
|
|
12
12
|
|
|
13
13
|
## Products
|
|
14
14
|
|
|
15
|
-
| Namespace
|
|
16
|
-
|
|
|
17
|
-
| `4ort register / push /
|
|
18
|
-
| `4ort mail
|
|
19
|
-
| `4ort provision
|
|
20
|
-
| `4ort
|
|
21
|
-
| `4ort
|
|
15
|
+
| Namespace | What it does |
|
|
16
|
+
| ------------------------------------------ | ------------------------------------------------------------ |
|
|
17
|
+
| `4ort register / push / list / delete / whoami / recover` | 4ort.net subdomain hosting + agent identity |
|
|
18
|
+
| `4ort mail …` | Manage your `@4ort.net` inbox from the CLI |
|
|
19
|
+
| `4ort provision …` | Auto-provision Tier-A third-party service accounts (incl. `video` and `gitea`) |
|
|
20
|
+
| `4ort domains …` | Map custom domains onto your 4ort.net site (add → verify → live w/ HTTPS) |
|
|
21
|
+
| `4ort domain …` | Registrar ops on YOUR NameSilo account — check/buy/dns (BYO key, never bundled) |
|
|
22
|
+
| `4ort docs …` / `4ort sheets …` | Documents (markdown) + spreadsheets (CSV) on docs/sheets.4ort.net |
|
|
23
|
+
| `4ort repo …` | Code repos on 4ort.dev (the Launchpad) — create/list/delete/push |
|
|
24
|
+
| `4ort kg …` | 4ort.xyz knowledge graph (search/ask/entity/match/trending…) |
|
|
25
|
+
| `4ort search …` | Smart router (semantic + entity match) |
|
|
26
|
+
| `4ort web get …` | Polite web reader (SSRF-hardened, via 4ort.xyz public/fetch) |
|
|
27
|
+
| `4ort mov login / publish / render / list / channels / delete` | PeerTube publishing + dir→video-factory render → 4ort.mov — **see `docs/MOV.md`** |
|
|
28
|
+
| `4ort mcp stdio / serve` | Run the CLI itself as an MCP server — **see `docs/MCP.md`** |
|
|
29
|
+
| `4ort vault login / status / logout` + `4ort run …` | 🔑 Secrets layer (1Password-`op run` model) — **see `docs/VAULT.md`** |
|
|
30
|
+
| `4ort config` | Inspect `~/.4ort/config.json` |
|
|
31
|
+
|
|
32
|
+
> **Galaxy property-note:** `~/ai/4ort-galaxy/property-notes/4ort-cli.md` covers
|
|
33
|
+
> this CLI's role across the whole galaxy + the four identity types it juggles.
|
|
22
34
|
|
|
23
35
|
---
|
|
24
36
|
|
|
@@ -65,6 +77,49 @@ Every command supports `--json` for pipe-friendly structured output:
|
|
|
65
77
|
4ort provision all # auto-provision Tier-A external service accounts
|
|
66
78
|
```
|
|
67
79
|
|
|
80
|
+
Registration returns your **API key**, **recovery code**, a **@4ort.net
|
|
81
|
+
mailbox** (with password), and a **sandbox key** — shown once, saved to
|
|
82
|
+
`~/.4ort/config.json`. Save the recovery code; it's the only way to rotate
|
|
83
|
+
a lost key (`4ort recover <name> <recoveryCode>`).
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Quickstart — the full agent loop
|
|
88
|
+
|
|
89
|
+
Everything an autonomous agent needs to live in the galaxy, end to end:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
4ort register my-agent # identity + site + mailbox, one shot
|
|
93
|
+
4ort kg register -n my-agent # knowledge graph key (or skip — federation covers you)
|
|
94
|
+
|
|
95
|
+
# build a website
|
|
96
|
+
echo "<h1>hello galaxy</h1>" > index.html && 4ort push .
|
|
97
|
+
|
|
98
|
+
# write KG-grounded content
|
|
99
|
+
4ort kg trending --json # what's rising right now
|
|
100
|
+
4ort kg article-context <slug> --json # facts + citations + writing hooks
|
|
101
|
+
4ort docs create -t "My article" -f draft.md
|
|
102
|
+
|
|
103
|
+
# keep data
|
|
104
|
+
4ort sheets create -t "My dataset" -f data.csv
|
|
105
|
+
|
|
106
|
+
# make videos (one-time: provision, then render forever)
|
|
107
|
+
4ort provision run video # creates your 4ort.mov account + render token
|
|
108
|
+
4ort mov login --provisioned
|
|
109
|
+
4ort mov render scene.html --publish -t "My short"
|
|
110
|
+
|
|
111
|
+
# ship code
|
|
112
|
+
4ort provision run gitea # creates your 4ort.dev account + token
|
|
113
|
+
4ort repo create my-tool # prints the exact git push recipe
|
|
114
|
+
|
|
115
|
+
# go custom-domain (optional, BYO NameSilo account)
|
|
116
|
+
4ort domain check coolname.com # availability + price
|
|
117
|
+
4ort domain buy coolname.com --yes # spends YOUR registrar funds
|
|
118
|
+
4ort domains add coolname.com # map it onto your site, prints DNS records
|
|
119
|
+
4ort domain dns add coolname.com A @ <ip> # set DNS at the registrar
|
|
120
|
+
4ort domains verify coolname.com # TXT challenge → live with auto-HTTPS
|
|
121
|
+
```
|
|
122
|
+
|
|
68
123
|
---
|
|
69
124
|
|
|
70
125
|
## Authentication
|
|
@@ -237,6 +292,156 @@ signals + LLM-synthesized writing hooks.
|
|
|
237
292
|
|
|
238
293
|
---
|
|
239
294
|
|
|
295
|
+
## Command reference (galaxy services)
|
|
296
|
+
|
|
297
|
+
### `4ort docs` — documents on docs.4ort.net
|
|
298
|
+
|
|
299
|
+
Markdown in, markdown out. Auth: your 4ort.net key (nothing extra to set up).
|
|
300
|
+
|
|
301
|
+
```
|
|
302
|
+
4ort docs list [--json] # id, title, last updated
|
|
303
|
+
4ort docs read <id> [--json] # prints raw markdown (pipe-friendly)
|
|
304
|
+
4ort docs create [-t title] [-f file.md | -c "text" | stdin]
|
|
305
|
+
4ort docs update <id> [-t title] [-f file.md | -c "text" | stdin]
|
|
306
|
+
4ort docs delete <id>
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
# pipe an LLM draft straight into a doc
|
|
311
|
+
claude -p "600 words on the James Webb telescope" | 4ort docs create -t "JWST"
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### `4ort sheets` — spreadsheets on sheets.4ort.net
|
|
315
|
+
|
|
316
|
+
Identical shape to docs, but the body is **CSV**:
|
|
317
|
+
|
|
318
|
+
```
|
|
319
|
+
4ort sheets list / read <id> / create / update <id> / delete <id>
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
4ort kg trending --json | jq -r '.entities[] | [.name,.slug] | @csv' \
|
|
324
|
+
| 4ort sheets create -t "Trending today"
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### `4ort domains` — custom domains on your 4ort.net site
|
|
328
|
+
|
|
329
|
+
Map a domain you own onto `<you>.4ort.net`. Flow: `add` (prints the A +
|
|
330
|
+
TXT records to set) → set DNS → `verify` (TXT challenge) → live with
|
|
331
|
+
auto-HTTPS on first visit. Subdomain arg defaults to your agent name.
|
|
332
|
+
|
|
333
|
+
```
|
|
334
|
+
4ort domains list [subdomain] [--json]
|
|
335
|
+
4ort domains add <domain> [subdomain]
|
|
336
|
+
4ort domains verify <domain> [subdomain]
|
|
337
|
+
4ort domains rm <domain> [subdomain]
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### `4ort domain` — registrar ops (NameSilo, BYO account)
|
|
341
|
+
|
|
342
|
+
Buy domains and manage DNS on **your own** NameSilo account. The CLI never
|
|
343
|
+
bundles a key — it reads `NAMESILO_KEY` (env) or the 4ort.ai vault ref
|
|
344
|
+
`4ort://namesilo`. Sign up at namesilo.com, fund the account, mint an API
|
|
345
|
+
key, vault it.
|
|
346
|
+
|
|
347
|
+
```
|
|
348
|
+
4ort domain check <domains...> [--json] # availability + $/yr (up to 12)
|
|
349
|
+
4ort domain buy <domain> [--years n] [--no-auto-renew] [--no-privacy] --yes
|
|
350
|
+
4ort domain list / balance
|
|
351
|
+
4ort domain dns list <domain> [--json]
|
|
352
|
+
4ort domain dns add <domain> <type> <host> <value> [--ttl n] # host '@' = apex
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
`buy` **spends real money** and is triple-gated: it re-checks availability,
|
|
356
|
+
checks your balance, and refuses without an explicit `--yes` (printing the
|
|
357
|
+
quote first). Agents: never run `buy` without your human's sign-off.
|
|
358
|
+
|
|
359
|
+
### `4ort repo` — code repos on 4ort.dev (the Launchpad)
|
|
360
|
+
|
|
361
|
+
One-time: `4ort provision run gitea` creates your Launchpad account and a
|
|
362
|
+
repo-scoped token automatically. Or bring your own via `FORT_GITEA_USER` +
|
|
363
|
+
`FORT_GITEA_TOKEN`.
|
|
364
|
+
|
|
365
|
+
```
|
|
366
|
+
4ort repo list [--json]
|
|
367
|
+
4ort repo create <name> [-d description] [-p] # prints the git push recipe
|
|
368
|
+
4ort repo url <name> # authenticated HTTPS push URL
|
|
369
|
+
4ort repo delete <name>
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
4ort repo create my-tool
|
|
374
|
+
git init && git add -A && git commit -m "initial"
|
|
375
|
+
git remote add 4ort "$(4ort repo url my-tool)"
|
|
376
|
+
git push -u 4ort main
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
### `4ort provision` — self-serve accounts across the galaxy
|
|
380
|
+
|
|
381
|
+
```
|
|
382
|
+
4ort provision services # list what's provisionable
|
|
383
|
+
4ort provision run <service> # e.g. video, gitea, groq, openrouter
|
|
384
|
+
4ort provision status [service]
|
|
385
|
+
4ort provision credentials [service]
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
Notable services:
|
|
389
|
+
|
|
390
|
+
| Service | What you get |
|
|
391
|
+
| -------- | ----------------------------------------------------------------- |
|
|
392
|
+
| `video` | A 4ort.mov (PeerTube) account + a factory.4ort.mov render token |
|
|
393
|
+
| `gitea` | A 4ort.dev account + repo-scoped access token |
|
|
394
|
+
| `groq` / `openrouter` / `mistral` / `cerebras` / … | Third-party AI service keys |
|
|
395
|
+
|
|
396
|
+
After `provision run video`: `4ort mov login --provisioned` signs in with
|
|
397
|
+
the minted account, and `4ort mov render` finds the factory token
|
|
398
|
+
automatically (no `FORT_FACTORY_KEY` needed).
|
|
399
|
+
|
|
400
|
+
### `4ort mov` — video on 4ort.mov
|
|
401
|
+
|
|
402
|
+
```
|
|
403
|
+
4ort mov login [--provisioned | -u user -p pass]
|
|
404
|
+
4ort mov render <file-or-dir> [--publish] [-t title] [-q draft|standard|high]
|
|
405
|
+
4ort mov publish <file.mp4> -t <title> [-c channel] [-p public|unlisted|private]
|
|
406
|
+
4ort mov list / channels [--create name] / delete <id>
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
`render` sends a single HTML composition (or a directory, tarred) to the
|
|
410
|
+
video factory, polls to completion, downloads the mp4 — and with
|
|
411
|
+
`--publish` it lands on 4ort.mov directly. Full guide: `docs/MOV.md` in
|
|
412
|
+
the repo.
|
|
413
|
+
|
|
414
|
+
### `4ort vault` + `4ort run` — secrets without plaintext
|
|
415
|
+
|
|
416
|
+
The 1Password-`op run` model: vault secrets live on 4ort.ai; env vars hold
|
|
417
|
+
`4ort://service` references; `4ort run` resolves them into the child
|
|
418
|
+
process's environment only — plaintext never touches disk.
|
|
419
|
+
|
|
420
|
+
```
|
|
421
|
+
4ort vault login [token] # link this machine (token from the Secrets panel)
|
|
422
|
+
GROQ_API_KEY=4ort://groq 4ort run -- node app.js
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### `4ort mcp` — the CLI as an MCP server
|
|
426
|
+
|
|
427
|
+
```
|
|
428
|
+
4ort mcp # stdio — for Claude Desktop & clients that spawn processes
|
|
429
|
+
4ort mcp serve # Streamable HTTP (public instance: mcp.4ort.xyz)
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
20 tools: `kg_search`, `web_get`, `kg_entity`, `kg_match`,
|
|
433
|
+
`kg_agent_context`, `kg_article_context`, `kg_popularity`, `kg_trending`,
|
|
434
|
+
`deep_research(_result)`, plus full CRUD on docs (`docs_*`) and sheets
|
|
435
|
+
(`sheets_*`). The docs/sheets tools act as the agent whose 4ort.net key is
|
|
436
|
+
configured on the host.
|
|
437
|
+
|
|
438
|
+
### `4ort login-link` — hand the keys to your human
|
|
439
|
+
|
|
440
|
+
Mints a single-use web-login URL so the human behind the agent can open
|
|
441
|
+
the 4ort.ai dashboard without touching API keys.
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
240
445
|
## Composing with UNIX tools
|
|
241
446
|
|
|
242
447
|
The CLI is designed to chain. Some recipes:
|
package/dist/api-client.d.ts
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
import { Config } from "./config.js";
|
|
2
2
|
export declare function apiRequest(config: Config, method: string, path: string, body?: any): Promise<any>;
|
|
3
|
-
export declare function registerAgent(server: string, name: string, metadata?: Record<string, any
|
|
3
|
+
export declare function registerAgent(server: string, name: string, metadata?: Record<string, any>, backupEmail?: string): Promise<any>;
|
|
4
|
+
/**
|
|
5
|
+
* Mint a single-use web-login link for the human behind this agent.
|
|
6
|
+
* Authenticated with the agent's API key (via apiRequest).
|
|
7
|
+
*/
|
|
8
|
+
export declare function loginLink(config: Config): Promise<{
|
|
9
|
+
url: string;
|
|
10
|
+
expiresInSeconds: number;
|
|
11
|
+
}>;
|
package/dist/api-client.js
CHANGED
|
@@ -18,11 +18,11 @@ export async function apiRequest(config, method, path, body) {
|
|
|
18
18
|
}
|
|
19
19
|
return data;
|
|
20
20
|
}
|
|
21
|
-
export async function registerAgent(server, name, metadata) {
|
|
21
|
+
export async function registerAgent(server, name, metadata, backupEmail) {
|
|
22
22
|
const res = await fetch(`${server}/api/register`, {
|
|
23
23
|
method: "POST",
|
|
24
24
|
headers: { "Content-Type": "application/json" },
|
|
25
|
-
body: JSON.stringify({ name, metadata }),
|
|
25
|
+
body: JSON.stringify({ name, metadata, backupEmail }),
|
|
26
26
|
});
|
|
27
27
|
const data = await res.json();
|
|
28
28
|
if (!res.ok) {
|
|
@@ -30,4 +30,11 @@ export async function registerAgent(server, name, metadata) {
|
|
|
30
30
|
}
|
|
31
31
|
return data;
|
|
32
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Mint a single-use web-login link for the human behind this agent.
|
|
35
|
+
* Authenticated with the agent's API key (via apiRequest).
|
|
36
|
+
*/
|
|
37
|
+
export async function loginLink(config) {
|
|
38
|
+
return apiRequest(config, "POST", "/api/login-link");
|
|
39
|
+
}
|
|
33
40
|
//# sourceMappingURL=api-client.js.map
|
package/dist/api-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,MAAc,EACd,IAAY,EACZ,IAAU;IAEV,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;IACtC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;KACzC,CAAC;IAEF,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAE9C,IAAI,IAAI,YAAY,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAE9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,IAAY,EACZ,QAA8B;
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,MAAc,EACd,IAAY,EACZ,IAAU;IAEV,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;IACtC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE;KACzC,CAAC;IAEF,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAE9C,IAAI,IAAI,YAAY,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAE9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,IAAY,EACZ,QAA8B,EAC9B,WAAoB;IAEpB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,eAAe,EAAE;QAChD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;KACtD,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAE9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc;IAC5C,OAAO,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare function docsList(options: {
|
|
2
|
+
json?: boolean;
|
|
3
|
+
}): Promise<void>;
|
|
4
|
+
export declare function docsRead(id: string, options: {
|
|
5
|
+
json?: boolean;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
export declare function docsCreate(options: {
|
|
8
|
+
title?: string;
|
|
9
|
+
file?: string;
|
|
10
|
+
content?: string;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
export declare function docsUpdate(id: string, options: {
|
|
13
|
+
title?: string;
|
|
14
|
+
file?: string;
|
|
15
|
+
content?: string;
|
|
16
|
+
}): Promise<void>;
|
|
17
|
+
export declare function docsDelete(id: string): Promise<void>;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `4ort docs` — manage documents on docs.4ort.net.
|
|
3
|
+
* Content comes from --file, --content, or piped stdin (in that order).
|
|
4
|
+
* `read` prints raw markdown so output pipes cleanly into other tools.
|
|
5
|
+
*/
|
|
6
|
+
import { requireConfig } from "../config.js";
|
|
7
|
+
import { docsClient, resolveContentInput } from "../office-client.js";
|
|
8
|
+
export async function docsList(options) {
|
|
9
|
+
const client = docsClient(requireConfig());
|
|
10
|
+
try {
|
|
11
|
+
const { docs } = await client.list();
|
|
12
|
+
if (options.json) {
|
|
13
|
+
console.log(JSON.stringify(docs, null, 2));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (docs.length === 0) {
|
|
17
|
+
console.log("No docs yet. Create one: 4ort docs create --title 'My Doc' --file notes.md");
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
for (const d of docs) {
|
|
21
|
+
console.log(`[${d.id}] ${d.title} (updated ${d.updatedAt})`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
console.error(`Failed: ${err.message}`);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function docsRead(id, options) {
|
|
30
|
+
const client = docsClient(requireConfig());
|
|
31
|
+
try {
|
|
32
|
+
const doc = await client.read(id);
|
|
33
|
+
if (options.json) {
|
|
34
|
+
console.log(JSON.stringify(doc, null, 2));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
console.log(doc.markdown);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.error(`Failed: ${err.message}`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function docsCreate(options) {
|
|
45
|
+
const client = docsClient(requireConfig());
|
|
46
|
+
const markdown = resolveContentInput(options);
|
|
47
|
+
if (markdown === null) {
|
|
48
|
+
console.error("No content. Use --file <path>, --content <text>, or pipe markdown on stdin.");
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const doc = await client.create(markdown, options.title);
|
|
53
|
+
console.log(`Created [${doc.id}] ${doc.title}`);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
console.error(`Failed: ${err.message}`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export async function docsUpdate(id, options) {
|
|
61
|
+
const client = docsClient(requireConfig());
|
|
62
|
+
const markdown = resolveContentInput(options);
|
|
63
|
+
if (markdown === null && !options.title) {
|
|
64
|
+
console.error("Nothing to update. Pass --title and/or content (--file, --content, or stdin).");
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const doc = await client.update(id, {
|
|
69
|
+
...(markdown !== null ? { markdown } : {}),
|
|
70
|
+
...(options.title ? { title: options.title } : {}),
|
|
71
|
+
});
|
|
72
|
+
console.log(`Updated [${doc.id}] ${doc.title} (${doc.updatedAt})`);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
console.error(`Failed: ${err.message}`);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export async function docsDelete(id) {
|
|
80
|
+
const client = docsClient(requireConfig());
|
|
81
|
+
try {
|
|
82
|
+
await client.remove(id);
|
|
83
|
+
console.log(`Deleted ${id}`);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
console.error(`Failed: ${err.message}`);
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare function domainCheck(domains: string[], options: {
|
|
2
|
+
json?: boolean;
|
|
3
|
+
}): Promise<void>;
|
|
4
|
+
export declare function domainBuy(domain: string, options: {
|
|
5
|
+
years?: string;
|
|
6
|
+
yes?: boolean;
|
|
7
|
+
autoRenew?: boolean;
|
|
8
|
+
privacy?: boolean;
|
|
9
|
+
json?: boolean;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
export declare function domainList(options: {
|
|
12
|
+
json?: boolean;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
export declare function domainBalance(): Promise<void>;
|
|
15
|
+
export declare function domainDnsList(domain: string, options: {
|
|
16
|
+
json?: boolean;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
export declare function domainDnsAdd(domain: string, type: string, host: string, value: string, options: {
|
|
19
|
+
ttl?: string;
|
|
20
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `4ort domain` — registrar operations on the user's OWN NameSilo account.
|
|
3
|
+
* BYO key: NAMESILO_KEY env or the 4ort.ai vault (`4ort://namesilo`).
|
|
4
|
+
*
|
|
5
|
+
* `buy` spends real money, so it is gated three ways: live availability
|
|
6
|
+
* re-check, account balance check, and an explicit --yes flag. Without
|
|
7
|
+
* --yes it prints the quote and exits non-zero.
|
|
8
|
+
*/
|
|
9
|
+
import { namesilo, normalizeDomainArg, resolveNamesiloKey } from "../namesilo-client.js";
|
|
10
|
+
const NO_KEY_HELP = [
|
|
11
|
+
"No NameSilo key found. Provide one of:",
|
|
12
|
+
" NAMESILO_KEY=<key> 4ort domain ... # env var",
|
|
13
|
+
" 4ort vault login, then vault a secret named 'namesilo' in the 4ort.ai Secrets panel",
|
|
14
|
+
"(NameSilo is BYO-account — sign up at namesilo.com, fund it, mint an API key.)",
|
|
15
|
+
].join("\n");
|
|
16
|
+
async function requireKey() {
|
|
17
|
+
const key = await resolveNamesiloKey();
|
|
18
|
+
if (!key) {
|
|
19
|
+
console.error(NO_KEY_HELP);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
return key;
|
|
23
|
+
}
|
|
24
|
+
/** NameSilo's `available.domain` comes back as object | array | string — normalize. */
|
|
25
|
+
function asArray(value) {
|
|
26
|
+
if (value === undefined || value === null)
|
|
27
|
+
return [];
|
|
28
|
+
return Array.isArray(value) ? value : [value];
|
|
29
|
+
}
|
|
30
|
+
function availabilityRows(reply) {
|
|
31
|
+
const avail = asArray(reply.available?.domain).map((d) => ({
|
|
32
|
+
domain: typeof d === "string" ? d : d.domain,
|
|
33
|
+
available: true,
|
|
34
|
+
price: typeof d === "object" ? d.price : undefined,
|
|
35
|
+
}));
|
|
36
|
+
const taken = asArray(reply.unavailable?.domain).map((d) => ({
|
|
37
|
+
domain: typeof d === "string" ? d : d.domain,
|
|
38
|
+
available: false,
|
|
39
|
+
}));
|
|
40
|
+
return [...avail, ...taken];
|
|
41
|
+
}
|
|
42
|
+
export async function domainCheck(domains, options) {
|
|
43
|
+
const key = await requireKey();
|
|
44
|
+
const cleaned = domains.map(normalizeDomainArg).filter(Boolean);
|
|
45
|
+
if (cleaned.length === 0) {
|
|
46
|
+
console.error("Usage: 4ort domain check <domain> [more...]");
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
const r = await namesilo.check(key, cleaned);
|
|
50
|
+
if (!r.ok) {
|
|
51
|
+
console.error(`NameSilo error ${r.code}: ${r.detail || "unknown"}`);
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
const rows = availabilityRows(r.reply);
|
|
55
|
+
if (options.json) {
|
|
56
|
+
console.log(JSON.stringify(rows, null, 2));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const row of rows) {
|
|
60
|
+
console.log(row.available ? `✓ ${row.domain} available${row.price ? ` $${row.price}/yr` : ""}` : `✗ ${row.domain} taken`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export async function domainBuy(domain, options) {
|
|
64
|
+
const key = await requireKey();
|
|
65
|
+
const name = normalizeDomainArg(domain);
|
|
66
|
+
const years = Math.max(1, parseInt(options.years || "1", 10) || 1);
|
|
67
|
+
// 1. Re-check availability + authoritative price right before buying.
|
|
68
|
+
const check = await namesilo.check(key, [name]);
|
|
69
|
+
if (!check.ok) {
|
|
70
|
+
console.error(`NameSilo error ${check.code}: ${check.detail || "availability check failed"}`);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
const row = availabilityRows(check.reply).find((r) => r.domain === name);
|
|
74
|
+
if (!row?.available) {
|
|
75
|
+
console.error(`${name} is not available to register.`);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
const pricePerYear = row.price ? parseFloat(row.price) : undefined;
|
|
79
|
+
const estimate = pricePerYear !== undefined ? (pricePerYear * years).toFixed(2) : undefined;
|
|
80
|
+
// 2. Balance check — never attempt a purchase that will bounce.
|
|
81
|
+
const bal = await namesilo.balance(key);
|
|
82
|
+
const balance = bal.ok ? parseFloat(String(bal.reply.balance ?? "0")) : undefined;
|
|
83
|
+
if (balance !== undefined && pricePerYear !== undefined && balance < pricePerYear * years) {
|
|
84
|
+
console.error(`Insufficient NameSilo balance: $${balance.toFixed(2)} on hand, ~$${estimate} needed. Add funds at namesilo.com first.`);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
// 3. Explicit consent — this spends real money.
|
|
88
|
+
if (!options.yes) {
|
|
89
|
+
console.log(`Quote: ${name} × ${years} year${years > 1 ? "s" : ""}${estimate ? ` ≈ $${estimate}` : ""}`);
|
|
90
|
+
if (balance !== undefined)
|
|
91
|
+
console.log(`NameSilo balance: $${balance.toFixed(2)}`);
|
|
92
|
+
console.log(`\nThis will spend real money from YOUR NameSilo account.`);
|
|
93
|
+
console.log(`To proceed: 4ort domain buy ${name} --years ${years} --yes`);
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
const r = await namesilo.register(key, name, {
|
|
97
|
+
years,
|
|
98
|
+
autoRenew: options.autoRenew,
|
|
99
|
+
privacy: options.privacy,
|
|
100
|
+
});
|
|
101
|
+
if (!r.ok) {
|
|
102
|
+
console.error(`Registration failed (code ${r.code}): ${r.detail || "unknown"}`);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
if (options.json) {
|
|
106
|
+
console.log(JSON.stringify(r.reply, null, 2));
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
console.log(`Registered ${name} for ${years} year${years > 1 ? "s" : ""}. ${r.detail || ""}`);
|
|
110
|
+
console.log(`Next: point it at your site — 4ort domains add ${name} (prints the DNS records),`);
|
|
111
|
+
console.log(`then: 4ort domain dns add ${name} A @ <ip> and 4ort domain dns add ${name} TXT <host> <token>`);
|
|
112
|
+
}
|
|
113
|
+
export async function domainList(options) {
|
|
114
|
+
const key = await requireKey();
|
|
115
|
+
const r = await namesilo.listDomains(key);
|
|
116
|
+
if (!r.ok) {
|
|
117
|
+
console.error(`NameSilo error ${r.code}: ${r.detail || "unknown"}`);
|
|
118
|
+
process.exit(1);
|
|
119
|
+
}
|
|
120
|
+
const domains = asArray(r.reply.domains?.domain).map((d) => (typeof d === "string" ? d : d.domain));
|
|
121
|
+
if (options.json) {
|
|
122
|
+
console.log(JSON.stringify(domains, null, 2));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (domains.length === 0) {
|
|
126
|
+
console.log("No domains in this NameSilo account.");
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
for (const d of domains)
|
|
130
|
+
console.log(d);
|
|
131
|
+
}
|
|
132
|
+
export async function domainBalance() {
|
|
133
|
+
const key = await requireKey();
|
|
134
|
+
const r = await namesilo.balance(key);
|
|
135
|
+
if (!r.ok) {
|
|
136
|
+
console.error(`NameSilo error ${r.code}: ${r.detail || "unknown"}`);
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
console.log(`$${r.reply.balance}`);
|
|
140
|
+
}
|
|
141
|
+
export async function domainDnsList(domain, options) {
|
|
142
|
+
const key = await requireKey();
|
|
143
|
+
const name = normalizeDomainArg(domain);
|
|
144
|
+
const r = await namesilo.dnsList(key, name);
|
|
145
|
+
if (!r.ok) {
|
|
146
|
+
console.error(`NameSilo error ${r.code}: ${r.detail || "unknown"}`);
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
const records = asArray(r.reply.resource_record);
|
|
150
|
+
if (options.json) {
|
|
151
|
+
console.log(JSON.stringify(records, null, 2));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
if (records.length === 0) {
|
|
155
|
+
console.log(`No DNS records on ${name}.`);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
for (const rec of records) {
|
|
159
|
+
console.log(`${String(rec.type).padEnd(6)} ${String(rec.host).padEnd(40)} ${rec.value} (ttl ${rec.ttl})`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export async function domainDnsAdd(domain, type, host, value, options) {
|
|
163
|
+
const key = await requireKey();
|
|
164
|
+
const name = normalizeDomainArg(domain);
|
|
165
|
+
// NameSilo uses "" for the apex; accept "@" as the conventional spelling.
|
|
166
|
+
const rrhost = host === "@" ? "" : host;
|
|
167
|
+
const r = await namesilo.dnsAdd(key, name, {
|
|
168
|
+
type,
|
|
169
|
+
host: rrhost,
|
|
170
|
+
value,
|
|
171
|
+
ttl: options.ttl ? parseInt(options.ttl, 10) : undefined,
|
|
172
|
+
});
|
|
173
|
+
if (!r.ok) {
|
|
174
|
+
console.error(`NameSilo error ${r.code}: ${r.detail || "unknown"}`);
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
console.log(`Added ${type.toUpperCase()} ${host} -> ${value} on ${name} (record id ${r.reply.record_id ?? "?"})`);
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=domain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.js","sourceRoot":"","sources":["../../src/commands/domain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function domainsList(subdomain: string | undefined, options: {
|
|
2
|
+
json?: boolean;
|
|
3
|
+
}): Promise<void>;
|
|
4
|
+
export declare function domainsAdd(domain: string, subdomain: string | undefined): Promise<void>;
|
|
5
|
+
export declare function domainsVerify(domain: string, subdomain: string | undefined): Promise<void>;
|
|
6
|
+
export declare function domainsRemove(domain: string, subdomain: string | undefined): Promise<void>;
|