@optima-chat/ads-cli 0.5.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 (182) hide show
  1. package/.claude/CLAUDE.md +279 -0
  2. package/dist/commands/account/check.d.ts +6 -0
  3. package/dist/commands/account/check.d.ts.map +1 -0
  4. package/dist/commands/account/check.js +179 -0
  5. package/dist/commands/account/check.js.map +1 -0
  6. package/dist/commands/account/create.d.ts +6 -0
  7. package/dist/commands/account/create.d.ts.map +1 -0
  8. package/dist/commands/account/create.js +172 -0
  9. package/dist/commands/account/create.js.map +1 -0
  10. package/dist/commands/account/index.d.ts +6 -0
  11. package/dist/commands/account/index.d.ts.map +1 -0
  12. package/dist/commands/account/index.js +11 -0
  13. package/dist/commands/account/index.js.map +1 -0
  14. package/dist/commands/ad/create.d.ts +6 -0
  15. package/dist/commands/ad/create.d.ts.map +1 -0
  16. package/dist/commands/ad/create.js +77 -0
  17. package/dist/commands/ad/create.js.map +1 -0
  18. package/dist/commands/ad/delete.d.ts +6 -0
  19. package/dist/commands/ad/delete.d.ts.map +1 -0
  20. package/dist/commands/ad/delete.js +50 -0
  21. package/dist/commands/ad/delete.js.map +1 -0
  22. package/dist/commands/ad/index.d.ts +6 -0
  23. package/dist/commands/ad/index.d.ts.map +1 -0
  24. package/dist/commands/ad/index.js +17 -0
  25. package/dist/commands/ad/index.js.map +1 -0
  26. package/dist/commands/ad/info.d.ts +6 -0
  27. package/dist/commands/ad/info.d.ts.map +1 -0
  28. package/dist/commands/ad/info.js +90 -0
  29. package/dist/commands/ad/info.js.map +1 -0
  30. package/dist/commands/ad/list.d.ts +6 -0
  31. package/dist/commands/ad/list.d.ts.map +1 -0
  32. package/dist/commands/ad/list.js +94 -0
  33. package/dist/commands/ad/list.js.map +1 -0
  34. package/dist/commands/ad/update.d.ts +6 -0
  35. package/dist/commands/ad/update.d.ts.map +1 -0
  36. package/dist/commands/ad/update.js +42 -0
  37. package/dist/commands/ad/update.js.map +1 -0
  38. package/dist/commands/ad-group/create.d.ts +6 -0
  39. package/dist/commands/ad-group/create.d.ts.map +1 -0
  40. package/dist/commands/ad-group/create.js +59 -0
  41. package/dist/commands/ad-group/create.js.map +1 -0
  42. package/dist/commands/ad-group/delete.d.ts +6 -0
  43. package/dist/commands/ad-group/delete.d.ts.map +1 -0
  44. package/dist/commands/ad-group/delete.js +49 -0
  45. package/dist/commands/ad-group/delete.js.map +1 -0
  46. package/dist/commands/ad-group/index.d.ts +6 -0
  47. package/dist/commands/ad-group/index.d.ts.map +1 -0
  48. package/dist/commands/ad-group/index.js +17 -0
  49. package/dist/commands/ad-group/index.js.map +1 -0
  50. package/dist/commands/ad-group/info.d.ts +6 -0
  51. package/dist/commands/ad-group/info.d.ts.map +1 -0
  52. package/dist/commands/ad-group/info.js +59 -0
  53. package/dist/commands/ad-group/info.js.map +1 -0
  54. package/dist/commands/ad-group/list.d.ts +6 -0
  55. package/dist/commands/ad-group/list.d.ts.map +1 -0
  56. package/dist/commands/ad-group/list.js +83 -0
  57. package/dist/commands/ad-group/list.js.map +1 -0
  58. package/dist/commands/ad-group/update.d.ts +6 -0
  59. package/dist/commands/ad-group/update.d.ts.map +1 -0
  60. package/dist/commands/ad-group/update.js +56 -0
  61. package/dist/commands/ad-group/update.js.map +1 -0
  62. package/dist/commands/auth/index.d.ts +6 -0
  63. package/dist/commands/auth/index.d.ts.map +1 -0
  64. package/dist/commands/auth/index.js +13 -0
  65. package/dist/commands/auth/index.js.map +1 -0
  66. package/dist/commands/auth/login.d.ts +10 -0
  67. package/dist/commands/auth/login.d.ts.map +1 -0
  68. package/dist/commands/auth/login.js +154 -0
  69. package/dist/commands/auth/login.js.map +1 -0
  70. package/dist/commands/auth/logout.d.ts +6 -0
  71. package/dist/commands/auth/logout.d.ts.map +1 -0
  72. package/dist/commands/auth/logout.js +28 -0
  73. package/dist/commands/auth/logout.js.map +1 -0
  74. package/dist/commands/auth/status.d.ts +6 -0
  75. package/dist/commands/auth/status.d.ts.map +1 -0
  76. package/dist/commands/auth/status.js +47 -0
  77. package/dist/commands/auth/status.js.map +1 -0
  78. package/dist/commands/campaign/create.d.ts +6 -0
  79. package/dist/commands/campaign/create.d.ts.map +1 -0
  80. package/dist/commands/campaign/create.js +58 -0
  81. package/dist/commands/campaign/create.js.map +1 -0
  82. package/dist/commands/campaign/delete.d.ts +6 -0
  83. package/dist/commands/campaign/delete.d.ts.map +1 -0
  84. package/dist/commands/campaign/delete.js +49 -0
  85. package/dist/commands/campaign/delete.js.map +1 -0
  86. package/dist/commands/campaign/index.d.ts +6 -0
  87. package/dist/commands/campaign/index.d.ts.map +1 -0
  88. package/dist/commands/campaign/index.js +17 -0
  89. package/dist/commands/campaign/index.js.map +1 -0
  90. package/dist/commands/campaign/info.d.ts +6 -0
  91. package/dist/commands/campaign/info.d.ts.map +1 -0
  92. package/dist/commands/campaign/info.js +57 -0
  93. package/dist/commands/campaign/info.js.map +1 -0
  94. package/dist/commands/campaign/list.d.ts +6 -0
  95. package/dist/commands/campaign/list.d.ts.map +1 -0
  96. package/dist/commands/campaign/list.js +71 -0
  97. package/dist/commands/campaign/list.js.map +1 -0
  98. package/dist/commands/campaign/update.d.ts +6 -0
  99. package/dist/commands/campaign/update.d.ts.map +1 -0
  100. package/dist/commands/campaign/update.js +56 -0
  101. package/dist/commands/campaign/update.js.map +1 -0
  102. package/dist/commands/config.d.ts +6 -0
  103. package/dist/commands/config.d.ts.map +1 -0
  104. package/dist/commands/config.js +104 -0
  105. package/dist/commands/config.js.map +1 -0
  106. package/dist/commands/keyword/add.d.ts +6 -0
  107. package/dist/commands/keyword/add.d.ts.map +1 -0
  108. package/dist/commands/keyword/add.js +47 -0
  109. package/dist/commands/keyword/add.js.map +1 -0
  110. package/dist/commands/keyword/delete.d.ts +6 -0
  111. package/dist/commands/keyword/delete.d.ts.map +1 -0
  112. package/dist/commands/keyword/delete.js +50 -0
  113. package/dist/commands/keyword/delete.js.map +1 -0
  114. package/dist/commands/keyword/index.d.ts +6 -0
  115. package/dist/commands/keyword/index.d.ts.map +1 -0
  116. package/dist/commands/keyword/index.js +15 -0
  117. package/dist/commands/keyword/index.js.map +1 -0
  118. package/dist/commands/keyword/list.d.ts +6 -0
  119. package/dist/commands/keyword/list.d.ts.map +1 -0
  120. package/dist/commands/keyword/list.js +77 -0
  121. package/dist/commands/keyword/list.js.map +1 -0
  122. package/dist/commands/keyword/update.d.ts +6 -0
  123. package/dist/commands/keyword/update.d.ts.map +1 -0
  124. package/dist/commands/keyword/update.js +51 -0
  125. package/dist/commands/keyword/update.js.map +1 -0
  126. package/dist/commands/query.d.ts +6 -0
  127. package/dist/commands/query.d.ts.map +1 -0
  128. package/dist/commands/query.js +71 -0
  129. package/dist/commands/query.js.map +1 -0
  130. package/dist/config.d.ts +32 -0
  131. package/dist/config.d.ts.map +1 -0
  132. package/dist/config.js +10 -0
  133. package/dist/config.js.map +1 -0
  134. package/dist/index.d.ts +7 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +75 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/lib/api-client.d.ts +100 -0
  139. package/dist/lib/api-client.d.ts.map +1 -0
  140. package/dist/lib/api-client.js +186 -0
  141. package/dist/lib/api-client.js.map +1 -0
  142. package/dist/lib/callback-server.d.ts +32 -0
  143. package/dist/lib/callback-server.d.ts.map +1 -0
  144. package/dist/lib/callback-server.js +132 -0
  145. package/dist/lib/callback-server.js.map +1 -0
  146. package/dist/lib/google-ads-client.d.ts +177 -0
  147. package/dist/lib/google-ads-client.d.ts.map +1 -0
  148. package/dist/lib/google-ads-client.js +826 -0
  149. package/dist/lib/google-ads-client.js.map +1 -0
  150. package/dist/lib/oauth2-manager.d.ts +27 -0
  151. package/dist/lib/oauth2-manager.d.ts.map +1 -0
  152. package/dist/lib/oauth2-manager.js +123 -0
  153. package/dist/lib/oauth2-manager.js.map +1 -0
  154. package/dist/lib/token-store.d.ts +43 -0
  155. package/dist/lib/token-store.d.ts.map +1 -0
  156. package/dist/lib/token-store.js +103 -0
  157. package/dist/lib/token-store.js.map +1 -0
  158. package/dist/utils/config.d.ts +9 -0
  159. package/dist/utils/config.d.ts.map +1 -0
  160. package/dist/utils/config.js +34 -0
  161. package/dist/utils/config.js.map +1 -0
  162. package/dist/utils/customer-id.d.ts +10 -0
  163. package/dist/utils/customer-id.d.ts.map +1 -0
  164. package/dist/utils/customer-id.js +29 -0
  165. package/dist/utils/customer-id.js.map +1 -0
  166. package/dist/utils/env-updater.d.ts +8 -0
  167. package/dist/utils/env-updater.d.ts.map +1 -0
  168. package/dist/utils/env-updater.js +45 -0
  169. package/dist/utils/env-updater.js.map +1 -0
  170. package/dist/utils/errors.d.ts +32 -0
  171. package/dist/utils/errors.d.ts.map +1 -0
  172. package/dist/utils/errors.js +68 -0
  173. package/dist/utils/errors.js.map +1 -0
  174. package/dist/utils/logger.d.ts +10 -0
  175. package/dist/utils/logger.d.ts.map +1 -0
  176. package/dist/utils/logger.js +25 -0
  177. package/dist/utils/logger.js.map +1 -0
  178. package/dist/utils/optima-config.d.ts +9 -0
  179. package/dist/utils/optima-config.d.ts.map +1 -0
  180. package/dist/utils/optima-config.js +83 -0
  181. package/dist/utils/optima-config.js.map +1 -0
  182. package/package.json +67 -0
