shippingszn 0.11.0 → 0.12.0

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 +67 -225
  2. package/dist/index.js +2297 -102
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -1,257 +1,99 @@
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
+ Free, read-only launch inspection for AI-built apps. It finds common launch
4
+ blockers and gives you the evidence, fix instructions, AI-builder prompt, and
5
+ verification step for every finding.
7
6
 
8
7
  ```bash
9
8
  npx shippingszn@latest
10
- # or
11
- pnpm dlx shippingszn@latest
12
9
  ```
13
10
 
14
- The CLI **never writes, modifies, or deletes** any files - it only reads. (The
15
- one exception is a tiny first-run marker under your config dir,
16
- `~/.config/shippingszn/seen`, used to show the telemetry notice once.) By
17
- default each run creates a scan handoff for checkout and sends one anonymous
18
- Wall report-card summary with score, severity counts, files scanned, scanner
19
- version, and safe stack tags. The handoff includes a stable opaque project
20
- fingerprint so shippingszn can recognize matched paid rescans without receiving
21
- the repo URL, project name, or absolute project path. It never uploads matched
22
- source lines, source-file contents, unredacted secrets, handles, or emails.
23
- Pass `--no-telemetry` to run fully offline (zero network calls).
11
+ Normal scans include the complete result in the terminal and in `--json`; no
12
+ finding is hidden behind payment.
24
13
 
25
- **The free scan is the launch scoreboard.** Its result contains only a verdict,
26
- a higher-is-better Readiness Score, severity counts, and a launch band. It does
27
- not reveal finding titles, checklist content, file paths, evidence, fix steps,
28
- or AI-builder prompts. The Fix Kit CTA and locked handoff metadata stay visible
29
- so the matched project can be purchased. Run with `--json` to get the same
30
- score-level result in a machine-readable shape:
14
+ ## Launch scan
31
15
 
