@purveyors/cli 0.15.1 → 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.
@@ -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, findSimilarBeans, computeCatalogStats, sanitizeFilterValue, catalogSortFields, } from '../lib/catalog.js';
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 { supabase } = await requireAuth('viewer');
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, _opts, cmd) => {
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 { supabase } = await requireAuth('viewer');
170
- const data = await getCatalog(supabase, catalogId);
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 beans across all suppliers')
198
- .option('--threshold <score>', 'Minimum similarity (0-1)', '0.70')
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 '.[0]'
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 pgvector cosine similarity on tasting notes and bean descriptors.
209
- --threshold controls sensitivity (higher = more strict match).
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
- Returns beans sorted by similarity score (highest first).
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
- const stockedOnly = Boolean(opts.stockedOnly);
220
- const { supabase } = await requireAuth('viewer');
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
- // Call the lib function
231
- const results = await findSimilarBeans(supabase, {
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
- // Filter stocked-only client-side
241
- let filtered = results;
242
- if (stockedOnly) {
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
- outputData(filtered, globalOpts);
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":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/commands/catalog.ts"],"names":[],"mappings":"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"}
@@ -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;AAOzB,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAIhE;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAk6B3C"}
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"}
@@ -8,6 +8,7 @@ import { requireAuth } from '../lib/auth-guard.js';
8
8
  import { confirm, todayIso } from '../lib/prompts.js';
9
9
  import { listRoasts, getRoast, createRoast, deleteRoast, updateRoast, importRoastFromFile, } from '../lib/roast.js';
10
10
  import { pickBean, guardCancel } from '../lib/interactive/forms.js';
11
+ import { normalizePathInput } from '../lib/path-input.js';
11
12
  import { startWatch, loadWatchSession } from '../lib/interactive/watch.js';
12
13
  import { getConfigValue } from '../lib/config.js';
13
14
  // ─── Command builder ──────────────────────────────────────────────────────────
@@ -375,7 +376,7 @@ Required: <file> path and --coffee-id (unless using --form)
375
376
  },
376
377
  });
377
378
  guardCancel(filePathRaw);
378
- const filePath = String(filePathRaw).trim();
379
+ const filePath = normalizePathInput(String(filePathRaw));
379
380
  // Validate file exists (async check after prompt)
380
381
  try {
381
382
  await access(filePath);
@@ -451,15 +452,16 @@ Required: <file> path and --coffee-id (unless using --form)
451
452
  throw new PrvrsError('INVALID_ARGUMENT', 'Missing file argument. Use --form for interactive mode.');
452
453
  }
453
454
  // 1. Validate file exists and is readable
455
+ const filePath = normalizePathInput(file);
454
456
  try {
455
- await access(file);
457
+ await access(filePath);
456
458
  }
457
459
  catch {
458
- throw new PrvrsError('INVALID_ARGUMENT', `File not found or not readable: "${file}"`);
460
+ throw new PrvrsError('INVALID_ARGUMENT', `File not found or not readable: "${filePath}"`);
459
461
  }
460
462
  // 2. Read file content
461
- const fileContent = await readFile(file, 'utf-8');
462
- const fileName = basename(file);
463
+ const fileContent = await readFile(filePath, 'utf-8');
464
+ const fileName = basename(filePath);
463
465
  // 3. Authenticate
464
466
  const { supabase, userId } = await requireAuth('member');
465
467
  // 4. Parse --coffee-id
@@ -570,7 +572,6 @@ Notes:
570
572
  commitMode: saved.commitMode ?? 'batch',
571
573
  startedAt: saved.startedAt,
572
574
  resumeImports: saved.imports,
573
- startSequence: saved.imports.length,
574
575
  ozIn: saved.ozIn,
575
576
  roastNotes: saved.roastNotes,
576
577
  roastTargets: saved.roastTargets,
@@ -589,7 +590,7 @@ Notes:
589
590
  },
590
591
  });
591
592
  guardCancel(dirRaw);
592
- const watchDir = String(dirRaw).trim();
593
+ const watchDir = normalizePathInput(String(dirRaw));
593
594
  try {
594
595
  await access(watchDir);
595
596
  }
@@ -739,7 +740,8 @@ Notes:
739
740
  coffeeName = catalog?.name ?? `Coffee #${coffeeId}`;
740
741
  }
741
742
  const batchPrefix = opts.batchPrefix ?? coffeeName;
742
- await startWatch(supabase, userId, directory, {
743
+ const watchDir = normalizePathInput(directory);
744
+ await startWatch(supabase, userId, watchDir, {
743
745
  coffeeId,
744
746
  coffeeName,
745
747
  batchPrefix,