@brightdata/cli 0.1.2 → 0.1.4

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Bright Data Ltd.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  <p align="center">
12
12
  <a href="https://www.npmjs.com/package/%40brightdata%2Fcli"><img src="https://img.shields.io/npm/v/%40brightdata%2Fcli?color=black&label=npm" alt="npm version" /></a>
13
13
  <img src="https://img.shields.io/badge/node-%3E%3D20-black" alt="node requirement" />
14
- <img src="https://img.shields.io/badge/license-ISC-black" alt="license" />
14
+ <img src="https://img.shields.io/badge/license-MIT-black" alt="license" />
15
15
  </p>
16
16
 
17
17
  ---
@@ -28,6 +28,7 @@
28
28
  | `brightdata zones` | List and inspect your Bright Data proxy zones |
29
29
  | `brightdata budget` | View account balance and per-zone cost & bandwidth |
30
30
  | `brightdata skill` | Install Bright Data AI agent skills into your coding agent |
31
+ | `brightdata add mcp` | Add the Bright Data MCP server to Claude Code, Cursor, or Codex |
31
32
  | `brightdata config` | Manage CLI configuration |
32
33
  | `brightdata init` | Interactive setup wizard |
33
34
 
@@ -47,6 +48,7 @@
47
48
  - [zones](#zones)
48
49
  - [budget](#budget)
49
50
  - [skill](#skill)
51
+ - [add mcp](#add-mcp)
50
52
  - [config](#config)
51
53
  - [login / logout](#login--logout)
52
54
  - [Configuration](#configuration)
@@ -60,17 +62,31 @@
60
62
 
61
63
  ## Installation
62
64
 
65
+ > **Requires [Node.js](https://nodejs.org/) ≥ 20**
66
+
67
+ ### macOS / Linux
68
+
63
69
  ```bash
70
+ curl -fsSL https://cli.brightdata.com/install.sh | sh
71
+ ```
72
+
73
+ ### Windows
74
+
75
+ ```powershell
64
76
  npm install -g @brightdata/cli
65
77
  ```
66
78
 
67
- Or run without installing:
79
+ ### Or install manually on any platform
68
80
 
69
81
  ```bash
70
- npx --yes --package @brightdata/cli brightdata <command>
82
+ npm install -g @brightdata/cli
71
83
  ```
72
84
 
73
- > **Requires Node.js 20.0.0**
85
+ You can also run without installing:
86
+
87
+ ```bash
88
+ npx --yes --package @brightdata/cli brightdata <command>
89
+ ```
74
90
 
75
91
  ---
76
92
 
@@ -91,6 +107,9 @@ brightdata pipelines linkedin_person_profile "https://linkedin.com/in/username"
91
107
 
92
108
  # 5. Check your account balance
93
109
  brightdata budget
110
+
111
+ # 6. Install the Bright Data MCP server into your coding agent
112
+ brightdata add mcp
94
113
  ```
95
114
 
96
115
  ---
@@ -117,6 +136,8 @@ On first login the CLI checks for required zones (`cli_unlocker`, `cli_browser`)
117
136
  brightdata logout
118
137
  ```
119
138
 
139
+ `brightdata add mcp` uses the API key stored by `brightdata login`. It does not currently read `BRIGHTDATA_API_KEY` or the global `--api-key` flag, so log in first before using it.
140
+
120
141
  ---
121
142
 
122
143
  ## Commands
@@ -383,6 +404,54 @@ brightdata skill list
383
404
 
384
405
  ---
385
406
 
407
+ ### `add mcp`
408
+
409
+ Write a Bright Data MCP server entry into Claude Code, Cursor, or Codex config files using the API key already stored by `brightdata login`.
410
+
411
+ ```bash
412
+ brightdata add mcp # Interactive agent + scope prompts
413
+ brightdata add mcp --agent claude-code --global
414
+ brightdata add mcp --agent claude-code,cursor --project
415
+ brightdata add mcp --agent codex --global
416
+ ```
417
+
418
+ | Flag | Description |
419
+ |---|---|
420
+ | `--agent <agents>` | Comma-separated targets: `claude-code,cursor,codex` |
421
+ | `--global` | Install to the agent's global config file |
422
+ | `--project` | Install to the current project's config file |
423
+
424
+ **Config targets**
425
+
426
+ | Agent | Global path | Project path |
427
+ |---|---|---|
428
+ | Claude Code | `~/.claude.json` | `.claude/settings.json` |
429
+ | Cursor | `~/.cursor/mcp.json` | `.cursor/mcp.json` |
430
+ | Codex | `$CODEX_HOME/mcp.json` or `~/.codex/mcp.json` | Not supported |
431
+
432
+ The command writes the MCP server under `mcpServers["bright-data"]`:
433
+
434
+ ```json
435
+ {
436
+ "mcpServers": {
437
+ "bright-data": {
438
+ "command": "npx",
439
+ "args": ["@brightdata/mcp"],
440
+ "env": {
441
+ "API_TOKEN": "<stored-api-key>"
442
+ }
443
+ }
444
+ }
445
+ }
446
+ ```
447
+
448
+ Behavior notes:
449
+ - Existing config is preserved; only `mcpServers["bright-data"]` is added or replaced.
450
+ - If the target config contains invalid JSON, the CLI warns and offers to overwrite it in interactive mode.
451
+ - In non-interactive mode, pass both `--agent` and the appropriate scope flag to skip prompts.
452
+
453
+ ---
454
+
386
455
  ### `config`
387
456
 
388
457
  View and manage CLI configuration.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=add-mcp.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-mcp.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/commands/add-mcp.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const os_1 = __importDefault(require("os"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const vitest_1 = require("vitest");
10
+ const mocks = vitest_1.vi.hoisted(() => ({
11
+ checkbox: vitest_1.vi.fn(),
12
+ select: vitest_1.vi.fn(),
13
+ confirm: vitest_1.vi.fn(),
14
+ get_api_key: vitest_1.vi.fn(),
15
+ dim: vitest_1.vi.fn((msg) => msg),
16
+ green: vitest_1.vi.fn((msg) => msg),
17
+ red: vitest_1.vi.fn((msg) => msg),
18
+ warn: vitest_1.vi.fn(),
19
+ }));
20
+ vitest_1.vi.mock('@inquirer/prompts', () => ({
21
+ checkbox: mocks.checkbox,
22
+ select: mocks.select,
23
+ confirm: mocks.confirm,
24
+ }));
25
+ vitest_1.vi.mock('../../utils/credentials', () => ({
26
+ get_api_key: mocks.get_api_key,
27
+ }));
28
+ vitest_1.vi.mock('../../utils/output', () => ({
29
+ dim: mocks.dim,
30
+ green: mocks.green,
31
+ red: mocks.red,
32
+ warn: mocks.warn,
33
+ }));
34
+ const add_mcp_1 = require("../../commands/add-mcp");
35
+ const get_expected_entry = (api_key) => ({
36
+ command: 'npx',
37
+ args: ['@brightdata/mcp'],
38
+ env: {
39
+ API_TOKEN: api_key,
40
+ },
41
+ });
42
+ const mk_tmp_dir = () => fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'brightdata-add-mcp-'));
43
+ const read_json = (file_path) => JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'));
44
+ (0, vitest_1.describe)('commands/add-mcp', () => {
45
+ let tmp_dir = '';
46
+ let home_dir = '';
47
+ let project_dir = '';
48
+ let codex_home = '';
49
+ let original_cwd = '';
50
+ let stdin_tty;
51
+ let stdout_tty;
52
+ (0, vitest_1.beforeEach)(() => {
53
+ vitest_1.vi.clearAllMocks();
54
+ tmp_dir = mk_tmp_dir();
55
+ home_dir = path_1.default.join(tmp_dir, 'home');
56
+ project_dir = path_1.default.join(tmp_dir, 'project');
57
+ codex_home = path_1.default.join(tmp_dir, 'codex-home');
58
+ original_cwd = process.cwd();
59
+ stdin_tty = Object.getOwnPropertyDescriptor(process.stdin, 'isTTY');
60
+ stdout_tty = Object.getOwnPropertyDescriptor(process.stdout, 'isTTY');
61
+ fs_1.default.mkdirSync(home_dir, { recursive: true });
62
+ fs_1.default.mkdirSync(project_dir, { recursive: true });
63
+ process.chdir(project_dir);
64
+ process.env['CODEX_HOME'] = codex_home;
65
+ vitest_1.vi.spyOn(os_1.default, 'homedir').mockReturnValue(home_dir);
66
+ Object.defineProperty(process.stdin, 'isTTY', {
67
+ value: true,
68
+ configurable: true,
69
+ });
70
+ Object.defineProperty(process.stdout, 'isTTY', {
71
+ value: true,
72
+ configurable: true,
73
+ });
74
+ mocks.get_api_key.mockReturnValue('test_api_key');
75
+ mocks.checkbox.mockResolvedValue(['claude-code', 'cursor', 'codex']);
76
+ mocks.select.mockResolvedValue('project');
77
+ mocks.confirm.mockResolvedValue(true);
78
+ vitest_1.vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
79
+ });
80
+ (0, vitest_1.afterEach)(() => {
81
+ process.chdir(original_cwd);
82
+ if (stdin_tty)
83
+ Object.defineProperty(process.stdin, 'isTTY', stdin_tty);
84
+ if (stdout_tty)
85
+ Object.defineProperty(process.stdout, 'isTTY', stdout_tty);
86
+ delete process.env['CODEX_HOME'];
87
+ vitest_1.vi.restoreAllMocks();
88
+ if (tmp_dir)
89
+ fs_1.default.rmSync(tmp_dir, { recursive: true, force: true });
90
+ });
91
+ (0, vitest_1.it)('writes selected agent configs in the full interactive flow', async () => {
92
+ await (0, add_mcp_1.run_add_mcp)();
93
+ (0, vitest_1.expect)(mocks.checkbox).toHaveBeenCalledOnce();
94
+ (0, vitest_1.expect)(mocks.select).toHaveBeenCalledOnce();
95
+ (0, vitest_1.expect)(mocks.confirm).not.toHaveBeenCalled();
96
+ (0, vitest_1.expect)(read_json(path_1.default.join(project_dir, '.claude', 'settings.json')))
97
+ .toEqual({
98
+ mcpServers: {
99
+ 'bright-data': get_expected_entry('test_api_key'),
100
+ },
101
+ });
102
+ (0, vitest_1.expect)(read_json(path_1.default.join(project_dir, '.cursor', 'mcp.json')))
103
+ .toEqual({
104
+ mcpServers: {
105
+ 'bright-data': get_expected_entry('test_api_key'),
106
+ },
107
+ });
108
+ (0, vitest_1.expect)(read_json(path_1.default.join(codex_home, 'mcp.json')))
109
+ .toEqual({
110
+ mcpServers: {
111
+ 'bright-data': get_expected_entry('test_api_key'),
112
+ },
113
+ });
114
+ (0, vitest_1.expect)(fs_1.default.existsSync(path_1.default.join(home_dir, '.claude.json'))).toBe(false);
115
+ (0, vitest_1.expect)(fs_1.default.existsSync(path_1.default.join(home_dir, '.cursor', 'mcp.json')))
116
+ .toBe(false);
117
+ });
118
+ (0, vitest_1.it)('warns and overwrites invalid JSON after confirmation', async () => {
119
+ const cursor_config = path_1.default.join(project_dir, '.cursor', 'mcp.json');
120
+ fs_1.default.mkdirSync(path_1.default.dirname(cursor_config), { recursive: true });
121
+ fs_1.default.writeFileSync(cursor_config, '{invalid-json');
122
+ mocks.checkbox.mockResolvedValue(['cursor']);
123
+ mocks.select.mockResolvedValue('project');
124
+ mocks.confirm.mockResolvedValue(true);
125
+ await (0, add_mcp_1.run_add_mcp)();
126
+ (0, vitest_1.expect)(mocks.warn).toHaveBeenCalledWith(vitest_1.expect.stringContaining('Invalid JSON in ' + cursor_config));
127
+ (0, vitest_1.expect)(mocks.confirm).toHaveBeenCalledWith({
128
+ message: 'Overwrite invalid config at ' + cursor_config + '?',
129
+ default: false,
130
+ });
131
+ (0, vitest_1.expect)(read_json(cursor_config)).toEqual({
132
+ mcpServers: {
133
+ 'bright-data': get_expected_entry('test_api_key'),
134
+ },
135
+ });
136
+ });
137
+ });
138
+ //# sourceMappingURL=add-mcp.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-mcp.test.js","sourceRoot":"","sources":["../../../src/__tests__/commands/add-mcp.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/mcp-config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const os_1 = __importDefault(require("os"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const vitest_1 = require("vitest");
10
+ const mcp_config_1 = require("../../utils/mcp-config");
11
+ const get_expected_entry = (api_key) => ({
12
+ command: 'npx',
13
+ args: ['@brightdata/mcp'],
14
+ env: {
15
+ API_TOKEN: api_key,
16
+ },
17
+ });
18
+ const mk_tmp_dir = () => fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'brightdata-mcp-config-'));
19
+ (0, vitest_1.describe)('utils/mcp-config', () => {
20
+ let tmp_dir = '';
21
+ (0, vitest_1.beforeEach)(() => {
22
+ tmp_dir = mk_tmp_dir();
23
+ });
24
+ (0, vitest_1.afterEach)(() => {
25
+ vitest_1.vi.restoreAllMocks();
26
+ delete process.env['CODEX_HOME'];
27
+ if (tmp_dir)
28
+ fs_1.default.rmSync(tmp_dir, { recursive: true, force: true });
29
+ });
30
+ (0, vitest_1.it)('creates a new config file when none exists', () => {
31
+ const file_path = path_1.default.join(tmp_dir, 'mcp.json');
32
+ (0, mcp_config_1.upsert_mcp_config)(file_path, 'new_key');
33
+ (0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'))).toEqual({
34
+ mcpServers: {
35
+ 'bright-data': get_expected_entry('new_key'),
36
+ },
37
+ });
38
+ (0, vitest_1.expect)(fs_1.default.statSync(file_path).mode & 0o777).toBe(0o600);
39
+ });
40
+ (0, vitest_1.it)('merges the Bright Data server into an existing config', () => {
41
+ const file_path = path_1.default.join(tmp_dir, 'mcp.json');
42
+ fs_1.default.writeFileSync(file_path, JSON.stringify({
43
+ theme: 'light',
44
+ mcpServers: {
45
+ existing: {
46
+ command: 'node',
47
+ },
48
+ },
49
+ }, null, 4));
50
+ (0, mcp_config_1.upsert_mcp_config)(file_path, 'merged_key');
51
+ (0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'))).toEqual({
52
+ theme: 'light',
53
+ mcpServers: {
54
+ existing: {
55
+ command: 'node',
56
+ },
57
+ 'bright-data': get_expected_entry('merged_key'),
58
+ },
59
+ });
60
+ });
61
+ (0, vitest_1.it)('overwrites an existing bright-data entry without removing other servers', () => {
62
+ const file_path = path_1.default.join(tmp_dir, 'mcp.json');
63
+ fs_1.default.writeFileSync(file_path, JSON.stringify({
64
+ mcpServers: {
65
+ 'bright-data': {
66
+ command: 'old-command',
67
+ args: ['old-package'],
68
+ env: {
69
+ API_TOKEN: 'old_key',
70
+ EXTRA: 'value',
71
+ },
72
+ },
73
+ existing: {
74
+ command: 'node',
75
+ },
76
+ },
77
+ }, null, 4));
78
+ (0, mcp_config_1.upsert_mcp_config)(file_path, 'fresh_key');
79
+ (0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'))).toEqual({
80
+ mcpServers: {
81
+ 'bright-data': get_expected_entry('fresh_key'),
82
+ existing: {
83
+ command: 'node',
84
+ },
85
+ },
86
+ });
87
+ });
88
+ (0, vitest_1.it)('throws on invalid JSON unless overwrite_invalid is set', () => {
89
+ const file_path = path_1.default.join(tmp_dir, 'mcp.json');
90
+ fs_1.default.writeFileSync(file_path, '{invalid-json');
91
+ (0, vitest_1.expect)(() => (0, mcp_config_1.upsert_mcp_config)(file_path, 'api_key'))
92
+ .toThrow(mcp_config_1.Invalid_mcp_config_error);
93
+ (0, mcp_config_1.upsert_mcp_config)(file_path, 'api_key', { overwrite_invalid: true });
94
+ (0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(file_path, 'utf8'))).toEqual({
95
+ mcpServers: {
96
+ 'bright-data': get_expected_entry('api_key'),
97
+ },
98
+ });
99
+ });
100
+ (0, vitest_1.it)('writes Claude Code global config to the home directory', () => {
101
+ const home_dir = path_1.default.join(tmp_dir, 'home');
102
+ const exists_sync = vitest_1.vi.spyOn(fs_1.default, 'existsSync').mockReturnValue(false);
103
+ const mkdir_sync = vitest_1.vi.spyOn(fs_1.default, 'mkdirSync')
104
+ .mockImplementation(() => undefined);
105
+ const write_file_sync = vitest_1.vi.spyOn(fs_1.default, 'writeFileSync')
106
+ .mockImplementation(() => undefined);
107
+ const chmod_sync = vitest_1.vi.spyOn(fs_1.default, 'chmodSync')
108
+ .mockImplementation(() => undefined);
109
+ vitest_1.vi.spyOn(os_1.default, 'homedir').mockReturnValue(home_dir);
110
+ (0, mcp_config_1.write_claude_code_mcp)('api_key', 'global');
111
+ (0, vitest_1.expect)(exists_sync).toHaveBeenCalled();
112
+ (0, vitest_1.expect)(mkdir_sync).toHaveBeenCalledWith(home_dir, { recursive: true });
113
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenCalledWith(path_1.default.join(home_dir, '.claude.json'), vitest_1.expect.any(String), { mode: 0o600 });
114
+ (0, vitest_1.expect)(chmod_sync).toHaveBeenCalledWith(path_1.default.join(home_dir, '.claude.json'), 0o600);
115
+ });
116
+ (0, vitest_1.it)('writes Claude Code project config under the current directory', () => {
117
+ const project_dir = path_1.default.join(tmp_dir, 'project');
118
+ const write_file_sync = vitest_1.vi.spyOn(fs_1.default, 'writeFileSync')
119
+ .mockImplementation(() => undefined);
120
+ vitest_1.vi.spyOn(fs_1.default, 'existsSync').mockReturnValue(false);
121
+ vitest_1.vi.spyOn(fs_1.default, 'mkdirSync').mockImplementation(() => undefined);
122
+ vitest_1.vi.spyOn(fs_1.default, 'chmodSync').mockImplementation(() => undefined);
123
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(project_dir);
124
+ (0, mcp_config_1.write_claude_code_mcp)('api_key', 'project');
125
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenCalledWith(path_1.default.join(project_dir, '.claude', 'settings.json'), vitest_1.expect.any(String), { mode: 0o600 });
126
+ });
127
+ (0, vitest_1.it)('writes Cursor config to the correct global and project paths', () => {
128
+ const home_dir = path_1.default.join(tmp_dir, 'home');
129
+ const project_dir = path_1.default.join(tmp_dir, 'project');
130
+ const write_file_sync = vitest_1.vi.spyOn(fs_1.default, 'writeFileSync')
131
+ .mockImplementation(() => undefined);
132
+ vitest_1.vi.spyOn(fs_1.default, 'existsSync').mockReturnValue(false);
133
+ vitest_1.vi.spyOn(fs_1.default, 'mkdirSync').mockImplementation(() => undefined);
134
+ vitest_1.vi.spyOn(fs_1.default, 'chmodSync').mockImplementation(() => undefined);
135
+ vitest_1.vi.spyOn(os_1.default, 'homedir').mockReturnValue(home_dir);
136
+ vitest_1.vi.spyOn(process, 'cwd').mockReturnValue(project_dir);
137
+ (0, mcp_config_1.write_cursor_mcp)('api_key', 'global');
138
+ (0, mcp_config_1.write_cursor_mcp)('api_key', 'project');
139
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenNthCalledWith(1, path_1.default.join(home_dir, '.cursor', 'mcp.json'), vitest_1.expect.any(String), { mode: 0o600 });
140
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenNthCalledWith(2, path_1.default.join(project_dir, '.cursor', 'mcp.json'), vitest_1.expect.any(String), { mode: 0o600 });
141
+ });
142
+ (0, vitest_1.it)('writes Codex config to CODEX_HOME when it is set', () => {
143
+ const codex_home = path_1.default.join(tmp_dir, 'codex-home');
144
+ const write_file_sync = vitest_1.vi.spyOn(fs_1.default, 'writeFileSync')
145
+ .mockImplementation(() => undefined);
146
+ vitest_1.vi.spyOn(fs_1.default, 'existsSync').mockReturnValue(false);
147
+ vitest_1.vi.spyOn(fs_1.default, 'mkdirSync').mockImplementation(() => undefined);
148
+ vitest_1.vi.spyOn(fs_1.default, 'chmodSync').mockImplementation(() => undefined);
149
+ process.env['CODEX_HOME'] = codex_home;
150
+ (0, mcp_config_1.write_codex_mcp)('api_key');
151
+ (0, vitest_1.expect)(write_file_sync).toHaveBeenCalledWith(path_1.default.join(codex_home, 'mcp.json'), vitest_1.expect.any(String), { mode: 0o600 });
152
+ });
153
+ });
154
+ //# sourceMappingURL=mcp-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/mcp-config.test.ts"],"names":[],"mappings":";;;;;AAAA,4CAAoB;AACpB,4CAAoB;AACpB,gDAAwB;AACxB,mCAAuE;AACvE,uDAMgC;AAEhC,MAAM,kBAAkB,GAAG,CAAC,OAAe,EAAC,EAAE,CAAA,CAAC;IAC3C,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,iBAAiB,CAAC;IACzB,GAAG,EAAE;QACD,SAAS,EAAE,OAAO;KACrB;CACJ,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,GAAE,EAAE,CAAA,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EACvD,wBAAwB,CAAC,CAAC,CAAC;AAE/B,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAE,EAAE;IAC7B,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,IAAA,mBAAU,EAAC,GAAE,EAAE;QACX,OAAO,GAAG,UAAU,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,IAAA,kBAAS,EAAC,GAAE,EAAE;QACV,WAAE,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACjC,IAAI,OAAO;YACP,YAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4CAA4C,EAAE,GAAE,EAAE;QACjD,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEjD,IAAA,8BAAiB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAExC,IAAA,eAAM,EAAC,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3D,UAAU,EAAE;gBACR,aAAa,EAAE,kBAAkB,CAAC,SAAS,CAAC;aAC/C;SACJ,CAAC,CAAC;QACH,IAAA,eAAM,EAAC,YAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uDAAuD,EAAE,GAAE,EAAE;QAC5D,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEjD,YAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;YACvC,KAAK,EAAE,OAAO;YACd,UAAU,EAAE;gBACR,QAAQ,EAAE;oBACN,OAAO,EAAE,MAAM;iBAClB;aACJ;SACJ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEb,IAAA,8BAAiB,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAE3C,IAAA,eAAM,EAAC,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3D,KAAK,EAAE,OAAO;YACd,UAAU,EAAE;gBACR,QAAQ,EAAE;oBACN,OAAO,EAAE,MAAM;iBAClB;gBACD,aAAa,EAAE,kBAAkB,CAAC,YAAY,CAAC;aAClD;SACJ,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yEAAyE,EAAE,GAAE,EAAE;QAC9E,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEjD,YAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;YACvC,UAAU,EAAE;gBACR,aAAa,EAAE;oBACX,OAAO,EAAE,aAAa;oBACtB,IAAI,EAAE,CAAC,aAAa,CAAC;oBACrB,GAAG,EAAE;wBACD,SAAS,EAAE,SAAS;wBACpB,KAAK,EAAE,OAAO;qBACjB;iBACJ;gBACD,QAAQ,EAAE;oBACN,OAAO,EAAE,MAAM;iBAClB;aACJ;SACJ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEb,IAAA,8BAAiB,EAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAE1C,IAAA,eAAM,EAAC,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3D,UAAU,EAAE;gBACR,aAAa,EAAE,kBAAkB,CAAC,WAAW,CAAC;gBAC9C,QAAQ,EAAE;oBACN,OAAO,EAAE,MAAM;iBAClB;aACJ;SACJ,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wDAAwD,EAAE,GAAE,EAAE;QAC7D,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEjD,YAAE,CAAC,aAAa,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAE7C,IAAA,eAAM,EAAC,GAAE,EAAE,CAAA,IAAA,8BAAiB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC;aAC9C,OAAO,CAAC,qCAAwB,CAAC,CAAC;QAEvC,IAAA,8BAAiB,EAAC,SAAS,EAAE,SAAS,EAAE,EAAC,iBAAiB,EAAE,IAAI,EAAC,CAAC,CAAC;QAEnE,IAAA,eAAM,EAAC,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3D,UAAU,EAAE;gBACR,aAAa,EAAE,kBAAkB,CAAC,SAAS,CAAC;aAC/C;SACJ,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wDAAwD,EAAE,GAAE,EAAE;QAC7D,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,YAAY,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,WAAW,CAAC;aACvC,kBAAkB,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QACvC,MAAM,eAAe,GAAG,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,eAAe,CAAC;aAChD,kBAAkB,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,WAAW,CAAC;aACvC,kBAAkB,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QACvC,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,SAAS,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAElD,IAAA,kCAAqB,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE3C,IAAA,eAAM,EAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACvC,IAAA,eAAM,EAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;QACrE,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,oBAAoB,CACxC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EACnC,eAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,EAAC,IAAI,EAAE,KAAK,EAAC,CAChB,CAAC;QACF,IAAA,eAAM,EAAC,UAAU,CAAC,CAAC,oBAAoB,CACnC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EACnC,KAAK,CACR,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,+DAA+D,EAAE,GAAE,EAAE;QACpE,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,eAAe,CAAC;aAChD,kBAAkB,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QACvC,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,YAAY,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAClD,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,WAAW,CAAC,CAAC,kBAAkB,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QAC5D,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,WAAW,CAAC,CAAC,kBAAkB,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QAC5D,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAEtD,IAAA,kCAAqB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE5C,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,oBAAoB,CACxC,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,eAAe,CAAC,EAClD,eAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,EAAC,IAAI,EAAE,KAAK,EAAC,CAChB,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8DAA8D,EAAE,GAAE,EAAE;QACnE,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAClD,MAAM,eAAe,GAAG,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,eAAe,CAAC;aAChD,kBAAkB,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QACvC,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,YAAY,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAClD,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,WAAW,CAAC,CAAC,kBAAkB,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QAC5D,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,WAAW,CAAC,CAAC,kBAAkB,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QAC5D,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,SAAS,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAClD,WAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAEtD,IAAA,6BAAgB,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACtC,IAAA,6BAAgB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAEvC,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,uBAAuB,CAC3C,CAAC,EACD,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,EAC1C,eAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,EAAC,IAAI,EAAE,KAAK,EAAC,CAChB,CAAC;QACF,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,uBAAuB,CAC3C,CAAC,EACD,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,EAC7C,eAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,EAAC,IAAI,EAAE,KAAK,EAAC,CAChB,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,kDAAkD,EAAE,GAAE,EAAE;QACvD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACpD,MAAM,eAAe,GAAG,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,eAAe,CAAC;aAChD,kBAAkB,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QACvC,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,YAAY,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAClD,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,WAAW,CAAC,CAAC,kBAAkB,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QAC5D,WAAE,CAAC,KAAK,CAAC,YAAE,EAAE,WAAW,CAAC,CAAC,kBAAkB,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC;QAEvC,IAAA,4BAAe,EAAC,SAAS,CAAC,CAAC;QAE3B,IAAA,eAAM,EAAC,eAAe,CAAC,CAAC,oBAAoB,CACxC,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EACjC,eAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAClB,EAAC,IAAI,EAAE,KAAK,EAAC,CAChB,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { Command } from 'commander';
2
+ import type { Mcp_scope, Mcp_write_opts } from '../utils/mcp-config';
3
+ type Mcp_agent = 'claude-code' | 'cursor' | 'codex';
4
+ type Add_mcp_opts = {
5
+ agent?: string;
6
+ global?: boolean;
7
+ project?: boolean;
8
+ };
9
+ type Mcp_writers = {
10
+ write_claude_code_mcp: (api_key: string, scope: Mcp_scope, opts?: Mcp_write_opts) => void | Promise<void>;
11
+ write_cursor_mcp: (api_key: string, scope: Mcp_scope, opts?: Mcp_write_opts) => void | Promise<void>;
12
+ write_codex_mcp: (api_key: string, opts?: Mcp_write_opts) => void | Promise<void>;
13
+ };
14
+ declare const run_add_mcp: (opts?: Add_mcp_opts, writers?: Mcp_writers) => Promise<void>;
15
+ declare const add_mcp_command: Command;
16
+ export { add_mcp_command, run_add_mcp };
17
+ export type { Add_mcp_opts, Mcp_agent, Mcp_writers };
18
+ //# sourceMappingURL=add-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-mcp.d.ts","sourceRoot":"","sources":["../../src/commands/add-mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AASlC,OAAO,KAAK,EAAC,SAAS,EAAE,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAEnE,KAAK,SAAS,GAAG,aAAa,GAAC,QAAQ,GAAC,OAAO,CAAC;AAChD,KAAK,YAAY,GAAG;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,KAAK,WAAW,GAAG;IACf,qBAAqB,EAAE,CACnB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,cAAc,KACtB,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,gBAAgB,EAAE,CACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,EAChB,IAAI,CAAC,EAAE,cAAc,KACtB,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,KACpD,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B,CAAC;AAyOF,QAAA,MAAM,WAAW,GACb,OAAM,YAAiB,EACvB,UAAS,WAA6B,kBA0CzC,CAAC;AAEF,QAAA,MAAM,eAAe,SAQf,CAAC;AAEP,OAAO,EAAC,eAAe,EAAE,WAAW,EAAC,CAAC;AACtC,YAAY,EAAC,YAAY,EAAE,SAAS,EAAE,WAAW,EAAC,CAAC"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.run_add_mcp = exports.add_mcp_command = void 0;
4
+ const prompts_1 = require("@inquirer/prompts");
5
+ const commander_1 = require("commander");
6
+ const credentials_1 = require("../utils/credentials");
7
+ const output_1 = require("../utils/output");
8
+ const mcp_config_1 = require("../utils/mcp-config");
9
+ const backtick = String.fromCharCode(96);
10
+ const mcp_agent_labels = {
11
+ 'claude-code': 'Claude Code',
12
+ cursor: 'Cursor',
13
+ codex: 'Codex',
14
+ };
15
+ const mcp_agents = ['claude-code', 'cursor', 'codex'];
16
+ const default_writers = {
17
+ write_claude_code_mcp: mcp_config_1.write_claude_code_mcp,
18
+ write_cursor_mcp: mcp_config_1.write_cursor_mcp,
19
+ write_codex_mcp: mcp_config_1.write_codex_mcp,
20
+ };
21
+ const format_error = (error) => {
22
+ if (error instanceof Error)
23
+ return error.message;
24
+ return 'Unknown error';
25
+ };
26
+ const format_agent_list = () => mcp_agents.join(', ');
27
+ const is_tty = () => process.stdin.isTTY !== false && process.stdout.isTTY !== false;
28
+ const parse_selected_agents = (agent_flag) => {
29
+ const selected = Array.from(new Set(agent_flag.split(',')
30
+ .map(agent => agent.trim().toLowerCase())
31
+ .filter(Boolean)));
32
+ if (!selected.length) {
33
+ process.stderr.write('No agents provided. Use --agent '
34
+ + format_agent_list() + '\n');
35
+ process.exitCode = 1;
36
+ return null;
37
+ }
38
+ const invalid = selected.filter(agent => !mcp_agents.includes(agent));
39
+ if (invalid.length) {
40
+ process.stderr.write('Unknown agent ' + invalid[0] + '. Supported agents: '
41
+ + format_agent_list() + '\n');
42
+ process.exitCode = 1;
43
+ return null;
44
+ }
45
+ return selected;
46
+ };
47
+ const resolve_selected_agents = async (opts) => {
48
+ if (opts.agent)
49
+ return parse_selected_agents(opts.agent);
50
+ if (!is_tty()) {
51
+ process.stderr.write('Non-interactive MCP installation requires --agent <agents>.\n');
52
+ process.exitCode = 1;
53
+ return null;
54
+ }
55
+ return await (0, prompts_1.checkbox)({
56
+ message: 'Which coding agents should Bright Data MCP be added to?',
57
+ choices: mcp_agents.map(agent => ({
58
+ name: mcp_agent_labels[agent],
59
+ value: agent,
60
+ })),
61
+ validate: value => {
62
+ if (value.length)
63
+ return true;
64
+ return 'Select at least one coding agent';
65
+ },
66
+ });
67
+ };
68
+ const resolve_scope_from_flags = (selected_agents, opts) => {
69
+ if (opts.global && opts.project) {
70
+ process.stderr.write('Choose either --global or --project, not both.\n');
71
+ process.exitCode = 1;
72
+ return 'error';
73
+ }
74
+ if (selected_agents.every(agent => agent == 'codex')) {
75
+ if (opts.project) {
76
+ process.stderr.write('Codex only supports global MCP installation.\n');
77
+ process.exitCode = 1;
78
+ return 'error';
79
+ }
80
+ return 'global';
81
+ }
82
+ if (opts.global)
83
+ return 'global';
84
+ if (opts.project)
85
+ return 'project';
86
+ return 'prompt';
87
+ };
88
+ const resolve_scope = async (selected_agents, opts) => {
89
+ const scope_from_flags = resolve_scope_from_flags(selected_agents, opts);
90
+ if (scope_from_flags == 'global' || scope_from_flags == 'project')
91
+ return scope_from_flags;
92
+ if (scope_from_flags == 'error')
93
+ return null;
94
+ if (!is_tty()) {
95
+ process.stderr.write('Non-interactive MCP installation requires --global or --project '
96
+ + 'when targeting Claude Code or Cursor.\n');
97
+ process.exitCode = 1;
98
+ return null;
99
+ }
100
+ return await (0, prompts_1.select)({
101
+ message: 'Install globally or for this project?',
102
+ choices: [
103
+ {
104
+ name: 'Global',
105
+ value: 'global',
106
+ },
107
+ {
108
+ name: 'Project',
109
+ value: 'project',
110
+ },
111
+ ],
112
+ default: 'global',
113
+ });
114
+ };
115
+ const write_agent_mcp = async (agent, api_key, scope, writers, opts = {}) => {
116
+ if (agent == 'claude-code')
117
+ return writers.write_claude_code_mcp(api_key, scope, opts);
118
+ if (agent == 'cursor')
119
+ return writers.write_cursor_mcp(api_key, scope, opts);
120
+ return writers.write_codex_mcp(api_key, opts);
121
+ };
122
+ const write_agent_with_recovery = async (agent, api_key, scope, writers) => {
123
+ try {
124
+ await write_agent_mcp(agent, api_key, scope, writers);
125
+ return;
126
+ }
127
+ catch (error) {
128
+ if (!(error instanceof mcp_config_1.Invalid_mcp_config_error))
129
+ throw error;
130
+ (0, output_1.warn)(error.message);
131
+ if (!is_tty()) {
132
+ throw new Error('Fix the invalid JSON manually or rerun with a TTY to '
133
+ + 'overwrite it.');
134
+ }
135
+ const overwrite = await (0, prompts_1.confirm)({
136
+ message: 'Overwrite invalid config at ' + error.file_path + '?',
137
+ default: false,
138
+ });
139
+ if (!overwrite) {
140
+ throw new Error('Aborted because ' + error.file_path + ' contains invalid JSON');
141
+ }
142
+ await write_agent_mcp(agent, api_key, scope, writers, { overwrite_invalid: true });
143
+ }
144
+ };
145
+ const print_summary = (selected_agents, success_count, failures) => {
146
+ process.stderr.write('\n');
147
+ process.stderr.write((0, output_1.dim)('Summary: ' + selected_agents.length + ' target'
148
+ + (selected_agents.length == 1 ? '' : 's') + ', ' + success_count
149
+ + ' succeeded, ' + failures.length + ' failed.\n'));
150
+ for (const failure of failures) {
151
+ process.stderr.write((0, output_1.red)('✗ ' + mcp_agent_labels[failure.agent] + ': ' + failure.reason + '\n'));
152
+ }
153
+ };
154
+ const run_add_mcp = async (opts = {}, writers = default_writers) => {
155
+ const api_key = (0, credentials_1.get_api_key)();
156
+ if (api_key == null) {
157
+ process.stderr.write('Not logged in. Run ' + backtick
158
+ + 'brightdata login' + backtick + ' first.\n');
159
+ process.exitCode = 1;
160
+ return;
161
+ }
162
+ const selected_agents = await resolve_selected_agents(opts);
163
+ if (selected_agents == null)
164
+ return;
165
+ const scope = await resolve_scope(selected_agents, opts);
166
+ if (scope == null)
167
+ return;
168
+ const failures = [];
169
+ let success_count = 0;
170
+ for (const agent of selected_agents) {
171
+ try {
172
+ await write_agent_with_recovery(agent, api_key, scope, writers);
173
+ success_count++;
174
+ process.stderr.write((0, output_1.green)('✓ Added Bright Data MCP to '
175
+ + mcp_agent_labels[agent] + '\n'));
176
+ }
177
+ catch (error) {
178
+ const reason = format_error(error);
179
+ failures.push({ agent, reason });
180
+ process.stderr.write((0, output_1.red)('✗ Failed ' + mcp_agent_labels[agent] + ': ' + reason + '\n'));
181
+ process.exitCode = 1;
182
+ }
183
+ }
184
+ print_summary(selected_agents, success_count, failures);
185
+ };
186
+ exports.run_add_mcp = run_add_mcp;
187
+ const add_mcp_command = new commander_1.Command('mcp')
188
+ .description('Add Bright Data MCP to Claude Code, Cursor, or Codex')
189
+ .option('--agent <agents>', 'Comma-separated: claude-code,cursor,codex')
190
+ .option('--global', 'Install to global config')
191
+ .option('--project', 'Install to project config')
192
+ .action(async (opts) => {
193
+ await run_add_mcp(opts);
194
+ });
195
+ exports.add_mcp_command = add_mcp_command;
196
+ //# sourceMappingURL=add-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-mcp.js","sourceRoot":"","sources":["../../src/commands/add-mcp.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -17,8 +17,12 @@ const init_1 = require("./commands/init");
17
17
  const version_1 = require("./commands/version");
18
18
  const skill_1 = require("./commands/skill");
19
19
  const budget_1 = require("./commands/budget");
20
+ const add_mcp_1 = require("./commands/add-mcp");
20
21
  const package_json_1 = __importDefault(require("../package.json"));
21
22
  const program = new commander_1.Command();
23
+ const add_command = new commander_1.Command('add')
24
+ .description('Add Bright Data integrations to supported coding agents')
25
+ .addCommand(add_mcp_1.add_mcp_command);
22
26
  program
23
27
  .name('brightdata')
24
28
  .description('Command-line interface for Bright Data. Scrape, search, '
@@ -38,5 +42,6 @@ program.addCommand(init_1.init_command);
38
42
  program.addCommand(version_1.version_command);
39
43
  program.addCommand(skill_1.skill_command);
40
44
  program.addCommand(budget_1.budget_command);
45
+ program.addCommand(add_command);
41
46
  program.parse(process.argv);
42
47
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AACA,yCAAkC;AAClC,4CAA+C;AAC/C,8CAAiD;AACjD,8CAAiD;AACjD,8CAAiD;AACjD,gDAAqD;AACrD,8CAAiD;AACjD,4CAA+C;AAC/C,8CAAiD;AACjD,0CAA6C;AAC7C,gDAAmD;AACnD,4CAA+C;AAC/C,8CAAiD;AACjD,mEAA0C;AAE1C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CACR,0DAA0D;MACzD,oEAAoE,CACxE;KACA,OAAO,CAAC,sBAAW,CAAC,OAAO,EAAE,eAAe,CAAC;KAC7C,MAAM,CAAC,qBAAqB,EAAE,4CAA4C,CAAC;KAC3E,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;AAE/C,OAAO,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,2BAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,mBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,yBAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AAGnC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AACA,yCAAkC;AAClC,4CAA+C;AAC/C,8CAAiD;AACjD,8CAAiD;AACjD,8CAAiD;AACjD,gDAAqD;AACrD,8CAAiD;AACjD,4CAA+C;AAC/C,8CAAiD;AACjD,0CAA6C;AAC7C,gDAAmD;AACnD,4CAA+C;AAC/C,8CAAiD;AACjD,gDAAmD;AACnD,mEAA0C;AAE1C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAC9B,MAAM,WAAW,GAAG,IAAI,mBAAO,CAAC,KAAK,CAAC;KACjC,WAAW,CAAC,yDAAyD,CAAC;KACtE,UAAU,CAAC,yBAAe,CAAC,CAAC;AAEjC,OAAO;KACF,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CACR,0DAA0D;MACzD,oEAAoE,CACxE;KACA,OAAO,CAAC,sBAAW,CAAC,OAAO,EAAE,eAAe,CAAC;KAC7C,MAAM,CAAC,qBAAqB,EAAE,4CAA4C,CAAC;KAC3E,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;AAE/C,OAAO,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,2BAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,mBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,yBAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,uBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAEhC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ type Mcp_scope = 'global' | 'project';
2
+ type Mcp_write_opts = {
3
+ overwrite_invalid?: boolean;
4
+ };
5
+ declare class Invalid_mcp_config_error extends Error {
6
+ file_path: string;
7
+ constructor(file_path: string, reason: string);
8
+ }
9
+ declare const upsert_mcp_config: (file_path: string, api_key: string, opts?: Mcp_write_opts) => void;
10
+ declare const write_claude_code_mcp: (api_key: string, scope: Mcp_scope, opts?: Mcp_write_opts) => void;
11
+ declare const write_cursor_mcp: (api_key: string, scope: Mcp_scope, opts?: Mcp_write_opts) => void;
12
+ declare const write_codex_mcp: (api_key: string, opts?: Mcp_write_opts) => void;
13
+ export { Invalid_mcp_config_error, upsert_mcp_config, write_claude_code_mcp, write_cursor_mcp, write_codex_mcp, };
14
+ export type { Mcp_scope, Mcp_write_opts };
15
+ //# sourceMappingURL=mcp-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../src/utils/mcp-config.ts"],"names":[],"mappings":"AAIA,KAAK,SAAS,GAAG,QAAQ,GAAC,SAAS,CAAC;AACpC,KAAK,cAAc,GAAG;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B,CAAC;AAGF,cAAM,wBAAyB,SAAQ,KAAK;IACxC,SAAS,EAAE,MAAM,CAAC;gBAEN,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAMhD;AAqCD,QAAA,MAAM,iBAAiB,GACnB,WAAW,MAAM,EACjB,SAAS,MAAM,EACf,OAAM,cAAmB,SAsB5B,CAAC;AAEF,QAAA,MAAM,qBAAqB,GACvB,SAAS,MAAM,EACf,OAAO,SAAS,EAChB,OAAM,cAAmB,SAM5B,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAClB,SAAS,MAAM,EACf,OAAO,SAAS,EAChB,OAAM,cAAmB,SAM5B,CAAC;AAEF,QAAA,MAAM,eAAe,GACjB,SAAS,MAAM,EACf,OAAM,cAAmB,SAK5B,CAAC;AAEF,OAAO,EACH,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,GAClB,CAAC;AACF,YAAY,EAAC,SAAS,EAAE,cAAc,EAAC,CAAC"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.write_codex_mcp = exports.write_cursor_mcp = exports.write_claude_code_mcp = exports.upsert_mcp_config = exports.Invalid_mcp_config_error = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const os_1 = __importDefault(require("os"));
9
+ const path_1 = __importDefault(require("path"));
10
+ class Invalid_mcp_config_error extends Error {
11
+ file_path;
12
+ constructor(file_path, reason) {
13
+ super('Invalid JSON in ' + file_path + ': ' + reason);
14
+ this.name = 'Invalid_mcp_config_error';
15
+ this.file_path = file_path;
16
+ }
17
+ }
18
+ exports.Invalid_mcp_config_error = Invalid_mcp_config_error;
19
+ const is_plain_object = (value) => typeof value == 'object' && value !== null && !Array.isArray(value);
20
+ const get_bright_data_mcp = (api_key) => ({
21
+ command: 'npx',
22
+ args: ['@brightdata/mcp'],
23
+ env: {
24
+ API_TOKEN: api_key,
25
+ },
26
+ });
27
+ const load_json_object = (file_path, opts = {}) => {
28
+ if (!fs_1.default.existsSync(file_path))
29
+ return {};
30
+ const raw = fs_1.default.readFileSync(file_path, 'utf8').trim();
31
+ if (!raw)
32
+ return {};
33
+ try {
34
+ const parsed = JSON.parse(raw);
35
+ if (!is_plain_object(parsed))
36
+ throw new Error('Expected top-level JSON object');
37
+ return parsed;
38
+ }
39
+ catch (error) {
40
+ if (opts.overwrite_invalid)
41
+ return {};
42
+ const reason = error instanceof Error ? error.message : 'Unknown error';
43
+ throw new Invalid_mcp_config_error(file_path, reason);
44
+ }
45
+ };
46
+ const upsert_mcp_config = (file_path, api_key, opts = {}) => {
47
+ const current = load_json_object(file_path, opts);
48
+ const mcp_servers = is_plain_object(current['mcpServers'])
49
+ ? current['mcpServers']
50
+ : {};
51
+ const next = {
52
+ ...current,
53
+ mcpServers: {
54
+ ...mcp_servers,
55
+ 'bright-data': get_bright_data_mcp(api_key),
56
+ },
57
+ };
58
+ const dir = path_1.default.dirname(file_path);
59
+ if (!fs_1.default.existsSync(dir))
60
+ fs_1.default.mkdirSync(dir, { recursive: true });
61
+ fs_1.default.writeFileSync(file_path, JSON.stringify(next, null, 4) + '\n', {
62
+ mode: 0o600,
63
+ });
64
+ fs_1.default.chmodSync(file_path, 0o600);
65
+ };
66
+ exports.upsert_mcp_config = upsert_mcp_config;
67
+ const write_claude_code_mcp = (api_key, scope, opts = {}) => {
68
+ const file_path = scope == 'project'
69
+ ? path_1.default.join(process.cwd(), '.claude', 'settings.json')
70
+ : path_1.default.join(os_1.default.homedir(), '.claude.json');
71
+ upsert_mcp_config(file_path, api_key, opts);
72
+ };
73
+ exports.write_claude_code_mcp = write_claude_code_mcp;
74
+ const write_cursor_mcp = (api_key, scope, opts = {}) => {
75
+ const file_path = scope == 'project'
76
+ ? path_1.default.join(process.cwd(), '.cursor', 'mcp.json')
77
+ : path_1.default.join(os_1.default.homedir(), '.cursor', 'mcp.json');
78
+ upsert_mcp_config(file_path, api_key, opts);
79
+ };
80
+ exports.write_cursor_mcp = write_cursor_mcp;
81
+ const write_codex_mcp = (api_key, opts = {}) => {
82
+ const codex_home = process.env['CODEX_HOME']?.trim()
83
+ || path_1.default.join(os_1.default.homedir(), '.codex');
84
+ upsert_mcp_config(path_1.default.join(codex_home, 'mcp.json'), api_key, opts);
85
+ };
86
+ exports.write_codex_mcp = write_codex_mcp;
87
+ //# sourceMappingURL=mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/utils/mcp-config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"brightdata-skills.d.ts","sourceRoot":"","sources":["../../../src/utils/skill-installer/brightdata-skills.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAA;AAED,QAAA,MAAM,iBAAiB,EAAE,eAAe,EA8CvC,CAAA;AAED,OAAO,EAAC,iBAAiB,EAAC,CAAA;AAC1B,YAAY,EAAC,eAAe,EAAC,CAAA"}
1
+ {"version":3,"file":"brightdata-skills.d.ts","sourceRoot":"","sources":["../../../src/utils/skill-installer/brightdata-skills.ts"],"names":[],"mappings":"AAAA,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAA;AAED,QAAA,MAAM,iBAAiB,EAAE,eAAe,EAkFvC,CAAA;AAED,OAAO,EAAC,iBAAiB,EAAC,CAAA;AAC1B,YAAY,EAAC,eAAe,EAAC,CAAA"}
@@ -47,6 +47,42 @@ const BRIGHTDATA_SKILLS = [
47
47
  githubPath: 'brightdata/skills/bright-data-best-practices',
48
48
  repoPath: 'skills/bright-data-best-practices',
49
49
  },
50
+ {
51
+ name: 'brightdata-cli',
52
+ description: 'Use the Bright Data CLI to scrape websites, search '
53
+ + 'engines, and extract structured data from the terminal',
54
+ skillMdUrl: 'https://raw.githubusercontent.com/brightdata/skills/'
55
+ + 'main/skills/brightdata-cli/SKILL.md',
56
+ githubPath: 'brightdata/skills/brightdata-cli',
57
+ repoPath: 'skills/brightdata-cli',
58
+ },
59
+ {
60
+ name: 'design-mirror',
61
+ description: 'Extract design tokens from any website and apply '
62
+ + 'colors, typography, and spacing to your codebase',
63
+ skillMdUrl: 'https://raw.githubusercontent.com/brightdata/skills/'
64
+ + 'main/skills/design-mirror/SKILL.md',
65
+ githubPath: 'brightdata/skills/design-mirror',
66
+ repoPath: 'skills/design-mirror',
67
+ },
68
+ {
69
+ name: 'python-sdk-best-practices',
70
+ description: 'Best practices for writing Bright Data Python SDK '
71
+ + 'code with async/await patterns',
72
+ skillMdUrl: 'https://raw.githubusercontent.com/brightdata/skills/'
73
+ + 'main/skills/python-sdk-best-practices/SKILL.md',
74
+ githubPath: 'brightdata/skills/python-sdk-best-practices',
75
+ repoPath: 'skills/python-sdk-best-practices',
76
+ },
77
+ {
78
+ name: 'scraper-builder',
79
+ description: 'Build production-ready web scrapers using Bright Data '
80
+ + 'APIs with site analysis and pagination handling',
81
+ skillMdUrl: 'https://raw.githubusercontent.com/brightdata/skills/'
82
+ + 'main/skills/scraper-builder/SKILL.md',
83
+ githubPath: 'brightdata/skills/scraper-builder',
84
+ repoPath: 'skills/scraper-builder',
85
+ },
50
86
  ];
51
87
  exports.BRIGHTDATA_SKILLS = BRIGHTDATA_SKILLS;
52
88
  //# sourceMappingURL=brightdata-skills.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"brightdata-skills.js","sourceRoot":"","sources":["../../../src/utils/skill-installer/brightdata-skills.ts"],"names":[],"mappings":";;;AAQA,MAAM,iBAAiB,GAAsB;IACzC;QACI,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,qDAAqD;cAC7D,iCAAiC;QACtC,UAAU,EAAE,sDAAsD;cAC7D,6BAA6B;QAClC,UAAU,EAAE,0BAA0B;QACtC,QAAQ,EAAE,eAAe;KAC5B;IACD;QACI,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,sDAAsD;cAC9D,sBAAsB;QAC3B,UAAU,EAAE,sDAAsD;cAC7D,6BAA6B;QAClC,UAAU,EAAE,0BAA0B;QACtC,QAAQ,EAAE,eAAe;KAC5B;IACD;QACI,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,iDAAiD;cACzD,mBAAmB;QACxB,UAAU,EAAE,sDAAsD;cAC7D,iCAAiC;QACtC,UAAU,EAAE,8BAA8B;QAC1C,QAAQ,EAAE,mBAAmB;KAChC;IACD;QACI,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,oDAAoD;cAC5D,kCAAkC;QACvC,UAAU,EAAE,sDAAsD;cAC7D,sCAAsC;QAC3C,UAAU,EAAE,mCAAmC;QAC/C,QAAQ,EAAE,wBAAwB;KACrC;IACD;QACI,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,mDAAmD;cAC3D,kBAAkB;QACvB,UAAU,EAAE,sDAAsD;cAC7D,iDAAiD;QACtD,UAAU,EAAE,8CAA8C;QAC1D,QAAQ,EAAE,mCAAmC;KAChD;CACJ,CAAA;AAEO,8CAAiB"}
1
+ {"version":3,"file":"brightdata-skills.js","sourceRoot":"","sources":["../../../src/utils/skill-installer/brightdata-skills.ts"],"names":[],"mappings":";;;AAQA,MAAM,iBAAiB,GAAsB;IACzC;QACI,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,qDAAqD;cAC7D,iCAAiC;QACtC,UAAU,EAAE,sDAAsD;cAC7D,6BAA6B;QAClC,UAAU,EAAE,0BAA0B;QACtC,QAAQ,EAAE,eAAe;KAC5B;IACD;QACI,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,sDAAsD;cAC9D,sBAAsB;QAC3B,UAAU,EAAE,sDAAsD;cAC7D,6BAA6B;QAClC,UAAU,EAAE,0BAA0B;QACtC,QAAQ,EAAE,eAAe;KAC5B;IACD;QACI,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,iDAAiD;cACzD,mBAAmB;QACxB,UAAU,EAAE,sDAAsD;cAC7D,iCAAiC;QACtC,UAAU,EAAE,8BAA8B;QAC1C,QAAQ,EAAE,mBAAmB;KAChC;IACD;QACI,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,oDAAoD;cAC5D,kCAAkC;QACvC,UAAU,EAAE,sDAAsD;cAC7D,sCAAsC;QAC3C,UAAU,EAAE,mCAAmC;QAC/C,QAAQ,EAAE,wBAAwB;KACrC;IACD;QACI,IAAI,EAAE,4BAA4B;QAClC,WAAW,EAAE,mDAAmD;cAC3D,kBAAkB;QACvB,UAAU,EAAE,sDAAsD;cAC7D,iDAAiD;QACtD,UAAU,EAAE,8CAA8C;QAC1D,QAAQ,EAAE,mCAAmC;KAChD;IACD;QACI,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,qDAAqD;cAC7D,wDAAwD;QAC7D,UAAU,EAAE,sDAAsD;cAC7D,qCAAqC;QAC1C,UAAU,EAAE,kCAAkC;QAC9C,QAAQ,EAAE,uBAAuB;KACpC;IACD;QACI,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,mDAAmD;cAC3D,kDAAkD;QACvD,UAAU,EAAE,sDAAsD;cAC7D,oCAAoC;QACzC,UAAU,EAAE,iCAAiC;QAC7C,QAAQ,EAAE,sBAAsB;KACnC;IACD;QACI,IAAI,EAAE,2BAA2B;QACjC,WAAW,EAAE,oDAAoD;cAC5D,gCAAgC;QACrC,UAAU,EAAE,sDAAsD;cAC7D,gDAAgD;QACrD,UAAU,EAAE,6CAA6C;QACzD,QAAQ,EAAE,kCAAkC;KAC/C;IACD;QACI,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,wDAAwD;cAChE,iDAAiD;QACtD,UAAU,EAAE,sDAAsD;cAC7D,sCAAsC;QAC3C,UAAU,EAAE,mCAAmC;QAC/C,QAAQ,EAAE,wBAAwB;KACrC;CACJ,CAAA;AAEO,8CAAiB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightdata/cli",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Command-line interface for Bright Data. Scrape, search, extract structured data, and automate browsers directly from your terminal.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -32,7 +32,7 @@
32
32
  "dataset"
33
33
  ],
34
34
  "author": "Bright Data",
35
- "license": "ISC",
35
+ "license": "MIT",
36
36
  "repository": {
37
37
  "type": "git",
38
38
  "url": "git+https://github.com/brightdata/cli.git"