content-grade 1.0.32 → 1.0.34

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 CHANGED
@@ -945,6 +945,8 @@ The web dashboard works the same way — every tool call goes through `claude -p
945
945
 
946
946
  ContentGrade is built in public. The community is the roadmap.
947
947
 
948
+ **→ [COMMUNITY.md](COMMUNITY.md)** — how to report bugs, request features, and claim an Early Adopter seat.
949
+
948
950
  ### GitHub Discussions
949
951
 
950
952
  **[Join the conversation →](https://github.com/StanislavBG/Content-Grade/discussions)**
@@ -1007,7 +1009,7 @@ See [docs/social-proof/built-with-badge.md](docs/social-proof/built-with-badge.m
1007
1009
 
1008
1010
  ---
1009
1011
 
1010
- ## Community
1012
+ ## Community & Feedback
1011
1013
 
1012
1014
  [![GitHub Stars](https://img.shields.io/github/stars/StanislavBG/Content-Grade?style=social)](https://github.com/StanislavBG/Content-Grade)
1013
1015
 
@@ -1017,7 +1019,9 @@ If Content-Grade saves you time, a ⭐ goes a long way. It helps more developers
1017
1019
 
1018
1020
  **Early adopter program:** The first 50 seats are still open — early adopters get permanent free Pro tier. [Claim your seat →](https://content-grade.github.io/Content-Grade/#early-adopter)
1019
1021
 
1020
- **Found a bug? Have a use case?** [Open an issue](https://github.com/StanislavBG/Content-Grade/issues/new/choose) or [start a discussion](https://github.com/StanislavBG/Content-Grade/discussions/new) — every report shapes what gets built next.
1022
+ **Found a bug?** [Open an issue](https://github.com/StanislavBG/Content-Grade/issues/new/choose) — every report shapes what gets built next.
1023
+
1024
+ **[GitHub Discussions →](https://github.com/StanislavBG/Content-Grade/discussions)** — questions, ideas, and show & tell. Built something with content-grade? Open a Discussion — we want to see it.
1021
1025
 
1022
1026
  ---
1023
1027
 
@@ -98,7 +98,7 @@ function incrementUsage() {
98
98
 
99
99
  // Upgrade links — Free → Pro → Business → Team
100
100
  const UPGRADE_LINKS = {
101
- free: 'https://content-grade.github.io/Content-Grade/#pricing', // Pro $9/mo — pricing page
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: 100,
117
117
  team: 500,
@@ -128,7 +128,7 @@ function getUpgradeMessage() {
128
128
  // Show usage-aware upgrade CTA after each free run.
129
129
  // count = today's usage AFTER this run (1 = first run, 3 = last free run).
130
130
  function showFreeTierCTA(count) {
131
- const limit = TIER_LIMITS.free; // 3
131
+ const limit = TIER_LIMITS.free; // 5
132
132
  const remaining = Math.max(0, limit - count);
133
133
 
134
134
  blank();
@@ -156,6 +156,8 @@ function showFreeTierCTA(count) {
156
156
  console.log(` ${WH}${count}/${limit} free analyses · ${remaining} left · Unlimited with Pro ($9/mo): ${CY}${UPGRADE_LINKS.free}${R}`);
157
157
  }
158
158
  hr();
159
+ console.log(` ${D}⭐ Like ContentGrade? Star us: https://github.com/StanislavBG/Content-Grade${R}`);
160
+ maybeShowFeedbackCTA(count);
159
161
  }
160
162
 
161
163
  // ── Early Adopter program enrollment CTA ─────────────────────────────────────
@@ -190,6 +192,27 @@ function maybeShowEarlyAdopterCTA(count) {
190
192
  hr();
191
193
  }
192
194
 
195
+ // ── Feedback CTA ──────────────────────────────────────────────────────────────
196
+
197
+ function hasFeedbackCTAShown() {
198
+ return Boolean(loadConfig().feedbackCTAShown);
199
+ }
200
+
201
+ function markFeedbackCTAShown() {
202
+ const cfg = loadConfig();
203
+ cfg.feedbackCTAShown = true;
204
+ saveConfig(cfg);
205
+ }
206
+
207
+ // Show once, after the 3rd run, to seed the GitHub Issues feedback loop.
208
+ function maybeShowFeedbackCTA(count) {
209
+ if (count !== 3) return; // only after exactly the 3rd run
210
+ if (hasFeedbackCTAShown()) return; // only once per install
211
+ markFeedbackCTAShown();
212
+ blank();
213
+ console.log(` ${D}Found a bug or have a suggestion? Open an issue: ${CY}https://github.com/StanislavBG/Content-Grade/issues/new${R}`);
214
+ }
215
+
193
216
  // Single-line usage counter appended after every command run.
194
217
  // count = total runs used today (after this run).
