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.
- package/README.md +67 -225
- package/dist/index.js +2297 -102
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,257 +1,99 @@
|
|
|
1
1
|
# shippingszn
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
-
```
|
|
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
|
-
|
|
94
|
-
|
|
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
|
-
|
|
98
|
-
|
|
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
|
-
##
|
|
34
|
+
## Local AI visibility with BYOK
|
|
136
35
|
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
180
|
-
// shippingszn:ignore-next-line
|
|
181
|
-
const greeting = "hello placeholder";
|
|
182
|
-
```
|
|
60
|
+
## Privacy and telemetry
|
|
183
61
|
|
|
184
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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
|
-
|
|
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
|
-
|
|
208
|
-
|
|
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
|
|
227
|
-
- `1
|
|
228
|
-
- `2
|
|
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
|
-
|
|
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
|
-
##
|
|
97
|
+
## Business knowledge
|
|
256
98
|
|
|
257
|
-
|
|
99
|
+
[Business documentation](docs/business/README.md) explains this component, its public source contract, and known limits independently of agent configuration.
|