@intentius/sql-yodeler 0.1.0 → 0.2.0

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 (177) hide show
  1. package/README.md +26 -24
  2. package/dist/bin.js +15 -0
  3. package/dist/bin.js.map +1 -1
  4. package/dist/chant/apply.d.ts +9 -1
  5. package/dist/chant/apply.js +13 -1
  6. package/dist/chant/apply.js.map +1 -1
  7. package/dist/chant/drift.d.ts +69 -1
  8. package/dist/chant/drift.js +152 -5
  9. package/dist/chant/drift.js.map +1 -1
  10. package/dist/chant/runnable.d.ts +19 -0
  11. package/dist/chant/runnable.js +47 -0
  12. package/dist/chant/runnable.js.map +1 -0
  13. package/dist/cli.d.ts +4 -0
  14. package/dist/cli.js +40 -0
  15. package/dist/cli.js.map +1 -1
  16. package/dist/command.d.ts +6 -0
  17. package/dist/command.js.map +1 -1
  18. package/dist/commands/apply.js +161 -41
  19. package/dist/commands/apply.js.map +1 -1
  20. package/dist/commands/approve.d.ts +5 -0
  21. package/dist/commands/approve.js +111 -0
  22. package/dist/commands/approve.js.map +1 -0
  23. package/dist/commands/drift.d.ts +11 -0
  24. package/dist/commands/drift.js +247 -18
  25. package/dist/commands/drift.js.map +1 -1
  26. package/dist/commands/index.js +6 -0
  27. package/dist/commands/index.js.map +1 -1
  28. package/dist/commands/init.d.ts +3 -0
  29. package/dist/commands/init.js +15 -11
  30. package/dist/commands/init.js.map +1 -1
  31. package/dist/commands/lint.js +14 -5
  32. package/dist/commands/lint.js.map +1 -1
  33. package/dist/commands/mcp.d.ts +3 -0
  34. package/dist/commands/mcp.js +50 -0
  35. package/dist/commands/mcp.js.map +1 -0
  36. package/dist/commands/new.d.ts +2 -0
  37. package/dist/commands/new.js +134 -10
  38. package/dist/commands/new.js.map +1 -1
  39. package/dist/commands/override.d.ts +3 -0
  40. package/dist/commands/override.js +118 -0
  41. package/dist/commands/override.js.map +1 -0
  42. package/dist/commands/plan.js +38 -26
  43. package/dist/commands/plan.js.map +1 -1
  44. package/dist/commands/repair.d.ts +11 -0
  45. package/dist/commands/repair.js +15 -7
  46. package/dist/commands/repair.js.map +1 -1
  47. package/dist/commands/status.js +12 -12
  48. package/dist/commands/status.js.map +1 -1
  49. package/dist/config/define.d.ts +101 -3
  50. package/dist/config/define.js +1 -1
  51. package/dist/config/define.js.map +1 -1
  52. package/dist/config/load.js +64 -4
  53. package/dist/config/load.js.map +1 -1
  54. package/dist/config/settings.d.ts +14 -1
  55. package/dist/config/settings.js +32 -4
  56. package/dist/config/settings.js.map +1 -1
  57. package/dist/env-args.d.ts +6 -0
  58. package/dist/env-args.js +31 -1
  59. package/dist/env-args.js.map +1 -1
  60. package/dist/exit.d.ts +20 -0
  61. package/dist/exit.js +28 -0
  62. package/dist/exit.js.map +1 -0
  63. package/dist/history/client.d.ts +8 -0
  64. package/dist/history/client.js +24 -1
  65. package/dist/history/client.js.map +1 -1
  66. package/dist/history/lock.d.ts +5 -1
  67. package/dist/history/lock.js +8 -2
  68. package/dist/history/lock.js.map +1 -1
  69. package/dist/index.d.ts +1 -1
  70. package/dist/init/adopt.js +8 -3
  71. package/dist/init/adopt.js.map +1 -1
  72. package/dist/init/live.d.ts +11 -0
  73. package/dist/init/live.js +25 -2
  74. package/dist/init/live.js.map +1 -1
  75. package/dist/lint/check.d.ts +8 -1
  76. package/dist/lint/check.js +23 -4
  77. package/dist/lint/check.js.map +1 -1
  78. package/dist/mcp/server.d.ts +40 -0
  79. package/dist/mcp/server.js +106 -0
  80. package/dist/mcp/server.js.map +1 -0
  81. package/dist/mcp/tools.d.ts +72 -0
  82. package/dist/mcp/tools.js +178 -0
  83. package/dist/mcp/tools.js.map +1 -0
  84. package/dist/migrations/checks.d.ts +28 -0
  85. package/dist/migrations/checks.js +97 -0
  86. package/dist/migrations/checks.js.map +1 -0
  87. package/dist/migrations/create.d.ts +3 -1
  88. package/dist/migrations/create.js +1 -0
  89. package/dist/migrations/create.js.map +1 -1
  90. package/dist/migrations/directory.js +4 -0
  91. package/dist/migrations/directory.js.map +1 -1
  92. package/dist/migrations/document.d.ts +23 -0
  93. package/dist/migrations/document.js +1 -0
  94. package/dist/migrations/document.js.map +1 -1
  95. package/dist/migrations/index.d.ts +1 -0
  96. package/dist/migrations/index.js +1 -0
  97. package/dist/migrations/index.js.map +1 -1
  98. package/dist/pr/forge.d.ts +4 -0
  99. package/dist/pr/forge.js +21 -7
  100. package/dist/pr/forge.js.map +1 -1
  101. package/dist/pr/issue.d.ts +68 -0
  102. package/dist/pr/issue.js +107 -0
  103. package/dist/pr/issue.js.map +1 -0
  104. package/dist/pr/model.d.ts +9 -1
  105. package/dist/pr/model.js +30 -6
  106. package/dist/pr/model.js.map +1 -1
  107. package/dist/pr/render.d.ts +3 -1
  108. package/dist/pr/render.js +36 -3
  109. package/dist/pr/render.js.map +1 -1
  110. package/dist/replay/index.d.ts +3 -0
  111. package/dist/replay/index.js +3 -0
  112. package/dist/replay/index.js.map +1 -1
  113. package/dist/replay/replay.js +1 -1
  114. package/dist/replay/replay.js.map +1 -1
  115. package/dist/replay/shared.d.ts +28 -0
  116. package/dist/replay/shared.js +77 -0
  117. package/dist/replay/shared.js.map +1 -0
  118. package/dist/schemas.d.ts +34 -0
  119. package/dist/schemas.js +38 -0
  120. package/dist/schemas.js.map +1 -0
  121. package/dist/server.d.ts +40 -0
  122. package/dist/server.js +87 -0
  123. package/dist/server.js.map +1 -0
  124. package/dist/steps/backfill.d.ts +21 -17
  125. package/dist/steps/backfill.js +20 -20
  126. package/dist/steps/backfill.js.map +1 -1
  127. package/dist/steps/index.d.ts +2 -2
  128. package/dist/steps/index.js +3 -3
  129. package/dist/steps/index.js.map +1 -1
  130. package/dist/steps/rebuild.d.ts +15 -15
  131. package/dist/steps/rebuild.js +17 -24
  132. package/dist/steps/rebuild.js.map +1 -1
  133. package/dist/versioned/checks.d.ts +29 -0
  134. package/dist/versioned/checks.js +54 -0
  135. package/dist/versioned/checks.js.map +1 -0
  136. package/dist/versioned/clickhouse.js +8 -0
  137. package/dist/versioned/clickhouse.js.map +1 -1
  138. package/dist/versioned/driver.d.ts +10 -0
  139. package/dist/versioned/engine.d.ts +55 -1
  140. package/dist/versioned/engine.js +99 -6
  141. package/dist/versioned/engine.js.map +1 -1
  142. package/dist/versioned/explain.js +7 -2
  143. package/dist/versioned/explain.js.map +1 -1
  144. package/dist/versioned/index.d.ts +9 -0
  145. package/dist/versioned/index.js +24 -1
  146. package/dist/versioned/index.js.map +1 -1
  147. package/dist/versioned/op.d.ts +10 -0
  148. package/dist/versioned/op.js +36 -4
  149. package/dist/versioned/op.js.map +1 -1
  150. package/dist/versioned/policy.d.ts +67 -0
  151. package/dist/versioned/policy.js +161 -0
  152. package/dist/versioned/policy.js.map +1 -0
  153. package/dist/versioned/postgres/driver.d.ts +3 -1
  154. package/dist/versioned/postgres/driver.js +30 -3
  155. package/dist/versioned/postgres/driver.js.map +1 -1
  156. package/dist/versioned/postgres/waits.d.ts +46 -0
  157. package/dist/versioned/postgres/waits.js +78 -0
  158. package/dist/versioned/postgres/waits.js.map +1 -0
  159. package/dist/versioned/report.d.ts +3 -0
  160. package/dist/versioned/report.js +4 -1
  161. package/dist/versioned/report.js.map +1 -1
  162. package/dist/versioned/stand-down.d.ts +30 -0
  163. package/dist/versioned/stand-down.js +56 -0
  164. package/dist/versioned/stand-down.js.map +1 -0
  165. package/package.json +18 -8
  166. package/schemas/apply.schema.json +269 -0
  167. package/schemas/common.schema.json +213 -0
  168. package/schemas/drift.schema.json +36 -0
  169. package/schemas/init.schema.json +31 -0
  170. package/schemas/lint-rules.schema.json +54 -0
  171. package/schemas/lint.schema.json +290 -0
  172. package/schemas/mcp.schema.json +70 -0
  173. package/schemas/new.schema.json +71 -0
  174. package/schemas/plan.schema.json +371 -0
  175. package/schemas/rebase.schema.json +54 -0
  176. package/schemas/repair.schema.json +20 -0
  177. package/schemas/status.schema.json +310 -0
