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.
Files changed (122) 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 +8 -0
  5. package/dist/bin/bp.js.map +1 -0
  6. package/dist/cli/colors.d.ts +23 -0
  7. package/dist/cli/colors.d.ts.map +1 -0
  8. package/dist/cli/colors.js +40 -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 +50 -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 +31 -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 +186 -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 +159 -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 +30 -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 +61 -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 +74 -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 +68 -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 +56 -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 +258 -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 +90 -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 +268 -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 +59 -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 +63 -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 +82 -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 +18 -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 +122 -0
  77. package/dist/cli/help.js.map +1 -0
  78. package/dist/cli/output.d.ts +35 -0
  79. package/dist/cli/output.d.ts.map +1 -0
  80. package/dist/cli/output.js +224 -0
  81. package/dist/cli/output.js.map +1 -0
  82. package/dist/cli/parser.d.ts +16 -0
  83. package/dist/cli/parser.d.ts.map +1 -0
  84. package/dist/cli/parser.js +131 -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 +147 -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 +48 -0
  93. package/dist/cli/util/confirm.js.map +1 -0
  94. package/dist/core/backpack.d.ts +8 -0
  95. package/dist/core/backpack.d.ts.map +1 -1
  96. package/dist/core/backpack.js +32 -0
  97. package/dist/core/backpack.js.map +1 -1
  98. package/dist/mcp/tools/cloud-tools.d.ts +2 -2
  99. package/dist/mcp/tools/cloud-tools.d.ts.map +1 -1
  100. package/dist/mcp/tools/cloud-tools.js +244 -55
  101. package/dist/mcp/tools/cloud-tools.js.map +1 -1
  102. package/dist/ops/auth.d.ts +54 -0
  103. package/dist/ops/auth.d.ts.map +1 -0
  104. package/dist/ops/auth.js +181 -0
  105. package/dist/ops/auth.js.map +1 -0
  106. package/dist/ops/containers.d.ts +27 -0
  107. package/dist/ops/containers.d.ts.map +1 -0
  108. package/dist/ops/containers.js +150 -0
  109. package/dist/ops/containers.js.map +1 -0
  110. package/dist/ops/context.d.ts +51 -0
  111. package/dist/ops/context.d.ts.map +1 -0
  112. package/dist/ops/context.js +158 -0
  113. package/dist/ops/context.js.map +1 -0
  114. package/dist/ops/graphs.d.ts +69 -0
  115. package/dist/ops/graphs.d.ts.map +1 -0
  116. package/dist/ops/graphs.js +278 -0
  117. package/dist/ops/graphs.js.map +1 -0
  118. package/dist/ops/kb.d.ts +33 -0
  119. package/dist/ops/kb.d.ts.map +1 -0
  120. package/dist/ops/kb.js +176 -0
  121. package/dist/ops/kb.js.map +1 -0
  122. package/package.json +3 -2
