@tacuchi/agent-workflow-cli 10.4.0 → 11.0.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 (37) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +5 -1
  3. package/package.json +2 -2
  4. package/skills/agent-workflow/LICENSE +661 -21
  5. package/skills/agent-workflow/README.md +2 -2
  6. package/skills/agent-workflow/commands/export-scripts.md +35 -62
  7. package/skills/agent-workflow/exports/export-scripts/SKILL.md +114 -248
  8. package/skills/agent-workflow/exports/export-scripts/references/lexico-tecnico.md +17 -64
  9. package/skills/agent-workflow/exports/export-scripts/references/readme-template.md +24 -264
  10. package/skills/agent-workflow/exports/export-scripts/references/validations.md +29 -250
  11. package/skills/agent-workflow/standards/sql-rollback-generator/SKILL.md +72 -126
  12. package/skills/agent-workflow/standards/sql-script-organizer/SKILL.md +12 -13
  13. package/dist/cli/tui/components/command-palette.d.ts +0 -18
  14. package/dist/cli/tui/components/command-palette.d.ts.map +0 -1
  15. package/dist/cli/tui/components/command-palette.js +0 -23
  16. package/dist/cli/tui/components/command-palette.js.map +0 -1
  17. package/dist/cli/tui/components/sidebar.d.ts +0 -27
  18. package/dist/cli/tui/components/sidebar.d.ts.map +0 -1
  19. package/dist/cli/tui/components/sidebar.js +0 -37
  20. package/dist/cli/tui/components/sidebar.js.map +0 -1
  21. package/dist/cli/tui/components/toast-stack.d.ts +0 -41
  22. package/dist/cli/tui/components/toast-stack.d.ts.map +0 -1
  23. package/dist/cli/tui/components/toast-stack.js +0 -61
  24. package/dist/cli/tui/components/toast-stack.js.map +0 -1
  25. package/dist/cli/tui/components/toast.d.ts +0 -7
  26. package/dist/cli/tui/components/toast.d.ts.map +0 -1
  27. package/dist/cli/tui/components/toast.js +0 -17
  28. package/dist/cli/tui/components/toast.js.map +0 -1
  29. package/skills/agent-workflow/doctrine/doctor/SKILL.md.tmp +0 -0
  30. package/skills/agent-workflow/doctrine/hub-init/SKILL.md.tmp +0 -0
  31. package/skills/agent-workflow/doctrine/migrate/SKILL.md.tmp +0 -0
  32. package/skills/agent-workflow/doctrine/project-init/SKILL.md.tmp +0 -0
  33. package/skills/agent-workflow/doctrine/rules/SKILL.md.tmp +0 -0
  34. package/skills/agent-workflow/exports/export-arq/SKILL.md.tmp +0 -0
  35. package/skills/agent-workflow/exports/export-report/SKILL.md.tmp +0 -0
  36. package/skills/agent-workflow/specialties/analyze-investigate/SKILL.md.tmp +0 -0
  37. package/skills/agent-workflow/standards/coding-standards/SKILL.md.tmp +0 -0
@@ -1,85 +1,62 @@
1
1
  ---
2
2
  name: sql-rollback-generator
3
- description: "Genera rollback **post-hoc** desde SCRIPTS.sql consolidado (v2.0.0 BREAKING session093): cuando /agent-workflow:export-scripts produce el bundle, este skill emite un único archivo `00-ROLLBACK.sql` al root del bundle, encadenado cross-session en orden inverso (última sesión primera, 04→03→02→01 dentro de cada una). NO genera `.rollback.sql` companions por sentencia ni `<session>/rollback/` per-sesión (ambos eliminados desde v2.0.0). Cubre DDL (DROP IF EXISTS), migraciones con backup en esq_audit, e inserts. Marca operaciones irreversibles (DROP COLUMN, TRUNCATE, DROP CASCADE) con header WARNING en bloque separado al final del archivo, después del `COMMIT;`."
4
- version: 2.0.0
3
+ description: "Genera `00-ROLLBACK.sql` único al root del bundle, leyendo los forwards ya escritos por `/agent-workflow:export-scripts` v5.0.0+. v3.0.0 BREAKING (session103): lee los archivos `NN-*.sql` consolidados (no `SCRIPTS.sql` por sesión); headers SQL mínimos (1-2 líneas); orden inverso del último forward al primero. Bloque `BEGIN; ... COMMIT;` único + bloque opcional `Fase 5 Cleanup irreversible` después del COMMIT para operaciones no revertibles automáticamente (DROP COLUMN, TRUNCATE, ALTER COLUMN TYPE con pérdida). NO genera companions `.rollback.sql` ni sub-carpetas per-sesión."
4
+ version: 3.0.0
5
5
  ---
6
6
 
7
- # SQL Rollback Generator (v2.0.0 — `00-ROLLBACK.sql` único cross-session)
7
+ # SQL Rollback Generator — `00-ROLLBACK.sql` único, derivado de forwards
8
8
 
9
- Generación de rollback **post-hoc** desde los archivos `SCRIPTS.sql` de las sesiones incluidas en el bundle de export. Disparado por `/agent-workflow:export-scripts` v4.0.0+ al consolidar el bundle.
9
+ Genera el rollback **derivado de los forwards consolidados**. Invocado por `/agent-workflow:export-scripts` v5.0.0+ después de escribir los archivos `NN-*.sql` del bundle.
10
10
 