@@ -0,0 +1,111 @@
1
+ import { parseArgs } from "node:util";
2
+ import { guarded } from "../env-args.js";
3
+ import { loadProject, resolveEnvironment, YodelError } from "../project.js";
4
+ import { readMigrations } from "../migrations/index.js";
5
+ import { runChant } from "../chant/process.js";
6
+ import { runnable } from "../chant/runnable.js";
7
+ import { closeVersioned, findMigrateOp, hasMigrations, migrationsDir, openVersioned, renderStatus, statusReport, ALLOW_OUT_OF_ORDER_ENV } from "../versioned/index.js";
8
+ /** Exit code: nothing was approved (no one to ask, a wrong answer, a plan apply would refuse, a plan that moved). */
9
+ export const NOT_APPROVED = 4;
10
+ const usage = "usage: yodel approve <env> [--dir <project>] [--op <name>] [--allow-out-of-order]";
11
+ const help = `${usage}
12
+
13
+ For a person at a terminal. Approves the plan yodel apply <env> would run,
14
+ without the Op and gate names or the digest: shows the pending migrations
15
+ and the plan digest, asks you to type the environment's name, then records
16
+ the approval with chant approve <op> <gate> --plan <digest>. It is the same
17
+ approval chant approve gives, bound to the same digest: if anything the
18
+ digest covers changes before the apply, the gate asks again. Then run
19
+ yodel apply <env>.
20
+
21
+ It never approves on its own. With no terminal to ask (a script, CI, an
22
+ agent) it approves nothing and exits 4, and no flag skips the question.
23
+ Versioned projects only (a migrations/ directory); for a declarative
24
+ project, yodel apply prints the chant approve command.
25
+
26
+ Options:
27
+ --op <name> the migrations Op, when more than one applies <env>
28
+ --allow-out-of-order approve the plan yodel apply --allow-out-of-order runs
29
+ -C, --dir <dir> the project directory (default: the working directory)
30
+
31
+ Exit codes:
32
+ 0 approved, or nothing is pending
33
+ 4 nothing approved: no terminal to ask, an answer that was not the
34
+ environment's name, a plan apply would refuse, or a plan that moved
35
+ while you were asked
36
+ 2 a pending migration has a step yodel apply does not run
37
+ 1 anything else: a bad config, a server that does not answer, chant
38
+ approve failed
39
+ `;
40
+ /** `yodel approve <env>`; the exit codes are in `help`. */
41
+ export const approve = {
42
+ name: "approve",
43
+ summary: "approve the plan yodel apply would run (a person at a terminal)",
44
+ implemented: true,
45
+ run: (args, io) => guarded("approve", io, args, help, async () => {
46
+ let parsed;
47
+ try {
48
+ parsed = parseArgs({
49
+ args,
50
+ allowPositionals: true,
51
+ strict: true,
52
+ options: { dir: { type: "string", short: "C" }, op: { type: "string" }, "allow-out-of-order": { type: "boolean" } },
53
+ });
54
+ }
55
+ catch (e) {
56
+ throw new YodelError(`${e instanceof Error ? e.message : String(e)}\n${usage}`);
57
+ }
58
+ const { values, positionals } = parsed;
59
+ const [name, ...rest] = positionals;
60
+ if (name === undefined || rest.length > 0)
61
+ throw new YodelError(usage);
62
+ const allowOutOfOrder = values["allow-out-of-order"] === true || process.env[ALLOW_OUT_OF_ORDER_ENV] === "1";
63
+ const project = await loadProject(typeof values.dir === "string" ? values.dir : process.cwd());
64
+ const env = resolveEnvironment(project, name);
65
+ // Asked before anything is read: no terminal is no one to ask, whatever the plan.
66
+ const ask = io.ask;
67
+ if (!ask) {
68
+ io.err(`yodel approve: there is no terminal to ask, so nothing was approved. An approval is a person's decision: ` +
69
+ `run yodel approve ${env.name} yourself at a terminal.\n`);
70
+ return NOT_APPROVED;
71
+ }
72
+ if (!hasMigrations(project)) {
73
+ throw new YodelError(`${project.dir} has no migrations/ directory with a migration; yodel approve is for versioned migrations. For a declarative project, run yodel apply ${env.name}: it prints the chant approve command`);
74
+ }
75
+ const ordered = readMigrations(migrationsDir(project));
76
+ const venv = await openVersioned(project, env);
77
+ try {
78
+ const report = await statusReport(venv, ordered, { allowOutOfOrder });
79
+ if (report.refusal) {
80
+ io.err(`yodel approve: ${report.refusal.message}\nNothing was approved.\n`);
81
+ return report.refusal.exitCode;
82
+ }
83
+ if (report.status.pending.length === 0 || !report.digest) {
84
+ io.out(`${env.name} is up to date: there is nothing to approve.\n`);
85
+ return 0;
86
+ }
87
+ const op = await findMigrateOp(project, env, typeof values.op === "string" ? values.op : undefined);
88
+ io.out(renderStatus(report));
89
+ const answer = (await ask(`\nApprove this plan for ${env.name}, ${report.digest}? Type ${env.name} to approve: `)).trim();
90
+ if (answer !== env.name) {
91
+ io.err(`Not approved: the answer was not ${env.name}.\n`);
92
+ return NOT_APPROVED;
93
+ }
94
+ // The plan is read again: what is approved is what the person saw.
95
+ const again = await statusReport(venv, ordered, { allowOutOfOrder });
96
+ if (again.digest !== report.digest) {
97
+ io.err(`Not approved: the plan moved while you were asked (now ${again.digest ?? "nothing to apply"}); run yodel approve ${env.name} again.\n`);
98
+ return NOT_APPROVED;
99
+ }
100
+ const ran = await runChant(["approve", op.name, op.gate, "--plan", report.digest], { cwd: project.dir, onStdout: io.err, onStderr: io.err });
101
+ if (ran.code !== 0)
102
+ throw new YodelError(`chant approve ${op.name} ${op.gate} failed (exit ${String(ran.code)}); nothing was approved`);
103
+ io.out(`\nApproved ${report.digest} for ${op.name} / ${op.gate}. Apply it with:\n ${runnable(`yodel apply ${env.name}`, project.dir)}\n`);
104
+ return 0;
105
+ }
106
+ finally {
107
+ await closeVersioned(venv);
108
+ }
109
+ }),
110
+ };
111
+ //# sourceMappingURL=approve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approve.js","sourceRoot":"","sources":["../../src/commands/approve.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,14 @@
1
1
  import type { Command } from "../command.js";
