@chkit/plugin-backfill 0.1.0-beta.2 → 0.1.0-beta.20

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 (80) hide show
  1. package/README.md +40 -0
  2. package/dist/args.d.ts +109 -6
  3. package/dist/args.d.ts.map +1 -1
  4. package/dist/args.js +73 -97
  5. package/dist/args.js.map +1 -1
  6. package/dist/async-backfill.d.ts +64 -0
  7. package/dist/async-backfill.d.ts.map +1 -0
  8. package/dist/async-backfill.js +251 -0
  9. package/dist/async-backfill.js.map +1 -0
  10. package/dist/check.d.ts +9 -0
  11. package/dist/check.d.ts.map +1 -0
  12. package/dist/check.js +79 -0
  13. package/dist/check.js.map +1 -0
  14. package/dist/chunking/analyze.d.ts +38 -0
  15. package/dist/chunking/analyze.d.ts.map +1 -0
  16. package/dist/chunking/analyze.js +76 -0
  17. package/dist/chunking/analyze.js.map +1 -0
  18. package/dist/chunking/build.d.ts +11 -0
  19. package/dist/chunking/build.d.ts.map +1 -0
  20. package/dist/chunking/build.js +51 -0
  21. package/dist/chunking/build.js.map +1 -0
  22. package/dist/chunking/introspect.d.ts +34 -0
  23. package/dist/chunking/introspect.d.ts.map +1 -0
  24. package/dist/chunking/introspect.js +96 -0
  25. package/dist/chunking/introspect.js.map +1 -0
  26. package/dist/chunking/splitter.d.ts +20 -0
  27. package/dist/chunking/splitter.d.ts.map +1 -0
  28. package/dist/chunking/splitter.js +76 -0
  29. package/dist/chunking/splitter.js.map +1 -0
  30. package/dist/chunking/sql.d.ts +12 -0
  31. package/dist/chunking/sql.d.ts.map +1 -0
  32. package/dist/chunking/sql.js +221 -0
  33. package/dist/chunking/sql.js.map +1 -0
  34. package/dist/chunking/types.d.ts +29 -0
  35. package/dist/chunking/types.d.ts.map +1 -0
  36. package/dist/chunking/types.js +2 -0
  37. package/dist/chunking/types.js.map +1 -0
  38. package/dist/detect.d.ts +13 -0
  39. package/dist/detect.d.ts.map +1 -0
  40. package/dist/detect.js +113 -0
  41. package/dist/detect.js.map +1 -0
  42. package/dist/index.d.ts +8 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +3 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/options.d.ts +151 -4
  47. package/dist/options.d.ts.map +1 -1
  48. package/dist/options.js +161 -109
  49. package/dist/options.js.map +1 -1
  50. package/dist/payload.d.ts +7 -17
  51. package/dist/payload.d.ts.map +1 -1
  52. package/dist/payload.js +8 -18
  53. package/dist/payload.js.map +1 -1
  54. package/dist/planner.d.ts +9 -8
  55. package/dist/planner.d.ts.map +1 -1
  56. package/dist/planner.js +92 -92
  57. package/dist/planner.js.map +1 -1
  58. package/dist/plugin.d.ts +4 -3
  59. package/dist/plugin.d.ts.map +1 -1
  60. package/dist/plugin.js +295 -215
  61. package/dist/plugin.js.map +1 -1
  62. package/dist/queries.d.ts +21 -0
  63. package/dist/queries.d.ts.map +1 -0
  64. package/dist/queries.js +113 -0
  65. package/dist/queries.js.map +1 -0
  66. package/dist/runtime.d.ts +14 -0
  67. package/dist/runtime.d.ts.map +1 -1
  68. package/dist/runtime.js +162 -83
  69. package/dist/runtime.js.map +1 -1
  70. package/dist/state.d.ts +16 -28
  71. package/dist/state.d.ts.map +1 -1
  72. package/dist/state.js +59 -124
  73. package/dist/state.js.map +1 -1
  74. package/dist/table-config.d.ts +9 -0
  75. package/dist/table-config.d.ts.map +1 -0
  76. package/dist/table-config.js +2 -0
  77. package/dist/table-config.js.map +1 -0
  78. package/dist/types.d.ts +50 -103
  79. package/dist/types.d.ts.map +1 -1
  80. package/package.json +23 -2
