backpack-ontology 0.7.13 → 0.8.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.
- package/README.md +123 -0
- package/dist/bin/bp.d.ts +3 -0
- package/dist/bin/bp.d.ts.map +1 -0
- package/dist/bin/bp.js +8 -0
- package/dist/bin/bp.js.map +1 -0
- package/dist/cli/colors.d.ts +23 -0
- package/dist/cli/colors.d.ts.map +1 -0
- package/dist/cli/colors.js +40 -0
- package/dist/cli/colors.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +4 -0
- package/dist/cli/commands/auth.d.ts.map +1 -0
- package/dist/cli/commands/auth.js +50 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/cat.d.ts +3 -0
- package/dist/cli/commands/cat.d.ts.map +1 -0
- package/dist/cli/commands/cat.js +31 -0
- package/dist/cli/commands/cat.js.map +1 -0
- package/dist/cli/commands/cloud-admin.d.ts +7 -0
- package/dist/cli/commands/cloud-admin.d.ts.map +1 -0
- package/dist/cli/commands/cloud-admin.js +186 -0
- package/dist/cli/commands/cloud-admin.js.map +1 -0
- package/dist/cli/commands/completion.d.ts +3 -0
- package/dist/cli/commands/completion.d.ts.map +1 -0
- package/dist/cli/commands/completion.js +159 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/containers.d.ts +3 -0
- package/dist/cli/commands/containers.d.ts.map +1 -0
- package/dist/cli/commands/containers.js +30 -0
- package/dist/cli/commands/containers.js.map +1 -0
- package/dist/cli/commands/context.d.ts +4 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +61 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +3 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +74 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/graphs.d.ts +3 -0
- package/dist/cli/commands/graphs.d.ts.map +1 -0
- package/dist/cli/commands/graphs.js +68 -0
- package/dist/cli/commands/graphs.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +56 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/kbs.d.ts +3 -0
- package/dist/cli/commands/kbs.d.ts.map +1 -0
- package/dist/cli/commands/kbs.js +258 -0
- package/dist/cli/commands/kbs.js.map +1 -0
- package/dist/cli/commands/ls.d.ts +3 -0
- package/dist/cli/commands/ls.d.ts.map +1 -0
- package/dist/cli/commands/ls.js +90 -0
- package/dist/cli/commands/ls.js.map +1 -0
- package/dist/cli/commands/mutate.d.ts +7 -0
- package/dist/cli/commands/mutate.d.ts.map +1 -0
- package/dist/cli/commands/mutate.js +268 -0
- package/dist/cli/commands/mutate.js.map +1 -0
- package/dist/cli/commands/open.d.ts +3 -0
- package/dist/cli/commands/open.d.ts.map +1 -0
- package/dist/cli/commands/open.js +59 -0
- package/dist/cli/commands/open.js.map +1 -0
- package/dist/cli/commands/search.d.ts +3 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +63 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/show.d.ts +3 -0
- package/dist/cli/commands/show.d.ts.map +1 -0
- package/dist/cli/commands/show.js +82 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/commands/version.d.ts +2 -0
- package/dist/cli/commands/version.d.ts.map +1 -0
- package/dist/cli/commands/version.js +18 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +122 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/output.d.ts +35 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +224 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/parser.d.ts +16 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +131 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/router.d.ts +2 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +147 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/cli/util/confirm.d.ts +3 -0
- package/dist/cli/util/confirm.d.ts.map +1 -0
- package/dist/cli/util/confirm.js +48 -0
- package/dist/cli/util/confirm.js.map +1 -0
- package/dist/core/backpack.d.ts +8 -0
- package/dist/core/backpack.d.ts.map +1 -1
- package/dist/core/backpack.js +32 -0
- package/dist/core/backpack.js.map +1 -1
- package/dist/mcp/tools/cloud-tools.d.ts +2 -2
- package/dist/mcp/tools/cloud-tools.d.ts.map +1 -1
- package/dist/mcp/tools/cloud-tools.js +244 -55
- package/dist/mcp/tools/cloud-tools.js.map +1 -1
- package/dist/ops/auth.d.ts +54 -0
- package/dist/ops/auth.d.ts.map +1 -0
- package/dist/ops/auth.js +181 -0
- package/dist/ops/auth.js.map +1 -0
- package/dist/ops/containers.d.ts +27 -0
- package/dist/ops/containers.d.ts.map +1 -0
- package/dist/ops/containers.js +150 -0
- package/dist/ops/containers.js.map +1 -0
- package/dist/ops/context.d.ts +51 -0
- package/dist/ops/context.d.ts.map +1 -0
- package/dist/ops/context.js +158 -0
- package/dist/ops/context.js.map +1 -0
- package/dist/ops/graphs.d.ts +69 -0
- package/dist/ops/graphs.d.ts.map +1 -0
- package/dist/ops/graphs.js +278 -0
- package/dist/ops/graphs.js.map +1 -0
- package/dist/ops/kb.d.ts +33 -0
- package/dist/ops/kb.d.ts.map +1 -0
- package/dist/ops/kb.js +176 -0
- package/dist/ops/kb.js.map +1 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -341,6 +341,129 @@ Claude always adds this metadata automatically. You never need to think about it
|
|
|
341
341
|
| `npx -p backpack-ontology@latest backpack-sync` | Upload local learning graphs to Backpack App |
|
|
342
342
|
| `npx backpack-viewer@latest` | Open the graph visualizer (http://localhost:5173). Always include `@latest` — `npx backpack-viewer` without the version suffix reuses a cached older version. |
|
|
343
343
|
| `npx -p backpack-ontology@latest backpack-init` | Remove any leftover Backpack hooks from `.claude/settings.json` |
|
|
344
|
+
| `bp` | The standalone `bp` CLI — see below |
|
|
345
|
+
|
|
346
|
+
### The `bp` CLI
|
|
347
|
+
|
|
348
|
+
`bp` is a standalone command-line interface for Backpack — the same kind of tool you reach for when you want to script against your knowledge graph, run a quick query, or pipe graph data into `jq`. Style is deliberately Unix-flavored (`bp ls`, `bp cat`, `bp rm`, `bp mv`) with a `gh`/`kubectl`-style canonical form for power users (`bp graphs list`, `bp containers create`).
|
|
349
|
+
|
|
350
|
+
Install (it ships in the same package as the MCP server):
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
npm install -g backpack-ontology
|
|
354
|
+
bp # prints a hint card with the most-used commands
|
|
355
|
+
bp help # full reference
|
|
356
|
+
bp completion zsh # tab completion for your shell (also: bash, fish)
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
#### Quick tour
|
|
360
|
+
|
|
361
|
+
```bash
|
|
362
|
+
# Where am I? Who am I?
|
|
363
|
+
bp where # current scope (local backpack or cloud container + identity)
|
|
364
|
+
bp whoami # signed-in email
|
|
365
|
+
bp doctor # auth, connectivity, version skew checks
|
|
366
|
+
|
|
367
|
+
# Sign in to Backpack App (shares the token with the viewer)
|
|
368
|
+
bp login
|
|
369
|
+
|
|
370
|
+
# Switch contexts — fuzzy matched, did-you-mean on typos
|
|
371
|
+
bp use # list available contexts
|
|
372
|
+
bp use cloud:projects # switch to a cloud container
|
|
373
|
+
bp use local:work # switch to a local backpack
|
|
374
|
+
|
|
375
|
+
# List graphs in the active scope
|
|
376
|
+
bp ls # default tabular
|
|
377
|
+
bp ls --json | jq '.graphs[] | .name' # machine-readable
|
|
378
|
+
bp ls --names # names only, one per line
|
|
379
|
+
bp ls containers # cloud sync_backpacks
|
|
380
|
+
bp ls kbs # knowledge-base docs
|
|
381
|
+
|
|
382
|
+
# Read graph data
|
|
383
|
+
bp cat agent-capability-iac > graph.json # JSON to stdout
|
|
384
|
+
bp cat agent-capability-iac | jq '.nodes | length'
|
|
385
|
+
bp show agent-capability-iac # human-friendly summary + type histogram
|
|
386
|
+
bp open agent-capability-iac # launch the viewer
|
|
387
|
+
|
|
388
|
+
# Search across visible graphs
|
|
389
|
+
bp search "transformer"
|
|
390
|
+
bp search "Sarah Chen" --names
|
|
391
|
+
bp search "pgx" --max-graphs 100 # raise the fan-out cap
|
|
392
|
+
|
|
393
|
+
# Mutations — graphs
|
|
394
|
+
bp graphs create my-new-graph --description "scratchpad"
|
|
395
|
+
bp graphs apply -f exported.json # idempotent upsert from a file
|
|
396
|
+
bp graphs edit my-new-graph # opens in $EDITOR; structural-no-op detected
|
|
397
|
+
bp graphs rename old new # or: bp mv old new
|
|
398
|
+
bp graphs delete old # or: bp rm old (asks for confirmation)
|
|
399
|
+
bp rm old --yes # skip the confirm
|
|
400
|
+
|
|
401
|
+
# KB documents
|
|
402
|
+
bp kbs list
|
|
403
|
+
bp kbs get delgate-dossier-for-aaron # body to stdout
|
|
404
|
+
bp kbs create -f notes.md --tags=alpha,beta
|
|
405
|
+
bp kbs edit delgate-dossier-for-aaron
|
|
406
|
+
bp kbs delete delgate-dossier-for-aaron
|
|
407
|
+
|
|
408
|
+
# Cloud admin (containers / sync_backpacks)
|
|
409
|
+
bp containers list
|
|
410
|
+
bp containers create client-acme --color "#7c3aed" --tags=client
|
|
411
|
+
bp containers rename client-acme client-acme-renamed
|
|
412
|
+
bp containers delete client-acme-renamed # refuses if non-empty
|
|
413
|
+
bp graphs move some-graph --to client-acme
|
|
414
|
+
bp kbs move doc-id --to client-acme
|
|
415
|
+
|
|
416
|
+
# Initialize a new local backpack root
|
|
417
|
+
mkdir -p ~/work-backpack && cd ~/work-backpack
|
|
418
|
+
bp init # registers and switches to it
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
#### Output formats
|
|
422
|
+
|
|
423
|
+
Pick one:
|
|
424
|
+
|
|
425
|
+
| Flag | Output | Stable contract? |
|
|
426
|
+
|---|---|---|
|
|
427
|
+
| (default) | human-friendly table with colors, narrows on small terminals | no — free to evolve |
|
|
428
|
+
| `--json` | full JSON | **yes** — script against this |
|
|
429
|
+
| `--yaml` | YAML | yes |
|
|
430
|
+
| `--names` | one name per line | yes |
|
|
431
|
+
| `--wide` | every column (still human) | no |
|
|
432
|
+
| `--no-color` | strip ANSI codes (also honors `NO_COLOR=1`) | n/a |
|
|
433
|
+
|
|
434
|
+
Scripts should always pipe `--json` to `jq` or use `--names`. The default human view is allowed to change between releases.
|
|
435
|
+
|
|
436
|
+
#### Exit codes
|
|
437
|
+
|
|
438
|
+
| Code | Meaning |
|
|
439
|
+
|---|---|
|
|
440
|
+
| 0 | success |
|
|
441
|
+
| 1 | failure (any kind — auth, validation, network, server error) |
|
|
442
|
+
| 130 | user-interrupted ($EDITOR session aborted with Ctrl-C) |
|
|
443
|
+
|
|
444
|
+
Destructive verbs (`rm`, `mv`, `containers delete`, `kbs delete`) prompt for confirmation in a TTY and refuse in non-TTY contexts unless you pass `-y` / `--yes`.
|
|
445
|
+
|
|
446
|
+
#### Context model
|
|
447
|
+
|
|
448
|
+
A `bp` "context" is one of:
|
|
449
|
+
|
|
450
|
+
* `local:<backpack-name>` — a directory of learning graphs on your machine
|
|
451
|
+
* `cloud:<container-name>` — a cloud sync_backpack on Backpack App
|
|
452
|
+
|
|
453
|
+
`bp where` shows your current context. `bp use <name>` switches it (fuzzy-matched against the suffix; `bp use projects` works as long as it's unambiguous, otherwise the CLI tells you the candidates and asks you to pick the full `local:foo` or `cloud:foo`).
|
|
454
|
+
|
|
455
|
+
#### Auth
|
|
456
|
+
|
|
457
|
+
`bp login` runs the OAuth flow against Backpack App. The token is stored in `~/.config/backpack/extensions/share/settings.json` — the same file the viewer's Sign In button writes to, so signing in once works for both the CLI and the viewer. `bp logout` clears every known token location and is loud if any clear fails (so you don't think you're signed out when you aren't).
|
|
458
|
+
|
|
459
|
+
#### Configuration
|
|
460
|
+
|
|
461
|
+
| Variable | Effect |
|
|
462
|
+
|---|---|
|
|
463
|
+
| `BACKPACK_APP_URL` | Override the relay endpoint (default: `https://app.backpackontology.com`) |
|
|
464
|
+
| `BACKPACK_INSECURE_RELAY=1` | Allow plaintext HTTP for the relay (only for local dev — non-localhost HTTP is refused by default) |
|
|
465
|
+
| `EDITOR` / `VISUAL` | Used by `bp graphs edit` / `bp kbs edit`. Multi-arg values like `code --wait` work. |
|
|
466
|
+
| `NO_COLOR=1` | Disable ANSI colors |
|
|
344
467
|
|
|
345
468
|
### Multiple backpacks
|
|
346
469
|
|
package/dist/bin/bp.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bp.d.ts","sourceRoot":"","sources":["../../src/bin/bp.ts"],"names":[],"mappings":""}
|
package/dist/bin/bp.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// `bp` — the Backpack CLI entry point. Thin wrapper around the router so
|
|
3
|
+
// the binary stays small and the routing logic stays unit-testable.
|
|
4
|
+
import { run } from "../cli/router.js";
|
|
5
|
+
const argv = process.argv.slice(2);
|
|
6
|
+
const exitCode = await run(argv);
|
|
7
|
+
process.exit(exitCode);
|
|
8
|
+
//# sourceMappingURL=bp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bp.js","sourceRoot":"","sources":["../../src/bin/bp.ts"],"names":[],"mappings":";AACA,yEAAyE;AACzE,oEAAoE;AAEpE,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;AACjC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare function setColorEnabled(on: boolean): void;
|
|
2
|
+
export declare function isColorEnabled(): boolean;
|
|
3
|
+
export declare const bold: (s: string) => string;
|
|
4
|
+
export declare const dim: (s: string) => string;
|
|
5
|
+
export declare const red: (s: string) => string;
|
|
6
|
+
export declare const green: (s: string) => string;
|
|
7
|
+
export declare const yellow: (s: string) => string;
|
|
8
|
+
export declare const blue: (s: string) => string;
|
|
9
|
+
export declare const magenta: (s: string) => string;
|
|
10
|
+
export declare const cyan: (s: string) => string;
|
|
11
|
+
export declare const gray: (s: string) => string;
|
|
12
|
+
/** Strip ANSI codes. Useful for measuring on-screen width. */
|
|
13
|
+
export declare function stripAnsi(s: string): string;
|
|
14
|
+
/** Visible width of a string (after stripping ANSI). Treats every code
|
|
15
|
+
* point as width 1 — fine for our usage (names, paths, counts). */
|
|
16
|
+
export declare function visibleWidth(s: string): number;
|
|
17
|
+
export declare const symbols: {
|
|
18
|
+
ok: () => string;
|
|
19
|
+
err: () => string;
|
|
20
|
+
warn: () => string;
|
|
21
|
+
bullet: () => string;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAEjD;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAMD,eAAO,MAAM,IAAI,MAHJ,MAAM,KAAG,MAGS,CAAC;AAChC,eAAO,MAAM,GAAG,MAJH,MAAM,KAAG,MAIQ,CAAC;AAC/B,eAAO,MAAM,GAAG,MALH,MAAM,KAAG,MAKS,CAAC;AAChC,eAAO,MAAM,KAAK,MANL,MAAM,KAAG,MAMW,CAAC;AAClC,eAAO,MAAM,MAAM,MAPN,MAAM,KAAG,MAOY,CAAC;AACnC,eAAO,MAAM,IAAI,MARJ,MAAM,KAAG,MAQU,CAAC;AACjC,eAAO,MAAM,OAAO,MATP,MAAM,KAAG,MASa,CAAC;AACpC,eAAO,MAAM,IAAI,MAVJ,MAAM,KAAG,MAUU,CAAC;AACjC,eAAO,MAAM,IAAI,MAXJ,MAAM,KAAG,MAWU,CAAC;AAEjC,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3C;AAED;mEACmE;AACnE,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,eAAO,MAAM,OAAO;;;;;CAKnB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// TTY-aware ANSI color helpers. Colors are stripped automatically when
|
|
2
|
+
// stdout isn't a TTY (CI, pipes) or when --no-color / NO_COLOR is set.
|
|
3
|
+
const NO_COLOR_ENV = process.env.NO_COLOR != null && process.env.NO_COLOR !== "";
|
|
4
|
+
const FORCE_COLOR_ENV = process.env.FORCE_COLOR === "1" || process.env.FORCE_COLOR === "true";
|
|
5
|
+
let colorEnabled = FORCE_COLOR_ENV || (process.stdout.isTTY === true && !NO_COLOR_ENV);
|
|
6
|
+
export function setColorEnabled(on) {
|
|
7
|
+
colorEnabled = on;
|
|
8
|
+
}
|
|
9
|
+
export function isColorEnabled() {
|
|
10
|
+
return colorEnabled;
|
|
11
|
+
}
|
|
12
|
+
function wrap(open, close) {
|
|
13
|
+
return (s) => (colorEnabled ? `\x1b[${open}m${s}\x1b[${close}m` : s);
|
|
14
|
+
}
|
|
15
|
+
export const bold = wrap(1, 22);
|
|
16
|
+
export const dim = wrap(2, 22);
|
|
17
|
+
export const red = wrap(31, 39);
|
|
18
|
+
export const green = wrap(32, 39);
|
|
19
|
+
export const yellow = wrap(33, 39);
|
|
20
|
+
export const blue = wrap(34, 39);
|
|
21
|
+
export const magenta = wrap(35, 39);
|
|
22
|
+
export const cyan = wrap(36, 39);
|
|
23
|
+
export const gray = wrap(90, 39);
|
|
24
|
+
/** Strip ANSI codes. Useful for measuring on-screen width. */
|
|
25
|
+
export function stripAnsi(s) {
|
|
26
|
+
// eslint-disable-next-line no-control-regex
|
|
27
|
+
return s.replace(/\x1b\[[0-9;]*m/g, "");
|
|
28
|
+
}
|
|
29
|
+
/** Visible width of a string (after stripping ANSI). Treats every code
|
|
30
|
+
* point as width 1 — fine for our usage (names, paths, counts). */
|
|
31
|
+
export function visibleWidth(s) {
|
|
32
|
+
return [...stripAnsi(s)].length;
|
|
33
|
+
}
|
|
34
|
+
export const symbols = {
|
|
35
|
+
ok: () => (colorEnabled ? green("✓") : "ok"),
|
|
36
|
+
err: () => (colorEnabled ? red("✗") : "fail"),
|
|
37
|
+
warn: () => (colorEnabled ? yellow("!") : "warn"),
|
|
38
|
+
bullet: () => "·",
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,uEAAuE;AAEvE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC;AACjF,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC;AAE9F,IAAI,YAAY,GAAG,eAAe,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;AAEvF,MAAM,UAAU,eAAe,CAAC,EAAW;IACzC,YAAY,GAAG,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,KAAa;IACvC,OAAO,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChC,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/B,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAChC,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAEjC,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,4CAA4C;IAC5C,OAAO,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED;mEACmE;AACnE,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7C,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG;CAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"AAMA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBhD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBjD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CASjD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// `bp login`, `bp logout`, `bp whoami`. Shares token storage with the
|
|
2
|
+
// viewer's share extension, so a single login covers all surfaces.
|
|
3
|
+
import { authStatus, login as opsLogin, logout as opsLogout } from "../../ops/auth.js";
|
|
4
|
+
import { dim, green, red, yellow, bold } from "../colors.js";
|
|
5
|
+
export async function runLogin() {
|
|
6
|
+
const before = await authStatus();
|
|
7
|
+
if (before.authenticated) {
|
|
8
|
+
process.stdout.write(`${green("✓")} already signed in${before.email ? ` as ${bold(before.email)}` : ""}\n`);
|
|
9
|
+
process.stdout.write(dim(` endpoint: ${before.endpoint}\n`));
|
|
10
|
+
return 0;
|
|
11
|
+
}
|
|
12
|
+
process.stdout.write(`opening browser to sign in at ${dim(before.endpoint)} …\n`);
|
|
13
|
+
try {
|
|
14
|
+
const { email } = await opsLogin();
|
|
15
|
+
process.stdout.write(`${green("✓")} signed in${email ? ` as ${bold(email)}` : ""}\n`);
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
process.stderr.write(`${red("✗")} sign-in failed: ${err.message}\n`);
|
|
20
|
+
return 1;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function runLogout() {
|
|
24
|
+
const { cleared, errors } = await opsLogout();
|
|
25
|
+
if (errors.length > 0) {
|
|
26
|
+
process.stderr.write(`${red("✗")} sign-out incomplete — ${errors.length} token location${errors.length === 1 ? "" : "s"} could not be cleared:\n`);
|
|
27
|
+
for (const e of errors) {
|
|
28
|
+
process.stderr.write(` - ${e.path}: ${e.reason}\n`);
|
|
29
|
+
}
|
|
30
|
+
process.stderr.write(`${dim("your token may still be readable. inspect those files manually.")}\n`);
|
|
31
|
+
return 1;
|
|
32
|
+
}
|
|
33
|
+
if (cleared === 0) {
|
|
34
|
+
process.stdout.write(`${yellow("!")} not signed in\n`);
|
|
35
|
+
return 0;
|
|
36
|
+
}
|
|
37
|
+
process.stdout.write(`${green("✓")} signed out (cleared ${cleared} token file${cleared === 1 ? "" : "s"})\n`);
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
export async function runWhoami() {
|
|
41
|
+
const status = await authStatus();
|
|
42
|
+
if (!status.authenticated) {
|
|
43
|
+
process.stdout.write(`${dim("not signed in.")} run ${bold("bp login")} to authenticate.\n`);
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
process.stdout.write(`${bold(status.email ?? "signed in")}\n`);
|
|
47
|
+
process.stdout.write(dim(` endpoint: ${status.endpoint}\n`));
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cat.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cat.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI1C,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB9D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// `bp cat <name>` — print a graph as JSON to stdout. Always JSON because
|
|
2
|
+
// that's what `cat` is for in this CLI: piping. For human view use
|
|
3
|
+
// `bp show`.
|
|
4
|
+
import { getGraph } from "../../ops/graphs.js";
|
|
5
|
+
import { red, yellow } from "../colors.js";
|
|
6
|
+
export async function runCat(args) {
|
|
7
|
+
const name = args.positional[0];
|
|
8
|
+
if (!name) {
|
|
9
|
+
process.stderr.write(`bp cat: graph name required.\nusage: bp cat <name>\n`);
|
|
10
|
+
return 1;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const result = await getGraph(name);
|
|
14
|
+
switch (result.kind) {
|
|
15
|
+
case "ok":
|
|
16
|
+
process.stdout.write(JSON.stringify(result.data, null, 2) + "\n");
|
|
17
|
+
return 0;
|
|
18
|
+
case "encrypted":
|
|
19
|
+
process.stderr.write(`${yellow("!")} graph "${name}" is encrypted — open it in the local viewer to decrypt.\n`);
|
|
20
|
+
return 1;
|
|
21
|
+
case "missing":
|
|
22
|
+
process.stderr.write(`${red("✗")} graph "${name}" not found in the current scope.\n`);
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
process.stderr.write(`${red("✗")} ${err.message}\n`);
|
|
28
|
+
return 1;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=cat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cat.js","sourceRoot":"","sources":["../../../src/cli/commands/cat.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,mEAAmE;AACnE,aAAa;AAGb,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAgB;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,IAAI;gBACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAClE,OAAO,CAAC,CAAC;YACX,KAAK,WAAW;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,IAAI,4DAA4D,CAAC,CAAC;gBAChH,OAAO,CAAC,CAAC;YACX,KAAK,SAAS;gBACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,qCAAqC,CAAC,CAAC;gBACtF,OAAO,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,IAAK,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ParsedArgs } from "../parser.js";
|
|
2
|
+
export declare function runContainerCreate(args: ParsedArgs): Promise<number>;
|
|
3
|
+
export declare function runContainerRename(args: ParsedArgs): Promise<number>;
|
|
4
|
+
export declare function runContainerDelete(args: ParsedArgs): Promise<number>;
|
|
5
|
+
export declare function runMoveGraph(args: ParsedArgs): Promise<number>;
|
|
6
|
+
export declare function runMoveKB(args: ParsedArgs): Promise<number>;
|
|
7
|
+
//# sourceMappingURL=cloud-admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-admin.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/cloud-admin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAc,MAAM,cAAc,CAAC;AAsBtD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB1E;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB1E;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAuD1E;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCpE;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAmBjE"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// Cloud admin verbs: create / rename / delete a sync_backpack container,
|
|
2
|
+
// move a graph or KB doc between containers. All cloud-only.
|
|
3
|
+
import { flagString } from "../parser.js";
|
|
4
|
+
import { createContainer, renameContainer, deleteContainer, moveGraphToContainer, moveKBToContainer, } from "../../ops/containers.js";
|
|
5
|
+
import { listGraphs } from "../../ops/graphs.js";
|
|
6
|
+
import { listKB } from "../../ops/kb.js";
|
|
7
|
+
import { getContext } from "../../ops/context.js";
|
|
8
|
+
import { confirm } from "../util/confirm.js";
|
|
9
|
+
import { red, green, dim, bold, yellow } from "../colors.js";
|
|
10
|
+
const HEX_COLOR = /^#[0-9A-Fa-f]{6}$/;
|
|
11
|
+
function parseTags(raw) {
|
|
12
|
+
if (raw === undefined)
|
|
13
|
+
return undefined;
|
|
14
|
+
const tags = raw.split(",").map((t) => t.trim()).filter(Boolean);
|
|
15
|
+
return tags;
|
|
16
|
+
}
|
|
17
|
+
export async function runContainerCreate(args) {
|
|
18
|
+
const name = args.positional[0];
|
|
19
|
+
if (!name) {
|
|
20
|
+
process.stderr.write(`bp containers create: name required.\nusage: bp containers create <name> [--color=#RRGGBB] [--tags=a,b,c]\n`);
|
|
21
|
+
return 1;
|
|
22
|
+
}
|
|
23
|
+
const color = flagString(args, "color");
|
|
24
|
+
if (color && !HEX_COLOR.test(color)) {
|
|
25
|
+
process.stderr.write(`${red("✗")} --color must be #RRGGBB hex (got "${color}").\n`);
|
|
26
|
+
return 1;
|
|
27
|
+
}
|
|
28
|
+
const tags = parseTags(flagString(args, "tags"));
|
|
29
|
+
try {
|
|
30
|
+
const { container, created } = await createContainer(name, { color, tags });
|
|
31
|
+
const verb = created ? "created" : "already exists, no change to";
|
|
32
|
+
process.stdout.write(`${green("✓")} ${verb} ${bold(container.name)} ${dim(`(${container.id})`)}\n`);
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
process.stderr.write(`${red("✗")} ${err.message}\n`);
|
|
37
|
+
return 1;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export async function runContainerRename(args) {
|
|
41
|
+
const [oldName, newName] = args.positional;
|
|
42
|
+
if (!oldName) {
|
|
43
|
+
process.stderr.write(`bp containers rename: name required.\nusage: bp containers rename <old> <new> [--color=#xxx] [--tags=a,b,c]\n`);
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
const color = flagString(args, "color");
|
|
47
|
+
if (color && !HEX_COLOR.test(color)) {
|
|
48
|
+
process.stderr.write(`${red("✗")} --color must be #RRGGBB hex (got "${color}").\n`);
|
|
49
|
+
return 1;
|
|
50
|
+
}
|
|
51
|
+
const tags = parseTags(flagString(args, "tags"));
|
|
52
|
+
try {
|
|
53
|
+
const updated = await renameContainer(oldName, { newName, color, tags });
|
|
54
|
+
if (newName) {
|
|
55
|
+
process.stdout.write(`${green("✓")} ${bold(oldName)} → ${bold(updated.name)}\n`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
process.stdout.write(`${green("✓")} updated ${bold(updated.name)}\n`);
|
|
59
|
+
}
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
process.stderr.write(`${red("✗")} ${err.message}\n`);
|
|
64
|
+
return 1;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function runContainerDelete(args) {
|
|
68
|
+
const name = args.positional[0];
|
|
69
|
+
if (!name) {
|
|
70
|
+
process.stderr.write(`bp containers delete: name required.\nusage: bp containers delete <name> [-y]\n`);
|
|
71
|
+
return 1;
|
|
72
|
+
}
|
|
73
|
+
// Pre-flight: count graphs and KB docs the server would refuse to
|
|
74
|
+
// delete with. The user's confirm prompt should be aware of these
|
|
75
|
+
// stakes so they don't type `y` and then get a 422 surprise.
|
|
76
|
+
const ctx = await getContext();
|
|
77
|
+
const wasContainer = ctx.cloudContainer;
|
|
78
|
+
let graphCount = 0;
|
|
79
|
+
let kbCount = 0;
|
|
80
|
+
try {
|
|
81
|
+
// Temporarily scope the check to the target container without
|
|
82
|
+
// mutating the on-disk context.
|
|
83
|
+
const probeCtx = { source: "cloud", cloudContainer: name };
|
|
84
|
+
// We can't easily inject probeCtx into ops without plumbing — use
|
|
85
|
+
// listGraphs/listKB which read from the active context. We restore
|
|
86
|
+
// afterward. Acceptable for a single-shot pre-check; not optimal.
|
|
87
|
+
const { setContext } = await import("../../ops/context.js");
|
|
88
|
+
await setContext(probeCtx);
|
|
89
|
+
try {
|
|
90
|
+
const graphs = await listGraphs();
|
|
91
|
+
graphCount = graphs.length;
|
|
92
|
+
const kbs = await listKB();
|
|
93
|
+
kbCount = kbs.length;
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
// Restore prior context
|
|
97
|
+
await setContext(ctx).catch(() => { });
|
|
98
|
+
void wasContainer;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Pre-check is best-effort — if it fails (e.g. not signed in),
|
|
103
|
+
// fall through and let the real delete call surface the error.
|
|
104
|
+
}
|
|
105
|
+
const stakes = graphCount + kbCount > 0
|
|
106
|
+
? ` ${yellow(`it has ${graphCount} graph${graphCount === 1 ? "" : "s"} and ${kbCount} KB doc${kbCount === 1 ? "" : "s"} — server will refuse unless you move them out first`)}\n`
|
|
107
|
+
: "";
|
|
108
|
+
process.stderr.write(stakes);
|
|
109
|
+
const ok = await confirm(`delete cloud container ${bold(name)}? [y/N] `, args);
|
|
110
|
+
if (!ok) {
|
|
111
|
+
process.stderr.write(dim("aborted.\n"));
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
await deleteContainer(name);
|
|
116
|
+
process.stdout.write(`${green("✓")} deleted container ${bold(name)}\n`);
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
process.stderr.write(`${red("✗")} ${err.message}\n`);
|
|
121
|
+
return 1;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export async function runMoveGraph(args) {
|
|
125
|
+
const name = args.positional[0];
|
|
126
|
+
const to = flagString(args, "to", "t");
|
|
127
|
+
if (!name) {
|
|
128
|
+
process.stderr.write(`bp graphs move: graph name required.\nusage: bp graphs move <name> --to <container>\n`);
|
|
129
|
+
return 1;
|
|
130
|
+
}
|
|
131
|
+
if (!to) {
|
|
132
|
+
process.stderr.write(`bp graphs move: --to <container> required.\n`);
|
|
133
|
+
return 1;
|
|
134
|
+
}
|
|
135
|
+
// Pre-fetch the source container so the success message can show it.
|
|
136
|
+
// Cheap and provides important "from where" context for undo.
|
|
137
|
+
let from;
|
|
138
|
+
try {
|
|
139
|
+
// Use cloud-mode listGraphs (no container filter) to find the graph
|
|
140
|
+
// and its sourceBackpack.
|
|
141
|
+
const ctx = await getContext();
|
|
142
|
+
const probeCtx = { source: "cloud", cloudContainer: undefined };
|
|
143
|
+
const { setContext } = await import("../../ops/context.js");
|
|
144
|
+
await setContext(probeCtx);
|
|
145
|
+
try {
|
|
146
|
+
const all = await listGraphs();
|
|
147
|
+
from = all.find((g) => g.name === name)?.sourceBackpack;
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
await setContext(ctx).catch(() => { });
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch { /* best-effort lookup */ }
|
|
154
|
+
try {
|
|
155
|
+
await moveGraphToContainer(name, to);
|
|
156
|
+
const fromStr = from ? `${dim(from)} → ` : "";
|
|
157
|
+
process.stdout.write(`${green("✓")} moved ${bold(name)}: ${fromStr}${bold(to)}\n`);
|
|
158
|
+
return 0;
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
process.stderr.write(`${red("✗")} ${err.message}\n`);
|
|
162
|
+
return 1;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
export async function runMoveKB(args) {
|
|
166
|
+
const id = args.positional[0];
|
|
167
|
+
const to = flagString(args, "to", "t");
|
|
168
|
+
if (!id) {
|
|
169
|
+
process.stderr.write(`bp kbs move: doc id required.\nusage: bp kbs move <id> --to <container>\n`);
|
|
170
|
+
return 1;
|
|
171
|
+
}
|
|
172
|
+
if (!to) {
|
|
173
|
+
process.stderr.write(`bp kbs move: --to <container> required.\n`);
|
|
174
|
+
return 1;
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
await moveKBToContainer(id, to);
|
|
178
|
+
process.stdout.write(`${green("✓")} moved ${bold(id)} → ${bold(to)}\n`);
|
|
179
|
+
return 0;
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
process.stderr.write(`${red("✗")} ${err.message}\n`);
|
|
183
|
+
return 1;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=cloud-admin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-admin.js","sourceRoot":"","sources":["../../../src/cli/commands/cloud-admin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/completion.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAW1C,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBrE"}
|