@baryonlabs/cli 0.1.0 → 0.2.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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > Baryon CLI — **AI 코딩·학습 에이전트**. `baryon.ai` API에 기본 연결된 [pi](https://www.npmjs.com/package/@earendil-works/pi-coding-agent) 코딩 에이전트 래퍼.
4
4
 
5
- 한 줄 설치, 별도 키 설정 없이 시작, 상용·로컬 모델 무중단 전환. 교육기관 납품용으로 설계되었습니다.
5
+ 한 줄 설치, 별도 키 설정 없이 시작, 상용·로컬 모델 무중단 전환. 교육기관 기업 사내 AI 인프라(온프레미스) 구축용으로 설계되었습니다.
6
6
 
7
7
  ```bash
8
8
  npm install -g @baryonlabs/cli # 또는 pnpm / yarn / bun
@@ -34,6 +34,7 @@ curl -fsSL https://cli.baryon.ai/install.sh | sh
34
34
  | `baryon setup` | API 키 등록 + pi 프로바이더 구성 |
35
35
  | `baryon config` | 현재 설정 보기 (`--key`, `--base-url`, `--model` 로 변경) |
36
36
  | `baryon models` | 사용 가능한 모델 목록 (`pi --list-models` 패스스루) |
37
+ | `baryon extensions` | 기본 확장 설치(서브에이전트·캔버스·셸·웹), `list` 로 목록 |
37
38
  | `baryon doctor` | 설치·연결 진단 |
38
39
  | `baryon update` | CLI + pi 에이전트 업데이트 |
39
40
  | `baryon help` | 도움말 |
@@ -46,6 +47,16 @@ baryon @report.md "요약해줘" # 파일 첨부
46
47
  baryon --provider openai # 다른 모델로 전환·비교
47
48
  ```
48
49
 
50
+ ## 기본 탑재 확장
51
+
52
+ `baryon setup` 시 아래 pi 확장이 자동 설치되어 바로 쓸 수 있습니다(`--no-extensions` 로 건너뛰기, `baryon extensions` 로 재설치):
53
+
54
+ - **서브에이전트** — 작업 분해·위임·통합 ([pi-subagents](https://github.com/nicobailon/pi-subagents))
55
+ - **캔버스** ([pi-canvas](https://github.com/jyaunches/pi-canvas))
56
+ - **인터랙티브 셸** ([pi-interactive-shell](https://github.com/nicobailon/pi-interactive-shell))
57
+ - **웹 액세스** ([pi-web-access](https://github.com/nicobailon/pi-web-access))
58
+ - **웹 페치** ([pi-web-fetch](https://github.com/georgebashi/pi-web-fetch))
59
+
49
60
  ## 설정
50
61
 
51
62
  | 항목 | 기본값 | 재정의 |
package/bin/baryon.js CHANGED
@@ -6,6 +6,8 @@ import {
6
6
  doctor,
7
7
  models,
8
8
  configCmd,
9
+ keys,
10
+ extensions,
9
11
  update,
10
12
  help,
11
13
  welcome,
@@ -47,6 +49,12 @@ async function main() {
47
49
  return models(rest);
48
50
  case "config":
49
51
  return configCmd(rest);
52
+ case "keys":
53
+ case "key":
54
+ return keys();
55
+ case "extensions":
56
+ case "ext":
57
+ return extensions(rest);
50
58
  case "update":
51
59
  case "upgrade":
52
60
  return update();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@baryonlabs/cli",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Baryon CLI — AI 코딩·학습 에이전트. baryon.ai API에 기본 연결된 pi 코딩 에이전트 래퍼. 한 줄 설치, 상용·로컬 모델 전환.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/commands.js CHANGED
@@ -10,10 +10,14 @@ import {
10
10
  BARYON_CONFIG,
11
11
  PI_MODELS_JSON,
12
12
  } from "./config.js";
13
+ import { spawnSync } from "node:child_process";
13
14
  import {
14
15
  DEFAULT_BASE_URL,
16
+ DEFAULT_EXTENSIONS,
15
17
  DEFAULT_MODELS,
16
18
  HOMEPAGE,
19
+ KEYS_URL,
20
+ KEY_PREFIX,
17
21
  PI_PACKAGE,
18
22
  PROVIDER,
19
23
  SUPPORT_EMAIL,
@@ -47,10 +51,15 @@ export async function setup(args) {
47
51
 
48
52
  let apiKey = flags.key || flags["api-key"] || process.env.BARYON_API_KEY || "";
49
53
  if (!apiKey) {
54
+ // Tell the user where keys come from before asking for one.
55
+ log(` ${sym.info} 키 발급·관리: ${c.lime(KEYS_URL)}`);
56
+ log(` ${c.dim(` (vibecamp.us 대시보드에서 발급/회수 · 형식 ${KEY_PREFIX}…)`)}\n`);
50
57
  apiKey = await promptHidden(` ${sym.info} baryon.ai API key: `);
51
58
  }
52
59
  if (!apiKey) {
53
60
  warn("API 키 없이 저장합니다. 나중에 `baryon setup --key <KEY>` 로 추가하세요.");
61
+ } else if (!apiKey.startsWith(KEY_PREFIX)) {
62
+ warn(`키 형식이 ${KEY_PREFIX}… 가 아닙니다. 로컬/상용 키라면 무시하세요.`);
54
63
  }
55
64
 
56
65
  saveConfig({ apiKey, baseUrl });
@@ -73,6 +82,12 @@ export async function setup(args) {
73
82
  const file = syncPiModels({ baseUrl, models });
74
83
  ok(`pi 프로바이더 ${c.lime(PROVIDER)} 구성 → ${c.dim(file)}`);
75
84
 
85
+ if (flags["no-extensions"]) {
86
+ info("기본 확장 설치 건너뜀 (--no-extensions)");
87
+ } else {
88
+ installDefaults();
89
+ }
90
+
76
91
  log(`\n ${sym.ok} 준비 완료. ${c.lime("baryon")} 으로 시작하세요.\n`);
77
92
  return 0;
78
93
  }
@@ -154,12 +169,37 @@ export async function configCmd(args) {
154
169
  info(`base URL ${c.lime(cfg.baseUrl)}`);
155
170
  info(`default ${c.lime(cfg.defaultModel)}`);
156
171
  info(`API key ${cfg.apiKey ? cfg.apiKey.slice(0, 4) + "•".repeat(6) : c.dim("(없음)")}`);
172
+ info(`키 관리 ${c.lime(KEYS_URL)}`);
157
173
  info(`config 파일 ${c.dim(BARYON_CONFIG)}`);
158
174
  info(`pi models ${c.dim(PI_MODELS_JSON)}`);
159
175
  log("");
160
176
  return 0;
161
177
  }
162
178
 
179
+ export function keys() {
180
+ log(` ${sym.info} 키 발급·관리 (vibecamp.us 대시보드):`);
181
+ log(` ${c.lime(KEYS_URL)}`);
182
+ log(` ${c.dim(` 발급/회수/쿼터는 vibecamp.us 가 관리 · 형식 ${KEY_PREFIX}…`)}`);
183
+ log(` ${c.dim(" 발급 후:")} ${c.lime("baryon setup")} ${c.dim("또는")} ${c.lime("baryon config --key vc_live_…")}`);
184
+ // best-effort open in browser
185
+ const opener =
186
+ process.platform === "darwin"
187
+ ? "open"
188
+ : process.platform === "win32"
189
+ ? "start"
190
+ : "xdg-open";
191
+ try {
192
+ spawn(opener, [KEYS_URL], {
193
+ stdio: "ignore",
194
+ detached: true,
195
+ shell: process.platform === "win32",
196
+ }).unref();
197
+ } catch {
198
+ /* headless / no browser — link above is enough */
199
+ }
200
+ return 0;
201
+ }
202
+
163
203
  export function update() {
164
204
  return new Promise((resolve) => {
165
205
  log(` ${sym.info} 업데이트: ${c.lime(`npm install -g @baryonlabs/cli ${PI_PACKAGE}`)}\n`);
@@ -176,6 +216,46 @@ export function update() {
176
216
  });
177
217
  }
178
218
 
219
+ export function installDefaults() {
220
+ const entry = resolvePiEntry();
221
+
222
+ if (!entry) {
223
+ warn(`${PI_PACKAGE} 미설치 — 확장 건너뜀`);
224
+ return 0;
225
+ }
226
+
227
+ log(` ${sym.info} 기본 확장 설치 중 (${DEFAULT_EXTENSIONS.length}종 · git clone, 잠시 걸립니다)…`);
228
+ let okc = 0;
229
+
230
+ for (const e of DEFAULT_EXTENSIONS) {
231
+ const r = spawnSync(process.execPath, [entry, "install", e.src], { encoding: "utf8" });
232
+
233
+ if (r.status === 0) {
234
+ ok(`${e.name} — ${e.note}`);
235
+ okc++;
236
+ } else {
237
+ warn(`${e.name} 설치 실패(네트워크/git 확인) — 건너뜀`);
238
+ }
239
+ }
240
+
241
+ log(` ${sym.ok} 확장 ${okc}/${DEFAULT_EXTENSIONS.length} 설치`);
242
+ return okc;
243
+ }
244
+
245
+ export function extensions(args) {
246
+ const sub = args[0];
247
+
248
+ if (sub === "list" || sub === "ls") {
249
+ return runPi(["list"], loadConfig(), { injectTargeting: false })
250
+ }
251
+
252
+ banner();
253
+ log(c.bold(" Baryon 기본 확장\n"));
254
+ installDefaults()
255
+ log(`\n ${sym.info} 목록: ${c.lime("baryon extensions list")} · 제거: ${c.lime("baryon -- remove <src>")}\n`)
256
+ return 0;
257
+ }
258
+
179
259
  export function help() {
180
260
  banner();
181
261
  log(`${c.bold("USAGE")}
@@ -183,8 +263,10 @@ export function help() {
183
263
 
184
264
  ${c.bold("COMMANDS")}
185
265
  ${c.lime("baryon setup")} baryon.ai API 키 등록 + pi 프로바이더 구성
266
+ ${c.lime("baryon keys")} 키 발급·관리 대시보드 열기 ${c.dim("(vibecamp.us)")}
186
267
  ${c.lime("baryon config")} 현재 설정 보기 ${c.dim("(--key/--base-url/--model 로 변경)")}
187
268
  ${c.lime("baryon models")} 사용 가능한 모델 목록
269
+ ${c.lime("baryon extensions")} 기본 확장 설치(서브에이전트·캔버스·셸·웹) ${c.dim("· list 로 목록")}
188
270
  ${c.lime("baryon doctor")} 설치·연결 진단
189
271
  ${c.lime("baryon update")} CLI + pi 에이전트 업데이트
190
272
  ${c.lime("baryon help")} 이 도움말
package/src/constants.js CHANGED
@@ -47,5 +47,26 @@ export const DEFAULT_MODELS = [
47
47
  },
48
48
  ];
49
49
 
50
+ /**
51
+ * Extensions installed by default so `baryon` ships with sub-agents, a canvas,
52
+ * an interactive shell, and web access/fetch out of the box. Installed via
53
+ * `pi install <src>` into ~/.pi/agent/settings.json (loaded on startup).
54
+ */
55
+ export const DEFAULT_EXTENSIONS = [
56
+ { name: "pi-subagents", src: "https://github.com/nicobailon/pi-subagents", note: "서브에이전트(작업 분해·위임·통합)" },
57
+ { name: "pi-canvas", src: "https://github.com/jyaunches/pi-canvas", note: "캔버스" },
58
+ { name: "pi-interactive-shell", src: "https://github.com/nicobailon/pi-interactive-shell", note: "인터랙티브 셸" },
59
+ { name: "pi-web-access", src: "https://github.com/nicobailon/pi-web-access", note: "웹 액세스(브라우징)" },
60
+ { name: "pi-web-fetch", src: "https://github.com/georgebashi/pi-web-fetch", note: "웹 페치" }
61
+ ];
62
+
50
63
  export const HOMEPAGE = "https://cli.baryon.ai";
51
64
  export const SUPPORT_EMAIL = "support@baryon.ai";
65
+
66
+ /**
67
+ * Where end users issue / rotate / revoke their baryon.ai key.
68
+ * vibecamp.us is the source of truth for key issuance, scope, quota and
69
+ * revocation. Keys look like `vc_live_…`. Override with BARYON_KEYS_URL.
70
+ */
71
+ export const KEYS_URL = process.env.BARYON_KEYS_URL || "https://vibecamp.us/dashboard";
72
+ export const KEY_PREFIX = "vc_live_";