shippingszn 0.9.4 → 0.9.6
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 +6 -4
- package/dist/index.js +71 -14
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# shippingszn
|
|
2
2
|
|
|
3
3
|
Primary local scanner for shippingszn launch readiness. Run it inside the app
|
|
4
|
-
you are about to ship to catch the launch
|
|
4
|
+
you are about to ship to catch the launch debt AI builders commonly miss:
|
|
5
5
|
leaked API keys, missing crawl assets, weak browser defenses, dangerous code
|
|
6
6
|
patterns, and last-mile polish gaps.
|
|
7
7
|
|
|
@@ -18,8 +18,9 @@ version, and safe stack tags. It never uploads source code, repo URLs, project
|
|
|
18
18
|
names, secrets, handles, or emails. Finding-level detail stays out of public
|
|
19
19
|
CLI/Wall output and opens inside the paid Launch Fix Kit.
|
|
20
20
|
|
|
21
|
-
Human output starts with a Launch Debt Score,
|
|
22
|
-
|
|
21
|
+
Human output starts with a Launch Debt Score, severity counts, a short
|
|
22
|
+
plain-English launch-risk explanation, completed checks, and the locked Fix Kit
|
|
23
|
+
handoff. Run with `--json` to get the same score-and-counts summary in a
|
|
23
24
|
machine-readable shape:
|
|
24
25
|
|
|
25
26
|
```json
|
|
@@ -40,7 +41,8 @@ machine-readable shape:
|
|
|
40
41
|
```
|
|
41
42
|
|
|
42
43
|
Finding titles, files, evidence, fix prompts, and verification steps are paid.
|
|
43
|
-
|
|
44
|
+
The free CLI explains why the score matters, but the actual fixes unlock inside
|
|
45
|
+
the Launch Fix Kit.
|
|
44
46
|
|
|
45
47
|
## Aggregate summary
|
|
46
48
|
|
package/dist/index.js
CHANGED
|
@@ -3854,9 +3854,9 @@ var SCORE_BANDS = [
|
|
|
3854
3854
|
id: "blocked",
|
|
3855
3855
|
minScore: 0,
|
|
3856
3856
|
maxScore: 59,
|
|
3857
|
-
label: "
|
|
3857
|
+
label: "Fix now",
|
|
3858
3858
|
decision: "no-go",
|
|
3859
|
-
goNoGoLabel: "
|
|
3859
|
+
goNoGoLabel: "Fix now"
|
|
3860
3860
|
},
|
|
3861
3861
|
{
|
|
3862
3862
|
id: "fix_first",
|
|
@@ -4121,7 +4121,7 @@ function coverageSummary(source, coverage) {
|
|
|
4121
4121
|
}
|
|
4122
4122
|
function defaultWhy(severity, source) {
|
|
4123
4123
|
if (severity === "critical") {
|
|
4124
|
-
return `This is treated as launch
|
|
4124
|
+
return `This is treated as critical launch debt from the ${sourceLabel(source)} because it can expose users, secrets, revenue, or the primary launch surface.`;
|
|
4125
4125
|
}
|
|
4126
4126
|
if (severity === "high") {
|
|
4127
4127
|
return `This can turn a launch into a trust, security, cost, or conversion problem even if the app appears to work.`;
|
|
@@ -4240,18 +4240,18 @@ function bandFor(score, counts) {
|
|
|
4240
4240
|
}
|
|
4241
4241
|
function decisionText(band, counts, source) {
|
|
4242
4242
|
if (counts.critical > 0) {
|
|
4243
|
-
return `
|
|
4243
|
+
return `Fix now. ${counts.critical} critical finding${counts.critical === 1 ? "" : "s"} should be fixed and rescanned before more public traffic.`;
|
|
4244
4244
|
}
|
|
4245
4245
|
if (counts.high > 0) {
|
|
4246
4246
|
return `Fix the high-risk launch gaps before a real campaign, customer demo, or paid traffic.`;
|
|
4247
4247
|
}
|
|
4248
4248
|
if (counts.medium > 0 || counts.lower > 0) {
|
|
4249
|
-
return `No critical or high
|
|
4249
|
+
return `No critical or high finding was detected, but the remaining readiness gaps should be fixed and verified before treating the ${sourceLabel(source)} as day-1 ready.`;
|
|
4250
4250
|
}
|
|
4251
4251
|
if (source === "url") {
|
|
4252
|
-
return "No public-page
|
|
4252
|
+
return "No public-page critical findings were found. Run the CLI or GitHub Action before calling the app day-1 ready.";
|
|
4253
4253
|
}
|
|
4254
|
-
return `${band.goNoGoLabel}: no scan-detected
|
|
4254
|
+
return `${band.goNoGoLabel}: no scan-detected critical findings were found. Monitor first production traffic.`;
|
|
4255
4255
|
}
|
|
4256
4256
|
function topNextStep(blockers, counts, source) {
|
|
4257
4257
|
const top = blockers[0];
|
|
@@ -4262,9 +4262,9 @@ function topNextStep(blockers, counts, source) {
|
|
|
4262
4262
|
return "Run the repo scan next so secrets, auth, API routes, and generated-code risks are checked before launch.";
|
|
4263
4263
|
}
|
|
4264
4264
|
if (counts.medium > 0 || counts.lower > 0) {
|
|
4265
|
-
return "Fix the remaining readiness gaps and rescan before launch.";
|
|
4265
|
+
return "Fix the remaining readiness gaps and rescan before the next launch push.";
|
|
4266
4266
|
}
|
|
4267
|
-
return "No obvious launch
|
|
4267
|
+
return "No obvious critical launch debt caught. Monitor first production traffic and keep the paid report for higher-stakes launches.";
|
|
4268
4268
|
}
|
|
4269
4269
|
function aggregateConfidence(source, findings) {
|
|
4270
4270
|
if (findings.some((finding2) => finding2.confidence === "low")) return "low";
|
|
@@ -4325,11 +4325,11 @@ function assessLaunchReadiness(input, promptBuilder) {
|
|
|
4325
4325
|
var defaultPrompt = (input) => {
|
|
4326
4326
|
const where = input.location ? `Likely location: ${input.location}.` : "Inspect the relevant app, deploy, and configuration files before editing.";
|
|
4327
4327
|
return [
|
|
4328
|
-
"You are fixing a shippingszn launch-readiness
|
|
4328
|
+
"You are fixing a shippingszn launch-readiness finding in an AI-built app.",
|
|
4329
4329
|
`Severity: ${input.severity}.`,
|
|
4330
4330
|
`Finding: ${input.title}.`,
|
|
4331
4331
|
`What failed: ${input.whatFailed}`,
|
|
4332
|
-
`Why it
|
|
4332
|
+
`Why it matters now: ${input.whyItBlocksLaunch}`,
|
|
4333
4333
|
where,
|
|
4334
4334
|
`Fix exactly this: ${input.fixInstructions}`,
|
|
4335
4335
|
`Verification required: ${input.verificationStep}`,
|
|
@@ -4409,6 +4409,12 @@ function color(enabled) {
|
|
|
4409
4409
|
};
|
|
4410
4410
|
}
|
|
4411
4411
|
var SEVERITY_ORDER = ["critical", "high", "medium", "lower"];
|
|
4412
|
+
function pluralize(count, singular, plural = `${singular}s`) {
|
|
4413
|
+
return count === 1 ? singular : plural;
|
|
4414
|
+
}
|
|
4415
|
+
function findingVerb(count) {
|
|
4416
|
+
return count === 1 ? "is" : "are";
|
|
4417
|
+
}
|
|
4412
4418
|
function printHelp() {
|
|
4413
4419
|
process.stdout.write(
|
|
4414
4420
|
`shippingszn v${PKG_VERSION}
|
|
@@ -4632,7 +4638,7 @@ async function run() {
|
|
|
4632
4638
|
(item) => item.cliCoverage === "automated"
|
|
4633
4639
|
).length;
|
|
4634
4640
|
const SCORE_BAND_LABEL = {
|
|
4635
|
-
blocked: "
|
|
4641
|
+
blocked: "FIX NOW",
|
|
4636
4642
|
fix_first: "FIX FIRST",
|
|
4637
4643
|
verify_first: "VERIFY BEFORE LAUNCH",
|
|
4638
4644
|
launchable: "LAUNCHABLE"
|
|
@@ -4709,6 +4715,55 @@ ${c.bold("shippingszn")} ${c.dim(`v${PKG_VERSION}`)}
|
|
|
4709
4715
|
process.stdout.write(` ${c.gray(`${totals.lower} lower`)}
|
|
4710
4716
|
|
|
4711
4717
|
`);
|
|
4718
|
+
const totalFindings = totals.critical + totals.high + totals.medium + totals.lower;
|
|
4719
|
+
if (totalFindings > 0) {
|
|
4720
|
+
if (totals.critical > 0) {
|
|
4721
|
+
process.stdout.write(c.red("Critical launch debt found.\n"));
|
|
4722
|
+
process.stdout.write(
|
|
4723
|
+
`This scan found ${totalFindings} ${pluralize(totalFindings, "issue")} that should be fixed before more public traffic.
|
|
4724
|
+
|
|
4725
|
+
`
|
|
4726
|
+
);
|
|
4727
|
+
process.stdout.write(`${c.bold("What that means:")}
|
|
4728
|
+
`);
|
|
4729
|
+
process.stdout.write(
|
|
4730
|
+
c.dim(
|
|
4731
|
+
"Critical launch debt can expose users, break signup or payment paths, or make the launch unsafe until fixed.\n\n"
|
|
4732
|
+
)
|
|
4733
|
+
);
|
|
4734
|
+
} else {
|
|
4735
|
+
process.stdout.write("No critical findings found.\n");
|
|
4736
|
+
if (totals.high === 0) {
|
|
4737
|
+
process.stdout.write("No high findings found.\n");
|
|
4738
|
+
}
|
|
4739
|
+
process.stdout.write(
|
|
4740
|
+
`But ${totalFindings} ${pluralize(totalFindings, "issue")} ${findingVerb(totalFindings)} still holding this back from a clean day-1 posture.
|
|
4741
|
+
|
|
4742
|
+
`
|
|
4743
|
+
);
|
|
4744
|
+
process.stdout.write(`${c.bold("What that means:")}
|
|
4745
|
+
`);
|
|
4746
|
+
if (totals.high > 0) {
|
|
4747
|
+
process.stdout.write(
|
|
4748
|
+
c.dim(
|
|
4749
|
+
"High and medium launch debt can expose trust gaps, break conversion moments, or make the project feel unfinished.\n\n"
|
|
4750
|
+
)
|
|
4751
|
+
);
|
|
4752
|
+
} else if (totals.medium > 0) {
|
|
4753
|
+
process.stdout.write(
|
|
4754
|
+
c.dim(
|
|
4755
|
+
"Medium launch debt usually will not crash the app, but it can make users hesitate, miss conversion moments, or make the project feel unfinished.\n\n"
|
|
4756
|
+
)
|
|
4757
|
+
);
|
|
4758
|
+
} else {
|
|
4759
|
+
process.stdout.write(
|
|
4760
|
+
c.dim(
|
|
4761
|
+
"Lower launch debt usually will not break the app, but it can still make the project feel rough or unfinished.\n\n"
|
|
4762
|
+
)
|
|
4763
|
+
);
|
|
4764
|
+
}
|
|
4765
|
+
}
|
|
4766
|
+
}
|
|
4712
4767
|
process.stdout.write(`${c.bold("Coverage:")}
|
|
4713
4768
|
`);
|
|
4714
4769
|
process.stdout.write(
|
|
@@ -4716,14 +4771,16 @@ ${c.bold("shippingszn")} ${c.dim(`v${PKG_VERSION}`)}
|
|
|
4716
4771
|
|
|
4717
4772
|
`)
|
|
4718
4773
|
);
|
|
4719
|
-
if (
|
|
4774
|
+
if (totalFindings > 0) {
|
|
4720
4775
|
if (scanSpecificUnlockUrl) {
|
|
4721
4776
|
process.stdout.write(c.bold("Unlock this exact scan:\n"));
|
|
4722
4777
|
process.stdout.write(` ${c.cyan(scanSpecificUnlockUrl)}
|
|
4723
4778
|
`);
|
|
4724
4779
|
process.stdout.write(
|
|
4725
4780
|
c.dim(
|
|
4726
|
-
|
|
4781
|
+
` Includes the ${totalFindings} specific ${pluralize(totalFindings, "finding")}, file evidence, and AI-builder fix prompts.
|
|
4782
|
+
|
|
4783
|
+
`
|
|
4727
4784
|
)
|
|
4728
4785
|
);
|
|
4729
4786
|
} else {
|
package/package.json
CHANGED