@extenshi/cli 0.20.0 → 0.22.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 +4 -0
- package/dist/amo-source-detect.d.ts +18 -0
- package/dist/amo-source-detect.d.ts.map +1 -0
- package/dist/amo-source-detect.js +41 -0
- package/dist/amo-source-detect.js.map +1 -0
- package/dist/amo-source.d.ts +41 -0
- package/dist/amo-source.d.ts.map +1 -0
- package/dist/amo-source.js +240 -0
- package/dist/amo-source.js.map +1 -0
- package/dist/amowebstore-md.d.ts +38 -0
- package/dist/amowebstore-md.d.ts.map +1 -0
- package/dist/amowebstore-md.js +118 -0
- package/dist/amowebstore-md.js.map +1 -0
- package/dist/auto-evidence.d.ts +100 -0
- package/dist/auto-evidence.d.ts.map +1 -0
- package/dist/auto-evidence.js +197 -0
- package/dist/auto-evidence.js.map +1 -0
- package/dist/cli.js +320 -8
- package/dist/cli.js.map +1 -1
- package/dist/edgewebstore-md.d.ts +26 -0
- package/dist/edgewebstore-md.d.ts.map +1 -0
- package/dist/edgewebstore-md.js +95 -0
- package/dist/edgewebstore-md.js.map +1 -0
- package/dist/evidence-ingest.d.ts +60 -0
- package/dist/evidence-ingest.d.ts.map +1 -0
- package/dist/evidence-ingest.js +141 -0
- package/dist/evidence-ingest.js.map +1 -0
- package/dist/expected-error.d.ts +9 -0
- package/dist/expected-error.d.ts.map +1 -1
- package/dist/expected-error.js +16 -1
- package/dist/expected-error.js.map +1 -1
- package/dist/firefox-rdp.d.ts +55 -0
- package/dist/firefox-rdp.d.ts.map +1 -0
- package/dist/firefox-rdp.js +203 -0
- package/dist/firefox-rdp.js.map +1 -0
- package/dist/gecko-id.d.ts +55 -0
- package/dist/gecko-id.d.ts.map +1 -0
- package/dist/gecko-id.js +132 -0
- package/dist/gecko-id.js.map +1 -0
- package/dist/generate-listing.d.ts +19 -8
- package/dist/generate-listing.d.ts.map +1 -1
- package/dist/generate-listing.js +66 -18
- package/dist/generate-listing.js.map +1 -1
- package/dist/icon.d.ts +18 -0
- package/dist/icon.d.ts.map +1 -1
- package/dist/icon.js +29 -20
- package/dist/icon.js.map +1 -1
- package/dist/json-ld.d.ts +89 -0
- package/dist/json-ld.d.ts.map +1 -0
- package/dist/json-ld.js +118 -0
- package/dist/json-ld.js.map +1 -0
- package/dist/landing-page.d.ts +123 -0
- package/dist/landing-page.d.ts.map +1 -0
- package/dist/landing-page.js +405 -0
- package/dist/landing-page.js.map +1 -0
- package/dist/media.d.ts +42 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +96 -0
- package/dist/media.js.map +1 -0
- package/dist/package.d.ts +163 -0
- package/dist/package.d.ts.map +1 -0
- package/dist/package.js +500 -0
- package/dist/package.js.map +1 -0
- package/dist/page.d.ts +141 -0
- package/dist/page.d.ts.map +1 -0
- package/dist/page.js +227 -0
- package/dist/page.js.map +1 -0
- package/dist/pay-contract.d.ts +20 -13
- package/dist/pay-contract.d.ts.map +1 -1
- package/dist/pay-contract.js +20 -11
- package/dist/pay-contract.js.map +1 -1
- package/dist/pay-test-cycle.d.ts +40 -0
- package/dist/pay-test-cycle.d.ts.map +1 -0
- package/dist/pay-test-cycle.js +207 -0
- package/dist/pay-test-cycle.js.map +1 -0
- package/dist/pay.d.ts +1 -1
- package/dist/pay.d.ts.map +1 -1
- package/dist/pay.js +1 -0
- package/dist/pay.js.map +1 -1
- package/dist/project.d.ts +39 -1
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +231 -20
- package/dist/project.js.map +1 -1
- package/dist/publish.d.ts +33 -0
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +113 -2
- package/dist/publish.js.map +1 -1
- package/dist/review-checks.d.ts +13 -0
- package/dist/review-checks.d.ts.map +1 -1
- package/dist/review-checks.js.map +1 -1
- package/dist/review-risk.d.ts +10 -1
- package/dist/review-risk.d.ts.map +1 -1
- package/dist/review-risk.js +1 -0
- package/dist/review-risk.js.map +1 -1
- package/dist/scan.d.ts +3 -2
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js +4 -2
- package/dist/scan.js.map +1 -1
- package/dist/screenshots-scenes.d.ts +1383 -0
- package/dist/screenshots-scenes.d.ts.map +1 -0
- package/dist/screenshots-scenes.js +276 -0
- package/dist/screenshots-scenes.js.map +1 -0
- package/dist/screenshots.d.ts +145 -0
- package/dist/screenshots.d.ts.map +1 -0
- package/dist/screenshots.js +557 -0
- package/dist/screenshots.js.map +1 -0
- package/dist/smoke.d.ts +81 -0
- package/dist/smoke.d.ts.map +1 -0
- package/dist/smoke.js +491 -0
- package/dist/smoke.js.map +1 -0
- package/dist/store-assets.d.ts +139 -0
- package/dist/store-assets.d.ts.map +1 -0
- package/dist/store-assets.js +582 -0
- package/dist/store-assets.js.map +1 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +3 -0
- package/dist/telemetry.js.map +1 -1
- package/dist/zip.d.ts +57 -0
- package/dist/zip.d.ts.map +1 -0
- package/dist/zip.js +134 -0
- package/dist/zip.js.map +1 -0
- package/package.json +4 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-evidence.d.ts","sourceRoot":"","sources":["../src/auto-evidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAMH,OAAO,EAAmB,KAAK,OAAO,EAAE,MAAM,cAAc,CAAA;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAIlD,OAAO,EAAE,KAAK,aAAa,EAAwB,MAAM,oBAAoB,CAAA;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;AAG3D,eAAO,MAAM,SAAS,GAAI,OAAO,UAAU,GAAG,MAAM,WAAqD,CAAA;AAEzG;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC/B,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,GACf,eAAe,EAAE,CAmBnB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE;IACnC,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC7B,GAAG,cAAc,EAAE,CAWnB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAAG,cAAc,EAAE,CAUxG;AAQD,KAAK,eAAe,GAAG,WAAW,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAA;AAE7D,gGAAgG;AAChG,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,eAAe,CAMlF;AAKD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IAC1C,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAA;IAClC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CACpC,GAAG,cAAc,EAAE,CAYnB;AAED,uGAAuG;AACvG,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAEnE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACtC,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,UAAU,GAAG,MAAM,CAAA;IACjC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,2DAA2D;IAC3D,eAAe,EAAE,SAAS,aAAa,EAAE,CAAA;CACzC,GAAG,cAAc,EAAE,CAwBnB;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE;IACrD,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,eAAe,EAAE,CAAA;CAC3B,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAU5B;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,GAAG,SAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBtG"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `--evidence` on `scan`, `review-risk`, `generate-listing` and `test smoke`:
|
|
3
|
+
* turn the result the command just computed into the readiness evidence kind it
|
|
4
|
+
* attests, with the digests `releaseReadiness` matches against, and record it for
|
|
5
|
+
* the project bound in this directory — through the same client path as
|
|
6
|
+
* `extenshi evidence push` (project.ts → recordAgentEvidence).
|
|
7
|
+
*
|
|
8
|
+
* The digests are the contract (shared-types/project-workspace.ts
|
|
9
|
+
* `releaseReadiness`):
|
|
10
|
+
*
|
|
11
|
+
* kind artifactDigest inputDigest locale
|
|
12
|
+
* scan sha256(zip) sha256(zip) —
|
|
13
|
+
* installed sha256(zip) sha256(zip) —
|
|
14
|
+
* permissions sha256(zip) hashMetadata(packaged manifest) —
|
|
15
|
+
* listing sha256(zip) sha256(listing file bytes) each locale
|
|
16
|
+
*
|
|
17
|
+
* `hashMetadata(manifest)` is what `release prepare` stores as manifestDigest,
|
|
18
|
+
* and `sha256(listing file)` is what `release prepare --listing <file>` stores as
|
|
19
|
+
* listingDigest — so evidence recorded here is current exactly when the release
|
|
20
|
+
* binds the same package and the same listing file.
|
|
21
|
+
*
|
|
22
|
+
* Status rules (documented in the CLI docs):
|
|
23
|
+
* scan failed on a REJECTION_LIKELY store-compliance finding or any
|
|
24
|
+
* CRITICAL security finding — the report's own "fail" verdict.
|
|
25
|
+
* permissions failed on a REJECTED review-risk finding outside the listing rules.
|
|
26
|
+
* listing failed only on a REJECTED listing-rule finding for that locale —
|
|
27
|
+
* exactly what would make `review-risk` exit non-zero. Listing rules
|
|
28
|
+
* are ADVISORY by roadmap policy (iteration 2 T9: the v3 dictionary
|
|
29
|
+
* measured a 78.7% false-positive rate) and never fail review-risk,
|
|
30
|
+
* so failing readiness on them would block releases on false
|
|
31
|
+
* positives. An advisory finding leaves the check `passed`.
|
|
32
|
+
* installed the smoke result.
|
|
33
|
+
*
|
|
34
|
+
* `permissions` and `listing` carry a `summary` (finding count, blocking count,
|
|
35
|
+
* distinct check ids) so the advisories behind a `passed` stay visible to
|
|
36
|
+
* whoever reads the record. It is sent only to a server that advertises it
|
|
37
|
+
* (project.ts → recordAgentEvidence).
|
|
38
|
+
*/
|
|
39
|
+
import { createHash } from 'node:crypto';
|
|
40
|
+
import fs from 'node:fs';
|
|
41
|
+
import { hashMetadata } from '@extenshi/contracts';
|
|
42
|
+
import { InvalidInputError } from './expected-error.js';
|
|
43
|
+
import { assembleListing } from './listing.js';
|
|
44
|
+
import { packagedBrowsersFor } from './package.js';
|
|
45
|
+
import { summarizeCompliance, summarizeReport } from './render.js';
|
|
46
|
+
import { computeVerdict } from './report.js';
|
|
47
|
+
import { loadArtifact } from './review-archive.js';
|
|
48
|
+
import { runListingOnlyChecks } from './review-checks.js';
|
|
49
|
+
const BROWSERS = ['chrome', 'edge', 'firefox'];
|
|
50
|
+
export const sha256Hex = (bytes) => createHash('sha256').update(bytes).digest('hex');
|
|
51
|
+
/**
|
|
52
|
+
* Which store(s) the evidence is for: the explicit list, else the browsers
|
|
53
|
+
* `extenshi package` recorded for these exact bytes (Chrome and Edge built from
|
|
54
|
+
* one directory are the same zip), else refuse — mislabelled evidence would
|
|
55
|
+
* satisfy the wrong release.
|
|
56
|
+
*/
|
|
57
|
+
export function evidenceBrowsers(artifactPath, artifactDigest, explicit) {
|
|
58
|
+
if (explicit) {
|
|
59
|
+
const list = explicit
|
|
60
|
+
.split(',')
|
|
61
|
+
.map((s) => s.trim().toLowerCase())
|
|
62
|
+
.filter(Boolean);
|
|
63
|
+
const bad = list.filter((s) => !BROWSERS.includes(s));
|
|
64
|
+
if (bad.length || !list.length)
|
|
65
|
+
throw new InvalidInputError(`--evidence-browser takes a comma-separated list of: ${BROWSERS.join(', ')}`);
|
|
66
|
+
return [...new Set(list)];
|
|
67
|
+
}
|
|
68
|
+
const packaged = packagedBrowsersFor(artifactPath, artifactDigest);
|
|
69
|
+
if (packaged.length)
|
|
70
|
+
return packaged;
|
|
71
|
+
throw new InvalidInputError('--evidence needs to know which store this package is for. Pass --evidence-browser chrome|edge|firefox, ' +
|
|
72
|
+
'or run it on a zip from `extenshi package`, whose extenshi-packages.json records the browser.');
|
|
73
|
+
}
|
|
74
|
+
export function scanEvidence(input) {
|
|
75
|
+
const verdict = computeVerdict(summarizeCompliance(input.body), summarizeReport(input.body));
|
|
76
|
+
const critical = summarizeReport(input.body).findings.some((f) => f.severity === 'CRITICAL');
|
|
77
|
+
const status = verdict.level === 'fail' || critical ? 'failed' : 'passed';
|
|
78
|
+
return input.browsers.map((browser) => ({
|
|
79
|
+
kind: 'scan',
|
|
80
|
+
browser,
|
|
81
|
+
artifactDigest: input.artifactDigest,
|
|
82
|
+
inputDigest: input.artifactDigest,
|
|
83
|
+
status,
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
export function smokeEvidence(input) {
|
|
87
|
+
return [
|
|
88
|
+
{
|
|
89
|
+
kind: 'installed',
|
|
90
|
+
browser: input.browser,
|
|
91
|
+
artifactDigest: input.result.sha256,
|
|
92
|
+
inputDigest: input.result.sha256,
|
|
93
|
+
status: input.result.status,
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Mirrors EVIDENCE_SUMMARY_MAX_IDS in the contract. Not imported: an installed
|
|
99
|
+
* @extenshi/contracts that predates the summary has no such export, and a
|
|
100
|
+
* missing named ESM import would stop the whole CLI from loading.
|
|
101
|
+
*/
|
|
102
|
+
const SUMMARY_MAX_IDS = 50;
|
|
103
|
+
/** Counts and distinct check ids — never finding text, which can quote listing copy or code. */
|
|
104
|
+
export function findingSummary(findings) {
|
|
105
|
+
return {
|
|
106
|
+
findingCount: findings.length,
|
|
107
|
+
blockingCount: findings.filter(isBlocking).length,
|
|
108
|
+
findingIds: [...new Set(findings.map((f) => f.check))].sort().slice(0, SUMMARY_MAX_IDS),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/** What makes `review-risk` exit non-zero (summarize → `blocking`). */
|
|
112
|
+
const isBlocking = (f) => f.verdict === 'REJECTED';
|
|
113
|
+
export function permissionsEvidence(input) {
|
|
114
|
+
const own = input.findings.filter((f) => !input.listingCheckIds.has(f.check));
|
|
115
|
+
const summary = findingSummary(own);
|
|
116
|
+
const inputDigest = hashMetadata(input.manifest);
|
|
117
|
+
return input.browsers.map((browser) => ({
|
|
118
|
+
kind: 'permissions',
|
|
119
|
+
browser,
|
|
120
|
+
artifactDigest: input.artifactDigest,
|
|
121
|
+
inputDigest,
|
|
122
|
+
status: summary.blockingCount ? 'failed' : 'passed',
|
|
123
|
+
summary,
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
/** Listing findings carry `[locale] field…` evidence; one without a locale applies to every locale. */
|
|
127
|
+
export function findingLocale(finding) {
|
|
128
|
+
return /^\[([^\]\s]+)\]/.exec(finding.evidence ?? '')?.[1] ?? null;
|
|
129
|
+
}
|
|
130
|
+
export function listingEvidence(input) {
|
|
131
|
+
const locales = input.listing?.locales.map((l) => l.locale) ?? [];
|
|
132
|
+
if (!locales.length)
|
|
133
|
+
throw new InvalidInputError('The listing has no locale with text, so there is nothing to attest.');
|
|
134
|
+
const inputDigest = sha256Hex(input.listingBytes);
|
|
135
|
+
return input.browsers.flatMap((browser) => locales.map((locale) => {
|
|
136
|
+
const hits = input.listingFindings.filter((f) => {
|
|
137
|
+
const at = findingLocale(f);
|
|
138
|
+
return at === null || at === locale;
|
|
139
|
+
});
|
|
140
|
+
const summary = findingSummary(hits);
|
|
141
|
+
return {
|
|
142
|
+
kind: 'listing',
|
|
143
|
+
browser,
|
|
144
|
+
locale,
|
|
145
|
+
artifactDigest: input.artifactDigest,
|
|
146
|
+
inputDigest,
|
|
147
|
+
// Advisory findings are carried in the summary, never in the status.
|
|
148
|
+
status: summary.blockingCount ? 'failed' : 'passed',
|
|
149
|
+
summary,
|
|
150
|
+
};
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* `generate-listing --evidence`: read the draft the command just wrote
|
|
155
|
+
* (CHROMEWEBSTORE.md, EDGE.md or AMO.md — one parser, keyed on headings) back
|
|
156
|
+
* over the package, run the listing rules on it and bind the evidence to that
|
|
157
|
+
* file's bytes. `browsers` is the store the draft is for.
|
|
158
|
+
*/
|
|
159
|
+
export async function generatedListingEvidence(input) {
|
|
160
|
+
const { manifest, files } = await loadArtifact(input.artifactBytes);
|
|
161
|
+
const listing = assembleListing(manifest, files, input.draftPath);
|
|
162
|
+
return listingEvidence({
|
|
163
|
+
artifactDigest: input.artifactDigest,
|
|
164
|
+
listingBytes: fs.readFileSync(input.draftPath),
|
|
165
|
+
listing,
|
|
166
|
+
browsers: input.browsers,
|
|
167
|
+
listingFindings: runListingOnlyChecks(listing),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Record the batch for the bound project and say so on stderr (stdout stays the
|
|
172
|
+
* command's own output, e.g. --json). A queued (offline) record sets exit code 1
|
|
173
|
+
* like `evidence push`; any other failure throws — the caller asked for evidence.
|
|
174
|
+
*/
|
|
175
|
+
export async function recordAutoEvidence(records, cwd = process.cwd()) {
|
|
176
|
+
if (!records.length)
|
|
177
|
+
return;
|
|
178
|
+
const { recordAgentEvidence } = await import('./project.js');
|
|
179
|
+
const result = await recordAgentEvidence(cwd, records);
|
|
180
|
+
const summary = records
|
|
181
|
+
.map((r) => {
|
|
182
|
+
const advisories = r.summary ? r.summary.findingCount - r.summary.blockingCount : 0;
|
|
183
|
+
const note = advisories ? ` (${advisories} advisory: ${r.summary?.findingIds.join(' ')})` : '';
|
|
184
|
+
return `${r.kind}${r.locale ? `:${r.locale}` : ''}/${r.browser}=${r.status}${note}`;
|
|
185
|
+
})
|
|
186
|
+
.join(', ');
|
|
187
|
+
if (!result.summaries && records.some((r) => r.summary))
|
|
188
|
+
process.stderr.write('note: this server does not store evidence summaries yet — the advisory findings above are shown here only\n');
|
|
189
|
+
if (result.status === 'pending-sync') {
|
|
190
|
+
process.stderr.write(`evidence queued (offline) for project ${result.projectId}: ${summary}. Run extenshi project sync.\n`);
|
|
191
|
+
process.exitCode = 1;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
process.stderr.write(`evidence recorded for project ${result.projectId}: ${summary}\n`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=auto-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-evidence.js","sourceRoot":"","sources":["../src/auto-evidence.ts"],"names":[],"mappings":"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"}
|