2
+ import { type BuildOutput } from "../chant/build.js";
3
+ import type { Environment, Project } from "../project.js";
4
+ /**
5
+ * The schema the environment's history says it has: the recorded schema
6
+ * of the newest migration, in chain order, that the history records as
7
+ * applied. `undefined` when none is applied yet.
8
+ */
9
+ export declare function recordedSchema(project: Project, env: Environment): Promise<{
10
+ migration: string;
11
+ schema: BuildOutput;
12
+ } | undefined>;
2
13
  /** `yodel drift <env>`; the exit codes are in `help`. */
3
14
  export declare const drift: Command;
@@ -1,38 +1,267 @@
1
- import { guarded, parseEnvArgs, usage } from "../env-args.js";
2
- import { loadProject, resolveEnvironment } from "../project.js";
3
- import { driftExitCode, readDrift, renderDrift } from "../chant/drift.js";
4
- const help = `${usage("drift")}
1
+ import { execFile } from "node:child_process";
2
+ import { parseArgs } from "node:util";
3
+ import { promisify } from "node:util";
4
+ import { guarded } from "../env-args.js";
5
+ import { loadProject, resolveEnvironment, YodelError } from "../project.js";
6
+ import { declarativeTopologyRefusal } from "../config/settings.js";
7
+ import { declaredColumns, driftExitCode, driftFingerprint, readDrift, renderDrift, renderDriftMarkdown, writeRecordedSource, } from "../chant/drift.js";
8
+ import { buildSchema } from "../chant/build.js";
9
+ import { probeServer, softly } from "../server.js";
10
+ import { describeHolders, describeMs, isLockTimeout, lockHolders, lockTimeoutOptions } from "../versioned/postgres/waits.js";
11
+ import { DEFAULT_PG_TIMEOUTS } from "../versioned/postgres/executor.js";
12
+ import { closeVersioned, hasMigrations, inspect, openVersioned, readChain } from "../versioned/index.js";
13
+ import { isApplied } from "../history/index.js";
14
+ import { resolveForgeRepo } from "../pr/forge.js";
15
+ import { driftIssueMarker, issueClient, trackDrift } from "../pr/issue.js";
16
+ /** The profile's lock timeout (#18), which chant's read runs under, and where to look for the lock when it passes. */
17
+ async function postgresLockSettings(project, env) {
18
+ const { resolvePostgresTarget, isUnresolvedTarget } = await import("@intentius/chant-lexicon-sql/postgres/live/bind");
19
+ const target = resolvePostgresTarget({ environment: env.name, config: project.config, env: process.env });
20
+ if (isUnresolvedTarget(target))
21
+ return undefined;
22
+ return { endpoint: target.endpoint, schemas: target.schemas, lockTimeoutMs: target.timeouts?.lockTimeoutMs ?? DEFAULT_PG_TIMEOUTS.lockTimeoutMs };
23
+ }
24
+ /** What the read waited on: `waited 5s for a lock on shop.orders (held by pid 123, psql)`. */
25
+ async function lockWait(pg) {
26
+ const { connectPostgres } = await import("@intentius/chant-lexicon-sql/postgres/live/client");
27
+ const holders = await softly(async () => {
28
+ const client = await connectPostgres(pg.endpoint, { applicationName: "yodel" });
29
+ try {
30
+ return await lockHolders(client, pg.schemas);
31
+ }
32
+ finally {
33
+ await client.end();
34
+ }
35
+ });
36
+ return `waited ${describeMs(pg.lockTimeoutMs)} (lockTimeoutMs) for ${describeHolders(holders ?? [])}; run yodel drift again once it is released`;
37
+ }
38
+ /**
39
+ * The schema the environment's history says it has: the recorded schema
40
+ * of the newest migration, in chain order, that the history records as
41
+ * applied. `undefined` when none is applied yet.
42
+ */
43
+ export async function recordedSchema(project, env) {
44
+ const ordered = readChain(project);
45
+ const venv = await openVersioned(project, env);
46
+ try {
47
+ const { state } = await inspect(venv, ordered);
48
+ const newest = [...ordered].reverse().find((m) => isApplied(state.byId.get(m.id)));
49
+ if (newest)
50
+ return { migration: newest.id, schema: newest.document.schema };
51
+ const gone = state.migrations.filter((r) => isApplied(r)).map((r) => r.id);
52
+ if (gone.length > 0)
53
+ throw new YodelError(`the history records ${gone.join(", ")} applied, and the migrations directory has none of them, so there is no recorded schema to compare with; pass --against src`);
54
+ return undefined;
55
+ }
56
+ finally {
57
+ await closeVersioned(venv);
58
+ }
59
+ }
60
+ /** The project's directory in its git repository (`.` at the root), which keys its tracking issue. */
61
+ async function projectPath(dir) {
62
+ try {
63
+ const { stdout } = await promisify(execFile)("git", ["rev-parse", "--show-prefix"], { cwd: dir });
64
+ return stdout.trim().replace(/\/+$/, "") || ".";
65
+ }
66
+ catch {
67
+ return ".";
68
+ }
69
+ }
70
+ /** The CI run, for the issue to link: GitHub and Forgejo Actions, GitLab CI. */
71
+ function runUrl(env) {
72
+ if (env.CI_JOB_URL)
73
+ return env.CI_JOB_URL;
74
+ if (env.GITHUB_SERVER_URL && env.GITHUB_REPOSITORY && env.GITHUB_RUN_ID)
75
+ return `${env.GITHUB_SERVER_URL.replace(/\/+$/, "")}/${env.GITHUB_REPOSITORY}/actions/runs/${env.GITHUB_RUN_ID}`;
76
+ return undefined;
77
+ }
78
+ const usage = "usage: yodel drift <env> [--json] [--dir <project>] [--against history|src]\n" +
79
+ " [--issue [--forge github|gitlab|forgejo] [--repo <repo>] [--api-url <url>] [--token-env <VAR>]]";
80
+ const help = `${usage}
5
81
 