package/dist/plugin.js CHANGED
@@ -1,12 +1,121 @@
1
- import { parseCancelArgs, parseDoctorArgs, parsePlanArgs, parseResumeArgs, parseRunArgs, parseStatusArgs } from './args.js';
1
+ import { createClickHouseExecutor } from '@chkit/clickhouse';
2
+ import { wrapPluginRun } from '@chkit/core';
3
+ import { executeBackfill } from './async-backfill.js';
2
4
  import { BackfillConfigError } from './errors.js';
3
- import { normalizeBackfillOptions, mergeOptions, validateBaseOptions } from './options.js';
4
- import { planPayload, runPayload, statusPayload, cancelPayload, doctorPayload } from './payload.js';
5
+ import { PLAN_FLAGS, PLAN_ID_FLAGS, RESUME_FLAGS, RUN_FLAGS, PluginConfigSchema, resolveCheckOptions, resolvePlanOptions, resolveResumeOptions, resolveRunOptions, resolveStatusOptions, } from './options.js';
6
+ import { planPayload, statusPayload, cancelPayload, doctorPayload } from './payload.js';
5
7
  import { buildBackfillPlan } from './planner.js';
6
- import { cancelBackfillRun, evaluateBackfillCheck, executeBackfillRun, getBackfillDoctorReport, getBackfillStatus, resumeBackfillRun, } from './runtime.js';
8
+ import { evaluateBackfillCheck } from './check.js';
9
+ import { cancelBackfillRun, getBackfillDoctorReport, getBackfillStatus } from './queries.js';
10
+ import { backfillPaths, ensureEnvironmentMatch, nowIso, readPlan, readRun, summarizeRunStatus, writeJson, } from './state.js';
11
+ function formatBytes(bytes) {
12
+ if (bytes >= 1024 ** 4)
13
+ return `${(bytes / 1024 ** 4).toFixed(1)} TiB`;
14
+ if (bytes >= 1024 ** 3)
15
+ return `${(bytes / 1024 ** 3).toFixed(1)} GiB`;
16
+ if (bytes >= 1024 ** 2)
17
+ return `${(bytes / 1024 ** 2).toFixed(1)} MiB`;
18
+ if (bytes >= 1024)
19
+ return `${(bytes / 1024).toFixed(1)} KiB`;
20
+ return `${bytes} B`;
21
+ }
22
+ async function runBackfill(input) {
23
+ const { plan, stateDir } = await readPlan({
24
+ planId: input.planId,
25
+ configPath: input.configPath,
26
+ config: input.config,
27
+ stateDir: input.stateDir,
28
+ });
29
+ ensureEnvironmentMatch({
30
+ plan,
31
+ clickhouse: input.clickhouse,
32
+ forceEnvironment: input.forceEnvironment,
33
+ });
34
+ const paths = backfillPaths(stateDir, plan.planId);
35
+ // Check for existing run state
36
+ const existingRun = await readRun(paths.runPath);
37
+ const resumeFrom = input.resumeFrom;
38
+ if (existingRun && !resumeFrom) {
39
+ // `run` command (no resumeFrom) must not silently continue an existing run.
40
+ // Users should use `backfill resume` instead.
41
+ const status = existingRun.status;
42
+ if (status === 'completed') {
43
+ throw new BackfillConfigError(`Run already completed for plan ${plan.planId}. Nothing to do.`);
44
+ }
45
+ if (status === 'cancelled') {
46
+ throw new BackfillConfigError(`Run is cancelled for plan ${plan.planId}. Create a new plan or inspect with backfill doctor.`);
47
+ }
48
+ throw new BackfillConfigError(`A run already exists for plan ${plan.planId} (status: ${status}). Use backfill resume to continue.`);
49
+ }
50
+ const db = createClickHouseExecutor(input.clickhouse);
51
+ try {
52
+ const runState = {
53
+ planId: plan.planId,
54
+ target: plan.target,
55
+ status: 'running',
56
+ startedAt: existingRun?.startedAt ?? nowIso(),
57
+ updatedAt: nowIso(),
58
+ progress: resumeFrom ?? {},
59
+ };
60
+ await writeJson(paths.runPath, runState);
61
+ const result = await executeBackfill({
62
+ executor: db,
63
+ planId: plan.planId,
64
+ chunks: plan.chunks.map((c) => ({ id: c.id, from: c.from, to: c.to })),
65
+ buildQuery: (chunk) => {
66
+ const planChunk = plan.chunks.find((c) => c.id === chunk.id);
67
+ if (!planChunk)
68
+ throw new Error(`Chunk ${chunk.id} not found in plan`);
69
+ return planChunk.sqlTemplate;
70
+ },
71
+ concurrency: input.concurrency,
72
+ pollIntervalMs: input.pollIntervalMs,
73
+ resumeFrom,
74
+ replayFailed: input.replayFailed,
75
+ onProgress: async (progress) => {
76
+ runState.progress = progress;
77
+ runState.updatedAt = nowIso();
78
+ await writeJson(paths.runPath, runState);
79
+ },
80
+ });
81
+ runState.status = result.failed > 0 ? 'failed' : 'completed';
82
+ runState.completedAt = nowIso();
83
+ runState.updatedAt = nowIso();
84
+ runState.progress = result.progress;
85
+ if (result.failed > 0) {
86
+ const failedEntry = Object.values(result.progress).find((c) => c.status === 'failed');
87
+ runState.lastError = failedEntry?.error ?? 'One or more chunks failed';
88
+ }
89
+ await writeJson(paths.runPath, runState);
90
+ const summary = summarizeRunStatus(runState, paths.runPath, plan);
91
+ if (input.jsonMode) {
92
+ input.print({
93
+ ok: result.failed === 0,
94
+ planId: plan.planId,
95
+ status: runState.status,
96
+ chunkCounts: summary.totals,
97
+ rowsWritten: summary.rowsWritten,
98
+ runPath: paths.runPath,
99
+ lastError: runState.lastError,
100
+ });
101
+ }
102
+ else {
103
+ let line = `Backfill ${plan.planId}: ${runState.status} (done=${summary.totals.done}/${summary.totals.total}, ${summary.rowsWritten} rows written)`;
104
+ if (runState.lastError)
105
+ line += ` \u2014 ${runState.lastError}`;
106
+ input.print(line);
107
+ if (runState.status === 'completed' && summary.rowsWritten === 0) {
108
+ input.print('Warning: 0 rows written across all chunks. Verify that source data exists in the time range and passes the query\'s WHERE filters.');
109
+ }
110
+ }
111
+ return result.failed > 0 ? 1 : 0;
112
+ }
113
+ finally {
114
+ await db.close();
115
+ }
116
+ }
7
117
  export function createBackfillPlugin(options = {}) {
8
- const base = normalizeBackfillOptions(options);
9
- validateBaseOptions(base);
118
+ const config = PluginConfigSchema.parse(options);
10
119
  return {
11
120
  manifest: {
12
121
  name: 'backfill',
@@ -16,271 +125,242 @@ export function createBackfillPlugin(options = {}) {
16
125
  {
17
126
  name: 'plan',
18
127
  description: 'Build a deterministic backfill plan and persist immutable plan state',
19
- async run({ args, jsonMode, print, options: runtimeOptions, config, configPath }) {
20
- try {
21
- const parsed = parsePlanArgs(args);
22
- const effectiveOptions = mergeOptions(base, runtimeOptions);
23
- validateBaseOptions(effectiveOptions);
24
- const output = await buildBackfillPlan({
25
- target: parsed.target,
26
- from: parsed.from,
27
- to: parsed.to,
28
- config,
29
- configPath,
30
- options: effectiveOptions,
31
- chunkHours: parsed.chunkHours,
32
- forceLargeWindow: parsed.forceLargeWindow,
33
- });
34
- const payload = planPayload(output);
35
- if (jsonMode) {
36
- print(payload);
128
+ flags: PLAN_FLAGS,
129
+ run: async (context) => wrapPluginRun({
130
+ command: 'plan',
131
+ label: 'Backfill plan',
132
+ jsonMode: context.jsonMode,
133
+ print: context.print,
134
+ configErrorClass: BackfillConfigError,
135
+ fn: async () => {
136
+ const opts = resolvePlanOptions(config, context.options, context.flags);
137
+ if (!context.config.clickhouse) {
138
+ throw new BackfillConfigError('ClickHouse connection is required for backfill planning. Configure clickhouse in your clickhouse.config.ts.');
37
139
  }
38
- else {
39
- print(`Backfill plan ${payload.planId} for ${payload.target} (${payload.chunkCount} chunks at ${payload.chunkHours}h) -> ${payload.planPath}${payload.existed ? ' [existing]' : ''}`);
40
- }
41
- return 0;
42
- }
43
- catch (error) {
44
- const message = error instanceof Error ? error.message : String(error);
45
- if (jsonMode) {
46
- print({
47
- ok: false,
48
- command: 'plan',
49
- error: message,
140
+ const db = createClickHouseExecutor(context.config.clickhouse);
141
+ try {
142
+ const output = await buildBackfillPlan({
143
+ opts,
144
+ configPath: context.configPath,
145
+ config: context.config,
146
+ clickhouse: context.config.clickhouse,
147
+ clickhouseQuery: async (sql) => {
148
+ const result = await db.query(sql);
149
+ return result;
150
+ },
50
151
  });
152
+ const payload = planPayload(output);
153
+ if (context.jsonMode) {
154
+ context.print(payload);
155
+ }
156
+ else {
157
+ const partitionCount = output.plan.partitions?.length ?? 0;
158
+ const totalBytes = output.plan.partitions
159
+ ? formatBytes(output.plan.partitions.reduce((sum, p) => sum + p.bytesOnDisk, 0))
160
+ : 'unknown';
161
+ const sortKeyLabel = output.plan.sortKey
162
+ ? `, sort key: ${output.plan.sortKey.column} (${output.plan.sortKey.category})`
163
+ : '';
164
+ context.print(`Backfill plan ${payload.planId} for ${payload.target} (${payload.chunkCount} chunks across ${partitionCount} partitions, ~${totalBytes}${sortKeyLabel}) -> ${payload.planPath}`);
165
+ }
166
+ return 0;
51
167
  }
52
- else {
53
- print(`Backfill plan failed: ${message}`);
168
+ finally {
169
+ await db.close();
54
170
  }
55
- if (error instanceof BackfillConfigError)
56
- return 2;
57
- return 1;
58
- }
59
- },
171
+ },
172
+ }),
60
173
  },
61
174
  {
62
175
  name: 'run',
63
- description: 'Execute a planned backfill with checkpointed chunk progress',
64
- async run({ args, jsonMode, print, options: runtimeOptions, config, configPath }) {
65
- try {
66
- const parsed = parseRunArgs(args);
67
- const effectiveOptions = mergeOptions(base, runtimeOptions);
68
- validateBaseOptions(effectiveOptions);
69
- const output = await executeBackfillRun({
70
- planId: parsed.planId,
71
- config,
72
- configPath,
73
- options: effectiveOptions,
74
- execution: {
75
- replayDone: parsed.replayDone,
76
- replayFailed: parsed.replayFailed,
77
- forceOverlap: parsed.forceOverlap,
78
- forceCompatibility: parsed.forceCompatibility,
79
- simulation: {
80
- failChunkId: parsed.simulateFailChunk,
81
- failCount: parsed.simulateFailCount,
82
- },
83
- },
84
- });
85
- const payload = {
86
- ...runPayload(output),
87
- command: 'run',
88
- };
89
- if (jsonMode) {
90
- print(payload);
91
- }
92
- else {
93
- print(`Backfill run ${payload.planId}: ${payload.status} (done=${payload.chunkCounts.done}/${payload.chunkCounts.total})`);
176
+ description: 'Execute a planned backfill with async query submission and polling',
177
+ flags: RUN_FLAGS,
178
+ run: async (context) => wrapPluginRun({
179
+ command: 'run',
180
+ label: 'Backfill run',
181
+ jsonMode: context.jsonMode,
182
+ print: context.print,
183
+ configErrorClass: BackfillConfigError,
184
+ fn: async () => {
185
+ const opts = resolveRunOptions(config, context.options, context.flags);
186
+ if (!context.config.clickhouse) {
187
+ throw new BackfillConfigError('ClickHouse connection is required for backfill execution. Configure clickhouse in your clickhouse.config.ts.');
94
188
  }
95
- return payload.ok ? 0 : 1;
96
- }
97
- catch (error) {
98
- const message = error instanceof Error ? error.message : String(error);
99
- if (jsonMode) {
100
- print({ ok: false, command: 'run', error: message });
101
- }
102
- else {
103
- print(`Backfill run failed: ${message}`);
104
- }
105
- if (error instanceof BackfillConfigError)
106
- return 2;
107
- return 1;
108
- }
109
- },
189
+ return runBackfill({
190
+ planId: opts.planId,
191
+ forceEnvironment: opts.forceEnvironment,
192
+ concurrency: opts.concurrency,
193
+ pollIntervalMs: opts.pollIntervalMs,
194
+ stateDir: opts.stateDir,
195
+ configPath: context.configPath,
196
+ config: context.config,
197
+ clickhouse: context.config.clickhouse,
198
+ print: context.print,
199
+ jsonMode: context.jsonMode,
200
+ });
201
+ },
202
+ }),
110
203
  },
111
204
  {
112
205
  name: 'resume',
113
206
  description: 'Resume a backfill run from last checkpoint',
114
- async run({ args, jsonMode, print, options: runtimeOptions, config, configPath }) {
115
- try {
116
- const parsed = parseResumeArgs(args);
117
- const effectiveOptions = mergeOptions(base, runtimeOptions);
118
- validateBaseOptions(effectiveOptions);
119
- const output = await resumeBackfillRun({
120
- planId: parsed.planId,
121
- config,
122
- configPath,
123
- options: effectiveOptions,
124
- execution: {
125
- replayDone: parsed.replayDone,
126
- replayFailed: parsed.replayFailed,
127
- forceOverlap: parsed.forceOverlap,
128
- forceCompatibility: parsed.forceCompatibility,
129
- },
130
- });
131
- const payload = {
132
- ...runPayload(output),
133
- command: 'resume',
134
- };
135
- if (jsonMode) {
136
- print(payload);
137
- }
138
- else {
139
- print(`Backfill resume ${payload.planId}: ${payload.status} (done=${payload.chunkCounts.done}/${payload.chunkCounts.total})`);
207
+ flags: RESUME_FLAGS,
208
+ run: async (context) => wrapPluginRun({
209
+ command: 'resume',
210
+ label: 'Backfill resume',
211
+ jsonMode: context.jsonMode,
212
+ print: context.print,
213
+ configErrorClass: BackfillConfigError,
214
+ fn: async () => {
215
+ const opts = resolveResumeOptions(config, context.options, context.flags);
216
+ if (!context.config.clickhouse) {
217
+ throw new BackfillConfigError('ClickHouse connection is required for backfill execution. Configure clickhouse in your clickhouse.config.ts.');
140
218
  }
141
- return payload.ok ? 0 : 1;
142
- }
143
- catch (error) {
144
- const message = error instanceof Error ? error.message : String(error);
145
- if (jsonMode) {
146
- print({ ok: false, command: 'resume', error: message });
219
+ const { stateDir } = await readPlan({
220
+ planId: opts.planId,
221
+ configPath: context.configPath,
222
+ config: context.config,
223
+ stateDir: opts.stateDir,
224
+ });
225
+ const paths = backfillPaths(stateDir, opts.planId);
226
+ const existingRun = await readRun(paths.runPath);
227
+ if (!existingRun) {
228
+ throw new BackfillConfigError(`Run state not found for plan ${opts.planId}. Start with backfill run before resume.`);
147
229
  }
148
- else {
149
- print(`Backfill resume failed: ${message}`);
230
+ if (existingRun.status === 'completed') {
231
+ if (context.jsonMode) {
232
+ context.print({ ok: true, noop: true, planId: opts.planId, status: 'completed', message: 'Run already completed. Nothing to resume.' });
233
+ }
234
+ else {
235
+ context.print(`Backfill ${opts.planId}: already completed. Nothing to resume.`);
236
+ }
237
+ return 0;
150
238
  }
151
- if (error instanceof BackfillConfigError)
152
- return 2;
153
- return 1;
154
- }
155
- },
239
+ return runBackfill({
240
+ planId: opts.planId,
241
+ forceEnvironment: opts.forceEnvironment,
242
+ concurrency: opts.concurrency,
243
+ pollIntervalMs: opts.pollIntervalMs,
244
+ stateDir: opts.stateDir,
245
+ resumeFrom: existingRun.progress,
246
+ replayFailed: opts.replayFailed,
247
+ configPath: context.configPath,
248
+ config: context.config,
249
+ clickhouse: context.config.clickhouse,
250
+ print: context.print,
251
+ jsonMode: context.jsonMode,
252
+ });
253
+ },
254
+ }),
156
255
  },
157
256
  {
158
257
  name: 'status',
159
258
  description: 'Show checkpoint and chunk progress for a backfill run',
160
- async run({ args, jsonMode, print, options: runtimeOptions, config, configPath }) {
161
- try {
162
- const parsed = parseStatusArgs(args);
163
- const effectiveOptions = mergeOptions(base, runtimeOptions);
164
- validateBaseOptions(effectiveOptions);
259
+ flags: PLAN_ID_FLAGS,
260
+ run: async (context) => wrapPluginRun({
261
+ command: 'status',
262
+ label: 'Backfill status',
263
+ jsonMode: context.jsonMode,
264
+ print: context.print,
265
+ configErrorClass: BackfillConfigError,
266
+ fn: async () => {
267
+ const opts = resolveStatusOptions(config, context.options, context.flags);
165
268
  const summary = await getBackfillStatus({
166
- planId: parsed.planId,
167
- config,
168
- configPath,
169
- options: effectiveOptions,
269
+ planId: opts.planId,
270
+ config: context.config,
271
+ configPath: context.configPath,
272
+ stateDir: opts.stateDir,
170
273
  });
171
274
  const payload = statusPayload(summary);
172
- if (jsonMode) {
173
- print(payload);
275
+ if (context.jsonMode) {
276
+ context.print(payload);
174
277
  }
175
278
  else {
176
- print(`Backfill status ${payload.planId}: ${payload.status} (done=${payload.chunkCounts.done}/${payload.chunkCounts.total}, failed=${payload.chunkCounts.failed})`);
279
+ let line = `Backfill status ${payload.planId}: ${payload.status} (done=${payload.chunkCounts.done}/${payload.chunkCounts.total}, failed=${payload.chunkCounts.failed}, ${payload.rowsWritten} rows written)`;
280
+ if (payload.lastError)
281
+ line += ` \u2014 ${payload.lastError}`;
282
+ context.print(line);
283
+ if (payload.status === 'completed' && payload.rowsWritten === 0) {
284
+ context.print('Warning: 0 rows written across all chunks. Verify that source data exists in the time range and passes the query\'s WHERE filters.');
285
+ }
177
286
  }
178
287
  return payload.ok ? 0 : 1;
179
- }
180
- catch (error) {
181
- const message = error instanceof Error ? error.message : String(error);
182
- if (jsonMode) {
183
- print({ ok: false, command: 'status', error: message });
184
- }
185
- else {
186
- print(`Backfill status failed: ${message}`);
187
- }
188
- if (error instanceof BackfillConfigError)
189
- return 2;
190
- return 1;
191
- }
192
- },
288
+ },
289
+ }),
193
290
  },
194
291
  {
195
292
  name: 'cancel',
196
293
  description: 'Cancel an in-progress backfill run and prevent further chunk execution',
197
- async run({ args, jsonMode, print, options: runtimeOptions, config, configPath }) {
198
- try {
199
- const parsed = parseCancelArgs(args);
200
- const effectiveOptions = mergeOptions(base, runtimeOptions);
201
- validateBaseOptions(effectiveOptions);
294
+ flags: PLAN_ID_FLAGS,
295
+ run: async (context) => wrapPluginRun({
296
+ command: 'cancel',
297
+ label: 'Backfill cancel',
298
+ jsonMode: context.jsonMode,
299
+ print: context.print,
300
+ configErrorClass: BackfillConfigError,
301
+ fn: async () => {
302
+ const opts = resolveStatusOptions(config, context.options, context.flags);
202
303
  const summary = await cancelBackfillRun({
203
- planId: parsed.planId,
204
- config,
205
- configPath,
206
- options: effectiveOptions,
304
+ planId: opts.planId,
305
+ config: context.config,
306
+ configPath: context.configPath,
307
+ stateDir: opts.stateDir,
207
308
  });
208
309
  const payload = cancelPayload(summary);
209
- if (jsonMode) {
210
- print(payload);
310
+ if (context.jsonMode) {
311
+ context.print(payload);
211
312
  }
212
313
  else {
213
- print(`Backfill cancel ${payload.planId}: ${payload.status} (done=${payload.chunkCounts.done}/${payload.chunkCounts.total})`);
314
+ context.print(`Backfill cancel ${payload.planId}: ${payload.status} (done=${payload.chunkCounts.done}/${payload.chunkCounts.total})`);
214
315
  }
215
316
  return payload.ok ? 0 : 1;
216
- }
217
- catch (error) {
218
- const message = error instanceof Error ? error.message : String(error);
219
- if (jsonMode) {
220
- print({ ok: false, command: 'cancel', error: message });
221
- }
222
- else {
223
- print(`Backfill cancel failed: ${message}`);
224
- }
225
- if (error instanceof BackfillConfigError)
226
- return 2;
227
- return 1;
228
- }
229
- },
317
+ },
318
+ }),
230
319
  },
231
320
  {
232
321
  name: 'doctor',
233
322
  description: 'Provide actionable remediation steps for failed or pending backfill runs',
234
- async run({ args, jsonMode, print, options: runtimeOptions, config, configPath }) {
235
- try {
236
- const parsed = parseDoctorArgs(args);
237
- const effectiveOptions = mergeOptions(base, runtimeOptions);
238
- validateBaseOptions(effectiveOptions);
323
+ flags: PLAN_ID_FLAGS,
324
+ run: async (context) => wrapPluginRun({
325
+ command: 'doctor',
326
+ label: 'Backfill doctor',
327
+ jsonMode: context.jsonMode,
328
+ print: context.print,
329
+ configErrorClass: BackfillConfigError,
330
+ fn: async () => {
331
+ const opts = resolveStatusOptions(config, context.options, context.flags);
239
332
  const report = await getBackfillDoctorReport({
240
- planId: parsed.planId,
241
- config,
242
- configPath,
243
- options: effectiveOptions,
333
+ planId: opts.planId,
334
+ config: context.config,
335
+ configPath: context.configPath,
336
+ stateDir: opts.stateDir,
244
337
  });
245
338
  const payload = doctorPayload(report);
246
- if (jsonMode) {
247
- print(payload);
339
+ if (context.jsonMode) {
340
+ context.print(payload);
248
341
  }
249
342
  else {
250
- print(`Backfill doctor ${payload.planId}: ${payload.issueCodes.length === 0 ? 'ok' : payload.issueCodes.join(', ')}`);
343
+ context.print(`Backfill doctor ${payload.planId}: ${payload.issueCodes.length === 0 ? 'ok' : payload.issueCodes.join(', ')}`);
251
344
  for (const recommendation of payload.recommendations) {
252
- print(`- ${recommendation}`);
345
+ context.print(`- ${recommendation}`);
253
346
  }
254
347
  }
255
348
  return payload.ok ? 0 : 1;
256
- }
257
- catch (error) {
258
- const message = error instanceof Error ? error.message : String(error);
259
- if (jsonMode) {
260
- print({ ok: false, command: 'doctor', error: message });
261
- }
262
- else {
263
- print(`Backfill doctor failed: ${message}`);
264
- }
265
- if (error instanceof BackfillConfigError)
266
- return 2;
267
- return 1;
268
- }
269
- },
349
+ },
350
+ }),
270
351
  },
271
352
  ],
272
353
  hooks: {
273
354
  onConfigLoaded({ options: runtimeOptions }) {
274
- const merged = mergeOptions(base, runtimeOptions);
275
- validateBaseOptions(merged);
355
+ resolveCheckOptions(config, runtimeOptions);
276
356
  },
277
- async onCheck({ config, configPath, options: runtimeOptions }) {
278
- const effectiveOptions = mergeOptions(base, runtimeOptions);
279
- validateBaseOptions(effectiveOptions);
357
+ async onCheck({ config: appConfig, configPath, options: runtimeOptions }) {
358
+ const opts = resolveCheckOptions(config, runtimeOptions);
280
359
  return evaluateBackfillCheck({
281
360
  configPath,
282
- config,
283
- options: effectiveOptions,
361
+ config: appConfig,
362
+ stateDir: opts.stateDir,
363
+ failCheckOnRequiredPendingBackfill: opts.failCheckOnRequiredPendingBackfill,
284
364
  });
285
365
  },
286
366
  onCheckReport({ result, print }) {
@@ -296,7 +376,7 @@ export function createBackfillPlugin(options = {}) {
296
376
  }
297
377
  export function backfill(options = {}) {
298
378
  return {
299
- plugin: createBackfillPlugin(),
379
+ plugin: createBackfillPlugin(options),
300
380
  name: 'backfill',
301
381
  enabled: true,
302
382
  options,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}