11
- > **BREAKING desde v2.0.0**: este skill ya NO produce companions `.rollback.sql` por sentencia ni sub-carpetas `<session>/rollback/` per-sesión (comportamiento v1.0.0 eliminado). El output canónico es un único `00-ROLLBACK.sql` al root del bundle. Razón: el bundle se ejecuta atomic (todo o nada) — múltiples archivos rollback agregaban ruido sin valor operacional. Layouts v1.0.0 quedan como histórico; bundles generados con export-scripts v3.x no se reescriben.
11
+ > v3.0.0 (session103) lee los forwards ya escritos en vez de `SCRIPTS.sql` original. Headers minimal (1-2 líneas). Sin verbosidad de motivación/impacto.
12
12
 
13
13
  ## When to use
14
14
 
15
- - **Disparado por `/agent-workflow:export-scripts`** al consolidar el bundle desde N sesiones.
16
- - NL del usuario: "generar rollback", "script de reversa", "rollback global".
17
- - Si el usuario quiere entender cómo revertir un cambio específico ANTES del export: este skill puede simular un rollback en plan-mode sin escribir archivos.
15
+ - **Disparado por `/agent-workflow:export-scripts`** después del Paso 5 (forwards escritos).
16
+ - NL del usuario: "generar rollback", "script de reversa".
17
+ - En plan-mode: simular el rollback de un cambio específico sin escribir archivos.
18
18
 
19
19
  ## Sandbox read-only
20
20
 
21
- Reglas en `../session/references/sandbox-readonly-rules.md`. En plan mode describir estrategia por sentencia forward (sin crear `.rollback.sql`); irreversibles se anotan para revisión.
21
+ `../session/references/sandbox-readonly-rules.md`. Plan describe estructura del rollback sin escribir archivos.
22
22
 
23
- ## Principios (v2.0.0)
23
+ ## Principios (v3.0.0)
24
24
 
25
- - **Input**: `SCRIPTS.sql` de cada sesión incluida en el corpus de export, parseado vía markers `@category`/`@stmt` (ver `sql-script-organizer/references/scripts-sql-format.md`).
26
- - **Output único**: `<bundle-root>/00-ROLLBACK.sql` — un solo archivo cross-session al root del bundle.
27
- - **NO se generan** companions `.rollback.sql` por sentencia (eliminado en v2.0.0).
28
- - **NO se genera** sub-carpeta `<session>/rollback/` per-sesión (eliminado en v2.0.0).
29
- - **NO se genera** `rollback-global.sql` separado del root (eliminado en v2.0.0).
30
- - **Orden interno**: encadenado en orden inverso global última sesión primera; dentro de cada sesión 04 → 03 → 02 → 01.
31
- - **Estructura del archivo**:
32
- - Header del archivo: corpus + fecha + sesiones cubiertas + versión del CLI.
33
- - Bloque transaccional único `BEGIN; ... COMMIT;` con sub-bloques por sesión.
34
- - Cada sub-bloque preserva header canónico del rollback de su sentencia (Script / Sesion / Objeto / Alcance) como comentario.
35
- - Bloque final **fuera de la transacción**: "Fase 5 — Cleanup irreversible" con header `-- WARNING: IRREVERSIBLE` listando operaciones que no son revertibles automáticamente (decisión manual del operador).
36
- - **Idempotencia obligatoria**: `DROP ... IF EXISTS`, `CREATE OR REPLACE`, `ON CONFLICT DO NOTHING`.
37
- - **Datos**: si el forward es UPDATE/DELETE masivo sin backup, generar un `000-backup-*.sql` previo en `03-DML.sql` del bundle + el rollback que restaura desde `esq_audit.tb_bkp_<x>_sNNN` vive dentro de `00-ROLLBACK.sql`.
25
+ - **Input**: los archivos `NN-*.sql` forward ya escritos en el bundle (no `SCRIPTS.sql` original).
26
+ - **Output único**: `<bundle-root>/00-ROLLBACK.sql`.
27
+ - **Orden interno**: inverso del último forward al primero si el bundle es `01-DDL-TABLES.sql, 02-DML.sql, 03-INSERTS.sql`, el rollback procesa `03 → 02 → 01`.
28
+ - **Headers mínimos**: 2 líneas para el archivo, 1 línea por sentencia.
29
+ - **Bloque transaccional único** `BEGIN; ... COMMIT;`.
30
+ - **Bloque Fase 5** después del COMMIT (solo si hay irreversibles): operaciones que no se pueden revertir automáticamente.
31
+ - **Idempotencia obligatoria**: `DROP ... IF EXISTS`, `CREATE OR REPLACE`.
38
32
 
39
33
  ## Estructura del `00-ROLLBACK.sql`
40
34
 
41
- Header global del archivo:
35
+ Header del archivo (2 líneas):
42
36
 
43
37
  ```sql
44
- -- ============================================================================
45
- -- Script: 00-ROLLBACK.sql
46
- -- Bundle: NNN-export-scripts-YYYY-MM-DD
47
- -- Sesiones: sNNN, sNNN, ...
48
- -- Objeto: Revierte el bundle completo en orden inverso (última sesión → primera, 04→01).
49
- -- Alcance: <enumeración cross-session>
50
- -- ============================================================================
38
+ -- 00-ROLLBACK.sql — bundle NNN-export-scripts-YYYY-MM-DD
39
+ -- Generado por agent-workflow sql-rollback-generator v3.0.0
51
40
  ```
52
41
 
53
- Sub-bloque por sentencia (dentro del `BEGIN; ... COMMIT;` único):
42
+ Sub-bloque por sentencia (1 línea de comentario + SQL):
54
43
 
55
44
  ```sql
56
- -- ----------------------------------------------------------------------------
57
- -- Rollback de sesion sNNN <categoria>: NNN-tipo-objetivo
58
- -- Objeto: <resumen de la reversa>
59
- -- Alcance: <mismo alcance que el forward>
60
- -- ----------------------------------------------------------------------------
61
- DROP TABLE IF EXISTS esq_.tb_x;
62
- -- ...
45
+ -- Revierte: sessionXXX / stmt-id (forward: 02-DML.sql)
46
+ ALTER TABLE esq_.tb_x ALTER COLUMN col_y TYPE varchar(80);
63
47
  ```