6
82
  Reports the declared objects changed out of band or gone from the
7
83
  environment, from chant lifecycle diff <env> --live. Objects the project does
8
84
  not declare are never reported.
9
85
 
86
+ What the server is compared with:
87
+
88
+ - history (the default when the project has migrations): the schema recorded
89
+ by the newest migration the environment's history records as applied. A
90
+ migration merged but not applied yet (waiting at its gate, or refused) is
91
+ not drift.
92
+ - src (the default without migrations): the declared schema in src/.
93
+
10
94
  Options:
11
- --json print the drift as JSON
12
- -C, --dir <dir> the project directory (default: the working directory)
95
+ --against <what> history or src, as above
96
+ --json print the drift as JSON, with a fingerprint of it
97
+ --issue keep one tracking issue for this project and
98
+ environment on the forge: opened when drift is found,
99
+ updated while it changes, closed when it is gone. A run
100
+ that cannot read a declared object leaves the issue as
101
+ it is, and says so. The forge, repository and token
102
+ come from the CI job's environment, as for yodel plan
103
+ --comment (GITHUB_TOKEN, GITLAB_TOKEN, FORGEJO_TOKEN):
104
+ --forge <f> github, gitlab or forgejo
105
+ --repo <repo> owner/name (GitHub, Forgejo), or the project id or path (GitLab)
106
+ --api-url <url> the REST API base
107
+ --token-env <VAR> the variable holding the token
108
+ -C, --dir <dir> the project directory (default: the working directory)
13
109
 
