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.
Files changed (3) hide show
  1. package/README.md +82 -25
  2. package/dist/lib/render.js +103 -41
  3. package/package.json +10 -4
package/README.md CHANGED
@@ -1,39 +1,87 @@
1
- # commit.show CLI
1
+ <h1 align="center">commit.show CLI</h1>
2
2
 
3
- > Audit any vibe-coded project from your terminal — the **walk-on** lane.
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
- The official CLI for **[commit.show](https://commit.show)**. A walk-on
6
- drops in, gets scored, and leaves — no signup, no audition fee, no league
7
- entry. You get the same Claude-grade analysis used in the full season
8
- (Audit / Scout / Community breakdown, 3 strengths + 2 concerns, rank,
9
- delta since the last snapshot). Local runs also save `.commitshow/audit.md`
10
- so your AI coding agent can read the report in the next turn and iterate.
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 · §15-C.6)
177
+ - `0.4` — MCP server variant (Cursor / Claude Desktop can call commit.show tools directly)
130
178
 
131
179
  ## Links
132
180
 
133
- - Home: <https://commit.show>
134
- - Source: <https://github.com/hans1329/vibe/tree/main/packages/cli>
135
- - Issues: <https://github.com/hans1329/vibe/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
- MIT © 2026 commit.show
192
+ <p align="center">
193
+ MIT © 2026 commit.show
194
+ </p>
@@ -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
- // Always brand gold (slightly deeper tone for screenshot legibility) so
143
- // the wordmark + score read as one cohesive brand mark. Band info is
144
- // surfaced in the small caption underneath instead of via color.
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
- // 3 strengths + 2 concerns from scout_brief · §15-C.2 content contract.
193
- // Web surfaces the full 5+3; the CLI keeps it tight for terminal screenshots.
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. Helps beginners see "the 7 things AI-coded
217
- // projects miss" framework directly in the report.
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('Vibe Coder Checklist · 7 things AI-coded projects miss'.length, c.bold(c.gold('Vibe Coder Checklist')) + c.muted(' · 7 things AI-coded projects miss')));
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(`Auditioned on commit.show · https://commit.show/projects/${p.id}`);
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.2.11",
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/hans1329/vibe",
34
- "directory": "packages/cli"
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"