64
48
 
65
- - `Objeto:` del sub-bloque describe la reversa (ej. "Repone tb_x.cod_usuario al valor de esq_audit.tb_bkp_x_sNNN").
66
- - `Alcance:` repite literal el del forward.
67
-
68
- Bloque irreversibles al final del archivo (después del `COMMIT;`, **fuera de la transacción**):
49
+ Bloque Fase 5 (al final, fuera de la transacción solo si hay irreversibles):
69
50
 
70
51
  ```sql
71
52
  COMMIT;
72
53
 
73
- -- ============================================================================
74
54
  -- Fase 5 — Cleanup irreversible (manual)
75
- -- WARNING: IRREVERSIBLE best-effort. Ver DECISIONS.md de la sesión origen.
76
- -- ============================================================================
77
- -- sesion sNNN — DROP COLUMN esq_.tb_x.col_y (no hay backup automático)
78
- -- sesion sMMM — TRUNCATE esq_.tb_z
79
- -- ...
55
+ -- sessionXXX / UPDATE esq_.tb_y sin backup automático: completar valores previos manualmente.
56
+ -- sessionYYY / TRUNCATE esq_.tb_z: pérdida total, sin reversa.
80
57
  ```
81
58
 
82
- El bloque WARNING explica qué no se puede recuperar y referencia la decisión de la sesión donde se introdujo.
59
+ Sin templates `BEGIN; UPDATE COMMIT;` comentados ni explicaciones largas. Solo una línea por irreversible identificando origen y razón.
83
60
 
84
61
  ## Estrategias por tipo de operación
85
62
 
@@ -91,122 +68,91 @@ El bloque WARNING explica qué no se puede recuperar y referencia la decisión d
91
68
  | `ALTER TABLE tb_x ADD COLUMN col_y ...` | `ALTER TABLE tb_x DROP COLUMN IF EXISTS col_y;` |
92
69
  | `CREATE INDEX idx_... ON tb_x(col)` | `DROP INDEX IF EXISTS idx_...;` |
93
70
  | `CREATE SEQUENCE esq_.seq_tb_x` | `DROP SEQUENCE IF EXISTS esq_.seq_tb_x;` |
94
- | `DROP TABLE tb_x` | Backup previo en `esq_audit.tb_bkp_x_sessionXXX`; rollback es `CREATE TABLE ... AS SELECT * FROM esq_audit.tb_bkp_x_sessionXXX` |
95
- | Reconstrucción | Script previo `000-backup-tb-x.sql` que copia a `esq_audit`; rollback restaura desde backup |
71
+ | `ALTER COLUMN col TYPE varchar(255)` (widen) | `ALTER COLUMN col TYPE varchar(80);` (con nota Fase 5 si datos exceden 80) |
72
+ | `DROP TABLE tb_x` | **Irreversible** Fase 5 (requiere backup previo a `esq_audit`) |
96
73
 
97
- ### DDL de funciones y SP
74
+ ### DDL de funciones
98
75
 
99
76
  | Forward | Rollback |
100
77
  |---|---|
101
- | `CREATE OR REPLACE FUNCTION fn_x(...)` | `DROP FUNCTION IF EXISTS fn_x(<firma>);` o recrear versión previa con `CREATE OR REPLACE` embebido |
102
- | `CREATE OR REPLACE PROCEDURE sp_x(...)` | `DROP PROCEDURE IF EXISTS sp_x(<firma>);` + recreación si existe versión anterior |
103
- | `DROP FUNCTION fn_x` | `-- WARNING: IRREVERSIBLE` — incluir cuerpo en comentario |
78
+ | `CREATE OR REPLACE FUNCTION fn_x(...)` | `DROP FUNCTION IF EXISTS fn_x(<firma>);` |
79
+ | `DROP FUNCTION fn_x` | **Irreversible** Fase 5 |
104
80
 
105
81
  ### Migración de datos (UPDATE / DELETE)
106
82
 
107
- Pasos obligatorios antes del forward:
108
-
109
- 1. Generar `000-backup-<tabla>.sql` que copia filas afectadas a `esq_audit.tb_bkp_<tabla>_sessionXXX`.
110
- 2. Rollback usa el backup:
111
-
112
- ```sql
113
- BEGIN;
114
- UPDATE esq_.tb_x t
115
- SET col_a = bkp.col_a, col_b = bkp.col_b
116
- FROM esq_audit.tb_bkp_x_sessionXXX bkp
117
- WHERE t.id_x = bkp.id_x;
118
- COMMIT;
119
- ```
120
-
121
- Si DELETE masivo, rollback es `INSERT INTO ... SELECT * FROM esq_audit.tb_bkp_...`.
83
+ - Si el forward incluye backup explícito en `esq_audit.tb_bkp_*_sNNN` (visible en el forward consolidado): rollback `UPDATE … FROM esq_audit.tb_bkp_…`.
84
+ - Si NO hay backup automático en el forward: **Fase 5**, con nota de una línea ("`sessionXXX` / UPDATE sin backup: completar valores previos manualmente").
122
85
 
123
- ### Inserts de datos nuevos
86
+ ### Inserts
124
87
 
125
88
  ```sql
126
- BEGIN;
127
89
  DELETE FROM esq_.tb_maestras WHERE campo_identificador IN (<lista>);
128
- COMMIT;
129
90
  ```
130
91
 
131
92
  Usar claves naturales o rango de IDs conocido — nunca DELETE sin WHERE.
132
93
 