195
218
  function showUsageFooter(count) {
@@ -205,6 +228,8 @@ function showUsageFooter(count) {
205
228
  console.log(` ${D}[ ${count}/${limit} free runs used · ${remaining} left. Unlimited: ${UPGRADE_LINKS.free} ]${R}`);
206
229
  }
207
230
  maybeShowEarlyAdopterCTA(count);
231
+ maybeShowFeedbackCTA(count);
232
+ console.log(` ${D}⭐ Like ContentGrade? Star us: https://github.com/StanislavBG/Content-Grade${R}`);
208
233
  }
209
234
 
210
235
  // Returns { ok: boolean, count: number, limit: number } for tier-aware daily limit checks.
@@ -233,18 +258,19 @@ function checkFreeTierLimit() {
233
258
 
234
259
  blank();
235
260
  hr();
236
- console.log(` ${YL}${B}${limit}/${limit} free analyses used — limit reached.${R}`);
261
+ console.log(` ${YL}${B}You've used ${usage.count}/${limit} free analyses today.${R}`);
237
262
  blank();
238
- console.log(` ${D}Pro removes the cap — unlimited analyses, $9/mo:${R}`);
239
- console.log(` ${D}├── Unlimited analyses — no cap, ever${R}`);
240
- console.log(` ${D}├── Batch mode — score an entire /posts/ directory${R}`);
241
- console.log(` ${D}├── CI mode — exit 1 on below-threshold content${R}`);
242
- console.log(` ${D}└── JSON + HTML output — pipe into your pipeline${R}`);
263
+ console.log(` ${WH}${B}Upgrade to Pro — unlimited analyses, $9/mo${R}`);
243
264
  blank();
244
- console.log(` ${D}Used by 1,100+ developers.${R}`);
265
+ console.log(` ${D}Pro removes the daily cap entirely:${R}`);
266
+ console.log(` ${D} · Unlimited analyses — run as many as you need, every day${R}`);
267
+ console.log(` ${D} · Batch mode — score an entire /posts/ directory at once${R}`);
268
+ console.log(` ${D} · CI mode — gate deploys on content quality${R}`);
269
+ console.log(` ${D} · JSON + HTML output — pipe results into your pipeline${R}`);
245
270
  blank();
246
- console.log(` ${MG}${B}→ ${CY}${UPGRADE_LINKS.free}${R}`);
247
- console.log(` ${D} After purchase → get your key: ${CY}https://content-grade.onrender.com/my-license${R}`);
271
+ console.log(` ${MG}${B}→ Get Pro ($9/mo): ${CY}${UPGRADE_LINKS.free}${R}`);
272
+ blank();
273
+ console.log(` ${D} After purchase → get your license key: ${CY}https://content-grade.onrender.com/my-license${R}`);
248
274
  console.log(` ${D} Already have a key? ${CY}content-grade activate <key>${R}`);
249
275
  hr();
250
276
  blank();
@@ -516,7 +542,7 @@ async function cmdAnalyze(filePath) {
516
542
  process.exit(1);
517
543
  }
518
544
 
519
- if (checkFreeTierLimit()) { process.exit(1); }
545
+ if (checkFreeTierLimit()) { process.exit(0); }
520
546
 
521
547
  if (!_jsonMode && !_quietMode) {
522
548
  banner();
@@ -756,7 +782,7 @@ async function cmdHeadline(text) {
756
782
  process.exit(1);
757
783
  }
758
784
 
759
- if (checkFreeTierLimit()) { process.exit(1); }
785
+ if (checkFreeTierLimit()) { process.exit(0); }
760
786
 
761
787
  if (!_jsonMode && !_quietMode) {
762
788
  banner();
@@ -944,7 +970,7 @@ async function cmdActivate() {
944
970
  blank();
945
971
  console.log(` ${B}Pro features:${R}`);
946
972
  console.log(` ${D} content-grade batch ./posts/ ${R}${D}# analyze all files in a directory${R}`);
947
- console.log(` ${D} Unlimited analyses/day (vs 3 free)${R}`);
973
+ console.log(` ${D} Unlimited analyses/day (vs 5 free)${R}`);
948
974
  blank();
949
975
  return;
950
976
  }
@@ -1297,7 +1323,7 @@ function cmdStart() {
1297
1323
  info(` EmailForge — ${url}/email-forge`);
1298
1324
  info(` AudienceDecoder — ${url}/audience`);
1299
1325
  blank();
1300
- info(`Free tier: 3 analyses/day. Unlimited with Pro ($9/mo) → ${UPGRADE_LINKS.free}`);
1326
+ info(`Free tier: 5 analyses/day. Unlimited with Pro ($9/mo) → ${UPGRADE_LINKS.free}`);
1301
1327
  info(`Press Ctrl+C to stop`);
1302
1328
  blank();
1303
1329
  openBrowser(url);
@@ -1518,6 +1544,8 @@ function cmdHelp() {
1518
1544
  blank();
1519
1545
  console.log(` ${CY}check-updates${R} Check if a newer version is available on npm`);
1520
1546
  blank();
1547
+ console.log(` ${CY}feedback${R} Open GitHub Issues to report a bug or request a feature`);
1548
+ blank();
1521
1549
  console.log(` ${CY}help${R} Show this help`);
1522
1550
  blank();
1523
1551
  console.log(` ${B}FLAGS${R}`);
@@ -1531,6 +1559,7 @@ function cmdHelp() {
1531
1559
  console.log(` ${CY}--verbose${R} Show debug info: model, timing, raw response length`);
1532
1560
  console.log(` ${CY}--version${R} Print version and exit`);
1533
1561
  console.log(` ${CY}--no-telemetry${R} Skip usage tracking for this invocation`);
1562
+ console.log(` ${CY}--feedback${R} Open GitHub Issues in your browser`);
1534
1563
  blank();
1535
1564
 
1536
1565
  console.log(` ${B}EXAMPLES${R}`);
@@ -1568,7 +1597,7 @@ function cmdHelp() {
1568
1597
 
1569
1598
  console.log(` ${B}PRICING${R}`);
1570
1599
  blank();
1571
- console.log(` Free 3/day $0`);
1600
+ console.log(` Free 5/day $0`);
1572
1601
  console.log(` Pro Unlimited $9/mo`);
1573
1602
  console.log(` Business 100/day $29/mo`);
1574
1603
  console.log(` Team 500/day $79/mo`);
@@ -1578,6 +1607,27 @@ function cmdHelp() {
1578
1607
  blank();
1579
1608
  }
1580
1609
 
1610
+ // ── Feedback command ─────────────────────────────────────────────────────────
1611
+
1612
+ const FEEDBACK_URL = 'https://github.com/StanislavBG/Content-Grade/issues/new';
1613
+
1614
+ function cmdFeedback() {
1615
+ blank();
1616
+ console.log(` ${B}Report an issue or request a feature${R}`);
1617
+ blank();
1618
+ console.log(` ${CY}${FEEDBACK_URL}${R}`);
1619
+ blank();
1620
+ const { platform } = process;
1621
+ const opener = platform === 'darwin' ? 'open' : platform === 'win32' ? 'start' : 'xdg-open';
1622
+ try {
1623
+ spawn(opener, [FEEDBACK_URL], { stdio: 'ignore', shell: platform === 'win32', detached: true }).unref();
1624
+ console.log(` ${GN}✓${R} Opening in your browser…`);
1625
+ } catch {
1626
+ console.log(` ${D}(Could not open browser — copy the URL above)${R}`);
1627
+ }
1628
+ blank();
1629
+ }
1630
+
1581
1631
  // ── First-run detection ───────────────────────────────────────────────────────
1582
1632
 
1583
1633
  function isFirstRun() {
@@ -2062,8 +2112,9 @@ const _savePath = (_saveMode && _rawArgs[_saveIdx + 1] && !_rawArgs[_saveIdx + 1
2062
2112
  ? _rawArgs[_saveIdx + 1]
2063
2113
  : null;
2064
2114
  const _demoMode = _rawArgs.includes('--demo');
2115
+ const _feedbackMode = _rawArgs.includes('--feedback');
2065
2116
  const args = _rawArgs.filter((a, i) => {
2066
- if (['--no-telemetry', '--json', '--quiet', '--verbose', '--ci', '--save', '--demo'].includes(a)) return false;
2117
+ if (['--no-telemetry', '--json', '--quiet', '--verbose', '--ci', '--save', '--demo', '--feedback'].includes(a)) return false;
2067
2118
  if (a === '--threshold') return false;
2068
2119
  if (i > 0 && _rawArgs[i - 1] === '--threshold') return false;
2069
2120
  if (_saveMode && i > 0 && _rawArgs[i - 1] === '--save' && !a.startsWith('-')) return false;
@@ -2234,7 +2285,9 @@ if (_rawArgs.includes('--help') || _rawArgs.includes('-h')) {
2234
2285
  }
2235
2286
  }
2236
2287
 
2237
- if (_demoMode) {
2288
+ if (_feedbackMode) {
2289
+ cmdFeedback();
2290
+ } else if (_demoMode) {
2238
2291
  recordEvent({ event: 'grade_run', is_pro: isProUser(), command:'demo' });
2239
2292
  cmdDemo().catch(err => {
2240
2293
  blank();
@@ -2334,6 +2387,12 @@ if (_demoMode) {
2334
2387
  });
2335
2388
  break;
2336
2389
 
2390
+ case 'feedback':
2391
+ case 'issue':
2392
+ case 'report':
2393
+ cmdFeedback();
2394
+ break;
2395
+
2337
2396
  case 'help':
2338
2397
  case '--help':
2339
2398
  case '-h':
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "content-grade",
3
- "version": "1.0.32",
3
+ "version": "1.0.34",
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": {