@extenshi/cli 0.24.0 → 0.26.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 (97) hide show
  1. package/README.md +1 -1
  2. package/dist/amo-source.d.ts.map +1 -1
  3. package/dist/amo-source.js +5 -0
  4. package/dist/amo-source.js.map +1 -1
  5. package/dist/amowebstore-md.d.ts +39 -0
  6. package/dist/amowebstore-md.d.ts.map +1 -1
  7. package/dist/amowebstore-md.js +46 -4
  8. package/dist/amowebstore-md.js.map +1 -1
  9. package/dist/auto-update.d.ts +46 -3
  10. package/dist/auto-update.d.ts.map +1 -1
  11. package/dist/auto-update.js +94 -19
  12. package/dist/auto-update.js.map +1 -1
  13. package/dist/chromewebstore-md.d.ts +7 -0
  14. package/dist/chromewebstore-md.d.ts.map +1 -1
  15. package/dist/chromewebstore-md.js +20 -3
  16. package/dist/chromewebstore-md.js.map +1 -1
  17. package/dist/cli.js +33 -9
  18. package/dist/cli.js.map +1 -1
  19. package/dist/edgewebstore-md.d.ts +14 -0
  20. package/dist/edgewebstore-md.d.ts.map +1 -1
  21. package/dist/edgewebstore-md.js +20 -5
  22. package/dist/edgewebstore-md.js.map +1 -1
  23. package/dist/evidence-ingest.d.ts +67 -5
  24. package/dist/evidence-ingest.d.ts.map +1 -1
  25. package/dist/evidence-ingest.js +146 -21
  26. package/dist/evidence-ingest.js.map +1 -1
  27. package/dist/generate-listing.d.ts +33 -6
  28. package/dist/generate-listing.d.ts.map +1 -1
  29. package/dist/generate-listing.js +82 -19
  30. package/dist/generate-listing.js.map +1 -1
  31. package/dist/json-ld.d.ts +43 -5
  32. package/dist/json-ld.d.ts.map +1 -1
  33. package/dist/json-ld.js +53 -1
  34. package/dist/json-ld.js.map +1 -1
  35. package/dist/landing-sections.d.ts +21 -3
  36. package/dist/landing-sections.d.ts.map +1 -1
  37. package/dist/landing-sections.js +63 -17
  38. package/dist/landing-sections.js.map +1 -1
  39. package/dist/listing-data-flows.d.ts +140 -0
  40. package/dist/listing-data-flows.d.ts.map +1 -0
  41. package/dist/listing-data-flows.js +454 -0
  42. package/dist/listing-data-flows.js.map +1 -0
  43. package/dist/localize-parity.d.ts +26 -0
  44. package/dist/localize-parity.d.ts.map +1 -0
  45. package/dist/localize-parity.js +227 -0
  46. package/dist/localize-parity.js.map +1 -0
  47. package/dist/localize.d.ts +6 -0
  48. package/dist/localize.d.ts.map +1 -1
  49. package/dist/localize.js +4 -4
  50. package/dist/localize.js.map +1 -1
  51. package/dist/media.d.ts.map +1 -1
  52. package/dist/media.js +1 -2
  53. package/dist/media.js.map +1 -1
  54. package/dist/package.d.ts +13 -0
  55. package/dist/package.d.ts.map +1 -1
  56. package/dist/package.js +1 -1
  57. package/dist/package.js.map +1 -1
  58. package/dist/page.d.ts +16 -0
  59. package/dist/page.d.ts.map +1 -1
  60. package/dist/page.js +49 -4
  61. package/dist/page.js.map +1 -1
  62. package/dist/permission-justifications.d.ts +19 -1
  63. package/dist/permission-justifications.d.ts.map +1 -1
  64. package/dist/permission-justifications.js +129 -0
  65. package/dist/permission-justifications.js.map +1 -1
  66. package/dist/png.d.ts.map +1 -1
  67. package/dist/png.js +92 -34
  68. package/dist/png.js.map +1 -1
  69. package/dist/project.d.ts +17 -0
  70. package/dist/project.d.ts.map +1 -1
  71. package/dist/project.js +30 -0
  72. package/dist/project.js.map +1 -1
  73. package/dist/publish.d.ts.map +1 -1
  74. package/dist/publish.js +4 -23
  75. package/dist/publish.js.map +1 -1
  76. package/dist/review-checks.d.ts +40 -12
  77. package/dist/review-checks.d.ts.map +1 -1
  78. package/dist/review-checks.js +286 -24
  79. package/dist/review-checks.js.map +1 -1
  80. package/dist/review-render.d.ts +9 -1
  81. package/dist/review-render.d.ts.map +1 -1
  82. package/dist/review-render.js +13 -2
  83. package/dist/review-render.js.map +1 -1
  84. package/dist/review-risk.js +1 -1
  85. package/dist/review-risk.js.map +1 -1
  86. package/dist/screenshots.d.ts.map +1 -1
  87. package/dist/screenshots.js +2 -3
  88. package/dist/screenshots.js.map +1 -1
  89. package/dist/smoke.d.ts +54 -6
  90. package/dist/smoke.d.ts.map +1 -1
  91. package/dist/smoke.js +302 -26
  92. package/dist/smoke.js.map +1 -1
  93. package/dist/store-assets.d.ts +20 -3
  94. package/dist/store-assets.d.ts.map +1 -1
  95. package/dist/store-assets.js +13 -7
  96. package/dist/store-assets.js.map +1 -1
  97. package/package.json +2 -2
