directus-deploy-cli 0.1.0 → 0.3.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.
- package/dist/cli.js +44 -2
- package/dist/cli.js.map +1 -1
- package/dist/reconcilers/migrations.js +190 -78
- package/dist/reconcilers/migrations.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -95,7 +95,7 @@ const program = new Command();
|
|
|
95
95
|
program
|
|
96
96
|
.name("directus-deploy")
|
|
97
97
|
.description("Reconcile a Directus environment to the state described in directus_config/snapshot/. Per-entity, non-atomic.")
|
|
98
|
-
.version("0.
|
|
98
|
+
.version("0.3.0");
|
|
99
99
|
function attachCommon(cmd) {
|
|
100
100
|
return cmd
|
|
101
101
|
.option("--url <url>", "Directus base URL (env: DIRECTUS_URL)")
|
|
@@ -107,7 +107,7 @@ function attachCommon(cmd) {
|
|
|
107
107
|
.option("--config-dir <path>", "path to directus_config/collections (holds policies.json, permissions.json, roles.json, …)", "./directus_config/collections")
|
|
108
108
|
.option("--register-dir <path>", "path to migrations/register", "./migrations/register")
|
|
109
109
|
.option("--seed-dir <path>", "path to directus_config/seed (Tractr-style {collection, meta, data} files)", "./directus_config/seed")
|
|
110
|
-
.option("--migrations-dir <path>", "path to migrations/*.sql (raw SQL, tracked in
|
|
110
|
+
.option("--migrations-dir <path>", "path to migrations/*.sql (raw SQL, tracked in _directus_deploy_migrations)", "./migrations")
|
|
111
111
|
.option("--json", "emit JSON report instead of human-readable");
|
|
112
112
|
}
|
|
113
113
|
attachCommon(program.command("plan"))
|
|
@@ -125,6 +125,48 @@ attachCommon(program.command("verify"))
|
|
|
125
125
|
.action(async (_, cmd) => {
|
|
126
126
|
process.exit(await execute({ dryRun: true, strict: true }, cmd.optsWithGlobals()));
|
|
127
127
|
});
|
|
128
|
+
// migrations adopt: bootstrap the tracker on an env whose migrations were
|
|
129
|
+
// applied via some prior mechanism. Inserts (filename, sha256) rows without
|
|
130
|
+
// executing any SQL. Idempotent — re-adopting is a no-op when hashes match.
|
|
131
|
+
const migrationsGroup = program
|
|
132
|
+
.command("migrations")
|
|
133
|
+
.description("migration-specific commands");
|
|
134
|
+
migrationsGroup
|
|
135
|
+
.command("adopt")
|
|
136
|
+
.description("Insert current migrations/*.sql into the tracker WITHOUT running them. Use once per env when cutting over from a prior deploy mechanism.")
|
|
137
|
+
.option("--url <url>", "Directus base URL (env: DIRECTUS_URL)")
|
|
138
|
+
.option("--token <token>", "Directus admin token (env: DIRECTUS_TOKEN)")
|
|
139
|
+
.option("--target <label>", "friendly label for logs (default: URL hostname)")
|
|
140
|
+
.option("--migrations-dir <path>", "path to migrations/*.sql", "./migrations")
|
|
141
|
+
.option("--dry-run", "report what would be adopted, don't write")
|
|
142
|
+
.option("--json", "emit JSON report instead of human-readable")
|
|
143
|
+
.action(async (opts) => {
|
|
144
|
+
const url = opts.url ?? process.env.DIRECTUS_URL;
|
|
145
|
+
const token = opts.token ?? process.env.DIRECTUS_TOKEN;
|
|
146
|
+
if (!url)
|
|
147
|
+
throw new Error("--url or DIRECTUS_URL required");
|
|
148
|
+
if (!token)
|
|
149
|
+
throw new Error("--token or DIRECTUS_TOKEN required");
|
|
150
|
+
const target = opts.target ?? new URL(url).hostname;
|
|
151
|
+
const client = createDirectusClient({ baseUrl: url, token });
|
|
152
|
+
const { adoptMigrations } = await import("./reconcilers/migrations.js");
|
|
153
|
+
const results = await adoptMigrations({
|
|
154
|
+
migrationsDir: opts.migrationsDir,
|
|
155
|
+
client,
|
|
156
|
+
opts: { dryRun: Boolean(opts.dryRun) },
|
|
157
|
+
});
|
|
158
|
+
const counts = { created: 0, updated: 0, unchanged: 0, skipped: 0, failed: 0 };
|
|
159
|
+
for (const r of results)
|
|
160
|
+
counts[r.action] += 1;
|
|
161
|
+
const report = { target, results, counts };
|
|
162
|
+
if (opts.json) {
|
|
163
|
+
process.stdout.write(formatJson(report) + "\n");
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
process.stdout.write(formatHuman(report) + "\n");
|
|
167
|
+
}
|
|
168
|
+
process.exit(counts.failed > 0 ? 1 : 0);
|
|
169
|
+
});
|
|
128
170
|
program.parseAsync(process.argv).catch((e) => {
|
|
129
171
|
process.stderr.write(`directus-deploy: ${e.message}\n`);
|
|
130
172
|
process.exit(2);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,34 @@
|
|
|
1
1
|
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
-
import {
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { join, extname } from "node:path";
|
|
3
4
|
import { splitSql } from "../sql.js";
|
|
4
|
-
//
|
|
5
|
-
// `lola_deploy_migrations` table on the target so we don't re-run history on
|
|
6
|
-
// every deploy (the backend's convention is that migrations are idempotent
|
|
7
|
-
// via `IF NOT EXISTS`, so re-running is safe, but pointless and slow).
|
|
5
|
+
// Migration reconciler with a content-hash tracker table.
|
|
8
6
|
//
|
|
9
|
-
//
|
|
10
|
-
// used for years. Not Postgres-agnostic, but nothing else in this repo is
|
|
11
|
-
// either (we're a Directus deploy tool). Callers on a fresh env need the
|
|
12
|
-
// endpoint deployed as an extension; we detect the 404 and skip cleanly.
|
|
7
|
+
// Tracker shape:
|
|
13
8
|
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
|
|
9
|
+
// CREATE TABLE _directus_deploy_migrations (
|
|
10
|
+
// filename TEXT PRIMARY KEY,
|
|
11
|
+
// sha256 TEXT NOT NULL,
|
|
12
|
+
// applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
13
|
+
// )
|
|
14
|
+
//
|
|
15
|
+
// Per-file classification:
|
|
16
|
+
//
|
|
17
|
+
// filename absent from tracker → NEW (apply, then insert)
|
|
18
|
+
// filename present, hash matches → UNCHANGED (skip execution)
|
|
19
|
+
// filename present, hash differs → MUTATED (fail hard, don't touch DB)
|
|
20
|
+
//
|
|
21
|
+
// Bootstrap (see adoptMigrations): a fresh env whose migrations were applied
|
|
22
|
+
// via some prior mechanism needs a one-shot import that inserts each file's
|
|
23
|
+
// (name, hash) WITHOUT running the SQL. Prevents duplicate application.
|
|
24
|
+
//
|
|
25
|
+
// Uses Directus's /raw-query/execute endpoint. A missing endpoint yields a
|
|
26
|
+
// clean skip rather than N confusing errors.
|
|
27
|
+
const TRACKER_TABLE = "_directus_deploy_migrations";
|
|
17
28
|
const CREATE_TRACKER = `
|
|
18
29
|
CREATE TABLE IF NOT EXISTS ${TRACKER_TABLE} (
|
|
19
30
|
filename TEXT PRIMARY KEY,
|
|
31
|
+
sha256 TEXT NOT NULL,
|
|
20
32
|
applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
21
33
|
);
|
|
22
34
|
`;
|
|
@@ -28,15 +40,44 @@ async function rawQuery(client, sql) {
|
|
|
28
40
|
return r;
|
|
29
41
|
}
|
|
30
42
|
catch (e) {
|
|
31
|
-
// 404 = extension not installed
|
|
32
43
|
const msg = e.message;
|
|
33
44
|
if (msg.includes(" 404 "))
|
|
34
45
|
return null;
|
|
35
46
|
throw e;
|
|
36
47
|
}
|
|
37
48
|
}
|
|
38
|
-
|
|
39
|
-
|
|
49
|
+
function stripLeadingComments(s) {
|
|
50
|
+
let i = 0;
|
|
51
|
+
while (true) {
|
|
52
|
+
while (i < s.length && /\s/.test(s[i]))
|
|
53
|
+
i += 1;
|
|
54
|
+
if (s[i] === "-" && s[i + 1] === "-") {
|
|
55
|
+
const nl = s.indexOf("\n", i);
|
|
56
|
+
if (nl === -1)
|
|
57
|
+
return "";
|
|
58
|
+
i = nl + 1;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (s[i] === "/" && s[i + 1] === "*") {
|
|
62
|
+
const end = s.indexOf("*/", i);
|
|
63
|
+
if (end === -1)
|
|
64
|
+
return "";
|
|
65
|
+
i = end + 2;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
return s.slice(i);
|
|
71
|
+
}
|
|
72
|
+
function sha256(s) {
|
|
73
|
+
return createHash("sha256").update(s).digest("hex");
|
|
74
|
+
}
|
|
75
|
+
async function ensureTracker(client) {
|
|
76
|
+
const r = await rawQuery(client, CREATE_TRACKER);
|
|
77
|
+
return !!r?.success && !!r?.results?.[0]?.success;
|
|
78
|
+
}
|
|
79
|
+
async function fetchTracker(client) {
|
|
80
|
+
const r = await rawQuery(client, `SELECT filename, sha256 FROM ${TRACKER_TABLE}`);
|
|
40
81
|
if (r === null)
|
|
41
82
|
return null;
|
|
42
83
|
if (!r.success)
|
|
@@ -44,19 +85,45 @@ async function fetchAppliedFilenames(client) {
|
|
|
44
85
|
const first = r.results?.[0];
|
|
45
86
|
if (!first?.success)
|
|
46
87
|
return null;
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
set
|
|
88
|
+
const map = new Map();
|
|
89
|
+
for (const row of first.data ?? []) {
|
|
90
|
+
if (row && typeof row === "object" && "filename" in row && "sha256" in row) {
|
|
91
|
+
const rr = row;
|
|
92
|
+
map.set(String(rr.filename), String(rr.sha256));
|
|
52
93
|
}
|
|
53
94
|
}
|
|
54
|
-
return
|
|
95
|
+
return map;
|
|
96
|
+
}
|
|
97
|
+
function sqlLiteral(s) {
|
|
98
|
+
return `'${s.replace(/'/g, "''")}'`;
|
|
99
|
+
}
|
|
100
|
+
async function insertTrackerRow(client, filename, hash) {
|
|
101
|
+
const r = await rawQuery(client, `INSERT INTO ${TRACKER_TABLE} (filename, sha256) VALUES (${sqlLiteral(filename)}, ${sqlLiteral(hash)}) ON CONFLICT (filename) DO NOTHING`);
|
|
102
|
+
const inner = r?.results?.[0];
|
|
103
|
+
if (!r?.success || !inner?.success) {
|
|
104
|
+
return { ok: false, reason: inner?.error ?? "tracker insert failed" };
|
|
105
|
+
}
|
|
106
|
+
return { ok: true };
|
|
107
|
+
}
|
|
108
|
+
async function readMigrationFiles(dir) {
|
|
109
|
+
let entries;
|
|
110
|
+
try {
|
|
111
|
+
entries = await readdir(dir);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
const names = entries.filter((f) => extname(f) === ".sql" && !f.startsWith("_")).sort();
|
|
117
|
+
const out = [];
|
|
118
|
+
for (const filename of names) {
|
|
119
|
+
const path = join(dir, filename);
|
|
120
|
+
const raw = await readFile(path, "utf8");
|
|
121
|
+
out.push({ filename, path, raw, hash: sha256(raw) });
|
|
122
|
+
}
|
|
123
|
+
return out;
|
|
55
124
|
}
|
|
56
125
|
export async function reconcileMigrations(input) {
|
|
57
126
|
const results = [];
|
|
58
|
-
// Probe for the endpoint. Failing here is not an error — a fresh env just
|
|
59
|
-
// hasn't installed the raw-query extension yet.
|
|
60
127
|
const probe = await rawQuery(input.client, "SELECT 1 AS ok");
|
|
61
128
|
if (probe === null) {
|
|
62
129
|
results.push({
|
|
@@ -67,20 +134,14 @@ export async function reconcileMigrations(input) {
|
|
|
67
134
|
});
|
|
68
135
|
return results;
|
|
69
136
|
}
|
|
70
|
-
|
|
71
|
-
try {
|
|
72
|
-
entries = await readdir(input.migrationsDir);
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
return results; // no migrations dir → nothing to apply
|
|
76
|
-
}
|
|
77
|
-
const files = entries.filter((f) => extname(f) === ".sql" && !f.startsWith("_")).sort();
|
|
137
|
+
const files = await readMigrationFiles(input.migrationsDir);
|
|
78
138
|
if (files.length === 0)
|
|
79
139
|
return results;
|
|
80
|
-
//
|
|
140
|
+
// Tracker create is a schema mutation → do it only outside dry-run. In
|
|
141
|
+
// dry-run, if the tracker is missing, treat everything as NEW (accurate).
|
|
81
142
|
if (!input.opts.dryRun) {
|
|
82
|
-
const
|
|
83
|
-
if (!
|
|
143
|
+
const ok = await ensureTracker(input.client);
|
|
144
|
+
if (!ok) {
|
|
84
145
|
results.push({
|
|
85
146
|
kind: "migrations",
|
|
86
147
|
label: `migrations/${TRACKER_TABLE}`,
|
|
@@ -90,51 +151,27 @@ export async function reconcileMigrations(input) {
|
|
|
90
151
|
return results;
|
|
91
152
|
}
|
|
92
153
|
}
|
|
93
|
-
const
|
|
94
|
-
for (const
|
|
95
|
-
const label = `migrations/${filename}`;
|
|
96
|
-
|
|
154
|
+
const tracker = (await fetchTracker(input.client)) ?? new Map();
|
|
155
|
+
for (const file of files) {
|
|
156
|
+
const label = `migrations/${file.filename}`;
|
|
157
|
+
const recordedHash = tracker.get(file.filename);
|
|
158
|
+
// UNCHANGED — already applied at this hash.
|
|
159
|
+
if (recordedHash === file.hash) {
|
|
97
160
|
results.push({ kind: "migrations", label, action: "unchanged" });
|
|
98
161
|
continue;
|
|
99
162
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
163
|
+
// MUTATED — recorded under a different hash. Never rewrite silently.
|
|
164
|
+
if (recordedHash !== undefined && recordedHash !== file.hash) {
|
|
165
|
+
results.push({
|
|
166
|
+
kind: "migrations",
|
|
167
|
+
label,
|
|
168
|
+
action: "failed",
|
|
169
|
+
reason: `content mismatch: tracker recorded sha256 ${recordedHash.slice(0, 12)}…, file now hashes to ${file.hash.slice(0, 12)}…. Migrations are immutable — add a new migration instead.`,
|
|
170
|
+
});
|
|
107
171
|
continue;
|
|
108
172
|
}
|
|
109
|
-
//
|
|
110
|
-
|
|
111
|
-
// that BEGIN with a comment but have real SQL after) stays.
|
|
112
|
-
const stripLeadingComments = (s) => {
|
|
113
|
-
let i = 0;
|
|
114
|
-
// repeat until no comments remain at the head
|
|
115
|
-
// eslint-disable-next-line no-constant-condition
|
|
116
|
-
while (true) {
|
|
117
|
-
while (i < s.length && /\s/.test(s[i]))
|
|
118
|
-
i += 1;
|
|
119
|
-
if (s[i] === "-" && s[i + 1] === "-") {
|
|
120
|
-
const nl = s.indexOf("\n", i);
|
|
121
|
-
if (nl === -1)
|
|
122
|
-
return "";
|
|
123
|
-
i = nl + 1;
|
|
124
|
-
continue;
|
|
125
|
-
}
|
|
126
|
-
if (s[i] === "/" && s[i + 1] === "*") {
|
|
127
|
-
const end = s.indexOf("*/", i);
|
|
128
|
-
if (end === -1)
|
|
129
|
-
return "";
|
|
130
|
-
i = end + 2;
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
break;
|
|
134
|
-
}
|
|
135
|
-
return s.slice(i);
|
|
136
|
-
};
|
|
137
|
-
const statements = splitSql(raw).filter((s) => {
|
|
173
|
+
// NEW.
|
|
174
|
+
const statements = splitSql(file.raw).filter((s) => {
|
|
138
175
|
const stripped = stripLeadingComments(s.trim()).trim();
|
|
139
176
|
return stripped.length > 0 && stripped !== ";";
|
|
140
177
|
});
|
|
@@ -151,7 +188,6 @@ export async function reconcileMigrations(input) {
|
|
|
151
188
|
});
|
|
152
189
|
continue;
|
|
153
190
|
}
|
|
154
|
-
// Apply. If any statement fails, report and stop (don't record as applied).
|
|
155
191
|
let failedReason = null;
|
|
156
192
|
for (const stmt of statements) {
|
|
157
193
|
const r = await rawQuery(input.client, stmt);
|
|
@@ -165,13 +201,13 @@ export async function reconcileMigrations(input) {
|
|
|
165
201
|
results.push({ kind: "migrations", label, action: "failed", reason: failedReason });
|
|
166
202
|
continue;
|
|
167
203
|
}
|
|
168
|
-
const
|
|
169
|
-
if (!
|
|
204
|
+
const rec = await insertTrackerRow(input.client, file.filename, file.hash);
|
|
205
|
+
if (!rec.ok) {
|
|
170
206
|
results.push({
|
|
171
207
|
kind: "migrations",
|
|
172
208
|
label,
|
|
173
209
|
action: "failed",
|
|
174
|
-
reason:
|
|
210
|
+
reason: `applied SQL but tracker insert failed: ${rec.reason}`,
|
|
175
211
|
});
|
|
176
212
|
continue;
|
|
177
213
|
}
|
|
@@ -179,4 +215,80 @@ export async function reconcileMigrations(input) {
|
|
|
179
215
|
}
|
|
180
216
|
return results;
|
|
181
217
|
}
|
|
218
|
+
// Bootstrap for envs whose migrations were applied via a prior mechanism.
|
|
219
|
+
// Inserts (filename, sha256) rows without executing any SQL. Idempotent:
|
|
220
|
+
// re-adopting is a no-op when hashes match. Fails on hash conflict, which
|
|
221
|
+
// tells the caller the file was edited since the target env applied it.
|
|
222
|
+
export async function adoptMigrations(input) {
|
|
223
|
+
const results = [];
|
|
224
|
+
const probe = await rawQuery(input.client, "SELECT 1 AS ok");
|
|
225
|
+
if (probe === null) {
|
|
226
|
+
results.push({
|
|
227
|
+
kind: "migrations",
|
|
228
|
+
label: "migrations",
|
|
229
|
+
action: "skipped",
|
|
230
|
+
reason: "/raw-query/execute not available on this target",
|
|
231
|
+
});
|
|
232
|
+
return results;
|
|
233
|
+
}
|
|
234
|
+
const files = await readMigrationFiles(input.migrationsDir);
|
|
235
|
+
if (files.length === 0)
|
|
236
|
+
return results;
|
|
237
|
+
if (!input.opts.dryRun) {
|
|
238
|
+
const ok = await ensureTracker(input.client);
|
|
239
|
+
if (!ok) {
|
|
240
|
+
results.push({
|
|
241
|
+
kind: "migrations",
|
|
242
|
+
label: `migrations/${TRACKER_TABLE}`,
|
|
243
|
+
action: "failed",
|
|
244
|
+
reason: "could not create tracker table",
|
|
245
|
+
});
|
|
246
|
+
return results;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
const tracker = (await fetchTracker(input.client)) ?? new Map();
|
|
250
|
+
for (const file of files) {
|
|
251
|
+
const label = `migrations/${file.filename}`;
|
|
252
|
+
const recordedHash = tracker.get(file.filename);
|
|
253
|
+
if (recordedHash === file.hash) {
|
|
254
|
+
results.push({ kind: "migrations", label, action: "unchanged" });
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
if (recordedHash !== undefined) {
|
|
258
|
+
results.push({
|
|
259
|
+
kind: "migrations",
|
|
260
|
+
label,
|
|
261
|
+
action: "failed",
|
|
262
|
+
reason: `already adopted with sha256 ${recordedHash.slice(0, 12)}…, refusing to overwrite with ${file.hash.slice(0, 12)}…`,
|
|
263
|
+
});
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
if (input.opts.dryRun) {
|
|
267
|
+
results.push({
|
|
268
|
+
kind: "migrations",
|
|
269
|
+
label,
|
|
270
|
+
action: "created",
|
|
271
|
+
reason: `would adopt (sha256 ${file.hash.slice(0, 12)}…)`,
|
|
272
|
+
});
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
const rec = await insertTrackerRow(input.client, file.filename, file.hash);
|
|
276
|
+
if (!rec.ok) {
|
|
277
|
+
results.push({
|
|
278
|
+
kind: "migrations",
|
|
279
|
+
label,
|
|
280
|
+
action: "failed",
|
|
281
|
+
reason: rec.reason,
|
|
282
|
+
});
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
results.push({
|
|
286
|
+
kind: "migrations",
|
|
287
|
+
label,
|
|
288
|
+
action: "created",
|
|
289
|
+
reason: `adopted (sha256 ${file.hash.slice(0, 12)}…)`,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
return results;
|
|
293
|
+
}
|
|
182
294
|
//# sourceMappingURL=migrations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/reconcilers/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/reconcilers/migrations.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "directus-deploy-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Per-entity, non-atomic Directus deployment tool. Reconciles collections/fields/relations/roles/policies/permissions/flows/operations/migrations/seeds from git to any environment.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|