@analyticscli/growth-engineer 0.1.0 → 0.1.1-preview.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +52 -3
- package/dist/index.js.map +1 -1
- package/dist/runtime/discord-openclaw-bridge.mjs +309 -0
- package/dist/runtime/export-paddle-summary.mjs +73 -19
- package/dist/runtime/export-paddle-summary.mjs.map +1 -1
- package/dist/runtime/openclaw-exporters-lib.d.mts +17 -0
- package/dist/runtime/openclaw-exporters-lib.mjs +65 -1
- package/dist/runtime/openclaw-exporters-lib.mjs.map +1 -1
- package/dist/runtime/openclaw-growth-preflight.mjs +48 -15
- package/dist/runtime/openclaw-growth-preflight.mjs.map +1 -1
- package/dist/runtime/openclaw-growth-runner.mjs +617 -28
- package/dist/runtime/openclaw-growth-runner.mjs.map +1 -1
- package/dist/runtime/openclaw-growth-shared.mjs +3 -0
- package/dist/runtime/openclaw-growth-shared.mjs.map +1 -1
- package/dist/runtime/openclaw-growth-start.mjs +115 -92
- package/dist/runtime/openclaw-growth-start.mjs.map +1 -1
- package/dist/runtime/openclaw-growth-status.mjs +56 -36
- package/dist/runtime/openclaw-growth-status.mjs.map +1 -1
- package/dist/runtime/openclaw-growth-wizard.mjs +421 -64
- package/dist/runtime/openclaw-growth-wizard.mjs.map +1 -1
- package/package.json +3 -2
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { promises as fs } from 'node:fs';
|
|
2
3
|
import process from 'node:process';
|
|
3
4
|
import { buildPaddleSummary, writeJsonOutput } from './openclaw-exporters-lib.mjs';
|
|
4
5
|
import { loadOpenClawGrowthSecrets } from './openclaw-growth-env.mjs';
|
|
@@ -19,12 +20,13 @@ Options:
|
|
|
19
20
|
--from <date> Start date YYYY-MM-DD (default: 30 days before --to)
|
|
20
21
|
--to <date> End date YYYY-MM-DD, exclusive in Paddle metrics (default: today UTC)
|
|
21
22
|
--last <duration> Relative window like 30d (used when --from is omitted)
|
|
23
|
+
--config <file> Growth config path for sources.paddle.accounts[]
|
|
22
24
|
--out <file> Write JSON to file instead of stdout
|
|
23
25
|
--max-signals <n> Maximum signals to emit (default: 6)
|
|
24
26
|
--help, -h Show help
|
|
25
27
|
|
|
26
28
|
Environment:
|
|
27
|
-
PADDLE_API_KEY Paddle API key
|
|
29
|
+
PADDLE_API_KEY Paddle API key for the account metrics endpoints
|
|
28
30
|
`);
|
|
29
31
|
process.exit(exitCode);
|
|
30
32
|
}
|
|
@@ -50,6 +52,7 @@ function parseArgs(argv) {
|
|
|
50
52
|
from: '',
|
|
51
53
|
to: defaultTo,
|
|
52
54
|
last: '30d',
|
|
55
|
+
config: String(process.env.OPENCLAW_GROWTH_CONFIG_PATH || '').trim(),
|
|
53
56
|
out: '',
|
|
54
57
|
maxSignals: 6,
|
|
55
58
|
};
|
|
@@ -75,6 +78,10 @@ function parseArgs(argv) {
|
|
|
75
78
|
args.last = String(next || '').trim() || args.last;
|
|
76
79
|
index += 1;
|
|
77
80
|
}
|
|
81
|
+
else if (token === '--config') {
|
|
82
|
+
args.config = String(next || '').trim();
|
|
83
|
+
index += 1;
|
|
84
|
+
}
|
|
78
85
|
else if (token === '--out') {
|
|
79
86
|
args.out = String(next || '').trim();
|
|
80
87
|
index += 1;
|
|
@@ -111,10 +118,48 @@ function buildUrl(baseUrl, pathname, args) {
|
|
|
111
118
|
url.searchParams.set('to', args.to);
|
|
112
119
|
return url.toString();
|
|
113
120
|
}
|
|
114
|
-
async function
|
|
115
|
-
|
|
121
|
+
async function readJsonIfPresent(filePath) {
|
|
122
|
+
if (!filePath)
|
|
123
|
+
return null;
|
|
124
|
+
try {
|
|
125
|
+
return JSON.parse(await fs.readFile(filePath, 'utf8'));
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function normalizePaddleAccount(account, index, source, args) {
|
|
132
|
+
const id = String(account?.id || account?.key || account?.label || `paddle_${index + 1}`)
|
|
133
|
+
.trim()
|
|
134
|
+
.replace(/[^a-zA-Z0-9._-]+/g, '_');
|
|
135
|
+
return {
|
|
136
|
+
id,
|
|
137
|
+
label: String(account?.label || account?.name || account?.id || `Paddle ${index + 1}`).trim(),
|
|
138
|
+
tokenEnv: String(account?.tokenEnv || account?.token_env || account?.secretEnv || (index === 0 ? source?.tokenEnv || 'PADDLE_API_KEY' : `PADDLE_API_KEY_${index + 1}`)).trim(),
|
|
139
|
+
environment: String(account?.environment || source?.environment || args.environment || 'live').trim().toLowerCase() || 'live',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
async function resolvePaddleAccounts(args) {
|
|
143
|
+
const config = await readJsonIfPresent(args.config);
|
|
144
|
+
const source = config?.sources?.paddle || {};
|
|
145
|
+
const accounts = Array.isArray(source.accounts) ? source.accounts : [];
|
|
146
|
+
if (accounts.length > 0) {
|
|
147
|
+
return accounts.map((account, index) => normalizePaddleAccount(account, index, source, args));
|
|
148
|
+
}
|
|
149
|
+
const tokenEnv = String(source.tokenEnv || config?.secrets?.paddleTokenEnv || 'PADDLE_API_KEY').trim();
|
|
150
|
+
return [
|
|
151
|
+
{
|
|
152
|
+
id: 'paddle',
|
|
153
|
+
label: 'Paddle',
|
|
154
|
+
tokenEnv,
|
|
155
|
+
environment: String(source.environment || args.environment || 'live').trim().toLowerCase() || 'live',
|
|
156
|
+
},
|
|
157
|
+
];
|
|
158
|
+
}
|
|
159
|
+
async function fetchPaddleMetric(baseUrl, pathname, args, tokenEnv) {
|
|
160
|
+
const token = String(process.env[tokenEnv] || '').trim();
|
|
116
161
|
if (!token) {
|
|
117
|
-
throw new Error(
|
|
162
|
+
throw new Error(`Missing ${tokenEnv}. Rerun the connector wizard and paste a Paddle API key from Developer Tools > Authentication v2.`);
|
|
118
163
|
}
|
|
119
164
|
const response = await fetch(buildUrl(baseUrl, pathname, args), {
|
|
120
165
|
method: 'GET',
|
|
@@ -131,36 +176,45 @@ async function fetchPaddleMetric(baseUrl, pathname, args) {
|
|
|
131
176
|
}
|
|
132
177
|
return body.trim() ? JSON.parse(body) : {};
|
|
133
178
|
}
|
|
134
|
-
async function fetchOptionalMetric(baseUrl, pathname, key, args, warnings) {
|
|
179
|
+
async function fetchOptionalMetric(baseUrl, pathname, key, args, warnings, tokenEnv) {
|
|
135
180
|
try {
|
|
136
|
-
return [key, await fetchPaddleMetric(baseUrl, pathname, args)];
|
|
181
|
+
return [key, await fetchPaddleMetric(baseUrl, pathname, args, tokenEnv)];
|
|
137
182
|
}
|
|
138
183
|
catch (error) {
|
|
139
184
|
warnings.push(`${key}: ${error instanceof Error ? error.message : String(error)}`);
|
|
140
185
|
return [key, null];
|
|
141
186
|
}
|
|
142
187
|
}
|
|
143
|
-
async function
|
|
144
|
-
|
|
145
|
-
const
|
|
146
|
-
const baseUrl = paddleBaseUrl(args.environment);
|
|
188
|
+
async function fetchAccountSummary(args, account) {
|
|
189
|
+
const environment = ['live', 'sandbox'].includes(account.environment) ? account.environment : args.environment;
|
|
190
|
+
const baseUrl = paddleBaseUrl(environment);
|
|
147
191
|
const warnings = [];
|
|
148
192
|
const pairs = await Promise.all([
|
|
149
|
-
fetchOptionalMetric(baseUrl, '/metrics/revenue', 'revenue', args, warnings),
|
|
150
|
-
fetchOptionalMetric(baseUrl, '/metrics/monthly-recurring-revenue', 'monthlyRecurringRevenue', args, warnings),
|
|
151
|
-
fetchOptionalMetric(baseUrl, '/metrics/active-subscribers', 'activeSubscribers', args, warnings),
|
|
152
|
-
fetchOptionalMetric(baseUrl, '/metrics/refunds', 'refunds', args, warnings),
|
|
153
|
-
fetchOptionalMetric(baseUrl, '/metrics/chargebacks', 'chargebacks', args, warnings),
|
|
154
|
-
fetchOptionalMetric(baseUrl, '/metrics/checkout-conversion', 'checkoutConversion', args, warnings),
|
|
193
|
+
fetchOptionalMetric(baseUrl, '/metrics/revenue', 'revenue', args, warnings, account.tokenEnv),
|
|
194
|
+
fetchOptionalMetric(baseUrl, '/metrics/monthly-recurring-revenue', 'monthlyRecurringRevenue', args, warnings, account.tokenEnv),
|
|
195
|
+
fetchOptionalMetric(baseUrl, '/metrics/active-subscribers', 'activeSubscribers', args, warnings, account.tokenEnv),
|
|
196
|
+
fetchOptionalMetric(baseUrl, '/metrics/refunds', 'refunds', args, warnings, account.tokenEnv),
|
|
197
|
+
fetchOptionalMetric(baseUrl, '/metrics/chargebacks', 'chargebacks', args, warnings, account.tokenEnv),
|
|
198
|
+
fetchOptionalMetric(baseUrl, '/metrics/checkout-conversion', 'checkoutConversion', args, warnings, account.tokenEnv),
|
|
155
199
|
]);
|
|
156
200
|
const metrics = Object.fromEntries(pairs);
|
|
157
|
-
|
|
158
|
-
|
|
201
|
+
return {
|
|
202
|
+
...account,
|
|
203
|
+
environment,
|
|
159
204
|
window: `${args.from}_${args.to}`,
|
|
160
205
|
metrics,
|
|
161
206
|
warnings,
|
|
162
207
|
maxSignals: args.maxSignals,
|
|
163
|
-
}
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
async function main() {
|
|
211
|
+
await loadOpenClawGrowthSecrets();
|
|
212
|
+
const args = parseArgs(process.argv.slice(2));
|
|
213
|
+
const accounts = await resolvePaddleAccounts(args);
|
|
214
|
+
const accountSummaries = await Promise.all(accounts.map((account) => fetchAccountSummary(args, account)));
|
|
215
|
+
const summary = accountSummaries.length > 1
|
|
216
|
+
? buildPaddleSummary({ accounts: accountSummaries, window: `${args.from}_${args.to}`, maxSignals: args.maxSignals })
|
|
217
|
+
: buildPaddleSummary(accountSummaries[0]);
|
|
164
218
|
await writeJsonOutput(args.out, summary);
|
|
165
219
|
}
|
|
166
220
|
main().catch((error) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-paddle-summary.mjs","sourceRoot":"","sources":["../../src/runtime/export-paddle-summary.mts"],"names":[],"mappings":";AAEA,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,SAAS,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAC/C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC
|
|
1
|
+
{"version":3,"file":"export-paddle-summary.mjs","sourceRoot":"","sources":["../../src/runtime/export-paddle-summary.mts"],"names":[],"mappings":"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"}
|
|
@@ -74,6 +74,21 @@ export declare function buildRevenueCatSummary(input: any): {
|
|
|
74
74
|
};
|
|
75
75
|
};
|
|
76
76
|
export declare function buildPaddleSummary(input: any): {
|
|
77
|
+
project: string;
|
|
78
|
+
window: string;
|
|
79
|
+
metrics: {
|
|
80
|
+
accounts: any;
|
|
81
|
+
};
|
|
82
|
+
signals: any;
|
|
83
|
+
meta: {
|
|
84
|
+
generatedAt: string;
|
|
85
|
+
source: string;
|
|
86
|
+
multiAccount: boolean;
|
|
87
|
+
accountCount: any;
|
|
88
|
+
accounts: any;
|
|
89
|
+
warnings: any;
|
|
90
|
+
};
|
|
91
|
+
} | {
|
|
77
92
|
project: string;
|
|
78
93
|
window: string;
|
|
79
94
|
metrics: any;
|
|
@@ -82,6 +97,8 @@ export declare function buildPaddleSummary(input: any): {
|
|
|
82
97
|
generatedAt: string;
|
|
83
98
|
source: string;
|
|
84
99
|
environment: any;
|
|
100
|
+
accountId: any;
|
|
101
|
+
accountLabel: any;
|
|
85
102
|
currencyCode: string;
|
|
86
103
|
updatedAt: string;
|
|
87
104
|
warnings: any;
|
|
@@ -1223,6 +1223,9 @@ function formatMinorCurrency(amount, currencyCode) {
|
|
|
1223
1223
|
}
|
|
1224
1224
|
}
|
|
1225
1225
|
export function buildPaddleSummary(input) {
|
|
1226
|
+
if (Array.isArray(input?.accounts)) {
|
|
1227
|
+
return buildCombinedPaddleSummary(input);
|
|
1228
|
+
}
|
|
1226
1229
|
const revenue = input?.metrics?.revenue || null;
|
|
1227
1230
|
const mrr = input?.metrics?.monthlyRecurringRevenue || null;
|
|
1228
1231
|
const activeSubscribers = input?.metrics?.activeSubscribers || null;
|
|
@@ -1379,7 +1382,7 @@ export function buildPaddleSummary(input) {
|
|
|
1379
1382
|
current_value: warnings.length,
|
|
1380
1383
|
evidence: warnings.slice(0, 8),
|
|
1381
1384
|
suggested_actions: [
|
|
1382
|
-
'Verify the Paddle API key
|
|
1385
|
+
'Verify the Paddle API key is valid for the live account metrics endpoints',
|
|
1383
1386
|
'Keep sandbox and live keys separate; Paddle metrics endpoints are intended for live account reporting',
|
|
1384
1387
|
],
|
|
1385
1388
|
keywords: ['paddle', 'api', 'metrics', 'permissions'],
|
|
@@ -1395,6 +1398,8 @@ export function buildPaddleSummary(input) {
|
|
|
1395
1398
|
generatedAt: new Date().toISOString(),
|
|
1396
1399
|
source: 'paddle',
|
|
1397
1400
|
environment: input?.environment || 'live',
|
|
1401
|
+
accountId: input?.id || input?.accountId || null,
|
|
1402
|
+
accountLabel: input?.label || null,
|
|
1398
1403
|
currencyCode: currency || null,
|
|
1399
1404
|
updatedAt: [
|
|
1400
1405
|
metricUpdatedAt(revenue),
|
|
@@ -1408,6 +1413,65 @@ export function buildPaddleSummary(input) {
|
|
|
1408
1413
|
},
|
|
1409
1414
|
};
|
|
1410
1415
|
}
|
|
1416
|
+
function buildCombinedPaddleSummary(input) {
|
|
1417
|
+
const accounts = Array.isArray(input?.accounts) ? input.accounts : [];
|
|
1418
|
+
const maxSignals = Math.max(1, Number(input?.maxSignals) || 6);
|
|
1419
|
+
const summaries = accounts
|
|
1420
|
+
.filter((account) => account && typeof account === 'object')
|
|
1421
|
+
.map((account, index) => {
|
|
1422
|
+
const accountId = String(account.id || account.key || account.label || `paddle_${index + 1}`).trim();
|
|
1423
|
+
const label = String(account.label || accountId).trim();
|
|
1424
|
+
const summary = buildPaddleSummary({
|
|
1425
|
+
...account,
|
|
1426
|
+
accounts: undefined,
|
|
1427
|
+
maxSignals: account.maxSignals || maxSignals,
|
|
1428
|
+
});
|
|
1429
|
+
return { accountId, label, summary };
|
|
1430
|
+
});
|
|
1431
|
+
const signals = summaries
|
|
1432
|
+
.flatMap(({ accountId, label, summary }) => (Array.isArray(summary.signals) ? summary.signals : []).map((signal) => ({
|
|
1433
|
+
...signal,
|
|
1434
|
+
id: `${accountId}:${signal.id}`,
|
|
1435
|
+
sourceProject: summary.project,
|
|
1436
|
+
evidence: [`Paddle account: ${label}`, ...(signal.evidence || [])],
|
|
1437
|
+
keywords: [accountId, ...(signal.keywords || [])],
|
|
1438
|
+
})))
|
|
1439
|
+
.sort((a, b) => {
|
|
1440
|
+
const priorityDelta = priorityRank(b.priority) - priorityRank(a.priority);
|
|
1441
|
+
if (priorityDelta !== 0)
|
|
1442
|
+
return priorityDelta;
|
|
1443
|
+
return (Number(b.current_value) || 0) - (Number(a.current_value) || 0);
|
|
1444
|
+
})
|
|
1445
|
+
.slice(0, maxSignals);
|
|
1446
|
+
const warnings = summaries.flatMap(({ label, summary }) => (Array.isArray(summary.meta?.warnings) ? summary.meta.warnings : []).map((warning) => `${label}: ${warning}`));
|
|
1447
|
+
return {
|
|
1448
|
+
project: 'paddle:multiple',
|
|
1449
|
+
window: String(input?.window || summaries[0]?.summary?.window || 'last_30d'),
|
|
1450
|
+
metrics: {
|
|
1451
|
+
accounts: summaries.map(({ accountId, label, summary }) => ({
|
|
1452
|
+
id: accountId,
|
|
1453
|
+
label,
|
|
1454
|
+
environment: summary.meta?.environment || null,
|
|
1455
|
+
metrics: summary.metrics || {},
|
|
1456
|
+
})),
|
|
1457
|
+
},
|
|
1458
|
+
signals,
|
|
1459
|
+
meta: {
|
|
1460
|
+
generatedAt: new Date().toISOString(),
|
|
1461
|
+
source: 'paddle',
|
|
1462
|
+
multiAccount: true,
|
|
1463
|
+
accountCount: summaries.length,
|
|
1464
|
+
accounts: summaries.map(({ accountId, label, summary }) => ({
|
|
1465
|
+
id: accountId,
|
|
1466
|
+
label,
|
|
1467
|
+
environment: summary.meta?.environment || null,
|
|
1468
|
+
currencyCode: summary.meta?.currencyCode || null,
|
|
1469
|
+
updatedAt: summary.meta?.updatedAt || null,
|
|
1470
|
+
})),
|
|
1471
|
+
warnings,
|
|
1472
|
+
},
|
|
1473
|
+
};
|
|
1474
|
+
}
|
|
1411
1475
|
function seoNumber(value) {
|
|
1412
1476
|
const numeric = coerceNumber(value);
|
|
1413
1477
|
return numeric === null ? 0 : numeric;
|