@purveyors/cli 0.9.6 → 0.15.1

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.
Files changed (63) hide show
  1. package/README.md +476 -159
  2. package/dist/commands/auth.d.ts.map +1 -1
  3. package/dist/commands/auth.js +4 -3
  4. package/dist/commands/auth.js.map +1 -1
  5. package/dist/commands/catalog.d.ts.map +1 -1
  6. package/dist/commands/catalog.js +55 -31
  7. package/dist/commands/catalog.js.map +1 -1
  8. package/dist/commands/config.d.ts.map +1 -1
  9. package/dist/commands/config.js +61 -12
  10. package/dist/commands/config.js.map +1 -1
  11. package/dist/commands/context.d.ts.map +1 -1
  12. package/dist/commands/context.js +34 -234
  13. package/dist/commands/context.js.map +1 -1
  14. package/dist/commands/manifest.d.ts +3 -0
  15. package/dist/commands/manifest.d.ts.map +1 -0
  16. package/dist/commands/manifest.js +32 -0
  17. package/dist/commands/manifest.js.map +1 -0
  18. package/dist/commands/roast.d.ts.map +1 -1
  19. package/dist/commands/roast.js +105 -2
  20. package/dist/commands/roast.js.map +1 -1
  21. package/dist/commands/sales.d.ts.map +1 -1
  22. package/dist/commands/sales.js +87 -40
  23. package/dist/commands/sales.js.map +1 -1
  24. package/dist/index.js +6 -105
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/config.d.ts.map +1 -1
  27. package/dist/lib/config.js +8 -2
  28. package/dist/lib/config.js.map +1 -1
  29. package/dist/lib/errors.d.ts +13 -1
  30. package/dist/lib/errors.d.ts.map +1 -1
  31. package/dist/lib/errors.js +153 -10
  32. package/dist/lib/errors.js.map +1 -1
  33. package/dist/lib/index.d.ts +1 -0
  34. package/dist/lib/index.d.ts.map +1 -1
  35. package/dist/lib/index.js +1 -0
  36. package/dist/lib/index.js.map +1 -1
  37. package/dist/lib/interactive/watch.d.ts +37 -3
  38. package/dist/lib/interactive/watch.d.ts.map +1 -1
  39. package/dist/lib/interactive/watch.js +237 -81
  40. package/dist/lib/interactive/watch.js.map +1 -1
  41. package/dist/lib/manifest.d.ts +107 -0
  42. package/dist/lib/manifest.d.ts.map +1 -0
  43. package/dist/lib/manifest.js +977 -0
  44. package/dist/lib/manifest.js.map +1 -0
  45. package/dist/lib/output.d.ts +10 -0
  46. package/dist/lib/output.d.ts.map +1 -1
  47. package/dist/lib/output.js +33 -18
  48. package/dist/lib/output.js.map +1 -1
  49. package/dist/lib/roast.d.ts +2 -0
  50. package/dist/lib/roast.d.ts.map +1 -1
  51. package/dist/lib/roast.js +5 -2
  52. package/dist/lib/roast.js.map +1 -1
  53. package/dist/lib/sales.d.ts +15 -2
  54. package/dist/lib/sales.d.ts.map +1 -1
  55. package/dist/lib/sales.js +77 -15
  56. package/dist/lib/sales.js.map +1 -1
  57. package/dist/program.d.ts +4 -0
  58. package/dist/program.d.ts.map +1 -0
  59. package/dist/program.js +135 -0
  60. package/dist/program.js.map +1 -0
  61. package/dist/types/index.d.ts +4 -0
  62. package/dist/types/index.d.ts.map +1 -1
  63. package/package.json +7 -1
@@ -1,4 +1,32 @@
1
1
  import chalk from 'chalk';
