@tacuchi/agent-workflow-cli 6.1.0 → 7.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 (191) hide show
  1. package/README.md +65 -12
  2. package/dist/application/profile/profile-service.d.ts +53 -0
  3. package/dist/application/profile/profile-service.d.ts.map +1 -0
  4. package/dist/application/profile/profile-service.js +210 -0
  5. package/dist/application/profile/profile-service.js.map +1 -0
  6. package/dist/application/render/history-row.d.ts.map +1 -1
  7. package/dist/application/render/history-row.js +5 -0
  8. package/dist/application/render/history-row.js.map +1 -1
  9. package/dist/application/self/bootstrap.js +2 -1
  10. package/dist/application/self/bootstrap.js.map +1 -1
  11. package/dist/application/self/detect-hosts.d.ts +18 -0
  12. package/dist/application/self/detect-hosts.d.ts.map +1 -0
  13. package/dist/application/self/detect-hosts.js +37 -0
  14. package/dist/application/self/detect-hosts.js.map +1 -0
  15. package/dist/application/self/install-hooks.d.ts +30 -0
  16. package/dist/application/self/install-hooks.d.ts.map +1 -0
  17. package/dist/application/self/install-hooks.js +253 -0
  18. package/dist/application/self/install-hooks.js.map +1 -0
  19. package/dist/application/self/install-skill.d.ts +2 -0
  20. package/dist/application/self/install-skill.d.ts.map +1 -1
  21. package/dist/application/self/install-skill.js +69 -3
  22. package/dist/application/self/install-skill.js.map +1 -1
  23. package/dist/application/session-close-service.d.ts +10 -0
  24. package/dist/application/session-close-service.d.ts.map +1 -1
  25. package/dist/application/session-close-service.js +87 -10
  26. package/dist/application/session-close-service.js.map +1 -1
  27. package/dist/cli/commands/self.d.ts.map +1 -1
  28. package/dist/cli/commands/self.js +9 -1
  29. package/dist/cli/commands/self.js.map +1 -1
  30. package/dist/cli/commands/session-close.d.ts.map +1 -1
  31. package/dist/cli/commands/session-close.js +11 -0
  32. package/dist/cli/commands/session-close.js.map +1 -1
  33. package/dist/cli/tui/tabs/skills-tab.d.ts.map +1 -1
  34. package/dist/cli/tui/tabs/skills-tab.js +100 -24
  35. package/dist/cli/tui/tabs/skills-tab.js.map +1 -1
  36. package/package.json +2 -2
  37. package/skills/agent-workflow/commands/README.md +24 -0
  38. package/skills/agent-workflow/commands/agent-workflow-compact.md +24 -0
  39. package/skills/agent-workflow/commands/agent-workflow-doctor.md +100 -0
  40. package/skills/agent-workflow/commands/agent-workflow-export-arq.md +77 -0
  41. package/skills/agent-workflow/commands/agent-workflow-export-conclusions.md +78 -0
  42. package/skills/agent-workflow/commands/agent-workflow-export-plan.md +74 -0
  43. package/skills/agent-workflow/commands/agent-workflow-export-qa-note.md +30 -0
  44. package/skills/agent-workflow/commands/agent-workflow-export-report.md +78 -0
  45. package/skills/agent-workflow/commands/agent-workflow-export-requirement.md +30 -0
  46. package/skills/agent-workflow/commands/agent-workflow-export-scripts.md +92 -0
  47. package/skills/agent-workflow/commands/agent-workflow-export-tech-manuals.md +75 -0
  48. package/skills/agent-workflow/commands/agent-workflow-export-tech-note.md +30 -0
  49. package/skills/agent-workflow/commands/agent-workflow-hub-init.md +82 -0
  50. package/skills/agent-workflow/commands/agent-workflow-migrate.md +56 -0
  51. package/skills/agent-workflow/commands/agent-workflow-project-init.md +60 -0
  52. package/skills/agent-workflow/commands/agent-workflow-resume.md +22 -0
  53. package/skills/agent-workflow/commands/agent-workflow-rules.md +40 -0
  54. package/skills/agent-workflow/commands/agent-workflow-session.md +35 -0
  55. package/skills/agent-workflow/doctrine/README.md +15 -0
  56. package/skills/agent-workflow/doctrine/compact/SKILL.md +145 -0
  57. package/skills/agent-workflow/doctrine/doctor/SKILL.md +86 -0
  58. package/skills/agent-workflow/doctrine/doctor/SKILL.md.tmp +0 -0
  59. package/skills/agent-workflow/doctrine/hub-init/SKILL.md +157 -0
  60. package/skills/agent-workflow/doctrine/hub-init/SKILL.md.tmp +0 -0
  61. package/skills/agent-workflow/doctrine/hub-init/references/multiroot-manual.md +51 -0
  62. package/skills/agent-workflow/doctrine/implement/SKILL.md +290 -0
  63. package/skills/agent-workflow/doctrine/implement/references/branch-verification.md +16 -0
  64. package/skills/agent-workflow/doctrine/implement/references/design-md-template.md +108 -0
  65. package/skills/agent-workflow/doctrine/implement/references/rollback-guide.md +81 -0
  66. package/skills/agent-workflow/doctrine/migrate/SKILL.md +281 -0
  67. package/skills/agent-workflow/doctrine/migrate/SKILL.md.tmp +0 -0
  68. package/skills/agent-workflow/doctrine/project-init/SKILL.md +100 -0
  69. package/skills/agent-workflow/doctrine/project-init/SKILL.md.tmp +0 -0
  70. package/skills/agent-workflow/doctrine/refactor/SKILL.md +208 -0
  71. package/skills/agent-workflow/doctrine/refactor/references/refactor-md-template.md +108 -0
  72. package/skills/agent-workflow/doctrine/refactor/references/strangler-checklist.md +116 -0
  73. package/skills/agent-workflow/doctrine/resume/SKILL.md +199 -0
  74. package/skills/agent-workflow/doctrine/rules/SKILL.md +224 -0
  75. package/skills/agent-workflow/doctrine/rules/SKILL.md.tmp +0 -0
  76. package/skills/agent-workflow/doctrine/session/SKILL.md +383 -0
  77. package/skills/agent-workflow/doctrine/session/references/auto-plan-rules.md +63 -0
  78. package/skills/agent-workflow/doctrine/session/references/backlog-template.md +95 -0
  79. package/skills/agent-workflow/doctrine/session/references/branch-verification.md +198 -0
  80. package/skills/agent-workflow/doctrine/session/references/commits-policy.md +111 -0
  81. package/skills/agent-workflow/doctrine/session/references/communication-style.md +50 -0
  82. package/skills/agent-workflow/doctrine/session/references/graduacion-routing.md +88 -0
  83. package/skills/agent-workflow/doctrine/session/references/lifecycle-deep.md +160 -0
  84. package/skills/agent-workflow/doctrine/session/references/prompts/C1-specialty-selection.md +11 -0
  85. package/skills/agent-workflow/doctrine/session/references/prompts/C2-cost-guard.md +14 -0
  86. package/skills/agent-workflow/doctrine/session/references/prompts/M1-closure-commit-prompt.md +104 -0
  87. package/skills/agent-workflow/doctrine/session/references/prompts/M10-next-step.md +17 -0
  88. package/skills/agent-workflow/doctrine/session/references/prompts/M11-context.md +16 -0
  89. package/skills/agent-workflow/doctrine/session/references/prompts/M2-branch-caso-A.md +14 -0
  90. package/skills/agent-workflow/doctrine/session/references/prompts/M3-branch-caso-C.md +33 -0
  91. package/skills/agent-workflow/doctrine/session/references/prompts/M4-cross-source-hard-gate.md +33 -0
  92. package/skills/agent-workflow/doctrine/session/references/prompts/M5-modality-analyze.md +15 -0
  93. package/skills/agent-workflow/doctrine/session/references/prompts/M6-phase-gate.md +31 -0
  94. package/skills/agent-workflow/doctrine/session/references/prompts/M7-refactor-legacy-detected.md +28 -0
  95. package/skills/agent-workflow/doctrine/session/references/prompts/M8-refactor-cleanup.md +16 -0
  96. package/skills/agent-workflow/doctrine/session/references/prompts/M9-contract-review.md +39 -0
  97. package/skills/agent-workflow/doctrine/session/references/prompts/S1-type-design.md +15 -0
  98. package/skills/agent-workflow/doctrine/session/references/prompts/S2-topic-change-detection.md +14 -0
  99. package/skills/agent-workflow/doctrine/session/references/prompts/S3-flow-detection.md +28 -0
  100. package/skills/agent-workflow/doctrine/session/references/prompts/S4-resume.md +27 -0
  101. package/skills/agent-workflow/doctrine/session/references/prompts/S5-post-compact.md +17 -0
  102. package/skills/agent-workflow/doctrine/session/references/prompts/S6-scope.md +16 -0
  103. package/skills/agent-workflow/doctrine/session/references/prompts/S7-design-review.md +37 -0
  104. package/skills/agent-workflow/doctrine/session/references/prompts-catalog.md +210 -0
  105. package/skills/agent-workflow/doctrine/session/references/sandbox-readonly-rules.md +82 -0
  106. package/skills/agent-workflow/doctrine/session/references/specialty-decision-tree.md +56 -0
  107. package/skills/agent-workflow/doctrine/session/references/topic-change-rules.md +67 -0
  108. package/skills/agent-workflow/exports/README.md +15 -0
  109. package/skills/agent-workflow/exports/export-arq/SKILL.md +229 -0
  110. package/skills/agent-workflow/exports/export-arq/SKILL.md.tmp +0 -0
  111. package/skills/agent-workflow/exports/export-arq/references/lexico-tecnico.md +94 -0
  112. package/skills/agent-workflow/exports/export-arq/references/template-c4.md +293 -0
  113. package/skills/agent-workflow/exports/export-arq/references/template-plantuml.puml +77 -0
  114. package/skills/agent-workflow/exports/export-arq/references/template-structurizr.dsl +72 -0
  115. package/skills/agent-workflow/exports/export-arq/references/validations.md +231 -0
  116. package/skills/agent-workflow/exports/export-conclusions/SKILL.md +169 -0
  117. package/skills/agent-workflow/exports/export-conclusions/references/dedup-rules.md +154 -0
  118. package/skills/agent-workflow/exports/export-conclusions/references/template-conclusions.md +158 -0
  119. package/skills/agent-workflow/exports/export-plan/SKILL.md +225 -0
  120. package/skills/agent-workflow/exports/export-plan/references/state-transitions.md +141 -0
  121. package/skills/agent-workflow/exports/export-plan/references/template-plan.md +132 -0
  122. package/skills/agent-workflow/exports/export-qa-note/SKILL.md +31 -0
  123. package/skills/agent-workflow/exports/export-report/SKILL.md +262 -0
  124. package/skills/agent-workflow/exports/export-report/SKILL.md.tmp +0 -0
  125. package/skills/agent-workflow/exports/export-report/references/lexico.md +174 -0
  126. package/skills/agent-workflow/exports/export-report/references/template-a.md +95 -0
  127. package/skills/agent-workflow/exports/export-report/references/template-b.md +221 -0
  128. package/skills/agent-workflow/exports/export-report/references/template-c.md +180 -0
  129. package/skills/agent-workflow/exports/export-report/references/validations.md +255 -0
  130. package/skills/agent-workflow/exports/export-requirement/SKILL.md +31 -0
  131. package/skills/agent-workflow/exports/export-scripts/SKILL.md +324 -0
  132. package/skills/agent-workflow/exports/export-scripts/references/code-scan-recommendations.md +83 -0
  133. package/skills/agent-workflow/exports/export-scripts/references/deprecation-plan.md +80 -0
  134. package/skills/agent-workflow/exports/export-scripts/references/lexico-tecnico.md +80 -0
  135. package/skills/agent-workflow/exports/export-scripts/references/manifest-template.md +253 -0
  136. package/skills/agent-workflow/exports/export-scripts/references/readme-template.md +79 -0
  137. package/skills/agent-workflow/exports/export-scripts/references/theme-handling.md +168 -0
  138. package/skills/agent-workflow/exports/export-scripts/references/validations.md +242 -0
  139. package/skills/agent-workflow/exports/export-tech-manuals/SKILL.md +214 -0
  140. package/skills/agent-workflow/exports/export-tech-manuals/references/lexico-tecnico.md +97 -0
  141. package/skills/agent-workflow/exports/export-tech-manuals/references/template-index.md +123 -0
  142. package/skills/agent-workflow/exports/export-tech-manuals/references/template-manual.md +143 -0
  143. package/skills/agent-workflow/exports/export-tech-manuals/references/validations.md +211 -0
  144. package/skills/agent-workflow/exports/export-tech-note/SKILL.md +31 -0
  145. package/skills/agent-workflow/hooks/README.md +15 -0
  146. package/skills/agent-workflow/hooks/hooks.template.json +90 -0
  147. package/skills/agent-workflow/references/README.md +12 -0
  148. package/skills/agent-workflow/references/legacy-anchors.md +50 -0
  149. package/skills/agent-workflow/references/profile-parametrization.md +88 -0
  150. package/skills/agent-workflow/specialties/README.md +14 -0
  151. package/skills/agent-workflow/specialties/analyze-conclude/SKILL.md +175 -0
  152. package/skills/agent-workflow/specialties/analyze-conclude/references/incident-classification.md +61 -0
  153. package/skills/agent-workflow/specialties/analyze-investigate/SKILL.md +148 -0
  154. package/skills/agent-workflow/specialties/analyze-investigate/SKILL.md.tmp +0 -0
  155. package/skills/agent-workflow/specialties/analyze-investigate/references/cost-guard.md +85 -0
  156. package/skills/agent-workflow/specialties/analyze-synthesize/SKILL.md +127 -0
  157. package/skills/agent-workflow/specialties/design-brief/SKILL.md +90 -0
  158. package/skills/agent-workflow/specialties/design-deliver/SKILL.md +121 -0
  159. package/skills/agent-workflow/specialties/design-develop/SKILL.md +115 -0
  160. package/skills/agent-workflow/specialties/design-discover/SKILL.md +103 -0
  161. package/skills/agent-workflow/standards/README.md +12 -0
  162. package/skills/agent-workflow/standards/coding-standards/SKILL.md +102 -0
  163. package/skills/agent-workflow/standards/coding-standards/SKILL.md.tmp +0 -0
  164. package/skills/agent-workflow/standards/coding-standards/references/angular-typescript.md +266 -0
  165. package/skills/agent-workflow/standards/coding-standards/references/database-conventions.md +170 -0
  166. package/skills/agent-workflow/standards/coding-standards/references/fe-be-integration.md +300 -0
  167. package/skills/agent-workflow/standards/coding-standards/references/frontend-structure.md +182 -0
  168. package/skills/agent-workflow/standards/coding-standards/references/java-spring.md +244 -0
  169. package/skills/agent-workflow/standards/coding-standards/references/project-structure.md +197 -0
  170. package/skills/agent-workflow/standards/frontend-design/SKILL.md +62 -0
  171. package/skills/agent-workflow/standards/frontend-design/references/feedback-toasts-patterns.md +249 -0
  172. package/skills/agent-workflow/standards/frontend-design/references/form-patterns.md +278 -0
  173. package/skills/agent-workflow/standards/frontend-design/references/list-patterns.md +256 -0
  174. package/skills/agent-workflow/standards/frontend-design/references/modal-patterns.md +220 -0
  175. package/skills/agent-workflow/standards/frontend-design/references/navigation-patterns.md +224 -0
  176. package/skills/agent-workflow/standards/redaccion-simple/SKILL.md +128 -0
  177. package/skills/agent-workflow/standards/sql-rollback-generator/SKILL.md +197 -0
  178. package/skills/agent-workflow/standards/sql-rollback-generator/references/irreversible-checklist.md +161 -0
  179. package/skills/agent-workflow/standards/sql-rollback-generator/references/release-rollback.md +131 -0
  180. package/skills/agent-workflow/standards/sql-rollback-generator/references/rollback-patterns.md +255 -0
  181. package/skills/agent-workflow/standards/sql-script-organizer/SKILL.md +244 -0
  182. package/skills/agent-workflow/standards/sql-script-organizer/references/bundle-readme-template.md +82 -0
  183. package/skills/agent-workflow/standards/sql-script-organizer/references/categorization-rules.md +122 -0
  184. package/skills/agent-workflow/standards/sql-script-organizer/references/consolidation-cross-session.md +125 -0
  185. package/skills/agent-workflow/standards/sql-script-organizer/references/scripts-sql-format.md +140 -0
  186. package/skills/agent-workflow/standards/testing-strategy/SKILL.md +113 -0
  187. package/skills/agent-workflow/standards/testing-strategy/references/test-levels.md +255 -0
  188. package/skills/agent-workflow/workflows/README.md +12 -0
  189. package/skills/agent-workflow/workflows/analyze-workflow/SKILL.md +107 -0
  190. package/skills/agent-workflow/workflows/design-workflow/SKILL.md +100 -0
  191. package/skills/agent-workflow/workflows/dev-workflow/SKILL.md +195 -0
