connectbase-client 0.6.0 → 0.6.2

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/dist/cli.js CHANGED
@@ -302,11 +302,18 @@ ${colors.cyan}Connect Base \uD504\uB85C\uC81D\uD2B8 \uCD08\uAE30\uD654${colors.r
302
302
  return;
303
303
  }
304
304
  }
305
- const apiKey = await prompt(`${colors.blue}?${colors.reset} API Key: `);
305
+ log(`${colors.dim}Public Key (cb_pk_): SDK\uC6A9 \u2014 \uC6F9/\uC571\uC5D0\uC11C \uC0AC\uC6A9${colors.reset}`);
306
+ log(`${colors.dim}Secret Key (cb_sk_): MCP/\uAD00\uB9AC\uC790\uC6A9 \u2014 \uC808\uB300 \uB178\uCD9C \uAE08\uC9C0${colors.reset}
307
+ `);
308
+ const apiKey = await prompt(`${colors.blue}?${colors.reset} API Key (Public Key \uAD8C\uC7A5): `);
306
309
  if (!apiKey) {
307
310
  error("API Key\uB294 \uD544\uC218\uC785\uB2C8\uB2E4");
308
311
  process.exit(1);
309
312
  }
313
+ if (apiKey.startsWith("cb_sk_")) {
314
+ warn("Secret Key\uAC00 \uC785\uB825\uB418\uC5C8\uC2B5\uB2C8\uB2E4. SDK\uC5D0\uB294 Public Key (cb_pk_) \uC0AC\uC6A9\uC744 \uAD8C\uC7A5\uD569\uB2C8\uB2E4.");
315
+ warn("Secret Key\uB294 \uC804\uCCB4 \uAD8C\uD55C\uC744 \uAC00\uC9C0\uBBC0\uB85C \uCF54\uB4DC\uC5D0 \uB178\uCD9C\uB418\uC9C0 \uC54A\uB3C4\uB85D \uC8FC\uC758\uD558\uC138\uC694.");
316
+ }
310
317
  let storageId = "";
311
318
  try {
312
319
  info("\uC6F9 \uC2A4\uD1A0\uB9AC\uC9C0 \uC870\uD68C \uC911...");
@@ -444,141 +451,52 @@ async function setupClaudeCode(apiKey) {
444
451
  if (!fs.existsSync(claudeDir)) {
445
452
  fs.mkdirSync(claudeDir, { recursive: true });
446
453
  }
447
- const claudeMdContent = `# CLAUDE.md
448
-
449
- This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
450
-
451
- ## Connect Base SDK
454
+ log(`
455
+ ${colors.dim}SDK \uAC00\uC774\uB4DC \uD15C\uD50C\uB9BF:${colors.reset}`);
456
+ log(` ${colors.cyan}1${colors.reset}) \uAE30\uBCF8 SDK (Database, Auth, Realtime, Storage, Payment, Push, Ads)`);
457
+ log(` ${colors.cyan}2${colors.reset}) \uAE30\uBCF8 SDK + \uAC8C\uC784 \uC11C\uBC84 (\uBA40\uD2F0\uD50C\uB808\uC774\uC5B4)`);
458
+ log(` ${colors.cyan}3${colors.reset}) \uAE30\uBCF8 SDK + \uBE44\uB514\uC624 \uC11C\uBC84 (\uB3D9\uC601\uC0C1 \uD50C\uB7AB\uD3FC)`);
459
+ log(` ${colors.cyan}4${colors.reset}) \uAE30\uBCF8 SDK + \uAC8C\uC784 \uC11C\uBC84 + \uBE44\uB514\uC624 \uC11C\uBC84`);
460
+ const templateChoice = await prompt(`
461
+ ${colors.blue}?${colors.reset} \uC120\uD0DD (1): `) || "1";
462
+ const templates = ["fullstack"];
463
+ if (templateChoice === "2" || templateChoice === "4") templates.push("game-server");
464
+ if (templateChoice === "3" || templateChoice === "4") templates.push("video-server");
465
+ info("SDK \uAC1C\uBC1C \uAC00\uC774\uB4DC \uB2E4\uC6B4\uB85C\uB4DC \uC911...");
466
+ try {
467
+ let claudeMdContent = "";
468
+ for (const tmpl of templates) {
469
+ const claudeMdRes = await makeRequest(
470
+ `${DEFAULT_BASE_URL}/v1/storages/webs/claude-md?api_key=${encodeURIComponent(apiKey)}&template=${tmpl}`,
471
+ "GET",
472
+ {}
473
+ );
474
+ if (claudeMdRes.status === 200 && typeof claudeMdRes.data === "string") {
475
+ if (claudeMdContent) claudeMdContent += "\n\n---\n\n";
476
+ claudeMdContent += claudeMdRes.data;
477
+ } else {
478
+ throw new Error(`HTTP ${claudeMdRes.status} for template ${tmpl}`);
479
+ }
480
+ }
481
+ fs.writeFileSync(claudeMdPath, claudeMdContent);
482
+ const tmplNames = templates.join(" + ");
483
+ success(`.claude/CLAUDE.md \uC0DD\uC131 \uC644\uB8CC (${tmplNames})`);
484
+ } catch {
485
+ warn("SDK \uAC00\uC774\uB4DC \uB2E4\uC6B4\uB85C\uB4DC \uC2E4\uD328, \uAE30\uBCF8 CLAUDE.md\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4");
486
+ fs.writeFileSync(claudeMdPath, `# Connect Base SDK
452
487
 
