chkit 0.1.2-beta.7 → 0.2.0-beta.11

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 (291) hide show
  1. package/README.md +69 -56
  2. package/dist/bin/chkit.js +57 -26
  3. package/dist/bin/chkit.js.map +1 -1
  4. package/dist/commands/drift/compare.d.ts +25 -1
  5. package/dist/commands/drift/compare.d.ts.map +1 -1
  6. package/dist/commands/drift/compare.js +147 -45
  7. package/dist/commands/drift/compare.js.map +1 -1
  8. package/dist/commands/drift/payload.d.ts.map +1 -1
  9. package/dist/commands/drift/payload.js +39 -8
  10. package/dist/commands/drift/payload.js.map +1 -1
  11. package/dist/commands/generate/command.js +6 -18
  12. package/dist/commands/generate/command.js.map +1 -1
  13. package/dist/commands/generate/plan-pipeline.d.ts.map +1 -1
  14. package/dist/commands/generate/plan-pipeline.js +35 -36
  15. package/dist/commands/generate/plan-pipeline.js.map +1 -1
  16. package/dist/commands/init.d.ts +2 -0
  17. package/dist/commands/init.d.ts.map +1 -1
  18. package/dist/commands/init.js +21 -4
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/migrate/abandon.d.ts +38 -0
  21. package/dist/commands/migrate/abandon.d.ts.map +1 -0
  22. package/dist/commands/migrate/abandon.js +75 -0
  23. package/dist/commands/migrate/abandon.js.map +1 -0
  24. package/dist/commands/migrate/apply.d.ts +7 -0
  25. package/dist/commands/migrate/apply.d.ts.map +1 -1
  26. package/dist/commands/migrate/apply.js +45 -6
  27. package/dist/commands/migrate/apply.js.map +1 -1
  28. package/dist/commands/migrate/async-apply.d.ts.map +1 -1
  29. package/dist/commands/migrate/async-apply.js +78 -16
  30. package/dist/commands/migrate/async-apply.js.map +1 -1
  31. package/dist/commands/migrate/command.d.ts +44 -1
  32. package/dist/commands/migrate/command.d.ts.map +1 -1
  33. package/dist/commands/migrate/command.js +148 -34
  34. package/dist/commands/migrate/command.js.map +1 -1
  35. package/dist/commands/migrate/empty.d.ts +8 -0
  36. package/dist/commands/migrate/empty.d.ts.map +1 -0
  37. package/dist/commands/migrate/empty.js +17 -0
  38. package/dist/commands/migrate/empty.js.map +1 -0
  39. package/dist/commands/migrate/errors.d.ts +22 -0
  40. package/dist/commands/migrate/errors.d.ts.map +1 -0
  41. package/dist/commands/migrate/errors.js +31 -0
  42. package/dist/commands/migrate/errors.js.map +1 -0
  43. package/dist/commands/migrate/output.d.ts +31 -0
  44. package/dist/commands/migrate/output.d.ts.map +1 -1
  45. package/dist/commands/migrate/output.js +120 -9
  46. package/dist/commands/migrate/output.js.map +1 -1
  47. package/dist/commands/migrate/prompts.d.ts +1 -0
  48. package/dist/commands/migrate/prompts.d.ts.map +1 -1
  49. package/dist/commands/migrate/prompts.js +3 -0
  50. package/dist/commands/migrate/prompts.js.map +1 -1
  51. package/dist/commands/migrate/recovery.d.ts +90 -0
  52. package/dist/commands/migrate/recovery.d.ts.map +1 -0
  53. package/dist/commands/migrate/recovery.js +163 -0
  54. package/dist/commands/migrate/recovery.js.map +1 -0
  55. package/dist/commands/migrate/retry.d.ts +37 -0
  56. package/dist/commands/migrate/retry.d.ts.map +1 -0
  57. package/dist/commands/migrate/retry.js +46 -0
  58. package/dist/commands/migrate/retry.js.map +1 -0
  59. package/dist/commands/plugin.js +3 -1
  60. package/dist/commands/plugin.js.map +1 -1
  61. package/dist/commands/registry.d.ts +2 -0
  62. package/dist/commands/registry.d.ts.map +1 -0
  63. package/dist/commands/registry.js +228 -0
  64. package/dist/commands/registry.js.map +1 -0
  65. package/dist/commands/snapshot/command.d.ts +3 -0
  66. package/dist/commands/snapshot/command.d.ts.map +1 -0
  67. package/dist/commands/snapshot/command.js +32 -0
  68. package/dist/commands/snapshot/command.js.map +1 -0
  69. package/dist/commands/snapshot/output.d.ts +24 -0
  70. package/dist/commands/snapshot/output.d.ts.map +1 -0
  71. package/dist/commands/snapshot/output.js +86 -0
  72. package/dist/commands/snapshot/output.js.map +1 -0
  73. package/dist/commands/snapshot/rebuild.d.ts +19 -0
  74. package/dist/commands/snapshot/rebuild.d.ts.map +1 -0
  75. package/dist/commands/snapshot/rebuild.js +77 -0
  76. package/dist/commands/snapshot/rebuild.js.map +1 -0
  77. package/dist/internal-plugins/core/plugin.d.ts.map +1 -1
  78. package/dist/internal-plugins/core/plugin.js +2 -0
  79. package/dist/internal-plugins/core/plugin.js.map +1 -1
  80. package/dist/registry/build.d.ts +17 -0
  81. package/dist/registry/build.d.ts.map +1 -0
  82. package/dist/registry/build.js +94 -0
  83. package/dist/registry/build.js.map +1 -0
  84. package/dist/registry/dependencies.d.ts +19 -0
  85. package/dist/registry/dependencies.d.ts.map +1 -0
  86. package/dist/registry/dependencies.js +105 -0
  87. package/dist/registry/dependencies.js.map +1 -0
  88. package/dist/registry/files.d.ts +4 -0
  89. package/dist/registry/files.d.ts.map +1 -0
  90. package/dist/registry/files.js +33 -0
  91. package/dist/registry/files.js.map +1 -0
  92. package/dist/registry/install.d.ts +55 -0
  93. package/dist/registry/install.d.ts.map +1 -0
  94. package/dist/registry/install.js +175 -0
  95. package/dist/registry/install.js.map +1 -0
  96. package/dist/registry/model.d.ts +172 -0
  97. package/dist/registry/model.d.ts.map +1 -0
  98. package/dist/registry/model.js +161 -0
  99. package/dist/registry/model.js.map +1 -0
  100. package/dist/registry/project-config.d.ts +18 -0
  101. package/dist/registry/project-config.d.ts.map +1 -0
  102. package/dist/registry/project-config.js +337 -0
  103. package/dist/registry/project-config.js.map +1 -0
  104. package/dist/registry/resolve.d.ts +7 -0
  105. package/dist/registry/resolve.d.ts.map +1 -0
  106. package/dist/registry/resolve.js +129 -0
  107. package/dist/registry/resolve.js.map +1 -0
  108. package/dist/runtime/argv.d.ts +3 -0
  109. package/dist/runtime/argv.d.ts.map +1 -0
  110. package/dist/runtime/argv.js +29 -0
  111. package/dist/runtime/argv.js.map +1 -0
  112. package/dist/runtime/command-dispatch.d.ts.map +1 -1
  113. package/dist/runtime/command-dispatch.js +5 -0
  114. package/dist/runtime/command-dispatch.js.map +1 -1
  115. package/dist/runtime/config-merge.d.ts.map +1 -1
  116. package/dist/runtime/config-merge.js +2 -1
  117. package/dist/runtime/config-merge.js.map +1 -1
  118. package/dist/runtime/global-flags.d.ts +4 -0
  119. package/dist/runtime/global-flags.d.ts.map +1 -1
  120. package/dist/runtime/global-flags.js +1 -0
  121. package/dist/runtime/global-flags.js.map +1 -1
  122. package/dist/runtime/help.d.ts.map +1 -1
  123. package/dist/runtime/help.js +3 -0
  124. package/dist/runtime/help.js.map +1 -1
  125. package/dist/runtime/journal-store.d.ts.map +1 -1
  126. package/dist/runtime/journal-store.js +55 -26
  127. package/dist/runtime/journal-store.js.map +1 -1
  128. package/dist/runtime/json-output.d.ts +1 -1
  129. package/dist/runtime/json-output.d.ts.map +1 -1
  130. package/dist/runtime/json-output.js.map +1 -1
  131. package/dist/runtime/migration-store.d.ts +1 -1
  132. package/dist/runtime/migration-store.d.ts.map +1 -1
  133. package/dist/runtime/migration-store.js +17 -16
  134. package/dist/runtime/migration-store.js.map +1 -1
  135. package/dist/runtime/plugin-runtime/executor-debug.d.ts.map +1 -1
  136. package/dist/runtime/plugin-runtime/executor-debug.js +2 -0
  137. package/dist/runtime/plugin-runtime/executor-debug.js.map +1 -1
  138. package/dist/runtime/plugin-runtime/loader.js +1 -1
  139. package/dist/runtime/plugin-runtime/loader.js.map +1 -1
  140. package/dist/runtime/safety-markers.d.ts.map +1 -1
  141. package/dist/runtime/safety-markers.js +3 -1
  142. package/dist/runtime/safety-markers.js.map +1 -1
  143. package/dist/runtime/schema-loader.d.ts +20 -1
  144. package/dist/runtime/schema-loader.d.ts.map +1 -1
  145. package/dist/runtime/schema-loader.js +26 -0
  146. package/dist/runtime/schema-loader.js.map +1 -1
  147. package/dist/runtime/snapshot-document.d.ts +33 -0
  148. package/dist/runtime/snapshot-document.d.ts.map +1 -0
  149. package/dist/runtime/snapshot-document.js +65 -0
  150. package/dist/runtime/snapshot-document.js.map +1 -0
  151. package/package.json +17 -7
  152. package/dist/bin/clickhouse-resource.d.ts +0 -4
  153. package/dist/bin/clickhouse-resource.d.ts.map +0 -1
  154. package/dist/bin/clickhouse-resource.js +0 -11
  155. package/dist/bin/clickhouse-resource.js.map +0 -1
  156. package/dist/bin/command-dispatch.d.ts +0 -13
  157. package/dist/bin/command-dispatch.d.ts.map +0 -1
  158. package/dist/bin/command-dispatch.js +0 -186
  159. package/dist/bin/command-dispatch.js.map +0 -1
  160. package/dist/bin/command-registry.d.ts +0 -34
  161. package/dist/bin/command-registry.d.ts.map +0 -1
  162. package/dist/bin/command-registry.js +0 -87
  163. package/dist/bin/command-registry.js.map +0 -1
  164. package/dist/bin/commands/check.d.ts +0 -3
  165. package/dist/bin/commands/check.d.ts.map +0 -1
  166. package/dist/bin/commands/check.js +0 -181
  167. package/dist/bin/commands/check.js.map +0 -1
  168. package/dist/bin/commands/codegen.d.ts +0 -2
  169. package/dist/bin/commands/codegen.d.ts.map +0 -1
  170. package/dist/bin/commands/codegen.js +0 -25
  171. package/dist/bin/commands/codegen.js.map +0 -1
  172. package/dist/bin/commands/drift.d.ts +0 -27
  173. package/dist/bin/commands/drift.d.ts.map +0 -1
  174. package/dist/bin/commands/drift.js +0 -220
  175. package/dist/bin/commands/drift.js.map +0 -1
  176. package/dist/bin/commands/generate/output.d.ts +0 -8
  177. package/dist/bin/commands/generate/output.d.ts.map +0 -1
  178. package/dist/bin/commands/generate/output.js +0 -58
  179. package/dist/bin/commands/generate/output.js.map +0 -1
  180. package/dist/bin/commands/generate/plan-pipeline.d.ts +0 -7
  181. package/dist/bin/commands/generate/plan-pipeline.d.ts.map +0 -1
  182. package/dist/bin/commands/generate/plan-pipeline.js +0 -143
  183. package/dist/bin/commands/generate/plan-pipeline.js.map +0 -1
  184. package/dist/bin/commands/generate/rename-mappings.d.ts +0 -29
  185. package/dist/bin/commands/generate/rename-mappings.d.ts.map +0 -1
  186. package/dist/bin/commands/generate/rename-mappings.js +0 -195
  187. package/dist/bin/commands/generate/rename-mappings.js.map +0 -1
  188. package/dist/bin/commands/generate.d.ts +0 -3
  189. package/dist/bin/commands/generate.d.ts.map +0 -1
  190. package/dist/bin/commands/generate.js +0 -158
  191. package/dist/bin/commands/generate.js.map +0 -1
  192. package/dist/bin/commands/init.d.ts +0 -2
  193. package/dist/bin/commands/init.d.ts.map +0 -1
  194. package/dist/bin/commands/init.js +0 -12
  195. package/dist/bin/commands/init.js.map +0 -1
  196. package/dist/bin/commands/migrate.d.ts +0 -3
  197. package/dist/bin/commands/migrate.d.ts.map +0 -1
  198. package/dist/bin/commands/migrate.js +0 -288
  199. package/dist/bin/commands/migrate.js.map +0 -1
  200. package/dist/bin/commands/plugin-like.d.ts +0 -38
  201. package/dist/bin/commands/plugin-like.d.ts.map +0 -1
  202. package/dist/bin/commands/plugin-like.js +0 -101
  203. package/dist/bin/commands/plugin-like.js.map +0 -1
  204. package/dist/bin/commands/plugin.d.ts +0 -3
  205. package/dist/bin/commands/plugin.d.ts.map +0 -1
  206. package/dist/bin/commands/plugin.js +0 -148
  207. package/dist/bin/commands/plugin.js.map +0 -1
  208. package/dist/bin/commands/pull.d.ts +0 -2
  209. package/dist/bin/commands/pull.d.ts.map +0 -1
  210. package/dist/bin/commands/pull.js +0 -25
  211. package/dist/bin/commands/pull.js.map +0 -1
  212. package/dist/bin/commands/status.d.ts +0 -3
  213. package/dist/bin/commands/status.d.ts.map +0 -1
  214. package/dist/bin/commands/status.js +0 -63
  215. package/dist/bin/commands/status.js.map +0 -1
  216. package/dist/bin/commands/typegen.d.ts +0 -2
  217. package/dist/bin/commands/typegen.d.ts.map +0 -1
  218. package/dist/bin/commands/typegen.js +0 -25
  219. package/dist/bin/commands/typegen.js.map +0 -1
  220. package/dist/bin/config.d.ts +0 -13
  221. package/dist/bin/config.d.ts.map +0 -1
  222. package/dist/bin/config.js +0 -48
  223. package/dist/bin/config.js.map +0 -1
  224. package/dist/bin/debug.d.ts +0 -3
  225. package/dist/bin/debug.d.ts.map +0 -1
  226. package/dist/bin/debug.js +0 -14
  227. package/dist/bin/debug.js.map +0 -1
  228. package/dist/bin/global-flags.d.ts +0 -16
  229. package/dist/bin/global-flags.d.ts.map +0 -1
  230. package/dist/bin/global-flags.js +0 -7
  231. package/dist/bin/global-flags.js.map +0 -1
  232. package/dist/bin/help.d.ts +0 -5
  233. package/dist/bin/help.d.ts.map +0 -1
  234. package/dist/bin/help.js +0 -84
  235. package/dist/bin/help.js.map +0 -1
  236. package/dist/bin/internal-plugins/index.d.ts +0 -3
  237. package/dist/bin/internal-plugins/index.d.ts.map +0 -1
  238. package/dist/bin/internal-plugins/index.js +0 -5
  239. package/dist/bin/internal-plugins/index.js.map +0 -1
  240. package/dist/bin/internal-plugins/skill-hint.d.ts +0 -31
  241. package/dist/bin/internal-plugins/skill-hint.d.ts.map +0 -1
  242. package/dist/bin/internal-plugins/skill-hint.js +0 -172
  243. package/dist/bin/internal-plugins/skill-hint.js.map +0 -1
  244. package/dist/bin/journal-store.d.ts +0 -10
  245. package/dist/bin/journal-store.d.ts.map +0 -1
  246. package/dist/bin/journal-store.js +0 -137
  247. package/dist/bin/journal-store.js.map +0 -1
  248. package/dist/bin/json-output.d.ts +0 -5
  249. package/dist/bin/json-output.d.ts.map +0 -1
  250. package/dist/bin/json-output.js +0 -21
  251. package/dist/bin/json-output.js.map +0 -1
  252. package/dist/bin/lib.d.ts +0 -5
  253. package/dist/bin/lib.d.ts.map +0 -1
  254. package/dist/bin/lib.js +0 -5
  255. package/dist/bin/lib.js.map +0 -1
  256. package/dist/bin/logging.d.ts +0 -3
  257. package/dist/bin/logging.d.ts.map +0 -1
  258. package/dist/bin/logging.js +0 -31
  259. package/dist/bin/logging.js.map +0 -1
  260. package/dist/bin/migration-store.d.ts +0 -22
  261. package/dist/bin/migration-store.d.ts.map +0 -1
  262. package/dist/bin/migration-store.js +0 -60
  263. package/dist/bin/migration-store.js.map +0 -1
  264. package/dist/bin/plugin-runtime.d.ts +0 -45
  265. package/dist/bin/plugin-runtime.d.ts.map +0 -1
  266. package/dist/bin/plugin-runtime.js +0 -513
  267. package/dist/bin/plugin-runtime.js.map +0 -1
  268. package/dist/bin/safety-markers.d.ts +0 -23
  269. package/dist/bin/safety-markers.d.ts.map +0 -1
  270. package/dist/bin/safety-markers.js +0 -85
  271. package/dist/bin/safety-markers.js.map +0 -1
  272. package/dist/bin/schema-loader.d.ts +0 -3
  273. package/dist/bin/schema-loader.d.ts.map +0 -1
  274. package/dist/bin/schema-loader.js +0 -11
  275. package/dist/bin/schema-loader.js.map +0 -1
  276. package/dist/bin/table-scope.d.ts +0 -38
  277. package/dist/bin/table-scope.d.ts.map +0 -1
  278. package/dist/bin/table-scope.js +0 -167
  279. package/dist/bin/table-scope.js.map +0 -1
  280. package/dist/bin/version.d.ts +0 -2
  281. package/dist/bin/version.d.ts.map +0 -1
  282. package/dist/bin/version.js +0 -5
  283. package/dist/bin/version.js.map +0 -1
  284. package/dist/drift-diff.d.ts +0 -8
  285. package/dist/drift-diff.d.ts.map +0 -1
  286. package/dist/drift-diff.js +0 -46
  287. package/dist/drift-diff.js.map +0 -1
  288. package/dist/drift.d.ts +0 -66
  289. package/dist/drift.d.ts.map +0 -1
  290. package/dist/drift.js +0 -220
  291. package/dist/drift.js.map +0 -1
