@neetru/cli 2.12.6 → 2.12.8

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.
@@ -1,20 +1,41 @@
1
1
  import type { Command } from 'commander';
2
2
  type ActorType = 'agent_claude' | 'human' | 'cli';
3
+ export interface ChatChannelsOptions {
4
+ json?: boolean;
5
+ }
6
+ /**
7
+ * Lista os canais de chat abertos.
8
+ *
9
+ * integrationNeeded — registrar em `registerChatCommand`:
10
+ * ```ts
11
+ * chatCmd.command('channels').action(async (opts) => runChatChannels(opts));
12
+ * ```
13
+ */
14
+ export declare function runChatChannels(opts: ChatChannelsOptions): Promise<void>;
3
15
  export interface ChatSendOptions {
4
- product: string;
16
+ /** Canal de destino (novo — tem precedência sobre product). */
17
+ channel?: string;
18
+ /** Produto legado (mantido por retrocompat; ignorado quando channel está presente). */
19
+ product?: string;
5
20
  actorType?: ActorType;
6
21
  productId?: string;
7
22
  json?: boolean;
8
23
  }
9
24
  export declare function runChatSend(message: string, opts: ChatSendOptions): Promise<void>;
10
25
  export interface ChatHistoryOptions {
11
- product: string;
26
+ /** Canal de destino (novo — tem precedência sobre product). */
27
+ channel?: string;
28
+ /** Produto legado (mantido por retrocompat). */
29
+ product?: string;
12
30
  hours?: string;
13
31
  json?: boolean;
14
32
  }
15
33
  export declare function runChatHistory(opts: ChatHistoryOptions): Promise<void>;
16
34
  export interface ChatLoopOptions {
17
- product: string;
35
+ /** Canal de destino (novo — tem precedência sobre product). */
36
+ channel?: string;
37
+ /** Produto legado (retrocompat). */
38
+ product?: string;
18
39
  actorType?: ActorType;
19
40
  json?: boolean;
20
41
  }
