commitshow 0.2.11 → 0.3.1
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 +82 -25
- package/dist/lib/render.js +103 -41
- package/package.json +10 -4
package/README.md
CHANGED
|
@@ -1,39 +1,87 @@
|
|
|
1
|
-
|
|
1
|
+
<h1 align="center">commit.show CLI</h1>
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
<p align="center">
|
|
4
|
+
<strong>Audit any vibe-coded project from your terminal.</strong><br>
|
|
5
|
+
Score · 3-axis breakdown · 3 strengths + 2 concerns · rank · delta — in one command.
|
|
6
|
+
</p>
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
When a walk-on is ready to enter the season for real — Scout forecasts,
|
|
13
|
-
season ranking, Backstage prompt-extraction, Hall of Fame — they audition
|
|
14
|
-
at <https://commit.show/submit>.
|
|
15
|
-
|
|
16
|
-
The npm package + command is `commitshow` (no dot — npm doesn't allow it in
|
|
17
|
-
package names). Everything else uses the brand `commit.show`.
|
|
8
|
+
<p align="center">
|
|
9
|
+
<a href="https://www.npmjs.com/package/commitshow"><img src="https://img.shields.io/npm/v/commitshow?color=F0C040&label=npm&style=flat-square" alt="npm version"></a>
|
|
10
|
+
<a href="https://www.npmjs.com/package/commitshow"><img src="https://img.shields.io/npm/dw/commitshow?color=0F2040&style=flat-square" alt="weekly downloads"></a>
|
|
11
|
+
<img src="https://img.shields.io/node/v/commitshow?color=0F2040&style=flat-square" alt="node">
|
|
12
|
+
<img src="https://img.shields.io/npm/l/commitshow?color=0F2040&style=flat-square" alt="MIT license">
|
|
13
|
+
</p>
|
|
18
14
|
|
|
19
15
|
```bash
|
|
20
|
-
npx commitshow@latest audit
|
|
21
|
-
# or audit any public project by URL — no cd required
|
|
22
16
|
npx commitshow@latest audit github.com/owner/repo
|
|
23
17
|
```
|
|
24
18
|
|
|
19
|
+
```
|
|
20
|
+
┌──────────────────────────────────────────────────────────┐
|
|
21
|
+
│ commit.show · Audit report │
|
|
22
|
+
└──────────────────────────────────────────────────────────┘
|
|
23
|
+
|
|
24
|
+
maa-website austinpw-cloud/maa-website
|
|
25
|
+
|
|
26
|
+
╔══════════════╗
|
|
27
|
+
║ 82 / 100 ║
|
|
28
|
+
╚══════════════╝
|
|
29
|
+
|
|
30
|
+
Audit 42/50 ▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▱▱
|
|
31
|
+
Scout 26/30 ▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▱▱▱▱
|
|
32
|
+
Comm. 14/20 ▰▰▰▰▰▰▰▰▰▰▰▰▰▰▱▱▱▱▱▱
|
|
33
|
+
|
|
34
|
+
┌───────────────────────────────────────────────────────┐
|
|
35
|
+
│ ↑ 80+ edge functions · LCP 1.4s · 50 RLS policies │
|
|
36
|
+
│ ↑ Brief integrity 9/10 · all 6 sections answered │
|
|
37
|
+
│ ↑ Tech layers 6 · full-stack evidence │
|
|
38
|
+
│ ↓ Accessibility 72 · buttons missing aria-labels │
|
|
39
|
+
│ ↓ No API rate limiting on /auth endpoint │
|
|
40
|
+
└───────────────────────────────────────────────────────┘
|
|
41
|
+
|
|
42
|
+
Ranked #3 of 47 Season Zero
|
|
43
|
+
Tier Honors (top 5%)
|
|
44
|
+
Δ +12 since yesterday's audit
|
|
45
|
+
|
|
46
|
+
→ commit.show/projects/bfe11d75-dc67-…
|
|
47
|
+
commit.show
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
> [⭐ Star us on GitHub](https://github.com/commitshow/cli) if `commitshow audit` saved you a `// TODO`.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Why
|
|
55
|
+
|
|
56
|
+
Vibe-coded projects ship fast and break differently. The CLI gives you a
|
|
57
|
+
**zero-config**, **walk-on** lane to commit.show's audit engine — the same
|
|
58
|
+
Claude-grade analysis used in our 3-week leagues, minus the signup, fee,
|
|
59
|
+
and league commitment. You get a snapshot of where the build sits, what's
|
|
60
|
+
strong, what's wobbling, and how it ranks against everyone else this week.
|
|
61
|
+
|
|
62
|
+
Local runs also drop `.commitshow/audit.md` and `.commitshow/audit.json`
|
|
63
|
+
into your repo, so your AI coding agent can read the report on the next
|
|
64
|
+
turn without a prompt-engineering ritual.
|
|
65
|
+
|
|
66
|
+
When a project is ready for the full season — Scout forecasts, season
|
|
67
|
+
ranking, Backstage prompt extraction, Hall of Fame — it auditions at
|
|
68
|
+
[commit.show/submit](https://commit.show/submit).
|
|
69
|
+
|
|
70
|
+
> The npm package + command is `commitshow` (no dot — npm doesn't allow
|
|
71
|
+
> it in package names). Everywhere else uses the brand **commit.show**.
|
|
72
|
+
|
|
25
73
|
## Install
|
|
26
74
|
|
|
27
75
|
```bash
|
|
28
|
-
# one-shot
|
|
76
|
+
# one-shot (recommended for trying it on someone else's repo)
|
|
29
77
|
npx commitshow@latest audit <target>
|
|
30
78
|
|
|
31
|
-
# or global
|
|
79
|
+
# or global, if you'll run it daily
|
|
32
80
|
npm i -g commitshow
|
|
33
81
|
commitshow audit <target>
|
|
34
82
|
```
|
|
35
83
|
|
|
36
|
-
Node 20
|
|
84
|
+
Requires **Node 20+**.
|
|
37
85
|
|
|
38
86
|
## Usage
|
|
39
87
|
|
|
@@ -126,12 +174,21 @@ changes do. Known keys: `project`, `score`, `standing`, `strengths`, `concerns`,
|
|
|
126
174
|
- `0.1` — ✓ read-only audit · status · `--json` · target auto-detect · sidecar files
|
|
127
175
|
- `0.2` — device-flow login · `commitshow submit` · `--watch` mode · CI exit-code gate
|
|
128
176
|
- `0.3` — `commitshow install <pack>` with {{VARIABLE}} substitution
|
|
129
|
-
- `0.4` — MCP server variant (Cursor / Claude Desktop can call commit.show tools directly
|
|
177
|
+
- `0.4` — MCP server variant (Cursor / Claude Desktop can call commit.show tools directly)
|
|
130
178
|
|
|
131
179
|
## Links
|
|
132
180
|
|
|
133
|
-
- Home
|
|
134
|
-
- Source
|
|
135
|
-
- Issues
|
|
181
|
+
- Home — <https://commit.show>
|
|
182
|
+
- Source — <https://github.com/commitshow/cli>
|
|
183
|
+
- Issues — <https://github.com/commitshow/cli/issues>
|
|
184
|
+
- The platform repo — <https://github.com/commitshow/commitshow>
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
<p align="center">
|
|
189
|
+
<strong>Built one repo at a time. <a href="https://commit.show">commit.show</a></strong>
|
|
190
|
+
</p>
|
|
136
191
|
|
|
137
|
-
|
|
192
|
+
<p align="center">
|
|
193
|
+
MIT © 2026 commit.show
|
|
194
|
+
</p>
|
package/dist/lib/render.js
CHANGED
|
@@ -138,10 +138,40 @@ export function renderAudit(view) {
|
|
|
138
138
|
const slug = p.github_url?.replace(/^https?:\/\//, '') ?? '';
|
|
139
139
|
lines.push(' ' + c.bold(c.cream(name)) + ' ' + c.muted(slug));
|
|
140
140
|
lines.push('');
|
|
141
|
+
// ── 3 strengths + 2 concerns box · errors-first reorder (2026-04-30) ──
|
|
142
|
+
// CONCERNS render before STRENGTHS · the value prop is "what your AI
|
|
143
|
+
// missed", so they lead. Score follows as the receipt below.
|
|
144
|
+
const strengths = asStringArray(snapshot?.rich_analysis?.scout_brief?.strengths, 3);
|
|
145
|
+
const concerns = asStringArray(snapshot?.rich_analysis?.scout_brief?.weaknesses, 2);
|
|
146
|
+
if (strengths.length > 0 || concerns.length > 0) {
|
|
147
|
+
const bulletWidth = CONTENT_W - 2;
|
|
148
|
+
lines.push(' ' + boxTop());
|
|
149
|
+
// Heading row inside the box · "What this build missed" lead.
|
|
150
|
+
if (concerns.length > 0) {
|
|
151
|
+
const heading = 'What this build missed';
|
|
152
|
+
lines.push(' ' + boxRow(heading.length, c.bold(c.scarlet(heading))));
|
|
153
|
+
}
|
|
154
|
+
for (const s of concerns) {
|
|
155
|
+
const txt = truncate(s, bulletWidth);
|
|
156
|
+
lines.push(' ' + boxRow(2 + txt.length, c.scarlet('↓ ') + c.cream(txt)));
|
|
157
|
+
}
|
|
158
|
+
if (strengths.length > 0) {
|
|
159
|
+
if (concerns.length > 0)
|
|
160
|
+
lines.push(' ' + boxBlank());
|
|
161
|
+
const heading = 'What it got right';
|
|
162
|
+
lines.push(' ' + boxRow(heading.length, c.bold(c.teal(heading))));
|
|
163
|
+
}
|
|
164
|
+
for (const s of strengths) {
|
|
165
|
+
const txt = truncate(s, bulletWidth);
|
|
166
|
+
lines.push(' ' + boxRow(2 + txt.length, c.teal('↑ ') + c.cream(txt)));
|
|
167
|
+
}
|
|
168
|
+
lines.push(' ' + boxBottom());
|
|
169
|
+
lines.push('');
|
|
170
|
+
}
|
|
141
171
|
// Hero score · big-digit ASCII for X-share screenshots.
|
|
142
|
-
//
|
|
143
|
-
// the
|
|
144
|
-
//
|
|
172
|
+
// Now positioned AFTER concerns/strengths · the score is the receipt
|
|
173
|
+
// for the findings above, not the lead. Always brand gold for cohesive
|
|
174
|
+
// wordmark + score brand mark.
|
|
145
175
|
const bigRows = bigText(String(total));
|
|
146
176
|
const bigWidth = bigRows[0].length;
|
|
147
177
|
const leftPad = Math.floor((58 - bigWidth) / 2);
|
|
@@ -189,39 +219,19 @@ export function renderAudit(view) {
|
|
|
189
219
|
lines.push(' ' + ` Comm. ${pad(`${p.score_community}/20`, 7)} ${scoreBar(p.score_community, 20)}`);
|
|
190
220
|
}
|
|
191
221
|
lines.push('');
|
|
192
|
-
//
|
|
193
|
-
//
|
|
194
|
-
const strengths = asStringArray(snapshot?.rich_analysis?.scout_brief?.strengths, 3);
|
|
195
|
-
const concerns = asStringArray(snapshot?.rich_analysis?.scout_brief?.weaknesses, 2);
|
|
196
|
-
if (strengths.length > 0 || concerns.length > 0) {
|
|
197
|
-
// strengths/concerns each render as `↑ ` (2 visible) + truncated line.
|
|
198
|
-
// Total visible-line budget inside the box is CONTENT_W chars; reserve
|
|
199
|
-
// 2 for the arrow + space, leaving CONTENT_W - 2 for the bullet text.
|
|
200
|
-
const bulletWidth = CONTENT_W - 2;
|
|
201
|
-
lines.push(' ' + boxTop());
|
|
202
|
-
for (const s of strengths) {
|
|
203
|
-
const txt = truncate(s, bulletWidth);
|
|
204
|
-
lines.push(' ' + boxRow(2 + txt.length, c.teal('↑ ') + c.cream(txt)));
|
|
205
|
-
}
|
|
206
|
-
for (const s of concerns) {
|
|
207
|
-
const txt = truncate(s, bulletWidth);
|
|
208
|
-
lines.push(' ' + boxRow(2 + txt.length, c.scarlet('↓ ') + c.cream(txt)));
|
|
209
|
-
}
|
|
210
|
-
lines.push(' ' + boxBottom());
|
|
211
|
-
lines.push('');
|
|
212
|
-
}
|
|
213
|
-
// ─── Vibe Coder Checklist · 7-category framework ───
|
|
222
|
+
// (concerns/strengths block moved above the score · errors-first 2026-04-30)
|
|
223
|
+
// ─── AI Coder 7 Frames · signature framework ───
|
|
214
224
|
// Render only the categories that produced an actionable status (fail /
|
|
215
225
|
// warn / pass when meaningful). N/A categories are dropped to keep the
|
|
216
|
-
// terminal output compact.
|
|
217
|
-
//
|
|
226
|
+
// terminal output compact. Surfaces the seven AI-specific failure
|
|
227
|
+
// modes generic linters miss.
|
|
218
228
|
const vc = snapshot?.github_signals?.vibe_concerns;
|
|
219
229
|
if (vc) {
|
|
220
230
|
const items = vibeChecklistLines(vc);
|
|
221
231
|
const actionable = items.filter(i => i.status !== 'na');
|
|
222
232
|
if (actionable.length > 0) {
|
|
223
233
|
lines.push(' ' + boxTop());
|
|
224
|
-
lines.push(' ' + boxRow('
|
|
234
|
+
lines.push(' ' + boxRow('AI Coder 7 Frames · what AI ships without'.length, c.bold(c.gold('AI Coder 7 Frames')) + c.muted(' · what AI ships without')));
|
|
225
235
|
lines.push(' ' + boxBlank());
|
|
226
236
|
for (const it of actionable.slice(0, 7)) {
|
|
227
237
|
const tone = it.status === 'fail' ? c.scarlet : it.status === 'warn' ? c.gold : c.teal;
|
|
@@ -364,6 +374,55 @@ function vibeChecklistLines(vc) {
|
|
|
364
374
|
else
|
|
365
375
|
out.push({ key: 'prompt_injection', status: 'pass', label: 'Prompt injection risk', detail: 'AI SDK in use · no obvious raw-input patterns' });
|
|
366
376
|
}
|
|
377
|
+
// 8. Hardcoded URLs
|
|
378
|
+
{
|
|
379
|
+
const h = vc?.hardcoded_urls;
|
|
380
|
+
if (h && h.total > 0) {
|
|
381
|
+
const ev = h.samples?.[0] ? `${h.samples[0].file} · ${h.samples[0].pattern}` : undefined;
|
|
382
|
+
out.push({ key: 'hardcoded_urls', status: 'warn', label: 'Hardcoded URLs', detail: `${h.total} file${h.total > 1 ? 's' : ''} · localhost / 127.0.0.1 baked in`, evidence: ev });
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
out.push({ key: 'hardcoded_urls', status: 'pass', label: 'Hardcoded URLs', detail: 'no localhost / dev URLs in scanned files' });
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
// 9. Mock data in production
|
|
389
|
+
{
|
|
390
|
+
const m = vc?.mock_data;
|
|
391
|
+
if (m && m.total > 0) {
|
|
392
|
+
const ev = m.samples?.[0] ? `${m.samples[0].file} · const ${m.samples[0].collection} = […]` : undefined;
|
|
393
|
+
out.push({ key: 'mock_data', status: 'warn', label: 'Mock data in prod', detail: `${m.total} file${m.total > 1 ? 's' : ''} with inline seed arrays`, evidence: ev });
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
out.push({ key: 'mock_data', status: 'pass', label: 'Mock data in prod', detail: 'no inline mock arrays in app paths' });
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
// 10. Webhook signature
|
|
400
|
+
{
|
|
401
|
+
const w = vc?.webhook_signature;
|
|
402
|
+
if (!w || w.handlers_seen === 0) {
|
|
403
|
+
out.push({ key: 'webhook_signature', status: 'na', label: 'Webhook signature', detail: 'no webhook handler files detected' });
|
|
404
|
+
}
|
|
405
|
+
else if (w.gap) {
|
|
406
|
+
out.push({ key: 'webhook_signature', status: 'fail', label: 'Webhook signature', detail: `${w.handlers_seen} handler${w.handlers_seen > 1 ? 's' : ''} · 0 HMAC verification` });
|
|
407
|
+
}
|
|
408
|
+
else if (w.verified_seen >= w.handlers_seen) {
|
|
409
|
+
out.push({ key: 'webhook_signature', status: 'pass', label: 'Webhook signature', detail: `${w.verified_seen}/${w.handlers_seen} handlers verify signature` });
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
out.push({ key: 'webhook_signature', status: 'warn', label: 'Webhook signature', detail: `${w.verified_seen}/${w.handlers_seen} handlers verify signature · partial` });
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// 11. CORS permissive
|
|
416
|
+
{
|
|
417
|
+
const c = vc?.cors_permissive;
|
|
418
|
+
if (c && c.total > 0) {
|
|
419
|
+
const ev = c.samples?.[0] ? `${c.samples[0].file} · ${c.samples[0].pattern}` : undefined;
|
|
420
|
+
out.push({ key: 'cors_permissive', status: 'warn', label: 'CORS too permissive', detail: `${c.total} file${c.total > 1 ? 's' : ''} · origin: '*' or origin: true`, evidence: ev });
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
out.push({ key: 'cors_permissive', status: 'pass', label: 'CORS too permissive', detail: "no 'origin: *' patterns detected" });
|
|
424
|
+
}
|
|
425
|
+
}
|
|
367
426
|
// Sort fail → warn → pass → na
|
|
368
427
|
const order = { fail: 0, warn: 1, pass: 2, na: 3 };
|
|
369
428
|
return out.sort((a, b) => order[a.status] - order[b.status]);
|
|
@@ -398,6 +457,21 @@ export function renderMarkdown(view) {
|
|
|
398
457
|
if (p.github_url)
|
|
399
458
|
lines.push(`_${p.github_url}_`);
|
|
400
459
|
lines.push('');
|
|
460
|
+
// errors-first markdown order (2026-04-30) · concerns + strengths
|
|
461
|
+
// BEFORE the score so the AI agent reading audit.md picks up the
|
|
462
|
+
// actionable items in its first pass.
|
|
463
|
+
if (concerns.length > 0) {
|
|
464
|
+
lines.push(`## What this build missed`);
|
|
465
|
+
for (const s of concerns)
|
|
466
|
+
lines.push(`- ${s}`);
|
|
467
|
+
lines.push('');
|
|
468
|
+
}
|
|
469
|
+
if (strengths.length > 0) {
|
|
470
|
+
lines.push(`## What it got right`);
|
|
471
|
+
for (const s of strengths)
|
|
472
|
+
lines.push(`- ${s}`);
|
|
473
|
+
lines.push('');
|
|
474
|
+
}
|
|
401
475
|
lines.push(`## Score · ${p.score_total} / 100`);
|
|
402
476
|
lines.push('');
|
|
403
477
|
lines.push(`- Audit: ${p.score_auto}/50`);
|
|
@@ -410,20 +484,8 @@ export function renderMarkdown(view) {
|
|
|
410
484
|
lines.push(`- Ranked #${standing.rank} of ${standing.total_in_season} — projected **${standing.projected_tier ?? '—'}** (top ${Math.round(standing.percentile)}%)`);
|
|
411
485
|
}
|
|
412
486
|
lines.push('');
|
|
413
|
-
if (strengths.length > 0) {
|
|
414
|
-
lines.push(`## Strengths`);
|
|
415
|
-
for (const s of strengths)
|
|
416
|
-
lines.push(`- ${s}`);
|
|
417
|
-
lines.push('');
|
|
418
|
-
}
|
|
419
|
-
if (concerns.length > 0) {
|
|
420
|
-
lines.push(`## Concerns`);
|
|
421
|
-
for (const s of concerns)
|
|
422
|
-
lines.push(`- ${s}`);
|
|
423
|
-
lines.push('');
|
|
424
|
-
}
|
|
425
487
|
lines.push(`---`);
|
|
426
|
-
lines.push(`
|
|
488
|
+
lines.push(`Audited on commit.show · https://commit.show/projects/${p.id}`);
|
|
427
489
|
lines.push('');
|
|
428
490
|
return lines.join('\n');
|
|
429
491
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "commitshow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "commit.show CLI — audit any vibe-coded project from your terminal.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -23,15 +23,21 @@
|
|
|
23
23
|
"commit.show",
|
|
24
24
|
"audit",
|
|
25
25
|
"vibe-coding",
|
|
26
|
-
"cli"
|
|
26
|
+
"cli",
|
|
27
|
+
"claude-code",
|
|
28
|
+
"cursor",
|
|
29
|
+
"code-quality",
|
|
30
|
+
"developer-tools"
|
|
27
31
|
],
|
|
28
32
|
"author": "commit.show",
|
|
29
33
|
"license": "MIT",
|
|
30
34
|
"homepage": "https://commit.show",
|
|
31
35
|
"repository": {
|
|
32
36
|
"type": "git",
|
|
33
|
-
"url": "https://github.com/
|
|
34
|
-
|
|
37
|
+
"url": "https://github.com/commitshow/cli"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/commitshow/cli/issues"
|
|
35
41
|
},
|
|
36
42
|
"dependencies": {
|
|
37
43
|
"kleur": "^4.1.5"
|