133
- ### Operaciones irreversibles
134
-
135
- Marcar con `-- WARNING: IRREVERSIBLE` en el header del forward:
94
+ ### Irreversibles → Fase 5
136
95
 
137
96
  - `TRUNCATE TABLE`
138
97
  - `DROP COLUMN` sin respaldo previo
139
98
  - `DROP TABLE` sin respaldo previo
140
- - `ALTER COLUMN TYPE` con pérdida de precisión
99
+ - `ALTER COLUMN TYPE` con pérdida (varchar widen → narrow si datos exceden)
141
100
  - Cascadas destructivas (`DROP ... CASCADE`)
142
- - `DELETE` sin respaldo en `esq_audit`
101
+ - `DELETE`/`UPDATE` sin respaldo en `esq_audit`
102
+
103
+ Cada uno aparece como **una sola línea** en la Fase 5, identificando origen + razón. Sin templates comentados ni explicaciones extensas.
143
104
 
144
- Protocolo:
105
+ ## Proceso (v3.0.0)
145
106
 
146
- 1. Header WARNING.
147
- 2. Registrar decisión en DECISIONS.md (legacy: DECISIONES.md) antes de ejecutar.
148
- 3. Generar rollback "best-effort" indicando qué se perdería.
149
- 4. **Confirmación explícita** del usuario antes de continuar.
107
+ 1. Leer los archivos `NN-*.sql` forward escritos en el bundle (no `SCRIPTS.sql` original).
108
+ 2. Parsear cada bloque (un BEGIN/COMMIT por sentencia, identificada por `-- sessionXXX / stmt-id`).
109
+ 3. Para cada sentencia forward, clasificar el tipo y seleccionar estrategia (DDL / migración / inserts / irreversible).
110
+ 4. Generar el bloque rollback correspondiente (header de 1 línea + SQL inverso).
111
+ 5. Identificar irreversibles → moverlos a la Fase 5 al final.
112
+ 6. Componer el `00-ROLLBACK.sql` único con orden inverso (último forward → primero, dentro de cada uno última sentencia → primera).
113
+ 7. Escribir el archivo al root del bundle.
150
114
 
151
- Lista completa en `references/irreversible-checklist.md`.
115
+ ## Notas de portabilidad
152
116
 
153
- ## Layout (post-export-scripts v4.0.0)
117
+ PostgreSQL como motor primario. Para otros motores, ajustar sintaxis idempotente:
154
118
 
155
- Output canónico un solo archivo al root del bundle:
119
+ | Concepto | PostgreSQL | Oracle | SQL Server |
120
+ |---|---|---|---|
121
+ | Drop idempotente | `DROP … IF EXISTS` | `DROP … (no IF EXISTS)` | `DROP … IF EXISTS` |
122
+ | Recrear función | `CREATE OR REPLACE FUNCTION` | `CREATE OR REPLACE FUNCTION` | `CREATE OR ALTER PROCEDURE` |
123
+
124
+ Si el destino no es Postgres, indicarlo en el header del archivo (línea adicional opcional).
125
+
126
+ ## Layout (post-export-scripts v5.0.0)
156
127
 
157
128
  ```
158
129
  <docs>/scripts/NNN-export-scripts-YYYY-MM-DD/
159
- └── 00-ROLLBACK.sql # único rollback cross-session (este skill lo genera)
130
+ └── 00-ROLLBACK.sql # este skill lo genera
160
131
  ```
161
132
 
162
- Para context: el bundle plano del export incluye además `01-DDL-TABLES.sql`, `02-DDL-FUNCTIONS.sql`, `03-DML.sql`, `04-INSERTS.sql`, `README.md` — todos al root, generados por `export-scripts` (no por este skill).
133
+ Para context: el bundle plano del export incluye además `01-…`, `02-…`, etc. (forwards en orden ascendente, numeración continua) + `README.md` — todos al root, generados por `export-scripts`.
134
+
135
+ **No se generan** desde v2.0.0:
163
136
 
164
- **No se generan** (eliminados desde v2.0.0):
165
137
  - Companions `.rollback.sql` por sentencia.
166
138
  - Sub-carpeta `<session>/rollback/` per-sesión.
167
139
  - Archivo `rollback-global.sql` separado.