@@ -3,6 +3,11 @@ import { join } from 'node:path';
3
3
  import { emitJson } from '../../runtime/json-output.js';
4
4
  import { resolveJournalTableName } from '../../runtime/journal-store.js';
5
5
  import { extractMigrationMetadata } from '../../runtime/migration-metadata.js';
6
+ import { statusBeforeAbandon } from './abandon.js';
7
+ import { previewStatement } from './apply.js';
8
+ import { EMPTY_MIGRATIONS_SUMMARY } from './errors.js';
9
+ // A regenerated migration plans the statements that completed again.
10
+ const REPEATED_STATEMENTS_HINT = 'The new migration may repeat statements that completed; remove those that cannot run twice, such as a REMOVE DEFAULT or REMOVE MATERIALIZED, before you apply it.';
6
11
  export function emitChecksumMismatchJson(input) {
7
12
  emitJson('migrate', {
8
13
  mode: input.mode,
@@ -20,19 +25,26 @@ export function emitNoScopeMatch(input) {
20
25
  pending: [],
21
26
  applied: [],
22
27
  warning: `No tables matched selector "${selector}".`,
28
+ ...(input.retry ? { retry: input.retry } : {}),
23
29
  });
30
+ return;
24
31
  }
25
- else {
26
- console.log(`No tables matched selector "${selector}". No migrations selected.`);
27
- }
32
+ console.log(`No tables matched selector "${selector}". No migrations selected.`);
33
+ renderRetryNotice(input.retry);
28
34
  }
