backpack-ontology 0.7.13 → 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.
Files changed (128) hide show
  1. package/README.md +123 -0
  2. package/dist/bin/bp.d.ts +3 -0
  3. package/dist/bin/bp.d.ts.map +1 -0
  4. package/dist/bin/bp.js +6 -0
  5. package/dist/bin/bp.js.map +1 -0
  6. package/dist/cli/colors.d.ts +20 -0
  7. package/dist/cli/colors.d.ts.map +1 -0
  8. package/dist/cli/colors.js +34 -0
  9. package/dist/cli/colors.js.map +1 -0
  10. package/dist/cli/commands/auth.d.ts +4 -0
  11. package/dist/cli/commands/auth.d.ts.map +1 -0
  12. package/dist/cli/commands/auth.js +48 -0
  13. package/dist/cli/commands/auth.js.map +1 -0
  14. package/dist/cli/commands/cat.d.ts +3 -0
  15. package/dist/cli/commands/cat.d.ts.map +1 -0
  16. package/dist/cli/commands/cat.js +28 -0
  17. package/dist/cli/commands/cat.js.map +1 -0
  18. package/dist/cli/commands/cloud-admin.d.ts +7 -0
  19. package/dist/cli/commands/cloud-admin.d.ts.map +1 -0
  20. package/dist/cli/commands/cloud-admin.js +169 -0
  21. package/dist/cli/commands/cloud-admin.js.map +1 -0
  22. package/dist/cli/commands/completion.d.ts +3 -0
  23. package/dist/cli/commands/completion.d.ts.map +1 -0
  24. package/dist/cli/commands/completion.js +156 -0
  25. package/dist/cli/commands/completion.js.map +1 -0
  26. package/dist/cli/commands/containers.d.ts +3 -0
  27. package/dist/cli/commands/containers.d.ts.map +1 -0
  28. package/dist/cli/commands/containers.js +29 -0
  29. package/dist/cli/commands/containers.js.map +1 -0
  30. package/dist/cli/commands/context.d.ts +4 -0
  31. package/dist/cli/commands/context.d.ts.map +1 -0
  32. package/dist/cli/commands/context.js +59 -0
  33. package/dist/cli/commands/context.js.map +1 -0
  34. package/dist/cli/commands/doctor.d.ts +3 -0
  35. package/dist/cli/commands/doctor.d.ts.map +1 -0
  36. package/dist/cli/commands/doctor.js +65 -0
  37. package/dist/cli/commands/doctor.js.map +1 -0
  38. package/dist/cli/commands/graphs.d.ts +3 -0
  39. package/dist/cli/commands/graphs.d.ts.map +1 -0
  40. package/dist/cli/commands/graphs.js +57 -0
  41. package/dist/cli/commands/graphs.js.map +1 -0
  42. package/dist/cli/commands/init.d.ts +3 -0
  43. package/dist/cli/commands/init.d.ts.map +1 -0
  44. package/dist/cli/commands/init.js +46 -0
  45. package/dist/cli/commands/init.js.map +1 -0
  46. package/dist/cli/commands/kbs.d.ts +3 -0
  47. package/dist/cli/commands/kbs.d.ts.map +1 -0
  48. package/dist/cli/commands/kbs.js +247 -0
  49. package/dist/cli/commands/kbs.js.map +1 -0
  50. package/dist/cli/commands/ls.d.ts +3 -0
  51. package/dist/cli/commands/ls.d.ts.map +1 -0
  52. package/dist/cli/commands/ls.js +81 -0
  53. package/dist/cli/commands/ls.js.map +1 -0
  54. package/dist/cli/commands/mutate.d.ts +7 -0
  55. package/dist/cli/commands/mutate.d.ts.map +1 -0
  56. package/dist/cli/commands/mutate.js +241 -0
  57. package/dist/cli/commands/mutate.js.map +1 -0
  58. package/dist/cli/commands/open.d.ts +3 -0
  59. package/dist/cli/commands/open.d.ts.map +1 -0
  60. package/dist/cli/commands/open.js +88 -0
  61. package/dist/cli/commands/open.js.map +1 -0
  62. package/dist/cli/commands/search.d.ts +3 -0
  63. package/dist/cli/commands/search.d.ts.map +1 -0
  64. package/dist/cli/commands/search.js +59 -0
  65. package/dist/cli/commands/search.js.map +1 -0
  66. package/dist/cli/commands/show.d.ts +3 -0
  67. package/dist/cli/commands/show.d.ts.map +1 -0
  68. package/dist/cli/commands/show.js +74 -0
  69. package/dist/cli/commands/show.js.map +1 -0
  70. package/dist/cli/commands/version.d.ts +2 -0
  71. package/dist/cli/commands/version.d.ts.map +1 -0
  72. package/dist/cli/commands/version.js +16 -0
  73. package/dist/cli/commands/version.js.map +1 -0
  74. package/dist/cli/help.d.ts +3 -0
  75. package/dist/cli/help.d.ts.map +1 -0
  76. package/dist/cli/help.js +118 -0
  77. package/dist/cli/help.js.map +1 -0
  78. package/dist/cli/output.d.ts +23 -0
  79. package/dist/cli/output.d.ts.map +1 -0
  80. package/dist/cli/output.js +189 -0
  81. package/dist/cli/output.js.map +1 -0
  82. package/dist/cli/parser.d.ts +9 -0
  83. package/dist/cli/parser.d.ts.map +1 -0
  84. package/dist/cli/parser.js +106 -0
  85. package/dist/cli/parser.js.map +1 -0
  86. package/dist/cli/router.d.ts +2 -0
  87. package/dist/cli/router.d.ts.map +1 -0
  88. package/dist/cli/router.js +123 -0
  89. package/dist/cli/router.js.map +1 -0
  90. package/dist/cli/util/confirm.d.ts +3 -0
  91. package/dist/cli/util/confirm.d.ts.map +1 -0
  92. package/dist/cli/util/confirm.js +37 -0
  93. package/dist/cli/util/confirm.js.map +1 -0
  94. package/dist/core/backpack.d.ts +1 -92
  95. package/dist/core/backpack.d.ts.map +1 -1
  96. package/dist/core/backpack.js +23 -127
  97. package/dist/core/backpack.js.map +1 -1
  98. package/dist/core/backpacks-registry.d.ts +2 -2
  99. package/dist/core/backpacks-registry.js +2 -2
  100. package/dist/mcp/tools/cloud-tools.d.ts +2 -3
  101. package/dist/mcp/tools/cloud-tools.d.ts.map +1 -1
  102. package/dist/mcp/tools/cloud-tools.js +240 -81
  103. package/dist/mcp/tools/cloud-tools.js.map +1 -1
  104. package/dist/mcp/tools/share-tools.js +1 -1
  105. package/dist/mcp/tools/share-tools.js.map +1 -1
  106. package/dist/mcp/tools/signal-tools.js +1 -1
  107. package/dist/mcp/tools/signal-tools.js.map +1 -1
  108. package/dist/ops/auth.d.ts +25 -0
  109. package/dist/ops/auth.d.ts.map +1 -0
  110. package/dist/ops/auth.js +144 -0
  111. package/dist/ops/auth.js.map +1 -0
  112. package/dist/ops/containers.d.ts +25 -0
  113. package/dist/ops/containers.d.ts.map +1 -0
  114. package/dist/ops/containers.js +144 -0
  115. package/dist/ops/containers.js.map +1 -0
  116. package/dist/ops/context.d.ts +30 -0
  117. package/dist/ops/context.d.ts.map +1 -0
  118. package/dist/ops/context.js +133 -0
  119. package/dist/ops/context.js.map +1 -0
  120. package/dist/ops/graphs.d.ts +48 -0
  121. package/dist/ops/graphs.d.ts.map +1 -0
  122. package/dist/ops/graphs.js +249 -0
  123. package/dist/ops/graphs.js.map +1 -0
  124. package/dist/ops/kb.d.ts +28 -0
  125. package/dist/ops/kb.d.ts.map +1 -0
  126. package/dist/ops/kb.js +162 -0
  127. package/dist/ops/kb.js.map +1 -0
  128. package/package.json +3 -2