14
110
  Exit codes:
15
111
  0 no drift
16
112
  2 a declared object changed out of band, or is gone
17
113
  1 the drift could not be read, or there is none but a declared object
18
- could not be read (its state is unknown, not clean)
114
+ could not be read (its state is unknown, not clean), or the tracking
115
+ issue could not be written
19
116
  `;
117
+ function parseDriftArgs(args) {
118
+ let parsed;
119
+ try {
120
+ parsed = parseArgs({
121
+ args,
122
+ allowPositionals: true,
123
+ strict: true,
124
+ options: {
125
+ json: { type: "boolean" },
126
+ dir: { type: "string", short: "C" },
127
+ against: { type: "string" },
128
+ issue: { type: "boolean" },
129
+ forge: { type: "string" },
130
+ repo: { type: "string" },
131
+ "api-url": { type: "string" },
132
+ "token-env": { type: "string" },
133
+ },
134
+ });
135
+ }
136
+ catch (e) {
137
+ throw new YodelError(`${e instanceof Error ? e.message : String(e)}\n${usage}`);
138
+ }
139
+ const { values: v, positionals } = parsed;
140
+ const [env, ...rest] = positionals;
141
+ if (env === undefined || rest.length > 0)
142
+ throw new YodelError(usage);
143
+ const str = (k) => (typeof v[k] === "string" ? v[k] : undefined);
144
+ const against = str("against");
145
+ if (against !== undefined && against !== "history" && against !== "src")
146
+ throw new YodelError(`--against must be history or src, got ${JSON.stringify(against)}\n${usage}`);
147
+ const forgeFlags = ["forge", "repo", "api-url", "token-env"].filter((k) => str(k) !== undefined);
148
+ if (forgeFlags.length > 0 && v.issue !== true)
149
+ throw new YodelError(`--${forgeFlags.join(", --")} ${forgeFlags.length === 1 ? "goes" : "go"} with --issue\n${usage}`);
150
+ return {
151
+ env,
152
+ json: v.json === true,
153
+ dir: str("dir") ?? process.cwd(),
154
+ against,
155
+ issue: v.issue === true,
156
+ forge: { forge: str("forge"), repo: str("repo"), apiUrl: str("api-url"), tokenEnv: str("token-env") },
157
+ };
158
+ }
159
+ /** What the tracking issue should do with a run's result. */
160
+ function outcomeOf(drift, code, body) {
161
+ if (code === 2) {
162
+ const names = [...drift.changed.map((e) => e.name), ...drift.missing];
163
+ const shown = names.length > 3 ? `${names.slice(0, 3).join(", ")} and ${String(names.length - 3)} more` : names.join(", ");
164
+ return { kind: "drift", title: `Drift in ${drift.environment}: ${shown}`, body, fingerprint: driftFingerprint(drift) };
165
+ }
166
+ if (code === 0)
167
+ return { kind: "clean", comment: `No drift in ${drift.environment} now: every declared object matches the server. Closed by yodel drift.` };
168
+ return { kind: "unknown", why: `${String(drift.unobserved.length)} declared object(s) could not be read, so whether ${drift.environment} drifted is unknown` };
169
+ }
170
+ function describeAction(a, target) {
171
+ const where = `${target.forge} ${target.repo}`;
172
+ if (a.action === "none")
173
+ return `no drift, and no tracking issue open on ${where}`;
174
+ const issue = "issue" in a ? `#${String(a.issue.number)}${a.issue.url ? ` (${a.issue.url})` : ""}` : "";
175
+ if (a.action === "left")
176
+ return `left the tracking issue${issue ? ` ${issue}` : ""} on ${where} as it is: ${a.why}`;
177
+ return `${a.action} the tracking issue ${issue} on ${where}`;
178
+ }
20
179
  /** `yodel drift <env>`; the exit codes are in `help`. */
