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
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|
package/dist/core/backpack.d.ts
CHANGED
|
@@ -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
|