content-grade 1.0.21 → 1.0.22

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.
@@ -169,6 +169,22 @@ function showFreeTierCTA(count) {
169
169
  }
170
170
  }
171
171
 
172
+ // Single-line usage counter appended after every command run.
173
+ // count = total runs used today (after this run).
174
+ function showUsageFooter(count) {
175
+ if (isProUser()) return;
176
+ const limit = TIER_LIMITS.free;
177
+ const remaining = Math.max(0, limit - count);
178
+ blank();
179
+ if (remaining === 0) {
180
+ console.log(` ${RD}[ ${count}/${limit} free runs used today · limit reached — upgrade for unlimited: ${UPGRADE_LINKS.free} ]${R}`);
181
+ } else if (remaining === 1) {
182
+ console.log(` ${YL}[ ${count}/${limit} free runs used today · 1 remaining — upgrade for unlimited: ${UPGRADE_LINKS.free} ]${R}`);
183
+ } else {
184
+ console.log(` ${D}[ ${count}/${limit} free runs used today — upgrade for unlimited: ${UPGRADE_LINKS.free} ]${R}`);
185
+ }
186
+ }
187
+
172
188
  // Block a run before it starts if the free tier is exhausted.
173
189
  // Returns true (blocked) and prints a visually distinct upgrade prompt.
174
190
  // Returns false if the user may proceed.
@@ -630,7 +646,7 @@ async function cmdAnalyze(filePath) {
630
646
  hr();
631
647
  console.log(` ${D}Pro active · Next: ${CY}content-grade batch ./posts/${R}${D} to analyze a whole directory${R}`);
632
648
  } else {
633
- showFreeTierCTA(usageCount);
649
+ showUsageFooter(usageCount);
634
650
  }
635
651
 
636
652
  // CI exit code — shown after full output so user sees the score before exit
@@ -791,7 +807,7 @@ async function cmdHeadline(text) {
791
807
  blank();
792
808
  if (!isProUser()) {
793
809
  const usageCount = incrementUsage();
794
- showFreeTierCTA(usageCount);
810
+ showUsageFooter(usageCount);
795
811
  }
796
812
  }
797
813
 
@@ -1169,6 +1185,8 @@ async function cmdBatch(dirPath) {
1169
1185
  blank();
1170
1186
 
1171
1187
  if (_jsonMode) process.stdout.write(JSON.stringify(results, null, 2) + '\n');
1188
+
1189
+ if (!isProUser() && results.length) showUsageFooter(getUsage().count);
1172
1190
  }
1173
1191
 
1174
1192
  // ── Start command ─────────────────────────────────────────────────────────────
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "content-grade",
3
- "version": "1.0.21",
3
+ "version": "1.0.22",
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": {