2
+ import { CommanderError } from 'commander';
3
+ import { ZodError } from 'zod';
4
+ import { formatStructuredOutput, outputOptionsFromArgv, shouldUseInteractiveOutput, } from './output.js';
5
+ export const EXIT_CODES = {
6
+ OK: 0,
7
+ GENERAL_ERROR: 1,
8
+ INVALID_ARGUMENT: 2,
9
+ AUTH_ERROR: 3,
10
+ NOT_FOUND: 4,
11
+ DEPENDENCY_CONFLICT: 5,
12
+ CONFIG_ERROR: 6,
13
+ };
14
+ const PRVRS_ERROR_EXIT_CODES = {
15
+ INVALID_ARGUMENT: EXIT_CODES.INVALID_ARGUMENT,
16
+ AUTH_ERROR: EXIT_CODES.AUTH_ERROR,
17
+ NOT_FOUND: EXIT_CODES.NOT_FOUND,
18
+ DEPENDENCY_CONFLICT: EXIT_CODES.DEPENDENCY_CONFLICT,
19
+ CONFIG_ERROR: EXIT_CODES.CONFIG_ERROR,
20
+ };
21
+ const COMMANDER_INVALID_ARGUMENT_CODES = new Set([
22
+ 'commander.invalidArgument',
23
+ 'commander.missingArgument',
24
+ 'commander.optionMissingArgument',
25
+ 'commander.missingMandatoryOptionValue',
26
+ 'commander.unknownOption',
27
+ 'commander.unknownCommand',
28
+ 'commander.excessArguments',
29
+ ]);
2
30
  export class PrvrsError extends Error {
3
31
  code;
4
32
  details;
@@ -21,26 +49,141 @@ export class ConfigError extends PrvrsError {
21
49
  this.name = 'ConfigError';
22
50
  }
23
51
  }
52
+ function normalizeCommanderErrorMessage(message) {
53
+ const normalized = message.replace(/^error:\s*/i, '').trim();
54
+ if (!normalized) {
55
+ return 'Commander parse error';
56
+ }
57
+ return normalized.charAt(0).toUpperCase() + normalized.slice(1);
58
+ }
59
+ export function normalizeCliError(error) {
60
+ if (!(error instanceof CommanderError)) {
61
+ return error;
62
+ }
63
+ const code = COMMANDER_INVALID_ARGUMENT_CODES.has(error.code)
64
+ ? 'INVALID_ARGUMENT'
65
+ : 'GENERAL_ERROR';
66
+ return new PrvrsError(code, normalizeCommanderErrorMessage(error.message), {
67
+ commanderCode: error.code,
68
+ commanderExitCode: error.exitCode,
69
+ ...(error.nestedError ? { nestedError: error.nestedError } : {}),
70
+ });
71
+ }
72
+ export function exitCodeForError(error) {
73
+ const normalized = normalizeCliError(error);
74
+ if (normalized instanceof PrvrsError) {
75
+ return PRVRS_ERROR_EXIT_CODES[normalized.code] ?? EXIT_CODES.GENERAL_ERROR;
76
+ }
77
+ if (normalized instanceof ZodError) {
78
+ return EXIT_CODES.INVALID_ARGUMENT;
79
+ }
80
+ return EXIT_CODES.GENERAL_ERROR;
81
+ }
82
+ function errorCodeLabel(error) {
83
+ const normalized = normalizeCliError(error);
84
+ if (normalized instanceof PrvrsError) {
85
+ return normalized.code;
86
+ }
87
+ if (normalized instanceof ZodError) {
88
+ return 'INVALID_ARGUMENT';
89
+ }
90
+ return 'GENERAL_ERROR';
91
+ }
92
+ function formatZodErrorMessage(error) {
93
+ const issue = error.issues[0];
94
+ if (!issue) {
95
+ return 'Invalid arguments.';
96
+ }
97
+ const path = issue.path.length > 0 ? ` (${issue.path.join('.')})` : '';
98
+ return `Invalid argument${path}: ${issue.message}`;
99
+ }
100
+ function errorMessageForError(error) {
101
+ const normalized = normalizeCliError(error);
102
+ if (normalized instanceof PrvrsError) {
103
+ return normalized.message;
104
+ }
105
+ if (normalized instanceof ZodError) {
106
+ return formatZodErrorMessage(normalized);
107
+ }
108
+ if (normalized instanceof Error) {
109
+ return normalized.message;
110
+ }
111
+ return 'An unknown error occurred';
112
+ }
113
+ function errorDetailsForError(error) {
114
+ if (!process.env.PURVEY_DEBUG) {
115
+ return undefined;
116
+ }
117
+ const normalized = normalizeCliError(error);
118
+ if (normalized instanceof PrvrsError) {
119
+ return normalized.details;
120
+ }
121
+ if (normalized instanceof ZodError) {
122
+ return normalized.issues;
123
+ }
124
+ if (normalized instanceof Error && normalized.stack) {
125
+ return { stack: normalized.stack };
126
+ }
127
+ return undefined;
128
+ }
129
+ function buildCliErrorEnvelope(error) {
130
+ const envelope = {
131
+ error: true,
132
+ code: errorCodeLabel(error),
133
+ exitCode: exitCodeForError(error),
134
+ message: errorMessageForError(error),
135
+ };
136
+ const details = errorDetailsForError(error);
137
+ if (details !== undefined) {
138
+ envelope.details = details;
139
+ }
140
+ return envelope;
141
+ }
142
+ function shouldUseStructuredErrorOutput(argv = process.argv) {
143
+ const options = outputOptionsFromArgv(argv);
144
+ // Keep human-readable errors only when the whole invocation is interactive.
145
+ // If either stdout or stderr is redirected, prefer the machine contract.
146
+ const isFullyInteractive = Boolean(process.stdout.isTTY && process.stderr.isTTY);
147
+ return !shouldUseInteractiveOutput(options, isFullyInteractive);
148
+ }
149
+ function writeStructuredError(error, argv = process.argv) {
150
+ const options = outputOptionsFromArgv(argv);
151
+ const formatted = formatStructuredOutput(buildCliErrorEnvelope(error), {
152
+ pretty: options.pretty,
153
+ });
154
+ process.stderr.write(`${formatted}\n`);
155
+ }
24
156
  /**
25
- * Print a formatted error to stderr and exit with code 1.
157
+ * Print a formatted error to stderr and exit with a structured exit code.
26
158
  */