@@ -13,11 +13,19 @@
13
13
  * the run exists in the project's bound repository, at this commit, with this
14
14
  * conclusion, and has COMPLETED — so this must run from a `workflow_run`
15
15
  * follow-up, not inside the run it attests. Source `ci` is written only there.
16
+ *
17
+ * Beyond the action: `--run-attempt` (the follow-up's own GITHUB_RUN_ATTEMPT is
18
+ * not the attested run's), `--require-report` (attest only a package whose smoke
19
+ * report passed — a local gate, the server stores no reports yet) and `--dry-run`
20
+ * (validate and print the request, no secret needed). Neither changes the body
21
+ * or the key the action would send for the same inputs.
16
22
  */
17
23
  import { createHash, createHmac } from 'node:crypto';
18
24
  import fs from 'node:fs';
25
+ import path from 'node:path';
19
26
  import { InvalidInputError } from './expected-error.js';
20
27
  import { resolvePackagedArtifact } from './package.js';
28
+ import { ENGINE_BROWSER } from './smoke.js';
21
29
  const CI_KINDS = ['tests', 'scan', 'installed'];
22
30
  const CI_BROWSERS = ['chrome', 'firefox', 'edge'];
23
31
  const CI_CONCLUSIONS = [
@@ -38,11 +46,25 @@ export function uuidv5(name, namespace = URL_NAMESPACE) {
38
46
  const hex = hash.toString('hex');
39
47
  return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
40
48
  }
41
- /** The exact body + headers the action sends. `timestamp` is injectable for tests. */
42
- export function buildIngestRequest(input, timestamp = Date.now().toString()) {
49
+ /**
50
+ * What the idempotency key is derived from. EVERY writer of this evidence
51
+ * derives it the same way — the action (tools/extenshi-evidence-action), this
52
+ * command, and any hand-written step: an empty locale still contributes an empty
53
+ * segment (`…:chrome::<digest>`), and the attempt is the attempt of the run being
54
+ * attested. A copy that drops the empty segment or hardcodes the attempt writes a
55
+ * different key for the same evidence — the server dedupes by key, so that is a
56
+ * second record, not a replay. `--dry-run` prints this string so a copy can be
57
+ * diffed against it.
58
+ */
59
+ export function ingestIdempotencyName(parts) {
60
+ return `${parts.repository}:${parts.runId}:${parts.runAttempt}:${parts.kind}:${parts.browser}:${parts.locale ?? ''}:${parts.artifactDigest}`;
61
+ }
62
+ /** The exact body the action sends, and the key it carries. No secret is involved. */
63
+ export function buildIngestBody(input) {
43
64
  const artifactDigest = createHash('sha256').update(input.artifactBytes).digest('hex');
44
65
  const locale = input.locale ?? '';
45
- const idempotencyKey = uuidv5(`${input.repository}:${input.runId}:${input.runAttempt}:${input.kind}:${input.browser}:${locale}:${artifactDigest}`);
66
+ const idempotencyName = ingestIdempotencyName({ ...input, locale, artifactDigest });
67
+ const idempotencyKey = uuidv5(idempotencyName);
46
68
  const serverUrl = input.serverUrl ?? 'https://github.com';
47
69
  const body = JSON.stringify({
48
70
  projectId: input.projectId,
@@ -58,19 +80,77 @@ export function buildIngestRequest(input, timestamp = Date.now().toString()) {
58
80
  runUrl: `${serverUrl}/${input.repository}/actions/runs/${input.runId}`,
59
81
  reports: [],
60
82
  });
83
+ return { artifactDigest, idempotencyName, idempotencyKey, body };
84
+ }
85
+ /** The headers the action sends for `body`. `timestamp` is injectable for tests. */
86
+ export function signIngestBody(body, secret, timestamp = Date.now().toString()) {
61
87
  // The server stores only sha256(secret) and verifies with that hash.
62
- const key = createHash('sha256').update(input.secret, 'utf8').digest('hex');
88
+ const key = createHash('sha256').update(secret, 'utf8').digest('hex');
63
89
  const signature = createHmac('sha256', key).update(`${timestamp}.${body}`).digest('hex');
64
90
  return {
65
- artifactDigest,
66
- body,
67
- headers: {
68
- 'content-type': 'application/json',
69
- 'x-extenshi-timestamp': timestamp,
70
- 'x-extenshi-signature': `sha256=${signature}`,
71
- },
91
+ 'content-type': 'application/json',
92
+ 'x-extenshi-timestamp': timestamp,
93
+ 'x-extenshi-signature': `sha256=${signature}`,
72
94
  };
73
95
  }
96
+ /** The exact body + headers the action sends. */
97
+ export function buildIngestRequest(input, timestamp = Date.now().toString()) {
98
+ const built = buildIngestBody(input);
99
+ return { ...built, headers: signIngestBody(built.body, input.secret, timestamp) };
100
+ }
101
+ const sha12 = (digest) => `${digest.slice(0, 12)}…`;
102
+ /**
103
+ * `--require-report`: the package may be attested only when the smoke report of
104
+ * THIS package passed. Accepts what `extenshi test smoke --json` writes
105
+ * (`status: "passed"`, `sha256`, `browser`) and the `passed: true` + `sha256`
106
+ * shape a hand-written smoke script emits. Local gate only: the ingest schema has
107
+ * a `reports` array, but the server does not store it yet, so the report is
108
+ * checked here and not sent.
109
+ */
110
+ export function checkSmokeReport(file, artifactDigest, browser) {
111
+ let raw;
112
+ try {
113
+ raw = fs.readFileSync(file, 'utf8');
114
+ }
115
+ catch (error) {
116
+ const code = error.code;
117
+ throw new InvalidInputError(code === 'ENOENT'
118
+ ? `--require-report: ${file} does not exist — nothing is attested without the smoke report of this package.`
119
+ : `--require-report: ${file} could not be read (${code ?? error.message}).`);
120
+ }
121
+ let report;
122
+ try {
123
+ report = JSON.parse(raw);
124
+ }
125
+ catch (error) {
126
+ throw new InvalidInputError(`--require-report: ${file} is not valid JSON: ${error.message}`);
127
+ }
128
+ if (!report || typeof report !== 'object' || Array.isArray(report))
129
+ throw new InvalidInputError(`--require-report: ${file} is not a smoke report (expected a JSON object).`);
130
+ const { status, passed, sha256, browser: reported } = report;
131
+ const byStatus = typeof status === 'string' ? status === 'passed' : undefined;
132
+ const byFlag = typeof passed === 'boolean' ? passed : undefined;
133
+ // A report that carries both verdicts must agree with itself.
134
+ if (byStatus !== undefined && byFlag !== undefined && byStatus !== byFlag)
135
+ throw new InvalidInputError(`--require-report: ${file} contradicts itself (status "${status}", passed: ${passed}) — not attesting ${browser}.`);
136
+ if (!(byStatus ?? byFlag))
137
+ throw new InvalidInputError(`--require-report: ${file} does not show a pass (${byStatus === false ? `status "${status}"` : byFlag === false ? 'passed: false' : 'it has neither status nor passed'}) — not attesting ${browser}.`);
138
+ if (typeof sha256 !== 'string' || sha256.toLowerCase() !== artifactDigest)
139
+ throw new InvalidInputError(typeof sha256 === 'string'
140
+ ? `--require-report: ${file} is the smoke report of ${sha12(sha256)}, not of this package (${sha12(artifactDigest)}).`
141
+ : `--require-report: ${file} has no sha256, so it cannot be tied to this package (${sha12(artifactDigest)}).`);
142
+ // `extenshi test smoke` names the engine (chromium), the store browser is chrome.
143
+ const reportedBrowser = typeof reported === 'string' ? (ENGINE_BROWSER[reported] ?? reported) : undefined;
144
+ if (reportedBrowser && reportedBrowser !== browser)
145
+ throw new InvalidInputError(`--require-report: ${file} is a ${reported} smoke report but --browser is ${browser}.`);
146
+ return `smoke report ${path.basename(file)} passed for ${sha12(artifactDigest)}`;
147
+ }
148
+ /** The attempt of the run being attested: a positive integer, never NaN in the key. */
149
+ function parseRunAttempt(value, source) {
150
+ if (!/^[1-9][0-9]{0,8}$/.test(value.trim()))
151
+ throw new InvalidInputError(`${source} must be a positive integer (got "${value}")`);
152
+ return Number(value);
153
+ }
74
154
  export async function runEvidenceIngest(artifact, options, env = process.env) {
75
155
  if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(options.project))
76
156
  throw new InvalidInputError('--project must be the Dojo project UUID');
@@ -81,41 +161,68 @@ export async function runEvidenceIngest(artifact, options, env = process.env) {
81
161
  const conclusion = options.conclusion ?? 'success';
82
162
  if (!CI_CONCLUSIONS.includes(conclusion))
83
163
  throw new InvalidInputError(`--conclusion must be one of: ${CI_CONCLUSIONS.join(', ')}`);
84
- // A flag would put the secret in the process list and shell history.
164
+ // A flag would put the secret in the process list and shell history. A dry run
165
+ // signs and sends nothing, so it does not need one.
85
166
  const secret = env.EXTENSHI_EVIDENCE_SECRET;
86
- if (!secret)
167
+ if (!secret && !options.dryRun)
87
168
  throw new InvalidInputError('Set EXTENSHI_EVIDENCE_SECRET (the project CI ingest secret) in the environment.');
88
169
  const repository = env.GITHUB_REPOSITORY;
89
170
  const commit = options.commit || env.GITHUB_SHA;
90
171
  const runId = Number(options.runId || env.GITHUB_RUN_ID);
91
172
  if (!repository || !commit || !Number.isInteger(runId) || runId <= 0)
92
- throw new InvalidInputError('GITHUB_REPOSITORY, the commit and the run id are required — run inside GitHub Actions, and from a workflow_run follow-up pass --run-id/--commit of the completed run.');
173
+ throw new InvalidInputError('GITHUB_REPOSITORY, the commit and the run id are required — run inside GitHub Actions, and from a workflow_run follow-up pass --run-id/--run-attempt/--commit of the completed run.');
174
+ // GITHUB_RUN_ATTEMPT is the follow-up run's own, not the attested run's: a
175
+ // workflow_run follow-up passes the flag (github.event.workflow_run.run_attempt).
176
+ const runAttempt = options.runAttempt !== undefined
177
+ ? parseRunAttempt(options.runAttempt, '--run-attempt')
178
+ : parseRunAttempt(env.GITHUB_RUN_ATTEMPT || '1', 'GITHUB_RUN_ATTEMPT');
179
+ // What ciEvidenceIngestSchema checks, so a dry run fails where the request would.
180
+ if (!/^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/.test(repository))
181
+ throw new InvalidInputError(`GITHUB_REPOSITORY must be owner/repo (got "${repository}")`);
182
+ if (!/^[a-f0-9]{40,64}$/.test(commit))
183
+ throw new InvalidInputError('--commit must be the full lowercase git SHA (40 hex characters)');
184
+ if (options.locale !== undefined && (options.locale.length < 2 || options.locale.length > 35))
185
+ throw new InvalidInputError('--locale must be 2–35 characters');
93
186
  const { artifactPath } = resolvePackagedArtifact(artifact, options.browser);
94
- const request = buildIngestRequest({
187
+ const built = buildIngestBody({
95
188
  projectId: options.project,
96
189
  artifactBytes: fs.readFileSync(artifactPath),
97
- secret,
98
190
  repository,
99
191
  commit,
100
192
  runId,
101
- runAttempt: Number(env.GITHUB_RUN_ATTEMPT || '1'),
193
+ runAttempt,
102
194
  kind: options.kind,
103
195
  browser: options.browser,
104
196
  locale: options.locale,
105
197
  conclusion,
106
198
  serverUrl: env.GITHUB_SERVER_URL,
107
199
  });
200
+ // Before any request: a package without a passing smoke report is not attested.
201
+ const report = options.requireReport
202
+ ? checkSmokeReport(options.requireReport, built.artifactDigest, options.browser)
203
+ : undefined;
108
204
  const bffUrl = (options.bffUrl ?? env.EXTENSHI_BFF_URL ?? 'https://bff.extenshi.io').replace(/\/$/, '');
109
- const response = await fetch(`${bffUrl}/projects/${options.project}/evidence/ingest`, {
205
+ const result = {
206
+ artifactDigest: built.artifactDigest,
207
+ idempotencyKey: built.idempotencyKey,
208
+ idempotencyName: built.idempotencyName,
209
+ url: `${bffUrl}/projects/${options.project}/evidence/ingest`,
210
+ body: built.body,
211
+ report,
212
+ };
213
+ // `!secret` only holds in a dry run — the check above refused it otherwise.
214
+ if (options.dryRun || !secret)
215
+ return { ...result, status: null, answer: '' };
216
+ const response = await fetch(result.url, {
110
217
  method: 'POST',
111
- headers: request.headers,
112
- body: request.body,
218
+ headers: signIngestBody(built.body, secret),
219
+ body: built.body,
113
220
  signal: AbortSignal.timeout(30_000),
114
221
  });
115
222
  const answer = await response.text().catch(() => '');
116
223
  if (!response.ok)
117
224
  throw new Error(`ingest rejected (${response.status}): ${answer.slice(0, 500)}`);
118
- return { artifactDigest: request.artifactDigest, status: response.status, answer };
225
+ return { ...result, status: response.status, answer };
119
226
  }
120
227
  export function registerEvidenceIngest(program, run) {
121
228
  const evidence = program.commands.find((c) => c.name() === 'evidence') ?? program.command('evidence');
@@ -129,11 +236,29 @@ export function registerEvidenceIngest(program, run) {
129
236
  .option('--locale <locale>', 'Optional locale the evidence is scoped to')
130
237
  .option('--conclusion <conclusion>', 'Run conclusion to attest (the server cross-checks it)', 'success')
131
238
  .option('--run-id <id>', 'The completed run to attest (default GITHUB_RUN_ID — rejected while in progress)')
239
+ .option('--run-attempt <n>', 'Attempt of that run (default GITHUB_RUN_ATTEMPT, which in a workflow_run follow-up is the ' +
240
+ "follow-up's own — pass github.event.workflow_run.run_attempt); part of the idempotency key")
132
241
  .option('--commit <sha>', 'The built commit (default GITHUB_SHA)')
242
+ .option('--require-report <file>', 'Attest only if this smoke report (extenshi test smoke --json) exists, passed and is for this exact ' +
243
+ 'package; checked locally, not sent — the server does not store reports yet. For attesting a pass: ' +
244
+ 'a failed report exits 1, so leave the flag out to record a red run')
245
+ .option('--dry-run', 'Validate and print the request (URL, idempotency key, body) without the signature; sends nothing, needs no secret')
133
246
  .option('--bff-url <url>', 'Extenshi BFF base URL', undefined)
134
247
  .action(async (artifact, options) => {
135
248
  await run('evidence ingest', async () => {
136
249
  const result = await runEvidenceIngest(artifact, options);
250
+ if (options.dryRun) {
251
+ console.log('extenshi-evidence (dry run): validated — nothing was sent, no secret was used.');
252
+ console.log(`POST ${result.url}`);
253
+ console.log(`idempotency key: ${result.idempotencyKey}`);
254
+ console.log(` = uuidv5(url namespace, "${result.idempotencyName}")`);
255
+ if (result.report)
256
+ console.log(result.report);
257
+ console.log(`body (the signature header is added when sending):\n${result.body}`);
258
+ return;
259
+ }
260
+ if (result.report)
261
+ console.log(`extenshi-evidence: ${result.report}`);
137
262
  console.log(`extenshi-evidence: recorded ${options.kind} for ${result.artifactDigest.slice(0, 12)}… — ${result.answer.slice(0, 300)}`);
138
263
  });
139
264
  });
@@ -1 +1 @@
1
- {"version":3,"file":"evidence-ingest.js","sourceRoot":"","sources":["../src/evidence-ingest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evidence-ingest.js","sourceRoot":"","sources":["../src/evidence-ingest.ts"],"names":[],"mappings":"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"}
@@ -3,18 +3,24 @@
3
3
  * a per-store listing draft from a live package (ROADMAP it.2 T11; Edge/AMO
4
4
  * added as part of the "Edge and Firefox are first-class" gap-analysis item).
5
5
  *
6
- * Pure transform: listing text (manifest + optional `--listing`) + the
7
- * justification checklist (it.1 T6) + the privacy-disclosure checklist (it.2 T5)
8
- * + (edge/firefox) store-specific manifest facts → markdown. The CLI only
9
- * loads the artifact and writes the file. It does NOT write listing / Privacy
10
- * / visibility into any store dashboard.
6
+ * Pure transform: listing text (manifest + optional `--listing`) + one
7
+ * justification question per requested permission and host pattern (the it.1
8
+ * T6 prompts for sensitive ones) + data-usage questions from the package's data
9
+ * flows (the it.2 T5 permission checklist, bundled Extenshi SDKs, storage
10
+ * areas, remote hosts, the Firefox data_collection_permissions — see
11
+ * listing-data-flows.ts) + reviewer notes + (edge/firefox) store-specific
12
+ * manifest facts → markdown. The CLI loads the artifact, writes the file and,
13
+ * for AMO.md in a directory bound to a Dojo project, reads the owner-decided
14
+ * `license`. It does NOT write listing / Privacy / visibility into any store
15
+ * dashboard.
11
16
  *
12
17
  * `review-risk --listing <file>` is the consumer for all three outputs — they
13
18
  * share the Name / Short description / Description / Single purpose headings
14
19
  * with CHROMEWEBSTORE.md, so `listingDraftFromChromeWebStoreMd` (keyed on
15
20
  * headings, not filename) parses EDGE.md/AMO.md exactly the same way.
16
21
  */
17
- import { type FileMap, type Manifest } from './review-checks.js';
22
+ import { type PaymentMode } from './listing-data-flows.js';
23
+ import type { FileMap, Manifest } from './review-checks.js';
18
24
  export type ListingStore = 'chrome' | 'edge' | 'firefox';
19
25
  export interface GenerateListingInput {
20
26
  manifest: Manifest;
@@ -22,6 +28,18 @@ export interface GenerateListingInput {
22
28
  listingPath?: string;
23
29
  /** Which store's draft to render. Defaults to `'chrome'` for backward compatibility. */
24
30
  store?: ListingStore;
31
+ /**
32
+ * Overrides "requires payment", which otherwise follows the Pay SDK found in
33
+ * the package. Same vocabulary as `project release --payment`.
34
+ */
35
+ payment?: PaymentMode;
36
+ /**
37
+ * Firefox: the `license` owner decision of the bound Dojo project (`value`
38
+ * once decided); omitted outside a bound project.
39
+ */
40
+ licenseDecision?: {
41
+ value?: string;
42
+ };
25
43
  }
26
44
  /**
27
45
  * Assemble a listing draft from an already-loaded package. No I/O except
@@ -37,6 +55,15 @@ export interface GenerateListingOptions {
37
55
  listingPath?: string;
38
56
  /** Which store's draft to render. Defaults to `'chrome'` for backward compatibility. */
39
57
  store?: ListingStore;
58
+ /** `--payment required|not-used`; omitted = follow the Pay SDK found in the package. */
59
+ payment?: string;
60
+ /** Where `.extenshi/project.json` (the project binding) is looked up. Default: the current directory. */
61
+ cwd?: string;
62
+ /** For the bound project's live owner decisions; without an API key the cached binding decides. */
63
+ config?: {
64
+ bffUrl: string;
65
+ apiKey: string | null;
66
+ };
40
67
  }
41
68
  export declare function runGenerateListing(opts: GenerateListingOptions): Promise<string>;
42
69
  //# sourceMappingURL=generate-listing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate-listing.d.ts","sourceRoot":"","sources":["../src/generate-listing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAWH,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAA+B,MAAM,oBAAoB,CAAA;AAQ7F,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;AAMxD,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wFAAwF;IACxF,KAAK,CAAC,EAAE,YAAY,CAAA;CACpB;AAQD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAyChF;AAED,mHAAmH;AACnH,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAEvF;AAED,MAAM,WAAW,sBAAsB;IACtC,YAAY,EAAE,MAAM,CAAA;IACpB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wFAAwF;IACxF,KAAK,CAAC,EAAE,YAAY,CAAA;CACpB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBtF"}
1
+ {"version":3,"file":"generate-listing.d.ts","sourceRoot":"","sources":["../src/generate-listing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAUH,OAAO,EAMN,KAAK,WAAW,EAMhB,MAAM,yBAAyB,CAAA;AAIhC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAQ3D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;AAMxD,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wFAAwF;IACxF,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB;;;OAGG;IACH,eAAe,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACpC;AAsBD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAwEhF;AAED,mHAAmH;AACnH,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAEvF;AAED,MAAM,WAAW,sBAAsB;IACtC,YAAY,EAAE,MAAM,CAAA;IACpB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wFAAwF;IACxF,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yGAAyG;IACzG,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,mGAAmG;IACnG,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAClD;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyCtF"}
@@ -3,11 +3,16 @@
3
3
  * a per-store listing draft from a live package (ROADMAP it.2 T11; Edge/AMO
4
4
  * added as part of the "Edge and Firefox are first-class" gap-analysis item).
5
5
  *
6
- * Pure transform: listing text (manifest + optional `--listing`) + the
7
- * justification checklist (it.1 T6) + the privacy-disclosure checklist (it.2 T5)
8
- * + (edge/firefox) store-specific manifest facts → markdown. The CLI only
9
- * loads the artifact and writes the file. It does NOT write listing / Privacy
10
- * / visibility into any store dashboard.
6
+ * Pure transform: listing text (manifest + optional `--listing`) + one
7
+ * justification question per requested permission and host pattern (the it.1
8
+ * T6 prompts for sensitive ones) + data-usage questions from the package's data
9
+ * flows (the it.2 T5 permission checklist, bundled Extenshi SDKs, storage
10
+ * areas, remote hosts, the Firefox data_collection_permissions — see
11
+ * listing-data-flows.ts) + reviewer notes + (edge/firefox) store-specific
12
+ * manifest facts → markdown. The CLI loads the artifact, writes the file and,
13
+ * for AMO.md in a directory bound to a Dojo project, reads the owner-decided
14
+ * `license`. It does NOT write listing / Privacy / visibility into any store
15
+ * dashboard.
11
16
  *
12
17
  * `review-risk --listing <file>` is the consumer for all three outputs — they
13
18
  * share the Name / Short description / Description / Single purpose headings
@@ -16,14 +21,16 @@
16
21
  */
17
22
  import fs from 'node:fs';
18
23
  import path from 'node:path';
24
+ import { FirefoxAPI } from '@extenshi/publisher';
19
25
  import { detectMinifiedFiles } from './amo-source-detect.js';
20
- import { AMO_FILENAME, renderAmoMd } from './amowebstore-md.js';
26
+ import { AMO_FILENAME, AMO_REVIEWER_GUIDANCE, renderAmoMd } from './amowebstore-md.js';
21
27
  import { CHROMEWEBSTORE_FILENAME, renderChromeWebStoreMd } from './chromewebstore-md.js';
22
- import { EDGE_FILENAME, renderEdgeMd } from './edgewebstore-md.js';
28
+ import { EDGE_CERTIFICATION_GUIDANCE, EDGE_FILENAME, renderEdgeMd } from './edgewebstore-md.js';
23
29
  import { assembleListing } from './listing.js';
24
- import { buildJustificationChecklist } from './permission-justifications.js';
30
+ import { AMO_APPROVAL_NOTES_MAX, buildDataUsage, buildReviewerNotes, detectDataFlows, payEvidence, privacyPolicyNeed, renderDataUsage, renderReviewerNotes, reviewAmoDataCollection, } from './listing-data-flows.js';
31
+ import { buildListingJustifications } from './permission-justifications.js';
32
+ import { boundDecision } from './project.js';
25
33
  import { loadArtifact } from './review-archive.js';
26
- import { privacyPracticesForManifest } from './review-checks.js';
27
34
  const MAX_SIZE = 50 * 1024 * 1024;
28
35
  const MAX_ENTRY_BYTES = 4 * 1024 * 1024;
29
36
  const MAX_TOTAL_BYTES = 40 * 1024 * 1024;
@@ -39,6 +46,18 @@ function filenameForStore(store) {
39
46
  return AMO_FILENAME;
40
47
  return CHROMEWEBSTORE_FILENAME;
41
48
  }
49
+ /** `### <permission>` body: host patterns with their source, the question, the example, what the package uses. */
50
+ function justificationPrompt(row, flows) {
51
+ const parts = [];
52
+ if (row.patterns)
53
+ parts.push(`Patterns: ${row.patterns.map((p) => `\`${p.pattern}\` (\`${p.source}\`)`).join(', ')}`);
54
+ parts.push(row.question);
55
+ if (row.example)
56
+ parts.push(`Example: ${row.example}`);
57
+ if (row.permission === 'storage' && flows.storage.length > 0)
58
+ parts.push(`Used in the package: ${flows.storage.map((s) => `\`storage.${s.area}\` (${s.files.length} file${s.files.length === 1 ? '' : 's'})`).join(', ')}.`);
59
+ return parts.join('\n\n');
60
+ }
42
61
  /**
43
62
  * Assemble a listing draft from an already-loaded package. No I/O except
44
63
  * reading `--listing` through `assembleListing` when a path is passed.
@@ -46,24 +65,29 @@ function filenameForStore(store) {
46
65
  export function generateListingMdFromPackage(input) {
47
66
  const store = input.store ?? 'chrome';
48
67
  const listing = assembleListing(input.manifest, input.files, input.listingPath);
49
- const justifications = buildJustificationChecklist(input.manifest).map((row) => ({
68
+ const flows = detectDataFlows(input.manifest, input.files, { payment: input.payment });
69
+ const justifications = buildListingJustifications(input.manifest).map((row) => ({
50
70
  permission: row.permission,
51
- prompt: `${row.question}\n\nExample: ${row.example}`,
71
+ prompt: justificationPrompt(row, flows),
52
72
  }));
53
73
  const loc = listing?.locales.find((l) => l.locale === listing.defaultLocale) ?? listing?.locales[0];
54
74
  const singlePurpose = loc?.shortDescription ?? loc?.name ?? '';
55
75
  if (store === 'edge') {
56
- const privacy = privacyPracticesForManifest(input.manifest);
76
+ const usage = buildDataUsage(input.manifest, flows);
57
77
  return renderEdgeMd({
58
78
  listing,
59
79
  justifications,
60
- needsPrivacyPolicy: privacy.length > 0,
80
+ dataUsage: renderDataUsage(usage),
81
+ privacyPolicy: privacyPolicyNeed(usage),
82
+ certificationNotes: renderReviewerNotes(buildReviewerNotes(input.manifest, input.files, flows), EDGE_CERTIFICATION_GUIDANCE),
61
83
  singlePurpose,
62
84
  });
63
85
  }
64
86
  if (store === 'firefox') {
65
87
  const gecko = input.manifest.browser_specific_settings?.gecko;
66
- const required = gecko?.data_collection_permissions?.required;
88
+ const required = flows.firefoxDataCollection?.required;
89
+ const optional = flows.firefoxDataCollection?.optional;
90
+ const pay = payEvidence(flows);
67
91
  return renderAmoMd({
68
92
  listing,
69
93
  justifications,
@@ -72,31 +96,70 @@ export function generateListingMdFromPackage(input) {
72
96
  id: gecko?.id,
73
97
  isPlaceholder: gecko?.id ? PLACEHOLDER_GECKO_IDS.has(gecko.id.toLowerCase()) : false,
74
98
  strictMinVersion: gecko?.strict_min_version,
75
- dataCollectionRequired: Array.isArray(required)
76
- ? required.filter((v) => typeof v === 'string')
77
- : undefined,
99
+ dataCollectionRequired: required && required.length > 0 ? required : undefined,
100
+ dataCollectionOptional: optional && optional.length > 0 ? optional : undefined,
78
101
  },
79
102
  minifiedFiles: detectMinifiedFiles(input.files),
103
+ licenseDecision: input.licenseDecision,
104
+ // A publisher older than the CLI has no list: renderAmoMd says so instead of guessing.
105
+ amoLicenses: FirefoxAPI.AMO_EXTENSION_LICENSES,
106
+ dataCollectionReview: reviewAmoDataCollection(flows),
107
+ requiresPayment: flows.paid ? 'yes' : input.payment === 'not-used' ? 'no' : 'unknown',
108
+ paymentEvidence: input.payment
109
+ ? `Set with --payment ${input.payment}.`
110
+ : pay
111
+ ? `${pay.charAt(0).toUpperCase()}${pay.slice(1)} is in the package.`
112
+ : undefined,
113
+ reviewerNotes: renderReviewerNotes(
114
+ // The facts become approvalNotes on `publish --listing AMO.md`, capped by the publisher.
115
+ buildReviewerNotes(input.manifest, input.files, flows, {
116
+ lint: true,
117
+ maxFactsChars: AMO_APPROVAL_NOTES_MAX,
118
+ }), AMO_REVIEWER_GUIDANCE),
80
119
  });
81
120
  }
82
- const privacy = privacyPracticesForManifest(input.manifest);
83
- return renderChromeWebStoreMd({ listing, justifications, privacy, singlePurpose });
121
+ const usage = buildDataUsage(input.manifest, flows);
122
+ return renderChromeWebStoreMd({
123
+ listing,
124
+ justifications,
125
+ dataUsage: renderDataUsage(usage),
126
+ privacyPolicy: privacyPolicyNeed(usage),
127
+ singlePurpose,
128
+ });
84
129
  }
85
130
  /** @deprecated kept for existing callers/tests — same as `generateListingMdFromPackage` with `store: 'chrome'`. */
86
131
  export function generateChromeWebStoreMdFromPackage(input) {
87
132
  return generateListingMdFromPackage({ ...input, store: 'chrome' });
88
133
  }
89
134
  export async function runGenerateListing(opts) {
135
+ if (opts.payment !== undefined && opts.payment !== 'required' && opts.payment !== 'not-used') {
136
+ throw new Error(`--payment must be required or not-used (got "${opts.payment}")`);
137
+ }
90
138
  if (!fs.existsSync(opts.artifactPath)) {
91
139
  throw new Error(`Artifact file not found: ${opts.artifactPath}`);
92
140
  }
93
141
  const store = opts.store ?? 'chrome';
94
142
  const { manifest, files } = await loadPackage(opts.artifactPath);
143
+ // AMO needs a license on the first listed version; in a bound project it is an owner decision.
144
+ let licenseDecision;
145
+ if (store === 'firefox') {
146
+ const { projectId, entry } = await boundDecision('license', {
147
+ cwd: opts.cwd ?? process.cwd(),
148
+ bffUrl: opts.config?.bffUrl ?? '',
149
+ apiKey: opts.config?.apiKey ?? null,
150
+ });
151
+ if (projectId)
152
+ licenseDecision = {
153
+ value: entry?.status === 'decided' && typeof entry.value === 'string' ? entry.value : undefined,
154
+ };
155
+ }
95
156
  const markdown = generateListingMdFromPackage({
96
157
  manifest,
97
158
  files,
98
159
  listingPath: opts.listingPath,
99
160
  store,
161
+ payment: opts.payment,
162
+ licenseDecision,
100
163
  });
101
164
  const outputPath = path.resolve(opts.outputPath ?? filenameForStore(store));
102
165
  fs.mkdirSync(path.dirname(outputPath), { recursive: true });
@@ -1 +1 @@
1
- {"version":3,"file":"generate-listing.js","sourceRoot":"","sources":["../src/generate-listing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate-listing.js","sourceRoot":"","sources":["../src/generate-listing.ts"],"names":[],"mappings":"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"}