@optima-chat/ads-cli 0.6.0 → 0.7.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Optima Chat
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.
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/commands/account/check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,YAAY,SAiFrB,CAAC"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/commands/account/check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,YAAY,SA2BrB,CAAC"}
@@ -2,80 +2,30 @@
2
2
  * Account Check Command - 检查账号配置状态
3
3
  */
4
4
  import { Command } from 'commander';
5
- import chalk from 'chalk';
6
- import ora from 'ora';
7
- import Table from 'cli-table3';
8
5
  import { getApiClient } from '../../lib/api-client.js';
9
6
  import { handleError } from '../../utils/errors.js';
10
7
  import { getCustomerId } from '../../utils/customer-id.js';
11
8
  export const checkCommand = new Command('check')
12
9
  .description('检查账号配置状态(账单、权限等)')
13
- .option('--json', '以 JSON 格式输出')
14
- .action(async (options) => {
15
- const spinner = ora('检查账号状态...').start();
10
+ .action(async () => {
16
11
  try {
17
12
  const customerId = getCustomerId();
18
13
  const client = getApiClient();
19
14
  // Check account via backend API
20
15
  const accountCheck = await client.checkAccount(customerId);
21
- spinner.succeed('账号状态检查完成');
22
- if (options.json) {
23
- console.log(JSON.stringify(accountCheck, null, 2));
24
- }
25
- else {
26
- // Display in table format
27
- console.log(chalk.cyan.bold('\n📊 账号状态\n'));
28
- const table = new Table({
29
- chars: {
30
- top: '─',
31
- 'top-mid': '┬',
32
- 'top-left': '┌',
33
- 'top-right': '┐',
34
- bottom: '─',
35
- 'bottom-mid': '┴',
36
- 'bottom-left': '└',
37
- 'bottom-right': '┘',
38
- left: '│',
39
- 'left-mid': '├',
40
- mid: '─',
41
- 'mid-mid': '┼',
42
- right: '│',
43
- 'right-mid': '┤',
44
- middle: '│',
45
- },
46
- });
47
- const checkResult = accountCheck;
48
- // Customer info
49
- table.push([chalk.gray('账号 ID'), chalk.white(checkResult.customerId || customerId)], [chalk.gray('连接状态'), checkResult.connected ? chalk.green('✅ 已连接') : chalk.red('❌ 未连接')]);
50
- if (checkResult.info) {
51
- const info = checkResult.info;
52
- if (info.descriptive_name) {
53
- table.push([chalk.gray('账号名称'), chalk.white(info.descriptive_name)]);
54
- }
55
- if (info.currency_code) {
56
- table.push([chalk.gray('货币'), chalk.white(info.currency_code)]);
57
- }
58
- if (info.time_zone) {
59
- table.push([chalk.gray('时区'), chalk.white(info.time_zone)]);
60
- }
61
- }
62
- console.log(table.toString());
63
- // Recommendations
64
- console.log(chalk.cyan.bold('\n💡 建议\n'));
65
- if (checkResult.connected) {
66
- console.log(chalk.green('✅ 账号已连接,可以开始使用 Google Ads API!\n'));
67
- console.log(chalk.gray('快速开始:'));
68
- console.log(chalk.cyan(` google-ads campaign list\n`));
69
- }
70
- else {
71
- console.log(chalk.yellow('⚠️ 账号未连接\n'));
72
- console.log(chalk.gray('请确保已登录并完成 Google Ads 连接:'));
73
- console.log(chalk.cyan(' google-ads auth login\n'));
74
- }
75
- }
16
+ const checkResult = accountCheck;
17
+ const result = {
18
+ customer_id: checkResult.customerId || customerId,
19
+ connected: checkResult.connected || false,
20
+ info: checkResult.info ? {
21
+ name: checkResult.info.descriptive_name || null,
22
+ currency: checkResult.info.currency_code || null,
23
+ timezone: checkResult.info.time_zone || null,
24
+ } : null,
25
+ };
26
+ console.log(JSON.stringify(result, null, 2));
76
27
  }
77
28
  catch (error) {
78
- spinner.fail('检查失败');
79
29
  handleError(error);
80
30
  }
81
31
  });
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/commands/account/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/commands/account/check.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,kBAAkB,CAAC;KAC/B,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAE9B,gCAAgC;QAChC,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAE3D,MAAM,WAAW,GAAG,YAAmB,CAAC;QAExC,MAAM,MAAM,GAAG;YACb,WAAW,EAAE,WAAW,CAAC,UAAU,IAAI,UAAU;YACjD,SAAS,EAAE,WAAW,CAAC,SAAS,IAAI,KAAK;YACzC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvB,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI;gBAC/C,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI;gBAChD,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI;aAC7C,CAAC,CAAC,CAAC,IAAI;SACT,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/account/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,cAAc,SAGC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/account/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,cAAc,SAGD,CAAC"}
@@ -3,9 +3,9 @@
3
3
  */
4
4
  import { Command } from 'commander';
5
5
  import { checkCommand } from './check.js';
6
- import { createCommand } from './create.js';
6
+ import { linkCommand } from './link.js';
7
7
  export const accountCommand = new Command('account')
8
8
  .description('账号管理')
9
9
  .addCommand(checkCommand)
10
- .addCommand(createCommand);
10
+ .addCommand(linkCommand);
11
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/account/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,MAAM,CAAC;KACnB,UAAU,CAAC,YAAY,CAAC;KACxB,UAAU,CAAC,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/account/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,MAAM,CAAC;KACnB,UAAU,CAAC,YAAY,CAAC;KACxB,UAAU,CAAC,WAAW,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Account Link Command - 关联已有的 Google Ads 账号
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const linkCommand: Command;
6
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/commands/account/link.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,WAAW,SAoDpB,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Account Link Command - 关联已有的 Google Ads 账号
3
+ */
4
+ import { Command } from 'commander';
5
+ import Conf from 'conf';
6
+ import { handleError } from '../../utils/errors.js';
7
+ const config = new Conf({ projectName: 'google-ads-cli' });
8
+ export const linkCommand = new Command('link')
9
+ .description('关联已有的 Google Ads 账号(保存 Customer ID 到本地配置)')
10
+ .requiredOption('--customer-id <id>', 'Customer ID(10位数字,如 1234567890 或 123-456-7890)')
11
+ .option('--name <name>', '账号名称(可选)')
12
+ .option('--force', '强制覆盖已有配置')
13
+ .action(async (options) => {
14
+ try {
15
+ // 检查是否已经配置过账号
16
+ const existingCustomerId = config.get('customerId');
17
+ if (existingCustomerId && !options.force) {
18
+ console.log(JSON.stringify({
19
+ success: false,
20
+ error: 'already_linked',
21
+ message: '已存在账号配置',
22
+ existing_customer_id: existingCustomerId,
23
+ hint: '使用 --force 覆盖,或运行 google-ads config reset'
24
+ }, null, 2));
25
+ process.exit(1);
26
+ }
27
+ // 验证 Customer ID 格式
28
+ const cleanId = options.customerId.replace(/-/g, '');
29
+ if (!/^\d{10}$/.test(cleanId)) {
30
+ console.log(JSON.stringify({
31
+ success: false,
32
+ error: 'invalid_customer_id',
33
+ message: '无效的 Customer ID 格式',
34
+ provided: options.customerId,
35
+ hint: '请提供 10 位数字(如 1234567890 或 123-456-7890)'
36
+ }, null, 2));
37
+ process.exit(1);
38
+ }
39
+ // 保存到 config
40
+ config.set('customerId', cleanId);
41
+ if (options.name) {
42
+ config.set('accountName', options.name);
43
+ }
44
+ config.set('linkedAt', new Date().toISOString());
45
+ const formattedCustomerId = cleanId.replace(/(\d{3})(\d{3})(\d{4})/, '$1-$2-$3');
46
+ console.log(JSON.stringify({
47
+ success: true,
48
+ customer_id: formattedCustomerId,
49
+ account_name: options.name || null,
50
+ next_step: '运行 google-ads account check 验证连接'
51
+ }, null, 2));
52
+ }
53
+ catch (error) {
54
+ handleError(error);
55
+ }
56
+ });
57
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../../src/commands/account/link.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,2CAA2C,CAAC;KACxD,cAAc,CAAC,oBAAoB,EAAE,gDAAgD,CAAC;KACtF,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC;KACnC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC;KAC7B,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,cAAc;QACd,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAuB,CAAC;QAC1E,IAAI,kBAAkB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,SAAS;gBAClB,oBAAoB,EAAE,kBAAkB;gBACxC,IAAI,EAAE,2CAA2C;aAClD,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,oBAAoB;QACpB,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,qBAAqB;gBAC5B,OAAO,EAAE,oBAAoB;gBAC7B,QAAQ,EAAE,OAAO,CAAC,UAAU;gBAC5B,IAAI,EAAE,yCAAyC;aAChD,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,aAAa;QACb,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAEjD,MAAM,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC;QAEjF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,mBAAmB;YAChC,YAAY,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;YAClC,SAAS,EAAE,kCAAkC;SAC9C,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACH,CAAC,CAAC,CAAC"}
package/dist/index.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/ads-cli",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "用自然语言管理 Google Ads 广告投放 - 专为 Claude Code 设计的对话式 CLI 工具",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,14 +13,6 @@
13
13
  ".claude",
14
14
  "README.md"
15
15
  ],
16
- "scripts": {
17
- "build": "tsc",
18
- "dev": "tsx src/index.ts",
19
- "start": "node dist/index.js",
20
- "prepublishOnly": "npm run build",
21
- "lint": "eslint src --ext .ts",
22
- "format": "prettier --write \"src/**/*.ts\""
23
- },
24
16
  "keywords": [
25
17
  "google-ads",
26
18
  "google-ads-api",
@@ -63,5 +55,12 @@
63
55
  "prettier": "^3.2.4",
64
56
  "tsx": "^4.7.0",
65
57
  "typescript": "^5.3.3"
58
+ },
59
+ "scripts": {
60
+ "build": "tsc",
61
+ "dev": "tsx src/index.ts",
62
+ "start": "node dist/index.js",
63
+ "lint": "eslint src --ext .ts",
64
+ "format": "prettier --write \"src/**/*.ts\""
66
65
  }
67
- }
66
+ }