453
488
  \uC774 \uD504\uB85C\uC81D\uD2B8\uB294 Connect Base SDK\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.
454
489
 
455
- ### \uC124\uCE58
456
-
457
- \`\`\`bash
458
- npm install connectbase-client
459
- \`\`\`
460
-
461
- ### \uAE30\uBCF8 \uC0AC\uC6A9\uBC95
462
-
463
- \`\`\`typescript
464
- import ConnectBase from 'connectbase-client'
465
-
466
- const cb = new ConnectBase({
467
- apiKey: 'YOUR_API_KEY'
468
- })
469
- \`\`\`
470
-
471
- ### Database API
472
-
473
- \`\`\`typescript
474
- // \uB370\uC774\uD130 \uC870\uD68C
475
- const { data, total } = await cb.database.getData('table-id', {
476
- limit: 20,
477
- offset: 0,
478
- select: ['id', 'name', 'thumbnail'], // \uD2B9\uC815 \uD544\uB4DC\uB9CC \uC870\uD68C
479
- exclude: ['html_content'] // \uD2B9\uC815 \uD544\uB4DC \uC81C\uC678
480
- })
481
-
482
- // \uC870\uAC74\uBD80 \uCFFC\uB9AC
483
- const result = await cb.database.queryData('table-id', {
484
- where: { field: 'status', operator: 'eq', value: 'active' },
485
- orderBy: 'created_at',
486
- orderDirection: 'desc'
487
- })
488
-
489
- // \uB370\uC774\uD130 \uC0DD\uC131
490
- const newItem = await cb.database.createData('table-id', {
491
- data: { name: 'John', email: 'john@example.com' }
492
- })
493
-
494
- // \uB370\uC774\uD130 \uC218\uC815
495
- await cb.database.updateData('table-id', 'data-id', {
496
- data: { name: 'Jane' }
497
- })
498
-
499
- // \uB370\uC774\uD130 \uC0AD\uC81C
500
- await cb.database.deleteData('table-id', 'data-id')
501
- \`\`\`
502
-
503
- ### Storage API
504
-
505
- \`\`\`typescript
506
- // \uD30C\uC77C \uC5C5\uB85C\uB4DC
507
- const result = await cb.storage.uploadFile(file)
508
-
509
- // \uD30C\uC77C \uBAA9\uB85D \uC870\uD68C
510
- const files = await cb.storage.listFiles()
511
- \`\`\`
512
-
513
- ### Auth API
514
-
515
- \`\`\`typescript
516
- // \uD68C\uC6D0\uAC00\uC785
517
- await cb.auth.signUp({ email, password })
518
-
519
- // \uB85C\uADF8\uC778
520
- const { member, tokens } = await cb.auth.signIn({ email, password })
521
-
522
- // \uB85C\uADF8\uC544\uC6C3
523
- await cb.auth.signOut()
524
- \`\`\`
525
-
526
- ### Functions API
527
-
528
- \`\`\`typescript
529
- // Serverless \uD568\uC218 \uD638\uCD9C
530
- const result = await cb.functions.invoke('function-name', {
531
- param1: 'value1'
532
- })
533
- \`\`\`
534
-
535
- ### Realtime API
536
-
537
- \`\`\`typescript
538
- // WebSocket \uC5F0\uACB0
539
- cb.realtime.connect()
540
-
541
- // \uCC44\uB110 \uAD6C\uB3C5
542
- cb.realtime.subscribe('channel-name', (message) => {
543
- console.log('\uBC1B\uC740 \uBA54\uC2DC\uC9C0:', message)
544
- })
545
-
546
- // \uBA54\uC2DC\uC9C0 \uC804\uC1A1
547
- cb.realtime.send('channel-name', { text: 'Hello!' })
548
- \`\`\`
549
-
550
- ## Where \uC5F0\uC0B0\uC790
551
-
552
- | \uC5F0\uC0B0\uC790 | \uC124\uBA85 |
553
- |--------|------|
554
- | \`eq\` | \uAC19\uC74C (=) |
555
- | \`neq\` | \uAC19\uC9C0 \uC54A\uC74C (!=) |
556
- | \`gt\` | \uD07C (>) |
557
- | \`gte\` | \uD06C\uAC70\uB098 \uAC19\uC74C (>=) |
558
- | \`lt\` | \uC791\uC74C (<) |
559
- | \`lte\` | \uC791\uAC70\uB098 \uAC19\uC74C (<=) |
560
- | \`like\` | \uBD80\uBD84 \uC77C\uCE58 |
561
- | \`in\` | \uBC30\uC5F4\uC5D0 \uD3EC\uD568 |
562
- | \`nin\` | \uBC30\uC5F4\uC5D0 \uBBF8\uD3EC\uD568 |
563
- | \`between\` | \uBC94\uC704 \uB0B4 |
564
- | \`is_null\` | NULL \uCCB4\uD06C |
565
- | \`regex\` | \uC815\uADDC\uC2DD \uB9E4\uCE6D |
566
- | \`array_contains\` | \uBC30\uC5F4 \uD544\uB4DC\uC5D0 \uAC12 \uD3EC\uD568 |
567
-
568
- ## \uBC30\uD3EC
569
-
570
- \`\`\`bash
571
- npm run deploy
572
- \`\`\`
573
- `;
574
- fs.writeFileSync(claudeMdPath, claudeMdContent);
575
- success(".claude/CLAUDE.md \uC0DD\uC131 \uC644\uB8CC");
490
+ \uC790\uC138\uD55C \uAC00\uC774\uB4DC: https://connectbase.world
491
+ `);
492
+ success(".claude/CLAUDE.md \uC0DD\uC131 \uC644\uB8CC (\uAE30\uBCF8)");
493
+ }
576
494
  const mcpConfig = {
577
495
  mcpServers: {
578
496
  connectbase: {
579
497
  url: "https://mcp.connectbase.world/mcp",
580
498
  headers: {
581
- Authorization: `Bearer ${apiKey}`
499
+ Authorization: "Bearer YOUR_SECRET_KEY_HERE"
582
500
  }
583
501
  }
584
502
  }
@@ -586,7 +504,9 @@ npm run deploy
586
504
  fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2) + "\n");
587
505
  success(".mcp.json \uC0DD\uC131 \uC644\uB8CC");
588
506
  addToGitignore(".mcp.json");
589
- info("Claude Code\uC5D0\uC11C MCP \uC11C\uBC84\uB97C \uC0AC\uC6A9\uD558\uB824\uBA74 .mcp.json \uD30C\uC77C\uC774 \uD544\uC694\uD569\uB2C8\uB2E4");
507
+ warn("MCP \uC11C\uBC84\uB294 Secret Key (cb_sk_)\uB9CC \uD5C8\uC6A9\uD569\uB2C8\uB2E4.");
508
+ info(".mcp.json \uD30C\uC77C\uC758 YOUR_SECRET_KEY_HERE\uB97C Secret Key\uB85C \uAD50\uCCB4\uD558\uC138\uC694.");
509
+ info("Secret Key\uB294 \uCF58\uC194 > \uC124\uC815 > API Keys\uC5D0\uC11C \uC0DD\uC131\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.");
590
510
  }
591
511
  function createWsTextFrame(payload) {
592
512
  const data = Buffer.from(payload, "utf-8");
package/dist/index.d.mts CHANGED
@@ -1426,11 +1426,14 @@ declare class RealtimeAPI {
1426
1426
  *
1427
1427
  * @example
1428
1428
  * ```typescript