21
180
  export const drift = {
22
181
  name: "drift",
23
- summary: "report declared objects changed out of band or gone from an environment",
182
+ summary: "report declared objects changed out of band or gone",
24
183
  implemented: true,
25
184
  run: (args, io) => guarded("drift", io, args, help, async () => {
26
- const { env: name, json, dir } = parseEnvArgs("drift", args);
27
- const project = await loadProject(dir);
28
- const env = resolveEnvironment(project, name);
29
- const result = await readDrift(project, env);
30
- const code = driftExitCode(result);
31
- if (json)
32
- io.out(`${JSON.stringify({ ...result, dialect: project.dialect, drifted: code === 2 }, null, 2)}\n`);
33
- else
34
- io.out(renderDrift(result));
35
- return code;
185
+ const a = parseDriftArgs(args);
186
+ const project = await loadProject(a.dir);
187
+ const env = resolveEnvironment(project, a.env);
188
+ // chant renders the declaration for sql.profiles.<env>.topology alone; a different one in yodel.config.ts would show every replicated engine as drift.
189
+ const refusal = project.dialect === "clickhouse" ? declarativeTopologyRefusal(project, env.name) : undefined;
190
+ if (refusal)
191
+ throw refusal;
192
+ const versioned = hasMigrations(project);
193
+ const source = a.against ?? (versioned ? "history" : "src");
194
+ if (source === "history" && !versioned)
195
+ throw new YodelError(`--against history compares with the schema the newest applied migration records, and ${project.dir} has no migrations/ directory with a migration`);
196
+ // The forge first: a job missing its token fails before it reads the server.
197
+ const target = a.issue ? resolveForgeRepo(a.forge, process.env) : undefined;
198
+ const track = async (outcome) => {
199
+ if (!target)
200
+ return undefined;
201
+ const action = await trackDrift(issueClient(target), driftIssueMarker(await projectPath(project.dir), env.name), outcome);
202
+ io.err(`yodel drift: ${describeAction(action, target)}\n`);
203
+ return action;
204
+ };
205
+ let result;
206
+ let recorded;
207
+ try {
208
+ const server = await probeServer(project, env);
209
+ const pg = project.dialect === "postgres" ? await postgresLockSettings(project, env) : undefined;
210
+ const chantEnv = pg ? { env: { ...process.env, PGOPTIONS: lockTimeoutOptions(pg.lockTimeoutMs, process.env.PGOPTIONS) } } : {};
211
+ let against = { source: "src" };
212
+ if (source === "history") {
213
+ const newest = await recordedSchema(project, env);
214
+ against = { source: "history", migration: newest?.migration ?? null };
215
+ recorded = newest?.schema;
216
+ }
217
+ if (source === "history" && !recorded) {
218
+ // Nothing applied yet: the history records no schema, so nothing declared can have drifted from it.
219
+ result = { environment: env.name, changed: [], missing: [], unobserved: [] };
220
+ }
221
+ else if (recorded) {
222
+ const src = await writeRecordedSource(project.dir, recorded);
223
+ try {
224
+ result = await readDrift(project, env, { ...chantEnv, src: src.dir });
225
+ }
226
+ finally {
227
+ src.dispose();
228
+ }
229
+ }
230
+ else {
231
+ result = await readDrift(project, env, chantEnv);
232
+ }
233
+ result.against = against;
234
+ if (pg && result.unobserved.some((u) => isLockTimeout(u.detail) || isLockTimeout(u.reason)))
235
+ result.lockWait = await lockWait(pg);
236
+ const ofRecorded = recorded;
237
+ const build = ofRecorded ? () => Promise.resolve({ output: ofRecorded, dispose: () => undefined }) : () => buildSchema(project);
238
+ const columns = await declaredColumns(project, result, build).catch(() => ({}));
239
+ if (Object.keys(columns).length > 0)
240
+ result.columns = columns;
241
+ const code = driftExitCode(result);
242
+ const fingerprint = driftFingerprint(result);
243
+ const run = runUrl(process.env);
244
+ let action;
245
+ let issueError;
246
+ try {
247
+ action = await track(outcomeOf(result, code, renderDriftMarkdown(result, server, { fingerprint, ...(run ? { run } : {}) })));
248
+ }
249
+ catch (e) {
250
+ issueError = e instanceof Error ? e.message : String(e);
251
+ io.err(`yodel drift: the tracking issue could not be written: ${issueError}\n`);
252
+ }
253
+ const issueDoc = action && "issue" in action ? { action: action.action, number: action.issue.number, ...(action.issue.url ? { url: action.issue.url } : {}) } : action ? { action: action.action } : undefined;
254
+ if (a.json)
255
+ io.out(`${JSON.stringify({ ...result, dialect: project.dialect, ...(server ? { server } : {}), drifted: code === 2, fingerprint, ...(issueDoc ? { issue: issueDoc } : {}), ...(issueError ? { issueError } : {}) }, null, 2)}\n`);
256
+ else
257
+ io.out(renderDrift(result, server));
258
+ return issueError && code !== 2 ? 1 : code;
259
+ }
260
+ catch (e) {
261
+ // The drift could not be read: the tracking issue stays as it is.
262
+ await track({ kind: "unknown", why: `the drift could not be read (${e instanceof Error ? (e.message.split("\n")[0] ?? "") : String(e)})` }).catch(() => undefined);
263
+ throw e;
264
+ }
36
265
  }),
37
266
  };