32
- ```json
33
- {
34
- "score": 60,
35
- "band": "fix_first",
36
- "counts": { "critical": 0, "high": 11, "medium": 1, "lower": 1 },
37
- "filesScanned": 128,
38
- "scannerVersion": "0.11.0",
39
- "detailsLocked": true,
40
- "unlockUrl": "https://shippingszn.com/fix-kit?scanResultId=00000000-0000-4000-8000-000000000123",
41
- "scanHandoff": {
42
- "status": "uploaded",
43
- "resultId": "00000000-0000-4000-8000-000000000123",
44
- "unlockUrl": "https://shippingszn.com/fix-kit?scanResultId=00000000-0000-4000-8000-000000000123"
45
- }
46
- }
47
- ```
48
-
49
- ### Upgrading from 0.10.x
50
-
51
- Version 0.11 intentionally removes the `findings` array from free human and
52
- JSON output. JSON responses now set `detailsLocked` to `true` and expose only
53
- the score, severity counts, launch band, and paid handoff metadata. The 0.10
54
- line is superseded and unsupported; consumers of its old finding-level JSON
55
- must migrate to the score-level 0.11 contract.
56
-
57
- One $49 Launch Fix Kit is bound to one matched project. It includes the exact
58
- findings, file evidence, per-finding fix instructions, AI-builder prompts, the
59
- full 58-item launch workbook, and unlimited matched re-scans for that project.
60
- One global Codex OAuth connection works from any local Codex project, but paid
61
- data for an unrelated project is denied. Checkout purchases the Fix Kit but
62
- does not sign you in; OTP sign-in is required before paid report or OAuth
63
- access. Compatible legacy purchases that predate secure project binding can be
64
- linked once from Account when their original repository scan and paid report
65
- context are still available: run a fresh score-only scan in the exact project,
66
- select the exact owned purchase, and permanently confirm that one project. If
67
- Account says that context is missing or incompatible, use
68
- https://shippingszn.com/support#codex-mcp for a manual access review. Recurring
69
- launch monitoring is a separate product and is not included in the Fix Kit.
70
-
71
- ## Telemetry
72
-
73
- Plain `npx shippingszn@latest` makes **two** telemetry requests per run. The
74
- locked handoff is pseudonymous; the Wall ping is anonymous:
75
-
76
- 1. **Scan handoff** (`POST /api/scan-results`) — powers the `/fix-kit` link the
77
- CLI prints. It carries a stable pseudonymous project fingerprint used only
78
- to match paid rescans and enforce one-project access. It also carries each
79
- finding's severity, checklist item, `file:line` location, and a short derived
80
- or redacted evidence category. It never carries matched source lines,
81
- source-file contents, the repo URL, project name, absolute project path, or
82
- unredacted secret values.
83
- 2. **Aggregate Wall ping** (`POST /api/wall`) — intentionally small: score,
84
- launch label, files scanned, finding counts by severity, detected stack
85
- tags, scanner version, and timestamp. No paths, no filenames, no
86
- finding-level detail.
87
-
88
- On the **first run on a machine**, the CLI prints a description of both requests,
89
- including the stable project fingerprint category, plus the exact aggregate
90
- payload (to stderr, so it never corrupts `--json` output) and a note that you
91
- can turn it off. Telemetry is default-on but fully transparent and opt-out-able:
16
+ ```text
17
+ shippingszn [path] [options]
92
18
 
93
- ```bash
94
- npx shippingszn@latest --no-telemetry # zero network calls, fully offline
19
+ --json Machine-readable score, findings, and report status.
20
+ --no-telemetry Fully offline: no private report upload or Wall ping.
21
+ --no-wall Alias for --no-telemetry.
22
+ --proof Backward-compatible alias; uploads are on by default.
23
+ --base-url <url> Base URL for report and checklist links.
24
+ --cwd <path> Directory to scan. Default: current directory.
25
+ --no-color Disable terminal colors.
26
+ -h, --help Show help.
27
+ -v, --version Print version.
95
28
  ```
96
29
 
97
- `--no-wall` is an alias for `--no-telemetry`. With telemetry off, the CLI makes
98
- **no** scan-handoff upload and **no** Wall ping.
99
-
100
- The same run also creates a scan-specific paid-report handoff. The terminal
101
- prints a `/fix-kit?scanResultId=...` URL so checkout can carry that scan into
102
- the project-bound Launch Fix Kit after purchase. Checkout does not sign you in;
103
- complete OTP sign-in to open the paid Kit. `--proof` is still accepted for old
104
- docs, but it is no longer required.
105
-
106
- ## What gets checked
107
-
108
- The initial check set is intentionally small and high-signal. Each finding
109
- maps back to one of the items on the checklist.
110
-
111
- - Hardcoded API keys across many providers (OpenAI, Anthropic, Stripe, AWS,
112
- Google, GitHub, Slack, private key blocks).
113
- - `.env` present but not ignored in `.gitignore`, or `.env` present but no
114
- `.env.example`.
115
- - Missing `.gitignore`, `robots.txt`, `sitemap.xml`, or a custom favicon.
116
- - Missing security-header middleware in common server configs.
117
- - Dangerous code patterns: unsafe HTML injection in React, runtime
118
- code-execution calls, wildcard CORS.
119
- - OTP/auth readiness signals: phone normalization, resend/cooldown behavior,
120
- anti-enumeration copy, mobile one-time-code input, delivery-smoke evidence,
121
- recovery paths, and paid report access that depends on OTP.
122
- - Python: common debug-mode slip-ups, hardcoded framework secrets, missing
123
- env-var loading.
124
- - Ruby: unsafe string rendering, hardcoded Rails secrets.
125
- - Go: `http.ListenAndServe` without TLS, hardcoded token / apiKey / secret
126
- literals.
127
- - Placeholder content (`lorem ipsum`, `John Doe`, `test@example.com`) and
128
- `TODO` / `FIXME` / `XXX` / `HACK` comments.
129
-
130
- Internally, each finding is tagged Critical, High, Medium, or Lower and maps to
131
- the relevant checklist item. The free output rolls those findings into the
132
- scoreboard. The Fix Kit opens the finding-level diagnosis, human launch
133
- decision, and AI-builder punch list.
30
+ Each finding includes its severity, title, sanitized file location and evidence,
31
+ why it blocks launch, concrete fix instructions, a prompt for your AI builder,
32
+ and a verification step. The launch workbook and private report are free too.
134
33
 
135
- ## Scoring
34
+ ## Local AI visibility with BYOK
136
35
 
137
- The 0-100 Readiness Score is not a black box. Each finding subtracts a fixed
138
- number of penalty points from 100 based on its severity:
36
+ Visibility checks call providers directly from your machine with your own API
37
+ keys. ShippingSZN never receives or stores those keys.
139
38
 
140
- | Severity | Penalty per finding |
141
- | -------- | ------------------- |
142
- | Critical | 35 |
143
- | High | 22 |
144
- | Medium | 10 |
145
- | Lower | 5 |
146
-
147
- The raw score is `100 - (sum of all penalties)`, clamped to the `0-100` range.
148
- The score is then floored into a severity band so the number can never contradict
149
- the verdict — the most severe finding present sets the band ceiling:
150
-
151
- | Band | Score range | Trigger |
152
- | -------------------- | ----------- | ----------------------------------------- |
153
- | Fix now (no-go) | 0-59 | any Critical finding caps the score at 59 |
154
- | Fix-first | 60-79 | any High finding (no Critical) caps at 79 |
155
- | Verify before launch | 80-89 | any Medium finding (no Critical/High) |
156
- | Launchable | 90-100 | only Lower findings, or a clean scan |
157
-
158
- So one Critical finding alone drops you to at most 59 ("Fix now") regardless of
159
- how few findings there are; a single High caps you at 79 ("Fix-first"). Count
160
- pressure moves the score inside its band. The CLI runs with no source-side score
161
- cap — the score you see is the severity-banded score.
162
-
163
- ## Suppressing false positives
39
+ ```bash
40
+ export OPENAI_API_KEY=...
41
+ export ANTHROPIC_API_KEY=...
42
+ npx shippingszn@latest visibility https://example.com
164
43
 
