@purveyors/cli 0.14.0 → 0.19.2
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 +444 -217
- package/dist/commands/auth.d.ts +17 -0
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +160 -62
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/catalog.d.ts +3 -1
- package/dist/commands/catalog.d.ts.map +1 -1
- package/dist/commands/catalog.js +239 -42
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +5 -3
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/manifest.d.ts.map +1 -1
- package/dist/commands/manifest.js +5 -1
- package/dist/commands/manifest.js.map +1 -1
- package/dist/commands/roast.d.ts.map +1 -1
- package/dist/commands/roast.js +115 -10
- package/dist/commands/roast.js.map +1 -1
- package/dist/commands/sales.d.ts.map +1 -1
- package/dist/commands/sales.js +87 -40
- package/dist/commands/sales.js.map +1 -1
- package/dist/lib/catalog.d.ts +332 -1
- package/dist/lib/catalog.d.ts.map +1 -1
- package/dist/lib/catalog.js +654 -2
- package/dist/lib/catalog.js.map +1 -1
- package/dist/lib/interactive/forms.d.ts +10 -0
- package/dist/lib/interactive/forms.d.ts.map +1 -1
- package/dist/lib/interactive/forms.js +10 -8
- package/dist/lib/interactive/forms.js.map +1 -1
- package/dist/lib/interactive/watch.d.ts +38 -4
- package/dist/lib/interactive/watch.d.ts.map +1 -1
- package/dist/lib/interactive/watch.js +294 -86
- package/dist/lib/interactive/watch.js.map +1 -1
- package/dist/lib/manifest.d.ts +7 -0
- package/dist/lib/manifest.d.ts.map +1 -1
- package/dist/lib/manifest.js +231 -26
- package/dist/lib/manifest.js.map +1 -1
- package/dist/lib/path-input.d.ts +3 -0
- package/dist/lib/path-input.d.ts.map +1 -0
- package/dist/lib/path-input.js +13 -0
- package/dist/lib/path-input.js.map +1 -0
- package/dist/lib/roast.d.ts +2 -0
- package/dist/lib/roast.d.ts.map +1 -1
- package/dist/lib/roast.js +5 -2
- package/dist/lib/roast.js.map +1 -1
- package/dist/lib/sales.d.ts +15 -2
- package/dist/lib/sales.d.ts.map +1 -1
- package/dist/lib/sales.js +77 -15
- package/dist/lib/sales.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +17 -9
- package/dist/program.js.map +1 -1
- package/package.json +6 -1
package/dist/commands/catalog.js
CHANGED
|
@@ -2,8 +2,25 @@ import { Command } from 'commander';
|
|
|
2
2
|
import { outputData, info } from '../lib/output.js';
|
|
3
3
|
import { withErrorHandling, PrvrsError } from '../lib/errors.js';
|
|
4
4
|
import { requireAuth } from '../lib/auth-guard.js';
|
|
5
|
-
import { searchCatalog, getCatalog, getCatalogStats,
|
|
5
|
+
import { searchCatalog, getCatalog, getCatalogStats, getCatalogSimilarity, catalogRankPremium, supplierList, supplierDetail, supplierRank, computeCatalogStats, sanitizeFilterValue, catalogSortFields, catalogSimilarityModes, } from '../lib/catalog.js';
|
|
6
6
|
export { sanitizeFilterValue, computeCatalogStats };
|
|
7
|
+
function hasCatalogApiKeyEnv() {
|
|
8
|
+
return Boolean(process.env.PARCHMENT_API_KEY || process.env.PURVEYORS_API_KEY);
|
|
9
|
+
}
|
|
10
|
+
function createApiKeyOnlyCatalogClient() {
|
|
11
|
+
return {
|
|
12
|
+
auth: {
|
|
13
|
+
getSession: async () => ({ data: { session: null }, error: null }),
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
async function resolveCatalogReadClient(requiredRole, useApiKeyWithoutSession) {
|
|
18
|
+
if (useApiKeyWithoutSession && hasCatalogApiKeyEnv()) {
|
|
19
|
+
return createApiKeyOnlyCatalogClient();
|
|
20
|
+
}
|
|
21
|
+
const { supabase } = await requireAuth(requiredRole);
|
|
22
|
+
return supabase;
|
|
23
|
+
}
|
|
7
24
|
function parseFiniteNumberArg(rawValue, message) {
|
|
8
25
|
const trimmed = rawValue.trim();
|
|
9
26
|
if (trimmed.length === 0) {
|
|
@@ -22,6 +39,13 @@ function parsePositiveIntegerArg(rawValue, message) {
|
|
|
22
39
|
}
|
|
23
40
|
return parsed;
|
|
24
41
|
}
|
|
42
|
+
function parseBoundedPositiveIntegerArg(rawValue, flag, min, max) {
|
|
43
|
+
const parsed = parsePositiveIntegerArg(rawValue, `Invalid ${flag}: "${rawValue}". Must be a positive integer.`);
|
|
44
|
+
if (parsed < min || parsed > max) {
|
|
45
|
+
throw new PrvrsError('INVALID_ARGUMENT', `Invalid ${flag}: "${rawValue}". Must be between ${min} and ${max}.`);
|
|
46
|
+
}
|
|
47
|
+
return parsed;
|
|
48
|
+
}
|
|
25
49
|
function parseNonNegativeIntegerArg(rawValue, message) {
|
|
26
50
|
const parsed = parseFiniteNumberArg(rawValue, message);
|
|
27
51
|
if (!Number.isInteger(parsed) || parsed < 0) {
|
|
@@ -32,7 +56,9 @@ function parseNonNegativeIntegerArg(rawValue, message) {
|
|
|
32
56
|
// ─── Command builder ──────────────────────────────────────────────────────────
|
|
33
57
|
/**
|
|
34
58
|
* `purvey catalog` — Browse the coffee catalog.
|
|
35
|
-
* Requires an authenticated viewer session.
|
|
59
|
+
* Requires an authenticated viewer session. Structured process filters on
|
|
60
|
+
* `catalog search` require member access under the current session-authenticated
|
|
61
|
+
* CLI path.
|
|
36
62
|
*/
|
|
37
63
|
export function buildCatalogCommand() {
|
|
38
64
|
const catalog = new Command('catalog').description('Browse the coffee catalog');
|
|
@@ -42,6 +68,11 @@ export function buildCatalogCommand() {
|
|
|
42
68
|
.description('Search coffees by origin, process, price, or flavor')
|
|
43
69
|
.option('--origin <origin>', 'Filter by origin (country, continent, or region)')
|
|
44
70
|
.option('--process <method>', 'Filter by processing method (e.g. natural, washed)')
|
|
71
|
+
.option('--processing-base-method <method>', 'Filter by canonical process base method')
|
|
72
|
+
.option('--fermentation-type <type>', 'Filter by structured fermentation type')
|
|
73
|
+
.option('--process-additive <additive>', 'Filter by disclosed process additive')
|
|
74
|
+
.option('--processing-disclosure-level <level>', 'Filter by process disclosure level')
|
|
75
|
+
.option('--processing-confidence-min <n>', 'Minimum process metadata confidence (0-1)')
|
|
45
76
|
.option('--price-min <n>', 'Minimum price per lb (USD)')
|
|
46
77
|
.option('--price-max <n>', 'Maximum price per lb (USD)')
|
|
47
78
|
.option('--flavor <keywords>', 'Flavor keywords, comma-separated (e.g. "berry,chocolate")')
|
|
@@ -55,11 +86,14 @@ export function buildCatalogCommand() {
|
|
|
55
86
|
.option('--sort <field>', `Sort results by: ${catalogSortFields.join(', ')}`)
|
|
56
87
|
.option('--offset <n>', 'Skip N results (for pagination)', '0')
|
|
57
88
|
.option('--limit <n>', 'Maximum results to return', '10')
|
|
89
|
+
.option('--include-proof', 'Request canonical catalog proof summaries from /v1/catalog')
|
|
58
90
|
.addHelpText('after', `
|
|
59
91
|
Examples:
|
|
60
92
|
purvey catalog search --origin "Ethiopia" --pretty
|
|
61
93
|
purvey catalog search --origin "Colombia" --process "honey" --pretty
|
|
62
94
|
purvey catalog search --process "natural" --flavor "blueberry,citrus" --stocked
|
|
95
|
+
purvey catalog search --processing-base-method "Natural" --fermentation-type "Anaerobic" --pretty
|
|
96
|
+
purvey catalog search --process-additive "hops" --processing-confidence-min 0.8 --pretty
|
|
63
97
|
purvey catalog search --price-min 5 --price-max 12 --stocked --limit 20
|
|
64
98
|
purvey catalog search --stocked --sort price --pretty
|
|
65
99
|
purvey catalog search --sort newest --limit 20
|
|
@@ -72,6 +106,7 @@ Examples:
|
|
|
72
106
|
purvey catalog search --variety "gesha" --stocked --pretty
|
|
73
107
|
purvey catalog search --drying-method "sun" --origin "Ethiopia" --pretty
|
|
74
108
|
purvey catalog search --stocked-days 30 --pretty
|
|
109
|
+
purvey catalog search --origin "Ethiopia" --include-proof --json
|
|
75
110
|
|
|
76
111
|
Sort fields:
|
|
77
112
|
price cheapest first
|
|
@@ -83,12 +118,22 @@ Sort fields:
|
|
|
83
118
|
Notes:
|
|
84
119
|
All filters are optional. Without flags, returns up to --limit results.
|
|
85
120
|
--origin accepts partial matches (e.g. "Ethiopia" matches "Ethiopia Guji").
|
|
121
|
+
Structured process filters map to canonical /v1/catalog query names.
|
|
122
|
+
--process remains the legacy broad processing-label filter.
|
|
123
|
+
--processing-base-method, --fermentation-type, --process-additive,
|
|
124
|
+
--processing-disclosure-level, and --processing-confidence-min require member
|
|
125
|
+
access under the current session-authenticated CLI path.
|
|
126
|
+
--processing-base-method, --fermentation-type, --process-additive, and
|
|
127
|
+
--processing-disclosure-level require exact structured metadata matches.
|
|
128
|
+
--processing-confidence-min accepts a decimal from 0 to 1.
|
|
86
129
|
--name and --supplier accept partial matches (case-insensitive).
|
|
87
130
|
--variety filters on cultivar_detail (partial match, case-insensitive).
|
|
88
131
|
--drying-method filters on drying_method (partial match, case-insensitive).
|
|
89
132
|
--stocked-days N shows only coffees stocked within the last N days.
|
|
90
133
|
--ids fetches specific catalog items by ID, ignoring --limit and --offset.
|
|
91
134
|
--offset + --limit enables pagination through large result sets.
|
|
135
|
+
--include-proof uses the canonical /v1/catalog?include=proof response and does
|
|
136
|
+
not compute proof fields locally in the CLI.
|
|
92
137
|
Requires an authenticated viewer session.
|
|
93
138
|
`)
|
|
94
139
|
.action(withErrorHandling(async (opts, cmd) => {
|
|
@@ -120,11 +165,25 @@ Notes:
|
|
|
120
165
|
const stockedDays = opts.stockedDays !== undefined
|
|
121
166
|
? parsePositiveIntegerArg(opts.stockedDays, `Invalid --stocked-days: "${opts.stockedDays}". Must be a positive integer.`)
|
|
122
167
|
: undefined;
|
|
168
|
+
const processingConfidenceMin = opts.processingConfidenceMin !== undefined
|
|
169
|
+
? parseFiniteNumberArg(opts.processingConfidenceMin, `Invalid --processing-confidence-min: "${opts.processingConfidenceMin}". Must be a number from 0 to 1.`)
|
|
170
|
+
: undefined;
|
|
171
|
+
if (processingConfidenceMin !== undefined &&
|
|
172
|
+
(processingConfidenceMin < 0 || processingConfidenceMin > 1)) {
|
|
173
|
+
throw new PrvrsError('INVALID_ARGUMENT', `Invalid --processing-confidence-min: "${opts.processingConfidenceMin}". Must be a number from 0 to 1.`);
|
|
174
|
+
}
|
|
123
175
|
const offset = opts.offset !== undefined
|
|
124
176
|
? parseNonNegativeIntegerArg(opts.offset, `Invalid --offset: "${opts.offset}". Must be a non-negative integer.`)
|
|
125
177
|
: undefined;
|
|
126
178
|
const limit = parsePositiveIntegerArg(opts.limit, `Invalid --limit: "${opts.limit}". Must be a positive integer.`);
|
|
127
|
-
const
|
|
179
|
+
const hasStructuredProcessFilters = opts.processingBaseMethod !== undefined ||
|
|
180
|
+
opts.fermentationType !== undefined ||
|
|
181
|
+
opts.processAdditive !== undefined ||
|
|
182
|
+
opts.processingDisclosureLevel !== undefined ||
|
|
183
|
+
opts.processingConfidenceMin !== undefined;
|
|
184
|
+
const requiredRole = hasStructuredProcessFilters ? 'member' : 'viewer';
|
|
185
|
+
const includeProof = opts.includeProof ? true : undefined;
|
|
186
|
+
const supabase = await resolveCatalogReadClient(requiredRole, Boolean(includeProof));
|
|
128
187
|
const data = await searchCatalog(supabase, {
|
|
129
188
|
origin: opts.origin,
|
|
130
189
|
process: opts.process,
|
|
@@ -137,10 +196,16 @@ Notes:
|
|
|
137
196
|
variety: opts.variety,
|
|
138
197
|
dryingMethod: opts.dryingMethod,
|
|
139
198
|
stockedDays,
|
|
199
|
+
processingBaseMethod: opts.processingBaseMethod,
|
|
200
|
+
fermentationType: opts.fermentationType,
|
|
201
|
+
processAdditive: opts.processAdditive,
|
|
202
|
+
processingDisclosureLevel: opts.processingDisclosureLevel,
|
|
203
|
+
processingConfidenceMin,
|
|
140
204
|
stocked: opts.stocked ? true : undefined,
|
|
141
205
|
sort: sortValue,
|
|
142
206
|
offset,
|
|
143
207
|
limit,
|
|
208
|
+
includeProof,
|
|
144
209
|
});
|
|
145
210
|
if (data.length === 0) {
|
|
146
211
|
info('No coffees found matching your criteria.');
|
|
@@ -152,22 +217,29 @@ Notes:
|
|
|
152
217
|
catalog
|
|
153
218
|
.command('get <id>')
|
|
154
219
|
.description('Fetch a single coffee by ID')
|
|
220
|
+
.option('--include-proof', 'Request the canonical catalog proof summary from /v1/catalog')
|
|
155
221
|
.addHelpText('after', `
|
|
156
222
|
Examples:
|
|
157
223
|
purvey catalog get 128 --pretty
|
|
224
|
+
purvey catalog get 128 --include-proof --json
|
|
158
225
|
purvey catalog get 42 | jq '{name, origin, process, cost_lb}'
|
|
159
226
|
purvey catalog get 77 --csv
|
|
160
227
|
|
|
161
228
|
Notes:
|
|
162
229
|
<id> is the coffee_catalog.catalog_id (integer).
|
|
163
230
|
Use 'purvey catalog search' to find IDs.
|
|
231
|
+
--include-proof uses the canonical /v1/catalog?include=proof response and does
|
|
232
|
+
not compute proof fields locally in the CLI.
|
|
164
233
|
Requires an authenticated viewer session.
|
|
165
234
|
`)
|
|
166
|
-
.action(withErrorHandling(async (id,
|
|
235
|
+
.action(withErrorHandling(async (id, opts, cmd) => {
|
|
167
236
|
const globalOpts = cmd.optsWithGlobals();
|
|
168
237
|
const catalogId = parsePositiveIntegerArg(id, `Invalid ID: "${id}". Please provide a numeric coffee_catalog ID.`);
|
|
169
|
-
const
|
|
170
|
-
const
|
|
238
|
+
const includeProof = opts.includeProof ? true : undefined;
|
|
239
|
+
const supabase = await resolveCatalogReadClient('viewer', Boolean(includeProof));
|
|
240
|
+
const data = await getCatalog(supabase, catalogId, {
|
|
241
|
+
includeProof,
|
|
242
|
+
});
|
|
171
243
|
outputData(data, globalOpts);
|
|
172
244
|
}));
|
|
173
245
|
// ── catalog stats ─────────────────────────────────────────────────────────
|
|
@@ -191,62 +263,187 @@ Notes:
|
|
|
191
263
|
const stats = await getCatalogStats(supabase);
|
|
192
264
|
outputData(stats, globalOpts);
|
|
193
265
|
}));
|
|
266
|
+
// ── catalog rank-premium ─────────────────────────────────────────────────
|
|
267
|
+
catalog
|
|
268
|
+
.command('rank-premium')
|
|
269
|
+
.description('Rank premium catalog candidates by Purveyor Score')
|
|
270
|
+
.option('--origin <origin>', 'Filter by origin (country, continent, or region)')
|
|
271
|
+
.option('--process <method>', 'Filter by processing method')
|
|
272
|
+
.option('--supplier <name>', 'Filter by supplier/source name')
|
|
273
|
+
.option('--stocked', 'Only include currently stocked coffees')
|
|
274
|
+
.option('--price-max <n>', 'Maximum price per lb (USD)')
|
|
275
|
+
.option('--min-score <n>', 'Minimum Purveyor Score')
|
|
276
|
+
.option('--include-unscored', 'Allow unscored rows to appear after scored rows')
|
|
277
|
+
.option('--sample-size <n>', 'Rows to sample before ranking (1-5000)', '250')
|
|
278
|
+
.option('--limit <n>', 'Maximum ranked coffees to return (1-50)', '10')
|
|
279
|
+
.addHelpText('after', `
|
|
280
|
+
Examples:
|
|
281
|
+
purvey catalog rank-premium --stocked --limit 10 --pretty
|
|
282
|
+
purvey catalog rank-premium --origin Ethiopia --min-score 88 --json
|
|
283
|
+
purvey catalog rank-premium --supplier "Royal Coffee" --price-max 12 --pretty
|
|
284
|
+
|
|
285
|
+
Notes:
|
|
286
|
+
Ranks by coffee_catalog.score_value, exposed as purveyor_score in output.
|
|
287
|
+
The CLI does not recompute the upstream score model; it preserves the score field
|
|
288
|
+
and adds transparent ranking signals for agents.
|
|
289
|
+
Requires an authenticated viewer session.
|
|
290
|
+
`)
|
|
291
|
+
.action(withErrorHandling(async (opts, cmd) => {
|
|
292
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
293
|
+
const input = {
|
|
294
|
+
origin: opts.origin,
|
|
295
|
+
process: opts.process,
|
|
296
|
+
supplier: opts.supplier,
|
|
297
|
+
stocked: opts.stocked ? true : undefined,
|
|
298
|
+
priceMax: opts.priceMax !== undefined
|
|
299
|
+
? parseFiniteNumberArg(opts.priceMax, `Invalid --price-max: "${opts.priceMax}". Must be a number.`)
|
|
300
|
+
: undefined,
|
|
301
|
+
minScore: opts.minScore !== undefined
|
|
302
|
+
? parseFiniteNumberArg(opts.minScore, `Invalid --min-score: "${opts.minScore}". Must be a number.`)
|
|
303
|
+
: undefined,
|
|
304
|
+
includeUnscored: opts.includeUnscored ? true : undefined,
|
|
305
|
+
sampleSize: parseBoundedPositiveIntegerArg(opts.sampleSize, '--sample-size', 1, 5000),
|
|
306
|
+
limit: parseBoundedPositiveIntegerArg(opts.limit, '--limit', 1, 50),
|
|
307
|
+
};
|
|
308
|
+
const { supabase } = await requireAuth('viewer');
|
|
309
|
+
const data = await catalogRankPremium(supabase, input);
|
|
310
|
+
outputData(data, globalOpts);
|
|
311
|
+
}));
|
|
312
|
+
// ── catalog supplier aggregates ──────────────────────────────────────────
|
|
313
|
+
catalog
|
|
314
|
+
.command('supplier-list')
|
|
315
|
+
.description('List supplier aggregates from catalog rows')
|
|
316
|
+
.option('--stocked', 'Only include currently stocked coffees')
|
|
317
|
+
.option('--sample-size <n>', 'Catalog rows to fetch per page before aggregation (1-5000)', '5000')
|
|
318
|
+
.option('--limit <n>', 'Maximum suppliers to return (1-100)', '25')
|
|
319
|
+
.addHelpText('after', `
|
|
320
|
+
Examples:
|
|
321
|
+
purvey catalog supplier-list --stocked --pretty
|
|
322
|
+
purvey catalog supplier-list --limit 50 --json
|
|
323
|
+
|
|
324
|
+
Notes:
|
|
325
|
+
Aggregates supplier count, stocked count, Purveyor Score coverage, average score,
|
|
326
|
+
price range, origin coverage, process coverage, and representative top coffees.
|
|
327
|
+
Requires an authenticated viewer session.
|
|
328
|
+
`)
|
|
329
|
+
.action(withErrorHandling(async (opts, cmd) => {
|
|
330
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
331
|
+
const input = {
|
|
332
|
+
stocked: opts.stocked ? true : undefined,
|
|
333
|
+
sampleSize: parseBoundedPositiveIntegerArg(opts.sampleSize, '--sample-size', 1, 5000),
|
|
334
|
+
limit: parseBoundedPositiveIntegerArg(opts.limit, '--limit', 1, 100),
|
|
335
|
+
};
|
|
336
|
+
const { supabase } = await requireAuth('viewer');
|
|
337
|
+
const data = await supplierList(supabase, input);
|
|
338
|
+
outputData(data, globalOpts);
|
|
339
|
+
}));
|
|
340
|
+
catalog
|
|
341
|
+
.command('supplier-detail <supplier>')
|
|
342
|
+
.description('Show aggregate detail for a supplier query')
|
|
343
|
+
.option('--stocked', 'Only include currently stocked coffees')
|
|
344
|
+
.option('--top-coffees <n>', 'Representative top coffees to include (1-25)', '5')
|
|
345
|
+
.option('--sample-size <n>', 'Catalog rows to fetch per page before aggregation (1-5000)', '5000')
|
|
346
|
+
.addHelpText('after', `
|
|
347
|
+
Examples:
|
|
348
|
+
purvey catalog supplier-detail "Royal Coffee" --pretty
|
|
349
|
+
purvey catalog supplier-detail "Cafe Imports" --stocked --json
|
|
350
|
+
|
|
351
|
+
Notes:
|
|
352
|
+
Supplier matching is case-insensitive and partial, mirroring catalog search.
|
|
353
|
+
Requires an authenticated viewer session.
|
|
354
|
+
`)
|
|
355
|
+
.action(withErrorHandling(async (supplier, opts, cmd) => {
|
|
356
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
357
|
+
const input = {
|
|
358
|
+
supplier,
|
|
359
|
+
stocked: opts.stocked ? true : undefined,
|
|
360
|
+
topCoffees: parseBoundedPositiveIntegerArg(opts.topCoffees, '--top-coffees', 1, 25),
|
|
361
|
+
sampleSize: parseBoundedPositiveIntegerArg(opts.sampleSize, '--sample-size', 1, 5000),
|
|
362
|
+
};
|
|
363
|
+
const { supabase } = await requireAuth('viewer');
|
|
364
|
+
const data = await supplierDetail(supabase, input);
|
|
365
|
+
outputData(data, globalOpts);
|
|
366
|
+
}));
|
|
367
|
+
catalog
|
|
368
|
+
.command('supplier-rank')
|
|
369
|
+
.description('Rank suppliers by average Purveyor Score and stocked coverage')
|
|
370
|
+
.option('--stocked', 'Only include currently stocked coffees')
|
|
371
|
+
.option('--min-coffees <n>', 'Minimum catalog rows required per supplier', '1')
|
|
372
|
+
.option('--sample-size <n>', 'Catalog rows to fetch per page before aggregation (1-5000)', '5000')
|
|
373
|
+
.option('--limit <n>', 'Maximum suppliers to return (1-100)', '25')
|
|
374
|
+
.addHelpText('after', `
|
|
375
|
+
Examples:
|
|
376
|
+
purvey catalog supplier-rank --stocked --min-coffees 3 --pretty
|
|
377
|
+
purvey catalog supplier-rank --limit 10 --json
|
|
378
|
+
|
|
379
|
+
Notes:
|
|
380
|
+
Ranks suppliers by average Purveyor Score, then currently stocked count.
|
|
381
|
+
Requires an authenticated viewer session.
|
|
382
|
+
`)
|
|
383
|
+
.action(withErrorHandling(async (opts, cmd) => {
|
|
384
|
+
const globalOpts = cmd.optsWithGlobals();
|
|
385
|
+
const input = {
|
|
386
|
+
stocked: opts.stocked ? true : undefined,
|
|
387
|
+
minCoffees: parsePositiveIntegerArg(opts.minCoffees, `Invalid --min-coffees: "${opts.minCoffees}". Must be a positive integer.`),
|
|
388
|
+
sampleSize: parseBoundedPositiveIntegerArg(opts.sampleSize, '--sample-size', 1, 5000),
|
|
389
|
+
limit: parseBoundedPositiveIntegerArg(opts.limit, '--limit', 1, 100),
|
|
390
|
+
};
|
|
391
|
+
const { supabase } = await requireAuth('viewer');
|
|
392
|
+
const data = await supplierRank(supabase, input);
|
|
393
|
+
outputData(data, globalOpts);
|
|
394
|
+
}));
|
|
194
395
|
// ── catalog similar <id> ──────────────────────────────────────────────────
|
|
195
396
|
catalog
|
|
196
397
|
.command('similar <id>')
|
|
197
|
-
.description('Find similar
|
|
198
|
-
.option('--threshold <score>', 'Minimum similarity (0-
|
|
199
|
-
.option('--limit <count>', 'Max results', '10')
|
|
398
|
+
.description('Find canonical candidates and similar recommendations for a catalog coffee')
|
|
399
|
+
.option('--threshold <score>', 'Minimum canonical similarity threshold (0.5-0.99)', '0.70')
|
|
400
|
+
.option('--limit <count>', 'Max results (1-25)', '10')
|
|
200
401
|
.option('--stocked-only', 'Only show currently stocked beans')
|
|
402
|
+
.option('--mode <mode>', `Filter canonical groups by mode: ${catalogSimilarityModes.join(', ')}`, 'all')
|
|
201
403
|
.addHelpText('after', `
|
|
202
404
|
Examples:
|
|
203
405
|
purvey catalog similar 1182
|
|
204
406
|
purvey catalog similar 1182 --threshold 0.85 --stocked-only --pretty
|
|
205
|
-
purvey catalog similar 1182 --json | jq '.
|
|
407
|
+
purvey catalog similar 1182 --mode likely_same --json | jq '.data.groups.canonical_candidates'
|
|
408
|
+
purvey catalog similar 1182 --json | jq '.data.groups.similar_recommendations[0].match.classification.blockers'
|
|
206
409
|
|
|
207
410
|
Notes:
|
|
208
|
-
Uses
|
|
209
|
-
|
|
411
|
+
Uses the beta canonical /v1/catalog/{id}/similar contract.
|
|
412
|
+
JSON output is the canonical grouped response object, not the legacy flat RPC array.
|
|
413
|
+
data.groups.canonical_candidates are likely same-lot candidates.
|
|
414
|
+
data.groups.similar_recommendations are useful substitutes or profile matches.
|
|
415
|
+
Blockers, proof summaries, score dimensions, classification_version,
|
|
416
|
+
query_strategy, and pricing metadata are preserved when supplied by the API.
|
|
417
|
+
--threshold controls sensitivity (higher = more strict match, 0.5-0.99).
|
|
418
|
+
--mode can be all, likely_same, or similar_profile.
|
|
210
419
|
Default output is compact JSON. Use --pretty for formatted JSON.
|
|
211
|
-
|
|
212
|
-
Requires an authenticated viewer session.
|
|
420
|
+
Requires an authenticated member session, or a paid PARCHMENT_API_KEY/PURVEYORS_API_KEY.
|
|
213
421
|
`)
|
|
214
422
|
.action(withErrorHandling(async (id, opts, cmd) => {
|
|
215
423
|
const globalOpts = cmd.optsWithGlobals();
|
|
216
424
|
const coffeeId = parsePositiveIntegerArg(id, `Invalid ID: "${id}". Please provide a numeric coffee_catalog ID.`);
|
|
217
425
|
const threshold = parseFiniteNumberArg(opts.threshold, `Invalid --threshold: "${opts.threshold}". Must be a number between 0 and 1.`);
|
|
218
426
|
const limit = parsePositiveIntegerArg(opts.limit, `Invalid --limit: "${opts.limit}". Must be a positive integer.`);
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
// Confirm the target bean exists before running similarity lookup.
|
|
222
|
-
const { data: targetBean, error: targetError } = await supabase
|
|
223
|
-
.from('coffee_catalog')
|
|
224
|
-
.select('catalog_id')
|
|
225
|
-
.eq('catalog_id', coffeeId)
|
|
226
|
-
.single();
|
|
227
|
-
if (targetError || !targetBean) {
|
|
228
|
-
throw new PrvrsError('NOT_FOUND', `Coffee ID ${coffeeId} not found in catalog.`);
|
|
427
|
+
if (threshold < 0.5 || threshold > 0.99) {
|
|
428
|
+
throw new PrvrsError('INVALID_ARGUMENT', `Invalid --threshold: "${opts.threshold}". Must be a number between 0.5 and 0.99.`);
|
|
229
429
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
coffee_id: coffeeId,
|
|
233
|
-
threshold: threshold,
|
|
234
|
-
limit: limit,
|
|
235
|
-
});
|
|
236
|
-
if (results.length === 0) {
|
|
237
|
-
info(`No embeddings found for coffee ID ${coffeeId}.`);
|
|
238
|
-
return;
|
|
430
|
+
if (limit > 25) {
|
|
431
|
+
throw new PrvrsError('INVALID_ARGUMENT', `Invalid --limit: "${opts.limit}". Must be a positive integer up to 25.`);
|
|
239
432
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
filtered = filtered.filter((r) => r.stocked);
|
|
244
|
-
if (filtered.length === 0) {
|
|
245
|
-
info('No stocked beans found matching the similarity threshold.');
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
433
|
+
const mode = opts.mode;
|
|
434
|
+
if (!catalogSimilarityModes.includes(mode)) {
|
|
435
|
+
throw new PrvrsError('INVALID_ARGUMENT', `Invalid --mode: "${mode}". Must be one of: ${catalogSimilarityModes.join(', ')}.`);
|
|
248
436
|
}
|
|
249
|
-
|
|
437
|
+
const stockedOnly = Boolean(opts.stockedOnly);
|
|
438
|
+
const supabase = await resolveCatalogReadClient('member', true);
|
|
439
|
+
const response = await getCatalogSimilarity(supabase, {
|
|
440
|
+
coffee_id: coffeeId,
|
|
441
|
+
threshold,
|
|
442
|
+
limit,
|
|
443
|
+
stockedOnly,
|
|
444
|
+
mode: mode,
|
|
445
|
+
});
|
|
446
|
+
outputData(response, globalOpts);
|
|
250
447
|
}));
|
|
251
448
|
return catalog;
|
|
252
449
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EACL,aAAa,EACb,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;AAEpD,SAAS,oBAAoB,CAAC,QAAgB,EAAE,OAAe;IAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAgB,EAAE,OAAe;IAChE,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,0BAA0B,CAAC,QAAgB,EAAE,OAAe;IACnE,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,2BAA2B,CAAC,CAAC;IAEhF,6EAA6E;IAC7E,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,oBAAoB,EAAE,oDAAoD,CAAC;SAClF,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,iBAAiB,EAAE,4BAA4B,CAAC;SACvD,MAAM,CAAC,qBAAqB,EAAE,2DAA2D,CAAC;SAC1F,MAAM,CAAC,eAAe,EAAE,yDAAyD,CAAC;SAClF,MAAM,CAAC,mBAAmB,EAAE,kEAAkE,CAAC;SAC/F,MAAM,CAAC,iBAAiB,EAAE,6DAA6D,CAAC;SACxF,MAAM,CAAC,kBAAkB,EAAE,mDAAmD,CAAC;SAC/E,MAAM,CAAC,wBAAwB,EAAE,yCAAyC,CAAC;SAC3E,MAAM,CAAC,oBAAoB,EAAE,yCAAyC,CAAC;SACvE,MAAM,CAAC,WAAW,EAAE,qCAAqC,CAAC;SAC1D,MAAM,CAAC,gBAAgB,EAAE,oBAAoB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SAC5E,MAAM,CAAC,cAAc,EAAE,iCAAiC,EAAE,GAAG,CAAC;SAC9D,MAAM,CAAC,aAAa,EAAE,2BAA2B,EAAE,IAAI,CAAC;SACxD,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QACtE,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAE1D,8BAA8B;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,IAA0B,CAAC;QAClD,IAAI,SAAS,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAA6B,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,0BAA0B,SAAS,sBAAsB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxF,CAAC;QACJ,CAAC;QAED,wCAAwC;QACxC,IAAI,SAA+B,CAAC;QACpC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAI,IAAI,CAAC,GAAc;iBAC7B,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;YACnB,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;gBACxB,IAAI,CAAC,IAAI,CACP,uBAAuB,CACrB,KAAK,EACL,yBAAyB,KAAK,wCAAwC,CACvE,CACF,CAAC;YACJ,CAAC;YACD,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,KAAK,SAAS;YACzB,CAAC,CAAC,oBAAoB,CAClB,IAAI,CAAC,QAAkB,EACvB,yBAAyB,IAAI,CAAC,QAAQ,sBAAsB,CAC7D;YACH,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,KAAK,SAAS;YACzB,CAAC,CAAC,oBAAoB,CAClB,IAAI,CAAC,QAAkB,EACvB,yBAAyB,IAAI,CAAC,QAAQ,sBAAsB,CAC7D;YACH,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,WAAW,GACf,IAAI,CAAC,WAAW,KAAK,SAAS;YAC5B,CAAC,CAAC,uBAAuB,CACrB,IAAI,CAAC,WAAqB,EAC1B,4BAA4B,IAAI,CAAC,WAAW,gCAAgC,CAC7E;YACH,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,KAAK,SAAS;YACvB,CAAC,CAAC,0BAA0B,CACxB,IAAI,CAAC,MAAgB,EACrB,sBAAsB,IAAI,CAAC,MAAM,oCAAoC,CACtE;YACH,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,KAAK,GAAG,uBAAuB,CACnC,IAAI,CAAC,KAAe,EACpB,qBAAqB,IAAI,CAAC,KAAK,gCAAgC,CAChE,CAAC;QAEF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE;YACzC,MAAM,EAAE,IAAI,CAAC,MAA4B;YACzC,OAAO,EAAE,IAAI,CAAC,OAA6B;YAC3C,QAAQ;YACR,QAAQ;YACR,MAAM,EAAE,IAAI,CAAC,MAA4B;YACzC,IAAI,EAAE,IAAI,CAAC,IAA0B;YACrC,QAAQ,EAAE,IAAI,CAAC,QAA8B;YAC7C,GAAG,EAAE,SAAS;YACd,OAAO,EAAE,IAAI,CAAC,OAA6B;YAC3C,YAAY,EAAE,IAAI,CAAC,YAAkC;YACrD,WAAW;YACX,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACxC,IAAI,EAAE,SAAyC;YAC/C,MAAM;YACN,KAAK;SACN,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CACH,CAAC;IAEJ,6EAA6E;IAC7E,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,WAAW,CACV,OAAO,EACP;;;;;;;;;;CAUL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,EAAU,EAAE,KAA8B,EAAE,GAAY,EAAE,EAAE;QACnF,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAC1D,MAAM,SAAS,GAAG,uBAAuB,CACvC,EAAE,EACF,gBAAgB,EAAE,gDAAgD,CACnE,CAAC;QAEF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACnD,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC,CACH,CAAC;IAEJ,6EAA6E;IAC7E,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,WAAW,CACV,OAAO,EACP;;;;;;;;;;CAUL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,KAA8B,EAAE,GAAY,EAAE,EAAE;QACvE,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAC1D,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC9C,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAChC,CAAC,CAAC,CACH,CAAC;IAEJ,6EAA6E;IAC7E,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,CAAC;SACjE,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,IAAI,CAAC;SAC9C,MAAM,CAAC,gBAAgB,EAAE,mCAAmC,CAAC;SAC7D,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;CAYL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,EAAU,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QAClF,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAE1D,MAAM,QAAQ,GAAG,uBAAuB,CACtC,EAAE,EACF,gBAAgB,EAAE,gDAAgD,CACnE,CAAC;QAEF,MAAM,SAAS,GAAG,oBAAoB,CACpC,IAAI,CAAC,SAAmB,EACxB,yBAAyB,IAAI,CAAC,SAAS,sCAAsC,CAC9E,CAAC;QACF,MAAM,KAAK,GAAG,uBAAuB,CACnC,IAAI,CAAC,KAAe,EACpB,qBAAqB,IAAI,CAAC,KAAK,gCAAgC,CAChE,CAAC;QACF,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEjD,mEAAmE;QACnE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,QAAQ;aAC5D,IAAI,CAAC,gBAAgB,CAAC;aACtB,MAAM,CAAC,YAAY,CAAC;aACpB,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC;aAC1B,MAAM,EAAE,CAAC;QAEZ,IAAI,WAAW,IAAI,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,IAAI,UAAU,CAAC,WAAW,EAAE,aAAa,QAAQ,wBAAwB,CAAC,CAAC;QACnF,CAAC;QAED,wBAAwB;QACxB,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE;YAC/C,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,qCAAqC,QAAQ,GAAG,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,kCAAkC;QAClC,IAAI,QAAQ,GAAkB,OAAO,CAAC;QACtC,IAAI,WAAW,EAAE,CAAC;YAChB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,2DAA2D,CAAC,CAAC;gBAClE,OAAO;YACT,CAAC;QACH,CAAC;QAED,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACnC,CAAC,CAAC,CACH,CAAC;IAEJ,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,mBAAmB,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,mBAAmB,IAAI,OAAO,CAoD7C"}
|
package/dist/commands/context.js
CHANGED
|
@@ -4,12 +4,14 @@ import { getCliManifest, renderContextText } from '../lib/manifest.js';
|
|
|
4
4
|
import { outputData } from '../lib/output.js';
|
|
5
5
|
export function buildContextCommand() {
|
|
6
6
|
return new Command('context')
|
|
7
|
-
.description('Output the dense human-readable
|
|
7
|
+
.description('Output the dense human-readable operator reference; use --json/--pretty only for manifest parity')
|
|
8
8
|
.option('--json', 'Emit the machine-readable manifest contract as compact JSON')
|
|
9
9
|
.option('--pretty', 'Emit the machine-readable manifest contract as indented JSON')
|
|
10
10
|
.addHelpText('after', `
|
|
11
|
-
Default output is dense human-readable reference
|
|
12
|
-
|
|
11
|
+
Default output is the dense human-readable operator reference.
|
|
12
|
+
Preferred machine contract: \`purvey manifest\`.
|
|
13
|
+
Use --json or --pretty only when an existing \`purvey context\` caller needs manifest parity.
|
|
14
|
+
Use \`@purveyors/cli/manifest\` for the same contract inside Node.js or agent runtimes.
|
|
13
15
|
|
|
14
16
|
Examples:
|
|
15
17
|
purvey context
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;SAC1B,WAAW,CACV,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;SAC1B,WAAW,CACV,kGAAkG,CACnG;SACA,MAAM,CAAC,QAAQ,EAAE,6DAA6D,CAAC;SAC/E,MAAM,CAAC,UAAU,EAAE,8DAA8D,CAAC;SAClF,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;CAaL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QACtE,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAC1D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,SAAS,GACb,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YACpB,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YACxB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAE7B,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,4EAA4E,CAC7E,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,UAAU,CAAC,QAAQ,EAAE;gBACnB,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;aAC3D,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CACH,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/commands/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,oBAAoB,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/commands/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,oBAAoB,IAAI,OAAO,CAsC9C"}
|
|
@@ -4,15 +4,19 @@ import { getCliManifest } from '../lib/manifest.js';
|
|
|
4
4
|
import { outputData } from '../lib/output.js';
|
|
5
5
|
export function buildManifestCommand() {
|
|
6
6
|
return new Command('manifest')
|
|
7
|
-
.description('Output the machine-readable CLI manifest contract')
|
|
7
|
+
.description('Output the preferred stable machine-readable CLI manifest contract for shells and agents')
|
|
8
8
|
.option('--json', 'Emit the manifest as compact JSON (default)')
|
|
9
9
|
.option('--pretty', 'Emit the manifest as indented JSON')
|
|
10
10
|
.addHelpText('after', `
|
|
11
|
+
Preferred machine-readable entrypoint for shells, scripts, and agents.
|
|
12
|
+
Use \`purvey context --json\` only for compatibility with existing context-based callers.
|
|
13
|
+
|
|
11
14
|
Examples:
|
|
12
15
|
purvey manifest
|
|
13
16
|
purvey manifest --pretty
|
|
14
17
|
purvey manifest > cli-manifest.json
|
|
15
18
|
purvey manifest | jq '.commandGroups[].name'
|
|
19
|
+
node --input-type=module -e "import { getCliManifest } from '@purveyors/cli/manifest'; console.log(JSON.stringify(getCliManifest()))"
|
|
16
20
|
`)
|
|
17
21
|
.action(withErrorHandling(async (opts, cmd) => {
|
|
18
22
|
const globalOpts = cmd.optsWithGlobals();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/commands/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;SAC3B,WAAW,
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/commands/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;SAC3B,WAAW,CACV,0FAA0F,CAC3F;SACA,MAAM,CAAC,QAAQ,EAAE,6CAA6C,CAAC;SAC/D,MAAM,CAAC,UAAU,EAAE,oCAAoC,CAAC;SACxD,WAAW,CACV,OAAO,EACP;;;;;;;;;;CAUL,CACI;SACA,MAAM,CACL,iBAAiB,CAAC,KAAK,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QACtE,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAmB,CAAC;QAE1D,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,sEAAsE,CACvE,CAAC;QACJ,CAAC;QAED,UAAU,CAAC,cAAc,EAAE,EAAE;YAC3B,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;SAC3D,CAAC,CAAC;IACL,CAAC,CAAC,CACH,CAAC;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roast.d.ts","sourceRoot":"","sources":["../../src/commands/roast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EAEhB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"roast.d.ts","sourceRoot":"","sources":["../../src/commands/roast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAQzB,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAIhE;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAw6B3C"}
|