168
- - Archivos `04-inserts-rollback.sql`, `03-migracion-rollback.sql`, etc. (categorías por separado).
169
-
170
- Layouts v1.0.0 quedan como histórico en bundles ya generados (`docs/scripts/00X-export-scripts-*` previos). No se migran retroactivamente. Layouts legacy v0.x se migran con `/agent-workflow:migrate --upgrade-topology`.
171
-
172
- ## Proceso (v2.0.0)
173
-
174
- 1. Parsear todos los `SCRIPTS.sql` del corpus de export (markers `@category`/`@stmt`).
175
- 2. Para cada sentencia forward, clasificar el tipo y seleccionar estrategia (DDL / migración / inserts / irreversible).
176
- 3. Generar el bloque rollback correspondiente — sin escribir todavía a disco.
177
- 4. Identificar irreversibles → moverlos al bloque "Fase 5" final.
178
- 5. Componer el `00-ROLLBACK.sql` único con orden inverso global (última sesión → primera, 04→01) + bloque "Fase 5" al final.
179
- 6. Escribir el archivo único al root del bundle.
180
-
181
- ## Notas de portabilidad (PostgreSQL como motor primario)
182
-
183
- | Concepto | PostgreSQL | Oracle | SQL Server |
184
- |---|---|---|---|
185
- | Rollback de función | `DROP FUNCTION IF EXISTS fn(...sig)` | `DROP FUNCTION fn` | `DROP FUNCTION IF EXISTS fn` |
186
- | Idempotencia create | `CREATE OR REPLACE FUNCTION` | `CREATE OR REPLACE FUNCTION` | `CREATE OR ALTER PROCEDURE` |
187
- | Insertar sin duplicar | `ON CONFLICT DO NOTHING` | `INSERT ... WHERE NOT EXISTS` | `IF NOT EXISTS (SELECT 1 ...) INSERT` |
188
- | Secuencia | `DROP SEQUENCE IF EXISTS seq_` | `DROP SEQUENCE seq_` | No aplica (IDENTITY) |
189
-
190
- Si el destino no es Postgres, indicarlo en `Objeto:` o como nota libre debajo del header (no como campo nuevo).
191
-
192
- ## Graduación al cierre
193
-
194
- Este skill **NO se invoca al cerrar una sesión**. La graduación de scripts de una sesión individual produce `docs/scripts/NNN-sessionXXX-nombre/` con el `SCRIPTS.sql` curado; el rollback consolidado vive **exclusivamente en el bundle de export** (`docs/scripts/NNN-export-scripts-YYYY-MM-DD/00-ROLLBACK.sql`).
195
-
196
- ## Modo release (LEGACY — deprecation Fase 1)
197
-
198
- `release` y `release-scripts` (legacy en deprecation Fase 1) consumían el algoritmo v1.0.0 (companions `.rollback.sql` + per-sesión rollback + global). Ese código y output **no se actualizan a v2.0.0**: se conserva como histórico en `references/release-rollback.md` mientras los workspaces dejan de invocarlos. El reemplazo canónico es `/agent-workflow:export-scripts` v4.0.0+ que invoca este skill en v2.0.0.
199
140
 
200
141
  ## Integración con otros skills
201
142
 
202
- - **`sql-script-organizer`** — companion: organiza el `SCRIPTS.sql` por sesión que este skill consume al exportar.
203
- - **`export-scripts`** v4.0.0+ único invocador activo de este skill (genera `00-ROLLBACK.sql` único).
204
- - **`release`** / **`release-scripts`** — legacy en deprecation Fase 1; consumen `references/release-rollback.md` (no se actualiza).
205
- - **`coding-standards`** — reglas de estilo SQL en `database-conventions.md#estilo-de-scripts-sql`.
143
+ - **`export-scripts`** v5.0.0+ único invocador activo; pasa los forwards ya escritos.
144
+ - **`sql-script-organizer`** — companion que organiza el `SCRIPTS.sql` por sesión.
145
+ - **`coding-standards`** — reglas de estilo SQL.
206
146
  - **`session`** — este skill NO se invoca al cerrar una sesión individual; sólo desde export-scripts.
207
147
 
148
+ ## Histórico de versiones
149
+
150
+ - **v3.0.0** (session103, 2026-05-28) — lee forwards ya escritos en vez de `SCRIPTS.sql` original; headers SQL minimal; Fase 5 sin templates comentados.
151
+ - **v2.0.0** (session093) — `00-ROLLBACK.sql` único cross-session leyendo `SCRIPTS.sql`. Histórico.
152
+ - **v1.0.0** y anteriores — companions `.rollback.sql` + per-sesión rollback. Histórico.
153
+
208
154
  ## Recursos adicionales
209
155
 
210
156
  - **`references/rollback-patterns.md`** — recetas completas con ejemplos SQL.
211
157
  - **`references/irreversible-checklist.md`** — lista de irreversibles y protocolo.
212
- - **`references/release-rollback.md`** — algoritmos de rollback global y por tema (modo release).
158
+ - **`references/release-rollback.md`** — algoritmos legacy (modo release, deprecation Fase 1).
@@ -143,25 +143,24 @@ Cada sección del cuerpo se introduce con una línea de comentario corta envuelt
143
143
 
144
144
  El usuario revisa el SCRIPTS.sql periódicamente; la separación 01-04 final y la verificación de dependencias cruzadas la hace `/agent-workflow:export-scripts` post-hoc.
145
145
 
146
- ## Layout del bundle (post-export-scripts v4.0.0)
146
+ ## Layout del bundle (post-export-scripts v5.0.0)
147
147
 
148
- `/agent-workflow:export-scripts` v4.0.0+ produce el bundle al ejecutarse, no este skill. Layout plano cross-session al root:
148
+ `/agent-workflow:export-scripts` v5.0.0+ produce el bundle al ejecutarse, no este skill. Layout plano con **numeración continua** tras `00-ROLLBACK.sql`:
149
149
 
150
150
  ```
151
151
  <docs>/scripts/NNN-export-scripts-YYYY-MM-DD/
152
- ├── 00-ROLLBACK.sql (único rollback cross-session — sql-rollback-generator v2.0.0)
153
- ├── 01-DDL-TABLES.sql (consolidado cross-session, skip si vacío)
154
- ├── 02-DDL-FUNCTIONS.sql (idem)
155
- ├── 03-DML.sql (UPDATE/DELETE/migración + backup en esq_audit cuando aplica)
156
- ├── 04-INSERTS.sql (idem)
157
- ├── README.md (único informe + índice + how-to-execute)
158
- └── por-tema/ (opt-in — capa adicional encima del root)
159
- └── tema-<slug>/01-04-*.sql
152
+ ├── 00-ROLLBACK.sql (único rollback cross-session — sql-rollback-generator v3.0.0)
153
+ ├── 01-<CATEGORIA>.sql (primera categoría con contenido)
154
+ ├── 02-<CATEGORIA>.sql (segunda categoría con contenido, si aplica)
155
+ ├── ... (numeración continua, sin gaps por categoría vacía)
156
+ └── README.md (índice + cómo aplicar + cómo revertir)
160
157
  ```
161
158
 
