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.
@@ -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 $29/mo
103
- business: 'https://buy.stripe.com/cNiaEZfA8cu9bDv4088k80c', // Team $79/mo
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: 3,
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, $29/mo → ${UPGRADE_LINKS.pro}`;
124
- if (tier === 'business') return `Upgrade to Team — team seats, $79/mo → ${UPGRADE_LINKS.business}`;
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; // 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. $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
- // 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: 50/day, JSON/HTML export, bulk mode — $19/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: 50/day ($19/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: 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
- 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} — $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 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();
@@ -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: 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 15 analyses total $0`);
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: 15 analyses total. Pro: $9/mo, unlimited. Business: $29/mo, unlimited. Team: $79/mo, unlimited + shared workspace."
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 · 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: 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, 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 (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 · 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.50",
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": {