webstore-lint 1.0.29 → 1.0.30

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 CHANGED
@@ -311,6 +311,17 @@ npx webstore-lint ./my-extension \
311
311
  This is the only flag that touches the network, and only when you pass a URL.
312
312
  Without it the tool opens no sockets at all.
313
313
 
314
+ Run the privacy URL check and the permission ledger as separate commands:
315
+
316
+ ```bash
317
+ npx webstore-lint ./my-extension --privacy-policy https://example.com/privacy
318
+ npx webstore-lint ./my-extension --permissions
319
+ ```
320
+
321
+ Combining `--privacy-policy`, `--permissions` or `--policy` is a usage error
322
+ (exit 2). No checks run for that combination. `--json` works with either the
323
+ privacy check or the permission ledger.
324
+
314
325
  It exists because of a real rejection. A developer was rejected under **Purple
315
326
  Lithium** and the cause was mundane: the privacy policy URL in their listing
316
327
  404'd, because the GitHub repository serving it was private. It looks perfectly
@@ -88,6 +88,8 @@ if (flags.has("--help") || (!target && !flags.has("--policy"))) {
88
88
  and only when you pass a url
89
89
  webstore-lint --policy list the policy data this build carries
90
90
 
91
+ Use --permissions, --privacy-policy and --policy in separate commands.
92
+
91
93
  The one-liner, no install needed:
92
94
  npx webstore-lint <extension-directory>
93
95
 
@@ -100,6 +102,19 @@ not affiliated with Google. A clean run is not a promise of approval.`);
100
102
  process.exit(flags.has("--help") ? 0 : 2);
101
103
  }
102
104
 
105
+ // These branches produce different reports and return early. Combining them
106
+ // used to exit successfully after silently skipping an explicitly requested
107
+ // check, including a broken privacy URL. Reject before producing any report.
108
+ const modes = ["--permissions", "--privacy-policy", "--policy"].filter(f => flags.has(f));
109
+ if (modes.length > 1) {
110
+ console.error(`${modes.join(", ")} cannot be combined. No checks were run.`);
111
+ console.error("Run each mode separately:");
112
+ console.error(" webstore-lint <extension-directory> --permissions");
113
+ console.error(" webstore-lint <extension-directory> --privacy-policy <url>");
114
+ console.error(" webstore-lint --policy");
115
+ process.exit(2);
116
+ }
117
+
103
118
  if (flags.has("--policy")) {
104
119
  console.log(`${Object.keys(POLICY.categories).length} verified rejection categories, from ${POLICY.generatedFrom}\n`);
105
120
  for (const [id, c] of Object.entries(POLICY.categories)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webstore-lint",
3
- "version": "1.0.29",
3
+ "version": "1.0.30",
4
4
  "description": "Check an unpacked Chrome extension against the Chrome Web Store program policies before you submit it. Every finding cites Google's own notification ID and verbatim policy text. Covers the 1 August 2026 policy updates.",
5
5
  "keywords": [
6
6
  "chrome-extension",
@@ -38,7 +38,7 @@
38
38
  "node": ">=18"
39
39
  },
40
40
  "scripts": {
41
- "test": "node test/lint.test.mjs && node test/action.test.mjs && node --test test/permissions-output.test.mjs"
41
+ "test": "node test/lint.test.mjs && node test/action.test.mjs && node --test test/permissions-output.test.mjs test/cli-modes.test.mjs"
42
42
  },
43
43
  "repository": {
44
44
  "type": "git",