@@ -22,6 +43,15 @@ export declare function runChatLoop(opts: ChatLoopOptions): Promise<void>;
22
43
  /**
23
44
  * Registra o comando `neetru chat` no programa Commander.
24
45
  *
46
+ * Subcomandos:
47
+ * neetru chat channels → lista canais abertos
48
+ * neetru chat send --channel <id> "msg" → envia mensagem num canal
49
+ * neetru chat send --product <slug> "msg" → legado (por produto)
50
+ * neetru chat history --channel <id> → histórico de canal
51
+ * neetru chat history --product <slug> → histórico legado
52
+ * neetru chat --channel <id> → loop interativo de canal
53
+ * neetru chat --product <slug> → loop interativo legado
54
+ *
25
55
  * integrationNeeded — adicionar em src/index.ts (ou onde os subcomandos
26
56
  * são registrados):
27
57
  * ```ts
@@ -55,9 +55,60 @@ function printMessage(msg) {
55
55
  console.log(` ${msg.body}`);
56
56
  console.log();
57
57
  }
58
+ function channelTypeLabel(type) {
59
+ if (type === 'global')
60
+ return chalk.cyan('global');
61
+ if (type === 'product')
62
+ return chalk.blue('produto');
63
+ return chalk.dim('custom');
64
+ }
65
+ function printChannel(ch) {
66
+ const tag = channelTypeLabel(ch.type);
67
+ const slug = ch.productSlug ? chalk.dim(` (${ch.productSlug})`) : '';
68
+ const lastMsg = ch.lastMessageAt
69
+ ? chalk.dim(` última msg: ${fmtTimestamp(ch.lastMessageAt)}`)
70
+ : '';
71
+ console.log(` ${chalk.bold(ch.name)}${slug} ${tag} ${chalk.dim(ch.id)}${lastMsg}`);
72
+ }
73
+ /**
74
+ * Lista os canais de chat abertos.
75
+ *
76
+ * integrationNeeded — registrar em `registerChatCommand`:
77
+ * ```ts
78
+ * chatCmd.command('channels').action(async (opts) => runChatChannels(opts));
79
+ * ```
80
+ */
81
+ export async function runChatChannels(opts) {
82
+ const token = await requireToken(opts.json);
83
+ const spinner = opts.json ? null : ora({ text: 'Buscando canais…', color: 'blue' }).start();
84
+ let res;
85
+ try {
86
+ res = await apiRequest('/api/cli/v1/chat/channels', { token });
87
+ spinner?.stop();
88
+ }
89
+ catch (error) {
90
+ spinner?.fail('Falha ao buscar canais.');
91
+ handleApiError(error, opts.json);
92
+ return;
93
+ }
94
+ if (opts.json) {
95
+ console.log(JSON.stringify(res));
96
+ return;
97
+ }
98
+ console.log(chalk.bold(`\nCanais abertos (${res.count})\n`));
99
+ if (res.count === 0) {
100
+ log.dim('Nenhum canal encontrado.');
101
+ return;
102
+ }
103
+ for (const ch of res.channels)
104
+ printChannel(ch);
105
+ console.log();
106
+ }
58
107
  export async function runChatSend(message, opts) {
59
- if (!opts.product) {
60
- log.error('--product <slug> é obrigatório.');
108
+ const channelId = opts.channel?.trim();
109
+ const productSlug = opts.product?.trim();
110
+ if (!channelId && !productSlug) {
111
+ log.error('Informe --channel <id> (canais) ou --product <slug> (legado).');
61
112
  safeExit(1);
62
113
  }
63
114
  if (!message || !message.trim()) {
@@ -68,23 +119,32 @@ export async function runChatSend(message, opts) {
68
119
  const spinner = opts.json
69
120
  ? null
70
121
  : ora({ text: 'Enviando mensagem…', color: 'blue' }).start();
122
+ // Monta o body: channelId tem precedência sobre productSlug (legado).
123
+ const body = {
124
+ message: message.trim(),
125
+ actorType: opts.actorType ?? 'cli',
126
+ };
127
+ if (channelId) {
128
+ body.channelId = channelId;
129
+ }
130
+ else {
131
+ body.productSlug = productSlug;
132
+ if (opts.productId)
133
+ body.productId = opts.productId;
134
+ }
71
135
  let res;
72
136
  try {
73
137
  res = await apiRequest('/api/cli/v1/chat', {
74
138
  method: 'POST',
75
139
  token,
76
- body: {
77
- productSlug: opts.product,
78
- message: message.trim(),
79
- actorType: opts.actorType ?? 'cli',
80
- ...(opts.productId ? { productId: opts.productId } : {}),
81
- },
140
+ body,
82
141
  });
83
142
  spinner?.stop();
84
143
  }
85
144
  catch (error) {
86
145
  spinner?.fail('Falha ao enviar mensagem.');
87
146
  handleApiError(error, opts.json);
147
+ return;
88
148
  }
89
149
  if (opts.json) {
90
150
  console.log(JSON.stringify(res));
@@ -93,16 +153,21 @@ export async function runChatSend(message, opts) {
93
153
  log.success(`Mensagem enviada (id: ${res.id}).`);
94
154
  }
95
155
  export async function runChatHistory(opts) {
96
- if (!opts.product) {
97
- log.error('--product <slug> é obrigatório.');
156
+ const channelId = opts.channel?.trim();
157
+ const productSlug = opts.product?.trim();
158
+ if (!channelId && !productSlug) {
159
+ log.error('Informe --channel <id> (canais) ou --product <slug> (legado).');
98
160
  safeExit(1);
99
161
  }
100
162
  const sinceHours = Math.min(Math.max(Number(opts.hours ?? '24'), 1), 24);
101
163
  const token = await requireToken(opts.json);
102
- const qs = new URLSearchParams({
103
- productSlug: opts.product,
104
- sinceHours: String(sinceHours),
105
- });
164
+ const qs = new URLSearchParams({ sinceHours: String(sinceHours) });
165
+ if (channelId) {
166
+ qs.set('channelId', channelId);
167
+ }
168
+ else {
169
+ qs.set('productSlug', productSlug);
170
+ }
106
171
  const spinner = opts.json ? null : ora({ text: 'Buscando histórico…', color: 'blue' }).start();
107
172
  let res;
108
173
  try {
@@ -112,12 +177,14 @@ export async function runChatHistory(opts) {
112
177
  catch (error) {
113
178
  spinner?.fail('Falha ao buscar histórico.');
114
179
  handleApiError(error, opts.json);
180
+ return;
115
181
  }
116
182
  if (opts.json) {
117
183
  console.log(JSON.stringify(res));
118
184
  return;
119
185
  }
120
- console.log(chalk.bold(`\nCanal dev ${opts.product} (últimas ${sinceHours}h · ${res.count} msg)\n`));
186
+ const label = channelId ? `canal ${channelId}` : `produto ${productSlug}`;
187
+ console.log(chalk.bold(`\nHistórico — ${label} (últimas ${sinceHours}h · ${res.count} msg)\n`));
121
188
  if (res.count === 0) {
122
189
  log.dim('Nenhuma mensagem no período.');
123
190
  return;
@@ -127,22 +194,31 @@ export async function runChatHistory(opts) {
127
194
  }
128
195
  }
129
196
  export async function runChatLoop(opts) {
130
- if (!opts.product) {
131
- log.error('--product <slug> é obrigatório.');
197
+ const channelId = opts.channel?.trim();
198
+ const productSlug = opts.product?.trim();
199
+ if (!channelId && !productSlug) {
200
+ log.error('Informe --channel <id> (canais) ou --product <slug> (legado).');
132
201
  safeExit(1);
133
202
  }
134
203
  const token = await requireToken(opts.json);
135
204
  // Mostrar histórico ao entrar no loop
136
- const qs = new URLSearchParams({ productSlug: opts.product, sinceHours: '24' });
205
+ const qs = new URLSearchParams({ sinceHours: '24' });
206
+ if (channelId) {
207
+ qs.set('channelId', channelId);
208
+ }
209
+ else {
210
+ qs.set('productSlug', productSlug);
211
+ }
212
+ const label = channelId ? `canal ${channelId}` : `produto ${productSlug}`;
137
213
  try {
138
214
  const res = await apiRequest(`/api/cli/v1/chat?${qs.toString()}`, { token });
139
215
  if (res.count > 0) {
140
- console.log(chalk.bold(`\nHistórico — ${opts.product} (últimas 24h · ${res.count} msg)\n`));
216
+ console.log(chalk.bold(`\nHistórico — ${label} (últimas 24h · ${res.count} msg)\n`));
141
217
  for (const msg of res.messages)
142
218
  printMessage(msg);
143
219
  }
144
220
  else {
145
- console.log(chalk.dim(`\nNenhuma mensagem recente para ${opts.product}.\n`));
221
+ console.log(chalk.dim(`\nNenhuma mensagem recente para ${label}.\n`));
146
222
  }
147
223
  }
148
224
  catch {
@@ -158,47 +234,70 @@ export async function runChatLoop(opts) {
158
234
  const askLine = () => new Promise((resolve) => {
159
235
  rl.question(chalk.cyan('> '), (answer) => resolve(answer.trim()));
160
236
  });
161
- // eslint-disable-next-line no-constant-condition
162
- while (true) {
163
- let line;
164
- try {
165
- line = await askLine();
166
- }
167
- catch {
168
- break;
169
- }
170
- if (!line) {
171
- console.log(chalk.dim('(loop encerrado)'));
172
- break;
173
- }
174
- const spinner = ora({ text: 'Enviando…', color: 'blue' }).start();
175
- try {
176
- const res = await apiRequest('/api/cli/v1/chat', {
177
- method: 'POST',
178
- token,
179
- body: {
180
- productSlug: opts.product,
237
+ // try/finally garante que o readline (e o raw mode do TTY) sejam SEMPRE
238
+ // fechados — inclusive se algo inesperado lançar dentro do loop. Sem isso,
239
+ // um throw deixaria o terminal travado em modo de linha.
240
+ try {
241
+ // eslint-disable-next-line no-constant-condition
242
+ while (true) {
243
+ let line;
244
+ try {
245
+ line = await askLine();
246
+ }
247
+ catch {
248
+ break;
249
+ }
250
+ if (!line) {
251
+ console.log(chalk.dim('(loop encerrado)'));
252
+ break;
253
+ }
254
+ // Spinner declarado ANTES do try e parado no finally → nunca vaza,
255
+ // mesmo que a montagem do body ou o envio lancem.
256
+ const spinner = ora({ text: 'Enviando…', color: 'blue' }).start();
257
+ try {
258
+ const msgBody = {
181
259
  message: line,
182
260
  actorType: opts.actorType ?? 'cli',
183
- },
184
- });
185
- spinner.stop();
186
- log.success(`Enviado (id: ${res.id})`);
187
- }
188
- catch (error) {
189
- spinner.fail('Falha ao enviar.');
190
- if (error instanceof Error) {
191
- console.error(chalk.red(` ${error.message}`));
261
+ };
262
+ if (channelId) {
263
+ msgBody.channelId = channelId;
264
+ }
265
+ else {
266
+ msgBody.productSlug = productSlug;
267
+ }
268
+ const res = await apiRequest('/api/cli/v1/chat', {
269
+ method: 'POST',
270
+ token,
271
+ body: msgBody,
272
+ });
273
+ spinner.stop();
274
+ log.success(`Enviado (id: ${res.id})`);
275
+ }
276
+ catch (error) {
277
+ spinner.fail('Falha ao enviar.');
278
+ const detail = error instanceof Error ? error.message : String(error);
279
+ console.error(chalk.red(` ${detail}`));
280
+ // Não encerra o loop — permite tentar de novo
192
281
  }
193
- // Não encerra o loop — permite tentar de novo
194
282
  }
195
283
  }
196
- rl.close();
284
+ finally {
285
+ rl.close();
286
+ }
197
287
  }
198
288
  // ─── Registro do comando `chat` em program ────────────────────────────────────
199
289
  /**
200
290
  * Registra o comando `neetru chat` no programa Commander.
201
291
  *
292
+ * Subcomandos:
293
+ * neetru chat channels → lista canais abertos
294
+ * neetru chat send --channel <id> "msg" → envia mensagem num canal
295
+ * neetru chat send --product <slug> "msg" → legado (por produto)
296
+ * neetru chat history --channel <id> → histórico de canal
297
+ * neetru chat history --product <slug> → histórico legado
298
+ * neetru chat --channel <id> → loop interativo de canal
299
+ * neetru chat --product <slug> → loop interativo legado
300
+ *
202
301
  * integrationNeeded — adicionar em src/index.ts (ou onde os subcomandos
203
302
  * são registrados):
204
303
  * ```ts
@@ -210,35 +309,46 @@ export async function runChatLoop(opts) {
210
309
  export function registerChatCommand(program) {
211
310
  const chatCmd = program
212
311
  .command('chat')
213
- .description('Canal de chat leve dev→operador do Core (histórico rolante de 24h). ' +
214
- 'Sem --product entra no modo lista de todos os canais.')
215
- .option('--product <slug>', 'slug do produto (ex: pdv-agiliza)')
312
+ .description('Canais de chat dev→operador do Core (histórico rolante de 24h). ' +
313
+ 'Use --channel <id> pra entrar num canal (ou --product <slug> legado).')
314
+ .option('--channel <id>', 'id do canal (ex: global)')
315
+ .option('--product <slug>', 'slug do produto — legado (retrocompat)')
216
316
  .option('--actor-type <tipo>', 'tipo do ator: cli|human|agent_claude (default: cli)', 'cli')
217
317
  .option('--json', 'saída em JSON')
218
318
  .action(async (cmdOpts) => {
219
- if (!cmdOpts.product) {
220
- log.error('--product <slug> é obrigatório para o modo loop interativo.');
221
- log.dim(' Use: neetru chat --product <slug>');
222
- log.dim(' Ou: neetru chat send --product <slug> "<mensagem>"');
223
- log.dim(' Ou: neetru chat history --product <slug>');
319
+ if (!cmdOpts.channel && !cmdOpts.product) {
320
+ log.error('Informe --channel <id> (canais) ou --product <slug> (legado).');
321
+ log.dim(' Use: neetru chat --channel global');
322
+ log.dim(' Ou: neetru chat channels (para listar canais)');
224
323
  safeExit(1);
225
324
  }
226
325
  await runChatLoop({
326
+ channel: cmdOpts.channel,
227
327
  product: cmdOpts.product,
228
328
  actorType: cmdOpts.actorType,
229
329
  json: !!cmdOpts.json,
230
330
  });
231
331
  });
332
+ // ── chat channels ──────────────────────────────────────────────────────────
333
+ chatCmd
334
+ .command('channels')
335
+ .description('Listar canais de chat abertos (inclui o canal Global)')
336
+ .option('--json', 'saída em JSON')
337
+ .action(async (cmdOpts) => {
338
+ await runChatChannels({ json: !!cmdOpts.json });
339
+ });
232
340
  // ── chat send ──────────────────────────────────────────────────────────────
233
341
  chatCmd
234
342
  .command('send <mensagem>')
235
- .description('Postar uma mensagem no canal do produto')
236
- .requiredOption('--product <slug>', 'slug do produto (ex: pdv-agiliza)')
343
+ .description('Postar uma mensagem num canal')
344
+ .option('--channel <id>', 'id do canal de destino (ex: global)')
345
+ .option('--product <slug>', 'slug do produto — legado (retrocompat)')
237
346
  .option('--actor-type <tipo>', 'tipo do ator: cli|human|agent_claude (default: cli)', 'cli')
238
- .option('--product-id <id>', 'id interno do produto (opcional, informativo)')
347
+ .option('--product-id <id>', 'id interno do produto (opcional, legado)')
239
348
  .option('--json', 'saída em JSON')
240
349
  .action(async (mensagem, cmdOpts) => {
241
350
  await runChatSend(mensagem, {
351
+ channel: cmdOpts.channel,
242
352
  product: cmdOpts.product,
243
353
  actorType: cmdOpts.actorType,
244
354
  productId: cmdOpts.productId,
@@ -248,12 +358,14 @@ export function registerChatCommand(program) {
248
358
  // ── chat history ───────────────────────────────────────────────────────────
249
359
  chatCmd
250
360
  .command('history')
251
- .description('Exibir histórico do canal (últimas N horas, default: 24)')
252
- .requiredOption('--product <slug>', 'slug do produto (ex: pdv-agiliza)')
361
+ .description('Exibir histórico de um canal (últimas N horas, default: 24)')
362
+ .option('--channel <id>', 'id do canal (ex: global)')
363
+ .option('--product <slug>', 'slug do produto — legado (retrocompat)')
253
364
  .option('--hours <n>', 'janela de histórico em horas (1–24, default: 24)', '24')
254
365
  .option('--json', 'saída em JSON')
255
366
  .action(async (cmdOpts) => {
256
367
  await runChatHistory({
368
+ channel: cmdOpts.channel,
257
369
  product: cmdOpts.product,
258
370
  hours: cmdOpts.hours,
259
371
  json: !!cmdOpts.json,
@@ -1 +1 @@
1
- {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/commands/chat.ts"],"names":[],"mappings":"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"}
@@ -113,3 +113,22 @@ export interface DbHostsOptions {
113
113
  * ficará ausente/vazio até o Core implementar o enriquecimento.
114
114
  */
115
115
  export declare function runDbHosts(opts?: DbHostsOptions): Promise<void>;
116
+ export interface DbMigrationsCancelOptions {
117
+ json?: boolean;
118
+ }
119
+ /**
120
+ * Cancela uma migração presa em `awaiting_confirmation` ou `pending`,
121
+ * transitando-a para `cancelled` (bug_728fa11c fix).
122
+ *
123
+ * Casos de uso:
124
+ * - Migração classificada como destrutiva pelo classifier ANTIGO — com o
125
+ * db-classifier 0.1.2 seria aditiva, mas continua presa indefinidamente.
126
+ * - Dev quer descartar a migração e submeter uma corrigida.
127
+ *
128
+ * NÃO aplica nada — apenas muda o status para `cancelled`. A migração fica
129
+ * registrada para rastreabilidade de auditoria. Após cancelar, rode
130
+ * `neetru db apply` para submeter uma nova migração.
131
+ *
132
+ * Roles: admin ou operator.
133
+ */
134
+ export declare function runDbMigrationsCancel(migrationId: string, opts?: DbMigrationsCancelOptions): Promise<void>;
@@ -11,6 +11,7 @@
11
11
  * neetru db apply [--dry-run] — pipeline de migração + envia ao Core
12
12
  * neetru db migrations list [--db <id>]
13
13
  * neetru db migrations confirm <id> — confirma migração destrutiva (exige --mfa)
14
+ * neetru db migrations cancel <id> — cancela migração presa em awaiting_confirmation ou pending
14
15
  *
15
16
  * Todos os comandos que chamam o Core usam `apiRequest` do `api-client` —
16
17
  * autenticação via Bearer token resolvido automaticamente do config local.
@@ -1167,8 +1168,76 @@ export async function runDbHosts(opts = {}) {
1167
1168
  { header: 'Bancos', value: (r) => dbDensityLabel(r.databases), maxWidth: 50 },
1168
1169
  ], resp.servers);
1169
1170
  }
1171
+ /**
1172
+ * Cancela uma migração presa em `awaiting_confirmation` ou `pending`,
1173
+ * transitando-a para `cancelled` (bug_728fa11c fix).
1174
+ *
1175
+ * Casos de uso:
1176
+ * - Migração classificada como destrutiva pelo classifier ANTIGO — com o
1177
+ * db-classifier 0.1.2 seria aditiva, mas continua presa indefinidamente.
1178
+ * - Dev quer descartar a migração e submeter uma corrigida.
1179
+ *
1180
+ * NÃO aplica nada — apenas muda o status para `cancelled`. A migração fica
1181
+ * registrada para rastreabilidade de auditoria. Após cancelar, rode
1182
+ * `neetru db apply` para submeter uma nova migração.
1183
+ *
1184
+ * Roles: admin ou operator.
1185
+ */
1186
+ export async function runDbMigrationsCancel(migrationId, opts = {}) {
1187
+ if (!opts.json)
1188
+ log.banner();
1189
+ if (!migrationId) {
1190
+ const msg = '<migrationId> é obrigatório.';
1191
+ if (opts.json) {
1192
+ jsonError(msg, 'missing_migration_id');
1193
+ }
1194
+ else {
1195
+ log.error(msg);
1196
+ }
1197
+ safeExit(1);
1198
+ return;
1199
+ }
1200
+ const spinner = opts.json
1201
+ ? null
1202
+ : ora({ text: `Cancelando migração ${migrationId}…`, color: 'yellow' }).start();
1203
+ let resp;
1204
+ try {
1205
+ resp = await apiRequest(`/api/cli/v1/db/migrations/${encodeURIComponent(migrationId)}/cancel`, { method: 'POST' });
1206
+ spinner?.succeed(`Migração ${chalk.bold(resp.migrationId)} cancelada — status: ${resp.status}`);
1207
+ }
1208
+ catch (err) {
1209
+ spinner?.fail('Falha ao cancelar migração.');
1210
+ if (err instanceof CliApiError && err.status === 409) {
1211
+ const msg = `Não foi possível cancelar: ${err.message}\n` +
1212
+ `Apenas migrações em "pending" ou "awaiting_confirmation" podem ser canceladas.`;
1213
+ if (opts.json) {
1214
+ console.log(JSON.stringify({ ok: false, error: 'migration_not_cancellable', message: msg }));
1215
+ safeExit(4);
1216
+ }
1217
+ else {
1218
+ log.error(msg);
1219
+ safeExit(4);
1220
+ }
1221
+ return;
1222
+ }
1223
+ if (opts.json) {
1224
+ jsonError(err.message ?? String(err), 'cancel_failed');
1225
+ safeExit(4);
1226
+ }
1227
+ handleApiError(err);
1228
+ return;
1229
+ }
1230
+ if (opts.json) {
1231
+ console.log(JSON.stringify(resp));
1232
+ return;
1233
+ }
1234
+ log.dim('');
1235
+ log.dim(` Migração cancelada: ${chalk.bold(migrationId)}`);
1236
+ log.dim(` Para reenviar: neetru db apply`);
1237
+ }
1170
1238
  // ── D-3: runDbMigrate e runDbSeed removidos (legado Sprint 10) ──────────────
1171
1239
  // Esses comandos operavam via schema.manifest.json (Sprint 10) e foram cortados
1172
1240
  // junto com o branch legado do `db init`. O fluxo canônico é:
1173
1241
  // neetru db init → neetru db apply → neetru db migrations confirm (se destrutiva)
1242
+ // → neetru db migrations cancel (se presa em awaiting_confirmation)
1174
1243
  //# sourceMappingURL=db.js.map