@rankwrangler/cli 0.13.0 → 0.15.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/dist/CHANGELOG.md CHANGED
@@ -2,6 +2,30 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## v0.15.0 - 2026-11-01
6
+
7
+ ### Changed
8
+
9
+ - Breaking: a Product's `isMerchListing` is always `true` or `false`. The `unknown` search filter is
10
+ gone from the API, MCP, CLI (`--merch true|false|all`), and Explore.
11
+ - Merch detection reads the two stamps Merch on Demand puts on every listing, its template bullets
12
+ and its package dimensions and weight, and rejects any listing with a UPC, EAN, or GTIN. A variation
13
+ parent without either stamp takes its first variant's verdict.
14
+ - The latest classification wins, so a listing that stops looking like Merch is demoted.
15
+ `merch:reclassify` re-checks every active US Product and drops `--demote` and `--include-merch`.
16
+
17
+ ### Fixed
18
+
19
+ - Third-party apparel whose part numbers resembled Merch design codes is no longer flagged as Merch.
20
+
21
+ ## v0.14.0 - 2026-10-29
22
+
23
+ ### Changed
24
+
25
+ - Breaking: move API and MCP connections to `https://rankwrangler-api.merchbase.co`. Sign in through Cloudflare Access or create a replacement Merchbase API key; old Clerk credentials stop working at cutover.
26
+ - Chrome and Safari extensions use the same account permissions while keeping credentials out of request URLs.
27
+ - Account revocations and API-key retirement reach running connections without recurring Clerk verification calls.
28
+
5
29
  ## v0.13.0 - 2026-10-28
6
30
 
7
31
  ### Added
package/dist/cli-auth.js CHANGED
@@ -2,11 +2,10 @@ import { spawnSync } from 'node:child_process';
2
2
  import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
3
3
  import path from 'node:path';
4
4
  import readline from 'node:readline';
5
- import { MERCHBASE_API_KEY_ENV, MERCHBASE_API_KEY_KEYCHAIN_ACCOUNT, MERCHBASE_API_KEY_KEYCHAIN_SERVICE, } from '@merchbaseco/access';
6
5
  import { CliAuthError } from './cli-auth-error.js';
7
- export const API_KEY_ENV_VAR = MERCHBASE_API_KEY_ENV;
8
- export const AUTH_SERVICE_NAME = MERCHBASE_API_KEY_KEYCHAIN_SERVICE;
9
- export const AUTH_ACCOUNT_NAME = MERCHBASE_API_KEY_KEYCHAIN_ACCOUNT;
6
+ export const API_KEY_ENV_VAR = 'MERCHBASE_API_KEY';
7
+ export const AUTH_SERVICE_NAME = 'co.merchbase.cli';
8
+ export const AUTH_ACCOUNT_NAME = 'api-key';
10
9
  const INTERNAL_SECRET_STORE_DIR_ENV_VAR = 'RW_INTERNAL_CLI_SECRET_STORE_DIR';
11
10
  export const resolveApiKey = async () => {
12
11
  const envApiKey = resolveEnvApiKey();
@@ -1,7 +1,7 @@
1
1
  import { requireMarketplaceId } from './cli-options.js';
2
2
  export const runProductSearch = async (args, client, config, options, fail) => {
3
3
  const term = args.join(' ').trim();
4
- const merch = choice(options.merch, ['true', 'false', 'unknown', 'all'], 'merch', fail);
4
+ const merch = choice(options.merch, ['true', 'false', 'all'], 'merch', fail);
5
5
  return await client.product.search.query({
6
6
  ...(term ? { term } : {}),
7
7
  marketplaceIds: [requireMarketplaceId(options, config)],
@@ -21,11 +21,7 @@ export const runProductSearch = async (args, client, config, options, fail) => {
21
21
  };
22
22
  }),
23
23
  includeOfficialBrands: options.includeOfficialBrands,
24
- isMerchListing: merch === undefined
25
- ? undefined
26
- : merch === 'unknown' || merch === 'all'
27
- ? merch
28
- : merch === 'true',
24
+ isMerchListing: merch === undefined || merch === 'all' ? merch : merch === 'true',
29
25
  amazonListingStatus: choice(options.listingStatus, ['active', 'deleted', 'all'], 'listingStatus', fail),
30
26
  salesRank: range(options.minBsr, options.maxBsr, 'Bsr', fail),
31
27
  price: range(options.minPrice, options.maxPrice, 'Price', fail),
package/dist/usage.js CHANGED
@@ -59,7 +59,7 @@ export const printUsage = (paths) => {
59
59
  ' --excludeWord <word> Repeat for excluded words',
60
60
  ' --categoryId <N> Repeat for category filters',
61
61
  ' --facet <facet=name> Repeat for facet filters',
62
- ' --merch <value> true,false,unknown,all (default: true)',
62
+ ' --merch <value> true,false,all (default: true)',
63
63
  ' --listingStatus <value> active,deleted,all (default: active)',
64
64
  ' --stage <value> Keyword search: graduated,trial,dropped,untracked,all (default: graduated)',
65
65
  ' --freshness <value> Keyword search: live,needsSync,syncing,all (default: all)',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rankwrangler/cli",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "description": "Official RankWrangler command line interface",
5
5
  "repository": {
6
6
  "type": "git",
@@ -29,8 +29,7 @@
29
29
  "provenance": true
30
30
  },
31
31
  "dependencies": {
32
- "@merchbaseco/access": "0.4.0",
33
- "@rankwrangler/http-client": "^0.13.0",
32
+ "@rankwrangler/http-client": "^0.15.0",
34
33
  "keytar": "7.9.0"
35
34
  },
36
35
  "devDependencies": {