@@ -0,0 +1,279 @@
1
+ # Google Ads CLI - Claude Code 使用指南
2
+
3
+ > 本工具专为 Claude Code 和其他 AI 设计,提供非交互式 API
4
+
5
+ ## 🤖 核心功能
6
+
7
+ 管理 Google Ads 账号和广告投放的命令行工具。
8
+
9
+ ---
10
+
11
+ ## ⚡ 快速开始(非交互式模式)
12
+
13
+ ### 1. 创建账号配置
14
+
15
+ ```bash
16
+ google-ads account create \
17
+ --email <client-email> \
18
+ --name <company-name> \
19
+ --customer-id <customer-id> \
20
+ --json
21
+ ```
22
+
23
+ **参数**:
24
+ - `--email`: 客户的 Gmail 邮箱
25
+ - `--name`: 公司名称
26
+ - `--customer-id`: Google Ads Customer ID(10位数字)
27
+ - `--json`: JSON 格式输出(推荐 AI 使用)
28
+
29
+ **示例**:
30
+ ```bash
31
+ google-ads account create \
32
+ --email john@example.com \
33
+ --name "Acme Corp" \
34
+ --customer-id 1234567890 \
35
+ --json
36
+ ```
37
+
38
+ **输出**:
39
+ ```json
40
+ {
41
+ "success": true,
42
+ "customer_id": "123-456-7890",
43
+ "account_name": "Acme Corp",
44
+ "currency": "USD",
45
+ "timezone": "America/New_York",
46
+ "email": "john@example.com"
47
+ }
48
+ ```
49
+
50
+ ---
51
+
52
+ ## 📋 常用命令
53
+
54
+ ### 账号管理
55
+
56
+ ```bash
57
+ # 查看配置
58
+ google-ads config show --json
59
+
60
+ # 检查账号状态
61
+ google-ads account check --json
62
+
63
+ # 重置配置
64
+ google-ads config reset --force
65
+ ```
66
+
67
+ ### 广告系列管理
68
+
69
+ ```bash
70
+ # 列出广告系列
71
+ google-ads campaign list --json
72
+
73
+ # 创建广告系列
74
+ google-ads campaign create \
75
+ -n "广告系列名称" \
76
+ -b 100 \
77
+ --status PAUSED \
78
+ --json
79
+
80
+ # 删除广告系列
81
+ google-ads campaign delete <campaign-id>
82
+ ```
83
+
84
+ ### 关键词管理
85
+
86
+ ```bash
87
+ # 列出关键词
88
+ google-ads keyword list --json
89
+
90
+ # 添加关键词
91
+ google-ads keyword add <ad-group-id> \
92
+ --keywords "关键词1,关键词2" \
93
+ --match-type EXACT \
94
+ --json
95
+ ```
96
+
97
+ ### GAQL 查询
98
+
99
+ ```bash
100
+ # 执行查询
101
+ google-ads query -q "SELECT campaign.name, metrics.clicks FROM campaign" --json
102
+
103
+ # 从文件查询
104
+ google-ads query -f query.gaql --json
105
+ ```
106
+
107
+ ---
108
+
109
+ ## 🎯 AI 使用流程
110
+
111
+ ### 场景:用户要创建 Google Ads 账号
112
+
113
+ **步骤 1: 收集信息**
114
+ ```
115
+ AI: 请提供以下信息:
116
+ - Gmail 邮箱
117
+ - 公司名称
118
+ ```
119
+
120
+ **步骤 2: 引导创建账号**
121
+ ```
122
+ AI: 请访问 https://ads.google.com/ 创建账号:
123
+ 1. 用你的 Gmail 登录
124
+ 2. 切换到"专家模式"
125
+ 3. 选择"创建账号而不创建广告系列"
126
+ 4. 填写公司名称和货币(USD,创建后不可修改)
127
+ 5. 记录 Customer ID(10位数字)
128
+
129
+ 详细教程:docs/客户创建账号指南.md
130
+ ```
131
+
132
+ **步骤 3: 用户提供 Customer ID**
133
+ ```
134
+ 用户: Customer ID 是 123-456-7890
135
+ ```
136
+
137
+ **步骤 4: 保存配置**
138
+ ```bash
139
+ google-ads account create \
140
+ --email user@gmail.com \
141
+ --name "Company" \
142
+ --customer-id 1234567890 \
143
+ --json
144
+ ```
145
+
146
+ **步骤 5: 解析结果并提示下一步**
147
+ ```
148
+ AI: ✅ 配置成功!
149
+ Customer ID: 123-456-7890
150
+
151
+ 下一步:
152
+ 1. 检查邮箱接受邀请
153
+ 2. 设置账单信息
154
+ 3. 开始投放广告
155
+ ```
156
+
157
+ ---
158
+
159
+ ## ⚠️ 重要提示
160
+
161
+ ### 1. 始终使用非交互式模式
162
+
163
+ ❌ **错误**(会卡住):
164
+ ```bash
165
+ google-ads account create --email a@b.com --name "X"
166
+ # 会提示输入 Customer ID,AI 无法响应
167
+ ```
168
+
169
+ ✅ **正确**:
170
+ ```bash
171
+ google-ads account create --email a@b.com --name "X" --customer-id 1234567890
172
+ # 非交互式,直接完成
173
+ ```
174
+
175
+ ### 2. 使用 `--json` 输出
176
+
177
+ 便于解析结果:
178
+ ```bash
179
+ google-ads campaign list --json | jq '.[] | {id: .campaign.id, name: .campaign.name}'
180
+ ```
181
+
182
+ ### 3. Customer ID 格式
183
+
184
+ 接受两种格式:
185
+ - `1234567890`(10位数字)
186
+ - `123-456-7890`(带连字符)
187
+
188
+ 验证:必须是 10 位数字
189
+
190
+ ---
191
+
192
+ ## 🔧 配置文件
193
+
194
+ ### 环境变量 (.env)
195
+
196
+ 由 Agency 提供:
197
+ ```bash
198
+ GOOGLE_ADS_DEVELOPER_TOKEN=xxx
199
+ GOOGLE_ADS_CLIENT_ID=xxx
200
+ GOOGLE_ADS_CLIENT_SECRET=xxx
201
+ GOOGLE_ADS_MANAGER_ACCOUNT_ID=xxx
202
+ GOOGLE_ADS_REFRESH_TOKEN=xxx
203
+ ```
204
+
205
+ ### CLI 配置 (~/.config/google-ads-cli/config.json)
206
+
207
+ 自动生成:
208
+ ```json
209
+ {
210
+ "customerId": "1234567890",
211
+ "accountName": "Company Name",
212
+ "currency": "USD",
213
+ "timezone": "America/New_York",
214
+ "email": "user@example.com"
215
+ }
216
+ ```
217
+
218
+ ---
219
+
220
+ ## 📚 完整文档
221
+
222
+ - **AI 使用指南**: `docs/AI-使用指南.md`
223
+ - **客户创建账号指南**: `docs/客户创建账号指南.md`
224
+ - **技术设计**: `docs/technical-design.md`
225
+ - **命令参考**: `docs/EXAMPLES.md`
226
+
227
+ ---
228
+
229
+ ## 🆘 故障排除
230
+
231
+ ### 问题 1: 命令卡住不动
232
+
233
+ **原因**: 使用了交互式模式
234
+ **解决**: 添加 `--customer-id` 参数
235
+
236
+ ### 问题 2: Customer ID 格式错误
237
+
238
+ **原因**: 不是 10 位数字
239
+ **解决**: 检查格式,去掉连字符应该是 10 位
240
+
241
+ ### 问题 3: 账号已存在
242
+
243
+ **原因**: 已经配置过账号
244
+ **解决**: 运行 `google-ads config reset --force`
245
+
246
+ ---
247
+
248
+ ## ✅ 快速测试
249
+
250
+ ```bash
251
+ # 1. 查看帮助
252
+ google-ads --help
253
+
254
+ # 2. 查看账号创建帮助
255
+ google-ads account create --help
256
+
257
+ # 3. 测试非交互式创建(需要真实 Customer ID)
258
+ google-ads account create \
259
+ --email test@example.com \
260
+ --name "Test Company" \
261
+ --customer-id 1234567890 \
262
+ --json
263
+
264
+ # 4. 查看配置
265
+ google-ads config show --json
266
+ ```
267
+
268
+ ---
269
+
270
+ ## 🎯 核心原则
271
+
272
+ 1. **非交互式优先**: 所有命令支持完全非交互式调用
273
+ 2. **JSON 输出**: 使用 `--json` 便于 AI 解析
274
+ 3. **明确错误**: 错误信息清晰,便于 AI 理解和反馈
275
+ 4. **文档完整**: 每个命令都有 `--help` 说明
276
+
277
+ ---
278
+
279
+ Happy coding! 🚀
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Account Check Command - 检查账号配置状态
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const checkCommand: Command;
6
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +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,SA+LrB,CAAC"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Account Check Command - 检查账号配置状态
3
+ */
4
+ import { Command } from 'commander';
5
+ import chalk from 'chalk';
6
+ import ora from 'ora';
7
+ import Table from 'cli-table3';
8
+ import { GoogleAdsClient } from '../../lib/google-ads-client.js';
9
+ import { handleError } from '../../utils/errors.js';
10
+ import { getCustomerId } from '../../utils/customer-id.js';
11
+ export const checkCommand = new Command('check')
12
+ .description('检查账号配置状态(账单、权限等)')
13
+ .option('--json', '以 JSON 格式输出')
14
+ .action(async (options) => {
15
+ const spinner = ora('检查账号状态...').start();
16
+ try {
17
+ const customerId = getCustomerId();
18
+ const client = new GoogleAdsClient();
19
+ // Get basic customer info
20
+ const customerInfo = await client.getCustomerInfo(customerId);
21
+ if (!customerInfo) {
22
+ spinner.fail('账号不存在');
23
+ console.log(chalk.red(`\n✗ 无法找到账号 ${customerId}`));
24
+ return;
25
+ }
26
+ // Check billing setup status
27
+ const billingQuery = `
28
+ SELECT
29
+ billing_setup.id,
30
+ billing_setup.status,
31
+ billing_setup.payments_account
32
+ FROM billing_setup
33
+ WHERE billing_setup.status IN ('APPROVED', 'PENDING')
34
+ ORDER BY billing_setup.id DESC
35
+ LIMIT 1
36
+ `;
37
+ let billingStatus = 'UNKNOWN';
38
+ let billingAccountId = null;
39
+ let canCreateCampaigns = false;
40
+ try {
41
+ const billingResults = await client.query(customerId, billingQuery);
42
+ if (billingResults.length > 0) {
43
+ const billing = billingResults[0].billing_setup;
44
+ billingStatus = billing.status || 'UNKNOWN';
45
+ billingAccountId = billing.payments_account || null;
46
+ canCreateCampaigns = billingStatus === 'APPROVED';
47
+ }
48
+ else {
49
+ billingStatus = 'NOT_CONFIGURED';
50
+ }
51
+ }
52
+ catch (error) {
53
+ // Billing query might fail if no permissions
54
+ billingStatus = 'UNKNOWN';
55
+ }
56
+ // Check if customer can manage ads (has sufficient permissions)
57
+ const hasManagePermission = customerInfo.manager !== undefined;
58
+ spinner.succeed('账号状态检查完成');
59
+ if (options.json) {
60
+ const result = {
61
+ customer_id: customerId,
62
+ customer_info: {
63
+ name: customerInfo.descriptive_name,
64
+ currency: customerInfo.currency_code,
65
+ timezone: customerInfo.time_zone,
66
+ is_manager: customerInfo.manager || false,
67
+ is_test_account: customerInfo.test_account || false,
68
+ auto_tagging: customerInfo.auto_tagging_enabled,
69
+ },
70
+ billing: {
71
+ status: billingStatus,
72
+ account_id: billingAccountId,
73
+ configured: billingStatus !== 'NOT_CONFIGURED' && billingStatus !== 'UNKNOWN',
74
+ },
75
+ permissions: {
76
+ can_create_campaigns: canCreateCampaigns,
77
+ has_manage_permission: hasManagePermission,
78
+ },
79
+ ready: canCreateCampaigns && hasManagePermission,
80
+ };
81
+ console.log(JSON.stringify(result, null, 2));
82
+ }
83
+ else {
84
+ // Display in table format
85
+ console.log(chalk.cyan.bold('\n📊 账号状态\n'));
86
+ const table = new Table({
87
+ chars: {
88
+ top: '─',
89
+ 'top-mid': '┬',
90
+ 'top-left': '┌',
91
+ 'top-right': '┐',
92
+ bottom: '─',
93
+ 'bottom-mid': '┴',
94
+ 'bottom-left': '└',
95
+ 'bottom-right': '┘',
96
+ left: '│',
97
+ 'left-mid': '├',
98
+ mid: '─',
99
+ 'mid-mid': '┼',
100
+ right: '│',
101
+ 'right-mid': '┤',
102
+ middle: '│',
103
+ },
104
+ });
105
+ // Customer info
106
+ table.push([chalk.gray('账号 ID'), chalk.white(customerId)], [chalk.gray('账号名称'), chalk.white(customerInfo.descriptive_name || '未命名')], [chalk.gray('货币'), chalk.white(customerInfo.currency_code)], [chalk.gray('时区'), chalk.white(customerInfo.time_zone)], [chalk.gray('管理账号'), customerInfo.manager ? chalk.yellow('是') : chalk.white('否')], [chalk.gray('测试账号'), customerInfo.test_account ? chalk.yellow('是') : chalk.white('否')]);
107
+ console.log(table.toString());
108
+ // Billing status
109
+ console.log(chalk.cyan.bold('\n💳 账单状态\n'));
110
+ const billingTable = new Table({
111
+ chars: {
112
+ top: '─',
113
+ 'top-mid': '┬',
114
+ 'top-left': '┌',
115
+ 'top-right': '┐',
116
+ bottom: '─',
117
+ 'bottom-mid': '┴',
118
+ 'bottom-left': '└',
119
+ 'bottom-right': '┘',
120
+ left: '│',
121
+ 'left-mid': '├',
122
+ mid: '─',
123
+ 'mid-mid': '┼',
124
+ right: '│',
125
+ 'right-mid': '┤',
126
+ middle: '│',
127
+ },
128
+ });
129
+ let statusColor = chalk.white;
130
+ let statusText = billingStatus;
131
+ if (billingStatus === 'APPROVED') {
132
+ statusColor = chalk.green;
133
+ statusText = '✅ 已配置';
134
+ }
135
+ else if (billingStatus === 'PENDING') {
136
+ statusColor = chalk.yellow;
137
+ statusText = '⏳ 等待审批';
138
+ }
139
+ else if (billingStatus === 'NOT_CONFIGURED') {
140
+ statusColor = chalk.red;
141
+ statusText = '❌ 未配置';
142
+ }
143
+ else {
144
+ statusColor = chalk.gray;
145
+ statusText = '❓ 未知';
146
+ }
147
+ billingTable.push([chalk.gray('账单状态'), statusColor(statusText)], [
148
+ chalk.gray('可创建广告系列'),
149
+ canCreateCampaigns ? chalk.green('✅ 是') : chalk.red('❌ 否'),
150
+ ]);
151
+ if (billingAccountId) {
152
+ billingTable.push([chalk.gray('付款账号'), chalk.white(billingAccountId)]);
153
+ }
154
+ console.log(billingTable.toString());
155
+ // Recommendations
156
+ console.log(chalk.cyan.bold('\n💡 建议\n'));
157
+ if (!canCreateCampaigns) {
158
+ console.log(chalk.yellow('⚠️ 账单未配置,无法创建广告系列'));
159
+ console.log(chalk.gray('\n请按以下步骤配置账单:'));
160
+ console.log(chalk.white('1. 访问 Google Ads 账单中心:'));
161
+ console.log(chalk.cyan(' https://ads.google.com/aw/billing'));
162
+ console.log(chalk.white('2. 添加付款方式(信用卡或银行账户)'));
163
+ console.log(chalk.white('3. 完成账单设置'));
164
+ console.log(chalk.gray('\n或查看完整设置指南:'));
165
+ console.log(chalk.cyan(' google-ads setup --step 6\n'));
166
+ }
167
+ else {
168
+ console.log(chalk.green('✅ 账号配置完成,可以开始创建广告系列!\n'));
169
+ console.log(chalk.gray('快速开始:'));
170
+ console.log(chalk.cyan(` google-ads campaign create -n "我的广告系列" -b 10\n`));
171
+ }
172
+ }
173
+ }
174
+ catch (error) {
175
+ spinner.fail('检查失败');
176
+ handleError(error);
177
+ }
178
+ });
179
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/commands/account/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Account Create Command - 客户账号注册
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const createCommand: Command;
6
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/account/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,aAAa,SAgMtB,CAAC"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Account Create Command - 客户账号注册
3
+ */
4
+ import { Command } from 'commander';
5
+ import chalk from 'chalk';
6
+ import ora from 'ora';
7
+ import Conf from 'conf';
8
+ import inquirer from 'inquirer';
9
+ import { handleError } from '../../utils/errors.js';
10
+ import { GoogleAdsClient } from '../../lib/google-ads-client.js';
11
+ const config = new Conf({ projectName: 'google-ads-cli' });
12
+ export const createCommand = new Command('create')
13
+ .description('创建您的 Google Ads 账号(首次使用)')
14
+ .requiredOption('--email <email>', '您的 Google 账号邮箱(用于接收邀请)')
15
+ .requiredOption('--name <name>', '账号名称(您的公司或品牌名称)')
16
+ .option('--customer-id <id>', 'Customer ID(10位数字,如 1234567890 或 123-456-7890)')
17
+ .option('--currency <code>', '货币代码(如 USD, CNY)', 'USD')
18
+ .option('--timezone <timezone>', '时区(如 Asia/Shanghai, America/New_York)', 'America/New_York')
19
+ .option('--json', '以 JSON 格式输出')
20
+ .action(async (options) => {
21
+ const spinner = ora('准备创建您的 Google Ads 账号...').start();
22
+ try {
23
+ // 检查是否已经创建过账号
24
+ const existingCustomerId = config.get('customerId');
25
+ if (existingCustomerId) {
26
+ spinner.warn('您已经创建过账号');
27
+ console.log(chalk.yellow('\n⚠️ 检测到已存在的账号配置'));
28
+ console.log(chalk.gray(`Customer ID: ${existingCustomerId}\n`));
29
+ console.log(chalk.white('如果需要重新创建,请先运行:'));
30
+ console.log(chalk.cyan(' google-ads config reset\n'));
31
+ return;
32
+ }
33
+ // 检查 MCC 凭据
34
+ const managerAccountId = process.env.GOOGLE_ADS_MANAGER_ACCOUNT_ID;
35
+ if (!managerAccountId) {
36
+ throw new Error('缺少 GOOGLE_ADS_MANAGER_ACCOUNT_ID 环境变量\n' +
37
+ '请在 .env 文件中配置 Agency 的 MCC 管理账号 ID');
38
+ }
39
+ spinner.info('账号创建功能开发中');
40
+ // TODO: 实现账号创建 API 调用
41
+ // 需要调用 google-ads-api 的 CustomerService.createCustomerClient
42
+ // 然后调用 CustomerUserAccessInvitationService 发送邀请
43
+ let customerId;
44
+ // 检查是否通过命令行参数提供了 Customer ID(非交互式模式)
45
+ if (options.customerId) {
46
+ // 非交互式模式:验证并使用提供的 Customer ID
47
+ spinner.stop();
48
+ const providedId = options.customerId.replace(/-/g, '');
49
+ // 验证格式
50
+ if (!/^\d{10}$/.test(providedId)) {
51
+ throw new Error('无效的 Customer ID 格式\n' +
52
+ '请提供 10 位数字的 Customer ID(可带或不带连字符)\n' +
53
+ '例如: 1234567890 或 123-456-7890');
54
+ }
55
+ customerId = providedId;
56
+ if (!options.json) {
57
+ console.log(chalk.green('✅ Customer ID 验证通过\n'));
58
+ }
59
+ }
60
+ else {
61
+ // 交互式模式:显示手动创建步骤并询问
62
+ console.log(chalk.yellow('\n⚠️ 注意: 账号创建 API 功能正在开发中\n'));
63
+ console.log(chalk.cyan.bold('📋 手动创建步骤:\n'));
64
+ console.log(chalk.white('步骤 1: 访问 Google Ads 官网'));
65
+ console.log(chalk.gray(' URL: ') + chalk.cyan('https://ads.google.com'));
66
+ console.log(chalk.gray(' 使用客户的 Gmail 登录\n'));
67
+ console.log(chalk.white('步骤 2: 切换到专家模式'));
68
+ console.log(chalk.gray(' • 在页面底部找到 "切换到专家模式"'));
69
+ console.log(chalk.gray(' • 点击 "创建账号而不创建广告系列"\n'));
70
+ console.log(chalk.white('步骤 3: 填写账号信息'));
71
+ console.log(chalk.gray(` • 账号名称: ${chalk.white(options.name)}`));
72
+ console.log(chalk.gray(` • 货币: ${chalk.white(options.currency)} (创建后不可修改)`));
73
+ console.log(chalk.gray(` • 时区: ${chalk.white(options.timezone)}\n`));
74
+ console.log(chalk.white('步骤 4: 完成创建并记录 Customer ID'));
75
+ console.log(chalk.gray(' 创建成功后,页面会显示 Customer ID\n'));
76
+ console.log(chalk.cyan('📚 详细图文教程:'));
77
+ console.log(chalk.gray(' docs/客户创建账号指南.md\n'));
78
+ // 交互式提示用户输入 Customer ID
79
+ const answers = await inquirer.prompt([
80
+ {
81
+ type: 'input',
82
+ name: 'customerId',
83
+ message: '请输入新创建的 Customer ID(格式:123-456-7890 或 1234567890):',
84
+ validate: (input) => {
85
+ // 移除连字符
86
+ const clean = input.replace(/-/g, '');
87
+ // 验证是否为 10 位数字
88
+ if (!/^\d{10}$/.test(clean)) {
89
+ return '请输入有效的 Customer ID(10 位数字)';
90
+ }
91
+ return true;
92
+ },
93
+ },
94
+ ]);
95
+ customerId = answers.customerId.replace(/-/g, '');
96
+ }
97
+ // 保存到 config
98
+ config.set('customerId', customerId);
99
+ config.set('accountName', options.name);
100
+ config.set('currency', options.currency);
101
+ config.set('timezone', options.timezone);
102
+ config.set('email', options.email);
103
+ config.set('createdAt', new Date().toISOString());
104
+ console.log(chalk.green('\n✅ 配置已保存!\n'));
105
+ const formattedCustomerId = customerId.replace(/(\d{3})(\d{3})(\d{4})/, '$1-$2-$3');
106
+ // 尝试发送 MCC 关联邀请
107
+ if (!options.json) {
108
+ console.log(chalk.cyan('📤 正在发送 MCC 关联邀请...\n'));
109
+ }
110
+ try {
111
+ const client = new GoogleAdsClient();
112
+ const managerLinkId = await client.sendLinkInvitation(customerId);
113
+ if (options.json) {
114
+ // JSON 模式下记录成功但不打断输出
115
+ }
116
+ else if (managerLinkId.startsWith('existing:')) {
117
+ // 已存在关联
118
+ const linkId = managerLinkId.replace('existing:', '');
119
+ console.log(chalk.green('✅ MCC 关联已存在!\n'));
120
+ console.log(chalk.gray(`Manager Link ID: ${linkId}\n`));
121
+ }
122
+ else {
123
+ // 新创建的关联
124
+ console.log(chalk.green('✅ MCC 关联邀请已发送!\n'));
125
+ console.log(chalk.gray(`Manager Link ID: ${managerLinkId}\n`));
126
+ }
127
+ }
128
+ catch (error) {
129
+ // 发送邀请失败不影响账号配置
130
+ if (!options.json) {
131
+ console.log(chalk.yellow('⚠️ 发送 MCC 关联邀请失败\n'));
132
+ console.log(chalk.gray(`原因: ${error.message}\n`));
133
+ console.log(chalk.gray('您可以稍后在 Google Ads UI 中手动接受关联邀请\n'));
134
+ }
135
+ }
136
+ if (options.json) {
137
+ const result = {
138
+ success: true,
139
+ customer_id: formattedCustomerId,
140
+ account_name: options.name,
141
+ currency: options.currency,
142
+ timezone: options.timezone,
143
+ email: options.email,
144
+ next_steps: [
145
+ '检查邮箱中的 Google Ads 邀请邮件',
146
+ '点击邮件中的链接接受邀请',
147
+ '登录 Google Ads 设置账单',
148
+ '运行 google-ads account check 验证配置',
149
+ ],
150
+ };
151
+ console.log(JSON.stringify(result, null, 2));
152
+ }
153
+ else {
154
+ console.log(chalk.cyan.bold('📧 下一步操作:\n'));
155
+ console.log(chalk.white('1. 检查您的邮箱 ') + chalk.cyan(options.email));
156
+ console.log(chalk.gray(' 查找来自 Google Ads 的邀请邮件(可能在垃圾邮件中)\n'));
157
+ console.log(chalk.white('2. 点击邮件中的 "接受邀请" 链接\n'));
158
+ console.log(chalk.white('3. 使用您的 Google 账号登录并接受邀请\n'));
159
+ console.log(chalk.white('4. 设置账单信息:'));
160
+ console.log(chalk.gray(' 访问: ') + chalk.cyan('https://ads.google.com/aw/billing'));
161
+ console.log(chalk.gray(' 添加付款方式(信用卡或银行账户)\n'));
162
+ console.log(chalk.white('5. 验证账号配置:'));
163
+ console.log(chalk.cyan(' google-ads account check\n'));
164
+ console.log(chalk.gray(`💡 提示: Customer ID (${formattedCustomerId}) 已保存,后续命令无需指定账号\n`));
165
+ }
166
+ }
167
+ catch (error) {
168
+ spinner.fail('操作失败');
169
+ handleError(error);
170
+ }
171
+ });
172
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/account/create.ts"],"names":[],"mappings":"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"}