@@ -0,0 +1,140 @@
1
+ # SCRIPTS.sql — spec canónica del archivo
2
+
3
+ Spec del archivo único `SCRIPTS.sql` que vive en `.workflow/sessions/<folder>/` desde `sql-script-organizer` v1.0.0 (decisión F-D + G1 de session062).
4
+
5
+ ## Path canónico
6
+
7
+ ```
8
+ .workflow/sessions/sessionXXX-<flow>-<slug>/SCRIPTS.sql
9
+ ```
10
+
11
+ - Filename: **SCRIPTS.sql** en mayúsculas (uppercase EN, igual que CHECKPOINT.md, TASKS.md, etc.).
12
+ - Encoding: UTF-8 sin BOM.
13
+ - Line endings: LF.
14
+
15
+ ## Estructura del archivo
16
+
17
+ ```sql
18
+ -- ============================================================================
19
+ -- SCRIPTS.sql — sessionXXX-<flow>-<slug>
20
+ -- ============================================================================
21
+ -- Consolida todas las sentencias SQL aplicadas durante esta sesión.
22
+ -- Markers @category y @stmt los lee /agent-workflow:export-scripts para separar el bundle.
23
+ -- ----------------------------------------------------------------------------
24
+
25
+ BEGIN;
26
+
27
+ -- @category: 01-ddl-tablas
28
+ -- @stmt: 001-crear-tabla-usuarios
29
+ CREATE TABLE IF NOT EXISTS esq_credito.tb_usuarios (
30
+ id BIGSERIAL PRIMARY KEY,
31
+ cod_usuario VARCHAR(20) NOT NULL UNIQUE,
32
+ estado CHAR(1) NOT NULL DEFAULT 'A'
33
+ );
34
+
35
+ -- @category: 02-ddl-funciones
36
+ -- @stmt: 002-fn-obtener-usuario
37
+ CREATE OR REPLACE FUNCTION esq_credito.fn_obtener_usuario(p_cod VARCHAR)
38
+ RETURNS TABLE(...)
39
+ LANGUAGE plpgsql AS $$
40
+ BEGIN
41
+ ...
42
+ END;
43
+ $$;
44
+
45
+ -- @category: 04-inserts
46
+ -- @stmt: 003-insert-usuarios-seed
47
+ INSERT INTO esq_credito.tb_usuarios (cod_usuario, estado)
48
+ VALUES ('admin', 'A'), ('soporte', 'A')
49
+ ON CONFLICT (cod_usuario) DO NOTHING;
50
+
51
+ COMMIT;
52
+ ```
53
+
54
+ ## Markers
55
+
56
+ ### `@category` — obligatorio
57
+
58
+ Clasifica la sentencia para la separación post-hoc en el bundle export-scripts:
59
+
60
+ | Marker | Patrones de detección |
61
+ |---|---|
62
+ | `01-ddl-tablas` | `CREATE TABLE`, `DROP TABLE`, `ALTER TABLE`, `CREATE INDEX`, `CREATE SEQUENCE` |
63
+ | `02-ddl-funciones` | `CREATE [OR REPLACE] FUNCTION`, `CREATE [OR REPLACE] PROCEDURE`, `DROP FUNCTION`, `DROP PROCEDURE` |
64
+ | `03-migracion` | `UPDATE`, `INSERT ... SELECT ...`, `DELETE` sobre datos existentes |
65
+ | `04-inserts` | `INSERT INTO ... VALUES`, seeds de catálogos, datos de configuración inicial |
66
+
67
+ Valor exacto, lowercase. Una categoría por marker (no listas).
68
+
69
+ ### `@stmt` — obligatorio
70
+
71
+ Slug determinístico para que `export-scripts` derive el filename del archivo separado:
72
+
73
+ - Formato: `NNN-verbo-objetivo` (3 dígitos + kebab-case, ≤5 palabras útiles).
74
+ - Único dentro del SCRIPTS.sql.
75
+ - Orden cronológico recomendado pero NO requerido (export-scripts ordena por categoría al separar).
76
+ - Ejemplo: `001-crear-tabla-usuarios`, `015-poblar-catalogo-roles`.
77
+
78
+ ### `@objeto` y `@alcance` — opcionales
79
+
80
+ Si la sentencia merece doc:
81
+
82
+ ```sql
83
+ -- @category: 01-ddl-tablas
84
+ -- @stmt: 001-crear-tabla-usuarios
85
+ -- @objeto: Tabla central de identidades. UNIQUE en cod_usuario.
86
+ -- @alcance: solo esq_credito; trigger de auditoría en sesión separada.
87
+ CREATE TABLE ...
88
+ ```
89
+
90
+ `export-scripts` usa estos al generar el header canónico del archivo separado.
91
+
92
+ ## Reglas de idempotencia
93
+
94
+ Cada sentencia debe ser idempotente:
95
+
96
+ - **DDL**: `CREATE TABLE IF NOT EXISTS`, `DROP ... IF EXISTS`, `CREATE OR REPLACE`.
97
+ - **Inserts**: `ON CONFLICT (...) DO NOTHING` o `ON CONFLICT DO UPDATE`.
98
+ - **Migraciones de datos**: backup en `esq_audit.tb_bkp_<x>_sNNN` antes de UPDATE/DELETE masivo; ver `sql-rollback-generator` para política.
99
+ - **Funciones**: `CREATE OR REPLACE FUNCTION` siempre.
100
+
101
+ Re-ejecutar el archivo completo no debe fallar.
102
+
103
+ ## Transaccionalidad
104
+
105
+ `BEGIN;` al inicio del archivo, `COMMIT;` al final. **Una sola transacción** global por sesión.
106
+
107
+ Si una sentencia requiere transacción aparte (ej. `CREATE INDEX CONCURRENTLY`), comentar con `-- @transaction: none` y mover fuera del BEGIN/COMMIT global. Casos raros; documentar.
108
+
109
+ ## Concatenación con sessions previas
110
+
111
+ `SCRIPTS.sql` representa **lo que esta sesión cambia**. NO incluye:
112
+ - Scripts heredados de sesiones previas (esos ya viven en sus propios SCRIPTS.sql).
113
+ - Scripts del baseline del workspace.
114
+
115
+ `export-scripts` con `--sessions NNN,MMM` combina varios SCRIPTS.sql en el bundle final.
116
+
117
+ ## Edición durante la sesión
118
+
119
+ Permitido:
120
+ - Append de nuevas sentencias al final (antes del COMMIT).
121
+ - Editar sentencias existentes para corregir (preservar `@stmt` del statement; el slug es estable).
122
+ - Eliminar sentencias descartadas (no preservar history en backlog SQL; usar `BACKLOG.md` para anotar lo descartado).
123
+
124
+ No permitido:
125
+ - Reordenar sentencias por estética (orden = cronológico). Si el orden de ejecución importa, dejarlo al separador post-hoc.
126
+ - Mezclar 2 sentencias en un solo bloque marker (un `@stmt` = una sentencia).
127
+
128
+ ## Verificación pre-cierre
129
+
130
+ Antes de cerrar la sesión:
131
+ 1. `agent-workflow session-artifacts --code NNN` reporta `scripts_sql_present: true` (si esperabas SQL).
132
+ 2. El archivo abre con `BEGIN;` y cierra con `COMMIT;`.
133
+ 3. Cada sentencia tiene `@category` y `@stmt`.
134
+ 4. Re-ejecutar el archivo en cert no falla (manual; el AI nunca ejecuta).
135
+
136
+ ## Migración desde layout legacy
137
+
138
+ Si la sesión tiene `scripts/01-ddl-tablas/*.sql` etc. (layout pre-v1.0.0), invocar `/agent-workflow:migrate --upgrade-topology`. El skill `migrate` lee los archivos en orden 01→04, concatena en SCRIPTS.sql con markers `@category` derivado de la carpeta y `@stmt` del filename original. Idempotente: si ya existe SCRIPTS.sql, no sobreescribe.
139
+
140
+ Ver `agent-workflow/skills/migrate/SKILL.md` capability 11.
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: testing-strategy
3
+ description: Skill de referencia para la estrategia de testing (selección de niveles unit/integración/e2e, comandos de ejecución por stack). Invocado internamente por el skill session durante la Fase 4 (validación). No se activa por lenguaje natural.
4
+ version: 0.1.0
5
+ ---
6
+
7
+ # Testing Strategy
8
+
9
+ Gestión de niveles de prueba flexibles dentro de sesiones de desarrollo. El usuario elige el nivel en cualquier momento y puede cambiarlo durante la sesión. Los niveles se adaptan al stack detectado del proyecto.
10
+
11
+ ## Regla de ejecución
12
+
13
+ Por defecto, no ejecutar pruebas automáticamente. Primero preguntar si:
14
+ - el usuario quiere que el plugin las ejecute
15
+ - el usuario las correrá manualmente
16
+ - no hace falta correrlas en esta sesión
17
+
18
+ (Salvo `Validation mode: auto` en `~/.workflow/user-config.md`.)
19
+
20
+ ## Niveles de prueba — Backend (Spring Boot / Java)
21
+
22
+ ### Nivel a) Unitarios
23
+ - **Framework:** JUnit 5 + Mockito
24
+ - **Alcance:** Lógica de negocio aislada (services, utils, mappers)
25
+ - **Cuándo usarlo:** Fix rápido, cambio puntual, lógica sin dependencias externas
26
+ - **Comando:** `./mvnw test -Dtest=ClaseTest` (Windows: `mvnw.cmd test`)
27
+
28
+ ### Nivel b) Unitarios + API
29
+ - **Framework:** JUnit 5 + Mockito + MockMvc
30
+ - **Alcance:** Nivel a) + Controllers (endpoints REST)
31
+ - **Cuándo usarlo:** Endpoint nuevo o modificado
32
+ - **Comando:** `./mvnw test`
33
+
34
+ ### Nivel c) Completo
35
+ - **Framework:** JUnit 5 + Mockito + MockMvc + @SpringBootTest
36
+ - **Alcance:** Nivel b) + Tests de integración con contexto Spring completo
37
+ - **Cuándo usarlo:** Feature completa, flujo crítico, integración entre capas
38
+ - **Comando:** `./mvnw verify`
39
+
40
+ ## Niveles de prueba — Frontend (Angular)
41
+
42
+ ### Nivel a) Unitarios
43
+ - **Framework:** Jasmine + Karma (o Jest según config)
44
+ - **Alcance:** Services, pipes, utils aislados
45
+ - **Comando:** `ng test --watch=false`
46
+
47
+ ### Nivel b) Unitarios + Componentes
48
+ - **Framework:** Jasmine + TestBed + ComponentFixture
49
+ - **Alcance:** Nivel a) + componentes con template rendering
50
+ - **Comando:** `ng test --watch=false`
51
+
52
+ ### Nivel c) Completo
53
+ - **Framework:** Nivel b) + tests e2e (Cypress/Playwright si está configurado)
54
+ - **Alcance:** Flujos completos de usuario
55
+ - **Comando:** `npm run e2e` o según configuración del proyecto
56
+
57
+ ## Selección de nivel
58
+
59
+ Preguntar al usuario solo cuando realmente se vaya a validar desde el plugin. Adaptar las opciones al stack:
60
+
61
+ **Backend:**
62
+ ```
63
+ ¿Qué nivel de pruebas aplicamos?
64
+ a) Unitarios — JUnit 5 + Mockito (rápido)
65
+ b) Unitarios + API — + MockMvc controllers
66
+ c) Completo — + @SpringBootTest integración
67
+ ```
68
+
69
+ **Frontend:**
70
+ ```
71
+ ¿Qué nivel de pruebas aplicamos?
72
+ a) Unitarios — Services y pipes aislados
73
+ b) Unitarios + Componentes — + TestBed rendering
74
+ c) Completo — + e2e si está configurado
75
+ ```
76
+
77
+ El usuario puede cambiar de nivel en cualquier momento o decidir no ejecutar pruebas desde el plugin.
78
+
79
+ ## Convenciones de nomenclatura
80
+
81
+ **Java:** Clase `[Objetivo]Test.java`, método `[metodo]_[escenario]_[resultado]`. Estructura Arrange-Act-Assert.
82
+ **Angular:** Archivo `[nombre].spec.ts`, bloques `describe`/`it`. Usar TestBed para componentes.
83
+
84
+ Para ejemplos completos de código, consultar `references/test-levels.md`.
85
+
86
+ ## Ejecución y registro
87
+
88
+ 1. Confirmar primero que el usuario quiere ejecución desde el plugin
89
+ 2. Ejecutar el comando según stack y nivel
90
+ 3. Registrar en `TEST_LOG.md` solo si el usuario pidió registro formal o la ejecución se hizo desde el plugin
91
+ 4. Si el usuario ya validó manualmente, no repetir por defecto; anotar una línea breve solo si aporta trazabilidad
92
+ 5. Si hay fallos y el usuario quiere continuar, corregir y re-ejecutar
93
+
94
+ ## Detección automática de comando
95
+
96
+ 1. `mvnw`/`mvnw.cmd` → `./mvnw test` (nunca `mvn` directo)
97
+ 2. `gradlew` → `./gradlew test`
98
+ 3. `angular.json` → `ng test --watch=false`
99
+ 4. `package.json` con script test → `npm test`
100
+ 5. Si el bloque `AW-PROJECT → Stack` declara un override de build o wrapper distinto, usarlo.
101
+
102
+ ## Sandbox read-only
103
+
104
+ Canon universal en `../session/references/sandbox-readonly-rules.md`. Esta skill es read-only por diseño — selecciona niveles de test y resuelve comandos por stack, no ejecuta tests ni edita código fuente.
105
+
106
+ En plan mode: describir en el plan file qué niveles aplicarían (unit / integración / e2e), el comando resuelto (`./mvnw test`, `ng test --watch=false`, `npm test`, etc.) y los refs de ejemplos por stack. NO ejecuta `Bash` con el test runner, NO escribe TEST_LOG.md ni código de tests por sí misma.
107
+
108
+ Compatible con plan mode sin restricciones adicionales.
109
+
110
+ ## Recursos adicionales
111
+
112
+ ### Archivos de referencia
113
+ - **`references/test-levels.md`** — Ejemplos completos de código por stack y nivel, patrones TestBuilder, resumen de comandos
@@ -0,0 +1,255 @@
1
+ # Niveles de test — Referencia completa
2
+
3
+ ## Backend (Spring Boot / Java)
4
+
5
+ ### Nivel a) Unitarios — Ejemplo completo
6
+
7
+ ```java
8
+ @ExtendWith(MockitoExtension.class)
9
+ class NotificacionServiceTest {
10
+
11
+ @Mock
12
+ private EmailProvider emailProvider;
13
+
14
+ @Mock
15
+ private NotificacionRepository repository;
16
+
17
+ private NotificacionService service;
18
+
19
+ @BeforeEach
20
+ void setUp() {
21
+ // Constructor Injection (mismo patrón que producción)
22
+ service = new NotificacionService(emailProvider, repository);
23
+ }
24
+
25
+ @Test
26
+ void enviar_conEmailValido_retornaExito() {
27
+ // Arrange — record como DTO
28
+ var request = new NotificacionRequest("user@example.com", "Aprobación", "aprobacion", Map.of());
29
+ when(emailProvider.send(any())).thenReturn(true);
30
+
31
+ // Act
32
+ var resultado = service.enviar(request);
33
+
34
+ // Assert
35
+ assertThat(resultado).isTrue();
36
+ verify(emailProvider).send(any());
37
+ }
38
+
39
+ @Test
40
+ void enviar_sinDestinatario_lanzaBadRequest() {
41
+ var request = new NotificacionRequest(null, "Asunto", "template", Map.of());
42
+
43
+ assertThatThrownBy(() -> service.enviar(request))
44
+ .isInstanceOf(BadRequestException.class)
45
+ .hasMessageContaining("destinatario");
46
+ }
47
+
48
+ @Test
49
+ void enviar_proveedorFalla_registraError() {
50
+ var request = new NotificacionRequest("user@example.com", "Asunto", "template", Map.of());
51
+ when(emailProvider.send(any())).thenThrow(new RuntimeException("SMTP error"));
52
+
53
+ var resultado = service.enviar(request);
54
+
55
+ assertThat(resultado).isFalse();
56
+ verify(repository).guardarLog(any());
57
+ }
58
+ }
59
+ ```
60
+
61
+ Ejecutar con: `./mvnw test -Dtest=NotificacionServiceTest` (Windows: `mvnw.cmd test`)
62
+
63
+ ### Nivel b) Unitarios + API — Ejemplo MockMvc
64
+
65
+ ```java
66
+ @WebMvcTest(NotificacionController.class)
67
+ class NotificacionControllerTest {
68
+
69
+ @Autowired
70
+ private MockMvc mockMvc;
71
+
72
+ @MockBean
73
+ private NotificacionService service;
74
+
75
+ @Test
76
+ void enviar_conDatosValidos_retorna200() throws Exception {
77
+ when(service.enviar(any())).thenReturn(true);
78
+
79
+ // Request body usa record NotificacionRequest
80
+ mockMvc.perform(post("/api/v1/notificaciones/enviar")
81
+ .contentType(MediaType.APPLICATION_JSON)
82
+ .content("{\"destinatario\":\"user@example.com\",\"asunto\":\"Test\",\"templateId\":\"aprobacion\"}"))
83
+ .andExpect(status().isOk());
84
+ }
85
+
86
+ @Test
87
+ void enviar_sinBody_retorna400() throws Exception {
88
+ mockMvc.perform(post("/api/v1/notificaciones/enviar")
89
+ .contentType(MediaType.APPLICATION_JSON))
90
+ .andExpect(status().isBadRequest());
91
+ }
92
+ }
93
+ ```
94
+
95
+ Ejecutar con: `./mvnw test`
96
+
97
+ ### Nivel c) Completo — Ejemplo @SpringBootTest
98
+
99
+ ```java
100
+ @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
101
+ @AutoConfigureMockMvc
102
+ @Transactional
103
+ class NotificacionIntegrationTest {
104
+
105
+ @Autowired
106
+ private MockMvc mockMvc;
107
+
108
+ @Autowired
109
+ private NotificacionRepository repository;
110
+
111
+ @Test
112
+ void flujoCompleto_enviarYRegistrar_persisteLog() throws Exception {
113
+ mockMvc.perform(post("/api/v1/notificaciones/enviar")
114
+ .contentType(MediaType.APPLICATION_JSON)
115
+ .content("{\"destinatario\":\"user@example.com\",\"asunto\":\"Test\"}"))
116
+ .andExpect(status().isOk());
117
+
118
+ var logs = repository.findByDestinatario("user@example.com");
119
+ assertThat(logs).isNotEmpty();
120
+ }
121
+ }
122
+ ```
123
+
124
+ Ejecutar con: `./mvnw verify`
125
+
126
+ ## Frontend (Angular)
127
+
128
+ ### Nivel a) Unitarios — Service aislado
129
+
130
+ ```typescript
131
+ describe('AuthService', () => {
132
+ let service: AuthService;
133
+ let httpMock: HttpTestingController;
134
+
135
+ beforeEach(() => {
136
+ TestBed.configureTestingModule({
137
+ imports: [HttpClientTestingModule],
138
+ providers: [AuthService]
139
+ });
140
+ service = TestBed.inject(AuthService);
141
+ httpMock = TestBed.inject(HttpTestingController);
142
+ });
143
+
144
+ afterEach(() => httpMock.verify());
145
+
146
+ it('should return token on login', () => {
147
+ service.login('admin', 'pass').subscribe(res => {
148
+ expect(res.token).toBeTruthy();
149
+ });
150
+
151
+ const req = httpMock.expectOne('/api/auth/login');
152
+ req.flush({ token: 'abc123' });
153
+ });
154
+
155
+ it('should handle login error', () => {
156
+ service.login('bad', 'creds').subscribe({
157
+ error: err => expect(err.status).toBe(401)
158
+ });
159
+
160
+ const req = httpMock.expectOne('/api/auth/login');
161
+ req.flush('Unauthorized', { status: 401, statusText: 'Unauthorized' });
162
+ });
163
+ });
164
+ ```
165
+
166
+ Ejecutar con: `ng test --watch=false`
167
+
168
+ ### Nivel b) Unitarios + Componentes — TestBed
169
+
170
+ ```typescript
171
+ describe('FiltrosComponent', () => {
172
+ let component: FiltrosComponent;
173
+ let fixture: ComponentFixture<FiltrosComponent>;
174
+
175
+ beforeEach(async () => {
176
+ await TestBed.configureTestingModule({
177
+ imports: [FiltrosComponent, NoopAnimationsModule]
178
+ }).compileComponents();
179
+ fixture = TestBed.createComponent(FiltrosComponent);
180
+ component = fixture.componentInstance;
181
+ fixture.detectChanges();
182
+ });
183
+
184
+ it('should create', () => {
185
+ expect(component).toBeTruthy();
186
+ });
187
+
188
+ it('should render date inputs', () => {
189
+ const compiled = fixture.nativeElement;
190
+ expect(compiled.querySelector('input[type="date"]')).toBeTruthy();
191
+ });
192
+
193
+ it('should emit on filter apply', () => {
194
+ spyOn(component.filtroChanged, 'emit');
195
+ component.filtroForm.patchValue({ estado: 'ACTIVO' });
196
+ component.aplicarFiltro();
197
+ expect(component.filtroChanged.emit).toHaveBeenCalledWith(
198
+ jasmine.objectContaining({ estado: 'ACTIVO' })
199
+ );
200
+ });
201
+ });
202
+ ```
203
+
204
+ ## TestBuilder — Patrón (Java)
205
+
206
+ ```java
207
+ public class NotificacionTestBuilder {
208
+ private Long id = 1L;
209
+ private String destinatario = "test@example.com";
210
+ private String asunto = "Test";
211
+ private String estado = "PENDIENTE";
212
+ private LocalDateTime fechaCreacion = LocalDateTime.now();
213
+
214
+ public static NotificacionTestBuilder builder() {
215
+ return new NotificacionTestBuilder();
216
+ }
217
+
218
+ public NotificacionTestBuilder destinatario(String val) {
219
+ this.destinatario = val;
220
+ return this;
221
+ }
222
+
223
+ public NotificacionTestBuilder estado(String val) {
224
+ this.estado = val;
225
+ return this;
226
+ }
227
+
228
+ public Notificacion build() {
229
+ var entity = new Notificacion();
230
+ entity.setId(id);
231
+ entity.setDestinatario(destinatario);
232
+ entity.setAsunto(asunto);
233
+ entity.setEstado(estado);
234
+ entity.setFechaCreacion(fechaCreacion);
235
+ return entity;
236
+ }
237
+ }
238
+ ```
239
+
240
+ ## Resumen de comandos por stack
241
+
242
+ ### Spring Boot (Maven wrapper)
243
+ - Nivel a: `./mvnw test -Dtest=ClaseTest`
244
+ - Nivel b: `./mvnw test`
245
+ - Nivel c: `./mvnw verify`
246
+ - Windows: usar `mvnw.cmd` en lugar de `./mvnw`
247
+
248
+ ### Angular
249
+ - Nivel a/b: `ng test --watch=false`
250
+ - Nivel c: `npm run e2e` (si configurado)
251
+
252
+ ### Gradle
253
+ - Nivel a: `./gradlew test --tests ClaseTest`
254
+ - Nivel b: `./gradlew test`
255
+ - Nivel c: `./gradlew integrationTest` (o `check`)
@@ -0,0 +1,12 @@
1
+ # workflows/
2
+
3
+ Flows del lifecycle: cómo se mueve una sesión por sus fases.
4
+
5
+ Contenido esperado (T2 PR2):
6
+
7
+ - `dev-workflow.md` — planning → execution → validation → closure; M1 ask antes de commit; gates por fase.
8
+ - `design-workflow.md` — discovery → design → spec → closure; produce DELIVERY.md graduable.
9
+ - `analyze-workflow.md` — discovery → evidence → findings → conclusions; produce CONCLUSIONS.md.
10
+ - `core-workflow.md` — sub-flow agnóstico embebido en los 3 anteriores (artefactos comunes).
11
+
12
+ Cada workflow declara: phases, artefactos requeridos, prompts (M1/M10/S2/S3/S6/S7) y transitions válidas.
@@ -0,0 +1,107 @@
1
+ ---
2
+ name: analyze-workflow
3
+ description: Workflow especializado analyze (especialidad investigación read-only), antes en qtc-analyze. Consumido por /agent-workflow:session cuando flow=analyze para orquestar el lifecycle universal con composición analyze-específica según modalidad.
4
+ version: 2.1.0
5
+ flow: analyze
6
+ workflow_schema: 1.0
7
+ ---
8
+
9
+ # Analyze Workflow
10
+
11
+ Workflow declarativo del flow=analyze. Define dos modos:
12
+
13
+ - **Standalone** (`/agent-workflow:use`): investigación puntual sin sesión.
14
+ - **Orchestrated** (consumido por `/agent-workflow:session` con flow=analyze): orquesta investigación + síntesis + recomendación según modalidad.
15
+
16
+ ## Brief
17
+
18
+ **flow=analyze** es la especialidad de investigación **read-only** del plugin qtc. No edita código ni muta BD. Produce `CONCLUSIONS.md` consumible por flow=dev vía handoff.
19
+
20
+ **Política de commits**: ver `agent-workflow:commits-policy` (canónico). El flow=analyze es read-only por construcción; cuando el usuario solicita un commit (típicamente al cierre, pero puede ser en otra fase si edita artefactos), aplica Regla 3 propose-then-execute universal con M1.
21
+
22
+ **Política sin fallback al CLI (transversal al flow=analyze)**: si `agent-workflow <subcmd>` falla (no está en PATH, comando no reconocido, exit code != 0), **cortá la acción y reportá al usuario**: pedile que verifique `npm install -g @tacuchi/agent-workflow-cli`. No hay flujo alternativo Python.
23
+
24
+ ### Rama base (canon v3.5+)
25
+
26
+ Las sesiones `flow=analyze` resuelven la rama esperada de cada fuente como `main_branch` (default `certificacion`) cuando NO se declaran branches en la sesión. Razón: el análisis necesita reflejar producción, no una rama de feature.
27
+
28
+ - Si el repo de la fuente está en otra rama, el lifecycle dispara el flujo proactivo de verificación (Caso A o B según `dirty`) y bloquea avance hasta resolver.
29
+ - Si durante la investigación el usuario decide **editar** código, se aplica **Caso C** (`agent-workflow/skills/session/references/branch-verification.md`): preguntar nombre de la rama de trabajo, ofrecer `checkout` (existe) o `checkout -b` desde `main_branch` (no existe), y registrar en AW-PROJECT.Status. El skill `analyze-workflow` no edita por sí mismo; la decisión de editar implica un handoff o cambio de flow.
30
+ - Override explícito al crear la sesión: `--branches alias:rama` declarado gana sobre el default `main_branch`. Útil cuando se quiere analizar contra una rama puntual (ej. una feature en validación).
31
+
32
+ Skills disponibles:
33
+ - **analyze-synthesize**: estructura información en plan/hallazgos (exportada cross-flow, **clave** invocada por agent-workflow:session en planning).
34
+ - **analyze-investigate**: recolección de evidencia divergente con cost guard (exportada).
35
+ - **analyze-conclude**: cierre del análisis con `CONCLUSIONS.md` modulado por `## Modality` (technical/incident/data). Una sola skill, una sola estructura.
36
+
37
+ Diferencia clave de **modalidad** (embebida como `## Modality` en CONCLUSIONS.md):
38
+ - `technical` (legacy: `tecnica`): pregunta arquitectónica/diseño → cuerpo modulado como propuesta (opciones consideradas + decisión recomendada).
39
+ - `data` (legacy: `datos`): análisis cuantitativo → cuerpo modulado como informe (hallazgos numéricos + interpretación + acciones sugeridas).
40
+ - `incident` (legacy: `incidente`): post-mortem retrospectivo → cuerpo modulado con timeline + causa raíz + impacto + acciones preventivas.
41
+
42
+ CONCLUSIONS.md vive en la sesión por default. Gradúa opt-in con `kind=conclusion` a `docs/conclusiones/`.
43
+
44
+ ## Standalone (use)
45
+
46
+ Cuando el usuario invoca `/agent-workflow:use`:
47
+
48
+ 1. **Presentarse**: mostrar este Brief + warning read-only.
49
+ 2. **Preguntar modalidad** vía `AskUserQuestion`. Spec literal (header `modality`, 3 opciones technical/data/incident con descripción) → `agent-workflow:prompts-catalog#M5`. La modalidad determina la modulación del cuerpo del CONCLUSIONS.md (estructura única, contenido modulado):
50
+ - **Technical** → cuerpo modulado como propuesta.
51
+ - **Data** → cuerpo modulado como informe de análisis.
52
+ - **Incident** → cuerpo modulado como post-mortem.
53
+ 3. **Preguntar scope**:
54
+ - "¿Sobre qué código/sistema/datos investigar?"
55
+ - "¿Hay un incidente concreto a clasificar?"
56
+ - "¿Hay datos previos o BD a consultar?"
57
+ 4. **Detectar contexto**:
58
+ - AW-PROJECT con fuentes (read-only sobre los repos declarados).
59
+ - MCP servers `<mcp-cert>`/`<mcp-prod>` disponibles para consultas BD (read-only).
60
+ - Cost guard activo para consultas pesadas.
61
+ 5. **Path del artefacto**: `.workflow/sessions/<folder>/CONCLUSIONS.md`. Si el usuario decide graduar al cierre, destino = `docs/conclusiones/NNN-<slug>.md` (kind=`conclusion`, opt-in).
62
+ 6. **Cargar skill `analyze-conclude`** independientemente de la modalidad (el skill es único y modula por contenido).
63
+
64
+ **Reglas standalone**:
65
+ - **Read-only estricto**: no editar código del repo, no mutar BD, no escribir scripts SQL.
66
+ - **NO crear sesión** ni escribir en `.workflow/sessions/`.
67
+ - **NO requiere AW-PROJECT** (si existe, enriquece con fuentes para investigar).
68
+ - **Cost guard**: si el usuario quiere queries pesadas o investigación cross-repo extensa, advertir antes de proceder.
69
+ - **Sugerir sesión** si la investigación es multi-fase (investigate + synthesize + recomendar) — más coherente como sesión.
70
+
71
+ ## Session integration
72
+
73
+ Cuando agent-workflow:session consume este workflow durante `/agent-workflow:session create` con flow=analyze:
74
+
75
+ ### Args al crear sesión
76
+
77
+ - modality: technical|data|incident (obligatorio; determina graduación + template). Legacy ES `tecnica|datos|incidente` se acepta y normaliza.
78
+
79
+ ### Artefactos por fase
80
+
81
+ - planning: OBJECTIVE.md, TASKS.md
82
+ - execution: EVIDENCE.md, FINDINGS.md, queries/, CONCLUSIONS.md
83
+ - validation: review de CONCLUSIONS
84
+ - closure: opt-in graduación de CONCLUSIONS.md a `docs/conclusiones/` (default: queda en sesión)
85
+
86
+ ### Skills por fase
87
+
88
+ - planning: analyze-synthesize (estructurar plan)
89
+ - execution: analyze-investigate (recolectar evidencia), analyze-synthesize (sintetizar findings)
90
+ - closure: analyze-conclude (produce CONCLUSIONS.md modulado por modalidad)
91
+
92
+ ### Refs HISTORY
93
+
94
+ - conclusion: docs/conclusiones/{val}.md (cuando se gradúa opt-in)
95
+
96
+ ### Conteos resume
97
+
98
+ - evidence: EVIDENCE.md presente
99
+ - findings: FINDINGS.md presente
100
+ - conclusions: CONCLUSIONS.md presente
101
+ - queries: queries/*.sql count
102
+
103
+ ## Sandbox read-only
104
+
105
+ Standalone: en plan mode describir modalidad, scope, paths sugeridos. No ejecutar queries ni leer BD.
106
+
107
+ Orchestrated: ver `agent-workflow:session` plan mode rules.