38
267
  //# sourceMappingURL=drift.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE1E,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;CAe7B,CAAC;AAEF,yDAAyD;AACzD,MAAM,CAAC,MAAM,KAAK,GAAY;IAC5B,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,yEAAyE;IAClF,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAChB,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,IAAI;YAAE,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;;YAC1G,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;CACL,CAAC"}
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,11 @@
1
1
  import { apply } from "./apply.js";
2
+ import { approve } from "./approve.js";
2
3
  import { drift } from "./drift.js";
3
4
  import { init } from "./init.js";
4
5
  import { lint } from "./lint.js";
6
+ import { mcp } from "./mcp.js";
5
7
  import { newCommand } from "./new.js";
8
+ import { override } from "./override.js";
6
9
  import { plan } from "./plan.js";
7
10
  import { rebase } from "./rebase.js";
8
11
  import { repair } from "./repair.js";
@@ -12,11 +15,14 @@ export const commands = [
12
15
  init,
13
16
  plan,
14
17
  apply,
18
+ approve,
19
+ override,
15
20
  newCommand,
16
21
  lint,
17
22
  status,
18
23
  drift,
19
24
  rebase,
20
25
  repair,
26
+ mcp,
21
27
  ];
22
28
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,0DAA0D;AAC1D,MAAM,CAAC,MAAM,QAAQ,GAAuB;IAC1C,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,UAAU;IACV,IAAI;IACJ,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;CACP,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,0DAA0D;AAC1D,MAAM,CAAC,MAAM,QAAQ,GAAuB;IAC1C,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,OAAO;IACP,QAAQ;IACR,UAAU;IACV,IAAI;IACJ,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,GAAG;CACJ,CAAC"}
@@ -1,3 +1,6 @@
1
1
  import type { Command } from "../command.js";
2
+ import { type Adopted } from "../init/index.js";
3
+ /** `yodel init --json` (schemas/init.schema.json). */
4
+ export declare function initJson(a: Adopted): Record<string, unknown>;
2
5
  /** `yodel init --from <env>`; the exit codes are in `help`. */
3
6
  export declare const init: Command;
@@ -90,18 +90,22 @@ function parseInitArgs(args) {
90
90
  name,
91
91
  };
92
92
  }
