@analyticscli/growth-engineer 0.1.0-preview.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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -0
  3. package/dist/config.d.ts +1663 -0
  4. package/dist/config.js +266 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +1188 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/runtime/export-analytics-summary.d.mts +2 -0
  10. package/dist/runtime/export-analytics-summary.mjs +303 -0
  11. package/dist/runtime/export-analytics-summary.mjs.map +1 -0
  12. package/dist/runtime/export-asc-summary.d.mts +2 -0
  13. package/dist/runtime/export-asc-summary.mjs +376 -0
  14. package/dist/runtime/export-asc-summary.mjs.map +1 -0
  15. package/dist/runtime/export-revenuecat-summary.d.mts +2 -0
  16. package/dist/runtime/export-revenuecat-summary.mjs +176 -0
  17. package/dist/runtime/export-revenuecat-summary.mjs.map +1 -0
  18. package/dist/runtime/export-sentry-summary.d.mts +2 -0
  19. package/dist/runtime/export-sentry-summary.mjs +352 -0
  20. package/dist/runtime/export-sentry-summary.mjs.map +1 -0
  21. package/dist/runtime/openclaw-exporters-lib.d.mts +101 -0
  22. package/dist/runtime/openclaw-exporters-lib.mjs +1276 -0
  23. package/dist/runtime/openclaw-exporters-lib.mjs.map +1 -0
  24. package/dist/runtime/openclaw-feedback-api.d.mts +2 -0
  25. package/dist/runtime/openclaw-feedback-api.mjs +255 -0
  26. package/dist/runtime/openclaw-feedback-api.mjs.map +1 -0
  27. package/dist/runtime/openclaw-growth-charts.py +154 -0
  28. package/dist/runtime/openclaw-growth-engineer.d.mts +2 -0
  29. package/dist/runtime/openclaw-growth-engineer.mjs +1258 -0
  30. package/dist/runtime/openclaw-growth-engineer.mjs.map +1 -0
  31. package/dist/runtime/openclaw-growth-env.d.mts +9 -0
  32. package/dist/runtime/openclaw-growth-env.mjs +125 -0
  33. package/dist/runtime/openclaw-growth-env.mjs.map +1 -0
  34. package/dist/runtime/openclaw-growth-preflight.d.mts +2 -0
  35. package/dist/runtime/openclaw-growth-preflight.mjs +1111 -0
  36. package/dist/runtime/openclaw-growth-preflight.mjs.map +1 -0
  37. package/dist/runtime/openclaw-growth-runner.d.mts +2 -0
  38. package/dist/runtime/openclaw-growth-runner.mjs +1302 -0
  39. package/dist/runtime/openclaw-growth-runner.mjs.map +1 -0
  40. package/dist/runtime/openclaw-growth-shared.d.mts +33 -0
  41. package/dist/runtime/openclaw-growth-shared.mjs +208 -0
  42. package/dist/runtime/openclaw-growth-shared.mjs.map +1 -0
  43. package/dist/runtime/openclaw-growth-start.d.mts +2 -0
  44. package/dist/runtime/openclaw-growth-start.mjs +1575 -0
  45. package/dist/runtime/openclaw-growth-start.mjs.map +1 -0
  46. package/dist/runtime/openclaw-growth-status.d.mts +2 -0
  47. package/dist/runtime/openclaw-growth-status.mjs +387 -0
  48. package/dist/runtime/openclaw-growth-status.mjs.map +1 -0
  49. package/dist/runtime/openclaw-growth-wizard.d.mts +2 -0
  50. package/dist/runtime/openclaw-growth-wizard.mjs +3519 -0
  51. package/dist/runtime/openclaw-growth-wizard.mjs.map +1 -0
  52. package/dist/shell.d.ts +17 -0
  53. package/dist/shell.js +40 -0
  54. package/dist/shell.js.map +1 -0
  55. package/package.json +38 -0
  56. package/templates/analytics_summary.example.json +40 -0
  57. package/templates/config.example.json +197 -0
  58. package/templates/feedback_summary.example.json +37 -0
  59. package/templates/revenuecat_summary.example.json +25 -0
  60. package/templates/sentry_summary.example.json +23 -0