@@ -0,0 +1,88 @@
1
+ import * as path from "node:path";
2
+ import { spawn } from "node:child_process";
3
+ import { getGraphSummary } from "../../ops/graphs.js";
4
+ import { getContext } from "../../ops/context.js";
5
+ import { red, dim, green, yellow } from "../colors.js";
6
+ const VIEWER_URL = process.env.BACKPACK_VIEWER_URL || "http://127.0.0.1:5173";
7
+ async function syncViewerContext() {
8
+ const ctx = await getContext();
9
+ let switchName = null;
10
+ if (ctx.source === "local" && ctx.backpackPath) {
11
+ switchName = path.basename(ctx.backpackPath);
12
+ }
13
+ else if (ctx.source === "cloud") {
14
+ switchName = ctx.cloudContainer ? `__cloud__:${ctx.cloudContainer}` : "__cloud__";
15
+ }
16
+ if (!switchName)
17
+ return { ok: false, switchName: null, error: "no active context" };
18
+ try {
19
+ const res = await fetch(`${VIEWER_URL}/api/backpacks/switch`, {
20
+ method: "POST",
21
+ headers: { "Content-Type": "application/json" },
22
+ body: JSON.stringify({ name: switchName }),
23
+ });
24
+ if (!res.ok)
25
+ return { ok: false, switchName, error: `viewer returned HTTP ${res.status}` };
26
+ return { ok: true, switchName };
27
+ }
28
+ catch (err) {
29
+ return { ok: false, switchName, error: err.message };
30
+ }
31
+ }
32
+ export async function runOpen(args) {
33
+ const name = args.positional[0];
34
+ if (!name) {
35
+ process.stderr.write(`bp open: graph name required.\nusage: bp open <name>\n`);
36
+ return 1;
37
+ }
38
+ try {
39
+ const summary = await getGraphSummary(name);
40
+ if (!summary) {
41
+ process.stderr.write(`${red("✗")} graph "${name}" not found in the current scope.\n`);
42
+ return 1;
43
+ }
44
+ }
45
+ catch (err) {
46
+ process.stderr.write(`${red("✗")} ${err.message}\n`);
47
+ return 1;
48
+ }
49
+ const sync = await syncViewerContext();
50
+ if (sync.ok) {
51
+ process.stdout.write(`${dim("·")} viewer switched to ${sync.switchName}\n`);
52
+ }
53
+ else if (sync.error?.includes("ECONNREFUSED") || sync.error?.includes("fetch failed")) {
54
+ process.stdout.write(`${yellow("!")} viewer doesn't appear to be running at ${VIEWER_URL} — opening anyway.\n`);
55
+ process.stdout.write(dim(` start it with: npx backpack-viewer@latest\n`));
56
+ }
57
+ else if (sync.error) {
58
+ process.stdout.write(`${yellow("!")} couldn't sync viewer context (${sync.error}) — opening anyway.\n`);
59
+ }
60
+ const url = `${VIEWER_URL}/#${encodeURIComponent(name)}`;
61
+ process.stdout.write(`${green("→")} ${url}\n`);
62
+ let cmd;
63
+ let cmdArgs;
64
+ if (process.platform === "darwin") {
65
+ cmd = "open";
66
+ cmdArgs = [url];
67
+ }
68
+ else if (process.platform === "win32") {
69
+ cmd = "cmd";
70
+ cmdArgs = ["/c", "start", "", url];
71
+ }
72
+ else {
73
+ cmd = "xdg-open";
74
+ cmdArgs = [url];
75
+ }
76
+ try {
77
+ const child = spawn(cmd, cmdArgs, { detached: true, stdio: "ignore" });
78
+ child.on("error", () => {
79
+ process.stdout.write(dim(" (couldn't auto-launch — copy the URL above into your browser)\n"));
80
+ });
81
+ child.unref();
82
+ }
83
+ catch {
84
+ process.stdout.write(dim(" (couldn't auto-launch — copy the URL above into your browser)\n"));
85
+ }
86
+ return 0;
87
+ }
88
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/cli/commands/open.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ParsedArgs } from "../parser.js";
2
+ export declare function runSearch(args: ParsedArgs): Promise<number>;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAc,MAAM,cAAc,CAAC;AAItD,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAqDjE"}
@@ -0,0 +1,59 @@
1
+ import { flagString } from "../parser.js";
2
+ import { searchGraphs } from "../../ops/graphs.js";
3
+ import { resolveFormat, emitList } from "../output.js";
4
+ import { dim, bold, red, yellow } from "../colors.js";
5
+ export async function runSearch(args) {
6
+ const query = args.positional.join(" ").trim();
7
+ if (!query) {
8
+ process.stderr.write(`bp search: query required.\nusage: bp search <query>\n`);
9
+ return 1;
10
+ }
11
+ const maxGraphs = parseInt(flagString(args, "max-graphs") ?? "", 10);
12
+ try {
13
+ const result = await searchGraphs(query, {
14
+ maxGraphs: Number.isFinite(maxGraphs) && maxGraphs > 0 ? maxGraphs : undefined,
15
+ });
16
+ const fmt = resolveFormat(args.flags);
17
+ if (fmt === "json" || fmt === "yaml") {
18
+ emitList({
19
+ rows: result.hits,
20
+ pluralLabel: "hits",
21
+ cols: [
22
+ { header: "GRAPH", get: (r) => r.graphName },
23
+ { header: "TYPE", get: (r) => r.nodeType },
24
+ { header: "LABEL", get: (r) => r.label },
25
+ { header: "ID", get: (r) => r.nodeId },
26
+ ],
27
+ }, { format: fmt });
28
+ return 0;
29
+ }
30
+ emitList({
31
+ rows: result.hits,
32
+ pluralLabel: "hits",
33
+ empty: dim(`no matches for "${query}".`),
34
+ cols: [
35
+ { header: "GRAPH", get: (r) => r.graphName, max: 32 },
36
+ { header: "TYPE", get: (r) => r.nodeType, max: 20 },
37
+ { header: "LABEL", get: (r) => r.label, max: 60 },
38
+ { header: "ID", get: (r) => r.nodeId, dim: true, wide: true },
39
+ ],
40
+ }, { format: fmt });
41
+ if (fmt === "names")
42
+ return 0;
43
+ const notes = [];
44
+ if (result.hits.length > 0)
45
+ notes.push(`${result.hits.length} match${result.hits.length === 1 ? "" : "es"} for "${bold(query)}"`);
46
+ if (result.graphsSkipped > 0)
47
+ notes.push(yellow(`skipped ${result.graphsSkipped} encrypted graph${result.graphsSkipped === 1 ? "" : "s"}`));
48
+ if (result.truncated)
49
+ notes.push(yellow(`only scanned the first ${result.graphsScanned} of ${result.graphsInScope} graphs — pass --max-graphs to widen`));
50
+ if (notes.length > 0)
51
+ process.stdout.write("\n " + dim(notes.join(" · ")) + "\n");
52
+ return 0;
53
+ }
54
+ catch (err) {
55
+ process.stderr.write(`${red("✗")} ${err.message}\n`);
56
+ return 1;
57
+ }
58
+ }
59
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ParsedArgs } from "../parser.js";
2
+ export declare function runShow(args: ParsedArgs): Promise<number>;
3
+ //# sourceMappingURL=show.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI1C,wBAAsB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAqE/D"}
@@ -0,0 +1,74 @@
1
+ import { getGraph, getGraphSummary } from "../../ops/graphs.js";
2
+ import { resolveFormat, emitOne } from "../output.js";
3
+ import { bold, dim, red, yellow, cyan } from "../colors.js";
4
+ export async function runShow(args) {
5
+ const name = args.positional[0];
6
+ if (!name) {
7
+ process.stderr.write(`bp show: graph name required.\nusage: bp show <name>\n`);
8
+ return 1;
9
+ }
10
+ let summary;
11
+ try {
12
+ summary = await getGraphSummary(name);
13
+ }
14
+ catch (err) {
15
+ process.stderr.write(`${red("✗")} ${err.message}\n`);
16
+ return 1;
17
+ }
18
+ if (!summary) {
19
+ process.stderr.write(`${red("✗")} graph "${name}" not found in the current scope.\n`);
20
+ return 1;
21
+ }
22
+ const fmt = resolveFormat(args.flags);
23
+ if (fmt !== "human") {
24
+ let data;
25
+ if (!summary.encrypted) {
26
+ const r = await getGraph(name).catch(() => null);
27
+ if (r && r.kind === "ok")
28
+ data = r.data;
29
+ }
30
+ emitOne({ ...summary, data }, { format: fmt });
31
+ return 0;
32
+ }
33
+ process.stdout.write(`${bold(summary.name)}${summary.encrypted ? " " + yellow("[encrypted]") : ""}${summary.origin === "cloud" ? " " + dim("(cloud)") : ""}\n`);
34
+ if (summary.description)
35
+ process.stdout.write(` ${summary.description}\n`);
36
+ process.stdout.write(` ${cyan(String(summary.nodeCount))} nodes, ${cyan(String(summary.edgeCount))} edges\n`);
37
+ if (summary.tags && summary.tags.length > 0) {
38
+ process.stdout.write(` ${dim("tags:")} ${summary.tags.join(", ")}\n`);
39
+ }
40
+ if (summary.sourceBackpack) {
41
+ process.stdout.write(` ${dim("container:")} ${summary.sourceBackpack}\n`);
42
+ }
43
+ if (summary.encrypted) {
44
+ process.stdout.write(`\n ${yellow("encrypted graph — open in your local viewer to inspect contents.")}\n`);
45
+ return 0;
46
+ }
47
+ const HISTOGRAM_NODE_LIMIT = 50000;
48
+ try {
49
+ const r = await getGraph(name);
50
+ if (r.kind === "ok" && Array.isArray(r.data.nodes)) {
51
+ if (r.data.nodes.length > HISTOGRAM_NODE_LIMIT) {
52
+ process.stdout.write(dim(`\n (graph has ${r.data.nodes.length} nodes — type histogram skipped; use \`bp cat ${name} | jq '.nodes | group_by(.type)'\`)\n`));
53
+ }
54
+ else {
55
+ const types = new Map();
56
+ for (const n of r.data.nodes)
57
+ types.set(n.type, (types.get(n.type) ?? 0) + 1);
58
+ if (types.size > 0) {
59
+ process.stdout.write("\n " + bold("types") + "\n");
60
+ const sorted = [...types.entries()].sort((a, b) => b[1] - a[1]);
61
+ for (const [t, c] of sorted.slice(0, 12)) {
62
+ process.stdout.write(` ${cyan(String(c).padStart(4))} ${t}\n`);
63
+ }
64
+ if (sorted.length > 12)
65
+ process.stdout.write(dim(` … ${sorted.length - 12} more\n`));
66
+ }
67
+ }
68
+ }
69
+ }
70
+ catch {
71
+ }
72
+ return 0;
73
+ }
74
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/cli/commands/show.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runVersion(): Promise<number>;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/version.ts"],"names":[],"mappings":"AAGA,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAalD"}
@@ -0,0 +1,16 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export async function runVersion() {
5
+ const dir = path.dirname(fileURLToPath(import.meta.url));
6
+ const pkgPath = path.join(dir, "..", "..", "..", "package.json");
7
+ let version = "unknown";
8
+ try {
9
+ const raw = await fs.readFile(pkgPath, "utf8");
10
+ version = JSON.parse(raw).version ?? "unknown";
11
+ }
12
+ catch { }
13
+ process.stdout.write(`bp ${version} (node ${process.version})\n`);
14
+ return 0;
15
+ }
16
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/cli/commands/version.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACjE,IAAI,OAAO,GAAG,SAAS,CAAC;IACxB,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAEvB,CAAC,OAAO,IAAI,SAAS,CAAC;IAC5B,CAAC;IACD,MAAM,CAAC,CAAC,CAAC;IACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,OAAO,WAAW,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC;IACnE,OAAO,CAAC,CAAC;AACb,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function printHint(): void;
2
+ export declare function printFullHelp(): void;
3
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AACA,wBAAgB,SAAS,IAAI,IAAI,CAahC;AA8FD,wBAAgB,aAAa,IAAI,IAAI,CAcpC"}
@@ -0,0 +1,118 @@
1
+ import { bold, dim, cyan } from "./colors.js";
2
+ export function printHint() {
3
+ const lines = [
4
+ bold("bp") + dim(" — Backpack CLI"),
5
+ "",
6
+ ` ${cyan("bp ls")} list graphs in the current backpack`,
7
+ ` ${cyan("bp cat")} <name> print a graph as JSON (pipe to jq)`,
8
+ ` ${cyan("bp show")} <name> human-friendly summary`,
9
+ ` ${cyan("bp where")} show current scope`,
10
+ ` ${cyan("bp doctor")} check auth + connectivity`,
11
+ "",
12
+ dim(` try \`bp help\` for everything`),
13
+ ];
14
+ process.stdout.write(lines.join("\n") + "\n");
15
+ }
16
+ const FULL_HELP_SECTIONS = [
17
+ {
18
+ title: "Common",
19
+ commands: [
20
+ ["bp ls [resource]", "list graphs / containers / kbs in the current scope"],
21
+ ["bp cat <name>", "print a graph as JSON (pipe to jq, sed, etc.)"],
22
+ ["bp show <name>", "human-friendly summary + type histogram"],
23
+ ["bp open <name>", "open the graph in the local viewer"],
24
+ ["bp search <query>", "full-text search across graph properties"],
25
+ ["bp rm <name>", "shortcut for `bp graphs delete`"],
26
+ ["bp mv <old> <new>", "shortcut for `bp graphs rename`"],
27
+ ],
28
+ },
29
+ {
30
+ title: "Auth & scope",
31
+ commands: [
32
+ ["bp login", "sign in to backpack-app via the browser"],
33
+ ["bp logout", "sign out everywhere"],
34
+ ["bp whoami", "show signed-in identity"],
35
+ ["bp where", "show current scope (backpack / container / identity)"],
36
+ ["bp use <name>", "switch context (local backpack or cloud container)"],
37
+ ["bp use", "list available contexts"],
38
+ ],
39
+ },
40
+ {
41
+ title: "Graphs",
42
+ commands: [
43
+ ["bp graphs list", "list graphs in the current scope"],
44
+ ["bp graphs get <name>", "print as JSON (pipeable)"],
45
+ ["bp graphs describe <name>", "human summary"],
46
+ ["bp graphs create <name> [--description=…]", "new empty graph"],
47
+ ["bp graphs create <name> --from-file <f>", "create from a JSON file"],
48
+ ["bp graphs apply -f <file>", "upsert from a JSON file"],
49
+ ["bp graphs edit <name>", "open in $EDITOR, save back atomically"],
50
+ ["bp graphs rename <old> <new>", "rename in place"],
51
+ ["bp graphs delete <name>", "delete with confirm (or -y)"],
52
+ ["bp graphs move <name> --to <container>", "relocate between cloud containers"],
53
+ ],
54
+ },
55
+ {
56
+ title: "KB documents",
57
+ commands: [
58
+ ["bp kbs list", "list KB docs in the current scope"],
59
+ ["bp kbs get <id>", "print body (pipeable)"],
60
+ ["bp kbs create -f <file.md>", "create from a markdown file"],
61
+ ["bp kbs create --title=… --content=…", "create from flags"],
62
+ ["bp kbs edit <id>", "edit body in $EDITOR"],
63
+ ["bp kbs delete <id>", "delete with confirm"],
64
+ ["bp kbs move <id> --to <container>", "relocate between cloud containers"],
65
+ ],
66
+ },
67
+ {
68
+ title: "Cloud containers",
69
+ commands: [
70
+ ["bp containers list", "list your cloud sync_backpacks"],
71
+ ["bp containers create <name> [--color=#xxx] [--tags=a,b]", "new cloud container"],
72
+ ["bp containers rename <old> <new>", "rename / recolor / retag"],
73
+ ["bp containers delete <name>", "delete (refuses if non-empty)"],
74
+ ],
75
+ },
76
+ {
77
+ title: "Project setup",
78
+ commands: [
79
+ ["bp init [path]", "initialize a new local backpack root in CWD (or path)"],
80
+ ["bp completion <shell>", "print shell-completion script (bash | zsh | fish)"],
81
+ ],
82
+ },
83
+ {
84
+ title: "Diagnostics",
85
+ commands: [
86
+ ["bp doctor", "auth, connectivity, version skew checks"],
87
+ ["bp version", "print version"],
88
+ ],
89
+ },
90
+ ];
91
+ const GLOBAL_FLAGS = [
92
+ ["--json", "machine-readable JSON (the stable contract)"],
93
+ ["--yaml", "machine-readable YAML"],
94
+ ["--names", "names only, one per line"],
95
+ ["--wide", "show extra columns"],
96
+ ["--no-color", "disable ANSI colors"],
97
+ ["-y, --yes", "skip confirmation on destructive ops"],
98
+ ["-h, --help", "help for any command"],
99
+ ];
100
+ export function printFullHelp() {
101
+ const lines = [bold("bp") + dim(" — the Backpack CLI"), ""];
102
+ for (const section of FULL_HELP_SECTIONS) {
103
+ lines.push(bold(section.title));
104
+ for (const [cmd, desc] of section.commands) {
105
+ lines.push(` ${padRight(cmd, 40)} ${dim(desc)}`);
106
+ }
107
+ lines.push("");
108
+ }
109
+ lines.push(bold("Global flags"));
110
+ for (const [f, d] of GLOBAL_FLAGS) {
111
+ lines.push(` ${padRight(f, 40)} ${dim(d)}`);
112
+ }
113
+ process.stdout.write(lines.join("\n") + "\n");
114
+ }
115
+ function padRight(s, width) {
116
+ return s.length >= width ? s : s + " ".repeat(width - s.length);
117
+ }
118
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export type OutputFormat = "human" | "json" | "yaml" | "names" | "wide";
2
+ export interface Column<T> {
3
+ header: string;
4
+ get: (row: T) => string;
5
+ max?: number;
6
+ dim?: boolean;
7
+ wide?: boolean;
8
+ numeric?: boolean;
9
+ }
10
+ export interface ListOptions<T> {
11
+ rows: T[];
12
+ cols: Column<T>[];
13
+ nameKey?: (row: T) => string;
14
+ pluralLabel: string;
15
+ empty?: string;
16
+ }
17
+ export interface FormatChoice {
18
+ format: OutputFormat;
19
+ }
20
+ export declare function emitList<T>(opts: ListOptions<T>, choice: FormatChoice): void;
21
+ export declare function emitOne(value: unknown, choice: FormatChoice): void;
22
+ export declare function resolveFormat(flags: Record<string, string | boolean>): OutputFormat;
23
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AACxE,MAAM,WAAW,MAAM,CAAC,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AACD,MAAM,WAAW,WAAW,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,YAAY,CAAC;CACxB;AACD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA2B5E;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAuBlE;AA+HD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,YAAY,CAUnF"}
@@ -0,0 +1,189 @@
1
+ import { dim, bold, gray, visibleWidth } from "./colors.js";
2
+ export function emitList(opts, choice) {
3
+ const { rows, cols, pluralLabel, nameKey, empty } = opts;
4
+ switch (choice.format) {
5
+ case "json":
6
+ process.stdout.write(JSON.stringify({ [pluralLabel]: rows }, null, 2) + "\n");
7
+ return;
8
+ case "yaml":
9
+ process.stdout.write(toYaml({ [pluralLabel]: rows }) + "\n");
10
+ return;
11
+ case "names": {
12
+ const getName = nameKey ?? ((r) => stripAnsi(cols[0].get(r)));
13
+ for (const r of rows)
14
+ process.stdout.write(getName(r) + "\n");
15
+ return;
16
+ }
17
+ case "wide":
18
+ process.stdout.write(renderTable(rows, cols, true) + "\n");
19
+ return;
20
+ case "human":
21
+ default:
22
+ if (rows.length === 0 && empty) {
23
+ process.stdout.write(dim(empty) + "\n");
24
+ return;
25
+ }
26
+ process.stdout.write(renderTable(rows, cols, false) + "\n");
27
+ return;
28
+ }
29
+ }
30
+ export function emitOne(value, choice) {
31
+ switch (choice.format) {
32
+ case "json":
33
+ case "wide":
34
+ case "human":
35
+ if (choice.format === "human") {
36
+ process.stdout.write(humanizeOne(value) + "\n");
37
+ }
38
+ else {
39
+ process.stdout.write(JSON.stringify(value, null, 2) + "\n");
40
+ }
41
+ return;
42
+ case "yaml":
43
+ process.stdout.write(toYaml(value) + "\n");
44
+ return;
45
+ case "names":
46
+ if (value && typeof value === "object" && "name" in value) {
47
+ process.stdout.write(String(value.name) + "\n");
48
+ }
49
+ return;
50
+ }
51
+ }
52
+ function renderTable(rows, cols, wide) {
53
+ const visible = cols.filter((c) => wide || !c.wide);
54
+ if (visible.length === 0)
55
+ return "";
56
+ const termWidth = process.stdout.columns ?? 100;
57
+ const widths = visible.map((c) => {
58
+ const headerW = visibleWidth(c.header);
59
+ const maxRow = rows.reduce((m, r) => Math.max(m, visibleWidth(c.get(r))), 0);
60
+ const desired = Math.max(headerW, maxRow);
61
+ if (c.numeric)
62
+ return desired;
63
+ return c.max ? Math.min(desired, c.max) : desired;
64
+ });
65
+ const totalGap = (visible.length - 1) * 2;
66
+ const totalContent = widths.reduce((a, b) => a + b, 0);
67
+ if (totalContent + totalGap > termWidth - 2) {
68
+ let budget = termWidth - 2 - totalGap;
69
+ if (budget < visible.length * 6) {
70
+ return rows.map((r) => visible.map((c, i) => `${dim(visible[i].header)}: ${c.get(r)}`).join("\n")).join("\n\n");
71
+ }
72
+ while (widths.reduce((a, b) => a + b, 0) > budget) {
73
+ const idx = widths.indexOf(Math.max(...widths));
74
+ widths[idx]--;
75
+ if (widths[idx] < 4)
76
+ break;
77
+ }
78
+ }
79
+ const lines = [];
80
+ lines.push(visible.map((c, i) => padRight(bold(c.header), widths[i])).join(" "));
81
+ for (const r of rows) {
82
+ lines.push(visible.map((c, i) => {
83
+ let cell = c.get(r);
84
+ const w = widths[i];
85
+ if (visibleWidth(cell) > w)
86
+ cell = truncate(cell, w);
87
+ cell = padRight(cell, w);
88
+ return c.dim ? dim(cell) : cell;
89
+ }).join(" "));
90
+ }
91
+ return lines.join("\n");
92
+ }
93
+ function humanizeOne(value) {
94
+ if (value === null || value === undefined)
95
+ return dim("(empty)");
96
+ if (typeof value !== "object")
97
+ return String(value);
98
+ const lines = [];
99
+ for (const [k, v] of Object.entries(value)) {
100
+ if (v === undefined)
101
+ continue;
102
+ const formatted = typeof v === "object" && v !== null
103
+ ? JSON.stringify(v, null, 2).split("\n").map((l, i) => i === 0 ? l : " " + l).join("\n")
104
+ : String(v);
105
+ lines.push(`${gray(k + ":")} ${formatted}`);
106
+ }
107
+ return lines.join("\n");
108
+ }
109
+ function padRight(s, width) {
110
+ const w = visibleWidth(s);
111
+ if (w >= width)
112
+ return s;
113
+ return s + " ".repeat(width - w);
114
+ }
115
+ function truncate(s, width) {
116
+ if (visibleWidth(s) <= width)
117
+ return s;
118
+ const plain = stripAnsi(s);
119
+ if (plain.length <= width)
120
+ return s;
121
+ return plain.slice(0, Math.max(0, width - 1)) + "…";
122
+ }
123
+ function stripAnsi(s) {
124
+ return s.replace(/\x1b\[[0-9;]*m/g, "");
125
+ }
126
+ function toYaml(v, indent = 0) {
127
+ const pad = " ".repeat(indent);
128
+ if (v === null || v === undefined)
129
+ return "null";
130
+ if (typeof v === "string")
131
+ return yamlScalar(v);
132
+ if (typeof v === "number" || typeof v === "boolean")
133
+ return String(v);
134
+ if (Array.isArray(v)) {
135
+ if (v.length === 0)
136
+ return "[]";
137
+ return v.map((item) => {
138
+ if (item !== null && typeof item === "object") {
139
+ const inner = toYaml(item, indent + 1);
140
+ const lines = inner.split("\n");
141
+ const firstNonEmpty = lines.findIndex((l) => l.trim().length > 0);
142
+ if (firstNonEmpty === -1)
143
+ return `${pad}- {}`;
144
+ const first = lines[firstNonEmpty].replace(/^\s+/, "");
145
+ const rest = lines.slice(firstNonEmpty + 1).join("\n");
146
+ return rest ? `${pad}- ${first}\n${rest}` : `${pad}- ${first}`;
147
+ }
148
+ return `${pad}- ${toYaml(item, indent + 1)}`;
149
+ }).join("\n");
150
+ }
151
+ if (typeof v === "object") {
152
+ const entries = Object.entries(v).filter(([, val]) => val !== undefined);
153
+ if (entries.length === 0)
154
+ return "{}";
155
+ return entries.map(([k, val]) => {
156
+ if (val !== null && typeof val === "object") {
157
+ const inner = toYaml(val, indent + 1);
158
+ if (Array.isArray(val) && val.length === 0)
159
+ return `${pad}${k}: []`;
160
+ if (!Array.isArray(val) && Object.keys(val).length === 0)
161
+ return `${pad}${k}: {}`;
162
+ return `${pad}${k}:\n${inner}`;
163
+ }
164
+ return `${pad}${k}: ${toYaml(val, indent + 1)}`;
165
+ }).join("\n");
166
+ }
167
+ return String(v);
168
+ }
169
+ function yamlScalar(s) {
170
+ const hasControl = /[\x00-\x1f]/.test(s);
171
+ if (hasControl ||
172
+ s === "" ||
173
+ /[:#\[\]{},&*!|>'"%@`]|^\s|\s$|^-|^\?|^(null|true|false|yes|no)$|^-?\d/.test(s)) {
174
+ return JSON.stringify(s);
175
+ }
176
+ return s;
177
+ }
178
+ export function resolveFormat(flags) {
179
+ if (flags.json)
180
+ return "json";
181
+ if (flags.yaml)
182
+ return "yaml";
183
+ if (flags.names)
184
+ return "names";
185
+ if (flags.wide)
186
+ return "wide";
187
+ return "human";
188
+ }
189
+ //# sourceMappingURL=output.js.map