rc-pulse 1.1.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/README.md +187 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +133 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +16 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +38 -0
- package/dist/client.js.map +1 -0
- package/dist/dashboard.d.ts +3 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +416 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/metrics.d.ts +4 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +116 -0
- package/dist/metrics.js.map +1 -0
- package/dist/report.d.ts +6 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +197 -0
- package/dist/report.js.map +1 -0
- package/dist/test.d.ts +11 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +251 -0
- package/dist/test.js.map +1 -0
- package/dist/types.d.ts +94 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +51 -0
package/dist/report.js
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
function fmt(n, unit = "#") {
|
|
2
|
+
if (unit === "$") {
|
|
3
|
+
if (n >= 1000)
|
|
4
|
+
return `$${(n / 1000).toFixed(1)}k`;
|
|
5
|
+
return `$${n.toFixed(0)}`;
|
|
6
|
+
}
|
|
7
|
+
if (unit === "%")
|
|
8
|
+
return `${n.toFixed(1)}%`;
|
|
9
|
+
if (n >= 1000000)
|
|
10
|
+
return `${(n / 1000000).toFixed(1)}M`;
|
|
11
|
+
if (n >= 1000)
|
|
12
|
+
return `${(n / 1000).toFixed(1)}k`;
|
|
13
|
+
return n.toFixed(0);
|
|
14
|
+
}
|
|
15
|
+
function trendIcon(trend) {
|
|
16
|
+
if (trend > 3)
|
|
17
|
+
return "↑";
|
|
18
|
+
if (trend < -3)
|
|
19
|
+
return "↓";
|
|
20
|
+
return "→";
|
|
21
|
+
}
|
|
22
|
+
function trendLabel(trend, inverse = false) {
|
|
23
|
+
const isGood = inverse ? trend < 0 : trend > 0;
|
|
24
|
+
const isBad = inverse ? trend > 0 : trend < 0;
|
|
25
|
+
if (isGood)
|
|
26
|
+
return `+${trend.toFixed(1)}% MoM`;
|
|
27
|
+
if (isBad)
|
|
28
|
+
return `${trend.toFixed(1)}% MoM`;
|
|
29
|
+
return "flat MoM";
|
|
30
|
+
}
|
|
31
|
+
export function calcHealthScore(metrics) {
|
|
32
|
+
const signals = [];
|
|
33
|
+
let score = 50; // neutral start
|
|
34
|
+
// MRR trend
|
|
35
|
+
if (metrics.mrr.trend > 5) {
|
|
36
|
+
score += 15;
|
|
37
|
+
signals.push({ label: "MRR Growth", status: "good", detail: `+${metrics.mrr.trend.toFixed(1)}% MoM` });
|
|
38
|
+
}
|
|
39
|
+
else if (metrics.mrr.trend >= 0) {
|
|
40
|
+
score += 5;
|
|
41
|
+
signals.push({ label: "MRR Growth", status: "warning", detail: `+${metrics.mrr.trend.toFixed(1)}% MoM (flat)` });
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
score -= 15;
|
|
45
|
+
signals.push({ label: "MRR Decline", status: "bad", detail: `${metrics.mrr.trend.toFixed(1)}% MoM` });
|
|
46
|
+
}
|
|
47
|
+
// Churn vs average
|
|
48
|
+
const churnDelta = metrics.churn.current - metrics.churn.average;
|
|
49
|
+
if (churnDelta < -1) {
|
|
50
|
+
score += 15;
|
|
51
|
+
signals.push({ label: "Churn", status: "good", detail: `${metrics.churn.current.toFixed(1)}% (below avg ${metrics.churn.average.toFixed(1)}%)` });
|
|
52
|
+
}
|
|
53
|
+
else if (churnDelta <= 1) {
|
|
54
|
+
score += 5;
|
|
55
|
+
signals.push({ label: "Churn", status: "warning", detail: `${metrics.churn.current.toFixed(1)}% (near avg ${metrics.churn.average.toFixed(1)}%)` });
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
score -= 15;
|
|
59
|
+
signals.push({ label: "Churn Spike", status: "bad", detail: `${metrics.churn.current.toFixed(1)}% (above avg ${metrics.churn.average.toFixed(1)}%)` });
|
|
60
|
+
}
|
|
61
|
+
// Revenue trend
|
|
62
|
+
if (metrics.revenue.trend > 3) {
|
|
63
|
+
score += 10;
|
|
64
|
+
signals.push({ label: "Revenue", status: "good", detail: `+${metrics.revenue.trend.toFixed(1)}% MoM` });
|
|
65
|
+
}
|
|
66
|
+
else if (metrics.revenue.trend < -5) {
|
|
67
|
+
score -= 10;
|
|
68
|
+
signals.push({ label: "Revenue", status: "bad", detail: `${metrics.revenue.trend.toFixed(1)}% MoM` });
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
score += 3;
|
|
72
|
+
signals.push({ label: "Revenue", status: "warning", detail: `${metrics.revenue.trend.toFixed(1)}% MoM` });
|
|
73
|
+
}
|
|
74
|
+
// Trial conversion
|
|
75
|
+
if (metrics.trialConversion) {
|
|
76
|
+
if (metrics.trialConversion.trend > 5) {
|
|
77
|
+
score += 10;
|
|
78
|
+
signals.push({ label: "Trial Conversion", status: "good", detail: `${metrics.trialConversion.current.toFixed(1)}% (+${metrics.trialConversion.trend.toFixed(1)}% MoM)` });
|
|
79
|
+
}
|
|
80
|
+
else if (metrics.trialConversion.trend < -5) {
|
|
81
|
+
score -= 10;
|
|
82
|
+
signals.push({ label: "Trial Conversion", status: "bad", detail: `${metrics.trialConversion.current.toFixed(1)}% (${metrics.trialConversion.trend.toFixed(1)}% MoM)` });
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
signals.push({ label: "Trial Conversion", status: "warning", detail: `${metrics.trialConversion.current.toFixed(1)}% (stable)` });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
score = Math.max(0, Math.min(100, score));
|
|
89
|
+
let grade;
|
|
90
|
+
let label;
|
|
91
|
+
if (score >= 80) {
|
|
92
|
+
grade = "A";
|
|
93
|
+
label = "Healthy";
|
|
94
|
+
}
|
|
95
|
+
else if (score >= 65) {
|
|
96
|
+
grade = "B";
|
|
97
|
+
label = "Good";
|
|
98
|
+
}
|
|
99
|
+
else if (score >= 50) {
|
|
100
|
+
grade = "C";
|
|
101
|
+
label = "Needs attention";
|
|
102
|
+
}
|
|
103
|
+
else if (score >= 35) {
|
|
104
|
+
grade = "D";
|
|
105
|
+
label = "At risk";
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
grade = "F";
|
|
109
|
+
label = "Warning";
|
|
110
|
+
}
|
|
111
|
+
return { score, grade, label, signals };
|
|
112
|
+
}
|
|
113
|
+
export function formatTerminal(metrics, projectName) {
|
|
114
|
+
const health = calcHealthScore(metrics);
|
|
115
|
+
const { overview, mrr, churn, revenue, trialConversion } = metrics;
|
|
116
|
+
const gradeEmoji = { A: "💚", B: "🟡", C: "🟠", D: "🔴", F: "🔴" }[health.grade];
|
|
117
|
+
const lines = [];
|
|
118
|
+
lines.push("");
|
|
119
|
+
lines.push("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
120
|
+
lines.push(` rc-pulse${projectName ? ` · ${projectName}` : ""} ${new Date().toISOString().slice(0, 10)}`);
|
|
121
|
+
lines.push("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
122
|
+
lines.push("");
|
|
123
|
+
lines.push(` Health Score: ${health.score}/100 ${gradeEmoji} ${health.label}`);
|
|
124
|
+
lines.push("");
|
|
125
|
+
lines.push(" OVERVIEW");
|
|
126
|
+
lines.push(` Active Subscribers ${fmt(overview.activeSubscriptions)}`);
|
|
127
|
+
lines.push(` Active Trials ${fmt(overview.activeTrials)}`);
|
|
128
|
+
lines.push(` Active Users (28d) ${fmt(overview.activeUsers)}`);
|
|
129
|
+
lines.push(` New Customers (28d) ${fmt(overview.newCustomers)}`);
|
|
130
|
+
lines.push("");
|
|
131
|
+
lines.push(" KEY METRICS");
|
|
132
|
+
lines.push(` MRR ${fmt(mrr.current, "$")} ${trendIcon(mrr.trend)} ${trendLabel(mrr.trend)}`);
|
|
133
|
+
lines.push(` Revenue/mo ${fmt(revenue.current, "$")} ${trendIcon(revenue.trend)} ${trendLabel(revenue.trend)}`);
|
|
134
|
+
lines.push(` Churn Rate ${fmt(churn.current, "%")} (avg: ${fmt(churn.average, "%")})`);
|
|
135
|
+
if (trialConversion) {
|
|
136
|
+
lines.push(` Trial Conv. ${fmt(trialConversion.current, "%")} ${trendIcon(trialConversion.trend)} ${trendLabel(trialConversion.trend)}`);
|
|
137
|
+
}
|
|
138
|
+
lines.push("");
|
|
139
|
+
lines.push(" SIGNALS");
|
|
140
|
+
for (const signal of health.signals) {
|
|
141
|
+
const icon = { good: "✓", warning: "~", bad: "✗" }[signal.status];
|
|
142
|
+
lines.push(` ${icon} ${signal.label.padEnd(18)} ${signal.detail}`);
|
|
143
|
+
}
|
|
144
|
+
lines.push("");
|
|
145
|
+
lines.push("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
146
|
+
lines.push("");
|
|
147
|
+
return lines.join("\n");
|
|
148
|
+
}
|
|
149
|
+
export function formatMarkdown(metrics, projectName) {
|
|
150
|
+
const health = calcHealthScore(metrics);
|
|
151
|
+
const { overview, mrr, churn, revenue, trialConversion } = metrics;
|
|
152
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
153
|
+
const gradeEmoji = { A: "💚", B: "🟡", C: "🟠", D: "🔴", F: "🔴" }[health.grade];
|
|
154
|
+
const lines = [];
|
|
155
|
+
lines.push(`# rc-pulse Report${projectName ? ` — ${projectName}` : ""}`);
|
|
156
|
+
lines.push(`*Generated: ${date}*`);
|
|
157
|
+
lines.push("");
|
|
158
|
+
lines.push(`## Health Score: ${health.score}/100 ${gradeEmoji} ${health.label}`);
|
|
159
|
+
lines.push("");
|
|
160
|
+
lines.push("## Overview");
|
|
161
|
+
lines.push("| Metric | Value |");
|
|
162
|
+
lines.push("|--------|-------|");
|
|
163
|
+
lines.push(`| Active Subscribers | ${fmt(overview.activeSubscriptions)} |`);
|
|
164
|
+
lines.push(`| Active Trials | ${fmt(overview.activeTrials)} |`);
|
|
165
|
+
lines.push(`| Active Users (28d) | ${fmt(overview.activeUsers)} |`);
|
|
166
|
+
lines.push(`| New Customers (28d) | ${fmt(overview.newCustomers)} |`);
|
|
167
|
+
lines.push("");
|
|
168
|
+
lines.push("## Key Metrics");
|
|
169
|
+
lines.push("| Metric | Current | MoM Trend |");
|
|
170
|
+
lines.push("|--------|---------|-----------|");
|
|
171
|
+
lines.push(`| MRR | ${fmt(mrr.current, "$")} | ${trendLabel(mrr.trend)} |`);
|
|
172
|
+
lines.push(`| Revenue | ${fmt(revenue.current, "$")} | ${trendLabel(revenue.trend)} |`);
|
|
173
|
+
lines.push(`| Churn Rate | ${fmt(churn.current, "%")} | avg: ${fmt(churn.average, "%")} |`);
|
|
174
|
+
if (trialConversion) {
|
|
175
|
+
lines.push(`| Trial Conversion | ${fmt(trialConversion.current, "%")} | ${trendLabel(trialConversion.trend)} |`);
|
|
176
|
+
}
|
|
177
|
+
lines.push("");
|
|
178
|
+
lines.push("## Signals");
|
|
179
|
+
for (const signal of health.signals) {
|
|
180
|
+
const icon = { good: "✅", warning: "⚠️", bad: "❌" }[signal.status];
|
|
181
|
+
lines.push(`- ${icon} **${signal.label}**: ${signal.detail}`);
|
|
182
|
+
}
|
|
183
|
+
lines.push("");
|
|
184
|
+
lines.push("---");
|
|
185
|
+
lines.push("*Generated by [rc-pulse](https://github.com/dimitriharding/rc-pulse) — RevenueCat Charts API health monitor.*");
|
|
186
|
+
return lines.join("\n");
|
|
187
|
+
}
|
|
188
|
+
export function formatJson(metrics, projectName) {
|
|
189
|
+
const health = calcHealthScore(metrics);
|
|
190
|
+
return JSON.stringify({
|
|
191
|
+
generated_at: new Date().toISOString(),
|
|
192
|
+
project: projectName ?? null,
|
|
193
|
+
health,
|
|
194
|
+
metrics,
|
|
195
|
+
}, null, 2);
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
package/dist/test.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rc-pulse test suite
|
|
3
|
+
* Run: bun test OR npx tsx src/test.ts
|
|
4
|
+
*
|
|
5
|
+
* Three layers:
|
|
6
|
+
* 1. Unit tests — pure functions (no network)
|
|
7
|
+
* 2. Integration test — real RC API, Dark Noise demo project
|
|
8
|
+
* 3. CLI smoke test — spawn the built CLI, check exit code + stdout
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
package/dist/test.js
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rc-pulse test suite
|
|
3
|
+
* Run: bun test OR npx tsx src/test.ts
|
|
4
|
+
*
|
|
5
|
+
* Three layers:
|
|
6
|
+
* 1. Unit tests — pure functions (no network)
|
|
7
|
+
* 2. Integration test — real RC API, Dark Noise demo project
|
|
8
|
+
* 3. CLI smoke test — spawn the built CLI, check exit code + stdout
|
|
9
|
+
*/
|
|
10
|
+
import { strict as assert } from "node:assert";
|
|
11
|
+
import { spawnSync } from "node:child_process";
|
|
12
|
+
import { calcHealthScore, formatTerminal, formatMarkdown, formatJson } from "./report.js";
|
|
13
|
+
// ─── helpers ──────────────────────────────────────────────────────────────────
|
|
14
|
+
let passed = 0;
|
|
15
|
+
let failed = 0;
|
|
16
|
+
function test(name, fn) {
|
|
17
|
+
Promise.resolve(fn())
|
|
18
|
+
.then(() => {
|
|
19
|
+
console.log(` ✓ ${name}`);
|
|
20
|
+
passed++;
|
|
21
|
+
})
|
|
22
|
+
.catch((err) => {
|
|
23
|
+
console.error(` ✗ ${name}`);
|
|
24
|
+
console.error(` ${err instanceof Error ? err.message : String(err)}`);
|
|
25
|
+
failed++;
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async function testAsync(name, fn) {
|
|
29
|
+
try {
|
|
30
|
+
await fn();
|
|
31
|
+
console.log(` ✓ ${name}`);
|
|
32
|
+
passed++;
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
console.error(` ✗ ${name}`);
|
|
36
|
+
console.error(` ${err instanceof Error ? err.message : String(err)}`);
|
|
37
|
+
failed++;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// ─── fixtures ─────────────────────────────────────────────────────────────────
|
|
41
|
+
const healthyMetrics = {
|
|
42
|
+
mrr: { current: 10000, previous: 9000, trend: 11.1, history: [] },
|
|
43
|
+
churn: { current: 2.0, average: 4.5, trend: -5.0 },
|
|
44
|
+
revenue: { current: 12000, previous: 10000, trend: 20.0, total: 100000 },
|
|
45
|
+
trialConversion: { current: 45.0, previous: 40.0, trend: 12.5 },
|
|
46
|
+
overview: { activeSubscriptions: 500, activeTrials: 50, activeUsers: 2000, newCustomers: 100 },
|
|
47
|
+
};
|
|
48
|
+
const sickMetrics = {
|
|
49
|
+
mrr: { current: 8000, previous: 10000, trend: -20.0, history: [] },
|
|
50
|
+
churn: { current: 9.5, average: 4.5, trend: 25.0 },
|
|
51
|
+
revenue: { current: 5000, previous: 9000, trend: -44.4, total: 60000 },
|
|
52
|
+
trialConversion: null,
|
|
53
|
+
overview: { activeSubscriptions: 200, activeTrials: 10, activeUsers: 800, newCustomers: 20 },
|
|
54
|
+
};
|
|
55
|
+
const flatMetrics = {
|
|
56
|
+
mrr: { current: 5000, previous: 4980, trend: 0.4, history: [] },
|
|
57
|
+
churn: { current: 4.5, average: 4.5, trend: 0.0 },
|
|
58
|
+
revenue: { current: 5200, previous: 5100, trend: 2.0, total: 50000 },
|
|
59
|
+
trialConversion: null,
|
|
60
|
+
overview: { activeSubscriptions: 250, activeTrials: 0, activeUsers: 1000, newCustomers: 30 },
|
|
61
|
+
};
|
|
62
|
+
// ─── unit tests: calcHealthScore ──────────────────────────────────────────────
|
|
63
|
+
console.log("\n── Unit Tests: calcHealthScore ──");
|
|
64
|
+
test("healthy metrics → score >= 65 and grade A or B", () => {
|
|
65
|
+
const h = calcHealthScore(healthyMetrics);
|
|
66
|
+
assert.ok(h.score >= 65, `score ${h.score} should be >= 65`);
|
|
67
|
+
assert.ok(["A", "B"].includes(h.grade), `grade ${h.grade} should be A or B`);
|
|
68
|
+
});
|
|
69
|
+
test("sick metrics → score < 50 and grade D or F", () => {
|
|
70
|
+
const h = calcHealthScore(sickMetrics);
|
|
71
|
+
assert.ok(h.score < 50, `score ${h.score} should be < 50`);
|
|
72
|
+
assert.ok(["D", "F"].includes(h.grade), `grade ${h.grade} should be D or F`);
|
|
73
|
+
});
|
|
74
|
+
test("healthy metrics has good MRR growth signal", () => {
|
|
75
|
+
const h = calcHealthScore(healthyMetrics);
|
|
76
|
+
const mrrSignal = h.signals.find((s) => s.label === "MRR Growth");
|
|
77
|
+
assert.ok(mrrSignal, "MRR Growth signal should exist");
|
|
78
|
+
assert.equal(mrrSignal.status, "good");
|
|
79
|
+
});
|
|
80
|
+
test("sick metrics has bad churn spike signal", () => {
|
|
81
|
+
const h = calcHealthScore(sickMetrics);
|
|
82
|
+
const churnSignal = h.signals.find((s) => s.label === "Churn Spike");
|
|
83
|
+
assert.ok(churnSignal, "Churn Spike signal should exist for sick metrics");
|
|
84
|
+
assert.equal(churnSignal.status, "bad");
|
|
85
|
+
});
|
|
86
|
+
test("score is clamped 0–100", () => {
|
|
87
|
+
const extremeGood = {
|
|
88
|
+
...healthyMetrics,
|
|
89
|
+
mrr: { ...healthyMetrics.mrr, trend: 999 },
|
|
90
|
+
churn: { current: 0, average: 10, trend: -999 },
|
|
91
|
+
revenue: { ...healthyMetrics.revenue, trend: 999 },
|
|
92
|
+
};
|
|
93
|
+
const h = calcHealthScore(extremeGood);
|
|
94
|
+
assert.ok(h.score <= 100, "score should not exceed 100");
|
|
95
|
+
assert.ok(h.score >= 0, "score should not go below 0");
|
|
96
|
+
});
|
|
97
|
+
test("null trialConversion is handled gracefully", () => {
|
|
98
|
+
const h = calcHealthScore(flatMetrics);
|
|
99
|
+
const tcSignal = h.signals.find((s) => s.label === "Trial Conversion");
|
|
100
|
+
assert.equal(tcSignal, undefined, "no Trial Conversion signal when null");
|
|
101
|
+
});
|
|
102
|
+
test("signals array is non-empty for all fixture types", () => {
|
|
103
|
+
for (const m of [healthyMetrics, sickMetrics, flatMetrics]) {
|
|
104
|
+
const h = calcHealthScore(m);
|
|
105
|
+
assert.ok(h.signals.length > 0, "should always have at least one signal");
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
// ─── unit tests: formatters ───────────────────────────────────────────────────
|
|
109
|
+
console.log("\n── Unit Tests: formatters ──");
|
|
110
|
+
test("formatTerminal returns a string with health score line", () => {
|
|
111
|
+
const out = formatTerminal(healthyMetrics, "Test App");
|
|
112
|
+
assert.equal(typeof out, "string");
|
|
113
|
+
assert.ok(out.includes("Health Score:"), "should include Health Score label");
|
|
114
|
+
assert.ok(out.includes("Test App"), "should include project name");
|
|
115
|
+
assert.ok(out.includes("rc-pulse"), "should include rc-pulse branding");
|
|
116
|
+
});
|
|
117
|
+
test("formatMarkdown returns valid markdown with required sections", () => {
|
|
118
|
+
const out = formatMarkdown(healthyMetrics, "Test App");
|
|
119
|
+
assert.ok(out.startsWith("# rc-pulse Report"), "should start with h1 heading");
|
|
120
|
+
assert.ok(out.includes("## Health Score:"), "should include health score section");
|
|
121
|
+
assert.ok(out.includes("## Overview"), "should include overview section");
|
|
122
|
+
assert.ok(out.includes("## Key Metrics"), "should include key metrics section");
|
|
123
|
+
assert.ok(out.includes("## Signals"), "should include signals section");
|
|
124
|
+
});
|
|
125
|
+
test("formatJson returns valid JSON with expected top-level keys", () => {
|
|
126
|
+
const out = formatJson(healthyMetrics, "Test App");
|
|
127
|
+
const parsed = JSON.parse(out);
|
|
128
|
+
assert.ok(typeof parsed.generated_at === "string", "should have generated_at");
|
|
129
|
+
assert.ok(typeof parsed.health === "object", "should have health object");
|
|
130
|
+
assert.ok(typeof parsed.metrics === "object", "should have metrics object");
|
|
131
|
+
assert.equal(parsed.project, "Test App");
|
|
132
|
+
});
|
|
133
|
+
test("formatJson health.score matches calcHealthScore", () => {
|
|
134
|
+
const out = formatJson(healthyMetrics);
|
|
135
|
+
const parsed = JSON.parse(out);
|
|
136
|
+
const direct = calcHealthScore(healthyMetrics);
|
|
137
|
+
assert.equal(parsed.health.score, direct.score);
|
|
138
|
+
});
|
|
139
|
+
test("formatMarkdown includes MRR dollar value", () => {
|
|
140
|
+
const out = formatMarkdown(healthyMetrics);
|
|
141
|
+
// MRR is $10k
|
|
142
|
+
assert.ok(out.includes("$10.0k") || out.includes("$10,000"), "should format MRR as dollar amount");
|
|
143
|
+
});
|
|
144
|
+
test("formatTerminal includes MRR trend arrow", () => {
|
|
145
|
+
const out = formatTerminal(healthyMetrics);
|
|
146
|
+
// MRR trend is +11.1% → should show ↑
|
|
147
|
+
assert.ok(out.includes("↑"), "should include upward arrow for positive trend");
|
|
148
|
+
});
|
|
149
|
+
test("formatTerminal for sick metrics shows ↓ on MRR", () => {
|
|
150
|
+
const out = formatTerminal(sickMetrics);
|
|
151
|
+
assert.ok(out.includes("↓"), "should include downward arrow for negative MRR trend");
|
|
152
|
+
});
|
|
153
|
+
// ─── integration test: real RC API ───────────────────────────────────────────
|
|
154
|
+
console.log("\n── Integration Test: Dark Noise API ──");
|
|
155
|
+
const RC_API_KEY = process.env.RC_API_KEY || "sk_qdnvkjsVGhoVVNGiajqNHYIypcjgs";
|
|
156
|
+
const RC_PROJECT_ID = process.env.RC_PROJECT_ID || "proj058a6330";
|
|
157
|
+
await testAsync("fetchPulseMetrics returns valid PulseMetrics from Dark Noise", async () => {
|
|
158
|
+
const { RCChartsClient } = await import("./client.js");
|
|
159
|
+
const { fetchPulseMetrics } = await import("./metrics.js");
|
|
160
|
+
const client = new RCChartsClient(RC_API_KEY, RC_PROJECT_ID);
|
|
161
|
+
const metrics = await fetchPulseMetrics(client);
|
|
162
|
+
// Structural checks
|
|
163
|
+
assert.ok(typeof metrics.mrr.current === "number", "mrr.current should be a number");
|
|
164
|
+
assert.ok(typeof metrics.mrr.trend === "number", "mrr.trend should be a number");
|
|
165
|
+
assert.ok(typeof metrics.churn.current === "number", "churn.current should be a number");
|
|
166
|
+
assert.ok(typeof metrics.churn.average === "number", "churn.average should be a number");
|
|
167
|
+
assert.ok(typeof metrics.revenue.current === "number", "revenue.current should be a number");
|
|
168
|
+
assert.ok(typeof metrics.overview.activeSubscriptions === "number", "activeSubscriptions should be a number");
|
|
169
|
+
// Real data sanity: Dark Noise is a real app, MRR should be > 0
|
|
170
|
+
assert.ok(metrics.mrr.current > 0, `MRR should be > 0, got ${metrics.mrr.current}`);
|
|
171
|
+
});
|
|
172
|
+
await testAsync("calcHealthScore on live data returns a valid score", async () => {
|
|
173
|
+
const { RCChartsClient } = await import("./client.js");
|
|
174
|
+
const { fetchPulseMetrics } = await import("./metrics.js");
|
|
175
|
+
const client = new RCChartsClient(RC_API_KEY, RC_PROJECT_ID);
|
|
176
|
+
const metrics = await fetchPulseMetrics(client);
|
|
177
|
+
const health = calcHealthScore(metrics);
|
|
178
|
+
assert.ok(health.score >= 0 && health.score <= 100, `score ${health.score} should be in [0, 100]`);
|
|
179
|
+
assert.ok(["A", "B", "C", "D", "F"].includes(health.grade), `grade ${health.grade} should be A-F`);
|
|
180
|
+
assert.ok(health.signals.length > 0, "should have at least one signal");
|
|
181
|
+
console.log(` → Live health score: ${health.score}/100 (${health.grade} — ${health.label})`);
|
|
182
|
+
console.log(` → Live MRR: $${metrics.mrr.current.toFixed(2)}, churn: ${metrics.churn.current.toFixed(1)}%`);
|
|
183
|
+
});
|
|
184
|
+
await testAsync("getProjects returns a list including current project", async () => {
|
|
185
|
+
const { RCChartsClient } = await import("./client.js");
|
|
186
|
+
const client = new RCChartsClient(RC_API_KEY, RC_PROJECT_ID);
|
|
187
|
+
const result = await client.getProjects();
|
|
188
|
+
assert.ok(Array.isArray(result.items), "items should be an array");
|
|
189
|
+
assert.ok(result.items.length > 0, "should have at least one project");
|
|
190
|
+
const ids = result.items.map((p) => p.id);
|
|
191
|
+
assert.ok(ids.includes(RC_PROJECT_ID), `project list should include ${RC_PROJECT_ID}`);
|
|
192
|
+
});
|
|
193
|
+
// ─── CLI smoke test ───────────────────────────────────────────────────────────
|
|
194
|
+
console.log("\n── CLI Smoke Test ──");
|
|
195
|
+
await testAsync("CLI builds without TypeScript errors", async () => {
|
|
196
|
+
const result = spawnSync("npx", ["tsc", "--noEmit"], {
|
|
197
|
+
cwd: "/tmp/rc-pulse",
|
|
198
|
+
encoding: "utf-8",
|
|
199
|
+
});
|
|
200
|
+
assert.equal(result.status, 0, `tsc failed:\n${result.stdout}\n${result.stderr}`);
|
|
201
|
+
});
|
|
202
|
+
await testAsync("CLI --help exits 0 and mentions rc-pulse", async () => {
|
|
203
|
+
const result = spawnSync("npx", ["tsx", "src/cli.ts", "--help"], { cwd: "/tmp/rc-pulse", encoding: "utf-8" });
|
|
204
|
+
const out = (result.stdout || "") + (result.stderr || "");
|
|
205
|
+
assert.ok(result.status === 0 || out.toLowerCase().includes("rc-pulse"), `Expected rc-pulse in help output, got: ${out.slice(0, 200)}`);
|
|
206
|
+
});
|
|
207
|
+
await testAsync("CLI runs against Dark Noise and outputs health score", async () => {
|
|
208
|
+
const result = spawnSync("npx", [
|
|
209
|
+
"tsx",
|
|
210
|
+
"src/cli.ts",
|
|
211
|
+
"--api-key", RC_API_KEY,
|
|
212
|
+
"--project-id", RC_PROJECT_ID,
|
|
213
|
+
], { cwd: "/tmp/rc-pulse", encoding: "utf-8", timeout: 30000 });
|
|
214
|
+
const out = (result.stdout || "") + (result.stderr || "");
|
|
215
|
+
assert.equal(result.status, 0, `CLI exited ${result.status}:\n${out.slice(0, 400)}`);
|
|
216
|
+
assert.ok(out.includes("Health Score:"), `expected 'Health Score:' in output, got:\n${out.slice(0, 400)}`);
|
|
217
|
+
assert.ok(out.includes("MRR"), `expected 'MRR' in output`);
|
|
218
|
+
});
|
|
219
|
+
await testAsync("CLI --output json produces valid parseable JSON", async () => {
|
|
220
|
+
const result = spawnSync("npx", [
|
|
221
|
+
"tsx",
|
|
222
|
+
"src/cli.ts",
|
|
223
|
+
"--api-key", RC_API_KEY,
|
|
224
|
+
"--project-id", RC_PROJECT_ID,
|
|
225
|
+
"--output", "json",
|
|
226
|
+
], { cwd: "/tmp/rc-pulse", encoding: "utf-8", timeout: 30000 });
|
|
227
|
+
assert.equal(result.status, 0, `CLI exited ${result.status}:\n${result.stderr?.slice(0, 200)}`);
|
|
228
|
+
const parsed = JSON.parse(result.stdout);
|
|
229
|
+
assert.ok(typeof parsed.health?.score === "number", "JSON should have health.score");
|
|
230
|
+
assert.ok(typeof parsed.metrics?.mrr?.current === "number", "JSON should have metrics.mrr.current");
|
|
231
|
+
});
|
|
232
|
+
await testAsync("CLI --output markdown produces markdown with h1 heading", async () => {
|
|
233
|
+
const result = spawnSync("npx", [
|
|
234
|
+
"tsx",
|
|
235
|
+
"src/cli.ts",
|
|
236
|
+
"--api-key", RC_API_KEY,
|
|
237
|
+
"--project-id", RC_PROJECT_ID,
|
|
238
|
+
"--output", "markdown",
|
|
239
|
+
], { cwd: "/tmp/rc-pulse", encoding: "utf-8", timeout: 30000 });
|
|
240
|
+
assert.equal(result.status, 0, `CLI exited non-zero:\n${result.stderr?.slice(0, 200)}`);
|
|
241
|
+
assert.ok(result.stdout.startsWith("# rc-pulse Report"), "markdown should start with h1");
|
|
242
|
+
});
|
|
243
|
+
// ─── summary ──────────────────────────────────────────────────────────────────
|
|
244
|
+
// Small delay to let async tests settle
|
|
245
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
246
|
+
console.log(`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
|
|
247
|
+
console.log(` ${passed + failed} tests: ${passed} passed, ${failed} failed`);
|
|
248
|
+
console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`);
|
|
249
|
+
if (failed > 0)
|
|
250
|
+
process.exit(1);
|
|
251
|
+
//# sourceMappingURL=test.js.map
|
package/dist/test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
export interface ChartValue {
|
|
2
|
+
cohort: number;
|
|
3
|
+
incomplete: boolean;
|
|
4
|
+
measure: number;
|
|
5
|
+
value: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ChartMeasure {
|
|
8
|
+
chartable: boolean;
|
|
9
|
+
decimal_precision: number;
|
|
10
|
+
description: string;
|
|
11
|
+
display_name: string;
|
|
12
|
+
tabulable: boolean;
|
|
13
|
+
unit: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ChartSummary {
|
|
16
|
+
average: Record<string, number>;
|
|
17
|
+
total?: Record<string, number>;
|
|
18
|
+
}
|
|
19
|
+
export interface ChartData {
|
|
20
|
+
category: string;
|
|
21
|
+
description: string;
|
|
22
|
+
display_name: string;
|
|
23
|
+
end_date: number;
|
|
24
|
+
measures: ChartMeasure[];
|
|
25
|
+
object: string;
|
|
26
|
+
resolution: string;
|
|
27
|
+
start_date: number;
|
|
28
|
+
summary: ChartSummary;
|
|
29
|
+
values: ChartValue[];
|
|
30
|
+
}
|
|
31
|
+
export interface OverviewMetric {
|
|
32
|
+
description: string;
|
|
33
|
+
id: string;
|
|
34
|
+
last_updated_at: number | null;
|
|
35
|
+
last_updated_at_iso8601: string | null;
|
|
36
|
+
name: string;
|
|
37
|
+
object: string;
|
|
38
|
+
period: string;
|
|
39
|
+
unit: string;
|
|
40
|
+
value: number;
|
|
41
|
+
}
|
|
42
|
+
export interface OverviewData {
|
|
43
|
+
metrics: OverviewMetric[];
|
|
44
|
+
}
|
|
45
|
+
export interface PulseConfig {
|
|
46
|
+
apiKey: string;
|
|
47
|
+
projectId: string;
|
|
48
|
+
output: "terminal" | "markdown" | "json";
|
|
49
|
+
periods?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface PulseMetrics {
|
|
52
|
+
mrr: {
|
|
53
|
+
current: number;
|
|
54
|
+
previous: number;
|
|
55
|
+
trend: number;
|
|
56
|
+
history: Array<{
|
|
57
|
+
date: Date;
|
|
58
|
+
value: number;
|
|
59
|
+
}>;
|
|
60
|
+
};
|
|
61
|
+
churn: {
|
|
62
|
+
current: number;
|
|
63
|
+
average: number;
|
|
64
|
+
trend: number;
|
|
65
|
+
};
|
|
66
|
+
revenue: {
|
|
67
|
+
current: number;
|
|
68
|
+
previous: number;
|
|
69
|
+
trend: number;
|
|
70
|
+
total: number;
|
|
71
|
+
};
|
|
72
|
+
trialConversion: {
|
|
73
|
+
current: number;
|
|
74
|
+
previous: number;
|
|
75
|
+
trend: number;
|
|
76
|
+
} | null;
|
|
77
|
+
overview: {
|
|
78
|
+
activeSubscriptions: number;
|
|
79
|
+
activeTrials: number;
|
|
80
|
+
activeUsers: number;
|
|
81
|
+
newCustomers: number;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export interface HealthScore {
|
|
85
|
+
score: number;
|
|
86
|
+
grade: "A" | "B" | "C" | "D" | "F";
|
|
87
|
+
label: string;
|
|
88
|
+
signals: Array<{
|
|
89
|
+
label: string;
|
|
90
|
+
status: "good" | "warning" | "bad";
|
|
91
|
+
detail: string;
|
|
92
|
+
}>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|