165
- Two opt-out mechanisms, both off by default:
44
+ # Non-interactive execution requires explicit confirmation:
45
+ npx shippingszn@latest visibility https://example.com \
46
+ --engines openai,anthropic --yes --output ./shippingszn-visibility
47
+ ```
166
48
 
167
- - **`.gitignore` is respected.** Files your repo gitignores (build output,
168
- generated reports, local `.env`, vendored sub-projects) are skipped.
169
- This works automatically inside any git repo; outside a git repo the
170
- scanner falls back to walking the full directory.
171
- - **Inline ignore markers.** For one-off cases where a file legitimately
172
- contains a pattern the scanner detects (a regex literal, copy that
173
- describes a placeholder, a test fixture), add one of:
49
+ The preflight lists selected and missing providers, prompt count, maximum call
50
+ count, and warns that your provider account may be charged. Compiled limits are
51
+ five prompts per provider, fifteen answer calls total, concurrency of two, one
52
+ retry for transient failures, and a 45-second request timeout.
174
53
 
175
- ```ts
176
- // shippingszn:ignore — placed on the same line as the match
177
- const x = "lorem ipsum"; // shippingszn:ignore — fixture text
54
+ Keys are accepted only through `OPENAI_API_KEY` and `ANTHROPIC_API_KEY`.
55
+ Credential command-line flags are rejected because process listings and shell
56
+ history can expose them. Reports stay local by default and are written as JSON
57
+ and Markdown into a new or empty output directory. Missing providers produce
58
+ explicit partial coverage; ShippingSZN never substitutes its own account.
178
59
 
