shippingszn 0.9.7 → 0.10.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 (4) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +117 -32
  3. package/dist/index.js +1744 -1913
  4. package/package.json +5 -8
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 shippingszn llc
3
+ Copyright (c) 2026 Ryan Zaucha
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,27 +1,46 @@
1
1
  # shippingszn
2
2
 
3
- Primary local launch inspector for AI-built apps. Run it inside the app you are
4
- about to ship to catch the launch debt AI builders commonly miss: leaked API
5
- keys, missing crawl assets, weak browser defenses, dangerous code patterns, and
6
- last-mile polish gaps.
3
+ `shippingszn` is a local, read-only launch-readiness scanner for apps built with
4
+ AI. It runs inside the project you are about to ship and reads your files to
5
+ catch the launch debt AI builders commonly miss — leaked API keys, missing crawl
6
+ assets, weak browser defenses, dangerous code patterns, unguarded routes, and
7
+ last-mile polish gaps — then prints a 0-100 readiness score, a launch verdict,
8
+ and every finding with the file and line it came from. It never writes to your
9
+ project and needs no account to run.
10
+
11
+ ## Install / usage
7
12
 
8
13
  ```bash
9
- npx shippingszn@latest
14
+ npx shippingszn@latest # scan the current directory
15
+ npx shippingszn@latest ./path # scan a specific directory
16
+ npx shippingszn@latest --no-telemetry # run fully offline, zero network calls
10
17
  # or
11
18
  pnpm dlx shippingszn@latest
12
19
  ```
13
20
 
