content-grade 1.0.48 → 1.0.51

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.
@@ -98,7 +98,7 @@ function incrementUsage() {
98
98
 
99
99
  // Upgrade links — Free → Pro → Business → Team
100
100
  const UPGRADE_LINKS = {
101
- free: 'https://buy.stripe.com/4gM14p87GeCh9vn9ks8k80a', // Pro $19/mo — direct checkout
101
+ free: 'https://buy.stripe.com/4gM14p87GeCh9vn9ks8k80a', // Pro $9/mo — direct checkout
102
102
  pro: 'https://buy.stripe.com/bJefZjafO2Tz36Z2W48k80b', // Business $29/mo
103
103
  business: 'https://buy.stripe.com/cNiaEZfA8cu9bDv4088k80c', // Team $79/mo
104
104
  };
@@ -111,7 +111,7 @@ const TIER_NAMES = {
111
111
  };
112
112
 
113
113
  const TIER_LIMITS = {
114
- free: 3,
114
+ free: 5,
115
115
  pro: Infinity,
116
116
  business: Infinity,
117
117
  team: Infinity,
@@ -119,7 +119,7 @@ const TIER_LIMITS = {
119
119
 
120
120
  function getUpgradeMessage() {
121
121
  const tier = getLicenseTier();
122
- if (tier === 'free') return `Unlimited analyses with Pro — $19/mo → ${UPGRADE_LINKS.free}`;
122
+ if (tier === 'free') return `Unlimited analyses with Pro — $9/mo → ${UPGRADE_LINKS.free}`;
123
123
  if (tier === 'pro') return `Upgrade to Business — priority support, $29/mo → ${UPGRADE_LINKS.pro}`;
124
124
  if (tier === 'business') return `Upgrade to Team — team seats, $79/mo → ${UPGRADE_LINKS.business}`;
125
125
  return '';
@@ -128,7 +128,7 @@ function getUpgradeMessage() {
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; // 3
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
- // Last run of the day — power user nudge
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} Pro: unlimited analyses · JSON/HTML export · bulk mode · $19/mo, cancel anytime${R}`);
146
- console.log(` ${MG}${B}→ ${UPGRADE_LINKS.free}${R}`);
145
+ console.log(` ${WH}You're clearly using this. $9/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
- // Runs remaining — compact single-line footer
151
- console.log(` ${D}[ ${count}/${limit} free runs today · ${remaining} remaining · Pro: unlimited ($19/mo) → ${UPGRADE_LINKS.free} ]${R}`);
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 analyses used today · Pro: unlimited analyses, JSON/HTML export, bulk mode — $19/mo → ${UPGRADE_LINKS.free} ]${R}`);
236
+ console.log(` ${RD}[ You've used ${limit}/${limit} free runs today · Pro: unlimited, JSON/HTML export, bulk mode — $9/mo → ${UPGRADE_LINKS.free} ]${R}`);
230
237
  } else if (remaining <= 1) {
231
- console.log(` ${YL}[ ${remaining} free analysis remaining today · Pro: unlimited analyses, JSON/HTML export, bulk mode — $19/mo → ${UPGRADE_LINKS.free} ]${R}`);
238
+ console.log(` ${YL}[ You've used ${count}/${limit} free runs today · ${remaining} remaining · Pro: unlimited ($9/mo) → ${UPGRADE_LINKS.free} ]${R}`);
232
239
  } else {
233
- console.log(` ${D}[ ${count}/${limit} free analyses today · ${remaining} remaining · Pro: unlimited ($19/mo) → ${UPGRADE_LINKS.free} ]${R}`);
240
+ console.log(` ${D}[ You've used ${count}/${limit} free runs today · ${remaining} remaining · Pro: unlimited ($9/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
- console.log(` ${RD}${B}${limit}/${limit} free analyses used today.${R}`);
266
- console.log(` ${WH}Pro: unlimited analyses · JSON/HTML export · bulk mode — $19/mo, cancel anytime${R}`);
267
- console.log(` ${MG}${B}→ ${UPGRADE_LINKS.free}${R}`);
268
- console.log(` ${D}After purchase: content-grade activate <key>${R}`);
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} — $9/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
  }
@@ -945,7 +961,7 @@ async function cmdInit() {
945
961
  console.log(` ${CY}content-grade start${R}`);
946
962
  blank();
947
963
  }
948
- console.log(` ${WH}Pro: unlimited analyses · JSON/HTML export · bulk mode · CI integration — $19/mo, cancel anytime${R}`);
964
+ console.log(` ${WH}Pro: unlimited analyses · JSON/HTML export · bulk mode · CI integration — $9/mo, cancel anytime${R}`);
949
965
  console.log(` ${MG}→ Get Pro: ${CY}${UPGRADE_LINKS.free}${R}`);
950
966
  console.log(` ${D}After checkout: content-grade activate <your-key>${R}`);
951
967
  blank();
@@ -970,14 +986,14 @@ 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 15 free total)${R}`);
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();
977
993
  return;
978
994
  }
979
995
 
980
- console.log(` ${D}Pro unlocks unlimited analyses, JSON/HTML export, and bulk mode for $19/mo:${R}`);
996
+ console.log(` ${D}Pro unlocks unlimited analyses, JSON/HTML export, and bulk mode for $9/mo:${R}`);
981
997
  blank();
982
998
  console.log(` ${MG}${B}→ Get Pro: ${CY}${UPGRADE_LINKS.free}${R}`);
983
999
  blank();
@@ -1115,9 +1131,9 @@ async function cmdBatch(dirPath) {
1115
1131
  blank();
1116
1132
  console.log(` ${D}Grade every file in a directory in one shot. Pro only.${R}`);
1117
1133
  blank();
1118
- console.log(` ${WH}${B}Pro ($19/mo): unlimited analyses · JSON/HTML export · bulk mode · CI integration${R}`);
1134
+ console.log(` ${WH}${B}Pro ($9/mo): unlimited analyses · JSON/HTML export · bulk mode · CI integration${R}`);
1119
1135
  blank();
1120
- console.log(` ${MG}${B}→ Get Pro ($19/mo, cancel anytime): ${CY}${UPGRADE_LINKS.free}${R}`);
1136
+ console.log(` ${MG}${B}→ Get Pro ($9/mo, cancel anytime): ${CY}${UPGRADE_LINKS.free}${R}`);
1121
1137
  blank();
1122
1138
  console.log(` ${D}After checkout — 2 steps to unlock:${R}`);
1123
1139
  console.log(` ${D} 1. Get your key: ${CY}https://content-grade.onrender.com/my-license${R}`);
@@ -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: 15 analyses total. Unlimited with Pro ($19/mo) → ${UPGRADE_LINKS.free}`);
1349
+ info(`Free tier: 5 runs/day. Pro: unlimited ($9/mo) → ${UPGRADE_LINKS.free}`);
1334
1350
  info(`Press Ctrl+C to stop`);
1335
1351
  blank();
1336
1352
  openBrowser(url);
@@ -1604,8 +1620,8 @@ function cmdHelp() {
1604
1620
 
1605
1621
  console.log(` ${B}PRICING${R}`);
1606
1622
  blank();
1607
- console.log(` Free 15 analyses total $0`);
1608
- console.log(` Pro Unlimited analyses $19/mo (cancel anytime)`);
1623
+ console.log(` Free 5 runs/day $0`);
1624
+ console.log(` Pro Unlimited analyses $9/mo (cancel anytime)`);
1609
1625
  console.log(` Business Unlimited analyses $29/mo`);
1610
1626
  console.log(` Team Unlimited analyses $79/mo`);
1611
1627
  blank();
package/dist/landing.html CHANGED
@@ -36,7 +36,7 @@
36
36
  "@type": "Offer",
37
37
  "price": "0",
38
38
  "priceCurrency": "USD",
39
- "description": "Free: 15 analyses total. Pro: $9/mo, unlimited. Business: $29/mo, unlimited. Team: $79/mo, unlimited + shared workspace."
39
+ "description": "Free: 5 runs per day, reset daily. Pro: $9/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 · 15 analyses to start</span>
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: 15 analyses total across all tools.</p>
1199
+ <p>Start the web interface to access all 6 tools — HeadlineGrader, PageRoast, AdScorer, ThreadGrader, EmailForge, and AudienceDecoder. Free tier: 5 analyses per day, reset daily.</p>
1200
1200
  <div class="step-code">npx content-grade start</div>
1201
1201
  </div>
1202
1202
  </div>
@@ -1210,7 +1210,7 @@
1210
1210
  <div class="section-eyebrow">Pricing</div>
1211
1211
  <h2>Stop guessing if your content is good.</h2>
1212
1212
  <p class="pricing-subhead" style="font-size:20px; font-weight:600; color:var(--fg); margin-bottom:8px;">Pick a plan. Grade everything.</p>
1213
- <p class="pricing-lead">3 analyses per day — free. No credit card, no signup, no API key required.</p>
1213
+ <p class="pricing-lead">5 runs per day — free. No credit card, no signup, no API key required.</p>
1214
1214
  </div>
1215
1215
 
1216
1216
  <div class="pricing-grid">
@@ -1220,23 +1220,26 @@
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>5 runs 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
 
1229
1230
  <div class="plan featured">
1230
1231
  <div class="plan-badge">Most popular</div>
1231
1232
  <div class="plan-name">PRO</div>
1232
- <div class="plan-price">$19<span>/mo</span></div>
1233
- <div class="plan-period">Unlimited analyses · billed monthly</div>
1233
+ <div class="plan-price">$9<span>/mo</span></div>
1234
+ <div class="plan-period">Unlimited runs · billed monthly · cancel anytime</div>
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, get a ranked quality report</li>
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> Everything in Pro</li>
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 custom CMS or analytics integrations</li>
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> Everything in Business, up to 10 seats under one license key</li>
1263
- <li><span class="check">✓</span> Priority support with 24-hour response SLA</li>
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 (15 analyses total across all tools).<br /><br />
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 (5 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>
@@ -1343,7 +1356,7 @@
1343
1356
  <details>
1344
1357
  <summary>What counts as an analysis?</summary>
1345
1358
  <div class="faq-answer">
1346
- One run of any tool on any single piece of content. Grading a headline = 1 analysis. Roasting a landing page = 1 analysis. Running <code>--bulk</code> on a folder of 20 posts = 20 analyses. The Free tier gives you 3 per day — Pro and above are unlimited.
1359
+ One run of any tool on any single piece of content. Grading a headline = 1 analysis. Roasting a landing page = 1 analysis. Running <code>--bulk</code> on a folder of 20 posts = 20 analyses. The Free tier gives you 5 per day — Pro and above are unlimited.
1347
1360
  </div>
1348
1361
  </details>
1349
1362
 
@@ -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 · 15 analyses to start · No API key · Claude CLI only</p>
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "content-grade",
3
- "version": "1.0.48",
3
+ "version": "1.0.51",
4
4
  "description": "AI-powered content analysis CLI. Score any blog post, landing page, or ad copy in under 30 seconds — runs on Claude CLI, no API key needed.",
5
5
  "type": "module",
6
6
  "bin": {