@@ -0,0 +1,376 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from 'node:child_process';
3
+ import process from 'node:process';
4
+ import { buildAscSummary, writeJsonOutput } from './openclaw-exporters-lib.mjs';
5
+ import { loadOpenClawGrowthSecrets } from './openclaw-growth-env.mjs';
6
+ function printHelpAndExit(exitCode, reason = null) {
7
+ if (reason) {
8
+ process.stderr.write(`${reason}\n\n`);
9
+ }
10
+ process.stdout.write(`
11
+ Export ASC Summary
12
+
13
+ Builds an OpenClaw-compatible store/release summary JSON from the asc CLI.
14
+
15
+ Usage:
16
+ node scripts/export-asc-summary.mjs [options]
17
+
18
+ Options:
19
+ --app <id> Optional App Store Connect app ID filter (defaults to all accessible apps)
20
+ --out <file> Write JSON to file instead of stdout
21
+ --start <date> App Store Connect Analytics start date (YYYY-MM-DD, default: last 30 complete days)
22
+ --end <date> App Store Connect Analytics end date (YYYY-MM-DD, default: yesterday UTC)
23
+ --skip-web-analytics Skip experimental ASC web analytics queries
24
+ --country <code> Ratings country override (default: all countries)
25
+ --reviews-limit <n> Review summarizations limit (default: 20)
26
+ --feedback-limit <n> TestFlight feedback limit (default: 20)
27
+ --max-signals <n> Maximum signals to emit (default: 4)
28
+ --help, -h Show help
29
+ `);
30
+ process.exit(exitCode);
31
+ }
32
+ function parseArgs(argv) {
33
+ const defaultEnd = formatDate(addDays(new Date(), -1));
34
+ const defaultStart = formatDate(addDays(parseDate(defaultEnd), -29));
35
+ const args = {
36
+ app: String(process.env.ASC_APP_ID || '').trim(),
37
+ out: '',
38
+ start: String(process.env.ASC_ANALYTICS_START || defaultStart).trim(),
39
+ end: String(process.env.ASC_ANALYTICS_END || defaultEnd).trim(),
40
+ webAnalytics: true,
41
+ country: '',
42
+ reviewsLimit: 20,
43
+ feedbackLimit: 20,
44
+ maxSignals: 4,
45
+ };
46
+ for (let index = 0; index < argv.length; index += 1) {
47
+ const token = argv[index];
48
+ const next = argv[index + 1];
49
+ if (token === '--') {
50
+ continue;
51
+ }
52
+ else if (token === '--app') {
53
+ args.app = String(next || '').trim();
54
+ index += 1;
55
+ }
56
+ else if (token === '--out') {
57
+ args.out = String(next || '').trim();
58
+ index += 1;
59
+ }
60
+ else if (token === '--start') {
61
+ args.start = String(next || '').trim();
62
+ index += 1;
63
+ }
64
+ else if (token === '--end') {
65
+ args.end = String(next || '').trim();
66
+ index += 1;
67
+ }
68
+ else if (token === '--skip-web-analytics') {
69
+ args.webAnalytics = false;
70
+ }
71
+ else if (token === '--country') {
72
+ args.country = String(next || '').trim();
73
+ index += 1;
74
+ }
75
+ else if (token === '--reviews-limit') {
76
+ const parsed = Number.parseInt(String(next || ''), 10);
77
+ if (!Number.isFinite(parsed) || parsed <= 0) {
78
+ printHelpAndExit(1, `Invalid value for --reviews-limit: ${String(next || '')}`);
79
+ }
80
+ args.reviewsLimit = parsed;
81
+ index += 1;
82
+ }
83
+ else if (token === '--feedback-limit') {
84
+ const parsed = Number.parseInt(String(next || ''), 10);
85
+ if (!Number.isFinite(parsed) || parsed <= 0) {
86
+ printHelpAndExit(1, `Invalid value for --feedback-limit: ${String(next || '')}`);
87
+ }
88
+ args.feedbackLimit = parsed;
89
+ index += 1;
90
+ }
91
+ else if (token === '--max-signals') {
92
+ const parsed = Number.parseInt(String(next || ''), 10);
93
+ if (!Number.isFinite(parsed) || parsed <= 0) {
94
+ printHelpAndExit(1, `Invalid value for --max-signals: ${String(next || '')}`);
95
+ }
96
+ args.maxSignals = parsed;
97
+ index += 1;
98
+ }
99
+ else if (token === '--help' || token === '-h') {
100
+ printHelpAndExit(0);
101
+ }
102
+ else {
103
+ printHelpAndExit(1, `Unknown argument: ${token}`);
104
+ }
105
+ }
106
+ return args;
107
+ }
108
+ function addDays(date, days) {
109
+ const copy = new Date(date);
110
+ copy.setUTCDate(copy.getUTCDate() + days);
111
+ return copy;
112
+ }
113
+ function parseDate(value) {
114
+ return new Date(`${value}T00:00:00Z`);
115
+ }
116
+ function formatDate(date) {
117
+ return date.toISOString().slice(0, 10);
118
+ }
119
+ function runJsonCommand(command, commandArgs) {
120
+ return new Promise((resolve, reject) => {
121
+ const child = spawn(command, commandArgs, {
122
+ stdio: ['ignore', 'pipe', 'pipe'],
123
+ env: process.env,
124
+ });
125
+ let stdout = '';
126
+ let stderr = '';
127
+ child.stdout.on('data', (chunk) => {
128
+ stdout += String(chunk);
129
+ });
130
+ child.stderr.on('data', (chunk) => {
131
+ stderr += String(chunk);
132
+ });
133
+ child.on('error', reject);
134
+ child.on('close', (code) => {
135
+ if (code !== 0) {
136
+ reject(Object.assign(new Error(stderr.trim() || `${command} exited with code ${code}`), { exitCode: code }));
137
+ return;
138
+ }
139
+ try {
140
+ resolve(JSON.parse(stdout));
141
+ }
142
+ catch {
143
+ reject(new Error(`${command} returned non-JSON output`));
144
+ }
145
+ });
146
+ });
147
+ }
148
+ async function runBestEffortAscQuery(label, args, warnings) {
149
+ try {
150
+ return await runJsonCommand('asc', args);
151
+ }
152
+ catch (error) {
153
+ warnings.push(`${label}: ${error instanceof Error ? error.message : String(error)}`);
154
+ return null;
155
+ }
156
+ }
157
+ function normalizeString(value) {
158
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
159
+ }
160
+ function extractAscAppChoices(payload) {
161
+ const candidates = (() => {
162
+ if (Array.isArray(payload))
163
+ return payload;
164
+ if (payload && typeof payload === 'object') {
165
+ if (Array.isArray(payload.apps))
166
+ return payload.apps;
167
+ if (Array.isArray(payload.items))
168
+ return payload.items;
169
+ if (Array.isArray(payload.data))
170
+ return payload.data;
171
+ }
172
+ return [];
173
+ })();
174
+ const byId = new Map();
175
+ for (const candidate of candidates) {
176
+ if (!candidate || typeof candidate !== 'object')
177
+ continue;
178
+ const attrs = candidate.attributes && typeof candidate.attributes === 'object' ? candidate.attributes : {};
179
+ const id = normalizeString(candidate.id) ||
180
+ normalizeString(candidate.appId) ||
181
+ normalizeString(candidate.app_id);
182
+ if (!id)
183
+ continue;
184
+ byId.set(id, {
185
+ id,
186
+ name: normalizeString(candidate.name) ||
187
+ normalizeString(candidate.appName) ||
188
+ normalizeString(candidate.displayName) ||
189
+ normalizeString(attrs.name),
190
+ bundleId: normalizeString(candidate.bundleId) ||
191
+ normalizeString(candidate.bundle_id) ||
192
+ normalizeString(attrs.bundleId),
193
+ });
194
+ }
195
+ return [...byId.values()];
196
+ }
197
+ async function listAscApps() {
198
+ const payload = await runJsonCommand('asc', ['apps', 'list', '--output', 'json']);
199
+ const apps = extractAscAppChoices(payload);
200
+ if (apps.length === 0) {
201
+ throw new Error('asc apps list returned no accessible apps');
202
+ }
203
+ return apps;
204
+ }
205
+ async function buildSingleAppSummary(appId, args) {
206
+ const warnings = [];
207
+ const statusPayload = await runBestEffortAscQuery('ASC status query', [
208
+ 'status',
209
+ '--app',
210
+ appId,
211
+ '--include',
212
+ 'builds,testflight,submission,review,appstore',
213
+ ], warnings);
214
+ const ratingsArgs = ['reviews', 'ratings', '--app', appId];
215
+ if (args.country) {
216
+ ratingsArgs.push('--country', args.country);
217
+ }
218
+ else {
219
+ ratingsArgs.push('--all');
220
+ }
221
+ const ratingsPayload = await runBestEffortAscQuery('ASC ratings query', ratingsArgs, warnings);
222
+ const reviewSummariesPayload = await runBestEffortAscQuery('ASC review summarizations query', [
223
+ 'reviews',
224
+ 'summarizations',
225
+ '--app',
226
+ appId,
227
+ '--platform',
228
+ 'IOS',
229
+ '--limit',
230
+ String(args.reviewsLimit),
231
+ '--fields',
232
+ 'text,createdDate,locale',
233
+ ], warnings);
234
+ const feedbackPayload = await runBestEffortAscQuery('ASC beta feedback query', [
235
+ 'feedback',
236
+ '--app',
237
+ appId,
238
+ '--limit',
239
+ String(args.feedbackLimit),
240
+ '--sort',
241
+ '-createdDate',
242
+ ], warnings);
243
+ const analyticsMetricsPayload = args.webAnalytics
244
+ ? await runBestEffortAscQuery('ASC web analytics metrics query', [
245
+ 'web',
246
+ 'analytics',
247
+ 'metrics',
248
+ '--app',
249
+ appId,
250
+ '--start',
251
+ args.start,
252
+ '--end',
253
+ args.end,
254
+ '--frequency',
255
+ 'day',
256
+ '--measures',
257
+ 'units,redownloads,conversionRate,crashRate',
258
+ '--output',
259
+ 'json',
260
+ ], warnings)
261
+ : null;
262
+ const analyticsSourcesPayload = args.webAnalytics
263
+ ? await runBestEffortAscQuery('ASC web analytics sources query', [
264
+ 'web',
265
+ 'analytics',
266
+ 'sources',
267
+ '--app',
268
+ appId,
269
+ '--start',
270
+ args.start,
271
+ '--end',
272
+ args.end,
273
+ '--output',
274
+ 'json',
275
+ ], warnings)
276
+ : null;
277
+ const analyticsOverviewPayload = args.webAnalytics
278
+ ? await runBestEffortAscQuery('ASC web analytics overview query', [
279
+ 'web',
280
+ 'analytics',
281
+ 'overview',
282
+ '--app',
283
+ appId,
284
+ '--start',
285
+ args.start,
286
+ '--end',
287
+ args.end,
288
+ '--output',
289
+ 'json',
290
+ ], warnings)
291
+ : null;
292
+ return buildAscSummary({
293
+ appId,
294
+ statusPayload,
295
+ ratingsPayload,
296
+ reviewSummariesPayload,
297
+ feedbackPayload,
298
+ analyticsMetricsPayload,
299
+ analyticsSourcesPayload,
300
+ analyticsOverviewPayload,
301
+ analyticsWindow: { start: args.start, end: args.end },
302
+ analyticsWarnings: warnings,
303
+ maxSignals: args.maxSignals,
304
+ });
305
+ }
306
+ async function buildAllAppsSummary(args) {
307
+ const apps = args.app ? [{ id: args.app }] : await listAscApps();
308
+ const summaries = [];
309
+ const warnings = [];
310
+ for (const app of apps) {
311
+ try {
312
+ summaries.push(await buildSingleAppSummary(app.id, args));
313
+ }
314
+ catch (error) {
315
+ warnings.push({
316
+ appId: app.id,
317
+ appName: app.name || null,
318
+ error: error instanceof Error ? error.message : String(error),
319
+ publicStatusHint: String(error instanceof Error ? error.message : error)
320
+ .toLowerCase()
321
+ .includes('403')
322
+ ? 'app may not be public yet or ASC web analytics may not be available for this app'
323
+ : null,
324
+ });
325
+ }
326
+ }
327
+ if (summaries.length === 0) {
328
+ throw new Error(`ASC summary failed for every accessible app: ${JSON.stringify(warnings)}`);
329
+ }
330
+ if (summaries.length === 1) {
331
+ const summary = summaries[0];
332
+ if (warnings.length > 0) {
333
+ summary.meta = { ...(summary.meta || {}), warnings };
334
+ }
335
+ return summary;
336
+ }
337
+ const signals = summaries
338
+ .flatMap((summary) => (Array.isArray(summary.signals) ? summary.signals : []).map((signal) => ({
339
+ ...signal,
340
+ id: `${summary.meta?.appId || 'app'}_${signal.id}`,
341
+ evidence: [
342
+ `ASC app: ${summary.meta?.appId || 'unknown'}`,
343
+ ...(Array.isArray(signal.evidence) ? signal.evidence : []),
344
+ ],
345
+ })))
346
+ .sort((a, b) => {
347
+ const priorityRank = { high: 0, medium: 1, low: 2 };
348
+ return (priorityRank[a.priority] ?? 3) - (priorityRank[b.priority] ?? 3);
349
+ })
350
+ .slice(0, Math.max(1, Number(args.maxSignals) || 4));
351
+ return {
352
+ project: 'app-store-connect:all',
353
+ window: 'latest',
354
+ signals,
355
+ meta: {
356
+ generatedAt: new Date().toISOString(),
357
+ source: 'asc',
358
+ appScope: 'all',
359
+ appCount: apps.length,
360
+ summarizedAppCount: summaries.length,
361
+ appIds: summaries.map((summary) => summary.meta?.appId).filter(Boolean),
362
+ warnings,
363
+ },
364
+ };
365
+ }
366
+ async function main() {
367
+ await loadOpenClawGrowthSecrets();
368
+ const args = parseArgs(process.argv.slice(2));
369
+ const summary = await buildAllAppsSummary(args);
370
+ await writeJsonOutput(args.out, summary);
371
+ }
372
+ main().catch((error) => {
373
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
374
+ process.exitCode = 1;
375
+ });
376
+ //# sourceMappingURL=export-asc-summary.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-asc-summary.mjs","sourceRoot":"","sources":["../../src/runtime/export-asc-summary.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,176 @@
1
+ #!/usr/bin/env node
2
+ import process from 'node:process';
3
+ import { buildRevenueCatSummary, writeJsonOutput } from './openclaw-exporters-lib.mjs';
4
+ import { loadOpenClawGrowthSecrets } from './openclaw-growth-env.mjs';
5
+ const API_BASE = 'https://api.revenuecat.com/v2';
6
+ function printHelpAndExit(exitCode, reason = null) {
7
+ if (reason) {
8
+ process.stderr.write(`${reason}\n\n`);
9
+ }
10
+ process.stdout.write(`
11
+ Export RevenueCat Summary
12
+
13
+ Builds an OpenClaw-compatible RevenueCat summary JSON from the RevenueCat API v2.
14
+
15
+ Usage:
16
+ node scripts/export-revenuecat-summary.mjs [options]
17
+
18
+ Options:
19
+ --project <id> RevenueCat project ID (defaults to all visible projects, first summarized)
20
+ --currency <code> Currency for overview metrics (default: USD)
21
+ --limit <n> Maximum list entries to fetch per endpoint (default: 20)
22
+ --out <file> Write JSON to file instead of stdout
23
+ --max-signals <n> Maximum signals to emit (default: 4)
24
+ --help, -h Show help
25
+ `);
26
+ process.exit(exitCode);
27
+ }
28
+ function parseArgs(argv) {
29
+ const args = {
30
+ project: '',
31
+ currency: 'USD',
32
+ limit: 20,
33
+ out: '',
34
+ maxSignals: 4,
35
+ };
36
+ for (let index = 0; index < argv.length; index += 1) {
37
+ const token = argv[index];
38
+ const next = argv[index + 1];
39
+ if (token === '--') {
40
+ continue;
41
+ }
42
+ else if (token === '--project') {
43
+ args.project = String(next || '').trim();
44
+ index += 1;
45
+ }
46
+ else if (token === '--currency') {
47
+ args.currency = String(next || 'USD').trim().toUpperCase() || 'USD';
48
+ index += 1;
49
+ }
50
+ else if (token === '--limit') {
51
+ const parsed = Number.parseInt(String(next || ''), 10);
52
+ if (!Number.isFinite(parsed) || parsed <= 0) {
53
+ printHelpAndExit(1, `Invalid value for --limit: ${String(next || '')}`);
54
+ }
55
+ args.limit = parsed;
56
+ index += 1;
57
+ }
58
+ else if (token === '--out') {
59
+ args.out = String(next || '').trim();
60
+ index += 1;
61
+ }
62
+ else if (token === '--max-signals') {
63
+ const parsed = Number.parseInt(String(next || ''), 10);
64
+ if (!Number.isFinite(parsed) || parsed <= 0) {
65
+ printHelpAndExit(1, `Invalid value for --max-signals: ${String(next || '')}`);
66
+ }
67
+ args.maxSignals = parsed;
68
+ index += 1;
69
+ }
70
+ else if (token === '--help' || token === '-h') {
71
+ printHelpAndExit(0);
72
+ }
73
+ else {
74
+ printHelpAndExit(1, `Unknown argument: ${token}`);
75
+ }
76
+ }
77
+ return args;
78
+ }
79
+ function buildUrl(pathname, params = {}) {
80
+ const url = new URL(`${API_BASE}${pathname}`);
81
+ for (const [key, value] of Object.entries(params)) {
82
+ if (value === undefined || value === null || value === '')
83
+ continue;
84
+ url.searchParams.set(key, String(value));
85
+ }
86
+ return url.toString();
87
+ }
88
+ async function fetchRevenueCatJson(pathname, params = {}) {
89
+ const token = String(process.env.REVENUECAT_API_KEY || '').trim();
90
+ if (!token) {
91
+ throw new Error('Missing REVENUECAT_API_KEY. Rerun the connector wizard and paste a RevenueCat API v2 secret key.');
92
+ }
93
+ const response = await fetch(buildUrl(pathname, params), {
94
+ method: 'GET',
95
+ headers: {
96
+ Accept: 'application/json',
97
+ Authorization: `Bearer ${token}`,
98
+ 'User-Agent': 'openclaw-growth-revenuecat-exporter',
99
+ },
100
+ });
101
+ const body = await response.text();
102
+ if (!response.ok) {
103
+ throw new Error(`RevenueCat ${pathname} failed with HTTP ${response.status}: ${body.slice(0, 500)}`);
104
+ }
105
+ return body.trim() ? JSON.parse(body) : {};
106
+ }
107
+ function listItems(payload) {
108
+ if (Array.isArray(payload))
109
+ return payload;
110
+ if (Array.isArray(payload?.items))
111
+ return payload.items;
112
+ if (Array.isArray(payload?.data))
113
+ return payload.data;
114
+ return [];
115
+ }
116
+ function projectId(project) {
117
+ return String(project?.id || project?.project_id || '').trim();
118
+ }
119
+ async function fetchOptional(projectIdValue, label, pathname, params, warnings) {
120
+ try {
121
+ return await fetchRevenueCatJson(pathname, params);
122
+ }
123
+ catch (error) {
124
+ warnings.push(`${label} for ${projectIdValue}: ${error instanceof Error ? error.message : String(error)}`);
125
+ return null;
126
+ }
127
+ }
128
+ async function buildSingleProjectSummary(project, args) {
129
+ const id = projectId(project);
130
+ if (!id) {
131
+ throw new Error('RevenueCat project response did not contain a project id.');
132
+ }
133
+ const warnings = [];
134
+ const limit = Math.max(1, Math.min(Number(args.limit) || 20, 100));
135
+ const [overviewPayload, appsPayload, productsPayload, offeringsPayload, entitlementsPayload] = await Promise.all([
136
+ fetchOptional(id, 'overview metrics', `/projects/${encodeURIComponent(id)}/metrics/overview`, { currency: args.currency }, warnings),
137
+ fetchOptional(id, 'apps', `/projects/${encodeURIComponent(id)}/apps`, { limit }, warnings),
138
+ fetchOptional(id, 'products', `/projects/${encodeURIComponent(id)}/products`, { limit }, warnings),
139
+ fetchOptional(id, 'offerings', `/projects/${encodeURIComponent(id)}/offerings`, { limit }, warnings),
140
+ fetchOptional(id, 'entitlements', `/projects/${encodeURIComponent(id)}/entitlements`, { limit }, warnings),
141
+ ]);
142
+ return buildRevenueCatSummary({
143
+ project,
144
+ projectId: id,
145
+ overviewPayload,
146
+ appsPayload,
147
+ productsPayload,
148
+ offeringsPayload,
149
+ entitlementsPayload,
150
+ warnings,
151
+ maxSignals: args.maxSignals,
152
+ });
153
+ }
154
+ async function main() {
155
+ await loadOpenClawGrowthSecrets();
156
+ const args = parseArgs(process.argv.slice(2));
157
+ const projectsPayload = await fetchRevenueCatJson('/projects', { limit: Math.max(1, Math.min(Number(args.limit) || 20, 100)) });
158
+ const projects = listItems(projectsPayload);
159
+ if (projects.length === 0) {
160
+ throw new Error('RevenueCat API returned no visible projects for this key.');
161
+ }
162
+ const selectedProject = args.project
163
+ ? projects.find((project) => projectId(project) === args.project) || { id: args.project }
164
+ : projects[0];
165
+ const summary = await buildSingleProjectSummary(selectedProject, args);
166
+ if (!args.project && projects.length > 1) {
167
+ summary.meta.availableProjectCount = projects.length;
168
+ summary.meta.availableProjectIds = projects.map(projectId).filter(Boolean);
169
+ }
170
+ await writeJsonOutput(args.out, summary);
171
+ }
172
+ main().catch((error) => {
173
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
174
+ process.exitCode = 1;
175
+ });
176
+ //# sourceMappingURL=export-revenuecat-summary.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-revenuecat-summary.mjs","sourceRoot":"","sources":["../../src/runtime/export-revenuecat-summary.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};