@oktis-works/cms 0.1.13 → 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 (65) hide show
  1. package/dist/assets.d.ts +94 -0
  2. package/dist/assets.d.ts.map +1 -0
  3. package/dist/assets.js +671 -0
  4. package/dist/assets.js.map +1 -0
  5. package/dist/bluegreen.d.ts +121 -0
  6. package/dist/bluegreen.d.ts.map +1 -0
  7. package/dist/bluegreen.js +393 -0
  8. package/dist/bluegreen.js.map +1 -0
  9. package/dist/commands.d.ts +6 -0
  10. package/dist/commands.d.ts.map +1 -1
  11. package/dist/commands.js +116 -61
  12. package/dist/commands.js.map +1 -1
  13. package/dist/config-wizard.d.ts +39 -0
  14. package/dist/config-wizard.d.ts.map +1 -0
  15. package/dist/config-wizard.js +308 -0
  16. package/dist/config-wizard.js.map +1 -0
  17. package/dist/docker.d.ts +148 -0
  18. package/dist/docker.d.ts.map +1 -0
  19. package/dist/docker.js +324 -0
  20. package/dist/docker.js.map +1 -0
  21. package/dist/doctor.d.ts +2 -0
  22. package/dist/doctor.d.ts.map +1 -1
  23. package/dist/doctor.js +51 -0
  24. package/dist/doctor.js.map +1 -1
  25. package/dist/env-file.d.ts +45 -0
  26. package/dist/env-file.d.ts.map +1 -0
  27. package/dist/env-file.js +200 -0
  28. package/dist/env-file.js.map +1 -0
  29. package/dist/env-schema.d.ts +28 -0
  30. package/dist/env-schema.d.ts.map +1 -0
  31. package/dist/env-schema.js +497 -0
  32. package/dist/env-schema.js.map +1 -0
  33. package/dist/guards.d.ts +40 -0
  34. package/dist/guards.d.ts.map +1 -0
  35. package/dist/guards.js +159 -0
  36. package/dist/guards.js.map +1 -0
  37. package/dist/parser.d.ts.map +1 -1
  38. package/dist/parser.js +12 -3
  39. package/dist/parser.js.map +1 -1
  40. package/dist/project-config.js +2 -2
  41. package/dist/prompt.d.ts +81 -0
  42. package/dist/prompt.d.ts.map +1 -0
  43. package/dist/prompt.js +379 -0
  44. package/dist/prompt.js.map +1 -0
  45. package/dist/redeploy.d.ts +109 -0
  46. package/dist/redeploy.d.ts.map +1 -0
  47. package/dist/redeploy.js +363 -0
  48. package/dist/redeploy.js.map +1 -0
  49. package/dist/scaffold-docs.d.ts +25 -6
  50. package/dist/scaffold-docs.d.ts.map +1 -1
  51. package/dist/scaffold-docs.js +711 -33
  52. package/dist/scaffold-docs.js.map +1 -1
  53. package/dist/scaffold.d.ts +17 -1
  54. package/dist/scaffold.d.ts.map +1 -1
  55. package/dist/scaffold.js +77 -14
  56. package/dist/scaffold.js.map +1 -1
  57. package/dist/theme-build.d.ts +35 -0
  58. package/dist/theme-build.d.ts.map +1 -0
  59. package/dist/theme-build.js +86 -0
  60. package/dist/theme-build.js.map +1 -0
  61. package/dist/update.d.ts +51 -0
  62. package/dist/update.d.ts.map +1 -0
  63. package/dist/update.js +210 -0
  64. package/dist/update.js.map +1 -0
  65. package/package.json +7 -7