159
+ Orden canónico de las categorías (para asignar número): `DDL-TABLES` → `DDL-FUNCTIONS` → `DML` → `INSERTS`. Las vacías no ocupan número. Si sólo hay DML, el archivo se llama `01-DML.sql`.
160
+
162
161
  Sentencias individuales del `SCRIPTS.sql` per-sesión se consolidan **cross-session** al archivo de su categoría — no se crea sub-carpeta por sesión.
163
162
 
164
- Layout **v3.x** (`por-sesion/<sessionXXX>/01-04/*.sql + .rollback.sql` companions + per-sesión `rollback/`) ya **no se genera** desde v4.0.0. Bundles ya escritos con v3.x quedan como histórico.
163
+ Layout **v3.x** (`por-sesion/<sessionXXX>/01-04/*.sql + .rollback.sql` companions + per-sesión `rollback/`) ya **no se genera** desde v4.0.0. Layout **v4.0.0** (números fijos 01-04 con gaps) reemplazado por numeración continua en v5.0.0. Bundles ya escritos con layouts previos quedan como histórico.
165
164
 
166
165
  Layout **legacy** pre-SCRIPTS.sql (`scripts/01-04/*.sql + .rollback.sql` directo en sesión) tampoco se genera; sesiones nuevas usan SCRIPTS.sql. Layouts legacy en sesiones cerradas se migran con `/agent-workflow:migrate --upgrade-topology`.
167
166
 
