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 +6 -2
- package/bin/content-grade.js +78 -19
- package/package.json +1 -1
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
|
[](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
|
|
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
|
|
package/bin/content-grade.js
CHANGED
|
@@ -98,7 +98,7 @@ function incrementUsage() {
|
|
|
98
98
|
|
|
99
99
|
// Upgrade links — Free → Pro → Business → Team
|
|
100
100
|
const UPGRADE_LINKS = {
|
|
101
|
-
free: 'https://
|
|
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:
|
|
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; //
|
|
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}${
|
|
261
|
+
console.log(` ${YL}${B}You've used ${usage.count}/${limit} free analyses today.${R}`);
|
|
237
262
|
blank();
|
|
238
|
-
console.log(` ${
|
|
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}
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
|
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:
|
|
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
|
|
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 (
|
|
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