14
- The CLI **never writes, modifies, or deletes** any files - it only reads.
15
- Normal runs create a locked scan handoff for checkout and send one anonymous
16
- Wall report-card summary with score, severity counts, files scanned, scanner
17
- version, and safe stack tags. It never uploads source code, repo URLs, project
18
- names, secrets, handles, or emails. Finding-level detail stays out of public
19
- CLI/Wall output and opens inside the paid Launch Fix Kit.
20
-
21
- Human output starts with a verdict, a higher-is-better Readiness Score,
22
- severity counts, a short plain-English launch-risk explanation, completed
23
- checks, and the locked Fix Kit handoff. Run with `--json` to get the same
24
- score-and-counts summary in a machine-readable shape:
21
+ This is the open-source scanner. The optional paid **Launch Fix Kit** — the
22
+ remediation layer with per-finding fixes, prompts to paste straight into your AI
23
+ builder, the 58-item launch workbook, unlimited re-scans, and launch monitoring
24
+ — lives at <https://shippingszn.com/fix-kit>. The scanner is free and always
25
+ will be; the Fix Kit is how you fix what it finds.
26
+
27
+ The CLI **never writes, modifies, or deletes** any files - it only reads. (The
28
+ one exception is a tiny first-run marker under your config dir,
29
+ `~/.config/shippingszn/seen`, used to show the telemetry notice once.) By
30
+ default each run makes two anonymous requests: a scan handoff for checkout that
31
+ carries finding-level detail (severity, checklist item, `file:line`, and a short
32
+ evidence snippet — secret values always redacted before upload), and an
33
+ aggregate Wall summary with score, severity counts, files scanned, scanner
34
+ version, and safe stack tags. Neither uploads full source files, repo URLs,
35
+ project names, unredacted secrets, handles, or emails. Pass `--no-telemetry` to
36
+ run fully offline (zero network calls). Details in [Telemetry](#telemetry).
37
+
38
+ **The free scan is the full diagnosis.** Human output prints a verdict, a
39
+ higher-is-better Readiness Score, severity counts, and **every finding grouped
40
+ by severity** — its severity, the checklist item it maps to, the `file:line`,
41
+ and what's wrong — plus completed-checks coverage and the Fix Kit CTA. Run with
42
+ `--json` to get the same in a machine-readable shape, including the full
43
+ `findings` array:
25
44
 
26
45
  ```json
27
46
  {
@@ -30,7 +49,19 @@ score-and-counts summary in a machine-readable shape:
30
49
  "counts": { "critical": 0, "high": 11, "medium": 1, "lower": 1 },
31
50
  "filesScanned": 128,
32
51
  "coverage": { "checksCompleted": 19, "checklistAreas": 51 },
33
- "detailsLocked": true,
52
+ "scannerVersion": "0.10.0",
53
+ "findings": [
54
+ {
55
+ "checkId": "hardcoded-secrets",
56
+ "itemId": "secrets",
57
+ "severity": "high",
58
+ "itemTitle": "Lock up your API keys and passwords",
59
+ "file": "src/lib/config.ts",
60
+ "line": 12,
61
+ "message": "Possible hardcoded API key detected.",
62
+ "permalink": "https://shippingszn.com/i/secrets"
63
+ }
64
+ ],
34
65
  "unlockUrl": "https://shippingszn.com/fix-kit?scanResultId=00000000-0000-4000-8000-000000000123",
35
66
  "scanHandoff": {
36
67
  "status": "uploaded",
@@ -40,15 +71,37 @@ score-and-counts summary in a machine-readable shape:
40
71
  }
41
72
  ```
42
73
 
43
- Finding titles, files, evidence, AI-builder punch list, and verification steps
44
- are paid. The free CLI explains why the score matters, but the actual fixes
45
- unlock inside the Launch Fix Kit.
74
+ The findings are free. What's **paid** is the remediation layer: per-finding fix
75
+ instructions, prompts to paste straight into your AI builder, the 58-item launch
76
+ workbook, unlimited re-scans, and launch monitoring. The free CLI tells you
77
+ exactly what's wrong; the Launch Fix Kit is how you fix it.
78
+
79
+ ## Telemetry
80
+
81
+ Plain `npx shippingszn@latest` makes **two** anonymous requests per run:
46
82
 
47
- ## Aggregate summary
83
+ 1. **Scan handoff** (`POST /api/scan-results`) — powers the `/fix-kit` link the
84
+ CLI prints. It carries finding-level detail: each finding's severity, the
85
+ checklist item it maps to, its `file:line` location, and a short evidence
86
+ snippet from the matched line. Secret values are always redacted to a
87
+ `abc123…x9z2` form before upload. It does not include your repo URL, project
88
+ name, or full source files.
89
+ 2. **Aggregate Wall summary** (`POST /api/wall`) — intentionally small: score,
90
+ launch label, files scanned, finding counts by severity, detected stack
91
+ tags, scanner version, and timestamp. No paths, no filenames, no
92
+ finding-level detail.
93
+
94
+ On the **first run on a machine**, the CLI prints a description of both requests
95
+ plus the exact aggregate payload (to stderr, so it never corrupts `--json`
96
+ output) and a note that you can turn it off. Telemetry is default-on but fully
97
+ transparent and opt-out-able:
98
+
99
+ ```bash
100
+ npx shippingszn@latest --no-telemetry # zero network calls, fully offline
101
+ ```
48
102
 
49
- Plain `npx shippingszn@latest` sends the Wall summary automatically. The stored
50
- row is anonymous and intentionally small: score, launch label, files scanned,
51
- finding counts by severity, detected stack tags, scanner version, and timestamp.
103
+ `--no-wall` is an alias for `--no-telemetry`. With telemetry off, the CLI makes
104
+ **no** scan-handoff upload and **no** Wall ping.
52
105
 
53
106
  The same run also creates a scan-specific paid-report handoff. The terminal
54
107
  prints a `/fix-kit?scanResultId=...` URL so checkout can carry that scan into
@@ -79,10 +132,38 @@ maps back to one of the items on the checklist.
79
132
  - Placeholder content (`lorem ipsum`, `John Doe`, `test@example.com`) and
80
133
  `TODO` / `FIXME` / `XXX` / `HACK` comments.
81
134
 
82
- Internally each finding is tagged Critical, High, Medium, or Lower and maps to
83
- the relevant checklist item. The free CLI output keeps that finding-level detail
84
- locked; the Fix Kit turns it into the human launch decision and AI-builder punch
85
- list.
135
+ Each finding is tagged Critical, High, Medium, or Lower and maps to the relevant
136
+ checklist item. All of that finding-level detail is free and printed on every
137
+ run; the Fix Kit turns it into the human launch decision and AI-builder punch
138
+ list of fixes.
139
+
140
+ ## Scoring
141
+
142
+ The 0-100 Readiness Score is not a black box. Each finding subtracts a fixed
143
+ number of penalty points from 100 based on its severity:
144
+
145
+ | Severity | Penalty per finding |
146
+ | -------- | ------------------- |
147
+ | Critical | 35 |
148
+ | High | 22 |
149
+ | Medium | 10 |
150
+ | Lower | 5 |
151
+
152
+ The raw score is `100 - (sum of all penalties)`, clamped to the `0-100` range.
153
+ The score is then floored into a severity band so the number can never contradict
154
+ the verdict — the most severe finding present sets the band ceiling:
155
+
156
+ | Band | Score range | Trigger |
157
+ | -------------------- | ----------- | ----------------------------------------- |
158
+ | Fix now (no-go) | 0-59 | any Critical finding caps the score at 59 |
159
+ | Fix-first | 60-79 | any High finding (no Critical) caps at 79 |
160
+ | Verify before launch | 80-89 | any Medium finding (no Critical/High) |
161
+ | Launchable | 90-100 | only Lower findings, or a clean scan |
162
+
163
+ So one Critical finding alone drops you to at most 59 ("Fix now") regardless of
164
+ how few findings there are; a single High caps you at 79 ("Fix-first"). Count
165
+ pressure moves the score inside its band. The CLI runs with no source-side score
166
+ cap — the score you see is the severity-banded score.
86
167
 
87
168
  ## Suppressing false positives
88
169
 
@@ -132,7 +213,10 @@ rerun loop before you ship.
132
213
  shippingszn [path] [options]
133
214
 
134
215
  Options:
135
- --json Output a machine-readable JSON summary.
216
+ --json Output a machine-readable JSON summary (includes the
217
+ full findings array).
218
+ --no-telemetry Run fully offline: no scan handoff, no Wall ping, zero
219
+ network calls. (--no-wall is an alias.)
136
220
  --proof Backward-compatible alias. Normal runs already return
137
221
  a scan-specific Launch Fix Kit URL.
138
222
  --base-url <url> Base URL used to build checkout and Fix Kit links.
@@ -156,17 +240,18 @@ This makes the CLI suitable for CI:
156
240
  ```
157
241
 
158
242
  For PR scan signal, have GitHub Actions run the scanner and post the JSON
159
- summary as a comment: score, severity counts, and unlock URL.
243
+ summary as a comment: score, severity counts, findings, and unlock URL.
160
244
 
161
245
  ## Privacy
162
246
 
163
247
  `shippingszn` reads files on your machine. It never uploads source code. By
164
- default it creates a locked scan handoff for checkout and makes one best-effort
248
+ default it creates a scan handoff for checkout and makes one best-effort
165
249
  outbound request to post anonymous Wall stats: score, launch label, files
166
250
  scanned count, finding counts by severity, detected stack tags, scanner version,
167
251
  and timestamp. Wall stats never include source code, file paths, filenames,
168
252
  project names, repo URLs, secrets, emails, handles, finding titles, evidence, or
169
- report contents. The Wall summary is automatic and not user-configurable.
253
+ report contents. The first run on a machine prints the exact payload to stderr,
254
+ and `--no-telemetry` (alias `--no-wall`) turns off all network calls.
170
255
 
171
256
  ## License
172
257