27
159
  export function fatal(error) {
28
- if (error instanceof PrvrsError) {
29
- console.error(chalk.red(`✖ ${error.message}`));
30
- if (process.env.PURVEY_DEBUG && error.details) {
31
- console.error(chalk.dim('Details:'), error.details);
160
+ const normalized = normalizeCliError(error);
161
+ if (shouldUseStructuredErrorOutput()) {
162
+ writeStructuredError(normalized);
163
+ process.exit(exitCodeForError(normalized));
164
+ }
165
+ if (normalized instanceof PrvrsError) {
166
+ console.error(chalk.red(`✖ ${normalized.message}`));
167
+ if (process.env.PURVEY_DEBUG && normalized.details) {
168
+ console.error(chalk.dim('Details:'), normalized.details);
169
+ }
170
+ }
171
+ else if (normalized instanceof ZodError) {
172
+ console.error(chalk.red(`✖ ${formatZodErrorMessage(normalized)}`));
173
+ if (process.env.PURVEY_DEBUG) {
174
+ console.error(chalk.dim(JSON.stringify(normalized.issues, null, 2)));
32
175
  }
33
176
  }
34
- else if (error instanceof Error) {
35
- console.error(chalk.red(`✖ ${error.message}`));
36
- if (process.env.PURVEY_DEBUG && error.stack) {
37
- console.error(chalk.dim(error.stack));
177
+ else if (normalized instanceof Error) {
178
+ console.error(chalk.red(`✖ ${normalized.message}`));
179
+ if (process.env.PURVEY_DEBUG && normalized.stack) {
180
+ console.error(chalk.dim(normalized.stack));
38
181
  }
39
182
  }
40
183
  else {
41
184
  console.error(chalk.red('✖ An unknown error occurred'));
42
185
  }
43
- process.exit(1);
186
+ process.exit(exitCodeForError(normalized));
44
187
  }
45
188
  /**
46
189
  * Wrap an async command handler to catch and format errors.
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnB,IAAI,CAAS;IACb,OAAO,CAAW;IAElC,YAAY,IAAY,EAAE,OAAe,EAAE,OAAiB;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,UAAU;IACvC,YAAY,OAAe,EAAE,OAAiB;QAC5C,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC,YAAY,OAAe,EAAE,OAAiB;QAC5C,KAAK,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,KAAc;IAClC,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC9C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,EAAiC;IAEjC,OAAO,KAAK,EAAE,GAAG,IAAO,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE/B,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,EAAE,EAAE,CAAC;IACL,aAAa,EAAE,CAAC;IAChB,gBAAgB,EAAE,CAAC;IACnB,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC;IACZ,mBAAmB,EAAE,CAAC;IACtB,YAAY,EAAE,CAAC;CACP,CAAC;AAIX,MAAM,sBAAsB,GAAsC;IAChE,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;IAC7C,UAAU,EAAE,UAAU,CAAC,UAAU;IACjC,SAAS,EAAE,UAAU,CAAC,SAAS;IAC/B,mBAAmB,EAAE,UAAU,CAAC,mBAAmB;IACnD,YAAY,EAAE,UAAU,CAAC,YAAY;CACtC,CAAC;AAEF,MAAM,gCAAgC,GAAG,IAAI,GAAG,CAAC;IAC/C,2BAA2B;IAC3B,2BAA2B;IAC3B,iCAAiC;IACjC,uCAAuC;IACvC,yBAAyB;IACzB,0BAA0B;IAC1B,2BAA2B;CAC5B,CAAC,CAAC;AAEH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnB,IAAI,CAAS;IACb,OAAO,CAAW;IAElC,YAAY,IAAY,EAAE,OAAe,EAAE,OAAiB;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,SAAU,SAAQ,UAAU;IACvC,YAAY,OAAe,EAAE,OAAiB;QAC5C,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC,YAAY,OAAe,EAAE,OAAiB;QAC5C,KAAK,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,SAAS,8BAA8B,CAAC,OAAe;IACrD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,CAAC,CAAC,KAAK,YAAY,cAAc,CAAC,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,gCAAgC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QAC3D,CAAC,CAAC,kBAAkB;QACpB,CAAC,CAAC,eAAe,CAAC;IAEpB,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,8BAA8B,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;QACzE,aAAa,EAAE,KAAK,CAAC,IAAI;QACzB,iBAAiB,EAAE,KAAK,CAAC,QAAQ;QACjC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,UAAU,YAAY,UAAU,EAAE,CAAC;QACrC,OAAO,sBAAsB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,aAAa,CAAC;IAC7E,CAAC;IAED,IAAI,UAAU,YAAY,QAAQ,EAAE,CAAC;QACnC,OAAO,UAAU,CAAC,gBAAgB,CAAC;IACrC,CAAC;IAED,OAAO,UAAU,CAAC,aAAa,CAAC;AAClC,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,UAAU,YAAY,UAAU,EAAE,CAAC;QACrC,OAAO,UAAU,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,UAAU,YAAY,QAAQ,EAAE,CAAC;QACnC,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAe;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,OAAO,mBAAmB,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,UAAU,YAAY,UAAU,EAAE,CAAC;QACrC,OAAO,UAAU,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,IAAI,UAAU,YAAY,QAAQ,EAAE,CAAC;QACnC,OAAO,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,UAAU,YAAY,KAAK,EAAE,CAAC;QAChC,OAAO,UAAU,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,OAAO,2BAA2B,CAAC;AACrC,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,UAAU,YAAY,UAAU,EAAE,CAAC;QACrC,OAAO,UAAU,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,IAAI,UAAU,YAAY,QAAQ,EAAE,CAAC;QACnC,OAAO,UAAU,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI,UAAU,YAAY,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpD,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,MAAM,QAAQ,GAAqB;QACjC,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC;QAC3B,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC;QACjC,OAAO,EAAE,oBAAoB,CAAC,KAAK,CAAC;KACrC,CAAC;IAEF,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,8BAA8B,CAAC,OAAiB,OAAO,CAAC,IAAI;IACnE,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAE5C,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjF,OAAO,CAAC,0BAA0B,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,OAAiB,OAAO,CAAC,IAAI;IACzE,MAAM,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,sBAAsB,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE;QACrE,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,KAAc;IAClC,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,8BAA8B,EAAE,EAAE,CAAC;QACrC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,UAAU,YAAY,UAAU,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;SAAM,IAAI,UAAU,YAAY,QAAQ,EAAE,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACnE,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;SAAM,IAAI,UAAU,YAAY,KAAK,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,EAAiC;IAEjC,OAAO,KAAK,EAAE,GAAG,IAAO,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,CAAC,CAAC;QACf,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export * from './catalog.js';
2
2
  export * from './inventory.js';
3
+ export * from './manifest.js';
3
4
  export * from './roast.js';
4
5
  export * from './sales.js';
5
6
  export * from './tasting.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAMA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAMA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
package/dist/lib/index.js CHANGED
@@ -5,6 +5,7 @@
5
5
  // import { listInventory } from '@purveyors/cli/inventory'
6
6
  export * from './catalog.js';
7
7
  export * from './inventory.js';
8
+ export * from './manifest.js';
8
9
  export * from './roast.js';
9
10
  export * from './sales.js';
10
11
  export * from './tasting.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,2EAA2E;AAC3E,qCAAqC;AACrC,2DAA2D;AAC3D,6DAA6D;AAE7D,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,2EAA2E;AAC3E,qCAAqC;AACrC,2DAA2D;AAC3D,6DAA6D;AAE7D,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -2,16 +2,25 @@
2
2
  * Watch module for `purvey roast watch`.
3
3
  * CLI-only — not exported via package.json subpaths.
4
4
  *
5
- * Monitors a directory for new .alog files, imports them automatically,
5
+ * Monitors a directory for new .alog files, queues or imports them,
6
6
  * and shows a verification table when the session ends (Ctrl+C).
7
7
  */
8
+ import { watch } from 'fs';
9
+ import { readFile, access } from 'fs/promises';
8
10
  import type { SupabaseClient } from '@supabase/supabase-js';
11
+ import { importRoastFromFile } from '../roast.js';
9
12
  import type { MilestoneData, ProcessedRoastData } from '../artisan/types.js';
10
13
  export interface WatchSession {
11
14
  directory: string;
12
15
  coffeeId: number;
13
16
  coffeeName: string;
14
17
  batchPrefix: string;
18
+ promptEach?: boolean;
19
+ autoMatch?: boolean;
20
+ commitMode?: 'batch' | 'individual';
21
+ ozIn?: number;
22
+ roastNotes?: string;
23
+ roastTargets?: string;
15
24
  startedAt: string;
16
25
  imports: ImportRecord[];
17
26
  }
@@ -19,11 +28,13 @@ export interface ImportRecord {
19
28
  fileName: string;
20
29
  roastId: number | null;
21
30
  batchName: string;
22
- status: 'success' | 'failed' | 'needs-review';
31
+ status: 'pending' | 'success' | 'failed' | 'needs-review';
23
32
  error?: string;
24
33
  milestones?: MilestoneData;
25
34
  phases?: ProcessedRoastData['phases'];
26
35
  importedAt: string;
36
+ selectedCoffeeId?: number;
37
+ selectedCoffeeName?: string;
27
38
  aiMatch?: {
28
39
  coffeeName: string;
29
40
  confidence: number;
@@ -34,10 +45,33 @@ interface StartWatchOpts {
34
45
  coffeeId: number;
35
46
  coffeeName: string;
36
47
  batchPrefix: string;
48
+ commitMode?: 'batch' | 'individual';
49
+ startedAt?: string;
50
+ resumeImports?: ImportRecord[];
37
51
  promptEach?: boolean;
38
52
  startSequence?: number;
39
53
  autoMatch?: boolean;
54
+ ozIn?: number;
55
+ roastNotes?: string;
56
+ roastTargets?: string;
57
+ }
58
+ export interface StartWatchRuntime {
59
+ accessImpl?: typeof access;
60
+ readFileImpl?: typeof readFile;
61
+ readdirImpl?: (typeof import('fs/promises'))['readdir'];
62
+ saveWatchSessionImpl?: typeof saveWatchSession;
63
+ importRoastFromFileImpl?: typeof importRoastFromFile;
64
+ watchImpl?: typeof watch;
65
+ addSignalListener?: (signal: 'SIGINT' | 'SIGTERM', listener: () => void) => void;
66
+ removeSignalListener?: (signal: 'SIGINT' | 'SIGTERM', listener: () => void) => void;
67
+ debounceMs?: number;
68
+ }
69
+ interface ManualImportRecoveryOptions {
70
+ ozIn?: number;
71
+ roastNotes?: string;
72
+ roastTargets?: string;
40
73
  }
74
+ export declare function buildManualImportRecoveryCommand(options?: ManualImportRecoveryOptions): string;
41
75
  /** Persist session state to disk after each import. */
42
76
  export declare function saveWatchSession(session: WatchSession): Promise<void>;
43
77
  /** Load a previously saved watch session. Returns null if none exists. */
@@ -61,6 +95,6 @@ export declare function printVerificationTable(session: WatchSession, autoMatch?
61
95
  * @param opts Watch options
62
96
  * @returns The final WatchSession (all imports recorded)
63
97
  */
64
- export declare function startWatch(supabase: SupabaseClient, userId: string, directory: string, opts: StartWatchOpts): Promise<WatchSession>;
98
+ export declare function startWatch(supabase: SupabaseClient, userId: string, directory: string, opts: StartWatchOpts, runtime?: StartWatchRuntime): Promise<WatchSession>;
65
99
  export {};
66
100
  //# sourceMappingURL=watch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/lib/interactive/watch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK7E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,MAAM,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAMD,uDAAuD;AACvD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E;AAED,0EAA0E;AAC1E,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAQrE;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1E;AAID,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAID,8DAA8D;AAC9D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CASvF;AA8JD;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,YAAY,CAAC,CAiPvB"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/lib/interactive/watch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAkB,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAoB,MAAM,aAAa,CAAC;AAGjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK7E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,MAAM,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,OAAO,CAAC,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,OAAO,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,QAAQ,CAAC;IAC/B,WAAW,CAAC,EAAE,CAAC,cAAc,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxD,oBAAoB,CAAC,EAAE,OAAO,gBAAgB,CAAC;IAC/C,uBAAuB,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACrD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACjF,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACpF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AASD,UAAU,2BAA2B;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,wBAAgB,gCAAgC,CAC9C,OAAO,GAAE,2BAAgC,GACxC,MAAM,CAgBR;AAMD,uDAAuD;AACvD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAG3E;AAED,0EAA0E;AAC1E,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAQrE;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1E;AAID,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAID,8DAA8D;AAC9D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CASvF;AA4KD;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAoYvB"}