content-grade 1.0.48 → 1.0.50
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/bin/content-grade.js +37 -21
- package/dist/landing.html +26 -13
- package/package.json +1 -1
package/bin/content-grade.js
CHANGED
|
@@ -99,8 +99,8 @@ function incrementUsage() {
|
|
|
99
99
|
// Upgrade links — Free → Pro → Business → Team
|
|
100
100
|
const UPGRADE_LINKS = {
|
|
101
101
|
free: 'https://buy.stripe.com/4gM14p87GeCh9vn9ks8k80a', // Pro $19/mo — direct checkout
|
|
102
|
-
pro: 'https://buy.stripe.com/bJefZjafO2Tz36Z2W48k80b', // Business $
|
|
103
|
-
business: 'https://buy.stripe.com/cNiaEZfA8cu9bDv4088k80c', // Team $
|
|
102
|
+
pro: 'https://buy.stripe.com/bJefZjafO2Tz36Z2W48k80b', // Business $49/mo
|
|
103
|
+
business: 'https://buy.stripe.com/cNiaEZfA8cu9bDv4088k80c', // Team $199/mo
|
|
104
104
|
};
|
|
105
105
|
|
|
106
106
|
const TIER_NAMES = {
|
|
@@ -111,7 +111,7 @@ const TIER_NAMES = {
|
|
|
111
111
|
};
|
|
112
112
|
|
|
113
113
|
const TIER_LIMITS = {
|
|
114
|
-
free:
|
|
114
|
+
free: 5,
|
|
115
115
|
pro: Infinity,
|
|
116
116
|
business: Infinity,
|
|
117
117
|
team: Infinity,
|
|
@@ -120,15 +120,15 @@ const TIER_LIMITS = {
|
|
|
120
120
|
function getUpgradeMessage() {
|
|
121
121
|
const tier = getLicenseTier();
|
|
122
122
|
if (tier === 'free') return `Unlimited analyses with Pro — $19/mo → ${UPGRADE_LINKS.free}`;
|
|
123
|
-
if (tier === 'pro') return `Upgrade to Business — priority support, $
|
|
124
|
-
if (tier === 'business') return `Upgrade to Team — team seats, $
|
|
123
|
+
if (tier === 'pro') return `Upgrade to Business — priority support, $49/mo → ${UPGRADE_LINKS.pro}`;
|
|
124
|
+
if (tier === 'business') return `Upgrade to Team — team seats, $199/mo → ${UPGRADE_LINKS.business}`;
|
|
125
125
|
return '';
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
// Show usage-aware upgrade CTA after each free run.
|
|
129
129
|
// count = daily usage AFTER this run.
|
|
130
130
|
function showFreeTierCTA(count) {
|
|
131
|
-
const limit = TIER_LIMITS.free;
|
|
131
|
+
const limit = TIER_LIMITS.free;
|
|
132
132
|
const remaining = Math.max(0, limit - count);
|
|
133
133
|
|
|
134
134
|
// Track that an upgrade prompt was shown after a run (post-run CTA, not a hard block)
|
|
@@ -139,16 +139,23 @@ function showFreeTierCTA(count) {
|
|
|
139
139
|
hr();
|
|
140
140
|
|
|
141
141
|
if (remaining === 0) {
|
|
142
|
-
//
|
|
142
|
+
// Variant D — power user, last run of the day
|
|
143
143
|
console.log(` ${YL}${B}${count}/${limit} — that's all your free runs for today.${R}`);
|
|
144
144
|
blank();
|
|
145
|
-
console.log(` ${WH}
|
|
146
|
-
console.log(` ${
|
|
145
|
+
console.log(` ${WH}You're clearly using this. $19/month removes the cap entirely —${R}`);
|
|
146
|
+
console.log(` ${WH}unlimited analyses, JSON/HTML export, bulk mode. Cancel anytime.${R}`);
|
|
147
147
|
blank();
|
|
148
|
+
console.log(` ${CY}→ ${UPGRADE_LINKS.free}${R}`);
|
|
148
149
|
console.log(` ${D}Or come back tomorrow for ${limit} more free runs.${R}`);
|
|
149
150
|
} else {
|
|
150
|
-
//
|
|
151
|
-
|
|
151
|
+
// Variant C — compact post-run teaser with command-relevant Pro feature
|
|
152
|
+
const proFeatureMap = {
|
|
153
|
+
grade: 'Bulk-grade entire directories · CI exit codes · JSON output',
|
|
154
|
+
headline: 'Batch-test 50 headlines at once · CSV export',
|
|
155
|
+
analyze: 'CI integration · exit 1 on below-threshold · JSON pipeline output',
|
|
156
|
+
};
|
|
157
|
+
const feature = proFeatureMap[cmd] || 'Unlimited runs · CI mode · bulk grading';
|
|
158
|
+
console.log(` ${D}[ ${count}/${limit} free runs today · ${R}${WH}Pro: ${feature}${R}${D} · ${CY}${UPGRADE_LINKS.free}${R}${D} ]${R}`);
|
|
152
159
|
}
|
|
153
160
|
hr();
|
|
154
161
|
maybeShowFeedbackCTA(count);
|
|
@@ -226,11 +233,11 @@ function showUsageFooter(count) {
|
|
|
226
233
|
const remaining = Math.max(0, limit - count);
|
|
227
234
|
blank();
|
|
228
235
|
if (remaining === 0) {
|
|
229
|
-
console.log(` ${RD}[ ${limit}/${limit} free
|
|
236
|
+
console.log(` ${RD}[ You've used ${limit}/${limit} free runs today · Pro: 50/day, JSON/HTML export, bulk mode — $19/mo → ${UPGRADE_LINKS.free} ]${R}`);
|
|
230
237
|
} else if (remaining <= 1) {
|
|
231
|
-
console.log(` ${YL}[ ${
|
|
238
|
+
console.log(` ${YL}[ You've used ${count}/${limit} free runs today · ${remaining} remaining · Pro: 50/day ($19/mo) → ${UPGRADE_LINKS.free} ]${R}`);
|
|
232
239
|
} else {
|
|
233
|
-
console.log(` ${D}[ ${count}/${limit} free
|
|
240
|
+
console.log(` ${D}[ You've used ${count}/${limit} free runs today · ${remaining} remaining · Pro: 50/day ($19/mo) → ${UPGRADE_LINKS.free} ]${R}`);
|
|
234
241
|
}
|
|
235
242
|
maybeShowEarlyAdopterCTA(count);
|
|
236
243
|
maybeShowFeedbackCTA(count);
|
|
@@ -262,10 +269,19 @@ function checkFreeTierLimit() {
|
|
|
262
269
|
recordEvent({ event: 'upgrade_prompt_shown', run_count: usage.daily });
|
|
263
270
|
|
|
264
271
|
blank();
|
|
265
|
-
|
|
266
|
-
console.log(` ${
|
|
267
|
-
|
|
268
|
-
console.log(` ${
|
|
272
|
+
hr();
|
|
273
|
+
console.log(` ${RD}${B}✗ Free limit reached (${limit}/${limit} today)${R}`);
|
|
274
|
+
blank();
|
|
275
|
+
console.log(` ${WH}content-grade Pro${R}${D} — $19/mo, cancel anytime${R}`);
|
|
276
|
+
console.log(` ${D} ├── ${R}${WH}Unlimited analyses${R}${D} — no daily cap${R}`);
|
|
277
|
+
console.log(` ${D} ├── ${R}${WH}JSON + HTML output${R}${D} — pipe into your pipeline${R}`);
|
|
278
|
+
console.log(` ${D} ├── ${R}${WH}CI mode ${R}${D} — exit 1 on below-threshold content${R}`);
|
|
279
|
+
console.log(` ${D} └── ${R}${WH}Bulk grading ${R}${D} — score an entire /posts/ directory${R}`);
|
|
280
|
+
blank();
|
|
281
|
+
console.log(` ${CY}→ Get Pro ${UPGRADE_LINKS.free}${R}`);
|
|
282
|
+
blank();
|
|
283
|
+
console.log(` ${D}Already have a key? ${R}${WH}content-grade activate <your-key>${R}`);
|
|
284
|
+
hr();
|
|
269
285
|
blank();
|
|
270
286
|
return true;
|
|
271
287
|
}
|
|
@@ -970,7 +986,7 @@ async function cmdActivate() {
|
|
|
970
986
|
blank();
|
|
971
987
|
console.log(` ${B}Pro features:${R}`);
|
|
972
988
|
console.log(` ${D} content-grade batch ./posts/ ${R}${D}# analyze all files in a directory${R}`);
|
|
973
|
-
console.log(` ${D} Unlimited analyses (vs
|
|
989
|
+
console.log(` ${D} Unlimited analyses (vs 3/day free)${R}`);
|
|
974
990
|
blank();
|
|
975
991
|
console.log(` ${D}To activate a different key: ${CY}content-grade activate <new-key>${R}`);
|
|
976
992
|
blank();
|
|
@@ -1330,7 +1346,7 @@ function cmdStart() {
|
|
|
1330
1346
|
info(` EmailForge — ${url}/email-forge`);
|
|
1331
1347
|
info(` AudienceDecoder — ${url}/audience`);
|
|
1332
1348
|
blank();
|
|
1333
|
-
info(`Free tier:
|
|
1349
|
+
info(`Free tier: 5 runs/day. Pro: 50/day ($19/mo) → ${UPGRADE_LINKS.free}`);
|
|
1334
1350
|
info(`Press Ctrl+C to stop`);
|
|
1335
1351
|
blank();
|
|
1336
1352
|
openBrowser(url);
|
|
@@ -1604,7 +1620,7 @@ function cmdHelp() {
|
|
|
1604
1620
|
|
|
1605
1621
|
console.log(` ${B}PRICING${R}`);
|
|
1606
1622
|
blank();
|
|
1607
|
-
console.log(` Free
|
|
1623
|
+
console.log(` Free 5 runs/day $0`);
|
|
1608
1624
|
console.log(` Pro Unlimited analyses $19/mo (cancel anytime)`);
|
|
1609
1625
|
console.log(` Business Unlimited analyses $29/mo`);
|
|
1610
1626
|
console.log(` Team Unlimited analyses $79/mo`);
|
package/dist/landing.html
CHANGED
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"@type": "Offer",
|
|
37
37
|
"price": "0",
|
|
38
38
|
"priceCurrency": "USD",
|
|
39
|
-
"description": "Free:
|
|
39
|
+
"description": "Free: 3 analyses per day, reset daily. Pro: $19/mo, unlimited. Business: $49/mo, unlimited. Team: $199/mo, unlimited + shared workspace."
|
|
40
40
|
},
|
|
41
41
|
"featureList": [
|
|
42
42
|
"Headline analyzer with framework-based scoring",
|
|
@@ -1017,7 +1017,7 @@
|
|
|
1017
1017
|
</div>
|
|
1018
1018
|
|
|
1019
1019
|
<div class="hero-meta">
|
|
1020
|
-
<span>Free ·
|
|
1020
|
+
<span>Free · 3 analyses/day</span>
|
|
1021
1021
|
<span class="hero-meta-sep">·</span>
|
|
1022
1022
|
<span>Claude CLI required · Zero data leaves your machine</span>
|
|
1023
1023
|
<span class="hero-meta-sep">·</span>
|
|
@@ -1196,7 +1196,7 @@
|
|
|
1196
1196
|
<div class="step">
|
|
1197
1197
|
<div class="step-num">3</div>
|
|
1198
1198
|
<h3>Launch the full dashboard</h3>
|
|
1199
|
-
<p>Start the web interface to access all 6 tools — HeadlineGrader, PageRoast, AdScorer, ThreadGrader, EmailForge, and AudienceDecoder. Free tier:
|
|
1199
|
+
<p>Start the web interface to access all 6 tools — HeadlineGrader, PageRoast, AdScorer, ThreadGrader, EmailForge, and AudienceDecoder. Free tier: 3 analyses per day, reset daily.</p>
|
|
1200
1200
|
<div class="step-code">npx content-grade start</div>
|
|
1201
1201
|
</div>
|
|
1202
1202
|
</div>
|
|
@@ -1220,9 +1220,10 @@
|
|
|
1220
1220
|
<div class="plan-period">forever · no signup required</div>
|
|
1221
1221
|
<a href="https://www.npmjs.com/package/content-grade" class="plan-cta">Install free →</a>
|
|
1222
1222
|
<ul class="plan-features">
|
|
1223
|
-
<li><span class="check">✓</span> <strong>3 analyses per day</strong> — enough to build the habit</li>
|
|
1223
|
+
<li><span class="check">✓</span> <strong>3 analyses per day</strong> — enough to build the habit before you commit</li>
|
|
1224
1224
|
<li><span class="check">✓</span> Access all 6 tools: HeadlineGrader, PageRoast, AdScorer, ThreadGrader, EmailForge, AudienceDecoder</li>
|
|
1225
1225
|
<li><span class="check">✓</span> Core scores: Readability, Clarity, SEO Signal, Engagement potential</li>
|
|
1226
|
+
<li><span class="check">✓</span> No credit card. No signup. No API key.</li>
|
|
1226
1227
|
</ul>
|
|
1227
1228
|
</div>
|
|
1228
1229
|
|
|
@@ -1234,9 +1235,11 @@
|
|
|
1234
1235
|
<a href="https://buy.stripe.com/4gM14p87GeCh9vn9ks8k80a" class="plan-cta" target="_blank" rel="noopener">Upgrade to Pro →</a>
|
|
1235
1236
|
<div style="font-size:13px; color:var(--muted); margin-bottom:12px;">Used by content teams grading 50+ pieces per week.</div>
|
|
1236
1237
|
<ul class="plan-features">
|
|
1237
|
-
<li><span class="check">✓</span> <strong>Unlimited analyses</strong> — no daily cap, no throttle</li>
|
|
1238
|
-
<li><span class="check">✓</span> Export results as JSON or HTML — pipe into dashboards, Notion, or CI</li>
|
|
1239
|
-
<li><span class="check">✓</span> <code>--bulk</code> mode: grade entire folders
|
|
1238
|
+
<li><span class="check">✓</span> <strong>Unlimited analyses</strong> — no daily cap, no throttle, no surprises</li>
|
|
1239
|
+
<li><span class="check">✓</span> Export results as JSON or HTML — pipe scores into dashboards, Notion, or CI pipelines</li>
|
|
1240
|
+
<li><span class="check">✓</span> <code>--bulk</code> mode: grade entire folders in one command</li>
|
|
1241
|
+
<li><span class="check">✓</span> License key for CLI activation</li>
|
|
1242
|
+
<li><span class="check">✓</span> Priority email support</li>
|
|
1240
1243
|
</ul>
|
|
1241
1244
|
</div>
|
|
1242
1245
|
|
|
@@ -1246,10 +1249,10 @@
|
|
|
1246
1249
|
<div class="plan-period">Unlimited analyses · billed monthly</div>
|
|
1247
1250
|
<a href="https://buy.stripe.com/bJefZjafO2Tz36Z2W48k80b" class="plan-cta" target="_blank" rel="noopener">Get Business →</a>
|
|
1248
1251
|
<ul class="plan-features">
|
|
1249
|
-
<li><span class="check">✓</span>
|
|
1252
|
+
<li><span class="check">✓</span> <strong>Unlimited analyses</strong> — everything in Pro</li>
|
|
1250
1253
|
<li><span class="check">✓</span> CI mode with exit codes — fail builds when content quality drops</li>
|
|
1251
1254
|
<li><span class="check">✓</span> <code>--compare</code> flag: score a rewrite against the original</li>
|
|
1252
|
-
<li><span class="check">✓</span> REST API access for
|
|
1255
|
+
<li><span class="check">✓</span> REST API access for CMS and analytics integrations</li>
|
|
1253
1256
|
</ul>
|
|
1254
1257
|
</div>
|
|
1255
1258
|
|
|
@@ -1259,13 +1262,23 @@
|
|
|
1259
1262
|
<div class="plan-period">Unlimited analyses · billed monthly</div>
|
|
1260
1263
|
<a href="https://buy.stripe.com/cNiaEZfA8cu9bDv4088k80c" class="plan-cta" target="_blank" rel="noopener">Get Team →</a>
|
|
1261
1264
|
<ul class="plan-features">
|
|
1262
|
-
<li><span class="check">✓</span>
|
|
1263
|
-
<li><span class="check">✓</span>
|
|
1265
|
+
<li><span class="check">✓</span> <strong>Unlimited analyses</strong> — everything in Business</li>
|
|
1266
|
+
<li><span class="check">✓</span> Shared across up to 10 seats under a single license key</li>
|
|
1267
|
+
<li><span class="check">✓</span> Priority support — 24-hour response SLA</li>
|
|
1264
1268
|
<li><span class="check">✓</span> Early access to new tools before public release</li>
|
|
1265
1269
|
</ul>
|
|
1266
1270
|
</div>
|
|
1267
1271
|
</div>
|
|
1268
1272
|
|
|
1273
|
+
<!-- TESTIMONIAL SLOT — replace with real quote before publishing, or remove entirely -->
|
|
1274
|
+
<!-- DO NOT PUBLISH PLACEHOLDER TEXT TO PRODUCTION -->
|
|
1275
|
+
<!--
|
|
1276
|
+
<blockquote class="testimonial" style="margin:32px auto; max-width:560px; padding:20px 24px; background:rgba(124,77,255,0.08); border-left:3px solid #7c4dff; border-radius:0 10px 10px 0; text-align:left;">
|
|
1277
|
+
<p style="color:rgba(255,255,255,0.9); font-size:16px; line-height:1.6; margin:0 0 12px;">"[TESTIMONIAL_QUOTE — 1–3 sentences, result-focused.]"</p>
|
|
1278
|
+
<footer style="color:rgba(255,255,255,0.5); font-size:13px;">— [FIRST NAME LAST NAME], [ROLE] at [COMPANY]</footer>
|
|
1279
|
+
</blockquote>
|
|
1280
|
+
-->
|
|
1281
|
+
|
|
1269
1282
|
<div style="margin-top:32px; padding:20px 24px; background:rgba(255,255,255,0.04); border:1px solid rgba(255,255,255,0.1); border-radius:10px; max-width:560px; margin-left:auto; margin-right:auto; text-align:left;">
|
|
1270
1283
|
<div style="font-size:13px; color:rgba(255,255,255,0.5); text-transform:uppercase; letter-spacing:1px; margin-bottom:10px;">After checkout — 2 steps to unlock Pro</div>
|
|
1271
1284
|
<ol style="padding-left:20px; color:rgba(255,255,255,0.8); font-size:15px; line-height:1.9; margin:0;">
|
|
@@ -1297,7 +1310,7 @@
|
|
|
1297
1310
|
<details>
|
|
1298
1311
|
<summary>Do I need an Anthropic API key or a paid Claude account?</summary>
|
|
1299
1312
|
<div class="faq-answer">
|
|
1300
|
-
No API key required. ContentGrade runs on <strong>Claude CLI</strong> — install it for free from claude.ai/code and log in with a Claude account. A free Claude account is sufficient for the free tier (
|
|
1313
|
+
No API key required. ContentGrade runs on <strong>Claude CLI</strong> — install it for free from claude.ai/code and log in with a Claude account. A free Claude account is sufficient for the free tier (3 analyses per day, reset daily).<br /><br />
|
|
1301
1314
|
There's no per-query Anthropic billing. You're not routing calls through the API console or accumulating usage charges. Claude CLI handles authentication locally, which is also why your content never leaves your machine.
|
|
1302
1315
|
</div>
|
|
1303
1316
|
</details>
|
|
@@ -1417,7 +1430,7 @@
|
|
|
1417
1430
|
<section class="final-cta">
|
|
1418
1431
|
<div class="container">
|
|
1419
1432
|
<h2>Run your best headline.<br />See where it actually stands.</h2>
|
|
1420
|
-
<p>Free ·
|
|
1433
|
+
<p>Free · 3 analyses/day · No API key · Claude CLI only</p>
|
|
1421
1434
|
<div style="display: flex; gap: 16px; justify-content: center; flex-wrap: wrap;">
|
|
1422
1435
|
<a href="https://github.com/Content-Grade/Content-Grade" class="btn-primary">
|
|
1423
1436
|
Install free — npx content-grade
|
package/package.json
CHANGED