179
- // shippingszn:ignore-next-line — placed on the line above the match
180
- // shippingszn:ignore-next-line
181
- const greeting = "hello placeholder";
182
- ```
60
+ ## Privacy and telemetry
183
61
 
184
- Markers apply to substring/regex checks (placeholder content, dangerous
185
- patterns, language patterns). They deliberately do **not** apply to
186
- hardcoded-secret detection — false positives there should be addressed
187
- by removing the secret pattern, not by allowlisting.
62
+ By default a launch scan makes two sanitized requests:
188
63
 
189
- ## What does NOT get checked
64
+ 1. A private scan handoff creates a high-entropy report URL. It includes a
65
+ pseudonymous project fingerprint, score, safe finding metadata, and sanitized
66
+ locations/evidence. It excludes the repository URL, project name, absolute
67
+ path, matched source lines, file contents, and secrets.
68
+ 2. An anonymous Wall ping includes aggregate score, band, finding counts, file
69
+ count, scanner version, timestamp, and safe stack tags.
190
70
 
191
- These are deliberately out of scope for v1:
71
+ The first run explains both requests. Use `--no-telemetry` for zero network
72
+ calls. Local visibility responses are not included in either request.
192
73
 
193
- - Anything that requires running your app (no live HTTP probing, no auth
194
- flows).
195
- - Auto-fixing problems. The CLI is read-only.
196
- - Deep static analysis or language-specific lints. Use ESLint, Semgrep, or
197
- Snyk for that.
198
- - Validating your actual third-party dashboards (Stripe spend caps, OpenAI
199
- quotas, etc.).
74
+ ## Coverage
200
75
 
201
- A clean report is **not** a launch certificate — it just means none of the
202
- obvious things tripped a tripwire. Use the Fix Kit, owner-verification items, and
203
- rerun loop before you ship.
76
+ Checks include hardcoded credentials, environment-file exposure, crawl assets,
77
+ browser defenses, unsafe code patterns, auth/OTP readiness, rate limits,
78
+ paid-API spend guards, uploads, payment webhook validation, dependency
79
+ integrity, monitoring, legal pages, placeholder content, and unfinished-work
80
+ markers.
204
81
 
205
- ## Usage
82
+ The scanner respects `.gitignore`. Inline `shippingszn:ignore` and
83
+ `shippingszn:ignore-next-line` markers suppress eligible code-pattern findings;
84
+ hardcoded-secret findings cannot be suppressed.
206
85
 
207
- ```text
208
- shippingszn [path] [options]
209
-
210
- Options:
211
- --json Output a machine-readable score, severity counts, and
212
- launch band summary.
213
- --no-telemetry Run fully offline: no scan handoff, no Wall ping, zero
214
- network calls. (--no-wall is an alias.)
215
- --proof Backward-compatible alias. Normal runs already return
216
- a scan-specific Launch Fix Kit URL.
217
- --base-url <url> Base URL used to build checkout and Fix Kit links.
218
- --cwd <path> Directory to scan. Default: current working directory.
219
- --no-color Disable ANSI colors in the human-readable summary.
220
- -h, --help Show help.
221
- -v, --version Print version.
222
- ```
86
+ A clean result is not a launch certificate. Runtime behavior, provider
87
+ dashboards, and authenticated journeys still require end-user verification.
223
88
 
224
89
  ## Exit codes
225
90
 
226
- - `0` — No critical findings.
227
- - `1` — One or more critical findings detected.
228
- - `2` — The scanner itself crashed.
229
-
230
- This makes the CLI suitable for CI:
231
-
232
- ```yaml
233
- # .github/workflows/launch-check.yml
234
- - run: npx shippingszn@latest --json > launch-check.json
235
- ```
236
-
237
- For PR scan signal, have GitHub Actions run the scanner and post the JSON
238
- summary as a comment: score, severity counts, launch band, and unlock URL.
239
-
240
- ## Privacy
91
+ - `0`: no Critical findings, or a completed visibility scan.
92
+ - `1`: one or more Critical launch findings.
93
+ - `2`: invalid input, unconfirmed visibility spend, or scanner error.
241
94
 
242
- `shippingszn` reads files on your machine. It never uploads source code. By
243
- default it makes two requests. The locked checkout handoff contains a stable
244
- pseudonymous project fingerprint plus each finding's severity, checklist item,
245
- relative file-and-line location, and short derived or redacted evidence
246
- category; it never contains matched source lines, source-file contents, an
247
- absolute project path, or unredacted secrets. The anonymous Wall request
248
- contains only score, launch label, files-scanned count, severity counts,
249
- detected stack tags, scanner version, and timestamp. It never contains file
250
- paths, filenames, project names, repo URLs, emails, handles, finding titles,
251
- evidence, or report contents. The first run on a machine prints this contract
252
- and that run's exact aggregate Wall values to stderr. `--no-telemetry` (alias
253
- `--no-wall`) turns off both requests and every other network call.
95
+ License: MIT
254
96
 
255
- ## License
97
+ ## Business knowledge
256
98
 
257
- MIT. See [LICENSE](./LICENSE).
99
+ [Business documentation](docs/business/README.md) explains this component, its public source contract, and known limits independently of agent configuration.