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,159 @@
1
+ // `bp completion <shell>` — print a shell completion script. The user
2
+ // installs it into their shell config; we don't try to write to their
3
+ // rc file. Supported: bash, zsh, fish.
4
+ const COMMANDS = [
5
+ "help", "version", "doctor",
6
+ "login", "logout", "whoami",
7
+ "where", "use",
8
+ "ls", "cat", "show", "open", "search", "rm", "mv",
9
+ "graphs", "graph", "containers", "container", "kbs", "kb",
10
+ "init", "completion",
11
+ ];
12
+ export async function runCompletion(args) {
13
+ const shell = args.positional[0];
14
+ if (!shell) {
15
+ process.stderr.write(`bp completion: shell required.\nusage: bp completion <bash|zsh|fish>\n`);
16
+ return 1;
17
+ }
18
+ switch (shell) {
19
+ case "bash":
20
+ process.stdout.write(bashScript() + "\n");
21
+ return 0;
22
+ case "zsh":
23
+ process.stdout.write(zshScript() + "\n");
24
+ return 0;
25
+ case "fish":
26
+ process.stdout.write(fishScript() + "\n");
27
+ return 0;
28
+ default:
29
+ process.stderr.write(`bp completion: unknown shell "${shell}". try bash, zsh, or fish.\n`);
30
+ return 1;
31
+ }
32
+ }
33
+ function bashScript() {
34
+ return `# bp bash completion. install with:
35
+ # bp completion bash > ~/.local/share/bash-completion/completions/bp
36
+ # or source the output directly from your bashrc.
37
+
38
+ _bp_local_backpacks() {
39
+ # Parse the JSON registry without requiring jq. The shape is
40
+ # { "paths": ["/abs/path1", "/abs/path2"], ... }
41
+ # so we grep the array, split on quoted strings, and emit basenames.
42
+ local f="\${XDG_CONFIG_HOME:-\$HOME/.config}/backpack/backpacks.json"
43
+ [ -f "\$f" ] || return
44
+ local arr
45
+ arr=\$(tr -d '\\n' < "\$f" | grep -oE '"paths"[[:space:]]*:[[:space:]]*\\[[^]]*\\]')
46
+ echo "\$arr" | grep -oE '"[^"]+"' | sed 's/^"//; s/"$//' | while read -r p; do
47
+ [ -n "\$p" ] && echo "local:\$(basename "\$p")"
48
+ done
49
+ }
50
+
51
+ _bp_completions() {
52
+ local cur prev cmds
53
+ COMPREPLY=()
54
+ cur="\${COMP_WORDS[COMP_CWORD]}"
55
+ prev="\${COMP_WORDS[COMP_CWORD-1]}"
56
+ cmds="${COMMANDS.join(" ")}"
57
+ if [ "\$COMP_CWORD" -eq 1 ]; then
58
+ COMPREPLY=( \$(compgen -W "\$cmds" -- "\$cur") )
59
+ return 0
60
+ fi
61
+ case "\$prev" in
62
+ graphs|graph)
63
+ COMPREPLY=( \$(compgen -W "list get describe create delete rename apply edit move" -- "\$cur") )
64
+ return 0
65
+ ;;
66
+ kbs|kb)
67
+ COMPREPLY=( \$(compgen -W "list get create edit delete move" -- "\$cur") )
68
+ return 0
69
+ ;;
70
+ containers|container)
71
+ COMPREPLY=( \$(compgen -W "list create rename delete" -- "\$cur") )
72
+ return 0
73
+ ;;
74
+ completion)
75
+ COMPREPLY=( \$(compgen -W "bash zsh fish" -- "\$cur") )
76
+ return 0
77
+ ;;
78
+ use)
79
+ local backpacks
80
+ backpacks=\$(_bp_local_backpacks)
81
+ COMPREPLY=( \$(compgen -W "\$backpacks" -- "\$cur") )
82
+ return 0
83
+ ;;
84
+ esac
85
+ }
86
+ complete -F _bp_completions bp
87
+ `;
88
+ }
89
+ function zshScript() {
90
+ return `# bp zsh completion. install with:
91
+ # bp completion zsh > "\${fpath[1]}/_bp"
92
+
93
+ _bp_local_backpacks() {
94
+ local f="\${XDG_CONFIG_HOME:-\$HOME/.config}/backpack/backpacks.json"
95
+ [[ -f "\$f" ]] || return
96
+ local arr
97
+ arr="\$(tr -d '\\n' < "\$f" | grep -oE '"paths"[[:space:]]*:[[:space:]]*\\[[^]]*\\]')"
98
+ echo "\$arr" | grep -oE '"[^"]+"' | sed 's/^"//; s/"$//' | while read -r p; do
99
+ [[ -n "\$p" ]] && echo "local:\${p##*/}"
100
+ done
101
+ }
102
+
103
+ _bp() {
104
+ local -a commands
105
+ commands=(${COMMANDS.map((c) => `'${c}:bp ${c}'`).join(" ")})
106
+ if (( CURRENT == 2 )); then
107
+ _describe 'command' commands
108
+ return
109
+ fi
110
+ case "\${words[2]}" in
111
+ graphs|graph)
112
+ _values 'verb' list get describe create delete rename apply edit move
113
+ ;;
114
+ kbs|kb)
115
+ _values 'verb' list get create edit delete move
116
+ ;;
117
+ containers|container)
118
+ _values 'verb' list create rename delete
119
+ ;;
120
+ completion)
121
+ _values 'shell' bash zsh fish
122
+ ;;
123
+ use)
124
+ local -a contexts
125
+ contexts=("\${(@f)$(_bp_local_backpacks)}")
126
+ _describe 'context' contexts
127
+ ;;
128
+ esac
129
+ }
130
+ compdef _bp bp
131
+ `;
132
+ }
133
+ function fishScript() {
134
+ return `# bp fish completion. install with:
135
+ # bp completion fish > ~/.config/fish/completions/bp.fish
136
+
137
+ function __bp_local_backpacks
138
+ set -l f "$XDG_CONFIG_HOME"
139
+ test -z "$f"; and set f "$HOME/.config"
140
+ set f "$f/backpack/backpacks.json"
141
+ test -f "$f"; or return
142
+ set -l arr (tr -d '\\n' < "$f" | string match -r '"paths"\\s*:\\s*\\[[^]]*\\]')
143
+ test -z "$arr"; and return
144
+ echo $arr | string match -r -a '"[^"]+"' | string trim -c '"' | while read -l p
145
+ test -n "$p"; and echo "local:"(basename $p)
146
+ end
147
+ end
148
+
149
+ complete -c bp -f
150
+ ${COMMANDS.map((c) => `complete -c bp -n '__fish_use_subcommand' -a '${c}'`).join("\n")}
151
+
152
+ complete -c bp -n '__fish_seen_subcommand_from graphs graph' -a 'list get describe create delete rename apply edit move'
153
+ complete -c bp -n '__fish_seen_subcommand_from kbs kb' -a 'list get create edit delete move'
154
+ complete -c bp -n '__fish_seen_subcommand_from containers container' -a 'list create rename delete'
155
+ complete -c bp -n '__fish_seen_subcommand_from completion' -a 'bash zsh fish'
156
+ complete -c bp -n '__fish_seen_subcommand_from use' -a '(__bp_local_backpacks)'
157
+ `;
158
+ }
159
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/cli/commands/completion.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,sEAAsE;AACtE,uCAAuC;AAIvC,MAAM,QAAQ,GAAG;IACf,MAAM,EAAE,SAAS,EAAE,QAAQ;IAC3B,OAAO,EAAE,QAAQ,EAAE,QAAQ;IAC3B,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI;IACjD,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI;IACzD,MAAM,EAAE,YAAY;CACrB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAgB;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC/F,OAAO,CAAC,CAAC;IACX,CAAC;IACD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;YAC1C,OAAO,CAAC,CAAC;QACX,KAAK,KAAK;YACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;YACzC,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;YAC1C,OAAO,CAAC,CAAC;QACX;YACE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,KAAK,8BAA8B,CAAC,CAAC;YAC3F,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,OAAO;;;;;;;;;;;;;;;;;;;;;;UAsBC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B3B,CAAC;AACF,CAAC;AAED,SAAS,SAAS;IAChB,OAAO;;;;;;;;;;;;;;;cAeK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B5D,CAAC;AACF,CAAC;AAED,SAAS,UAAU;IACjB,OAAO;;;;;;;;;;;;;;;;EAgBP,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iDAAiD,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;CAOtF,CAAC;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ParsedArgs } from "../parser.js";
2
+ export declare function runContainers(args: ParsedArgs): Promise<number>;
3
+ //# sourceMappingURL=containers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containers.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/containers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI1C,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBrE"}
@@ -0,0 +1,30 @@
1
+ // `bp containers <verb>` — canonical form. Read + cloud admin verbs.
2
+ import { runLs } from "./ls.js";
3
+ import { runContainerCreate, runContainerRename, runContainerDelete } from "./cloud-admin.js";
4
+ export async function runContainers(args) {
5
+ const verb = args.positional[0];
6
+ if (!verb) {
7
+ process.stderr.write(`bp containers: verb required.\nusage: bp containers <list|create|rename|delete> [args]\n`);
8
+ return 1;
9
+ }
10
+ const sub = { positional: args.positional.slice(1), flags: args.flags, rest: args.rest };
11
+ switch (verb) {
12
+ case "list":
13
+ case "ls":
14
+ return runLs({ ...sub, positional: ["containers", ...sub.positional] });
15
+ case "create":
16
+ case "new":
17
+ return runContainerCreate(sub);
18
+ case "rename":
19
+ case "mv":
20
+ return runContainerRename(sub);
21
+ case "delete":
22
+ case "rm":
23
+ case "remove":
24
+ return runContainerDelete(sub);
25
+ default:
26
+ process.stderr.write(`bp containers: unknown verb "${verb}". try list, create, rename, or delete.\n`);
27
+ return 1;
28
+ }
29
+ }
30
+ //# sourceMappingURL=containers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containers.js","sourceRoot":"","sources":["../../../src/cli/commands/containers.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAGrE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE9F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAgB;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0FAA0F,CAAC,CAAC;QACjH,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,GAAG,GAAe,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACrG,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,IAAI;YACP,OAAO,KAAK,CAAC,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC1E,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK;YACR,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV,KAAK,QAAQ;YACX,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACjC;YACE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,2CAA2C,CAAC,CAAC;YACtG,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ParsedArgs } from "../parser.js";
2
+ export declare function runWhere(): Promise<number>;
3
+ export declare function runUse(args: ParsedArgs): Promise<number>;
4
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAW1C,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAehD;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAsC9D"}
@@ -0,0 +1,61 @@
1
+ // `bp where`, `bp use <name>`. Operates on the CLI context state file.
2
+ import { authStatus } from "../../ops/auth.js";
3
+ import { getContext, setContext, listContexts, resolveContextName, describeContext, } from "../../ops/context.js";
4
+ import { bold, dim, green, red, cyan } from "../colors.js";
5
+ export async function runWhere() {
6
+ const ctx = await getContext();
7
+ const auth = await authStatus();
8
+ process.stdout.write(`context: ${bold(describeContext(ctx))}\n`);
9
+ if (ctx.source === "local" && ctx.backpackPath) {
10
+ process.stdout.write(dim(` path: ${ctx.backpackPath}\n`));
11
+ }
12
+ else if (ctx.source === "cloud") {
13
+ process.stdout.write(dim(` endpoint: ${auth.endpoint}\n`));
14
+ }
15
+ if (auth.authenticated) {
16
+ process.stdout.write(dim(` identity: ${auth.email ?? "(unknown email)"}\n`));
17
+ }
18
+ else {
19
+ process.stdout.write(dim(` identity: ${dim("not signed in")}\n`));
20
+ }
21
+ return 0;
22
+ }
23
+ export async function runUse(args) {
24
+ const target = args.positional[0];
25
+ if (!target) {
26
+ // Print the picker
27
+ const all = await listContexts();
28
+ if (all.length === 0) {
29
+ process.stdout.write(`${dim("no contexts available. register a local backpack or run")} ${bold("bp login")}\n`);
30
+ return 0;
31
+ }
32
+ const cur = describeContext(await getContext());
33
+ process.stdout.write(bold("available contexts:") + "\n");
34
+ for (const c of all) {
35
+ const marker = c.name === cur ? cyan("*") : " ";
36
+ process.stdout.write(` ${marker} ${bold(c.name)}${c.detail ? dim(" " + c.detail) : ""}\n`);
37
+ }
38
+ process.stdout.write(dim("\nuse: bp use <name>\n"));
39
+ return 0;
40
+ }
41
+ const result = await resolveContextName(target);
42
+ if (!result.ctx) {
43
+ if ("ambiguous" in result && result.ambiguous && result.ambiguous.length > 0) {
44
+ process.stderr.write(`${red("✗")} ${bold(target)} is ambiguous — matches multiple contexts:\n`);
45
+ for (const name of result.ambiguous) {
46
+ process.stderr.write(` - ${bold(name)}\n`);
47
+ }
48
+ process.stderr.write(dim(`pass the full name (e.g. \`bp use ${result.ambiguous[0]}\`).\n`));
49
+ return 1;
50
+ }
51
+ process.stderr.write(`${red("✗")} no context named ${bold(target)}\n`);
52
+ if ("suggestions" in result && result.suggestions && result.suggestions.length > 0) {
53
+ process.stderr.write(dim(` did you mean: ${result.suggestions.join(", ")}?\n`));
54
+ }
55
+ return 1;
56
+ }
57
+ await setContext(result.ctx);
58
+ process.stdout.write(`${green("✓")} context → ${bold(result.ctx.name)}\n`);
59
+ return 0;
60
+ }
61
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ParsedArgs } from "../parser.js";
2
+ export declare function runDoctor(args: ParsedArgs): Promise<number>;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAY,MAAM,cAAc,CAAC;AAWpD,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA+DjE"}
@@ -0,0 +1,74 @@
1
+ // `bp doctor` — quick health check: token validity, endpoint reachability,
2
+ // active context, version. Outputs a human checklist by default and JSON
3
+ // when --json is passed.
4
+ import { flagBool } from "../parser.js";
5
+ import { resolveCloudToken, getRelayUrl, emailFromToken, assertSafeRelay } from "../../ops/auth.js";
6
+ import { getContext, describeContext } from "../../ops/context.js";
7
+ import { bold, green, red, yellow } from "../colors.js";
8
+ export async function runDoctor(args) {
9
+ const checks = [];
10
+ // 1. Active context
11
+ try {
12
+ const ctx = await getContext();
13
+ checks.push({ name: "context", ok: true, detail: describeContext(ctx) });
14
+ }
15
+ catch (err) {
16
+ checks.push({ name: "context", ok: false, detail: err.message });
17
+ }
18
+ // 2. Token presence
19
+ const token = await resolveCloudToken();
20
+ if (token) {
21
+ const email = emailFromToken(token);
22
+ checks.push({ name: "auth", ok: true, detail: `signed in${email ? ` as ${email}` : ""}` });
23
+ }
24
+ else {
25
+ checks.push({ name: "auth", ok: false, detail: "not signed in (run `bp login`)" });
26
+ }
27
+ // 3. Cloud reachability — only when signed in. We hit /api/sync/backpacks
28
+ // because it requires auth (proves the token works) and returns a small
29
+ // payload regardless of how many graphs the user has.
30
+ if (token) {
31
+ try {
32
+ assertSafeRelay(getRelayUrl());
33
+ const res = await fetch(`${getRelayUrl()}/api/sync/backpacks`, {
34
+ headers: { Authorization: `Bearer ${token}` },
35
+ });
36
+ if (res.ok) {
37
+ checks.push({ name: "cloud", ok: true, detail: `${getRelayUrl()} reachable (HTTP ${res.status})` });
38
+ }
39
+ else if (res.status === 401) {
40
+ checks.push({ name: "cloud", ok: false, detail: `${getRelayUrl()} rejected token (HTTP 401) — re-run \`bp login\`` });
41
+ }
42
+ else {
43
+ checks.push({ name: "cloud", ok: false, detail: `${getRelayUrl()} (HTTP ${res.status})` });
44
+ }
45
+ }
46
+ catch (err) {
47
+ checks.push({ name: "cloud", ok: false, detail: `${getRelayUrl()} unreachable: ${err.message}` });
48
+ }
49
+ }
50
+ else {
51
+ checks.push({ name: "cloud", ok: true, detail: "skipped (not signed in)" });
52
+ }
53
+ // 4. Node version sanity
54
+ const major = parseInt(process.versions.node.split(".")[0], 10);
55
+ if (major >= 18) {
56
+ checks.push({ name: "node", ok: true, detail: process.versions.node });
57
+ }
58
+ else {
59
+ checks.push({ name: "node", ok: false, detail: `${process.versions.node} (need >= 18)` });
60
+ }
61
+ if (flagBool(args, "json")) {
62
+ process.stdout.write(JSON.stringify({ checks }, null, 2) + "\n");
63
+ }
64
+ else {
65
+ for (const c of checks) {
66
+ const mark = c.ok ? green("✓") : red("✗");
67
+ process.stdout.write(`${mark} ${bold(c.name.padEnd(8))} ${c.ok ? c.detail : yellow(c.detail)}\n`);
68
+ }
69
+ const failures = checks.filter((c) => !c.ok).length;
70
+ process.stdout.write("\n" + (failures === 0 ? green("everything looks good.") : red(`${failures} check${failures === 1 ? "" : "s"} failed.`)) + "\n");
71
+ }
72
+ return checks.every((c) => c.ok) ? 0 : 1;
73
+ }
74
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ParsedArgs } from "../parser.js";
2
+ export declare function runGraphs(args: ParsedArgs): Promise<number>;
3
+ //# sourceMappingURL=graphs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/graphs.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ1C,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDjE"}
@@ -0,0 +1,68 @@
1
+ // `bp graphs <verb>` — canonical (gh-style) form. Read-only verbs in
2
+ // Step 2: list, get, describe. Mutating verbs (create, delete, rename,
3
+ // apply, edit) land in Step 3.
4
+ //
5
+ // `bp graph <name>` (singular, no verb) is treated as `bp graph describe
6
+ // <name>` — the natural-language thing the user typed almost always
7
+ // means "show me this graph."
8
+ import { runLs } from "./ls.js";
9
+ import { runCat } from "./cat.js";
10
+ import { runShow } from "./show.js";
11
+ import { runCreate, runDelete, runRename, runApply, runEdit } from "./mutate.js";
12
+ import { runMoveGraph } from "./cloud-admin.js";
13
+ import { getGraphSummary } from "../../ops/graphs.js";
14
+ export async function runGraphs(args) {
15
+ const verb = args.positional[0];
16
+ if (!verb) {
17
+ process.stderr.write(`bp graphs: verb required.\nusage: bp graphs <list|get|describe> [args]\n`);
18
+ return 1;
19
+ }
20
+ const sub = { positional: args.positional.slice(1), flags: args.flags, rest: args.rest };
21
+ switch (verb) {
22
+ case "list":
23
+ case "ls":
24
+ // Force resource = graphs
25
+ return runLs({ ...sub, positional: ["graphs", ...sub.positional] });
26
+ case "get":
27
+ case "cat":
28
+ return runCat(sub);
29
+ case "describe":
30
+ case "show":
31
+ return runShow(sub);
32
+ case "create":
33
+ case "new":
34
+ return runCreate(sub);
35
+ case "delete":
36
+ case "rm":
37
+ case "remove":
38
+ return runDelete(sub);
39
+ case "rename":
40
+ case "mv":
41
+ return runRename(sub);
42
+ case "apply":
43
+ return runApply(sub);
44
+ case "edit":
45
+ return runEdit(sub);
46
+ case "move":
47
+ case "mv-to":
48
+ return runMoveGraph(sub);
49
+ default: {
50
+ // Natural-language fallback: `bp graph delgate` → describe delgate.
51
+ // Only takes effect when there's no further positional arg (so we
52
+ // don't grab `bp graph foo bar` when `foo` was a typo'd verb).
53
+ const couldBeName = args.positional.length === 1 && verb && !verb.startsWith("-");
54
+ if (couldBeName) {
55
+ try {
56
+ const summary = await getGraphSummary(verb);
57
+ if (summary) {
58
+ return runShow({ positional: [verb], flags: args.flags, rest: args.rest });
59
+ }
60
+ }
61
+ catch { /* fall through to verb error */ }
62
+ }
63
+ process.stderr.write(`bp graphs: unknown verb "${verb}". try list, get, or describe.\n`);
64
+ return 1;
65
+ }
66
+ }
67
+ }
68
+ //# sourceMappingURL=graphs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphs.js","sourceRoot":"","sources":["../../../src/cli/commands/graphs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ParsedArgs } from "../parser.js";
2
+ export declare function runInit(args: ParsedArgs): Promise<number>;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAW1C,wBAAsB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAgD/D"}
@@ -0,0 +1,56 @@
1
+ // `bp init [path]` — create a new backpack root in the current
2
+ // directory (or the given path), register it in the local backpack
3
+ // registry, and switch the active CLI context to it.
4
+ import * as fs from "node:fs/promises";
5
+ import * as path from "node:path";
6
+ import { configDir } from "../../core/paths.js";
7
+ import { setContext } from "../../ops/context.js";
8
+ import { red, green, dim, bold, yellow } from "../colors.js";
9
+ export async function runInit(args) {
10
+ const target = args.positional[0]
11
+ ? path.resolve(args.positional[0])
12
+ : process.cwd();
13
+ // Verify the target is a directory if it exists. Re-running init on
14
+ // an already-registered path is idempotent — it just bumps `active`.
15
+ try {
16
+ const stat = await fs.stat(target);
17
+ if (!stat.isDirectory()) {
18
+ process.stderr.write(`${red("✗")} ${target} is not a directory.\n`);
19
+ return 1;
20
+ }
21
+ }
22
+ catch {
23
+ // Doesn't exist; we'll create it below.
24
+ }
25
+ await fs.mkdir(target, { recursive: true });
26
+ // Read or initialize the registry. Layout:
27
+ // { version: 2, paths: [...], active: "/some/path" }
28
+ const regPath = path.join(configDir(), "backpacks.json");
29
+ let reg;
30
+ try {
31
+ const raw = await fs.readFile(regPath, "utf8");
32
+ reg = JSON.parse(raw);
33
+ if (!Array.isArray(reg.paths))
34
+ reg.paths = [];
35
+ }
36
+ catch {
37
+ reg = { version: 2, paths: [] };
38
+ }
39
+ if (reg.paths.includes(target)) {
40
+ process.stdout.write(`${yellow("!")} ${dim(target)} is already registered.\n`);
41
+ }
42
+ else {
43
+ reg.paths.push(target);
44
+ process.stdout.write(`${green("✓")} registered ${bold(target)}\n`);
45
+ }
46
+ reg.active = target;
47
+ await fs.mkdir(path.dirname(regPath), { recursive: true });
48
+ await fs.writeFile(regPath, JSON.stringify(reg, null, 2), "utf8");
49
+ // Update CLI context state file too, so `bp ls` / `bp where` see the
50
+ // change without needing a separate `bp use`.
51
+ await setContext({ source: "local", backpackPath: target });
52
+ process.stdout.write(`${green("✓")} active context → ${bold("local:" + path.basename(target))}\n`);
53
+ process.stdout.write(dim("\n ready. try: `bp ls` to see what's in this backpack (it'll be empty until you create graphs).\n"));
54
+ return 0;
55
+ }
56
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ParsedArgs } from "../parser.js";
2
+ export declare function runKbs(args: ParsedArgs): Promise<number>;
3
+ //# sourceMappingURL=kbs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kbs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/kbs.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAc,MAAM,cAAc,CAAC;AAQtD,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CA8B9D"}