@@ -0,0 +1,224 @@
1
+ // Output formatters for CLI commands. Five formats: human (default),
2
+ // json, yaml, names (one per line), wide (every column).
3
+ //
4
+ // Contract: `--json` / `--yaml` are the *stable* outputs scripts can
5
+ // rely on. The default human view is allowed to evolve. Scripts should
6
+ // either pipe to jq or consume `--names`.
7
+ import { dim, bold, gray, visibleWidth } from "./colors.js";
8
+ /** Emit a list using the chosen format to stdout. */
9
+ export function emitList(opts, choice) {
10
+ const { rows, cols, pluralLabel, nameKey, empty } = opts;
11
+ switch (choice.format) {
12
+ case "json":
13
+ process.stdout.write(JSON.stringify({ [pluralLabel]: rows }, null, 2) + "\n");
14
+ return;
15
+ case "yaml":
16
+ process.stdout.write(toYaml({ [pluralLabel]: rows }) + "\n");
17
+ return;
18
+ case "names": {
19
+ const getName = nameKey ?? ((r) => stripAnsi(cols[0].get(r)));
20
+ for (const r of rows)
21
+ process.stdout.write(getName(r) + "\n");
22
+ return;
23
+ }
24
+ case "wide":
25
+ process.stdout.write(renderTable(rows, cols, true) + "\n");
26
+ return;
27
+ case "human":
28
+ default:
29
+ if (rows.length === 0 && empty) {
30
+ process.stdout.write(dim(empty) + "\n");
31
+ return;
32
+ }
33
+ process.stdout.write(renderTable(rows, cols, false) + "\n");
34
+ return;
35
+ }
36
+ }
37
+ /** Emit a single record as JSON/YAML, or formatted human text. */
38
+ export function emitOne(value, choice) {
39
+ switch (choice.format) {
40
+ case "json":
41
+ case "wide":
42
+ case "human":
43
+ // For one-record output, default to JSON when the user asked for any
44
+ // structured format. The dedicated `bp show` command renders human.
45
+ if (choice.format === "human") {
46
+ process.stdout.write(humanizeOne(value) + "\n");
47
+ }
48
+ else {
49
+ process.stdout.write(JSON.stringify(value, null, 2) + "\n");
50
+ }
51
+ return;
52
+ case "yaml":
53
+ process.stdout.write(toYaml(value) + "\n");
54
+ return;
55
+ case "names":
56
+ if (value && typeof value === "object" && "name" in value) {
57
+ process.stdout.write(String(value.name) + "\n");
58
+ }
59
+ return;
60
+ }
61
+ }
62
+ /** Render a table. Columns auto-size to terminal width; long values are
63
+ * truncated with an ellipsis. Falls back to single-column mode on very
64
+ * narrow terminals. */
65
+ function renderTable(rows, cols, wide) {
66
+ const visible = cols.filter((c) => wide || !c.wide);
67
+ if (visible.length === 0)
68
+ return "";
69
+ const termWidth = process.stdout.columns ?? 100;
70
+ // Compute max content width per column. Numeric columns ignore `max`
71
+ // because truncating "12345" to "1234…" changes the meaning of the
72
+ // value silently; grow the column instead.
73
+ const widths = visible.map((c) => {
74
+ const headerW = visibleWidth(c.header);
75
+ const maxRow = rows.reduce((m, r) => Math.max(m, visibleWidth(c.get(r))), 0);
76
+ const desired = Math.max(headerW, maxRow);
77
+ if (c.numeric)
78
+ return desired;
79
+ return c.max ? Math.min(desired, c.max) : desired;
80
+ });
81
+ // Shrink to fit terminal: subtract 2 chars per gap as separators
82
+ const totalGap = (visible.length - 1) * 2;
83
+ const totalContent = widths.reduce((a, b) => a + b, 0);
84
+ if (totalContent + totalGap > termWidth - 2) {
85
+ // Trim from the longest column repeatedly until we fit
86
+ let budget = termWidth - 2 - totalGap;
87
+ if (budget < visible.length * 6) {
88
+ // Terminal is too narrow for a real table — single-column mode
89
+ return rows.map((r) => visible.map((c, i) => `${dim(visible[i].header)}: ${c.get(r)}`).join("\n")).join("\n\n");
90
+ }
91
+ while (widths.reduce((a, b) => a + b, 0) > budget) {
92
+ const idx = widths.indexOf(Math.max(...widths));
93
+ widths[idx]--;
94
+ if (widths[idx] < 4)
95
+ break;
96
+ }
97
+ }
98
+ const lines = [];
99
+ lines.push(visible.map((c, i) => padRight(bold(c.header), widths[i])).join(" "));
100
+ for (const r of rows) {
101
+ lines.push(visible.map((c, i) => {
102
+ let cell = c.get(r);
103
+ const w = widths[i];
104
+ if (visibleWidth(cell) > w)
105
+ cell = truncate(cell, w);
106
+ cell = padRight(cell, w);
107
+ return c.dim ? dim(cell) : cell;
108
+ }).join(" "));
109
+ }
110
+ return lines.join("\n");
111
+ }
112
+ function humanizeOne(value) {
113
+ if (value === null || value === undefined)
114
+ return dim("(empty)");
115
+ if (typeof value !== "object")
116
+ return String(value);
117
+ const lines = [];
118
+ for (const [k, v] of Object.entries(value)) {
119
+ if (v === undefined)
120
+ continue;
121
+ const formatted = typeof v === "object" && v !== null
122
+ ? JSON.stringify(v, null, 2).split("\n").map((l, i) => i === 0 ? l : " " + l).join("\n")
123
+ : String(v);
124
+ lines.push(`${gray(k + ":")} ${formatted}`);
125
+ }
126
+ return lines.join("\n");
127
+ }
128
+ function padRight(s, width) {
129
+ const w = visibleWidth(s);
130
+ if (w >= width)
131
+ return s;
132
+ return s + " ".repeat(width - w);
133
+ }
134
+ function truncate(s, width) {
135
+ if (visibleWidth(s) <= width)
136
+ return s;
137
+ // Strip ANSI for truncation, then preserve plain content
138
+ const plain = stripAnsi(s);
139
+ if (plain.length <= width)
140
+ return s;
141
+ return plain.slice(0, Math.max(0, width - 1)) + "…";
142
+ }
143
+ function stripAnsi(s) {
144
+ // eslint-disable-next-line no-control-regex
145
+ return s.replace(/\x1b\[[0-9;]*m/g, "");
146
+ }
147
+ /** Minimal YAML serializer for our shapes (objects, arrays, primitives).
148
+ * Doesn't try to be a full YAML 1.2 implementation — sufficient for
149
+ * structured Backpack data. */
150
+ function toYaml(v, indent = 0) {
151
+ const pad = " ".repeat(indent);
152
+ if (v === null || v === undefined)
153
+ return "null";
154
+ if (typeof v === "string")
155
+ return yamlScalar(v);
156
+ if (typeof v === "number" || typeof v === "boolean")
157
+ return String(v);
158
+ if (Array.isArray(v)) {
159
+ if (v.length === 0)
160
+ return "[]";
161
+ return v.map((item) => {
162
+ if (item !== null && typeof item === "object") {
163
+ const inner = toYaml(item, indent + 1);
164
+ // For object items, first line is `- key: value`, rest indented
165
+ const lines = inner.split("\n");
166
+ const firstNonEmpty = lines.findIndex((l) => l.trim().length > 0);
167
+ if (firstNonEmpty === -1)
168
+ return `${pad}- {}`;
169
+ const first = lines[firstNonEmpty].replace(/^\s+/, "");
170
+ const rest = lines.slice(firstNonEmpty + 1).join("\n");
171
+ return rest ? `${pad}- ${first}\n${rest}` : `${pad}- ${first}`;
172
+ }
173
+ return `${pad}- ${toYaml(item, indent + 1)}`;
174
+ }).join("\n");
175
+ }
176
+ if (typeof v === "object") {
177
+ const entries = Object.entries(v).filter(([, val]) => val !== undefined);
178
+ if (entries.length === 0)
179
+ return "{}";
180
+ return entries.map(([k, val]) => {
181
+ if (val !== null && typeof val === "object") {
182
+ const inner = toYaml(val, indent + 1);
183
+ if (Array.isArray(val) && val.length === 0)
184
+ return `${pad}${k}: []`;
185
+ if (!Array.isArray(val) && Object.keys(val).length === 0)
186
+ return `${pad}${k}: {}`;
187
+ return `${pad}${k}:\n${inner}`;
188
+ }
189
+ return `${pad}${k}: ${toYaml(val, indent + 1)}`;
190
+ }).join("\n");
191
+ }
192
+ return String(v);
193
+ }
194
+ function yamlScalar(s) {
195
+ // Quote if any of these are true:
196
+ // - empty string
197
+ // - contains YAML structural chars or block indicators
198
+ // - leading/trailing whitespace, leading dash/question mark
199
+ // - looks like a YAML keyword (true/false/null/yes/no) or a number
200
+ // - contains control characters (newlines, tabs, etc.)
201
+ // JSON.stringify gives us a valid YAML 1.2 double-quoted scalar — it
202
+ // escapes \n, \t, etc. exactly the way YAML expects.
203
+ // eslint-disable-next-line no-control-regex
204
+ const hasControl = /[\x00-\x1f]/.test(s);
205
+ if (hasControl ||
206
+ s === "" ||
207
+ /[:#\[\]{},&*!|>'"%@`]|^\s|\s$|^-|^\?|^(null|true|false|yes|no)$|^-?\d/.test(s)) {
208
+ return JSON.stringify(s);
209
+ }
210
+ return s;
211
+ }
212
+ /** Resolve --json/--yaml/--names/--wide flags to a single OutputFormat. */
213
+ export function resolveFormat(flags) {
214
+ if (flags.json)
215
+ return "json";
216
+ if (flags.yaml)
217
+ return "yaml";
218
+ if (flags.names)
219
+ return "names";
220
+ if (flags.wide)
221
+ return "wide";
222
+ return "human";
223
+ }
224
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface ParsedArgs {
2
+ positional: string[];
3
+ flags: Record<string, string | boolean>;
4
+ /** Raw tokens captured after `--`, never interpreted as flags. */
5
+ rest: string[];
6
+ }
7
+ /**
8
+ * Parse argv (without the leading [node, scriptPath] pair). Doesn't know
9
+ * about commands — produces a generic positional/flag split. Boolean
10
+ * flags are inferred from KNOWN_BOOL_FLAGS so `bp ls --json --names`
11
+ * doesn't accidentally consume `--names` as `json`'s value.
12
+ */
13
+ export declare function parseArgs(argv: string[]): ParsedArgs;
14
+ export declare function flagBool(args: ParsedArgs, ...keys: string[]): boolean;
15
+ export declare function flagString(args: ParsedArgs, ...keys: string[]): string | undefined;
16
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/cli/parser.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACxC,kEAAkE;IAClE,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAOD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAgFpD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAQrE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAOlF"}
@@ -0,0 +1,131 @@
1
+ // Hand-rolled argv parser. Zero deps. Designed for the gh/wrangler grammar
2
+ // (verb + noun + name + flags) plus Unix-style shortcuts (`bp ls`, `bp cat
3
+ // foo`). The parser is intentionally permissive — commands validate their
4
+ // own positional + flag shape.
5
+ //
6
+ // Conventions:
7
+ // --flag boolean true
8
+ // --flag=value explicit value
9
+ // --flag value value is the next token (only if next isn't a flag)
10
+ // --no-flag boolean false (sets `flag` to false)
11
+ // -f short alias (commands map their own)
12
+ // -- stop parsing flags; everything after is positional
13
+ const KNOWN_BOOL_FLAGS = new Set([
14
+ "json", "yaml", "names", "wide", "watch", "all", "help", "h", "H",
15
+ "verbose", "v", "V", "quiet", "q", "yes", "y", "force", "no-color", "version",
16
+ ]);
17
+ /**
18
+ * Parse argv (without the leading [node, scriptPath] pair). Doesn't know
19
+ * about commands — produces a generic positional/flag split. Boolean
20
+ * flags are inferred from KNOWN_BOOL_FLAGS so `bp ls --json --names`
21
+ * doesn't accidentally consume `--names` as `json`'s value.
22
+ */
23
+ export function parseArgs(argv) {
24
+ const positional = [];
25
+ const flags = {};
26
+ const rest = [];
27
+ let i = 0;
28
+ while (i < argv.length) {
29
+ const tok = argv[i];
30
+ if (tok === "--") {
31
+ rest.push(...argv.slice(i + 1));
32
+ break;
33
+ }
34
+ if (tok.startsWith("--")) {
35
+ const eq = tok.indexOf("=");
36
+ let key;
37
+ let value;
38
+ if (eq !== -1) {
39
+ key = tok.slice(2, eq);
40
+ value = tok.slice(eq + 1);
41
+ if (key === "") {
42
+ // `--=foo` is malformed; ignore so we don't pollute flags{}
43
+ i++;
44
+ continue;
45
+ }
46
+ }
47
+ else {
48
+ key = tok.slice(2);
49
+ if (key === "") {
50
+ // pure `--` with content past it is already handled above; bare
51
+ // `--` reaching here means a stray double-dash — skip it
52
+ i++;
53
+ continue;
54
+ }
55
+ if (key.startsWith("no-")) {
56
+ flags[key.slice(3)] = false;
57
+ i++;
58
+ continue;
59
+ }
60
+ if (key.startsWith("-")) {
61
+ // `---foo` or weirder. Drop the extra dashes and treat as
62
+ // a normal flag rather than producing a flag named `-foo`.
63
+ key = key.replace(/^-+/, "");
64
+ if (key === "") {
65
+ i++;
66
+ continue;
67
+ }
68
+ }
69
+ const next = argv[i + 1];
70
+ if (KNOWN_BOOL_FLAGS.has(key) || next === undefined || next.startsWith("-")) {
71
+ value = true;
72
+ }
73
+ else {
74
+ value = next;
75
+ i++;
76
+ }
77
+ }
78
+ flags[key] = value;
79
+ }
80
+ else if (tok.startsWith("-") && tok.length > 1) {
81
+ // Short flag(s). Each char is its own flag. The last char may take a
82
+ // value (`-n value`); the rest are booleans (`-vh` = `-v -h`).
83
+ const chars = tok.slice(1);
84
+ for (let j = 0; j < chars.length; j++) {
85
+ const k = chars[j];
86
+ const isLast = j === chars.length - 1;
87
+ if (isLast) {
88
+ const next = argv[i + 1];
89
+ if (KNOWN_BOOL_FLAGS.has(k) || next === undefined || next.startsWith("-")) {
90
+ flags[k] = true;
91
+ }
92
+ else {
93
+ flags[k] = next;
94
+ i++;
95
+ }
96
+ }
97
+ else {
98
+ flags[k] = true;
99
+ }
100
+ }
101
+ }
102
+ else {
103
+ positional.push(tok);
104
+ }
105
+ i++;
106
+ }
107
+ return { positional, flags, rest };
108
+ }
109
+ export function flagBool(args, ...keys) {
110
+ for (const k of keys) {
111
+ const v = args.flags[k];
112
+ if (v === true)
113
+ return true;
114
+ if (v === "true" || v === "1")
115
+ return true;
116
+ if (v === false || v === "false" || v === "0")
117
+ return false;
118
+ }
119
+ return false;
120
+ }
121
+ export function flagString(args, ...keys) {
122
+ for (const k of keys) {
123
+ const v = args.flags[k];
124
+ if (typeof v === "string")
125
+ return v;
126
+ if (v === true)
127
+ return undefined; // boolean true means "flag present without value"
128
+ }
129
+ return undefined;
130
+ }
131
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/cli/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function run(rawArgv: string[]): Promise<number>;
2
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/cli/router.ts"],"names":[],"mappings":"AA8DA,wBAAsB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAyD5D"}
@@ -0,0 +1,147 @@
1
+ // Top-level CLI dispatch. Maps the first positional token to a command
2
+ // handler. Each handler receives the already-parsed args and returns an
3
+ // exit code (0 ok, non-zero failure). The bin entry calls run() and
4
+ // uses the return value as the process exit code.
5
+ import { parseArgs, flagBool } from "./parser.js";
6
+ import { setColorEnabled } from "./colors.js";
7
+ import { printHint, printFullHelp } from "./help.js";
8
+ import { runVersion } from "./commands/version.js";
9
+ import { runDoctor } from "./commands/doctor.js";
10
+ import { runLogin, runLogout, runWhoami } from "./commands/auth.js";
11
+ import { runWhere, runUse } from "./commands/context.js";
12
+ import { runLs } from "./commands/ls.js";
13
+ import { runCat } from "./commands/cat.js";
14
+ import { runShow } from "./commands/show.js";
15
+ import { runOpen } from "./commands/open.js";
16
+ import { runSearch } from "./commands/search.js";
17
+ import { runGraphs } from "./commands/graphs.js";
18
+ import { runContainers } from "./commands/containers.js";
19
+ import { runKbs } from "./commands/kbs.js";
20
+ import { runDelete, runRename } from "./commands/mutate.js";
21
+ import { runInit } from "./commands/init.js";
22
+ import { runCompletion } from "./commands/completion.js";
23
+ const COMMANDS = {
24
+ // Top-level
25
+ help: async () => { printFullHelp(); return 0; },
26
+ version: async () => runVersion(),
27
+ doctor: runDoctor,
28
+ // Auth
29
+ login: runLogin,
30
+ logout: runLogout,
31
+ whoami: runWhoami,
32
+ // Context
33
+ where: runWhere,
34
+ use: runUse,
35
+ // Read-only daily-driver shortcuts (Unix muscle memory)
36
+ ls: runLs,
37
+ cat: runCat,
38
+ show: runShow,
39
+ open: runOpen,
40
+ search: runSearch,
41
+ // Mutating shortcuts
42
+ rm: runDelete,
43
+ mv: runRename,
44
+ // Project init + shell integration
45
+ init: runInit,
46
+ completion: runCompletion,
47
+ // Canonical gh-style verbs
48
+ graphs: runGraphs, graph: runGraphs,
49
+ containers: runContainers, container: runContainers,
50
+ kbs: runKbs, kb: runKbs,
51
+ };
52
+ export async function run(rawArgv) {
53
+ const args = parseArgs(rawArgv);
54
+ // Honor --no-color globally before any handler emits output. The
55
+ // parser converts --no-color into `color: false`, so check that.
56
+ if (args.flags.color === false)
57
+ setColorEnabled(false);
58
+ // No args: show the hint card
59
+ if (args.positional.length === 0 && Object.keys(args.flags).length === 0) {
60
+ printHint();
61
+ return 0;
62
+ }
63
+ // --version / -V short-circuits
64
+ if (flagBool(args, "version", "V") && args.positional.length === 0) {
65
+ return runVersion();
66
+ }
67
+ // --help / -h with no command
68
+ if (flagBool(args, "help", "h") && args.positional.length === 0) {
69
+ printFullHelp();
70
+ return 0;
71
+ }
72
+ const cmd = args.positional[0];
73
+ const handler = COMMANDS[cmd];
74
+ if (!handler) {
75
+ process.stderr.write(`bp: unknown command "${cmd}"\n`);
76
+ const suggestion = closestCommand(cmd, Object.keys(COMMANDS));
77
+ if (suggestion) {
78
+ process.stderr.write(` did you mean \`bp ${suggestion}\`?\n`);
79
+ }
80
+ process.stderr.write(`run \`bp help\` for the full list of commands\n`);
81
+ return 1;
82
+ }
83
+ // Strip the command token so handlers see clean positional args
84
+ const handlerArgs = {
85
+ positional: args.positional.slice(1),
86
+ flags: args.flags,
87
+ rest: args.rest,
88
+ };
89
+ try {
90
+ const result = await handler(handlerArgs);
91
+ // Defensive: a handler that forgets to `return` would otherwise let
92
+ // process.exit(undefined) be a silent zero. Force a non-zero exit so
93
+ // the bug is loud.
94
+ if (typeof result !== "number") {
95
+ process.stderr.write(`bp: command "${cmd}" returned ${typeof result} (expected number) — treating as failure\n`);
96
+ return 1;
97
+ }
98
+ return result;
99
+ }
100
+ catch (err) {
101
+ process.stderr.write(`bp: ${err.message}\n`);
102
+ return 1;
103
+ }
104
+ }
105
+ /** Cheap edit-distance-style match. Picks the closest command name to
106
+ * the user's typo, but only returns it if the match is "close enough"
107
+ * (avoids suggesting `version` for a totally unrelated typo). */
108
+ function closestCommand(typed, options) {
109
+ if (!typed)
110
+ return null;
111
+ let best = null;
112
+ for (const name of options) {
113
+ const d = levenshtein(typed.toLowerCase(), name.toLowerCase());
114
+ const score = name.length - d; // higher is better; perfect match = name.length
115
+ if (!best || score > best.score)
116
+ best = { name, score };
117
+ }
118
+ if (!best)
119
+ return null;
120
+ // Require the suggestion be at least 60% similar to the typed string.
121
+ const ratio = (best.score + typed.length) / (2 * typed.length);
122
+ return ratio >= 0.6 ? best.name : null;
123
+ }
124
+ function levenshtein(a, b) {
125
+ if (a === b)
126
+ return 0;
127
+ const al = a.length, bl = b.length;
128
+ if (al === 0)
129
+ return bl;
130
+ if (bl === 0)
131
+ return al;
132
+ const prev = new Array(bl + 1);
133
+ const curr = new Array(bl + 1);
134
+ for (let j = 0; j <= bl; j++)
135
+ prev[j] = j;
136
+ for (let i = 1; i <= al; i++) {
137
+ curr[0] = i;
138
+ for (let j = 1; j <= bl; j++) {
139
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
140
+ curr[j] = Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost);
141
+ }
142
+ for (let j = 0; j <= bl; j++)
143
+ prev[j] = curr[j];
144
+ }
145
+ return prev[bl];
146
+ }
147
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/cli/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ParsedArgs } from "../parser.js";
2
+ export declare function confirm(prompt: string, args: ParsedArgs): Promise<boolean>;
3
+ //# sourceMappingURL=confirm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../../src/cli/util/confirm.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,UAAU,EAAY,MAAM,cAAc,CAAC;AAGpD,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAgChF"}
@@ -0,0 +1,48 @@
1
+ // Shared confirmation prompt. Used by every destructive verb so we
2
+ // don't end up with two slightly-different implementations that drift.
3
+ //
4
+ // Behavior:
5
+ // * `--yes` / `-y` short-circuits to true.
6
+ // * In a TTY, the prompt is printed to stderr (so stdout pipes don't
7
+ // swallow it) and the user's typed answer is parsed.
8
+ // * In non-TTY without `--yes`, refuse — destructive ops shouldn't
9
+ // proceed unattended without an explicit affirmative.
10
+ // * EOF (Ctrl-D) before newline resolves to whatever's been typed —
11
+ // no infinite hang.
12
+ import { flagBool } from "../parser.js";
13
+ import { yellow } from "../colors.js";
14
+ export async function confirm(prompt, args) {
15
+ if (flagBool(args, "yes", "y"))
16
+ return true;
17
+ if (!process.stdin.isTTY) {
18
+ process.stderr.write(`${yellow("!")} stdin is not a TTY — pass --yes to confirm in non-interactive contexts.\n`);
19
+ return false;
20
+ }
21
+ process.stderr.write(prompt);
22
+ const answer = await new Promise((resolve) => {
23
+ let buf = "";
24
+ process.stdin.setEncoding("utf8");
25
+ const onData = (chunk) => {
26
+ buf += chunk;
27
+ const nl = buf.indexOf("\n");
28
+ if (nl !== -1) {
29
+ cleanup();
30
+ resolve(buf.slice(0, nl).trim());
31
+ }
32
+ };
33
+ const onEnd = () => {
34
+ cleanup();
35
+ resolve(buf.trim());
36
+ };
37
+ const cleanup = () => {
38
+ process.stdin.removeListener("data", onData);
39
+ process.stdin.removeListener("end", onEnd);
40
+ process.stdin.pause();
41
+ };
42
+ process.stdin.on("data", onData);
43
+ process.stdin.on("end", onEnd);
44
+ process.stdin.resume();
45
+ });
46
+ return /^y(es)?$/i.test(answer);
47
+ }
48
+ //# sourceMappingURL=confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../../src/cli/util/confirm.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,uEAAuE;AACvE,EAAE;AACF,YAAY;AACZ,6CAA6C;AAC7C,uEAAuE;AACvE,yDAAyD;AACzD,qEAAqE;AACrE,0DAA0D;AAC1D,sEAAsE;AACtE,wBAAwB;AAExB,OAAO,EAAc,QAAQ,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAc,EAAE,IAAgB;IAC5D,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;QACjH,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAW,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACnD,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC/B,GAAG,IAAI,KAAK,CAAC;YACb,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;gBACd,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACtB,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
@@ -92,6 +92,14 @@ export declare class Backpack {
92
92
  loadOntology(name: string): Promise<LearningGraphData>;
93
93
  createOntology(name: string, description: string): Promise<LearningGraphMetadata>;
94
94
  deleteOntology(name: string): Promise<void>;
95
+ /**
96
+ * Replace the contents of an existing graph with `data`. Preserves the
97
+ * graph's directory (branches, snapshots, snippets, lock) — the storage
98
+ * layer diffs the new data against current state and appends events.
99
+ * Does NOT create the graph if missing — callers should check existence
100
+ * first or use `createOntologyFromData`.
101
+ */
102
+ saveOntologyData(name: string, data: LearningGraphData): Promise<void>;
95
103
  /**
96
104
  * Create a new ontology from a full LearningGraphData payload, preserving
97
105
  * node and edge IDs. Used by remote graph import (where we want the local