@sentroy-co/client-sdk 2.6.4 → 2.9.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.
@@ -0,0 +1,331 @@
1
+ "use strict";
2
+ /**
3
+ * `sentroy env <subcommand>` — vault sync from a local .env file.
4
+ *
5
+ * The token's (project, environment) scope is implicit; the CLI never
6
+ * asks for either since it can't change them.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.cmdPush = cmdPush;
43
+ exports.cmdPull = cmdPull;
44
+ exports.cmdList = cmdList;
45
+ exports.cmdDiff = cmdDiff;
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const readline = __importStar(require("readline"));
49
+ const dotenv_1 = require("./dotenv");
50
+ const DEFAULT_FILE = ".env";
51
+ const DEFAULT_BASE_URL = "https://sentroy.com";
52
+ // ── ANSI helpers (no deps) ───────────────────────────────────────────────
53
+ const supportsColor = process.stdout.isTTY && process.env.TERM !== "dumb";
54
+ const c = {
55
+ bold: (s) => (supportsColor ? `\x1b[1m${s}\x1b[0m` : s),
56
+ dim: (s) => (supportsColor ? `\x1b[2m${s}\x1b[0m` : s),
57
+ red: (s) => (supportsColor ? `\x1b[31m${s}\x1b[0m` : s),
58
+ green: (s) => (supportsColor ? `\x1b[32m${s}\x1b[0m` : s),
59
+ yellow: (s) => (supportsColor ? `\x1b[33m${s}\x1b[0m` : s),
60
+ cyan: (s) => (supportsColor ? `\x1b[36m${s}\x1b[0m` : s),
61
+ magenta: (s) => (supportsColor ? `\x1b[35m${s}\x1b[0m` : s),
62
+ };
63
+ function fail(msg) {
64
+ process.stderr.write(`${c.red("✗")} ${msg}\n`);
65
+ process.exit(1);
66
+ }
67
+ function info(msg) {
68
+ process.stdout.write(`${c.cyan("→")} ${msg}\n`);
69
+ }
70
+ function ok(msg) {
71
+ process.stdout.write(`${c.green("✓")} ${msg}\n`);
72
+ }
73
+ function warn(msg) {
74
+ process.stdout.write(`${c.yellow("⚠")} ${msg}\n`);
75
+ }
76
+ function resolveSharedOpts(rest) {
77
+ const token = (typeof rest.token === "string" ? rest.token : null) ??
78
+ process.env.SENTROY_ENV_API_KEY ??
79
+ null;
80
+ if (!token) {
81
+ fail("no token. Pass --token=stk_env_... or set SENTROY_ENV_API_KEY in your environment.");
82
+ }
83
+ const baseUrl = (typeof rest.url === "string" ? rest.url : null) ??
84
+ process.env.SENTROY_ENV_API_URL ??
85
+ DEFAULT_BASE_URL;
86
+ return { token, baseUrl: baseUrl.replace(/\/+$/, "") };
87
+ }
88
+ async function http(shared, path, init) {
89
+ const res = await fetch(`${shared.baseUrl}${path}`, {
90
+ ...init,
91
+ headers: {
92
+ Authorization: `Bearer ${shared.token}`,
93
+ ...(init?.body ? { "Content-Type": "application/json" } : {}),
94
+ ...(init?.headers ?? {}),
95
+ },
96
+ });
97
+ const text = await res.text();
98
+ let body;
99
+ try {
100
+ body = text ? JSON.parse(text) : null;
101
+ }
102
+ catch {
103
+ body = text;
104
+ }
105
+ if (!res.ok) {
106
+ const errMsg = body && typeof body === "object" && "error" in body
107
+ ? String(body.error)
108
+ : `HTTP ${res.status}`;
109
+ throw new Error(`${path}: ${errMsg}`);
110
+ }
111
+ return body?.data;
112
+ }
113
+ function readFileOrFail(file) {
114
+ if (!fs.existsSync(file)) {
115
+ fail(`file not found: ${file}`);
116
+ }
117
+ return fs.readFileSync(file, "utf8");
118
+ }
119
+ function computeDiff(local, remote) {
120
+ const remoteByKey = new Map(remote.map((v) => [v.key, v]));
121
+ const added = [];
122
+ const updated = [];
123
+ const unchanged = [];
124
+ for (const e of local) {
125
+ const r = remoteByKey.get(e.key);
126
+ if (!r) {
127
+ added.push(e);
128
+ continue;
129
+ }
130
+ if (r.value !== e.value || r.public !== e.public) {
131
+ updated.push({ entry: e, remote: r });
132
+ }
133
+ else {
134
+ unchanged.push({ entry: e, remote: r });
135
+ }
136
+ }
137
+ const localKeys = new Set(local.map((e) => e.key));
138
+ const deleted = remote.filter((v) => !localKeys.has(v.key));
139
+ return { added, updated, unchanged, deleted };
140
+ }
141
+ function printDiff(diff, deleteMissing) {
142
+ for (const e of diff.added) {
143
+ process.stdout.write(` ${c.green("+")} ${e.key}\n`);
144
+ }
145
+ for (const u of diff.updated) {
146
+ process.stdout.write(` ${c.yellow("~")} ${u.entry.key}\n`);
147
+ }
148
+ if (deleteMissing) {
149
+ for (const d of diff.deleted) {
150
+ process.stdout.write(` ${c.red("-")} ${d.key}\n`);
151
+ }
152
+ }
153
+ else if (diff.deleted.length > 0) {
154
+ process.stdout.write(` ${c.dim(`(${diff.deleted.length} key(s) only in vault, kept — pass --delete-missing to remove)`)}\n`);
155
+ }
156
+ }
157
+ async function confirm(question) {
158
+ if (!process.stdin.isTTY)
159
+ return false;
160
+ const rl = readline.createInterface({
161
+ input: process.stdin,
162
+ output: process.stdout,
163
+ });
164
+ const answer = await new Promise((resolve) => {
165
+ rl.question(`${question} [y/N] `, (ans) => {
166
+ rl.close();
167
+ resolve(ans.trim().toLowerCase());
168
+ });
169
+ });
170
+ return answer === "y" || answer === "yes";
171
+ }
172
+ // ── push ─────────────────────────────────────────────────────────────────
173
+ async function cmdPush(args) {
174
+ const { positional, flags } = parseFlags(args);
175
+ const file = positional[0] ?? DEFAULT_FILE;
176
+ const dryRun = !!flags["dry-run"];
177
+ const deleteMissing = !!flags["delete-missing"];
178
+ const shared = resolveSharedOpts(flags);
179
+ const text = readFileOrFail(path.resolve(process.cwd(), file));
180
+ const parsed = (0, dotenv_1.parseDotenv)(text);
181
+ if (parsed.errors.length > 0) {
182
+ process.stderr.write(`${c.red("✗")} parse errors in ${file}:\n`);
183
+ for (const err of parsed.errors) {
184
+ process.stderr.write(` line ${err.line}: ${err.message}\n`);
185
+ }
186
+ process.exit(1);
187
+ }
188
+ info(`fetching current vault snapshot…`);
189
+ const remote = await http(shared, "/api/env-vault/fetch");
190
+ const diff = computeDiff(parsed.entries, remote.variables);
191
+ process.stdout.write(`\n${c.bold(remote.project)} ${c.dim("/")} ${c.magenta(remote.environment)} ${c.dim(`(${file} → ${shared.baseUrl})`)}\n`);
192
+ printDiff(diff, deleteMissing);
193
+ process.stdout.write(`\n ${c.dim("summary:")} ${diff.added.length} new · ${diff.updated.length} updated · ${diff.unchanged.length} unchanged${deleteMissing ? ` · ${diff.deleted.length} to delete` : ""}\n\n`);
194
+ if (diff.added.length === 0 &&
195
+ diff.updated.length === 0 &&
196
+ (!deleteMissing || diff.deleted.length === 0)) {
197
+ ok("nothing to push.");
198
+ return;
199
+ }
200
+ if (dryRun) {
201
+ info("dry run — no changes pushed.");
202
+ return;
203
+ }
204
+ if (deleteMissing && diff.deleted.length > 0) {
205
+ if (flags.yes) {
206
+ info(`--yes provided, skipping confirmation for ${diff.deleted.length} delete(s).`);
207
+ }
208
+ else if (!process.stdin.isTTY) {
209
+ fail(`refusing to delete ${diff.deleted.length} key(s) without --yes in a non-interactive shell.`);
210
+ }
211
+ else {
212
+ const proceed = await confirm(`${c.yellow("⚠")} this will delete ${diff.deleted.length} key(s) from the vault. continue?`);
213
+ if (!proceed) {
214
+ warn("aborted.");
215
+ return;
216
+ }
217
+ }
218
+ }
219
+ const result = await http(shared, "/api/env-vault/push", {
220
+ method: "POST",
221
+ body: JSON.stringify({
222
+ entries: parsed.entries.map((e) => ({
223
+ key: e.key,
224
+ value: e.value,
225
+ public: e.public,
226
+ description: e.description,
227
+ })),
228
+ deleteMissing,
229
+ }),
230
+ });
231
+ ok(`${result.added} added · ${result.updated} updated · ${result.unchanged} unchanged · ${result.deleted} deleted`);
232
+ }
233
+ // ── pull ─────────────────────────────────────────────────────────────────
234
+ async function cmdPull(args) {
235
+ const { positional, flags } = parseFlags(args);
236
+ const file = positional[0] ?? DEFAULT_FILE;
237
+ const force = !!flags.force;
238
+ const shared = resolveSharedOpts(flags);
239
+ const target = path.resolve(process.cwd(), file);
240
+ if (fs.existsSync(target) && !force) {
241
+ fail(`${file} already exists. Pass --force to overwrite.`);
242
+ }
243
+ info(`fetching from ${shared.baseUrl}…`);
244
+ const remote = await http(shared, "/api/env-vault/fetch");
245
+ const entries = remote.variables.map((v) => ({
246
+ key: v.key,
247
+ value: v.value,
248
+ public: v.public,
249
+ description: null,
250
+ }));
251
+ const text = (0, dotenv_1.serializeDotenv)(entries);
252
+ fs.writeFileSync(target, text, "utf8");
253
+ ok(`wrote ${entries.length} variable(s) to ${file} (${remote.project}/${remote.environment})`);
254
+ }
255
+ // ── list ─────────────────────────────────────────────────────────────────
256
+ async function cmdList(args) {
257
+ const { flags } = parseFlags(args);
258
+ const showValues = !!flags.values;
259
+ const publicOnly = !!flags["public-only"];
260
+ const shared = resolveSharedOpts(flags);
261
+ const endpoint = publicOnly ? "/api/env-vault/public" : "/api/env-vault/fetch";
262
+ const remote = await http(shared, endpoint);
263
+ process.stdout.write(`${c.bold(remote.project)} ${c.dim("/")} ${c.magenta(remote.environment)} ${c.dim(`(${remote.variables.length} variable(s))`)}\n`);
264
+ for (const v of remote.variables) {
265
+ const tag = v.public ? c.dim(" [public]") : "";
266
+ if (showValues) {
267
+ process.stdout.write(` ${c.cyan(v.key)}=${v.value}${tag}\n`);
268
+ }
269
+ else {
270
+ process.stdout.write(` ${c.cyan(v.key)}${tag}\n`);
271
+ }
272
+ }
273
+ }
274
+ // ── diff ─────────────────────────────────────────────────────────────────
275
+ async function cmdDiff(args) {
276
+ const { positional, flags } = parseFlags(args);
277
+ const file = positional[0] ?? DEFAULT_FILE;
278
+ const deleteMissing = !!flags["delete-missing"];
279
+ const shared = resolveSharedOpts(flags);
280
+ const text = readFileOrFail(path.resolve(process.cwd(), file));
281
+ const parsed = (0, dotenv_1.parseDotenv)(text);
282
+ if (parsed.errors.length > 0) {
283
+ process.stderr.write(`${c.red("✗")} parse errors in ${file}:\n`);
284
+ for (const err of parsed.errors) {
285
+ process.stderr.write(` line ${err.line}: ${err.message}\n`);
286
+ }
287
+ process.exit(1);
288
+ }
289
+ const remote = await http(shared, "/api/env-vault/fetch");
290
+ const diff = computeDiff(parsed.entries, remote.variables);
291
+ process.stdout.write(`${c.bold(remote.project)} ${c.dim("/")} ${c.magenta(remote.environment)} ${c.dim(`(${file} vs vault)`)}\n`);
292
+ printDiff(diff, deleteMissing);
293
+ process.stdout.write(`\n ${c.dim("summary:")} ${diff.added.length} new · ${diff.updated.length} updated · ${diff.unchanged.length} unchanged · ${diff.deleted.length} only in vault\n`);
294
+ }
295
+ /**
296
+ * Flags that take a value as a separate token (`--flag value`). All other
297
+ * `--flag` tokens are booleans. The `--flag=value` form always works
298
+ * regardless of this list. Keeping this explicit avoids the classic argv
299
+ * bug where `--dry-run /path/to/file` swallows the positional.
300
+ */
301
+ const VALUE_FLAGS = new Set(["token", "url"]);
302
+ function parseFlags(args) {
303
+ const positional = [];
304
+ const flags = {};
305
+ for (let i = 0; i < args.length; i++) {
306
+ const a = args[i];
307
+ if (!a.startsWith("--")) {
308
+ positional.push(a);
309
+ continue;
310
+ }
311
+ const body = a.slice(2);
312
+ const eq = body.indexOf("=");
313
+ if (eq >= 0) {
314
+ flags[body.slice(0, eq)] = body.slice(eq + 1);
315
+ continue;
316
+ }
317
+ if (VALUE_FLAGS.has(body)) {
318
+ const next = args[i + 1];
319
+ if (next === undefined || next.startsWith("--")) {
320
+ fail(`flag --${body} requires a value (use --${body}=value or --${body} value)`);
321
+ }
322
+ flags[body] = next;
323
+ i++;
324
+ }
325
+ else {
326
+ flags[body] = true;
327
+ }
328
+ }
329
+ return { positional, flags };
330
+ }
331
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgMH,0BAgFC;AAID,0BAwBC;AAID,0BAmBC;AAID,0BAyBC;AA9VD,uCAAwB;AACxB,2CAA4B;AAC5B,mDAAoC;AACpC,qCAIiB;AAEjB,MAAM,YAAY,GAAG,MAAM,CAAA;AAC3B,MAAM,gBAAgB,GAAG,qBAAqB,CAAA;AA8B9C,4EAA4E;AAC5E,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAA;AACzE,MAAM,CAAC,GAAG;IACR,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;CACpE,CAAA;AAED,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;AACjD,CAAC;AAED,SAAS,EAAE,CAAC,GAAW;IACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;AAClD,CAAC;AAED,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;AACnD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAsC;IAC/D,MAAM,KAAK,GACT,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,mBAAmB;QAC/B,IAAI,CAAA;IACN,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CACF,oFAAoF,CACrF,CAAA;IACH,CAAC;IACD,MAAM,OAAO,GACX,CAAC,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,mBAAmB;QAC/B,gBAAgB,CAAA;IAClB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAA;AACxD,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,MAAkB,EAClB,IAAY,EACZ,IAAkB;IAElB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;QAClD,GAAG,IAAI;QACP,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;YACvC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;SACzB;KACF,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;IAC7B,IAAI,IAAa,CAAA;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,MAAM,GACV,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI;YACjD,CAAC,CAAC,MAAM,CAAE,IAA2B,CAAC,KAAK,CAAC;YAC5C,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAA;QAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,MAAM,EAAE,CAAC,CAAA;IACvC,CAAC;IACD,OAAQ,IAAqB,EAAE,IAAS,CAAA;AAC1C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAA;IACjC,CAAC;IACD,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACtC,CAAC;AASD,SAAS,WAAW,CAClB,KAAoB,EACpB,MAAwB;IAExB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1D,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,OAAO,GAAoB,EAAE,CAAA;IACnC,MAAM,SAAS,GAAsB,EAAE,CAAA;IACvC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAChC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACb,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;QACvC,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;QACzC,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAA;AAC/C,CAAC;AAED,SAAS,SAAS,CAAC,IAAU,EAAE,aAAsB;IACnD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACtD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;IAC7D,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,gEAAgE,CAAC,IAAI,CACxG,CAAA;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,QAAgB;IACrC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACtC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACnD,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YACxC,EAAE,CAAC,KAAK,EAAE,CAAA;YACV,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,OAAO,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK,CAAA;AAC3C,CAAC;AAED,4EAA4E;AAErE,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,YAAY,CAAA;IAC1C,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IACjC,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;IAC/C,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAEvC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAA;IAC9D,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAA;IAChC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAoB,IAAI,KAAK,CAAC,CAAA;QAChE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,CAAA;QAChE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,CAAC,kCAAkC,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAgB,MAAM,EAAE,sBAAsB,CAAC,CAAA;IACxE,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;IAE1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CACjF,IAAI,IAAI,MAAM,MAAM,CAAC,OAAO,GAAG,CAChC,IAAI,CACN,CAAA;IACD,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,UAAU,IAAI,CAAC,OAAO,CAAC,MAAM,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,aAC3G,aAAa,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,EAC1D,MAAM,CACP,CAAA;IAED,IACE,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QACzB,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAC7C,CAAC;QACD,EAAE,CAAC,kBAAkB,CAAC,CAAA;QACtB,OAAM;IACR,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,8BAA8B,CAAC,CAAA;QACpC,OAAM;IACR,CAAC;IAED,IAAI,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,6CAA6C,IAAI,CAAC,OAAO,CAAC,MAAM,aAAa,CAAC,CAAA;QACrF,CAAC;aAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CACF,sBAAsB,IAAI,CAAC,OAAO,CAAC,MAAM,mDAAmD,CAC7F,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,MAAM,OAAO,CAC3B,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,OAAO,CAAC,MAAM,mCAAmC,CAC5F,CAAA;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,IAAI,CAAC,UAAU,CAAC,CAAA;gBAChB,OAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAe,MAAM,EAAE,qBAAqB,EAAE;QACrE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClC,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC;YACH,aAAa;SACd,CAAC;KACH,CAAC,CAAA;IACF,EAAE,CACA,GAAG,MAAM,CAAC,KAAK,YAAY,MAAM,CAAC,OAAO,cAAc,MAAM,CAAC,SAAS,gBAAgB,MAAM,CAAC,OAAO,UAAU,CAChH,CAAA;AACH,CAAC;AAED,4EAA4E;AAErE,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,YAAY,CAAA;IAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA;IAC3B,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAEvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAA;IAChD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,IAAI,6CAA6C,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,CAAC,iBAAiB,MAAM,CAAC,OAAO,GAAG,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAgB,MAAM,EAAE,sBAAsB,CAAC,CAAA;IACxE,MAAM,OAAO,GAAkB,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC,CAAA;IACH,MAAM,IAAI,GAAG,IAAA,wBAAe,EAAC,OAAO,CAAC,CAAA;IACrC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACtC,EAAE,CACA,SAAS,OAAO,CAAC,MAAM,mBAAmB,IAAI,KAAK,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,WAAW,GAAG,CAC3F,CAAA;AACH,CAAC;AAED,4EAA4E;AAErE,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAClC,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA;IACjC,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAEvC,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,sBAAsB,CAAA;IAC9E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAgB,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,eAAe,CAAC,IAAI,CAClI,CAAA;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC9C,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,CAAA;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;AACH,CAAC;AAED,4EAA4E;AAErE,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,YAAY,CAAA;IAC1C,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAA;IAC/C,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAEvC,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC,CAAA;IAC9D,MAAM,MAAM,GAAG,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAA;IAChC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAoB,IAAI,KAAK,CAAC,CAAA;QAChE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,CAAA;QAChE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAgB,MAAM,EAAE,sBAAsB,CAAC,CAAA;IACxE,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;IAE1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,CAC5G,CAAA;IACD,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,UAAU,IAAI,CAAC,OAAO,CAAC,MAAM,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,gBAAgB,IAAI,CAAC,OAAO,CAAC,MAAM,kBAAkB,CACnK,CAAA;AACH,CAAC;AASD;;;;;GAKG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;AAE7C,SAAS,UAAU,CAAC,IAAc;IAChC,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,KAAK,GAAqC,EAAE,CAAA;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAClB,SAAQ;QACV,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;YAC7C,SAAQ;QACV,CAAC;QACD,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;YACxB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,UAAU,IAAI,4BAA4B,IAAI,eAAe,IAAI,SAAS,CAAC,CAAA;YAClF,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;YAClB,CAAC,EAAE,CAAA;QACL,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;QACpB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAA;AAC9B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `sentroy` — CLI entry point.
3
+ *
4
+ * Subcommand router with no third-party deps. Today only `env` exists;
5
+ * future subcommands (`mail`, `media`, etc.) hook in here.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * `sentroy` — CLI entry point.
4
+ *
5
+ * Subcommand router with no third-party deps. Today only `env` exists;
6
+ * future subcommands (`mail`, `media`, etc.) hook in here.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const env_1 = require("./env");
10
+ const VERSION = "__VERSION__"; // replaced at runtime via package.json read
11
+ const ENV_SUBCOMMANDS = {
12
+ push: {
13
+ description: "Push a local .env file to the vault (full sync if --delete-missing)",
14
+ handler: env_1.cmdPush,
15
+ },
16
+ pull: {
17
+ description: "Fetch the vault scope and write to a local .env file",
18
+ handler: env_1.cmdPull,
19
+ },
20
+ list: {
21
+ description: "Print every key in the vault scope (--values to include values, --public-only)",
22
+ handler: env_1.cmdList,
23
+ },
24
+ diff: {
25
+ description: "Show what would change if you pushed the local .env file",
26
+ handler: env_1.cmdDiff,
27
+ },
28
+ };
29
+ function readPackageVersion() {
30
+ if (VERSION !== "__VERSION__")
31
+ return VERSION;
32
+ // Walk up from this file: dist/cli/index.js → dist/cli → dist → package.
33
+ try {
34
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
35
+ const { version } = require("../../package.json");
36
+ return version;
37
+ }
38
+ catch {
39
+ return "unknown";
40
+ }
41
+ }
42
+ function showHelp() {
43
+ const v = readPackageVersion();
44
+ process.stdout.write(`\nsentroy ${v} — Sentroy CLI\n\n` +
45
+ `USAGE\n` +
46
+ ` sentroy <command> [args] [flags]\n\n` +
47
+ `COMMANDS\n` +
48
+ ` env push [<file>] ${ENV_SUBCOMMANDS.push.description}\n` +
49
+ ` env pull [<file>] ${ENV_SUBCOMMANDS.pull.description}\n` +
50
+ ` env list ${ENV_SUBCOMMANDS.list.description}\n` +
51
+ ` env diff [<file>] ${ENV_SUBCOMMANDS.diff.description}\n\n` +
52
+ `GLOBAL FLAGS\n` +
53
+ ` --token=stk_env_... Vault token (default: $SENTROY_ENV_API_KEY)\n` +
54
+ ` --url=https://... Sentroy core URL (default: $SENTROY_ENV_API_URL or https://sentroy.com)\n\n` +
55
+ `ENV PUSH FLAGS\n` +
56
+ ` --delete-missing Remove vault keys not present in the local file (full sync)\n` +
57
+ ` --dry-run Print the diff but do not write\n` +
58
+ ` --yes Skip the delete-confirmation prompt (CI-friendly)\n\n` +
59
+ `ENV PULL FLAGS\n` +
60
+ ` --force Overwrite the file if it already exists\n\n` +
61
+ `ENV LIST FLAGS\n` +
62
+ ` --values Include values (default: keys only)\n` +
63
+ ` --public-only Only variables marked public\n\n` +
64
+ `EXAMPLES\n` +
65
+ ` sentroy env push .env.production --delete-missing\n` +
66
+ ` sentroy env pull .env --force\n` +
67
+ ` sentroy env diff .env.production --delete-missing\n` +
68
+ ` sentroy env list --values --public-only\n\n` +
69
+ `Token scope (project + environment) is implicit — generate one in the\n` +
70
+ `Sentroy vault dashboard.\n\n`);
71
+ }
72
+ async function main() {
73
+ const argv = process.argv.slice(2);
74
+ if (argv.length === 0 ||
75
+ argv[0] === "-h" ||
76
+ argv[0] === "--help" ||
77
+ argv[0] === "help") {
78
+ showHelp();
79
+ return;
80
+ }
81
+ if (argv[0] === "-v" || argv[0] === "--version") {
82
+ process.stdout.write(`${readPackageVersion()}\n`);
83
+ return;
84
+ }
85
+ const cmd = argv[0];
86
+ if (cmd === "env") {
87
+ const sub = argv[1];
88
+ const handler = sub ? ENV_SUBCOMMANDS[sub] : undefined;
89
+ if (!handler) {
90
+ process.stderr.write(`unknown env subcommand: ${sub ?? "<missing>"}\n` +
91
+ `available: ${Object.keys(ENV_SUBCOMMANDS).join(", ")}\n`);
92
+ process.exit(1);
93
+ }
94
+ await handler.handler(argv.slice(2));
95
+ return;
96
+ }
97
+ process.stderr.write(`unknown command: ${cmd}\nrun \`sentroy --help\` for usage.\n`);
98
+ process.exit(1);
99
+ }
100
+ main().catch((err) => {
101
+ const msg = err instanceof Error ? err.message : String(err);
102
+ process.stderr.write(`\n\x1b[31m✗\x1b[0m ${msg}\n`);
103
+ process.exit(1);
104
+ });
105
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * `@sentroy-co/client-sdk/vault` — Sentroy Env Vault server-side client.
3
+ *
4
+ * Bootstrap pattern:
5
+ * `SENTROY_ENV_API_KEY` (process.env) → tek dış env. Fonksiyonlar
6
+ * `getEnv("KEY")` ya da `getEnvOrThrow("KEY")` çağrılırken in-memory
7
+ * cache'den döner; ilk çağrıda Sentroy core'a HTTP fetch yapar ve
8
+ * o token scope'undaki TÜM env'leri (public + private) çeker.
9
+ *
10
+ * Cache stratejisi:
11
+ * • Default TTL 5 dk; refresh deadline aşıldığında bir sonraki
12
+ * `getEnv` çağrısında re-fetch tetiklenir.
13
+ * • `await refreshEnvCache()` manuel invalidation — webhook ya da
14
+ * SIGHUP-style restart sinyaline bağlanabilir.
15
+ * • `setEnvCacheTTL(seconds)` runtime'da TTL değiştirme.
16
+ *
17
+ * Hata politikası: bootstrap fail (token yok / network down / 401)
18
+ * → `getEnv` her çağrıda undefined döner; `getEnvOrThrow` exception
19
+ * atar. Process startup'ında `await preloadEnv()` çağırırsanız
20
+ * eksik env'leri erkenden yakalarsınız.
21
+ *
22
+ * **NOT**: Bu modül `Sentroy` ana client'ından (mail/storage REST
23
+ * resource'ları) bağımsızdır. Vault token'ları (stk_env_*) ile mail/
24
+ * storage token'ları (stk_*) farklı namespace'tedir; tek client'ta
25
+ * birleştirmek ergonomiyi bozardı.
26
+ */
27
+ export interface EnvVariable {
28
+ key: string;
29
+ value: string;
30
+ type: string;
31
+ public: boolean;
32
+ }
33
+ export interface EnvCacheState {
34
+ fetchedAt: number;
35
+ variables: Map<string, EnvVariable>;
36
+ project: string;
37
+ environment: string;
38
+ }
39
+ interface ClientOptions {
40
+ /** Sentroy core URL (defaults to env or https://sentroy.com). */
41
+ baseUrl?: string;
42
+ /** API key — defaults to `process.env.SENTROY_ENV_API_KEY`. */
43
+ apiKey?: string;
44
+ /** Cache TTL in seconds; default 300. */
45
+ ttlSeconds?: number;
46
+ /** Fetch timeout in ms; default 5000. */
47
+ timeoutMs?: number;
48
+ }
49
+ /**
50
+ * One-time client config — Sentroy app'lerinde modül seviyesinde çağrılır,
51
+ * default'lara güvenilirse hiç çağrılmasına gerek yok.
52
+ */
53
+ export declare function configureEnvClient(options?: ClientOptions): void;
54
+ /** TTL'i runtime'da değiştir (örn. development için kısa, prod için uzun). */
55
+ export declare function setEnvCacheTTL(seconds: number): void;
56
+ /** Cache'i invalidate et — webhook ya da admin-driven manual refresh için. */
57
+ export declare function refreshEnvCache(): Promise<void>;
58
+ /** Process start'ında erkenden tetikle — eksik env'i fail-fast yakalar. */
59
+ export declare function preloadEnv(): Promise<void>;
60
+ /**
61
+ * Async — env yoksa undefined. Bu fonksiyon TÜM env'leri (server+public)
62
+ * gizler, çünkü `process.env` fallback yok; sadece vault'ta kayıtlı
63
+ * olanlar dönder. Token bootstrap fail ederse exception atar.
64
+ */
65
+ export declare function getEnv(key: string): Promise<string | undefined>;
66
+ /** Eksik env'i hemen patlatır — config-validation pattern'inde kullanışlı. */
67
+ export declare function getEnvOrThrow(key: string): Promise<string>;
68
+ /** Tüm env'leri map olarak döner (dump için kullanışlı). */
69
+ export declare function getAllEnvs(): Promise<Record<string, string>>;
70
+ /** Sadece public (`public: true`) env'ler — SSR helper için. */
71
+ export declare function getPublicEnvs(): Promise<Record<string, string>>;
72
+ export {};
73
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vault/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;CACpB;AAKD,UAAU,aAAa;IACrB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAcD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,aAAkB,GAAG,IAAI,CAYpE;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,8EAA8E;AAC9E,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAGrD;AAED,2EAA2E;AAC3E,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhD;AA6DD;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAGrE;AAED,8EAA8E;AAC9E,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQhE;AAED,4DAA4D;AAC5D,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAKlE;AAED,gEAAgE;AAChE,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAOrE"}