29
35
  export function emitNoPending(input) {
30
36
  if (input.jsonMode) {
31
- emitJson('migrate', { mode: input.mode, scope: input.scope, pending: [], applied: [] });
32
- }
33
- else {
34
- console.log('No pending migrations.');
37
+ emitJson('migrate', {
38
+ mode: input.mode,
39
+ scope: input.scope,
40
+ pending: [],
41
+ applied: [],
42
+ ...(input.retry ? { retry: input.retry } : {}),
43
+ });
44
+ return;
35
45
  }
46
+ console.log('No pending migrations.');
47
+ renderRetryNotice(input.retry);
36
48
  }
37
49
  export function emitPlanJson(input) {
38
50
  emitJson('migrate', {
@@ -42,10 +54,13 @@ export function emitPlanJson(input) {
42
54
  ...(input.undeterminedScope.length > 0
43
55
  ? { undeterminedMigrations: input.undeterminedScope }
44
56
  : {}),
57
+ ...(input.emptyMigrations.length > 0 ? { emptyMigrations: input.emptyMigrations } : {}),
58
+ ...(input.retry ? { retry: input.retry } : {}),
45
59
  });
46
60
  }
47
61
  export async function renderPlanText(input) {
48
- const { migrationsDir, scope, undeterminedScope, pending } = input;
62
+ const { migrationsDir, scope, undeterminedScope, pending, emptyMigrations, retry } = input;
63
+ const empty = new Set(emptyMigrations);
49
64
  if (scope.enabled) {
50
65
  console.log(`Table scope: ${scope.selector ?? ''} (${scope.matchCount} matched)`);
51
66
  for (const table of scope.matchedTables)
@@ -59,12 +74,17 @@ export async function renderPlanText(input) {
59
74
  }
60
75
  console.log(`Pending migrations: ${pending.length}`);
61
76
  for (const file of pending) {
62
- console.log(`- ${file}`);
77
+ console.log(empty.has(file) ? `- ${file} (no executable statements)` : `- ${file}`);
63
78
  const sql = await readFile(join(migrationsDir, file), 'utf8');
64
79
  const meta = extractMigrationMetadata(sql);
65
80
  if (meta.log)
66
81
  console.log(` ${meta.log}`);
67
82
  }
83
+ if (emptyMigrations.length > 0) {
84
+ console.log(`⚠ ${emptyMigrations.length} pending migration(s) contain no executable statements. ` +
85
+ 'chkit migrate --apply refuses to run until each has SQL or is deleted.');
86
+ }
87
+ renderRetryNotice(retry);
68
88
  }
69
89
  export function renderPlanOnlyNotice() {
70
90
  console.log('\nPlan only. Re-run with --apply to apply and journal these migrations.');
@@ -95,9 +115,100 @@ export function emitApplySummaryJson(input) {
95
115
  ...(input.undeterminedScope.length > 0
96
116
  ? { undeterminedMigrations: input.undeterminedScope }
97
117
  : {}),
118
+ ...(input.retry ? { retry: input.retry } : {}),
98
119
  });
99
120
  }
100
121
  export function renderApplySummary() {
101
122
  console.log(`\nMigrations recorded in ClickHouse ${resolveJournalTableName()} table.`);
102
123
  }
124
+ export function emitEmptyMigrationsBlockedJson(input) {
125
+ emitJson('migrate', {
126
+ mode: input.mode,
127
+ scope: input.scope,
128
+ error: EMPTY_MIGRATIONS_SUMMARY,
129
+ emptyMigrations: input.emptyMigrations,
130
+ });
131
+ }
132
+ export function emitAbandonJson(input) {
133
+ emitJson('migrate', { mode: input.mode, scope: input.scope, abandon: input.abandon });
134
+ }
135
+ /**
136
+ * The --abandon report: what stays applied in ClickHouse, what failed or was
137
+ * interrupted, and how to continue. `performed` is false for the preview. A
138
+ * statement an earlier --abandon marked failed is reported by the status it
139
+ * had before, so a statement that completed still shows as applied.
140
+ */
141
+ export function renderAbandonText(report, input) {
142
+ const { migration } = report;
143
+ console.log(input.performed
144
+ ? `Abandoned in-progress migration ${migration}: every recorded statement is now marked failed.`
145
+ : `Abandoning in-progress migration ${migration} marks every recorded statement failed. Nothing has changed yet.`);
146
+ const completed = report.operations.filter((op) => statusBeforeAbandon(op) === 'completed');
147
+ if (completed.length === 0) {
148
+ console.log('No statement had completed.');
149
+ }
150
+ else {
151
+ console.log(`${completed.length} completed statement(s) remain applied in ClickHouse:`);
152
+ for (const op of completed) {
153
+ console.log(` ${op.operationIndex + 1}. ${op.operationType} ${op.operationKey}`);
154
+ }
155
+ }
156
+ for (const op of report.operations) {
157
+ const statement = op.operationIndex + 1;
158
+ const status = statusBeforeAbandon(op);
159
+ if (status === 'failed') {
160
+ const reason = op.lastError.split('\n')[0]?.trim() ?? '';
161
+ console.log(reason === ''
162
+ ? `Statement ${statement} failed.`
163
+ : `Statement ${statement} failed: ${previewStatement(reason, 200)}`);
164
+ }
165
+ if (status === 'started') {
166
+ console.log(`Statement ${statement} was interrupted${op.queryId === '' ? '' : ` (query_id ${op.queryId})`}.`);
167
+ if (op.queryId !== '') {
168
+ console.log(` ⚠ If that query is still running on the server, wait for it to finish or run KILL QUERY WHERE query_id = '${op.queryId}' before you apply ${migration} again.`);
169
+ }
170
+ }
171
+ }
172
+ console.log('');
173
+ if (!input.fileExists) {
174
+ console.log(`${migration} is no longer in the migrations directory, so no apply runs it again. If you still need its changes, restore the file, or regenerate them: restore ${input.snapshotFile} from git to its state before ${migration} was generated and run chkit generate. ${REPEATED_STATEMENTS_HINT}`);
175
+ return;
176
+ }
177
+ console.log(`Next: edit ${migration} if needed and run chkit migrate --apply. It runs again from statement 1, including the statements that completed, so they must be safe to run twice (for example CREATE ... IF NOT EXISTS), or remove them from the file. A column's MODIFY COLUMN ... REMOVE DEFAULT or REMOVE MATERIALIZED is not safe: it fails once the column has no such expression.`);
178
+ // chkit runs -- before-retry: only on the async path, and only for a record
179
+ // whose operation type and key still match (rebaseInProgressState).
180
+ console.log('A data load adds its rows again unless it is marked mode=async with a -- before-retry: line that undoes it. That line runs only for an async statement that keeps its position, operation type and key.');
181
+ console.log(`Or regenerate it: delete ${migration}, restore ${input.snapshotFile} from git to its state before ${migration} was generated, and run chkit generate. ${REPEATED_STATEMENTS_HINT}`);
182
+ }
183
+ export function renderAbandonPlanOnlyNotice() {
184
+ console.log('\nPlan only. Re-run with --apply to abandon the in-progress state.');
185
+ }
186
+ function renderRetryNotice(retry) {
187
+ if (!retry)
188
+ return;
189
+ for (const line of formatRetryNotice(retry))
190
+ console.log(line);
191
+ }
192
+ function formatRetryNotice(retry) {
193
+ const { migration } = retry;
194
+ if (retry.action === 'none') {
195
+ const reasons = {
196
+ already_applied: 'already applied; --retry has no effect.',
197
+ not_in_scope: 'outside the --table scope; --retry has no effect.',
198
+ empty_migration: 'no executable statements; --retry has no effect.',
199
+ not_in_progress: 'no in-progress journal state; it applies normally.',
200
+ checksum_unchanged: 'unchanged since it failed; it resumes without --retry.',
201
+ };
202
+ return [`Retry ${migration}: ${reasons[retry.reason]}`];
203
+ }
204
+ const progress = retry.resumeAtStatement === null
205
+ ? `All ${retry.totalStatements} statements already completed; the migration will be recorded as applied.`
206
+ : `${retry.completedStatements} completed statement(s) will be skipped; resuming at statement ${retry.resumeAtStatement} of ${retry.totalStatements}.`;
207
+ const lines = [`Retry ${migration}: the file changed after a failed apply. ${progress}`];
208
+ if (retry.unmarkedCompletedStatements > 0) {
209
+ lines.push(`⚠ ${retry.unmarkedCompletedStatements} completed statement(s) have no "-- operation:" marker and were matched by position only. ` +
210
+ 'Do not add, remove, or reorder statements above the first statement that did not complete.');
211
+ }
212
+ return lines;
213
+ }
103
214
  //# sourceMappingURL=output.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/commands/migrate/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/commands/migrate/output.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,6 @@ import type { DestructiveOperationMarker } from '../../runtime/safety-markers.js
2
2
  export declare function isBackgroundOrCI(): boolean;
3
3
  export declare function printDestructiveOperationDetails(markers: DestructiveOperationMarker[]): void;
4
4
  export declare function confirmApply(): Promise<boolean>;
5
+ export declare function confirmAbandon(migration: string): Promise<boolean>;
5
6
  export declare function confirmDestructiveExecution(markers: DestructiveOperationMarker[]): Promise<boolean>;
6
7
  //# sourceMappingURL=prompts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/prompts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAA;AAEjF,wBAAgB,gBAAgB,IAAI,OAAO,CAO1C;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,0BAA0B,EAAE,GAAG,IAAI,CAW5F;AAcD,wBAAgB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAE/C;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,0BAA0B,EAAE,GACpC,OAAO,CAAC,OAAO,CAAC,CAGlB"}
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/prompts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAA;AAEjF,wBAAgB,gBAAgB,IAAI,OAAO,CAO1C;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,0BAA0B,EAAE,GAAG,IAAI,CAW5F;AAcD,wBAAgB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAE/C;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAElE;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,0BAA0B,EAAE,GACpC,OAAO,CAAC,OAAO,CAAC,CAGlB"}
@@ -33,6 +33,9 @@ async function promptYes(message) {
33
33
  export function confirmApply() {
34
34
  return promptYes('Apply pending migrations now? [no/yes]: ');
35
35
  }
36
+ export function confirmAbandon(migration) {
37
+ return promptYes(`Abandon the in-progress state of ${migration} now? [no/yes]: `);
38
+ }
36
39
  export async function confirmDestructiveExecution(markers) {
37
40
  printDestructiveOperationDetails(markers);
38
41
  return promptYes('Apply destructive operations? [no/yes]: ');
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/commands/migrate/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAIxD,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG;QACtB,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM;QACzB,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QACpB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACtB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAqC;IACpF,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;IAC/C,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;QAChD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;QACpC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;QAChD,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAA;IAC5D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAe;IACtC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC5E,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;QAC/D,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC3C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAA;IAChD,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC,0CAA0C,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAqC;IAErC,gCAAgC,CAAC,OAAO,CAAC,CAAA;IACzC,OAAO,SAAS,CAAC,0CAA0C,CAAC,CAAA;AAC9D,CAAC"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/commands/migrate/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAIxD,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG;QACtB,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM;QACzB,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QACpB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACtB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,OAAqC;IACpF,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;IAC/C,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;QAChD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;QAC3C,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;QACpC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;QAChD,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1C,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAA;IAC5D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAe;IACtC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC5E,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;QAC/D,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC3C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAA;IAChD,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC,0CAA0C,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO,SAAS,CAAC,oCAAoC,SAAS,kBAAkB,CAAC,CAAA;AACnF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAqC;IAErC,gCAAgC,CAAC,OAAO,CAAC,CAAA;IACzC,OAAO,SAAS,CAAC,0CAA0C,CAAC,CAAA;AAC9D,CAAC"}
@@ -0,0 +1,90 @@
1
+ import type { ParsedFlags } from '../../plugins.js';
2
+ import type { MigrationRowState, OperationState, OperationStatus } from '../../runtime/journal-store.js';
3
+ import type { MigrationOperationSummary } from '../../runtime/safety-markers.js';
4
+ import { MigrateError } from './errors.js';
5
+ export interface RecoveryTargets {
6
+ /** `--retry <migration>` as a file name. */
7
+ retryTarget: string | undefined;
8
+ /** `--abandon <migration>` as a file name. */
9
+ abandonTarget: string | undefined;
10
+ }
11
+ export interface StatementIdentity {
12
+ type: string;
13
+ key: string;
14
+ /** False for a statement without an `-- operation:` marker, matched by position only. */
15
+ marked: boolean;
16
+ }
17
+ export interface OperationMismatch {
18
+ /** 1-based statement number. */
19
+ statement: number;
20
+ /** `completed`, or `started` for an async statement that may still be running. */
21
+ status: OperationStatus;
22
+ queryId: string;
23
+ recorded: {
24
+ type: string;
25
+ key: string;
26
+ };
27
+ /** null when the edited file has no statement at that position. */
28
+ current: {
29
+ type: string;
30
+ key: string;
31
+ } | null;
32
+ }
33
+ /**
34
+ * A marker that a completed statement shares with other statements, which the
35
+ * edited file carries on fewer statements than the journal recorded.
36
+ */
37
+ export interface SharedMarkerMismatch {
38
+ type: string;
39
+ key: string;
40
+ /** The statements the journal recorded with this marker (1-based), in file order. */
41
+ recorded: Array<{
42
+ statement: number;
43
+ status: OperationStatus;
44
+ }>;
45
+ /** How many statements of the edited file carry the marker. */
46
+ currentCount: number;
47
+ }
48
+ export type RetryEditCheck = {
49
+ ok: true;
50
+ completed: number;
51
+ unmarkedCompleted: number;
52
+ /** 0-based index of the first statement that did not complete; null when all did. */
53
+ resumeIndex: number | null;
54
+ } | {
55
+ ok: false;
56
+ mismatches: OperationMismatch[];
57
+ sharedMarkers: SharedMarkerMismatch[];
58
+ };
59
+ /** Read --retry and --abandon; usage errors surface before any connection is made. */
60
+ export declare function resolveRecoveryTargets(flags: ParsedFlags): RecoveryTargets;
61
+ /** `name`, `name.sql` or a path to the file → `name.sql`. */
62
+ export declare function normalizeMigrationName(raw: string, flag: '--retry' | '--abandon'): string;
63
+ /** The (type, key) the journal records for statement `index`; apply and --retry share it. */
64
+ export declare function statementIdentity(operations: readonly MigrationOperationSummary[], index: number): StatementIdentity;
65
+ export declare function statementIdentities(operations: readonly MigrationOperationSummary[], statementCount: number): StatementIdentity[];
66
+ /**
67
+ * Whether --retry may resume an in-progress migration with an edited file.
68
+ * apply skips completed statements and re-attaches a running async statement
69
+ * by position, so each of them must keep its position and operation marker.
70
+ * The journal records only type and key per statement, not its SQL.
71
+ */
72
+ export declare function verifyRetryEdit(operations: readonly OperationState[], identities: readonly StatementIdentity[]): RetryEditCheck;
73
+ export declare function retryMismatchError(migration: string, check: {
74
+ mismatches: readonly OperationMismatch[];
75
+ sharedMarkers: readonly SharedMarkerMismatch[];
76
+ }): MigrateError;
77
+ /**
78
+ * Re-key an in-progress state to an edited file. Completed statements stay
79
+ * recorded (--retry verified them). A failed or started statement stays only
80
+ * if the same operation still sits at its index, so a retry keeps its
81
+ * `-- before-retry:` compensation and query id; any other record is dropped.
82
+ */
83
+ export declare function rebaseInProgressState(state: MigrationRowState, input: {
84
+ checksum: string;
85
+ identities: readonly StatementIdentity[];
86
+ appliedAt: string;
87
+ }): MigrationRowState;
88
+ /** Whether any statement of an in-progress state completed or may have run. */
89
+ export declare function hasStatementProgress(state: MigrationRowState): boolean;
90
+ //# sourceMappingURL=recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ import { MigrateError } from './errors.js';
2
+ /** Flags that mean nothing next to --abandon, which only changes the journal. */
3
+ const ABANDON_CONFLICTING_FLAGS = ['--retry', '--table', '--allow-destructive'];
4
+ /** Read --retry and --abandon; usage errors surface before any connection is made. */
5
+ export function resolveRecoveryTargets(flags) {
6
+ const retryRaw = flags['--retry'];
7
+ const abandonRaw = flags['--abandon'];
8
+ const retryTarget = typeof retryRaw === 'string' ? normalizeMigrationName(retryRaw, '--retry') : undefined;
9
+ const abandonTarget = typeof abandonRaw === 'string' ? normalizeMigrationName(abandonRaw, '--abandon') : undefined;
10
+ if (abandonTarget !== undefined) {
11
+ const conflicts = ABANDON_CONFLICTING_FLAGS.filter((name) => flags[name] !== undefined && flags[name] !== false);
12
+ if (conflicts.length > 0) {
13
+ throw new MigrateError('invalid_usage', `--abandon cannot be combined with ${conflicts.join(', ')}. It only resets the journal state of one migration and applies nothing.`);
14
+ }
15
+ }
16
+ return { retryTarget, abandonTarget };
17
+ }
18
+ /** `name`, `name.sql` or a path to the file → `name.sql`. */
19
+ export function normalizeMigrationName(raw, flag) {
20
+ const base = raw.trim().split(/[\\/]/).pop()?.trim() ?? '';
21
+ if (base === '' || base === '.sql') {
22
+ throw new MigrateError('invalid_usage', `${flag} requires a migration file name, for example ${flag} 20260101000000_add_users.sql.`);
23
+ }
24
+ return base.endsWith('.sql') ? base : `${base}.sql`;
25
+ }
26
+ /** The (type, key) the journal records for statement `index`; apply and --retry share it. */
27
+ export function statementIdentity(operations, index) {
28
+ const operation = operations[index];
29
+ return operation === undefined
30
+ ? { type: 'sql_statement', key: `statement:${index}`, marked: false }
31
+ : { type: operation.type, key: operation.key, marked: true };
32
+ }
33
+ export function statementIdentities(operations, statementCount) {
34
+ return Array.from({ length: statementCount }, (_, index) => statementIdentity(operations, index));
35
+ }
36
+ /**
37
+ * Whether --retry may resume an in-progress migration with an edited file.
38
+ * apply skips completed statements and re-attaches a running async statement
39
+ * by position, so each of them must keep its position and operation marker.
40
+ * The journal records only type and key per statement, not its SQL.
41
+ */
42
+ export function verifyRetryEdit(operations, identities) {
43
+ const bound = operations
44
+ .filter(isBoundToPosition)
45
+ .sort((a, b) => a.operationIndex - b.operationIndex);
46
+ const mismatches = [];
47
+ let completed = 0;
48
+ let unmarkedCompleted = 0;
49
+ for (const op of bound) {
50
+ const current = identities[op.operationIndex];
51
+ if (current === undefined || !sameIdentity(current, op)) {
52
+ mismatches.push({
53
+ statement: op.operationIndex + 1,
54
+ status: op.status,
55
+ queryId: op.queryId,
56
+ recorded: markerOf(op),
57
+ current: current === undefined ? null : { type: current.type, key: current.key },
58
+ });
59
+ continue;
60
+ }
61
+ if (op.status !== 'completed')
62
+ continue;
63
+ completed += 1;
64
+ if (!current.marked)
65
+ unmarkedCompleted += 1;
66
+ }
67
+ const sharedMarkers = findSharedMarkerMismatches(operations, identities, mismatches);
68
+ if (mismatches.length > 0 || sharedMarkers.length > 0)
69
+ return { ok: false, mismatches, sharedMarkers };
70
+ const done = new Set(operations.filter((op) => op.status === 'completed').map((op) => op.operationIndex));
71
+ const resumeIndex = identities.findIndex((_, index) => !done.has(index));
72
+ return { ok: true, completed, unmarkedCompleted, resumeIndex: resumeIndex === -1 ? null : resumeIndex };
73
+ }
74
+ export function retryMismatchError(migration, check) {
75
+ const { mismatches, sharedMarkers } = check;
76
+ const lines = mismatches.map((mismatch) => {
77
+ const { statement, recorded, current } = mismatch;
78
+ const label = mismatch.status === 'completed'
79
+ ? `completed as ${recorded.type} ${recorded.key}`
80
+ : `started as ${recorded.type} ${recorded.key} (async query_id ${mismatch.queryId})`;
81
+ const found = current === null
82
+ ? `the edited file has no statement ${statement}`
83
+ : `the edited file has ${current.type} ${current.key} there`;
84
+ return ` statement ${statement}: ${label}, but ${found}`;
85
+ });
86
+ const sharedLines = sharedMarkers.map((shared) => {
87
+ const statements = joinWithAnd(shared.recorded.map(({ statement, status }) => `${statement} (${status})`));
88
+ const count = `${shared.currentCount} statement${shared.currentCount === 1 ? '' : 's'}`;
89
+ return ` statements ${statements} share ${shared.type} ${shared.key}, but the edited file has ${count} with that marker`;
90
+ });
91
+ const sharedHint = sharedMarkers.length === 0
92
+ ? ''
93
+ : "\nStatements that share a marker, such as a column's REMOVE DEFAULT and the MODIFY COLUMN after it, are told apart only by position, so chkit cannot tell which one the edit removed. Keep each of them and edit only the one that failed.";
94
+ const running = mismatches.filter((mismatch) => mismatch.status === 'started');
95
+ const runningHint = running.map((mismatch) => `\nStatement ${mismatch.statement} may still be running on the server. Wait for it to finish or run KILL QUERY WHERE query_id = '${mismatch.queryId}' before you abandon the partial run.`);
96
+ return new MigrateError('retry_mismatch', `Cannot retry ${migration}: statements that completed or may still be running no longer match the edited file.\n` +
97
+ `${[...lines, ...sharedLines].join('\n')}\n` +
98
+ 'chkit skips completed statements and re-attaches running async statements by position, so they must keep their position and operation marker.' +
99
+ sharedHint +
100
+ runningHint.join('') +
101
+ `\nRestore them, or discard the partial run so the next apply starts the file over: chkit migrate --apply --abandon ${migration}`);
102
+ }
103
+ /**
104
+ * Re-key an in-progress state to an edited file. Completed statements stay
105
+ * recorded (--retry verified them). A failed or started statement stays only
106
+ * if the same operation still sits at its index, so a retry keeps its
107
+ * `-- before-retry:` compensation and query id; any other record is dropped.
108
+ */
109
+ export function rebaseInProgressState(state, input) {
110
+ const operations = state.operations.filter((op) => {
111
+ if (op.status === 'completed')
112
+ return true;
113
+ const current = input.identities[op.operationIndex];
114
+ return current !== undefined && sameIdentity(current, op);
115
+ });
116
+ return { ...state, checksum: input.checksum, appliedAt: input.appliedAt, operations };
117
+ }
118
+ /** Whether any statement of an in-progress state completed or may have run. */
119
+ export function hasStatementProgress(state) {
120
+ return state.operations.some((op) => op.status === 'completed' || op.status === 'started');
121
+ }
122
+ /**
123
+ * Statements can share a marker: a column's generated `REMOVE DEFAULT` or
124
+ * `REMOVE MATERIALIZED` carries the type and key of the MODIFY COLUMN after
125
+ * it. When a completed statement holds such a marker and the edited file
126
+ * carries it on fewer statements than the journal recorded, the position
127
+ * check cannot tell which one the edit removed: deleting the completed REMOVE
128
+ * slides the MODIFY into its slot, where apply would skip it as completed.
129
+ * A marker that a positional mismatch already reports is left out.
130
+ */
131
+ function findSharedMarkerMismatches(operations, identities, mismatches) {
132
+ const markers = operations
133
+ .filter(isBoundToPosition)
134
+ .map(markerOf)
135
+ .filter((marker, index, all) => all.findIndex((other) => sameMarker(other, marker)) === index)
136
+ .filter((marker) => !mismatches.some((mismatch) => sameMarker(mismatch.recorded, marker)));
137
+ return markers.flatMap((marker) => {
138
+ const recorded = operations
139
+ .filter((op) => sameMarker(markerOf(op), marker))
140
+ .sort((a, b) => a.operationIndex - b.operationIndex)
141
+ .map((op) => ({ statement: op.operationIndex + 1, status: op.status }));
142
+ const currentCount = identities.filter((identity) => sameMarker(identity, marker)).length;
143
+ return currentCount < recorded.length ? [{ ...marker, recorded, currentCount }] : [];
144
+ });
145
+ }
146
+ // A completed statement, or an async statement whose query may still be running.
147
+ function isBoundToPosition(op) {
148
+ return op.status === 'completed' || (op.status === 'started' && op.queryId !== '');
149
+ }
150
+ function sameIdentity(identity, op) {
151
+ return sameMarker(identity, markerOf(op));
152
+ }
153
+ function markerOf(op) {
154
+ return { type: op.operationType, key: op.operationKey };
155
+ }
156
+ function sameMarker(a, b) {
157
+ return a.type === b.type && a.key === b.key;
158
+ }
159
+ /** `['1', '2', '3']` → `1, 2 and 3`. */
160
+ function joinWithAnd(items) {
161
+ return items.length <= 1 ? items.join('') : `${items.slice(0, -1).join(', ')} and ${items.at(-1)}`;
162
+ }
163
+ //# sourceMappingURL=recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../../src/commands/migrate/recovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { JournalStore } from '../../runtime/journal-store.js';
2
+ export interface RetryResume {
3
+ action: 'resume';
4
+ migration: string;
5
+ previousChecksum: string;
6
+ checksum: string;
7
+ totalStatements: number;
8
+ completedStatements: number;
9
+ /** 1-based number of the first statement that runs; null when every statement already completed. */
10
+ resumeAtStatement: number | null;
11
+ /** Completed statements without an `-- operation:` marker, matched by position only. */
12
+ unmarkedCompletedStatements: number;
13
+ }
14
+ export type RetryNoopReason = 'already_applied' | 'not_in_scope' | 'empty_migration' | 'not_in_progress' | 'checksum_unchanged';
15
+ export interface RetryNoop {
16
+ action: 'none';
17
+ migration: string;
18
+ reason: RetryNoopReason;
19
+ }
20
+ export type RetryResolution = RetryResume | RetryNoop;
21
+ /**
22
+ * Decide what --retry <migration> does in this run, before anything is
23
+ * applied. A target that is not an edited in-progress migration is a no-op,
24
+ * so the same command can run against every environment; an edit that moved
25
+ * or changed a statement that already ran throws `retry_mismatch`.
26
+ */
27
+ export declare function resolveRetry(input: {
28
+ migration: string;
29
+ migrationsDir: string;
30
+ pending: readonly string[];
31
+ /** Pending files without executable statements, which apply refuses. */
32
+ emptyMigrations: readonly string[];
33
+ appliedNames: ReadonlySet<string>;
34
+ }, deps: {
35
+ journalStore: JournalStore;
36
+ }): Promise<RetryResolution>;
37
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/commands/migrate/retry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAQlE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,QAAQ,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,EAAE,MAAM,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,MAAM,CAAA;IACvB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,oGAAoG;IACpG,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,wFAAwF;IACxF,2BAA2B,EAAE,MAAM,CAAA;CACpC;AAED,MAAM,MAAM,eAAe,GACvB,iBAAiB,GACjB,cAAc,GACd,iBAAiB,GACjB,iBAAiB,GACjB,oBAAoB,CAAA;AAExB,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,SAAS,CAAA;AAErD;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1B,wEAAwE;IACxE,eAAe,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAClC,EACD,IAAI,EAAE;IAAE,YAAY,EAAE,YAAY,CAAA;CAAE,GACnC,OAAO,CAAC,eAAe,CAAC,CA6B1B"}
@@ -0,0 +1,46 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { checksumSQL } from '../../runtime/migration-store.js';
4
+ import { extractExecutableStatements, extractMigrationOperationSummaries, } from '../../runtime/safety-markers.js';
5
+ import { retryMismatchError, statementIdentities, verifyRetryEdit } from './recovery.js';
6
+ /**
7
+ * Decide what --retry <migration> does in this run, before anything is
8
+ * applied. A target that is not an edited in-progress migration is a no-op,
9
+ * so the same command can run against every environment; an edit that moved
10
+ * or changed a statement that already ran throws `retry_mismatch`.
11
+ */
12
+ export async function resolveRetry(input, deps) {
13
+ const { migration } = input;
14
+ if (input.appliedNames.has(migration))
15
+ return { action: 'none', migration, reason: 'already_applied' };
16
+ if (!input.pending.includes(migration))
17
+ return { action: 'none', migration, reason: 'not_in_scope' };
18
+ if (input.emptyMigrations.includes(migration))
19
+ return { action: 'none', migration, reason: 'empty_migration' };
20
+ const state = await deps.journalStore.readMigrationState(migration);
21
+ if (state === null)
22
+ return { action: 'none', migration, reason: 'not_in_progress' };
23
+ if (state.migrationCompleted)
24
+ return { action: 'none', migration, reason: 'already_applied' };
25
+ const sql = await readFile(join(input.migrationsDir, migration), 'utf8');
26
+ const checksum = checksumSQL(sql);
27
+ if (state.checksum === checksum)
28
+ return { action: 'none', migration, reason: 'checksum_unchanged' };
29
+ // The file's statements before onBeforeApply; apply checks again against the
30
+ // statements the plugins return.
31
+ const identities = statementIdentities(extractMigrationOperationSummaries(sql), extractExecutableStatements(sql).length);
32
+ const check = verifyRetryEdit(state.operations, identities);
33
+ if (!check.ok)
34
+ throw retryMismatchError(migration, check);
35
+ return {
36
+ action: 'resume',
37
+ migration,
38
+ previousChecksum: state.checksum,
39
+ checksum,
40
+ totalStatements: identities.length,
41
+ completedStatements: check.completed,
42
+ resumeAtStatement: check.resumeIndex === null ? null : check.resumeIndex + 1,
43
+ unmarkedCompletedStatements: check.unmarkedCompleted,
44
+ };
45
+ }
46
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/commands/migrate/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAGhC,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,EACL,2BAA2B,EAC3B,kCAAkC,GACnC,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AA8BxF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAOC,EACD,IAAoC;IAEpC,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;IAC3B,IAAI,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;IACtG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;IACpG,IAAI,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;IAC9G,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAA;IACnE,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;IACnF,IAAI,KAAK,CAAC,kBAAkB;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAA;IAC7F,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,CAAA;IACxE,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;IACnG,6EAA6E;IAC7E,iCAAiC;IACjC,MAAM,UAAU,GAAG,mBAAmB,CACpC,kCAAkC,CAAC,GAAG,CAAC,EACvC,2BAA2B,CAAC,GAAG,CAAC,CAAC,MAAM,CACxC,CAAA;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IAC3D,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,MAAM,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IACzD,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,SAAS;QACT,gBAAgB,EAAE,KAAK,CAAC,QAAQ;QAChC,QAAQ;QACR,eAAe,EAAE,UAAU,CAAC,MAAM;QAClC,mBAAmB,EAAE,KAAK,CAAC,SAAS;QACpC,iBAAiB,EAAE,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC;QAC5E,2BAA2B,EAAE,KAAK,CAAC,iBAAiB;KACrD,CAAA;AACH,CAAC"}
@@ -86,7 +86,9 @@ async function cmdPlugin(ctx) {
86
86
  const tableSelector = gf['--table'];
87
87
  let tableScope;
88
88
  try {
89
- const definitions = await loadSchemaDefinitions(ctx.config.schema);
89
+ // Without --table the scope is unfiltered, so only a selector needs the schema.
90
+ // A plugin command that needs it loads it and reports its load errors itself.
91
+ const definitions = tableSelector ? await loadSchemaDefinitions(ctx.config.schema) : [];
90
92
  tableScope = resolveTableScope(tableSelector, tableKeysFromDefinitions(definitions));
91
93
  }
92
94
  catch {