1429
+ * // 브라우저에서 사용
1430
+ * const outputEl = document.getElementById('ai-output')
1431
+ *
1429
1432
  * const session = await client.realtime.stream(
1430
1433
  * [{ role: 'user', content: '안녕하세요' }],
1431
1434
  * {
1432
1435
  * onToken: (token) => {
1433
- * process.stdout.write(token) // 실시간 출력
1436
+ * outputEl.textContent += token // 실시간 출력
1434
1437
  * },
1435
1438
  * onDone: (result) => {
1436
1439
  * console.log('완료:', result.fullText)
@@ -1439,7 +1442,7 @@ declare class RealtimeAPI {
1439
1442
  * console.error('에러:', error)
1440
1443
  * }
1441
1444
  * },
1442
- * { model: 'gemini-2.0-flash', temperature: 0.7 }
1445
+ * { provider: 'gemini', model: 'gemini-2.0-flash', temperature: 0.7 }
1443
1446
  * )
1444
1447
  *
1445
1448
  * // 필요 시 중지
package/dist/index.d.ts CHANGED
@@ -1426,11 +1426,14 @@ declare class RealtimeAPI {
1426
1426
  *
1427
1427
  * @example
1428
1428
  * ```typescript
1429
+ * // 브라우저에서 사용
1430
+ * const outputEl = document.getElementById('ai-output')
1431
+ *
1429
1432
  * const session = await client.realtime.stream(
1430
1433
  * [{ role: 'user', content: '안녕하세요' }],
1431
1434
  * {
1432
1435
  * onToken: (token) => {
1433
- * process.stdout.write(token) // 실시간 출력
1436
+ * outputEl.textContent += token // 실시간 출력
1434
1437
  * },
1435
1438
  * onDone: (result) => {
1436
1439
  * console.log('완료:', result.fullText)
@@ -1439,7 +1442,7 @@ declare class RealtimeAPI {
1439
1442
  * console.error('에러:', error)
1440
1443
  * }
1441
1444
  * },
1442
- * { model: 'gemini-2.0-flash', temperature: 0.7 }
1445
+ * { provider: 'gemini', model: 'gemini-2.0-flash', temperature: 0.7 }
1443
1446
  * )
1444
1447
  *
1445
1448
  * // 필요 시 중지
package/dist/index.js CHANGED
@@ -1403,11 +1403,14 @@ var RealtimeAPI = class {
1403
1403
  *
1404
1404
  * @example
1405
1405
  * ```typescript
1406
+ * // 브라우저에서 사용
1407
+ * const outputEl = document.getElementById('ai-output')
1408
+ *
1406
1409
  * const session = await client.realtime.stream(
1407
1410
  * [{ role: 'user', content: '안녕하세요' }],
1408
1411
  * {
1409
1412
  * onToken: (token) => {
1410
- * process.stdout.write(token) // 실시간 출력
1413
+ * outputEl.textContent += token // 실시간 출력
1411
1414
  * },
1412
1415
  * onDone: (result) => {
1413
1416
  * console.log('완료:', result.fullText)
@@ -1416,7 +1419,7 @@ var RealtimeAPI = class {
1416
1419
  * console.error('에러:', error)
1417
1420
  * }
1418
1421
  * },
1419
- * { model: 'gemini-2.0-flash', temperature: 0.7 }
1422
+ * { provider: 'gemini', model: 'gemini-2.0-flash', temperature: 0.7 }
1420
1423
  * )
1421
1424
  *
1422
1425
  * // 필요 시 중지
package/dist/index.mjs CHANGED
@@ -1368,11 +1368,14 @@ var RealtimeAPI = class {
1368
1368
  *
1369
1369
  * @example
1370
1370
  * ```typescript
1371
+ * // 브라우저에서 사용
1372
+ * const outputEl = document.getElementById('ai-output')
1373
+ *
1371
1374
  * const session = await client.realtime.stream(
1372
1375
  * [{ role: 'user', content: '안녕하세요' }],
1373
1376
  * {
1374
1377
  * onToken: (token) => {
1375
- * process.stdout.write(token) // 실시간 출력
1378
+ * outputEl.textContent += token // 실시간 출력
1376
1379
  * },
1377
1380
  * onDone: (result) => {
1378
1381
  * console.log('완료:', result.fullText)
@@ -1381,7 +1384,7 @@ var RealtimeAPI = class {
1381
1384
  * console.error('에러:', error)
1382
1385
  * }
1383
1386
  * },
1384
- * { model: 'gemini-2.0-flash', temperature: 0.7 }
1387
+ * { provider: 'gemini', model: 'gemini-2.0-flash', temperature: 0.7 }
1385
1388
  * )
1386
1389
  *
1387
1390
  * // 필요 시 중지
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "connectbase-client",
3
- "version": "0.6.0",
3
+ "version": "0.6.2",
4
4
  "description": "Connect Base JavaScript/TypeScript SDK for browser and Node.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -16,6 +16,7 @@
16
16
  "browser": "dist/connect-base.umd.js",
17
17
  "unpkg": "dist/connect-base.umd.js",
18
18
  "bin": {
19
+ "connectbase": "./dist/cli.js",
19
20
  "connectbase-client": "./dist/cli.js"
20
21
  },
21
22
  "exports": {