@merchbase/cli 1.0.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/CHANGELOG.md ADDED
@@ -0,0 +1,20 @@
1
+ # MerchBase CLI Changelog
2
+
3
+ ## v1.0.0 - 2026-04-01
4
+
5
+ - MerchBase CLI is here as a stable `mb` command for reading MerchBase Core data and kicking off sync workflows from the terminal.
6
+ - Save your base URL, default account, marketplace, and default date range once, then reuse that context across everyday CLI commands.
7
+ - Trigger merch account, product, and sales syncs directly from the CLI when your ingestion client is connected.
8
+ - Inspect account data, merch account metadata, product listings, product catalog details, design facets, sales summaries, sales records, sales series, and grouped sales breakdowns without leaving the shell.
9
+ - Pull dashboard-shaped KPI, sales-table, and product-chart reads when you want quick operator snapshots in a scriptable format.
10
+ - Built-in help topics, setup guidance, and packaged release notes make the CLI easier to install, learn, and troubleshoot.
11
+ - Setup failures now point to the next step more directly, including missing `MERCHBASE_API_KEY` config and cases where you need to run `mb merch-account sync` before dataset syncs.
12
+
13
+ ## v0.1.0 - 2026-03-31
14
+
15
+ ### Added
16
+
17
+ - Initial MerchBase CLI package with config, sync, and data access commands.
18
+ - Env-only API key auth using `MERCHBASE_API_KEY`.
19
+ - Product metadata and catalog access commands.
20
+ - Setup guidance in help output and setup-aware command error messages.
package/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # @merchbase/cli
2
+
3
+ MerchBase CLI for MerchBase Core public APIs.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g @merchbase/cli
9
+ ```
10
+
11
+ ## Setup
12
+
13
+ ```bash
14
+ export MERCHBASE_API_KEY=mb_live_xxx
15
+ mb config set base-url https://app.merchbase.co
16
+ mb config set account <accountId> us
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ ```bash
22
+ mb help
23
+ mb products list
24
+ mb sales summary --range 30d
25
+ mb changelog
26
+ ```
27
+
28
+ The CLI reads release notes from the packaged `CHANGELOG.md`, so installed users can inspect the current shipped notes with `mb changelog`.
@@ -0,0 +1,2 @@
1
+ export declare const normalizeBaseUrl: (value: string) => string;
2
+ //# sourceMappingURL=base-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-url.d.ts","sourceRoot":"","sources":["../src/base-url.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,WAI7C,CAAC"}
@@ -0,0 +1,8 @@
1
+ const TRAILING_SLASHES_REGEX = /\/+$/;
2
+ const TRAILING_API_PATH_REGEX = /\/api\/?$/;
3
+ export const normalizeBaseUrl = (value) => {
4
+ return value
5
+ .replace(TRAILING_SLASHES_REGEX, "")
6
+ .replace(TRAILING_API_PATH_REGEX, "");
7
+ };
8
+ //# sourceMappingURL=base-url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-url.js","sourceRoot":"","sources":["../src/base-url.ts"],"names":[],"mappings":"AAAA,MAAM,sBAAsB,GAAG,MAAM,CAAC;AACtC,MAAM,uBAAuB,GAAG,WAAW,CAAC;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,EAAE;IAC9C,OAAO,KAAK;SACP,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC;SACnC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;AAC9C,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface CliChangelogSection {
2
+ changes: string[];
3
+ title: string;
4
+ }
5
+ export interface CliChangelogEntry {
6
+ date: string;
7
+ sections: CliChangelogSection[];
8
+ version: string;
9
+ }
10
+ export declare const loadCliChangelog: () => Promise<CliChangelogEntry[]>;
11
+ export declare const loadCliVersion: () => Promise<string>;
12
+ export declare const normalizeChangelogVersion: (value: string) => string;
13
+ export declare const selectCliChangelogEntry: (input: {
14
+ entries: CliChangelogEntry[];
15
+ currentVersion: string;
16
+ requestedVersion?: string;
17
+ }) => CliChangelogEntry | undefined;
18
+ export declare const parseCliChangelog: (raw: string) => CliChangelogEntry[];
19
+ //# sourceMappingURL=changelog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changelog.d.ts","sourceRoot":"","sources":["../src/changelog.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACnB;AAWD,eAAO,MAAM,gBAAgB,oCAG5B,CAAC;AAEF,eAAO,MAAM,cAAc,uBAI1B,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,OAAO,MAAM,WAEtD,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,OAAO;IAC3C,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B,kCAYA,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,wBAoC5C,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { readFile } from "node:fs/promises";
2
+ const CHANGELOG_URL = new URL("../CHANGELOG.md", import.meta.url);
3
+ const CHANGELOG_LINE_SPLIT_REGEX = /\r?\n/;
4
+ const CHANGELOG_ENTRY_REGEX = /^##\s+v?([0-9][^\s]*)\s+-\s+([0-9]{4}-[0-9]{2}-[0-9]{2})\s*$/;
5
+ const CHANGELOG_SECTION_REGEX = /^###\s+(.+?)\s*$/;
6
+ const CHANGELOG_BULLET_REGEX = /^-\s+(.+?)\s*$/;
7
+ const CHANGELOG_VERSION_PREFIX_REGEX = /^v/i;
8
+ const PACKAGE_JSON_URL = new URL("../package.json", import.meta.url);
9
+ export const loadCliChangelog = async () => {
10
+ const raw = await readFile(CHANGELOG_URL, "utf8");
11
+ return parseCliChangelog(raw);
12
+ };
13
+ export const loadCliVersion = async () => {
14
+ const raw = await readFile(PACKAGE_JSON_URL, "utf8");
15
+ const parsed = JSON.parse(raw);
16
+ return parsed.version ?? "0.0.0";
17
+ };
18
+ export const normalizeChangelogVersion = (value) => {
19
+ return value.trim().replace(CHANGELOG_VERSION_PREFIX_REGEX, "");
20
+ };
21
+ export const selectCliChangelogEntry = (input) => {
22
+ if (input.requestedVersion) {
23
+ return input.entries.find((entry) => entry.version === input.requestedVersion);
24
+ }
25
+ return (input.entries.find((entry) => entry.version === input.currentVersion) ??
26
+ input.entries[0] ??
27
+ null);
28
+ };
29
+ export const parseCliChangelog = (raw) => {
30
+ const lines = raw.split(CHANGELOG_LINE_SPLIT_REGEX);
31
+ const entries = [];
32
+ let currentEntry = null;
33
+ let currentSection = null;
34
+ for (const line of lines) {
35
+ const entryMatch = line.match(CHANGELOG_ENTRY_REGEX);
36
+ if (entryMatch) {
37
+ currentEntry = {
38
+ version: entryMatch[1] ?? "",
39
+ date: entryMatch[2] ?? "",
40
+ sections: [],
41
+ };
42
+ entries.push(currentEntry);
43
+ currentSection = null;
44
+ continue;
45
+ }
46
+ const sectionMatch = line.match(CHANGELOG_SECTION_REGEX);
47
+ if (sectionMatch && currentEntry) {
48
+ currentSection = {
49
+ title: sectionMatch[1] ?? "",
50
+ changes: [],
51
+ };
52
+ currentEntry.sections.push(currentSection);
53
+ continue;
54
+ }
55
+ const bulletMatch = line.match(CHANGELOG_BULLET_REGEX);
56
+ if (bulletMatch && currentSection) {
57
+ currentSection.changes.push(bulletMatch[1] ?? "");
58
+ }
59
+ }
60
+ return entries;
61
+ };
62
+ //# sourceMappingURL=changelog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changelog.js","sourceRoot":"","sources":["../src/changelog.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ export declare const createProgram: () => Command;
3
+ export declare const runCli: (argv?: string[]) => Promise<void>;
4
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6CpC,eAAO,MAAM,aAAa,eAikBzB,CAAC;AAEF,eAAO,MAAM,MAAM,GAAU,eAAmB,kBAG/C,CAAC"}
package/dist/cli.js ADDED
@@ -0,0 +1,505 @@
1
+ import { createRequire } from "node:module";
2
+ import { createMerchbaseClient, } from "@merchbase/http-client";
3
+ import { Command } from "commander";
4
+ import { normalizeBaseUrl } from "./base-url.js";
5
+ import { loadCliChangelog, loadCliVersion, normalizeChangelogVersion, selectCliChangelogEntry, } from "./changelog.js";
6
+ import { clearConfig, getConfigPath, loadConfig, updateConfig, } from "./config.js";
7
+ import { renderHelp, resolveHelpTopicKey } from "./help.js";
8
+ import { printError, printSuccess } from "./output.js";
9
+ const API_KEY_ENV_VAR = "MERCHBASE_API_KEY";
10
+ const GLOBAL_SETUP_HELP = [
11
+ "Setup:",
12
+ " Set MERCHBASE_API_KEY in your environment.",
13
+ " Set the default account with `mb config set account <accountId> [marketplace]`.",
14
+ " `mb merch-account sync` requires an active ingestion client connection.",
15
+ " Run `mb merch-account sync` before `mb products sync` or `mb sales sync`.",
16
+ ].join("\n");
17
+ const MERCH_ACCOUNT_GET_HELP = [
18
+ "Setup:",
19
+ " This reads previously synced merch account metadata.",
20
+ " If metadata has not been fetched yet, run `mb merch-account sync` first.",
21
+ ].join("\n");
22
+ const MERCH_ACCOUNT_SYNC_HELP = [
23
+ "Setup:",
24
+ " Requires an active ingestion client connection for the selected account.",
25
+ ].join("\n");
26
+ const DATASET_SYNC_HELP = [
27
+ "Setup:",
28
+ " Requires an active ingestion client connection.",
29
+ " Requires merch account metadata.",
30
+ " Run `mb merch-account sync` first if setup has not been completed yet.",
31
+ ].join("\n");
32
+ const require = createRequire(import.meta.url);
33
+ const CLI_PACKAGE = require("../package.json");
34
+ const CLI_VERSION = CLI_PACKAGE.version ?? "0.0.0";
35
+ export const createProgram = () => {
36
+ const program = new Command();
37
+ program.name("mb").description("MerchBase CLI").version(CLI_VERSION);
38
+ program.helpCommand(false);
39
+ program.showHelpAfterError();
40
+ program.addHelpText("after", `\n${GLOBAL_SETUP_HELP}\n`);
41
+ program
42
+ .command("help [topic...]")
43
+ .description("Show command help topics")
44
+ .action((topic) => {
45
+ let segments = [];
46
+ if (Array.isArray(topic)) {
47
+ segments = topic;
48
+ }
49
+ else if (topic) {
50
+ segments = [topic];
51
+ }
52
+ process.stdout.write(renderHelp(resolveHelpTopicKey(segments)));
53
+ });
54
+ program
55
+ .command("changelog [version]")
56
+ .description("Show packaged CLI release notes")
57
+ .option("--all", "Show every packaged changelog entry")
58
+ .action(wrap(async (version, options) => {
59
+ if (options.all && version) {
60
+ throw new Error("Use either a version arg or --all, not both.");
61
+ }
62
+ const currentVersion = await loadCliVersion();
63
+ const entries = await loadCliChangelog();
64
+ if (options.all) {
65
+ return {
66
+ currentVersion,
67
+ latestVersion: entries[0]?.version ?? null,
68
+ entries,
69
+ };
70
+ }
71
+ const requestedVersion = version
72
+ ? normalizeChangelogVersion(version)
73
+ : undefined;
74
+ const entry = selectCliChangelogEntry({
75
+ entries,
76
+ currentVersion,
77
+ requestedVersion,
78
+ });
79
+ if (!entry) {
80
+ const availableVersions = entries.map((item) => `v${item.version}`);
81
+ throw new Error(`Unknown changelog version: v${requestedVersion}. Available versions: ${availableVersions.join(", ")}.`);
82
+ }
83
+ return {
84
+ currentVersion,
85
+ latestVersion: entries[0]?.version ?? null,
86
+ requestedVersion: requestedVersion ?? null,
87
+ selectedVersion: entry.version,
88
+ entry,
89
+ };
90
+ }));
91
+ const configCommand = program
92
+ .command("config")
93
+ .description("Manage CLI config");
94
+ configCommand
95
+ .command("show")
96
+ .description("Show current config")
97
+ .action(wrap(async () => {
98
+ const config = await loadConfig();
99
+ return {
100
+ path: getConfigPath(),
101
+ config,
102
+ };
103
+ }));
104
+ configCommand
105
+ .command("clear")
106
+ .description("Clear local config")
107
+ .action(wrap(async () => {
108
+ const config = await clearConfig();
109
+ return {
110
+ path: getConfigPath(),
111
+ config,
112
+ };
113
+ }));
114
+ const configSet = configCommand
115
+ .command("set")
116
+ .description("Set config values");
117
+ configSet
118
+ .command("base-url <value>")
119
+ .description("Set API base URL")
120
+ .action(wrap(async (value) => updateConfig({ baseUrl: normalizeBaseUrl(value) })));
121
+ configSet
122
+ .command("account <accountId> [marketplace]")
123
+ .description("Set default account and optional marketplace")
124
+ .action(wrap(async (accountId, marketplace) => updateConfig({ account: accountId, marketplace })));
125
+ configSet
126
+ .command("range <value>")
127
+ .description("Set default range alias or date interval")
128
+ .action(wrap(async (value) => updateConfig({ range: value })));
129
+ const accountsCommand = program
130
+ .command("accounts")
131
+ .description("Accounts API commands");
132
+ accountsCommand
133
+ .command("get")
134
+ .description("Get account details")
135
+ .action(wrapWithClient(async (client) => client.accounts.get.query()));
136
+ const merchAccountCommand = program
137
+ .command("merch-account")
138
+ .description("Amazon Merch account API commands");
139
+ const merchAccountGetCommand = merchAccountCommand
140
+ .command("get")
141
+ .description("Get Amazon Merch account details")
142
+ .action(wrapWithClient(async (client) => {
143
+ const merchAccount = await client.merchAccount.get.query();
144
+ if (merchAccount) {
145
+ return merchAccount;
146
+ }
147
+ throw createCliError("PRECONDITION_FAILED", "Merch account metadata is not available for this account. Run `mb merch-account sync` first.");
148
+ }));
149
+ merchAccountGetCommand.addHelpText("after", `\n${MERCH_ACCOUNT_GET_HELP}\n`);
150
+ const merchAccountSyncCommand = merchAccountCommand
151
+ .command("sync")
152
+ .description("Start an Amazon Merch account metadata sync")
153
+ .action(wrapWithClient(async (client) => client.merchAccount.sync.mutate()));
154
+ merchAccountSyncCommand.addHelpText("after", `\n${MERCH_ACCOUNT_SYNC_HELP}\n`);
155
+ const productsCommand = program
156
+ .command("products")
157
+ .description("Products API commands");
158
+ productsCommand
159
+ .command("list")
160
+ .description("List products")
161
+ .option("--marketplace <marketplace>")
162
+ .option("--status <status>")
163
+ .option("--limit <limit>", "Maximum items to return", "25")
164
+ .option("--offset <offset>", "Result offset", "0")
165
+ .action(wrapWithClient(async (client, _config, options) => client.products.list.query({
166
+ marketplace: options.marketplace,
167
+ status: options.status,
168
+ limit: options.limit,
169
+ offset: options.offset,
170
+ })));
171
+ productsCommand
172
+ .command("search")
173
+ .description("Search products")
174
+ .option("--query <query>")
175
+ .option("--marketplace <marketplace>")
176
+ .option("--facet <facet>")
177
+ .option("--facet-name <facetName>")
178
+ .option("--limit <limit>", "Maximum items to return", "25")
179
+ .option("--offset <offset>", "Result offset", "0")
180
+ .action(wrapWithClient(async (client, _config, options) => client.products.search.query({
181
+ query: options.query,
182
+ marketplace: options.marketplace,
183
+ facet: options.facet,
184
+ facetName: options.facetName,
185
+ limit: options.limit,
186
+ offset: options.offset,
187
+ })));
188
+ productsCommand
189
+ .command("get <asin>")
190
+ .description("Get product details")
191
+ .option("--marketplace <marketplace>")
192
+ .action(wrapWithClient(async (client, _config, asin, options) => client.products.get.query({
193
+ asin,
194
+ marketplace: options.marketplace,
195
+ })));
196
+ productsCommand
197
+ .command("metadata")
198
+ .description("Get product dataset metadata")
199
+ .option("--marketplace <marketplace>")
200
+ .option("--asin <asin>")
201
+ .action(wrapWithClient(async (client, _config, options) => client.products.metadata.query({
202
+ marketplace: options.marketplace,
203
+ asin: options.asin,
204
+ })));
205
+ const productCatalogCommand = productsCommand
206
+ .command("catalog")
207
+ .description("Product catalog commands");
208
+ productCatalogCommand
209
+ .command("get")
210
+ .description("Get the product catalog")
211
+ .action(wrapWithClient(async (client) => client.products.catalog.get.query()));
212
+ productCatalogCommand
213
+ .command("options")
214
+ .description("Get product catalog option lists")
215
+ .option("--product-type <productType>")
216
+ .action(wrapWithClient(async (client, _config, options) => client.products.catalog.options.query({
217
+ productType: options.productType,
218
+ })));
219
+ productCatalogCommand
220
+ .command("product <productType>")
221
+ .description("Get one catalog product type")
222
+ .action(wrapWithClient(async (client, _config, productType) => client.products.catalog.product.query({
223
+ productType,
224
+ })));
225
+ const productsSyncCommand = productsCommand
226
+ .command("sync")
227
+ .description("Start a products sync")
228
+ .option("--range <range>", "1d|3d|7d|30d|90d", "7d")
229
+ .action(wrapWithClient(async (client, _config, options) => client.products.sync.mutate({
230
+ rangePreset: options.range,
231
+ })));
232
+ productsSyncCommand.addHelpText("after", `\n${DATASET_SYNC_HELP}\n`);
233
+ const designsCommand = program
234
+ .command("designs")
235
+ .description("Designs API commands");
236
+ designsCommand
237
+ .command("list")
238
+ .description("List designs")
239
+ .option("--query <query>")
240
+ .option("--facet <facet>")
241
+ .option("--facet-name <facetName>")
242
+ .option("--limit <limit>", "Maximum items to return", "25")
243
+ .option("--offset <offset>", "Result offset", "0")
244
+ .action(wrapWithClient(async (client, _config, options) => client.designs.list.query({
245
+ query: options.query,
246
+ facet: options.facet,
247
+ facetName: options.facetName,
248
+ limit: options.limit,
249
+ offset: options.offset,
250
+ })));
251
+ designsCommand
252
+ .command("get <designId>")
253
+ .description("Get design details")
254
+ .action(wrapWithClient(async (client, _config, designId) => client.designs.get.query({ designId })));
255
+ const designFacetsCommand = designsCommand
256
+ .command("facets")
257
+ .description("Design facets commands");
258
+ designFacetsCommand
259
+ .command("get <designId>")
260
+ .description("Get design facets")
261
+ .action(wrapWithClient(async (client, _config, designId) => client.designs.facets.get.query({ designId })));
262
+ designFacetsCommand
263
+ .command("update <designId>")
264
+ .description("Replace design facets")
265
+ .requiredOption("--facet <facetValue...>", "Facet value in the form facet:name. Repeat flag for multiple values.")
266
+ .action(wrapWithClient(async (client, _config, designId, options) => client.designs.facets.update.mutate({
267
+ designId,
268
+ facets: options.facet.map(parseFacetValue),
269
+ })));
270
+ designFacetsCommand
271
+ .command("classify")
272
+ .description("Queue facet classification")
273
+ .requiredOption("--design-id <designIds...>")
274
+ .action(wrapWithClient(async (client, _config, options) => client.designs.facets.classify.mutate({
275
+ designIds: options.designId,
276
+ })));
277
+ designFacetsCommand
278
+ .command("status <jobId>")
279
+ .description("Get classify job status")
280
+ .action(wrapWithClient(async (client, _config, jobId) => client.designs.facets.status.query({ jobId })));
281
+ const salesCommand = program
282
+ .command("sales")
283
+ .description("Sales API commands");
284
+ const salesSyncCommand = salesCommand
285
+ .command("sync")
286
+ .description("Start a sales sync")
287
+ .option("--range <range>", "1d|3d|7d|30d|90d", "7d")
288
+ .action(wrapWithClient(async (client, _config, options) => client.sales.sync.mutate({
289
+ rangePreset: options.range,
290
+ })));
291
+ salesSyncCommand.addHelpText("after", `\n${DATASET_SYNC_HELP}\n`);
292
+ salesCommand
293
+ .command("summary")
294
+ .description("Get sales summary")
295
+ .option("--range <range>")
296
+ .option("--marketplace <marketplace>")
297
+ .option("--asin <asin>")
298
+ .option("--product-type <productType>")
299
+ .option("--fit <fit>")
300
+ .option("--color <color>")
301
+ .option("--facet <facet>")
302
+ .option("--facet-name <facetName>")
303
+ .action(wrapWithClient(async (client, config, options) => client.sales.summary.query({
304
+ range: resolveRange(config, options.range),
305
+ marketplace: options.marketplace,
306
+ asin: options.asin,
307
+ productType: options.productType,
308
+ fit: options.fit,
309
+ color: options.color,
310
+ facet: options.facet,
311
+ facetName: options.facetName,
312
+ })));
313
+ salesCommand
314
+ .command("records")
315
+ .description("Get sales records")
316
+ .option("--range <range>")
317
+ .option("--marketplace <marketplace>")
318
+ .option("--asin <asin>")
319
+ .option("--product-type <productType>")
320
+ .option("--fit <fit>")
321
+ .option("--color <color>")
322
+ .option("--facet <facet>")
323
+ .option("--facet-name <facetName>")
324
+ .option("--limit <limit>", "Maximum items to return", "25")
325
+ .option("--offset <offset>", "Result offset", "0")
326
+ .action(wrapWithClient(async (client, config, options) => client.sales.records.query({
327
+ range: resolveRange(config, options.range),
328
+ marketplace: options.marketplace,
329
+ asin: options.asin,
330
+ productType: options.productType,
331
+ fit: options.fit,
332
+ color: options.color,
333
+ facet: options.facet,
334
+ facetName: options.facetName,
335
+ limit: options.limit,
336
+ offset: options.offset,
337
+ })));
338
+ salesCommand
339
+ .command("series")
340
+ .description("Get sales series")
341
+ .option("--range <range>")
342
+ .option("--marketplace <marketplace>")
343
+ .option("--asin <asin>")
344
+ .option("--product-type <productType>")
345
+ .option("--facet <facet>")
346
+ .option("--facet-name <facetName>")
347
+ .option("--bucket <bucket>", "day|week|month", "day")
348
+ .action(wrapWithClient(async (client, config, options) => client.sales.series.query({
349
+ range: resolveRange(config, options.range),
350
+ marketplace: options.marketplace,
351
+ asin: options.asin,
352
+ productType: options.productType,
353
+ facet: options.facet,
354
+ facetName: options.facetName,
355
+ bucket: options.bucket,
356
+ })));
357
+ salesCommand
358
+ .command("breakdown")
359
+ .description("Get sales breakdown by dimension")
360
+ .requiredOption("--group-by <groupBy>")
361
+ .option("--range <range>")
362
+ .option("--marketplace <marketplace>")
363
+ .option("--asin <asin>")
364
+ .option("--product-type <productType>")
365
+ .option("--fit <fit>")
366
+ .option("--color <color>")
367
+ .option("--facet <facet>")
368
+ .option("--facet-name <facetName>")
369
+ .option("--sort <sort>")
370
+ .option("--direction <direction>", "asc|desc", "desc")
371
+ .option("--limit <limit>", "Maximum items to return", "25")
372
+ .option("--offset <offset>", "Result offset", "0")
373
+ .action(wrapWithClient(async (client, config, options) => client.sales.breakdown.query({
374
+ groupBy: options.groupBy,
375
+ range: resolveRange(config, options.range),
376
+ marketplace: options.marketplace,
377
+ asin: options.asin,
378
+ productType: options.productType,
379
+ fit: options.fit,
380
+ color: options.color,
381
+ facet: options.facet,
382
+ facetName: options.facetName,
383
+ sort: options.sort,
384
+ direction: options.direction,
385
+ limit: options.limit,
386
+ offset: options.offset,
387
+ })));
388
+ const dashboardCommand = program
389
+ .command("dashboard")
390
+ .description("Dashboard API commands");
391
+ dashboardCommand
392
+ .command("kpis")
393
+ .description("Get dashboard KPI stats")
394
+ .option("--range <range>")
395
+ .option("--marketplace <marketplace>")
396
+ .option("--asin <asin>")
397
+ .option("--facet <facet>")
398
+ .option("--facet-name <facetName>")
399
+ .action(wrapWithClient(async (client, config, options) => client.dashboard.kpis.query({
400
+ range: resolveRange(config, options.range),
401
+ marketplace: options.marketplace,
402
+ asin: options.asin,
403
+ facet: options.facet,
404
+ facetName: options.facetName,
405
+ })));
406
+ dashboardCommand
407
+ .command("sales-table")
408
+ .description("Get dashboard sales table")
409
+ .option("--range <range>")
410
+ .option("--marketplace <marketplace>")
411
+ .option("--asin <asin>")
412
+ .option("--facet <facet>")
413
+ .option("--facet-name <facetName>")
414
+ .option("--limit <limit>", "Maximum items to return", "25")
415
+ .option("--offset <offset>", "Result offset", "0")
416
+ .action(wrapWithClient(async (client, config, options) => client.dashboard.salesTable.query({
417
+ range: resolveRange(config, options.range),
418
+ marketplace: options.marketplace,
419
+ asin: options.asin,
420
+ facet: options.facet,
421
+ facetName: options.facetName,
422
+ limit: options.limit,
423
+ offset: options.offset,
424
+ })));
425
+ dashboardCommand
426
+ .command("product-chart")
427
+ .description("Get dashboard product chart")
428
+ .option("--range <range>")
429
+ .option("--marketplace <marketplace>")
430
+ .option("--asin <asin>")
431
+ .option("--facet <facet>")
432
+ .option("--facet-name <facetName>")
433
+ .action(wrapWithClient(async (client, config, options) => client.dashboard.productChart.query({
434
+ range: resolveRange(config, options.range),
435
+ marketplace: options.marketplace,
436
+ asin: options.asin,
437
+ facet: options.facet,
438
+ facetName: options.facetName,
439
+ })));
440
+ return program;
441
+ };
442
+ export const runCli = async (argv = process.argv) => {
443
+ const program = createProgram();
444
+ await program.parseAsync(argv);
445
+ };
446
+ function wrap(handler) {
447
+ return async (...args) => {
448
+ try {
449
+ const data = await handler(...args);
450
+ printSuccess(data);
451
+ }
452
+ catch (error) {
453
+ printError(error);
454
+ process.exitCode = 1;
455
+ }
456
+ };
457
+ }
458
+ function wrapWithClient(handler) {
459
+ return wrap(async (...args) => {
460
+ const config = await loadConfig();
461
+ const apiKey = resolveApiKey();
462
+ if (!apiKey) {
463
+ throw new Error(`Missing API key. Set ${API_KEY_ENV_VAR} in your environment.`);
464
+ }
465
+ const headers = {};
466
+ if (config.account) {
467
+ headers["x-merchbase-account"] = config.account;
468
+ }
469
+ if (config.marketplace) {
470
+ headers["x-merchbase-marketplace"] = config.marketplace;
471
+ }
472
+ const client = createMerchbaseClient({
473
+ baseUrl: config.baseUrl,
474
+ apiKey,
475
+ headers,
476
+ });
477
+ return handler(client, config, ...args);
478
+ });
479
+ }
480
+ function parseFacetValue(value) {
481
+ const separator = value.indexOf(":");
482
+ if (separator < 1 || separator === value.length - 1) {
483
+ throw new Error(`Invalid facet value "${value}". Expected <facet>:<name>.`);
484
+ }
485
+ return {
486
+ facet: value.slice(0, separator),
487
+ name: value.slice(separator + 1),
488
+ };
489
+ }
490
+ function resolveRange(config, range) {
491
+ return range ?? config.range;
492
+ }
493
+ function resolveApiKey() {
494
+ const apiKey = process.env[API_KEY_ENV_VAR]?.trim();
495
+ if (!apiKey || apiKey === "null" || apiKey === "undefined") {
496
+ return undefined;
497
+ }
498
+ return apiKey;
499
+ }
500
+ const createCliError = (code, message) => {
501
+ const error = new Error(message);
502
+ error.code = code;
503
+ return error;
504
+ };
505
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface MerchbaseCliConfig {
2
+ account?: string;
3
+ baseUrl: string;
4
+ marketplace?: string;
5
+ range?: string;
6
+ }
7
+ export declare const getConfigPath: () => string;
8
+ export declare const loadConfig: () => Promise<MerchbaseCliConfig>;
9
+ export declare const saveConfig: (config: MerchbaseCliConfig) => Promise<void>;
10
+ export declare const updateConfig: (patch: Partial<MerchbaseCliConfig>) => Promise<{
11
+ account?: string;
12
+ baseUrl: string;
13
+ marketplace?: string;
14
+ range?: string;
15
+ }>;
16
+ export declare const clearConfig: () => Promise<{
17
+ account?: string;
18
+ baseUrl: string;
19
+ marketplace?: string;
20
+ range?: string;
21
+ }>;
22
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,kBAAkB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,eAAO,MAAM,aAAa,cAAoB,CAAC;AAE/C,eAAO,MAAM,UAAU,QAAa,OAAO,CAAC,kBAAkB,CAgB7D,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,QAAQ,kBAAkB,kBAO1D,CAAC;AAEF,eAAO,MAAM,YAAY,GAAU,OAAO,OAAO,CAAC,kBAAkB,CAAC;cAvCvD,MAAM;aACP,MAAM;kBACD,MAAM;YACZ,MAAM;EA6CjB,CAAC;AAEF,eAAO,MAAM,WAAW;cAlDV,MAAM;aACP,MAAM;kBACD,MAAM;YACZ,MAAM;EAoDjB,CAAC"}
package/dist/config.js ADDED
@@ -0,0 +1,70 @@
1
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { DEFAULT_API_BASE_URL } from "@merchbase/http-client";
5
+ const CONFIG_DIR = join(homedir(), ".merchbase");
6
+ const CONFIG_PATH = join(CONFIG_DIR, "config.json");
7
+ const DEFAULT_CONFIG = {
8
+ baseUrl: process.env.MERCHBASE_API_BASE_URL ?? DEFAULT_API_BASE_URL,
9
+ };
10
+ export const getConfigPath = () => CONFIG_PATH;
11
+ export const loadConfig = async () => {
12
+ try {
13
+ const raw = await readFile(CONFIG_PATH, "utf-8");
14
+ const parsed = sanitizeCliConfig(JSON.parse(raw));
15
+ return {
16
+ ...DEFAULT_CONFIG,
17
+ ...parsed,
18
+ };
19
+ }
20
+ catch (error) {
21
+ if (isNotFound(error)) {
22
+ return { ...DEFAULT_CONFIG };
23
+ }
24
+ throw error;
25
+ }
26
+ };
27
+ export const saveConfig = async (config) => {
28
+ await mkdir(CONFIG_DIR, { recursive: true });
29
+ await writeFile(CONFIG_PATH, `${JSON.stringify(config, null, 2)}\n`, "utf-8");
30
+ };
31
+ export const updateConfig = async (patch) => {
32
+ const current = await loadConfig();
33
+ const next = {
34
+ ...current,
35
+ ...patch,
36
+ };
37
+ await saveConfig(next);
38
+ return next;
39
+ };
40
+ export const clearConfig = async () => {
41
+ await rm(CONFIG_PATH, { force: true });
42
+ return {
43
+ ...DEFAULT_CONFIG,
44
+ };
45
+ };
46
+ const sanitizeCliConfig = (value) => {
47
+ if (!value || typeof value !== "object") {
48
+ return {};
49
+ }
50
+ const candidate = value;
51
+ return {
52
+ account: typeof candidate.account === "string"
53
+ ? candidate.account
54
+ : undefined,
55
+ baseUrl: typeof candidate.baseUrl === "string"
56
+ ? candidate.baseUrl
57
+ : undefined,
58
+ marketplace: typeof candidate.marketplace === "string"
59
+ ? candidate.marketplace
60
+ : undefined,
61
+ range: typeof candidate.range === "string" ? candidate.range : undefined,
62
+ };
63
+ };
64
+ const isNotFound = (error) => {
65
+ return (typeof error === "object" &&
66
+ error !== null &&
67
+ "code" in error &&
68
+ error.code === "ENOENT");
69
+ };
70
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AACjD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AASpD,MAAM,cAAc,GAAuB;IACvC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,oBAAoB;CACtE,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC;AAE/C,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,IAAiC,EAAE;IAC9D,IAAI,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAElD,OAAO;YACH,GAAG,cAAc;YACjB,GAAG,MAAM;SACZ,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,MAA0B,EAAE,EAAE;IAC3D,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,CACX,WAAW,EACX,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACtC,OAAO,CACV,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,KAAkC,EAAE,EAAE;IACrE,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG;QACT,GAAG,OAAO;QACV,GAAG,KAAK;KACX,CAAC;IAEF,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;IAClC,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,OAAO;QACH,GAAG,cAAc;KACpB,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAA+B,EAAE;IACtE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,KAAgC,CAAC;IAEnD,OAAO;QACH,OAAO,EACH,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ;YACjC,CAAC,CAAC,SAAS,CAAC,OAAO;YACnB,CAAC,CAAC,SAAS;QACnB,OAAO,EACH,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ;YACjC,CAAC,CAAC,SAAS,CAAC,OAAO;YACnB,CAAC,CAAC,SAAS;QACnB,WAAW,EACP,OAAO,SAAS,CAAC,WAAW,KAAK,QAAQ;YACrC,CAAC,CAAC,SAAS,CAAC,WAAW;YACvB,CAAC,CAAC,SAAS;QACnB,KAAK,EACD,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KACxE,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,KAAc,EAAE,EAAE;IAClC,OAAO,CACH,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACd,KAA2B,CAAC,IAAI,KAAK,QAAQ,CACjD,CAAC;AACN,CAAC,CAAC"}
package/dist/help.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export type HelpTopicKey = "global" | "config" | "accounts" | "merch-account" | "products" | "sales" | "dashboard" | "changelog";
2
+ export declare const resolveHelpTopicKey: (segments?: string[]) => HelpTopicKey;
3
+ export declare const renderHelp: (topicKey: HelpTopicKey) => string;
4
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,YAAY,GAClB,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,eAAe,GACf,UAAU,GACV,OAAO,GACP,WAAW,GACX,WAAW,CAAC;AA0KlB,eAAO,MAAM,mBAAmB,GAAI,WAAU,MAAM,EAAO,KAAG,YAW7D,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,UAAU,YAAY,WAuBhD,CAAC"}
package/dist/help.js ADDED
@@ -0,0 +1,191 @@
1
+ const TOPICS = {
2
+ global: {
3
+ key: "global",
4
+ usage: "mb [options] [command]",
5
+ summary: "MerchBase CLI",
6
+ commands: [
7
+ {
8
+ left: "config",
9
+ right: "Manage base URL, default account, and default range",
10
+ },
11
+ { left: "accounts", right: "Inspect the current account context" },
12
+ {
13
+ left: "merch-account",
14
+ right: "Fetch or sync merch account metadata",
15
+ },
16
+ {
17
+ left: "products",
18
+ right: "Read product data, metadata, and catalog info",
19
+ },
20
+ { left: "designs", right: "Read designs and manage design facets" },
21
+ { left: "sales", right: "Read sales data and trigger sales syncs" },
22
+ {
23
+ left: "dashboard",
24
+ right: "Read dashboard-shaped summary endpoints",
25
+ },
26
+ { left: "changelog", right: "Show packaged CLI release notes" },
27
+ ],
28
+ notes: [
29
+ "Set `MERCHBASE_API_KEY` in your environment before using API commands.",
30
+ "Set the default account with `mb config set account <accountId> [marketplace]`.",
31
+ "`mb merch-account sync` requires an active ingestion client connection.",
32
+ "Run `mb merch-account sync` before `mb products sync` or `mb sales sync`.",
33
+ ],
34
+ },
35
+ config: {
36
+ key: "config",
37
+ usage: "mb config [command]",
38
+ summary: "Manage local CLI configuration",
39
+ commands: [
40
+ { left: "show", right: "Print config path and current config" },
41
+ { left: "clear", right: "Clear local config" },
42
+ { left: "set base-url <value>", right: "Set API base URL" },
43
+ {
44
+ left: "set account <accountId> [marketplace]",
45
+ right: "Set default account and optional marketplace",
46
+ },
47
+ { left: "set range <value>", right: "Set default range" },
48
+ ],
49
+ notes: [
50
+ "API keys are not stored in config. Use `MERCHBASE_API_KEY`.",
51
+ "`MERCHBASE_API_BASE_URL` is used as the default base URL when set.",
52
+ ],
53
+ },
54
+ accounts: {
55
+ key: "accounts",
56
+ usage: "mb accounts [command]",
57
+ summary: "Inspect the current account context",
58
+ commands: [{ left: "get", right: "Get account details" }],
59
+ },
60
+ "merch-account": {
61
+ key: "merch-account",
62
+ usage: "mb merch-account [command]",
63
+ summary: "Fetch or sync merch account metadata",
64
+ commands: [
65
+ { left: "get", right: "Read previously synced merch account data" },
66
+ {
67
+ left: "sync",
68
+ right: "Trigger a merch account metadata sync",
69
+ },
70
+ ],
71
+ notes: [
72
+ "`get` reads stored metadata and will direct you to `mb merch-account sync` when missing.",
73
+ "`sync` requires an active ingestion client connection.",
74
+ ],
75
+ },
76
+ products: {
77
+ key: "products",
78
+ usage: "mb products [command]",
79
+ summary: "Read product data and trigger product syncs",
80
+ commands: [
81
+ { left: "list", right: "List products" },
82
+ { left: "search", right: "Search products" },
83
+ { left: "get <asin>", right: "Get one product" },
84
+ {
85
+ left: "metadata",
86
+ right: "Get product dataset metadata for the account",
87
+ },
88
+ { left: "catalog get", right: "Get the product catalog" },
89
+ {
90
+ left: "catalog options",
91
+ right: "Get product type, marketplace, fit, and color options",
92
+ },
93
+ {
94
+ left: "catalog product <productType>",
95
+ right: "Get one product catalog definition",
96
+ },
97
+ { left: "sync", right: "Trigger a products sync" },
98
+ ],
99
+ notes: [
100
+ "`sync` requires an active ingestion client connection and merch account metadata.",
101
+ "Run `mb merch-account sync` first if dataset sync setup has not been completed yet.",
102
+ ],
103
+ },
104
+ sales: {
105
+ key: "sales",
106
+ usage: "mb sales [command]",
107
+ summary: "Read sales data and trigger sales syncs",
108
+ commands: [
109
+ { left: "summary", right: "Get sales summary" },
110
+ { left: "records", right: "Get sales records" },
111
+ { left: "series", right: "Get sales series" },
112
+ { left: "breakdown", right: "Get grouped sales breakdowns" },
113
+ { left: "sync", right: "Trigger a sales sync" },
114
+ ],
115
+ notes: [
116
+ "`sync` requires an active ingestion client connection and merch account metadata.",
117
+ "Use `--range` to override the saved default range on read commands.",
118
+ ],
119
+ },
120
+ dashboard: {
121
+ key: "dashboard",
122
+ usage: "mb dashboard [command]",
123
+ summary: "Read dashboard-shaped summary endpoints",
124
+ commands: [
125
+ { left: "kpis", right: "Get dashboard KPI stats" },
126
+ { left: "sales-table", right: "Get dashboard sales table" },
127
+ { left: "product-chart", right: "Get dashboard product chart" },
128
+ ],
129
+ notes: [
130
+ "These commands expose existing public dashboard-shaped reads and may be revisited later.",
131
+ ],
132
+ },
133
+ changelog: {
134
+ key: "changelog",
135
+ usage: "mb changelog [version] [--all]",
136
+ summary: "Show packaged CLI release notes",
137
+ options: [
138
+ { left: "--all", right: "Show every packaged changelog entry" },
139
+ ],
140
+ notes: [
141
+ "The version arg accepts `1.2.3` or `v1.2.3`.",
142
+ "Default output returns the current CLI version entry when available.",
143
+ ],
144
+ },
145
+ };
146
+ const TOPIC_ALIASES = {
147
+ account: "accounts",
148
+ accounts: "accounts",
149
+ changelog: "changelog",
150
+ config: "config",
151
+ dashboard: "dashboard",
152
+ global: "global",
153
+ merch: "merch-account",
154
+ "merch-account": "merch-account",
155
+ products: "products",
156
+ sales: "sales",
157
+ };
158
+ export const resolveHelpTopicKey = (segments = []) => {
159
+ const normalized = segments
160
+ .map((segment) => segment.trim().toLowerCase())
161
+ .filter(Boolean);
162
+ const joined = normalized.join(" ");
163
+ if (!joined) {
164
+ return "global";
165
+ }
166
+ return TOPIC_ALIASES[joined] ?? "global";
167
+ };
168
+ export const renderHelp = (topicKey) => {
169
+ const topic = TOPICS[topicKey];
170
+ const lines = [`Usage: ${topic.usage}`, "", topic.summary, ""];
171
+ if (topic.options?.length) {
172
+ lines.push("Options:");
173
+ lines.push(...topic.options.map(formatRow));
174
+ lines.push("");
175
+ }
176
+ if (topic.commands?.length) {
177
+ lines.push("Commands:");
178
+ lines.push(...topic.commands.map(formatRow));
179
+ lines.push("");
180
+ }
181
+ if (topic.notes?.length) {
182
+ lines.push("Notes:");
183
+ lines.push(...topic.notes.map((note) => ` ${note}`));
184
+ lines.push("");
185
+ }
186
+ return `${lines.join("\n").trimEnd()}\n`;
187
+ };
188
+ const formatRow = (row) => {
189
+ return ` ${row.left.padEnd(32)}${row.right}`;
190
+ };
191
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "./cli.js";
3
+ await runCli(process.argv);
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const printSuccess: (data: unknown) => void;
2
+ export declare const printError: (error: unknown) => void;
3
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,YAAY,GAAI,MAAM,OAAO,SAEzC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,SAOxC,CAAC"}
package/dist/output.js ADDED
@@ -0,0 +1,70 @@
1
+ const SETUP_HINTS = [
2
+ {
3
+ code: "PRECONDITION_FAILED",
4
+ message: "No active ingestion client websocket is connected for this account.",
5
+ hint: "Connect an ingestion client, then rerun the setup or sync command.",
6
+ },
7
+ {
8
+ code: "PRECONDITION_FAILED",
9
+ message: "Sync merch account metadata before syncing products or sales.",
10
+ hint: "Run `mb merch-account sync` first, then retry the products or sales sync.",
11
+ },
12
+ ];
13
+ export const printSuccess = (data) => {
14
+ process.stdout.write(`${JSON.stringify({ ok: true, data }, null, 2)}\n`);
15
+ };
16
+ export const printError = (error) => {
17
+ const envelope = {
18
+ ok: false,
19
+ error: normalizeError(error),
20
+ };
21
+ process.stderr.write(`${JSON.stringify(envelope, null, 2)}\n`);
22
+ };
23
+ const normalizeError = (error) => {
24
+ if (isObject(error)) {
25
+ const message = getString(error, "message") ??
26
+ getString(error, "shape.message") ??
27
+ "Unexpected error";
28
+ const code = getString(error, "data.code") ??
29
+ getString(error, "shape.data.code") ??
30
+ getString(error, "code") ??
31
+ "INTERNAL_ERROR";
32
+ const details = getValue(error, "shape") ?? getValue(error, "data") ?? undefined;
33
+ return {
34
+ code,
35
+ details,
36
+ message: applySetupHint({ code, message }),
37
+ };
38
+ }
39
+ if (typeof error === "string") {
40
+ return {
41
+ code: "INTERNAL_ERROR",
42
+ message: error,
43
+ };
44
+ }
45
+ return {
46
+ code: "INTERNAL_ERROR",
47
+ message: "Unexpected error",
48
+ };
49
+ };
50
+ const applySetupHint = (input) => {
51
+ const match = SETUP_HINTS.find((candidate) => candidate.code === input.code && candidate.message === input.message);
52
+ if (!match) {
53
+ return input.message;
54
+ }
55
+ return `${input.message} ${match.hint}`;
56
+ };
57
+ const isObject = (value) => typeof value === "object" && value !== null;
58
+ const getValue = (source, path) => {
59
+ return path.split(".").reduce((value, key) => {
60
+ if (!isObject(value)) {
61
+ return undefined;
62
+ }
63
+ return value[key];
64
+ }, source);
65
+ };
66
+ const getString = (source, path) => {
67
+ const value = getValue(source, path);
68
+ return typeof value === "string" ? value : undefined;
69
+ };
70
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,GAAG;IAChB;QACI,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EACH,qEAAqE;QACzE,IAAI,EAAE,oEAAoE;KAC7E;IACD;QACI,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EACH,+DAA+D;QACnE,IAAI,EAAE,2EAA2E;KACpF;CACK,CAAC;AAEX,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAa,EAAE,EAAE;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAE,EAAE;IACzC,MAAM,QAAQ,GAAG;QACb,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC;KAC/B,CAAC;IAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAc,EAAc,EAAE;IAClD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,OAAO,GACT,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC;YAC3B,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC;YACjC,kBAAkB,CAAC;QAEvB,MAAM,IAAI,GACN,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC;YAC7B,SAAS,CAAC,KAAK,EAAE,iBAAiB,CAAC;YACnC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;YACxB,gBAAgB,CAAC;QAErB,MAAM,OAAO,GACT,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,SAAS,CAAC;QAErE,OAAO;YACH,IAAI;YACJ,OAAO;YACP,OAAO,EAAE,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SAC7C,CAAC;IACN,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO;YACH,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK;SACjB,CAAC;IACN,CAAC;IAED,OAAO;QACH,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,kBAAkB;KAC9B,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAwC,EAAE,EAAE;IAChE,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAC1B,CAAC,SAAS,EAAE,EAAE,CACV,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CAC3E,CAAC;IACF,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CAClE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AAEhD,MAAM,QAAQ,GAAG,CAAC,MAA+B,EAAE,IAAY,EAAE,EAAE;IAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAU,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAClD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC,EAAE,MAAM,CAAC,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,MAA+B,EAAE,IAAY,EAAE,EAAE;IAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@merchbase/cli",
3
+ "version": "1.0.0",
4
+ "description": "MerchBase CLI for MerchBase Core APIs",
5
+ "type": "module",
6
+ "bin": {
7
+ "mb": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/merchbaseco/merchbase-core.git"
14
+ },
15
+ "homepage": "https://github.com/merchbaseco/merchbase-core/tree/main/packages/merchbase-cli",
16
+ "bugs": {
17
+ "url": "https://github.com/merchbaseco/merchbase-core/issues"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "CHANGELOG.md",
22
+ "README.md"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "scripts": {
28
+ "build": "rm -rf dist && tsc -p tsconfig.json",
29
+ "dev": "tsx src/index.ts",
30
+ "prepack": "bun run --cwd ../.. http-client:build && bun run build",
31
+ "start": "node dist/index.js",
32
+ "test": "vitest run --config vitest.config.ts"
33
+ },
34
+ "dependencies": {
35
+ "@merchbase/http-client": "1.0.0",
36
+ "commander": "^12.1.0"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^24.3.0",
40
+ "tsx": "^4.20.4"
41
+ },
42
+ "packageManager": "bun@1.1.27"
43
+ }