content-grade 1.0.33 → 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
 
@@ -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.
@@ -1519,6 +1544,8 @@ function cmdHelp() {
1519
1544
  blank();
1520
1545
  console.log(` ${CY}check-updates${R} Check if a newer version is available on npm`);
1521
1546
  blank();
1547
+ console.log(` ${CY}feedback${R} Open GitHub Issues to report a bug or request a feature`);
1548
+ blank();
1522
1549
  console.log(` ${CY}help${R} Show this help`);
1523
1550
  blank();
1524
1551
  console.log(` ${B}FLAGS${R}`);
@@ -1532,6 +1559,7 @@ function cmdHelp() {
1532
1559
  console.log(` ${CY}--verbose${R} Show debug info: model, timing, raw response length`);
1533
1560
  console.log(` ${CY}--version${R} Print version and exit`);
1534
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`);
1535
1563
  blank();
1536
1564
 
1537
1565
  console.log(` ${B}EXAMPLES${R}`);
@@ -1579,6 +1607,27 @@ function cmdHelp() {
1579
1607
  blank();
1580
1608
  }
1581
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
+
1582
1631
  // ── First-run detection ───────────────────────────────────────────────────────
1583
1632
 
1584
1633
  function isFirstRun() {
@@ -2063,8 +2112,9 @@ const _savePath = (_saveMode && _rawArgs[_saveIdx + 1] && !_rawArgs[_saveIdx + 1
2063
2112
  ? _rawArgs[_saveIdx + 1]
2064
2113
  : null;
2065
2114
  const _demoMode = _rawArgs.includes('--demo');
2115
+ const _feedbackMode = _rawArgs.includes('--feedback');
2066
2116
  const args = _rawArgs.filter((a, i) => {
2067
- 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;
2068
2118
  if (a === '--threshold') return false;
2069
2119
  if (i > 0 && _rawArgs[i - 1] === '--threshold') return false;
2070
2120
  if (_saveMode && i > 0 && _rawArgs[i - 1] === '--save' && !a.startsWith('-')) return false;
@@ -2235,7 +2285,9 @@ if (_rawArgs.includes('--help') || _rawArgs.includes('-h')) {
2235
2285
  }
2236
2286
  }
2237
2287
 
2238
- if (_demoMode) {
2288
+ if (_feedbackMode) {
2289
+ cmdFeedback();
2290
+ } else if (_demoMode) {
2239
2291
  recordEvent({ event: 'grade_run', is_pro: isProUser(), command:'demo' });
2240
2292
  cmdDemo().catch(err => {
2241
2293
  blank();
@@ -2335,6 +2387,12 @@ if (_demoMode) {
2335
2387
  });
2336
2388
  break;
2337
2389
 
2390
+ case 'feedback':
2391
+ case 'issue':
2392
+ case 'report':
2393
+ cmdFeedback();
2394
+ break;
2395
+
2338
2396
  case 'help':
2339
2397
  case '--help':
2340
2398
  case '-h':
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "content-grade",
3
- "version": "1.0.33",
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": {