@@ -0,0 +1,308 @@
1
+ // @oktis-works/cms - Wizard `okcms config` (F1)
2
+ //
3
+ // Três modos, todos sobre o MESMO catálogo (`env-schema.ts`):
4
+ // · TTY → wizard seção por seção, com máscara de segredo;
5
+ // · --set K=V → aplicação pontual validada (CI/scriptIdor);
6
+ // · --list → leitura segura (segredos mascarados por padrão).
7
+ //
8
+ // O `.env` é editado in-place pelo `EnvFile`: comentários, seções e ordem do
9
+ // arquivo do operador sobrevivem ao wizard. Nada é gravado sem confirmação
10
+ // explícita — Ctrl+C no meio descarta.
11
+ import { existsSync, readFileSync } from 'node:fs';
12
+ import { join, relative } from 'node:path';
13
+ import { EnvFile, loadEnvFile } from './env-file.js';
14
+ import { ENV_FIELDS, ENV_SECTIONS, fieldsForSection, sectionById, validateField, } from './env-schema.js';
15
+ import { Prompt, style, symbol } from './prompt.js';
16
+ import { assertHostOnly, generateSecret, looksLikeSecret, redact } from './guards.js';
17
+ /** `••••` — nunca o valor real na tela. */
18
+ export function maskValue(value) {
19
+ if (!value)
20
+ return '(não definido)';
21
+ const width = Math.min(Math.max(value.length, 4), 12);
22
+ return '•'.repeat(width);
23
+ }
24
+ /** Valor "apresentável": segredo mascarado, o resto cru. */
25
+ export function displayValue(field, value) {
26
+ if (!value)
27
+ return '(vazio)';
28
+ if (field?.type === 'secret')
29
+ return maskValue(value);
30
+ return value;
31
+ }
32
+ /** `A=1\nB=2` → pares validos, descartando lixo. */
33
+ export function parseSetArgs(raw) {
34
+ if (!raw)
35
+ return [];
36
+ return raw
37
+ .split('\n')
38
+ .map((entry) => entry.trim())
39
+ .filter((entry) => entry.length > 0 && entry.includes('='));
40
+ }
41
+ function fieldByKey(key) {
42
+ return ENV_FIELDS.find((field) => field.key === key);
43
+ }
44
+ /**
45
+ * Valida TODOS os pares antes de aplicar QUALQUER UM — meio gravado com a
46
+ * outra metade inválida deixa o `.env` num estado que ninguém quer.
47
+ */
48
+ export function planSet(pairs) {
49
+ const plan = [];
50
+ const errors = [];
51
+ for (const pair of pairs) {
52
+ const index = pair.indexOf('=');
53
+ const key = pair.slice(0, index).trim();
54
+ const value = pair.slice(index + 1);
55
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
56
+ errors.push(`chave inválida: "${key}"`);
57
+ continue;
58
+ }
59
+ const field = fieldByKey(key);
60
+ if (!field) {
61
+ errors.push(`chave desconhecida: ${key} — não consta do catálogo do OkCMS. ` +
62
+ `Use \`okcms config --list\` para ver as suportadas.`);
63
+ continue;
64
+ }
65
+ const problem = validateField(field, value);
66
+ if (problem) {
67
+ errors.push(`${key}: ${problem}`);
68
+ continue;
69
+ }
70
+ plan.push({ key, value, field });
71
+ }
72
+ return { plan, errors };
73
+ }
74
+ function loadEnv(cwd) {
75
+ const path = join(cwd, '.env');
76
+ if (existsSync(path))
77
+ return { env: loadEnvFile(path), seeded: false, path };
78
+ // Sem .env: semeia a partir do exemplo para o wizard ter o que mostrar —
79
+ // mas NÃO grava até o operador confirmar.
80
+ const examplePath = join(cwd, '.env.example');
81
+ const seed = existsSync(examplePath) ? readFileSync(examplePath, 'utf-8') : '';
82
+ return { env: new EnvFile(seed, path), seeded: true, path };
83
+ }
84
+ function printList(env, showSecrets) {
85
+ for (const section of ENV_SECTIONS) {
86
+ const fields = fieldsForSection(section.id, env.toRecord());
87
+ if (fields.length === 0)
88
+ continue;
89
+ console.log(`\n# ${section.title} — ${section.hint}`);
90
+ for (const field of fields) {
91
+ const raw = env.get(field.key) ?? '';
92
+ // segredo só sai cru com --show-secrets explícito
93
+ const shown = field.type === 'secret' && !showSecrets ? maskValue(raw) : raw;
94
+ console.log(`${field.key}=${shown}`);
95
+ }
96
+ }
97
+ }
98
+ export async function runConfigWizard(opts = {}) {
99
+ const cwd = opts.cwd ?? process.cwd();
100
+ // 1. A CLI só configura o host — dentro de um container ela exporia o .env.
101
+ const guard = assertHostOnly('okcms config', { force: opts.force });
102
+ if (!guard.ok) {
103
+ console.error(guard.message);
104
+ return 1;
105
+ }
106
+ const { env, seeded, path } = loadEnv(cwd);
107
+ const relPath = relative(cwd, path) || '.env';
108
+ // 2. --set: aplicação pontual validada (fluxo de CI)
109
+ const pairs = parseSetArgs(opts.set);
110
+ if (pairs.length > 0) {
111
+ const { plan, errors } = planSet(pairs);
112
+ if (errors.length > 0) {
113
+ for (const error of errors)
114
+ console.error(`✗ ${error}`);
115
+ return 1;
116
+ }
117
+ const changed = [];
118
+ for (const entry of plan) {
119
+ const before = env.get(entry.key) ?? '';
120
+ if (before === entry.value)
121
+ continue;
122
+ env.set(entry.key, entry.value);
123
+ changed.push(entry.key);
124
+ }
125
+ if (changed.length === 0) {
126
+ console.log('✓ nada a alterar — os valores já estavam assim.');
127
+ return 0;
128
+ }
129
+ env.save(path);
130
+ console.log(`✓ ${changed.length} chave(s) gravada(s) em ${relPath} (permissão 600):`);
131
+ for (const key of changed) {
132
+ const field = fieldByKey(key);
133
+ const now = env.get(key) ?? '';
134
+ // segredo nunca aparece em log — só "definido"
135
+ const after = field?.type === 'secret' ? maskValue(now) : now;
136
+ console.log(` ${symbol.arrow} ${key}=${redact(after)}`);
137
+ }
138
+ return 0;
139
+ }
140
+ // 3. --list / --non-interactive: leitura de máquina. `--non-interactive`
141
+ // sozinho também cai aqui — sem TTY não há wizard para navegar.
142
+ if (opts.list || opts.nonInteractive) {
143
+ printList(env, opts.showSecrets === true);
144
+ return 0;
145
+ }
146
+ // 4. Sem TTY e sem flag → não há como "navegar"; diz o que fazer.
147
+ const prompt = opts.prompt ?? new Prompt(opts.io);
148
+ if (!opts.prompt && !prompt.interactive && !opts.nonInteractive) {
149
+ prompt.close();
150
+ console.error('okcms config: sem terminal — use uma das opções:');
151
+ console.error(' okcms config --list lista as chaves (segredos mascarados)');
152
+ console.error(' okcms config --set CHAVE=valor altera e valida uma chave');
153
+ console.error(' okcms config --non-interactive mesma saída de --list (CI)');
154
+ return 1;
155
+ }
156
+ return runInteractive(prompt, env, { path, relPath, seeded, section: opts.section });
157
+ }
158
+ async function runInteractive(prompt, env, ctx) {
159
+ const changed = new Set();
160
+ let cancelled = false;
161
+ const onInterrupt = () => {
162
+ cancelled = true;
163
+ prompt.write(`\n ${style.yellow(symbol.warn)} cancelado — nada foi gravado.\n`);
164
+ process.exit(130);
165
+ };
166
+ process.once('SIGINT', onInterrupt);
167
+ try {
168
+ prompt.heading(`OkCMS config — ${ctx.relPath}`);
169
+ prompt.info(`${env.keys().length} chave(s) no arquivo`);
170
+ if (ctx.seeded) {
171
+ prompt.warn('.env não existia — wizard parte do .env.example; nada gravado ainda');
172
+ }
173
+ prompt.info('Enter mantém o valor atual · Ctrl+C descarta tudo');
174
+ const record = () => {
175
+ const out = env.toRecord();
176
+ for (const key of changed)
177
+ out[key] = env.get(key) ?? '';
178
+ return out;
179
+ };
180
+ const sectionIds = ENV_SECTIONS.map((section) => section.id);
181
+ let target = ctx.section;
182
+ // --section pula o menu principal (scriptável mesmo com TTY)
183
+ if (target && !sectionIds.includes(target)) {
184
+ prompt.error(`seção desconhecida: ${target} — use uma de: ${sectionIds.join(', ')}`);
185
+ prompt.close();
186
+ return 1;
187
+ }
188
+ for (;;) {
189
+ if (cancelled)
190
+ return 130;
191
+ if (!target) {
192
+ const choices = ENV_SECTIONS.map((section) => ({
193
+ value: section.id,
194
+ label: section.title,
195
+ hint: `${section.hint} · ${fieldsForSection(section.id, record()).length} campos`,
196
+ }));
197
+ choices.push({
198
+ value: '__show',
199
+ label: 'Resumo das alterações',
200
+ hint: changed.size > 0 ? `${changed.size} pendente(s)` : 'nenhuma',
201
+ });
202
+ choices.push({ value: '__quit', label: 'Sair', hint: 'confirma gravação' });
203
+ const picked = await prompt.select('Seção', choices);
204
+ if (picked === '__show') {
205
+ printSummary(prompt, env, changed);
206
+ continue;
207
+ }
208
+ if (picked === '__quit')
209
+ break;
210
+ target = picked;
211
+ }
212
+ await runSection(prompt, env, target, record, changed);
213
+ target = undefined;
214
+ const more = await prompt.confirm('Editar outra seção?', { defaultValue: false });
215
+ if (!more)
216
+ break;
217
+ }
218
+ if (changed.size === 0) {
219
+ prompt.info('nenhuma alteração — arquivo intacto.');
220
+ return 0;
221
+ }
222
+ const ok = await prompt.confirm(`Gravar ${changed.size} alteração(ões) em ${ctx.relPath}?`, { defaultValue: true });
223
+ if (!ok) {
224
+ prompt.warn('descartado — nada foi gravado.');
225
+ return 0;
226
+ }
227
+ env.save(ctx.path);
228
+ prompt.success(`${changed.size} chave(s) gravada(s) — permissão 600`);
229
+ prompt.info('reinicie os apps para as mudanças valerem (okcms start / restart dos containers)');
230
+ return 0;
231
+ }
232
+ finally {
233
+ process.removeListener('SIGINT', onInterrupt);
234
+ prompt.close();
235
+ }
236
+ }
237
+ function printSummary(prompt, env, changed) {
238
+ prompt.heading('Resumo');
239
+ if (changed.size === 0) {
240
+ prompt.info('nenhuma alteração pendente');
241
+ return;
242
+ }
243
+ for (const key of changed) {
244
+ const field = fieldByKey(key);
245
+ const value = env.get(key) ?? '';
246
+ const shown = field?.type === 'secret' ? maskValue(value) : value;
247
+ prompt.write(` ${style.cyan(symbol.arrow)} ${key}=${shown}\n`);
248
+ }
249
+ }
250
+ async function runSection(prompt, env, sectionId, record, changed) {
251
+ const section = sectionById(sectionId);
252
+ if (!section)
253
+ return;
254
+ const fields = fieldsForSection(sectionId, record());
255
+ prompt.heading(`${section.title} — ${section.hint}`);
256
+ if (fields.length === 0) {
257
+ prompt.info('nenhum campo aplicável no momento');
258
+ return;
259
+ }
260
+ for (const field of fields) {
261
+ const current = env.get(field.key) ?? '';
262
+ // JWT_SECRET fraco/ausente: oferece um gerado em vez de deixar escolha ruim
263
+ if (field.key === 'JWT_SECRET' && !looksLikeSecret(current)) {
264
+ const generate = await prompt.confirm('JWT_SECRET ausente/placeholder — gerar um forte?', {
265
+ defaultValue: true,
266
+ });
267
+ if (generate) {
268
+ const secret = generateSecret(32);
269
+ env.set(field.key, secret);
270
+ changed.add(field.key);
271
+ prompt.success('JWT_SECRET gerado (48 hex, 32 bytes)');
272
+ continue;
273
+ }
274
+ }
275
+ prompt.write(` ${style.dim(`${symbol.bullet} ${field.description}`)}\n`);
276
+ let value;
277
+ if (field.type === 'secret') {
278
+ value = await prompt.secret(field.label, {
279
+ default: current,
280
+ placeholder: current ? maskValue(current) : '(não definido)',
281
+ validate: (candidate) => validateField(field, candidate),
282
+ });
283
+ }
284
+ else {
285
+ const fallback = current || field.default || '';
286
+ value = await prompt.ask(field.label, {
287
+ default: fallback,
288
+ placeholder: current ? current : field.default ? `${field.default} (default)` : undefined,
289
+ validate: (candidate) => validateField(field, candidate),
290
+ });
291
+ }
292
+ if (value !== current) {
293
+ // Aceitar o default de uma chave ausente NÃO materializa a chave: o
294
+ // aplicativo já aplica esse default, e gravar tudo a cada Enter enchi o
295
+ // .env de ruído. Só persiste mudança explícita.
296
+ const acceptedDefault = current === '' && value === (field.default ?? '');
297
+ if (acceptedDefault) {
298
+ prompt.info(`${field.key} não definida — vale o default ${value}`);
299
+ continue;
300
+ }
301
+ env.set(field.key, value);
302
+ changed.add(field.key);
303
+ const shown = field.type === 'secret' ? maskValue(value) : value;
304
+ prompt.success(`${field.key} → ${shown}`);
305
+ }
306
+ }
307
+ }
308
+ //# sourceMappingURL=config-wizard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-wizard.js","sourceRoot":"","sources":["../src/config-wizard.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,EAAE;AACF,8DAA8D;AAC9D,uEAAuE;AACvE,mEAAmE;AACnE,wEAAwE;AACxE,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,uCAAuC;AAEvC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EACL,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,aAAa,GAEd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAkBtF,2CAA2C;AAC3C,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,gBAAgB,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtD,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,YAAY,CAAC,KAA2B,EAAE,KAAa;IACrE,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,KAAK,EAAE,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,YAAY,CAAC,GAAuB;IAClD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO,GAAG;SACP,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AACvD,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,KAAe;IACrC,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAEpC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,oBAAoB,GAAG,GAAG,CAAC,CAAC;YACxC,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CACT,uBAAuB,GAAG,sCAAsC;gBAC9D,qDAAqD,CACxD,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,OAAO,EAAE,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC;AAED,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC/B,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAE7E,yEAAyE;IACzE,0CAA0C;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO,EAAE,GAAG,EAAE,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,SAAS,CAAC,GAAY,EAAE,WAAoB;IACnD,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAElC,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACrC,kDAAkD;YAClD,MAAM,KAAK,GACT,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA4B,EAAE;IAClE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAEtC,4EAA4E;IAC5E,MAAM,KAAK,GAAG,cAAc,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC;IAE9C,qDAAqD;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,MAAM,KAAK,IAAI,MAAM;gBAAE,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,MAAM,KAAK,KAAK,CAAC,KAAK;gBAAE,SAAS;YACrC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,CAAC,CAAC;QACX,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,2BAA2B,OAAO,mBAAmB,CAAC,CAAC;QACtF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC/B,+CAA+C;YAC/C,MAAM,KAAK,GAAG,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,IAAI,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,yEAAyE;IACzE,mEAAmE;IACnE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACrC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,kEAAkE;IAClE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAChE,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QAClE,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC1F,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/E,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AACvF,CAAC;AASD,KAAK,UAAU,cAAc,CAC3B,MAAc,EACd,GAAY,EACZ,GAAmB;IAEnB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,SAAS,GAAG,IAAI,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,sBAAsB,CAAC,CAAC;QACxD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QAEjE,MAAM,MAAM,GAAG,GAA2B,EAAE;YAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC3B,KAAK,MAAM,GAAG,IAAI,OAAO;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACzD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7D,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;QAEzB,6DAA6D;QAC7D,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,uBAAuB,MAAM,kBAAkB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrF,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,CAAC;QACX,CAAC;QAED,SAAS,CAAC;YACR,IAAI,SAAS;gBAAE,OAAO,GAAG,CAAC;YAE1B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBAC7C,KAAK,EAAE,OAAO,CAAC,EAAE;oBACjB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,MAAM,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,SAAS;iBAClF,CAAC,CAAC,CAAC;gBACJ,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,QAAQ;oBACf,KAAK,EAAE,uBAAuB;oBAC9B,IAAI,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,SAAS;iBACnE,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;gBAE5E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACrD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACxB,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;oBACnC,SAAS;gBACX,CAAC;gBACD,IAAI,MAAM,KAAK,QAAQ;oBAAE,MAAM;gBAC/B,MAAM,GAAG,MAAM,CAAC;YAClB,CAAC;YAED,MAAM,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,GAAG,SAAS,CAAC;YAEnB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;YAClF,IAAI,CAAC,IAAI;gBAAE,MAAM;QACnB,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAC7B,UAAU,OAAO,CAAC,IAAI,sBAAsB,GAAG,CAAC,OAAO,GAAG,EAC1D,EAAE,YAAY,EAAE,IAAI,EAAE,CACvB,CAAC;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO,CAAC,CAAC;QACX,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,sCAAsC,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;QAChG,OAAO,CAAC,CAAC;IACX,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,MAAc,EAAE,GAAY,EAAE,OAAoB;IACtE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzB,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,MAAc,EACd,GAAY,EACZ,SAAiB,EACjB,MAAoC,EACpC,OAAoB;IAEpB,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,KAAK,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAErD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAEzC,4EAA4E;QAC5E,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,kDAAkD,EAAE;gBACxF,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;YACH,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;gBAClC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACvB,MAAM,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;gBACvD,SAAS;YACX,CAAC;QACH,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;QAE1E,IAAI,KAAa,CAAC;QAClB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,KAAK,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;gBACvC,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB;gBAC5D,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC;aACzD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC;YAChD,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE;gBACpC,OAAO,EAAE,QAAQ;gBACjB,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,SAAS;gBACzF,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC;aACzD,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,oEAAoE;YACpE,wEAAwE;YACxE,gDAAgD;YAChD,MAAM,eAAe,GAAG,OAAO,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC1E,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,kCAAkC,KAAK,EAAE,CAAC,CAAC;gBACnE,SAAS;YACX,CAAC;YAED,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACjE,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,148 @@
1
+ import { type Lane } from './assets.js';
2
+ export interface RunOptions {
3
+ cwd?: string;
4
+ env?: NodeJS.ProcessEnv;
5
+ timeoutMs?: number;
6
+ /** Ecoa stdout/stderr no terminal — para passos longos (build/up). */
7
+ inherit?: boolean;
8
+ }
9
+ export interface RunResult {
10
+ ok: boolean;
11
+ code: number | null;
12
+ stdout: string;
13
+ stderr: string;
14
+ /** Comando montado, para asserções de teste e para o log do wizard. */
15
+ command: string;
16
+ }
17
+ export type Runner = (command: string, args: string[], opts?: RunOptions) => RunResult;
18
+ export declare const defaultRunner: Runner;
19
+ /** Comando que falhou por timeout (o spawnSync devolve error, não mensagem legível). */
20
+ export declare function failure(command: string, args: string[], reason: string): RunResult;
21
+ export declare function dockerAvailable(runner?: Runner): boolean;
22
+ export interface ComposeProbe {
23
+ ok: boolean;
24
+ /** Versão curta (ex.: `5.6.0`), vazia quando não há compose. */
25
+ version: string;
26
+ }
27
+ /**
28
+ * `docker compose` (v2, plugin) — o `docker-compose` legado (v1, Python) não
29
+ * é suportado: os arquivos usam `x-` extensions, `name:` e healthcheck
30
+ * `condition`, que só o v2 entende.
31
+ */
32
+ export declare function composeAvailable(runner?: Runner): ComposeProbe;
33
+ export type ServiceRole = 'edge' | 'worker' | 'data' | 'proxy' | 'unknown';
34
+ export interface ComposeServiceInfo {
35
+ /** Nome da chave em `services:`. */
36
+ name: string;
37
+ containerName: string;
38
+ role: ServiceRole;
39
+ lane: Lane | null;
40
+ }
41
+ /**
42
+ * Parser por indentação — não um YAML completo.
43
+ *
44
+ * O compose que a CLI lê é gerada por ela mesma; um parser de verdade
45
+ * (js-yaml) seria uma dependência nova num pacote que hoje não tem nenhuma,
46
+ * para extrair três campos. A restrição (chave em `services:` com indent 2,
47
+ * campos com indent maior) é verificada pelos testes contra o arquivo real.
48
+ */
49
+ export declare function parseComposeServices(yaml: string): ComposeServiceInfo[];
50
+ export declare function classifyServices(services: ComposeServiceInfo[], lane: Lane): {
51
+ edge: ComposeServiceInfo[];
52
+ worker: ComposeServiceInfo[];
53
+ untouched: ComposeServiceInfo[];
54
+ };
55
+ export declare const INFRA_PROJECT = "okcms";
56
+ export declare const infraProject: () => string;
57
+ export declare const laneProject: (lane: Lane) => string;
58
+ export declare const otherLane: (lane: Lane) => Lane;
59
+ export declare const COMPOSE_INFRA_FILE = "docker-compose.infra.yml";
60
+ export declare const COMPOSE_DEPLOY_FILE = "docker-compose.deploy.yml";
61
+ export interface ComposeCall {
62
+ project?: string;
63
+ file?: string;
64
+ args: string[];
65
+ inherit?: boolean;
66
+ timeoutMs?: number;
67
+ }
68
+ /** `docker compose -p <projeto> -f <arquivo> ...` — a única forma montada aqui. */
69
+ export declare function composeArgs(call: ComposeCall): string[];
70
+ export declare function runCompose(cwd: string, call: ComposeCall, runner?: Runner): RunResult;
71
+ export declare const infraCompose: (cwd: string, args: string[], runner?: Runner, inherit?: boolean) => RunResult;
72
+ export declare const laneCompose: (cwd: string, lane: Lane, args: string[], runner?: Runner, inherit?: boolean) => RunResult;
73
+ /**
74
+ * `okcms-net` é declarada como `external: true` no compose das lanes — se ela
75
+ * não existir, o `up` falha com um erro obscuro. Criar antes torna o fluxo
76
+ * independente da ordem em que o operador rodou a infra.
77
+ */
78
+ export declare function ensureNetwork(cwd: string, runner?: Runner): RunResult;
79
+ export declare const LANE_STATE_PATH = ".deploy/state.json";
80
+ export interface LaneEntry {
81
+ lane: Lane;
82
+ version: string;
83
+ at: string;
84
+ }
85
+ export interface LaneState {
86
+ /** Lane que está no ar agora (donadora do tráfego). */
87
+ lane: Lane;
88
+ /** Lane anterior — é para cá que um rollback volta. */
89
+ previousLane: Lane | null;
90
+ version: string;
91
+ at: string;
92
+ history: LaneEntry[];
93
+ }
94
+ export declare function readLaneState(cwd: string): LaneState | null;
95
+ export declare function writeLaneState(cwd: string, state: LaneState): void;
96
+ export declare function pushLaneState(previous: LaneState | null, lane: Lane, version: string): LaneState;
97
+ /**
98
+ * Containers de uma lane com `okcms.role=edge` em execução.
99
+ * Usado quando não há `.deploy/state.json` (primeira execução / clone limpo).
100
+ */
101
+ export declare function edgeContainers(runner: Runner, lane: Lane): string[];
102
+ /** Estado do file é a fonte de verdade; o docker é o fallback. */
103
+ export declare function detectActiveLane(cwd: string, runner?: Runner): Lane | null;
104
+ export interface ContainerState {
105
+ exists: boolean;
106
+ running: boolean;
107
+ health: 'healthy' | 'unhealthy' | 'starting' | 'none' | null;
108
+ }
109
+ export declare const STOPPED: ContainerState;
110
+ export declare function inspectContainer(runner: Runner, name: string): ContainerState;
111
+ export interface WaitOptions {
112
+ timeoutMs?: number;
113
+ intervalMs?: number;
114
+ /** Chamado a cada rodada — é onde o wizard imprime a contagem. */
115
+ onTick?: (elapsedMs: number) => void;
116
+ }
117
+ /** Aguarda um predicado sobre o estado do container; false = timeout. */
118
+ export declare function waitForContainer(runner: Runner, name: string, predicate: (state: ContainerState) => boolean, opts?: WaitOptions): Promise<boolean>;
119
+ /** Container destruído ou sem healthcheck = "não está servindo". */
120
+ export declare const isServing: (state: ContainerState) => boolean;
121
+ /**
122
+ * Pronto para receber tráfego: rodando e (quando tem healthcheck) healthy.
123
+ * `none` = serviço sem healthcheck definido — não dá para esperar mais nada.
124
+ */
125
+ export declare const isHealthy: (state: ContainerState) => boolean;
126
+ export declare const isStopped: (state: ContainerState) => boolean;
127
+ /**
128
+ * Espera ativa: o processo saiu da lista (`docker ps` não o mostra mais).
129
+ * `docker stop` já bloqueia até o `stop_grace_period`, então isto é um
130
+ * cinto e suspensório para o caso de o dreno estourar o tempo.
131
+ */
132
+ export declare const waitStopped: (runner: Runner, name: string, opts?: WaitOptions) => Promise<boolean>;
133
+ export declare function upstreamsPath(cwd: string): string;
134
+ /** Grava os upstreams apontando para `lane` e devolve o texto. */
135
+ export declare function writeUpstreams(cwd: string, lane: Lane, record?: Record<string, string>): string;
136
+ /** Lane que os upstreams atuais apontam — usada em doctor/rollback. */
137
+ export declare function readUpstreamsLane(cwd: string): Lane | null;
138
+ export declare const PROXY_CONTAINER = "okcms-proxy";
139
+ export declare function proxyRunning(runner?: Runner): boolean;
140
+ /**
141
+ * `nginx -s reload` é o coração do swap: re-lê a configuração nova com as
142
+ * conexões existentes vivas. Nunca `restart` — isso derrubaria o proxy (e o
143
+ * TLS/rotas junto) no meio do deploy.
144
+ */
145
+ export declare function reloadProxy(cwd: string, runner?: Runner): RunResult;
146
+ /** Sobrescrita total da config do proxy (só quando `reload` falha). */
147
+ export declare function restartProxy(cwd: string, runner?: Runner): RunResult;
148
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"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"}