@@ -183,8 +182,8 @@ Procedimiento completo (entrada, proceso paso a paso, layout destino, formato de
183
182
 
184
183
  ## Integración con otros skills
185
184
 
186
- - **`sql-rollback-generator`** v1.0.0+ — **on-export**: ya NO genera rollbacks durante exec. La generación ocurre cuando `export-scripts` corre.
187
- - **`export-scripts`** v3.0.0+ — consume `SCRIPTS.sql` per sesión, separa en 01-04 y delega a `sql-rollback-generator` para los rollbacks. Aborta si detecta layout legacy.
185
+ - **`sql-rollback-generator`** v3.0.0+ — **on-export**: lee los forwards ya consolidados por `export-scripts` (no `SCRIPTS.sql` original) y genera `00-ROLLBACK.sql` único.
186
+ - **`export-scripts`** v5.0.0+ — consume `SCRIPTS.sql` per sesión + `docs/scripts/*.sql` standalone, clasifica por categoría y asigna numeración continua tras `00-ROLLBACK.sql`. Aborta si detecta layout legacy.
188
187
  - **`migrate`** v1.3.0+ — capability 11: convierte layouts legacy `scripts/01-04/*.sql` → `SCRIPTS.sql` consolidado.
189
188
  - **`coding-standards`** — fuente de las reglas de estilo (`database-conventions.md`).
190
189
  - **`session`** — Fase execution invoca este skill al primer change SQL; Fase closure no necesita acción adicional.
@@ -1,18 +0,0 @@
1
- export interface PaletteCommand {
2
- id: string;
3
- label: string;
4
- category: string;
5
- hint?: string;
6
- alert?: boolean;
7
- }
8
- export interface CommandPaletteProps {
9
- filter: string;
10
- commands: PaletteCommand[];
11
- cursor: number;
12
- groups?: Array<{
13
- category: string;
14
- commands: PaletteCommand[];
15
- }>;
16
- }
17
- export declare function CommandPalette({ filter, commands, cursor }: CommandPaletteProps): import("react/jsx-runtime").JSX.Element;
18
- //# sourceMappingURL=command-palette.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-palette.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/components/command-palette.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC,CAAC;CAClE;AAID,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,mBAAmB,2CA6E/E"}
@@ -1,23 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Text } from "ink";
3
- import { colors, icons } from "../theme.js";
4
- const PLACEHOLDER = "type to filter…";
5
- export function CommandPalette({ filter, commands, cursor }) {
6
- const groups = [];
7
- for (const c of commands) {
8
- const last = groups[groups.length - 1];
9
- if (last && last.category === c.category) {
10
- last.rows.push(c);
11
- }
12
- else {
13
- groups.push({ category: c.category, rows: [c] });
14
- }
15
- }
16
- let runningIdx = 0;
17
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { flexDirection: "row", marginBottom: 1, children: [_jsx(Text, { color: colors.mute, children: "search " }), _jsxs(Text, { color: colors.accent, bold: true, children: ["\u203A", " "] }), filter ? (_jsx(Text, { color: colors.bright, children: filter })) : (_jsx(Text, { color: colors.faint, children: PLACEHOLDER })), _jsx(Text, { color: colors.accent, children: icons.caret }), _jsx(Box, { flexGrow: 1 }), _jsxs(Text, { color: colors.mute, children: [commands.length, " match", commands.length === 1 ? "" : "es"] })] }), _jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: colors.borderFaint, children: "─".repeat(70) }) }), commands.length === 0 ? (_jsxs(Text, { color: colors.dim, children: ["No matches for \"", filter || "…", "\"."] })) : null, groups.map((g) => (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: colors.mute, children: g.category.toUpperCase() }), g.rows.map((c) => {
18
- const idx = runningIdx++;
19
- const active = idx === cursor;
20
- return (_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { width: 2, children: _jsx(Text, { color: active ? colors.accent : colors.faint, children: active ? icons.focusBar : " " }) }), _jsx(Box, { flexGrow: 1, children: _jsx(Text, { color: active ? colors.accent : colors.bright, bold: active, children: c.label }) }), c.hint ? (_jsx(Box, { marginLeft: 1, children: _jsx(Text, { color: colors.dim, children: c.hint }) })) : null, c.alert ? (_jsx(Box, { marginLeft: 1, children: _jsx(Text, { color: colors.err, children: "\u25CF" }) })) : null] }, c.id));
21
- })] }, g.category)))] }));
22
- }
23
- //# sourceMappingURL=command-palette.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-palette.js","sourceRoot":"","sources":["../../../../src/cli/tui/components/command-palette.tsx"],"names":[],"mappings":"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"}
@@ -1,27 +0,0 @@
1
- export type SidebarTabId = "status" | "workflow" | "project" | "mcp" | "skills";
2
- export interface SidebarTab {
3
- id: SidebarTabId;
4
- key: string;
5
- label: string;
6
- badge?: string;
7
- alert?: boolean;
8
- }
9
- export interface WorkspaceContext {
10
- modeLabel: string;
11
- branchLabel: string;
12
- sessionsLabel: string;
13
- }
14
- export interface KeymapEntry {
15
- key: string;
16
- action: string;
17
- }
18
- export interface SidebarProps {
19
- activeTab: SidebarTabId;
20
- tabs: SidebarTab[];
21
- workspaceContext: WorkspaceContext;
22
- cliVersion: string;
23
- globalKeys: KeymapEntry[];
24
- width?: number;
25
- }
26
- export declare function Sidebar({ activeTab, tabs, workspaceContext, cliVersion, globalKeys, width, }: SidebarProps): import("react/jsx-runtime").JSX.Element;
27
- //# sourceMappingURL=sidebar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/components/sidebar.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEhF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,YAAY,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,YAAY,CAAC;IACxB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,IAAI,EACJ,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,KAAqB,GACtB,EAAE,YAAY,2CAiEd"}
@@ -1,37 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { Box, Text } from "ink";
3
- import { colors, icons } from "../theme.js";
4
- const DEFAULT_WIDTH = 24;
5
- // Reservado para alinear los `entry.action` en la columna de keymap. 3 cells es
6
- // suficiente para los keys más anchos (`↑↓`, `^K`).
7
- const KEY_COL_WIDTH = 4;
8
- export function Sidebar({ activeTab, tabs, workspaceContext, cliVersion, globalKeys, width = DEFAULT_WIDTH, }) {
9
- return (_jsxs(Box, { flexDirection: "column", width: width, flexShrink: 0, paddingX: 1, paddingY: 1, children: [_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { color: colors.accent, bold: true, children: icons.brand }), _jsxs(Text, { color: colors.bright, bold: true, children: [" ", "agent-workflow"] })] }), _jsxs(Text, { color: colors.faint, wrap: "truncate-end", children: ["v", cliVersion, " \u00B7 @tacuchi"] })] }), _jsx(Box, { marginTop: 1, children: _jsx(Divider, {}) }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: tabs.map((tab) => (_jsx(SidebarTabRow, { tab: tab, active: tab.id === activeTab }, tab.id))) }), _jsx(Box, { marginTop: 1, children: _jsx(Divider, {}) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: colors.mute, children: "WORKSPACE" }), _jsx(Text, { color: colors.text, wrap: "truncate-end", children: workspaceContext.modeLabel }), _jsx(Text, { color: colors.dim, wrap: "truncate-end", children: workspaceContext.branchLabel }), _jsx(Text, { color: colors.dim, wrap: "truncate-end", children: workspaceContext.sessionsLabel })] }), _jsx(Box, { marginTop: 1, children: _jsx(Divider, {}) }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: globalKeys.map((entry) => (_jsxs(Box, { children: [_jsx(Box, { width: KEY_COL_WIDTH, children: _jsx(Text, { color: colors.accent, children: entry.key }) }), _jsx(Text, { color: colors.dim, children: entry.action })] }, `${entry.key}-${entry.action}`))) })] }));
10
- }
11
- // Width interior del sidebar: width - paddingX*2 = 22, menos 2 cells de safety
12
- // margin para variabilidad de ancho visual de glyphs + inner padding.
13
- const SIDEBAR_INNER_WIDTH = DEFAULT_WIDTH - 4;
14
- const SIDEBAR_INNER_PAD = 1;
15
- function SidebarTabRow({ tab, active }) {
16
- const focusGlyph = active ? icons.focusBar : " ";
17
- const bg = active ? colors.bgHighlight : undefined;
18
- const bgProp = bg ? { backgroundColor: bg } : {};
19
- const innerPad = " ".repeat(SIDEBAR_INNER_PAD);
20
- // Layout: bar + gap + inner_pad + key + space + label + ... + inner_pad.
21
- // Bar va AFUERA del bg; el bg empieza en inner_pad.
22
- const FOCUS_OUTER = 2;
23
- const used = FOCUS_OUTER +
24
- SIDEBAR_INNER_PAD * 2 +
25
- [...tab.key].length +
26
- 1 +
27
- [...tab.label].length +
28
- (tab.badge ? [...tab.badge].length + 1 : 0) +
29
- (tab.alert ? 2 : 0);
30
- const spacerLen = Math.max(1, SIDEBAR_INNER_WIDTH - used);
31
- const spacer = " ".repeat(spacerLen);
32
- return (_jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: colors.accent, bold: active, children: focusGlyph }), _jsx(Text, { children: " " }), _jsx(Text, { ...bgProp, children: innerPad }), _jsx(Text, { ...bgProp, color: active ? colors.accent : colors.dim, bold: active, children: tab.key }), _jsx(Text, { ...bgProp, children: " " }), _jsx(Text, { ...bgProp, color: active ? colors.bright : colors.text, bold: active, children: tab.label }), _jsx(Text, { ...bgProp, wrap: "truncate-end", children: spacer }), tab.badge ? (_jsx(Text, { ...bgProp, color: active ? colors.accentSoft : colors.mute, children: tab.badge })) : null, tab.alert ? (_jsxs(_Fragment, { children: [_jsx(Text, { ...bgProp, children: " " }), _jsx(Text, { ...bgProp, color: colors.err, children: "\u25CF" })] })) : null, _jsx(Text, { ...bgProp, children: innerPad })] }));
33
- }
34
- function Divider() {
35
- return _jsx(Text, { color: colors.borderFaint, children: "─".repeat(DEFAULT_WIDTH - 2) });
36
- }
37
- //# sourceMappingURL=sidebar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../../../../src/cli/tui/components/sidebar.tsx"],"names":[],"mappings":"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"}
@@ -1,41 +0,0 @@
1
- export type ToastTone = "ok" | "info" | "err";
2
- export interface ToastEntry {
3
- id: number;
4
- tone: ToastTone;
5
- title: string;
6
- body?: string;
7
- /** Duración en ms; default 3200 */
8
- duration?: number;
9
- }
10
- export interface ToastInput {
11
- tone?: ToastTone;
12
- title: string;
13
- body?: string;
14
- duration?: number;
15
- }
16
- /**
17
- * useToasts — hook que mantiene una pila de toasts y expone `push(toast)`.
18
- *
19
- * Auto-elimina cada toast después de `duration` (default 3.2s). El stack se
20
- * renderiza inline encima del footer cuando `toasts.length > 0`.
21
- */
22
- export declare function useToasts(): {
23
- toasts: ToastEntry[];
24
- push: (input: ToastInput) => void;
25
- dismiss: (id: number) => void;
26
- clear: () => void;
27
- };
28
- export interface ToastStackProps {
29
- toasts: ToastEntry[];
30
- /** Máximo de toasts visibles (los más nuevos arriba). Default 3. */
31
- max?: number;
32
- }
33
- /**
34
- * ToastStack — render inline de los toasts activos.
35
- *
36
- * En TTY no podemos posicionar absoluto, así que renderizamos al pie de la
37
- * pantalla (app.tsx coloca esto al final del root). Cada toast es una caja
38
- * con borde left del color del tone + título bold + body dim.
39
- */
40
- export declare function ToastStack({ toasts, max }: ToastStackProps): import("react/jsx-runtime").JSX.Element | null;
41
- //# sourceMappingURL=toast-stack.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toast-stack.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/components/toast-stack.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC;AAE9C,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS;;kBAIU,UAAU;kBAiBV,MAAM;;EASxC;AAcD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,GAAO,EAAE,EAAE,eAAe,kDAoB9D"}
@@ -1,61 +0,0 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- import { Box, Text } from "ink";
3
- import { useCallback, useRef, useState } from "react";
4
- import { colors, icons } from "../theme.js";
5
- /**
6
- * useToasts — hook que mantiene una pila de toasts y expone `push(toast)`.
7
- *
8
- * Auto-elimina cada toast después de `duration` (default 3.2s). El stack se
9
- * renderiza inline encima del footer cuando `toasts.length > 0`.
10
- */
11
- export function useToasts() {
12
- const [toasts, setToasts] = useState([]);
13
- const seq = useRef(0);
14
- const push = useCallback((input) => {
15
- const id = ++seq.current;
16
- const tone = input.tone ?? "info";
17
- const duration = input.duration ?? 3200;
18
- const entry = {
19
- id,
20
- tone,
21
- title: input.title,
22
- duration,
23
- ...(input.body !== undefined ? { body: input.body } : {}),
24
- };
25
- setToasts((prev) => [...prev, entry]);
26
- setTimeout(() => {
27
- setToasts((prev) => prev.filter((t) => t.id !== id));
28
- }, duration);
29
- }, []);
30
- const dismiss = useCallback((id) => {
31
- setToasts((prev) => prev.filter((t) => t.id !== id));
32
- }, []);
33
- const clear = useCallback(() => {
34
- setToasts([]);
35
- }, []);
36
- return { toasts, push, dismiss, clear };
37
- }
38
- const TONE_COLOR = {
39
- ok: colors.success,
40
- info: colors.info,
41
- err: colors.error,
42
- };
43
- const TONE_ICON = {
44
- ok: icons.check,
45
- info: icons.bullet,
46
- err: icons.cross,
47
- };
48
- /**
49
- * ToastStack — render inline de los toasts activos.
50
- *
51
- * En TTY no podemos posicionar absoluto, así que renderizamos al pie de la
52
- * pantalla (app.tsx coloca esto al final del root). Cada toast es una caja
53
- * con borde left del color del tone + título bold + body dim.
54
- */
55
- export function ToastStack({ toasts, max = 3 }) {
56
- if (toasts.length === 0)
57
- return null;
58
- const visible = toasts.slice(-max);
59
- return (_jsx(Box, { flexDirection: "column", marginTop: 1, children: visible.map((t) => (_jsxs(Box, { marginTop: 0, children: [_jsxs(Text, { color: TONE_COLOR[t.tone], bold: true, children: [TONE_ICON[t.tone], " "] }), _jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: colors.fgBright, bold: true, children: t.title }), t.body ? _jsx(Text, { color: colors.fgSubtle, children: t.body }) : null] })] }, t.id))) }));
60
- }
61
- //# sourceMappingURL=toast-stack.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toast-stack.js","sourceRoot":"","sources":["../../../../src/cli/tui/components/toast-stack.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- export type ToastTone = "success" | "error" | "info";
2
- export interface ToastProps {
3
- tone: ToastTone;
4
- message: string;
5
- }
6
- export declare function Toast({ tone, message }: ToastProps): import("react/jsx-runtime").JSX.Element;
7
- //# sourceMappingURL=toast.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/components/toast.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAcD,wBAAgB,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,UAAU,2CASlD"}