93
+ /** `yodel init --json` (schemas/init.schema.json). */
94
+ export function initJson(a) {
95
+ return {
96
+ environment: a.environment,
97
+ dialect: a.dialect,
98
+ status: "adopted",
99
+ objects: a.objects,
100
+ schemaFiles: a.schemaFiles,
101
+ migration: { path: a.migrationPath, ...a.baseline },
102
+ recorded: { history: a.recorded.database, seq: a.recorded.row.seq, note: a.recorded.row.note, appliedBy: a.recorded.row.applied_by },
103
+ warnings: a.warnings,
104
+ };
105
+ }
93
106
  function report(io, json, a) {
94
107
  if (json) {
95
- io.out(`${JSON.stringify({
96
- environment: a.environment,
97
- dialect: a.dialect,
98
- status: "adopted",
99
- objects: a.objects,
100
- schemaFiles: a.schemaFiles,
101
- migration: { path: a.migrationPath, ...a.baseline },
102
- recorded: { history: a.recorded.database, seq: a.recorded.row.seq, note: a.recorded.row.note, appliedBy: a.recorded.row.applied_by },
103
- warnings: a.warnings,
104
- }, null, 2)}\n`);
108
+ io.out(`${JSON.stringify(initJson(a), null, 2)}\n`);
105
109
  return;
106
110
  }
107
111
  const lines = [
@@ -121,7 +125,7 @@ function report(io, json, a) {
121
125
  /** `yodel init --from <env>`; the exit codes are in `help`. */
122
126
  export const init = {
123
127
  name: "init",
124
- summary: "adopt a live database: its declarations, a baseline migration, recorded applied",
128
+ summary: "adopt a live database: declarations and a baseline recorded applied",
125
129
  implemented: true,
126
130
  run: (args, io) => guarded("init", io, args, help, async () => {
127
131
  const a = parseInitArgs(args);
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,aAAa,EAAgB,MAAM,kBAAkB,CAAC;AAEtE,MAAM,KAAK,GAAG,qFAAqF,CAAC;AAEpG,MAAM,IAAI,GAAG,GAAG,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4DAuCuC,aAAa;;;;;;;;;;;;;;CAcxE,CAAC;AAUF,SAAS,aAAa,CAAC,IAAc;IACnC,IAAI,MAAoC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI;YACJ,gBAAgB,EAAE,KAAK;YACvB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBACzB,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;gBACnC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aACzB;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAC1B,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE;QAAE,MAAM,IAAI,UAAU,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;IACtH,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC;IAC3E,WAAW,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,2CAA2C;IAC1E,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI,KAAK,IAAI;QAC1B,GAAG,EAAE,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QAChE,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,IAAI;QAC5B,IAAI;KACL,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,EAAM,EAAE,IAAa,EAAE,CAAU;IAC/C,IAAI,IAAI,EAAE,CAAC;QACT,EAAE,CAAC,GAAG,CACJ,GAAG,IAAI,CAAC,SAAS,CACf;YACE,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE;YACnD,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE;YACpI,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB,EACD,IAAI,EACJ,CAAC,CACF,IAAI,CACN,CAAC;QACF,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG;QACZ,WAAW,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,OAAO,MAAM,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;QACjH,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,EAAE;QACF,iBAAiB,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC3C,iBAAiB,CAAC,CAAC,aAAa,MAAM,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,GAAG;QACjJ,4BAA4B,CAAC,CAAC,QAAQ,CAAC,QAAQ,wDAAwD;QACvG,EAAE;QACF,cAAc,CAAC,CAAC,WAAW,sCAAsC,CAAC,CAAC,WAAW,8BAA8B;KAC7G,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACxD,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,MAAM,IAAI,GAAY;IAC3B,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,iFAAiF;IAC1F,WAAW,EAAE,IAAI;IACjB,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAChB,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/G,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;CACL,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { inspect, migrationsDir, openVersioned } from "../versioned/index.js";
6
6
  import { LINT_RULES, lintExitCode, lintJson, lintMigrations, lintSettings, renderLint, updateChecksum } from "../lint/index.js";
7
7
  import { projectRules, REPLAY_RULE, replayRule } from "../lint/project-rules.js";
8
8
  import { renderReplay, replayHistory, replayJson } from "../replay/index.js";
9
- const usage = "usage: yodel lint [--env <env>] [--replay <env> [--reset] [--keep]] [--json] [--dir <project>] [--update-checksum <id>]... [--rules]";
9
+ const usage = "usage: yodel lint [--env <env>] [--replay <env> [--reset] [--reset-shared <profile>]... [--keep]] [--json] [--dir <project>] [--update-checksum <id>]... [--rules]";
10
10
  const help = `${usage}
11
11
 
12
12
  Checks the migrations directory against every lint rule, offline: no server
@@ -62,6 +62,11 @@ Options:
62
62
  --reset with --replay: drop those databases or schemas
63
63
  first when they exist. Destructive: never against a
64
64
  server whose data matters
65
+ --reset-shared <profile>
66
+ with --replay: replay even though <profile> binds
67
+ the same server and names one of those databases or
68
+ schemas, which the replay then empties (repeatable).
69
+ Refused without it, --reset or not
65
70
  --keep with --replay: leave the replayed database in place
66
71
  --rules list the rules and their levels, and exit
67
72
  --json print the findings as JSON
@@ -71,7 +76,8 @@ Exit codes:
71
76
  0 no errors (warnings and silenced findings do not fail)
72
77
  3 at least one error (a replay that differs counts)
73
78
  4 --replay: the target already holds what the history names, and --reset
74
- was not given; nothing was run
79
+ was not given, or another profile binds the same server and names one
80
+ of them and --reset-shared does not name it; nothing was run
75
81
  1 lint could not run: a bad config, an unknown migration for
76
82
  --update-checksum, a server that does not answer (--env)
77
83
  `;
@@ -86,6 +92,7 @@ function parseLintArgs(args) {
86
92
  env: { type: "string" },
87
93
  replay: { type: "string" },
88
94
  reset: { type: "boolean" },
95
+ "reset-shared": { type: "string", multiple: true },
89
96
  keep: { type: "boolean" },
90
97
  json: { type: "boolean" },
91
98
  dir: { type: "string", short: "C" },
@@ -100,12 +107,14 @@ function parseLintArgs(args) {
100
107
  const v = parsed.values;
101
108
  const update = v["update-checksum"];
102
109
  const replay = typeof v.replay === "string" ? v.replay : undefined;
103
- if (replay === undefined && (v.reset === true || v.keep === true))
104
- throw new YodelError(`--reset and --keep go with --replay <env>\n${usage}`);
110
+ const resetShared = Array.isArray(v["reset-shared"]) ? v["reset-shared"].filter((r) => typeof r === "string") : [];
111
+ if (replay === undefined && (v.reset === true || v.keep === true || resetShared.length > 0))
112
+ throw new YodelError(`--reset, --reset-shared and --keep go with --replay <env>\n${usage}`);
105
113
  return {
106
114
  env: typeof v.env === "string" ? v.env : undefined,
107
115
  replay,
108
116
  reset: v.reset === true,
117
+ resetShared,
109
118
  keep: v.keep === true,
110
119
  json: v.json === true,
111
120
  dir: typeof v.dir === "string" ? v.dir : process.cwd(),
@@ -175,7 +184,7 @@ export const lint = {
175
184
  const env = resolveEnvironment(project, a.replay);
176
185
  if (scanMigrations(dir).ordered) {
177
186
  // A target that is not fresh throws here, exit 4, before anything is linted or run.
178
- replay = await replayHistory(project, env, { reset: a.reset, keep: a.keep, log: (l) => { io.err(`replay: ${l}\n`); } });
187
+ replay = await replayHistory(project, env, { reset: a.reset, resetShared: a.resetShared, keep: a.keep, log: (l) => { io.err(`replay: ${l}\n`); } });
179
188
  options.rules = [...projectRules, replayRule(replay)];
180
189
  }
181
190
  else {