@tacuchi/agent-workflow-cli 6.2.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 (181) 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/self/bootstrap.js +2 -1
  7. package/dist/application/self/bootstrap.js.map +1 -1
  8. package/dist/application/self/detect-hosts.d.ts +18 -0
  9. package/dist/application/self/detect-hosts.d.ts.map +1 -0
  10. package/dist/application/self/detect-hosts.js +37 -0
  11. package/dist/application/self/detect-hosts.js.map +1 -0
  12. package/dist/application/self/install-hooks.d.ts +30 -0
  13. package/dist/application/self/install-hooks.d.ts.map +1 -0
  14. package/dist/application/self/install-hooks.js +253 -0
  15. package/dist/application/self/install-hooks.js.map +1 -0
  16. package/dist/application/self/install-skill.d.ts +2 -0
  17. package/dist/application/self/install-skill.d.ts.map +1 -1
  18. package/dist/application/self/install-skill.js +69 -3
  19. package/dist/application/self/install-skill.js.map +1 -1
  20. package/dist/cli/commands/self.d.ts.map +1 -1
  21. package/dist/cli/commands/self.js +9 -1
  22. package/dist/cli/commands/self.js.map +1 -1
  23. package/dist/cli/tui/tabs/skills-tab.d.ts.map +1 -1
  24. package/dist/cli/tui/tabs/skills-tab.js +100 -24
  25. package/dist/cli/tui/tabs/skills-tab.js.map +1 -1
  26. package/package.json +2 -2
  27. package/skills/agent-workflow/commands/README.md +24 -0
  28. package/skills/agent-workflow/commands/agent-workflow-compact.md +24 -0
  29. package/skills/agent-workflow/commands/agent-workflow-doctor.md +100 -0
  30. package/skills/agent-workflow/commands/agent-workflow-export-arq.md +77 -0
  31. package/skills/agent-workflow/commands/agent-workflow-export-conclusions.md +78 -0
  32. package/skills/agent-workflow/commands/agent-workflow-export-plan.md +74 -0
  33. package/skills/agent-workflow/commands/agent-workflow-export-qa-note.md +30 -0
  34. package/skills/agent-workflow/commands/agent-workflow-export-report.md +78 -0
  35. package/skills/agent-workflow/commands/agent-workflow-export-requirement.md +30 -0
  36. package/skills/agent-workflow/commands/agent-workflow-export-scripts.md +92 -0
  37. package/skills/agent-workflow/commands/agent-workflow-export-tech-manuals.md +75 -0
  38. package/skills/agent-workflow/commands/agent-workflow-export-tech-note.md +30 -0
  39. package/skills/agent-workflow/commands/agent-workflow-hub-init.md +82 -0
  40. package/skills/agent-workflow/commands/agent-workflow-migrate.md +56 -0
  41. package/skills/agent-workflow/commands/agent-workflow-project-init.md +60 -0
  42. package/skills/agent-workflow/commands/agent-workflow-resume.md +22 -0
  43. package/skills/agent-workflow/commands/agent-workflow-rules.md +40 -0
  44. package/skills/agent-workflow/commands/agent-workflow-session.md +35 -0
  45. package/skills/agent-workflow/doctrine/README.md +15 -0
  46. package/skills/agent-workflow/doctrine/compact/SKILL.md +145 -0
  47. package/skills/agent-workflow/doctrine/doctor/SKILL.md +86 -0
  48. package/skills/agent-workflow/doctrine/doctor/SKILL.md.tmp +0 -0
  49. package/skills/agent-workflow/doctrine/hub-init/SKILL.md +157 -0
  50. package/skills/agent-workflow/doctrine/hub-init/SKILL.md.tmp +0 -0
  51. package/skills/agent-workflow/doctrine/hub-init/references/multiroot-manual.md +51 -0
  52. package/skills/agent-workflow/doctrine/implement/SKILL.md +290 -0
  53. package/skills/agent-workflow/doctrine/implement/references/branch-verification.md +16 -0
  54. package/skills/agent-workflow/doctrine/implement/references/design-md-template.md +108 -0
  55. package/skills/agent-workflow/doctrine/implement/references/rollback-guide.md +81 -0
  56. package/skills/agent-workflow/doctrine/migrate/SKILL.md +281 -0
  57. package/skills/agent-workflow/doctrine/migrate/SKILL.md.tmp +0 -0
  58. package/skills/agent-workflow/doctrine/project-init/SKILL.md +100 -0
  59. package/skills/agent-workflow/doctrine/project-init/SKILL.md.tmp +0 -0
  60. package/skills/agent-workflow/doctrine/refactor/SKILL.md +208 -0
  61. package/skills/agent-workflow/doctrine/refactor/references/refactor-md-template.md +108 -0
  62. package/skills/agent-workflow/doctrine/refactor/references/strangler-checklist.md +116 -0
  63. package/skills/agent-workflow/doctrine/resume/SKILL.md +199 -0
  64. package/skills/agent-workflow/doctrine/rules/SKILL.md +224 -0
  65. package/skills/agent-workflow/doctrine/rules/SKILL.md.tmp +0 -0
  66. package/skills/agent-workflow/doctrine/session/SKILL.md +383 -0
  67. package/skills/agent-workflow/doctrine/session/references/auto-plan-rules.md +63 -0
  68. package/skills/agent-workflow/doctrine/session/references/backlog-template.md +95 -0
  69. package/skills/agent-workflow/doctrine/session/references/branch-verification.md +198 -0
  70. package/skills/agent-workflow/doctrine/session/references/commits-policy.md +111 -0
  71. package/skills/agent-workflow/doctrine/session/references/communication-style.md +50 -0
  72. package/skills/agent-workflow/doctrine/session/references/graduacion-routing.md +88 -0
  73. package/skills/agent-workflow/doctrine/session/references/lifecycle-deep.md +160 -0
  74. package/skills/agent-workflow/doctrine/session/references/prompts/C1-specialty-selection.md +11 -0
  75. package/skills/agent-workflow/doctrine/session/references/prompts/C2-cost-guard.md +14 -0
  76. package/skills/agent-workflow/doctrine/session/references/prompts/M1-closure-commit-prompt.md +104 -0
  77. package/skills/agent-workflow/doctrine/session/references/prompts/M10-next-step.md +17 -0
  78. package/skills/agent-workflow/doctrine/session/references/prompts/M11-context.md +16 -0
  79. package/skills/agent-workflow/doctrine/session/references/prompts/M2-branch-caso-A.md +14 -0
  80. package/skills/agent-workflow/doctrine/session/references/prompts/M3-branch-caso-C.md +33 -0
  81. package/skills/agent-workflow/doctrine/session/references/prompts/M4-cross-source-hard-gate.md +33 -0
  82. package/skills/agent-workflow/doctrine/session/references/prompts/M5-modality-analyze.md +15 -0
  83. package/skills/agent-workflow/doctrine/session/references/prompts/M6-phase-gate.md +31 -0
  84. package/skills/agent-workflow/doctrine/session/references/prompts/M7-refactor-legacy-detected.md +28 -0
  85. package/skills/agent-workflow/doctrine/session/references/prompts/M8-refactor-cleanup.md +16 -0
  86. package/skills/agent-workflow/doctrine/session/references/prompts/M9-contract-review.md +39 -0
  87. package/skills/agent-workflow/doctrine/session/references/prompts/S1-type-design.md +15 -0
  88. package/skills/agent-workflow/doctrine/session/references/prompts/S2-topic-change-detection.md +14 -0
  89. package/skills/agent-workflow/doctrine/session/references/prompts/S3-flow-detection.md +28 -0
  90. package/skills/agent-workflow/doctrine/session/references/prompts/S4-resume.md +27 -0
  91. package/skills/agent-workflow/doctrine/session/references/prompts/S5-post-compact.md +17 -0
  92. package/skills/agent-workflow/doctrine/session/references/prompts/S6-scope.md +16 -0
  93. package/skills/agent-workflow/doctrine/session/references/prompts/S7-design-review.md +37 -0
  94. package/skills/agent-workflow/doctrine/session/references/prompts-catalog.md +210 -0
  95. package/skills/agent-workflow/doctrine/session/references/sandbox-readonly-rules.md +82 -0
  96. package/skills/agent-workflow/doctrine/session/references/specialty-decision-tree.md +56 -0
  97. package/skills/agent-workflow/doctrine/session/references/topic-change-rules.md +67 -0
  98. package/skills/agent-workflow/exports/README.md +15 -0
  99. package/skills/agent-workflow/exports/export-arq/SKILL.md +229 -0
  100. package/skills/agent-workflow/exports/export-arq/SKILL.md.tmp +0 -0
  101. package/skills/agent-workflow/exports/export-arq/references/lexico-tecnico.md +94 -0
  102. package/skills/agent-workflow/exports/export-arq/references/template-c4.md +293 -0
  103. package/skills/agent-workflow/exports/export-arq/references/template-plantuml.puml +77 -0
  104. package/skills/agent-workflow/exports/export-arq/references/template-structurizr.dsl +72 -0
  105. package/skills/agent-workflow/exports/export-arq/references/validations.md +231 -0
  106. package/skills/agent-workflow/exports/export-conclusions/SKILL.md +169 -0
  107. package/skills/agent-workflow/exports/export-conclusions/references/dedup-rules.md +154 -0
  108. package/skills/agent-workflow/exports/export-conclusions/references/template-conclusions.md +158 -0
  109. package/skills/agent-workflow/exports/export-plan/SKILL.md +225 -0
  110. package/skills/agent-workflow/exports/export-plan/references/state-transitions.md +141 -0
  111. package/skills/agent-workflow/exports/export-plan/references/template-plan.md +132 -0
  112. package/skills/agent-workflow/exports/export-qa-note/SKILL.md +31 -0
  113. package/skills/agent-workflow/exports/export-report/SKILL.md +262 -0
  114. package/skills/agent-workflow/exports/export-report/SKILL.md.tmp +0 -0
  115. package/skills/agent-workflow/exports/export-report/references/lexico.md +174 -0
  116. package/skills/agent-workflow/exports/export-report/references/template-a.md +95 -0
  117. package/skills/agent-workflow/exports/export-report/references/template-b.md +221 -0
  118. package/skills/agent-workflow/exports/export-report/references/template-c.md +180 -0
  119. package/skills/agent-workflow/exports/export-report/references/validations.md +255 -0
  120. package/skills/agent-workflow/exports/export-requirement/SKILL.md +31 -0
  121. package/skills/agent-workflow/exports/export-scripts/SKILL.md +324 -0
  122. package/skills/agent-workflow/exports/export-scripts/references/code-scan-recommendations.md +83 -0
  123. package/skills/agent-workflow/exports/export-scripts/references/deprecation-plan.md +80 -0
  124. package/skills/agent-workflow/exports/export-scripts/references/lexico-tecnico.md +80 -0
  125. package/skills/agent-workflow/exports/export-scripts/references/manifest-template.md +253 -0
  126. package/skills/agent-workflow/exports/export-scripts/references/readme-template.md +79 -0
  127. package/skills/agent-workflow/exports/export-scripts/references/theme-handling.md +168 -0
  128. package/skills/agent-workflow/exports/export-scripts/references/validations.md +242 -0
  129. package/skills/agent-workflow/exports/export-tech-manuals/SKILL.md +214 -0
  130. package/skills/agent-workflow/exports/export-tech-manuals/references/lexico-tecnico.md +97 -0
  131. package/skills/agent-workflow/exports/export-tech-manuals/references/template-index.md +123 -0
  132. package/skills/agent-workflow/exports/export-tech-manuals/references/template-manual.md +143 -0
  133. package/skills/agent-workflow/exports/export-tech-manuals/references/validations.md +211 -0
  134. package/skills/agent-workflow/exports/export-tech-note/SKILL.md +31 -0
  135. package/skills/agent-workflow/hooks/README.md +15 -0
  136. package/skills/agent-workflow/hooks/hooks.template.json +90 -0
  137. package/skills/agent-workflow/references/README.md +12 -0
  138. package/skills/agent-workflow/references/legacy-anchors.md +50 -0
  139. package/skills/agent-workflow/references/profile-parametrization.md +88 -0
  140. package/skills/agent-workflow/specialties/README.md +14 -0
  141. package/skills/agent-workflow/specialties/analyze-conclude/SKILL.md +175 -0
  142. package/skills/agent-workflow/specialties/analyze-conclude/references/incident-classification.md +61 -0
  143. package/skills/agent-workflow/specialties/analyze-investigate/SKILL.md +148 -0
  144. package/skills/agent-workflow/specialties/analyze-investigate/SKILL.md.tmp +0 -0
  145. package/skills/agent-workflow/specialties/analyze-investigate/references/cost-guard.md +85 -0
  146. package/skills/agent-workflow/specialties/analyze-synthesize/SKILL.md +127 -0
  147. package/skills/agent-workflow/specialties/design-brief/SKILL.md +90 -0
  148. package/skills/agent-workflow/specialties/design-deliver/SKILL.md +121 -0
  149. package/skills/agent-workflow/specialties/design-develop/SKILL.md +115 -0
  150. package/skills/agent-workflow/specialties/design-discover/SKILL.md +103 -0
  151. package/skills/agent-workflow/standards/README.md +12 -0
  152. package/skills/agent-workflow/standards/coding-standards/SKILL.md +102 -0
  153. package/skills/agent-workflow/standards/coding-standards/SKILL.md.tmp +0 -0
  154. package/skills/agent-workflow/standards/coding-standards/references/angular-typescript.md +266 -0
  155. package/skills/agent-workflow/standards/coding-standards/references/database-conventions.md +170 -0
  156. package/skills/agent-workflow/standards/coding-standards/references/fe-be-integration.md +300 -0
  157. package/skills/agent-workflow/standards/coding-standards/references/frontend-structure.md +182 -0
  158. package/skills/agent-workflow/standards/coding-standards/references/java-spring.md +244 -0
  159. package/skills/agent-workflow/standards/coding-standards/references/project-structure.md +197 -0
  160. package/skills/agent-workflow/standards/frontend-design/SKILL.md +62 -0
  161. package/skills/agent-workflow/standards/frontend-design/references/feedback-toasts-patterns.md +249 -0
  162. package/skills/agent-workflow/standards/frontend-design/references/form-patterns.md +278 -0
  163. package/skills/agent-workflow/standards/frontend-design/references/list-patterns.md +256 -0
  164. package/skills/agent-workflow/standards/frontend-design/references/modal-patterns.md +220 -0
  165. package/skills/agent-workflow/standards/frontend-design/references/navigation-patterns.md +224 -0
  166. package/skills/agent-workflow/standards/redaccion-simple/SKILL.md +128 -0
  167. package/skills/agent-workflow/standards/sql-rollback-generator/SKILL.md +197 -0
  168. package/skills/agent-workflow/standards/sql-rollback-generator/references/irreversible-checklist.md +161 -0
  169. package/skills/agent-workflow/standards/sql-rollback-generator/references/release-rollback.md +131 -0
  170. package/skills/agent-workflow/standards/sql-rollback-generator/references/rollback-patterns.md +255 -0
  171. package/skills/agent-workflow/standards/sql-script-organizer/SKILL.md +244 -0
  172. package/skills/agent-workflow/standards/sql-script-organizer/references/bundle-readme-template.md +82 -0
  173. package/skills/agent-workflow/standards/sql-script-organizer/references/categorization-rules.md +122 -0
  174. package/skills/agent-workflow/standards/sql-script-organizer/references/consolidation-cross-session.md +125 -0
  175. package/skills/agent-workflow/standards/sql-script-organizer/references/scripts-sql-format.md +140 -0
  176. package/skills/agent-workflow/standards/testing-strategy/SKILL.md +113 -0
  177. package/skills/agent-workflow/standards/testing-strategy/references/test-levels.md +255 -0
  178. package/skills/agent-workflow/workflows/README.md +12 -0
  179. package/skills/agent-workflow/workflows/analyze-workflow/SKILL.md +107 -0
  180. package/skills/agent-workflow/workflows/design-workflow/SKILL.md +100 -0
  181. package/skills/agent-workflow/workflows/dev-workflow/SKILL.md +195 -0
@@ -0,0 +1,244 @@
1
+ # Java / Spring Boot — Convenciones detalladas
2
+
3
+ ## Inyección de dependencias
4
+
5
+ Usar Constructor Injection. Nunca Field Injection en código de producción.
6
+
7
+ ```java
8
+ // Correcto: Constructor Injection
9
+ @Service
10
+ @RequiredArgsConstructor
11
+ public class NotificacionService {
12
+ private final EmailProvider emailProvider;
13
+ private final NotificacionRepository repository;
14
+ }
15
+
16
+ // Incorrecto: Field Injection
17
+ @Service
18
+ public class NotificacionService {
19
+ @Autowired // NO en producción
20
+ private EmailProvider emailProvider;
21
+ }
22
+ ```
23
+
24
+ ## DTOs con Java Records
25
+
26
+ Usar records para Request y Response. Clases tradicionales para entidades JPA.
27
+
28
+ ```java
29
+ // Request DTO — record
30
+ public record NotificacionRequest(
31
+ @NotBlank String destinatario,
32
+ @NotBlank String asunto,
33
+ @NotNull String templateId,
34
+ Map<String, Object> variables
35
+ ) {}
36
+
37
+ // Response DTO — record
38
+ public record NotificacionResponse(
39
+ Long id,
40
+ String destinatario,
41
+ String estado,
42
+ LocalDateTime fechaEnvio
43
+ ) {}
44
+
45
+ // Entidad JPA — clase (NO record)
46
+ @Entity
47
+ @Table(name = "notificaciones")
48
+ public class Notificacion {
49
+ @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
50
+ private Long id;
51
+ private String destinatario;
52
+ private String estado;
53
+ // getters, setters
54
+ }
55
+ ```
56
+
57
+ ## Transacciones
58
+
59
+ ```java
60
+ // Lectura — readOnly para optimización
61
+ @Transactional(readOnly = true)
62
+ public NotificacionResponse buscarPorId(Long id) { ... }
63
+
64
+ // Escritura
65
+ @Transactional
66
+ public NotificacionResponse enviar(NotificacionRequest request) { ... }
67
+ ```
68
+
69
+ ## Validación con Jakarta
70
+
71
+ ```java
72
+ @PostMapping("/notificaciones")
73
+ public ResponseEntity<NotificacionResponse> enviar(
74
+ @Valid @RequestBody NotificacionRequest request) {
75
+ return ResponseEntity.ok(service.enviar(request));
76
+ }
77
+ ```
78
+
79
+ ## PATCH + Sparse DTO unificado (qtc-dev v2.6+)
80
+
81
+ Para mantenimientos CRUD seguir las reglas de `references/fe-be-integration.md`:
82
+
83
+ - **DTO único** `<Feature>SaveRequest` para POST y PATCH, todos los campos nullable.
84
+ - **POST** acepta el DTO con required cargados; **PATCH** acepta el DTO con solo los campos modificados (null = no tocar).
85
+ - Validation groups (`OnCreate.class`) cuando se necesita exigir `@NotNull` solo en POST.
86
+
87
+ ```java
88
+ public record CategoriaSaveRequest(
89
+ @Size(min = 1, max = 100)
90
+ @NotNull(groups = OnCreate.class)
91
+ String nombre,
92
+ @Size(max = 500) String descripcion,
93
+ @NotNull(groups = OnCreate.class) Boolean activo,
94
+ @PositiveOrZero Integer ordenVisual
95
+ ) {}
96
+
97
+ @RestController
98
+ @RequestMapping("/api/categorias")
99
+ @RequiredArgsConstructor
100
+ public class CategoriasController {
101
+ private final CategoriasService service;
102
+
103
+ @PostMapping
104
+ public ResponseEntity<CategoriaResponse> create(
105
+ @Validated(OnCreate.class) @RequestBody CategoriaSaveRequest req
106
+ ) { return ResponseEntity.ok(service.create(req)); }
107
+
108
+ @PatchMapping("/{id}")
109
+ public ResponseEntity<CategoriaResponse> patch(
110
+ @PathVariable Long id,
111
+ @Valid @RequestBody CategoriaSaveRequest req
112
+ ) { return ResponseEntity.ok(service.patch(id, req)); }
113
+ }
114
+ ```
115
+
116
+ En el service, el método `patch` ignora campos `null`:
117
+
118
+ ```java
119
+ @Transactional
120
+ public CategoriaResponse patch(Long id, CategoriaSaveRequest req) {
121
+ Categoria entity = repo.findById(id).orElseThrow(NotFoundException::new);
122
+ if (req.nombre() != null) entity.setNombre(req.nombre());
123
+ if (req.descripcion() != null) entity.setDescripcion(req.descripcion());
124
+ if (req.activo() != null) entity.setActivo(req.activo());
125
+ if (req.ordenVisual() != null) entity.setOrdenVisual(req.ordenVisual());
126
+ return mapper.toResponse(repo.save(entity));
127
+ }
128
+ ```
129
+
130
+ Tradeoff aceptado: no se puede setear un campo a `null` intencionalmente (semántica "no tocar"). Para "limpiar a null", usar endpoint dedicado o flag explícita en el DTO. Detalles + ejemplos completos: `references/fe-be-integration.md`.
131
+
132
+ ## Fail fast / Early returns
133
+
134
+ ```java
135
+ public NotificacionResponse enviar(NotificacionRequest request) {
136
+ if (request.destinatario().isBlank()) {
137
+ throw new BadRequestException("Destinatario requerido");
138
+ }
139
+
140
+ var template = templateRepository.findById(request.templateId())
141
+ .orElseThrow(() -> new NotFoundException("Template no encontrado"));
142
+
143
+ // Lógica principal después de validaciones
144
+ return procesarEnvio(request, template);
145
+ }
146
+ ```
147
+
148
+ ## Manejo de errores
149
+
150
+ ```java
151
+ @RestControllerAdvice
152
+ public class ControllerExceptionHandler {
153
+
154
+ @ExceptionHandler(BadRequestException.class)
155
+ public ResponseEntity<ErrorResponse> handleBadRequest(BadRequestException ex) {
156
+ log.warn("Bad request: {}", ex.getMessage());
157
+ return ResponseEntity.badRequest()
158
+ .body(new ErrorResponse(ex.getMessage()));
159
+ }
160
+
161
+ @ExceptionHandler(Exception.class)
162
+ public ResponseEntity<ErrorResponse> handleGeneral(Exception ex) {
163
+ log.error("Error inesperado", ex);
164
+ return ResponseEntity.internalServerError()
165
+ .body(new ErrorResponse("Error interno del servidor"));
166
+ }
167
+ }
168
+ ```
169
+
170
+ ## Estructura de proyecto
171
+
172
+ Ver `references/project-structure.md` para la estructura completa de paquetes, entidades, repositories, services, wrappers request/response y convención de DTOs del tu ecosistema.
173
+
174
+ ## Queries SQL
175
+
176
+ - Siempre parametrizar (nunca concatenar strings)
177
+ - Usar `@Query` con parámetros nombrados o JPA Criteria
178
+ - En native queries, siempre schema explícito: `esq_xxx.tb_xxx`
179
+ - Documentar queries complejas en CONSULTASSQL.md de la sesión
180
+
181
+ ```java
182
+ // Correcto
183
+ @Query("SELECT n FROM Notificacion n WHERE n.destinatario = :email")
184
+ List<Notificacion> findByDestinatario(@Param("email") String email);
185
+
186
+ // Incorrecto — SQL injection
187
+ @Query("SELECT n FROM Notificacion n WHERE n.destinatario = '" + email + "'")
188
+ ```
189
+
190
+ Ver `references/database-conventions.md` para nomenclatura de tablas, columnas, sequences, funciones y el patrón maestra-detalle.
191
+
192
+ ## Build y verificación
193
+
194
+ - Compilar: `./mvnw compile` (Windows: `mvnw.cmd compile`)
195
+ - Tests: `./mvnw test`
196
+ - Verificación completa: `./mvnw verify`
197
+ - Nunca usar `mvn` directo — siempre el wrapper del proyecto
198
+
199
+ ## Patrones de sincronización single-slot
200
+
201
+ Patrones al sincronizar relaciones donde la BD admite N filas pero la UX expone 1 seleccionada. Para la decisión de diseño UX (por qué single-slot), ver skill `frontend-design` (§1).
202
+
203
+ ### Reemplazo preservando fila coincidente
204
+
205
+ Al guardar con single-slot, **no** "borrar todo e insertar uno" (genera churn en auditoría y consume secuencias innecesariamente). Recorrer las filas existentes, preservar la que coincide con el valor nuevo y eliminar las demás:
206
+
207
+ ```java
208
+ List<EntidadRelacion> existentes = repository.findByIdMaestro(maestro.getIdMaestro());
209
+ boolean coincide = false;
210
+ for (EntidadRelacion e : existentes) {
211
+ if (!coincide && idValorNuevo.equals(e.getIdValor())) {
212
+ coincide = true; // preservar UNA fila que coincide
213
+ } else {
214
+ repository.delete(e); // eliminar sobrantes o cambios
215
+ }
216
+ }
217
+ if (!coincide) {
218
+ // crear fila nueva con estado=1, fecha_registro, usuario_registro
219
+ }
220
+ ```
221
+
222
+ ### Fallback cross-tabla en GET con autoritativa única
223
+
224
+ Cuando un campo vive en dos tablas por historia (p. ej. `usuario.celular` y `cliente.celular`), declarar **una tabla autoritativa** y aplicar fallback silencioso a la otra **sólo en el GET**. El UPDATE toca únicamente la autoritativa:
225
+
226
+ ```java
227
+ if (dto.getCelular() == null || dto.getCelular().isBlank()) {
228
+ clienteRepository.findByIdPersona(entidad.getIdPersona())
229
+ .ifPresent(c -> dto.setCelular(c.getCelular()));
230
+ }
231
+ ```
232
+
233
+ Regla: no replicar esta lógica en el frontend; la resolución vive en el GET del backend. Evitar asumir que un campo "personal" vive en la tabla de personas sin verificar — a veces la autoritativa es la tabla de negocio.
234
+
235
+ ### Filtros `estado=1` en query, no en frontend
236
+
237
+ Queries de catálogo (roles asignables, negocios, sucursales, etc.) filtran activos en la query nativa / JPA. El frontend recibe sólo activos y **no debe re-filtrar**:
238
+
239
+ ```java
240
+ @Query("SELECT r FROM Rol r WHERE r.estado = 1 ORDER BY r.nombre")
241
+ List<Rol> findAsignables();
242
+ ```
243
+
244
+ Si el frontend termina filtrando de nuevo, es indicio de que la query está mal — corregir la query, no el frontend.
@@ -0,0 +1,197 @@
1
+ # Estructura de Proyecto Backend
2
+
3
+ Convenciones de estructura para microservicios Spring Boot del tu ecosistema.
4
+
5
+ ## Paquete base
6
+
7
+ `com.qtc.[dominio]` → `com.qtc.credito`, `com.qtc.mantenimiento`, `com.qtc.solicitud`
8
+
9
+ ## Estructura de paquetes
10
+
11
+ Dos variantes en uso (ambas válidas, seguir la del proyecto actual):
12
+
13
+ ```
14
+ com.qtc.[dominio].core.controller
15
+ com.qtc.[dominio].core.service
16
+ com.qtc.[dominio].core.service.impl
17
+ com.qtc.[dominio].core.service.generico
18
+ com.qtc.[dominio].core.repository
19
+ com.qtc.[dominio].core.model
20
+ com.qtc.[dominio].core.request
21
+ com.qtc.[dominio].core.request.dto
22
+ com.qtc.[dominio].core.response
23
+ com.qtc.[dominio].core.response.dto
24
+ com.qtc.[dominio].core.config
25
+ com.qtc.[dominio].core.exception
26
+ com.qtc.[dominio].core.common
27
+ com.qtc.[dominio].core.util
28
+ com.qtc.[dominio].core.feign
29
+ com.qtc.[dominio].core.seguridad
30
+ com.qtc.[dominio].core.aspect
31
+ com.qtc.[dominio].core.advice
32
+ ```
33
+
34
+ Variante sin `core`:
35
+ ```
36
+ com.qtc.[dominio].controller
37
+ com.qtc.[dominio].service / service.impl
38
+ com.qtc.[dominio].repository
39
+ com.qtc.[dominio].model
40
+ com.qtc.[dominio].dto.request / dto.response
41
+ ```
42
+
43
+ ## Flujo de capas
44
+
45
+ ```
46
+ Controller → Service (interface) → ServiceImpl → Repository → Entity/BD
47
+ ```
48
+
49
+ ## Entidades JPA
50
+
51
+ Nombre = tabla sin `tb_` en PascalCase: `tb_credito` → `Credito`, `tb_cliente` → `Cliente`
52
+
53
+ ```java
54
+ @Entity
55
+ @NoArgsConstructor
56
+ @AllArgsConstructor
57
+ @Table(name = "tb_credito", schema = "esq_credito")
58
+ @Getter
59
+ @Setter
60
+ public class Credito extends Auditoria implements Serializable {
61
+
62
+ @Id
63
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_tb_credito")
64
+ @SequenceGenerator(name = "seq_tb_credito", sequenceName = "seq_tb_credito",
65
+ schema = "esq_credito", allocationSize = 1)
66
+ @Column(name = "id_credito")
67
+ private Long idCredito;
68
+ }
69
+ ```
70
+
71
+ Reglas:
72
+ - Siempre `schema` explícito en `@Table` y `@SequenceGenerator`
73
+ - Extender `Auditoria` para campos de auditoría
74
+ - `@Getter @Setter` (no `@Data`) en entities
75
+ - `@Column(name = "...")` con el nombre exacto de la columna en BD
76
+ - Stored procedures: `@NamedStoredProcedureQuery` en la entidad que las invoca
77
+
78
+ ## Clase base Auditoria
79
+
80
+ `@MappedSuperclass` que provee 5 campos estándar:
81
+
82
+ ```java
83
+ @MappedSuperclass
84
+ @Data
85
+ public abstract class Auditoria {
86
+ @Column(nullable = false, name = "ESTADO")
87
+ protected Integer estado;
88
+
89
+ @Column(nullable = false, updatable = false, name = "USUARIO_REGISTRO")
90
+ protected String usuarioRegistro;
91
+
92
+ @Column(nullable = false, updatable = false, name = "FECHA_REGISTRO")
93
+ protected Date fechaRegistro;
94
+
95
+ @Column(insertable = false, name = "USUARIO_MODIFICACION")
96
+ protected String usuarioModificacion;
97
+
98
+ @Column(insertable = false, name = "FECHA_MODIFICACION")
99
+ protected Date fechaModificacion;
100
+ }
101
+ ```
102
+
103
+ Al insertar: llamar `setCampoSegIns(usuario, fecha)`.
104
+ Al actualizar: llamar `setCampoSegUpd(estado, usuario, fecha)`.
105
+
106
+ ## Repositories
107
+
108
+ ```java
109
+ @Repository
110
+ public interface CreditoRepository extends JpaRepository<Credito, Long> {
111
+
112
+ // JPQL
113
+ @Query("SELECT c FROM Credito c WHERE c.solicitud.idSolicitud = :id")
114
+ List<Credito> obtenerPorSolicitud(@Param("id") Long id);
115
+
116
+ // Native query con schema explícito
117
+ @Query(value = "SELECT ... FROM esq_credito.tb_credito c "
118
+ + "INNER JOIN esq_seguridad.tb_persona p ON ...",
119
+ nativeQuery = true)
120
+ List<PCreditoDTO> obtenerPorDocumento(@Param("doc") String doc);
121
+
122
+ // Stored procedure
123
+ @Procedure(name = "credito.generaCredito")
124
+ Integer generaCredito(@Param("var_usuario") String usuario);
125
+ }
126
+ ```
127
+
128
+ Native queries siempre con `esq_xxx.tb_xxx` (schema explícito).
129
+
130
+ ## Services
131
+
132
+ ```java
133
+ // Interface
134
+ public interface CreditoService {
135
+ RespBase<ResponseDTO> generaCredito(ReqBase<ReqCredito> request, String usuario);
136
+ }
137
+
138
+ // Implementación
139
+ @AllArgsConstructor
140
+ @Service
141
+ public class CreditoServiceImpl implements CreditoService {
142
+ private static final Logger LOGGER = LoggerFactory.getLogger(CreditoServiceImpl.class);
143
+ private final CreditoRepository creditoRepository;
144
+ private final ClienteRepository clienteRepository;
145
+
146
+ @Transactional
147
+ @Override
148
+ public RespBase<ResponseDTO> generaCredito(ReqBase<ReqCredito> request, String usuario) {
149
+ // ...
150
+ }
151
+ }
152
+ ```
153
+
154
+ Reglas:
155
+ - Constructor injection vía `@AllArgsConstructor` (no `@Autowired`)
156
+ - `@Transactional` en métodos de escritura
157
+ - Logger SLF4J estático por clase
158
+ - Siempre interface + impl
159
+
160
+ ## Wrappers Request/Response
161
+
162
+ ### Request
163
+ ```java
164
+ public class ReqBase<T> {
165
+ private Trace trace; // traceId para trazabilidad
166
+ @NotNull @Valid
167
+ private T payload;
168
+ }
169
+ ```
170
+
171
+ ### Response
172
+ ```java
173
+ public class RespBase<T> {
174
+ private Trace trace;
175
+ private Status status; // success + error (code, httpCode, messages)
176
+ private T payload;
177
+ }
178
+ ```
179
+
180
+ Uso: `return new RespBase<ResponseDTO>().ok(payload);`
181
+ Error: `return new RespBase<>().error(response, false, "mensaje");`
182
+
183
+ ## Convención de DTOs
184
+
185
+ - **`Req` prefix** → Request DTOs: `ReqCredito`, `ReqSituacion` (clases con `@Data`)
186
+ - **`P` prefix** → Projection interfaces para native queries: `PCreditoDTO`, `PClienteDTO`
187
+ - **`R` prefix** → Response DTOs mapeados: `RCreditoDTO`, `RCronogramaDTO` (clases con mapper)
188
+ - **`ResponseDTO`** → DTO genérico con id, data y mensaje
189
+
190
+ ## Comunicación entre microservicios
191
+
192
+ - Feign clients en paquete `feign`
193
+ - Paquete `seguridad` para interceptors de autenticación
194
+
195
+ ## Build
196
+
197
+ Maven wrapper: `./mvnw` (Linux) o `mvnw.cmd` (Windows). Nunca `mvn` global.
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: frontend-design
3
+ description: "Principios de diseño UX para interfaces CRUD agnósticos al framework (HTML/CSS/UX, sin código Angular/React/Vue). Cubre formularios, listados, modales, navegación y feedback. Reglas de reutilización shared/ y framework-first CSS. Activar al diseñar o implementar mantenimientos CRUD. Para código del stack consultar coding-standards. Referencia transversal sin dependencia de sesiones."
4
+ version: 0.2.0
5
+ ---
6
+
7
+ # Frontend Design
8
+
9
+ Principios de diseño UX para interfaces CRUD de mantenimiento: formularios, listados, modales, navegación y feedback. Contenido **agnóstico a framework** — sólo principios HTML/CSS/UX, sin código Angular/React/Vue. Para el código específico del stack, ver `coding-standards/references/<stack>.md`.
10
+
11
+ ## Qué cubre
12
+
13
+ Cinco `references/*.md`, cada uno prescriptivo (qué sí hacer) con un checklist de replicación al final:
14
+
15
+ - **`references/form-patterns.md`** — formularios editar/nuevo. Modelo mental single-slot, layout de 4 cards por dominio, readonly con candado, combos dependientes con hints, switch vs checkbox, campo opcional con switch que colapsa, estado vs bloqueado, placeholders con formato. Incluye los dos principios transversales de reutilización (`shared/`) y framework-first CSS (~90/10).
16
+
17
+ - **`references/list-patterns.md`** — vistas de listado. Estructura header + filter card + data-table + pagination, acciones por fila (iconos + tooltips), empty states, loading global, badges de estado. FormBuilder reactivo preferido sobre `ngModel` directo.
18
+
19
+ - **`references/modal-patterns.md`** — diálogos. Cuándo modal vs vista dedicada, layout (header/body/footer), tamaños categóricos (sm/md/lg), formularios dentro del modal, footer con cancelar + primario + loading state, convención de payload `{ saved: true, data }`, confirmación destructiva. NgbModal recomendado; MatDialog es legado.
20
+
21
+ - **`references/navigation-patterns.md`** — layout de app admin. Sidebar colapsable desde catálogo dinámico, toolbar con contexto (sucursal/usuario/logout), page header con título + descripción + acción primaria, tabs con routing, breadcrumbs, back navigation, lazy loading por módulo.
22
+
23
+ - **`references/feedback-toasts-patterns.md`** — toasts (4 tipos: success/info/warning/danger), loading global vs inline, validación inline de formularios, empty states, errores HTTP (regla: nunca silenciar con `catchError → []`), confirmación destructiva, skeletons.
24
+
25
+ ## Qué NO cubre
26
+
27
+ Código de framework específico. Para:
28
+
29
+ - **Angular/TypeScript** (`valueChanges`, `patchValue({emitEvent:false})`, async pipe, normalización de tipos, `concat` vs paralelo, FormBuilder): `coding-standards/references/angular-typescript.md`.
30
+ - **Java/Spring** (sincronización single-slot preservando fila coincidente, fallback cross-tabla, filtros `estado=1` en query): `coding-standards/references/java-spring.md`.
31
+ - **Estructura de proyecto frontend** (`@data`/`@presentation`, `shared/`, `ApiService`): `coding-standards/references/frontend-structure.md`.
32
+ - **Seguridad, logging, git, errores HTTP**: `coding-standards/SKILL.md`.
33
+
34
+ ## Cuándo se activa
35
+
36
+ Auto-trigger por contexto, como `coding-standards`. Señales típicas:
37
+
38
+ - El usuario menciona mantenimientos, editar/nuevo, cards, layout, combo dependiente, switch, readonly, listado, filtros, paginación, tabla, modal, confirmación, sidebar, toolbar, breadcrumbs, toast, loading, empty state, validación.
39
+ - El trabajo consiste en diseñar o implementar una vista CRUD nueva (lista, form, modal, navegación) o replicar el patrón a otra entidad.
40
+ - El usuario pregunta por el patrón de un elemento visual ("¿cómo alineo el switch?", "¿uso checkbox o switch aquí?", "¿hay componente reutilizable?").
41
+ - El usuario discute reutilización o framework-first CSS ("¿hay componente en shared?", "prefiero utilities Bootstrap").
42
+
43
+ No depende de sesiones activas.
44
+
45
+ ## Convenciones comunes a los refs
46
+
47
+ - **Principios prescriptivos** (lo que sí hacer). Alternativas legadas se mencionan en 1 línea como "no replicar" sin secciones dedicadas.
48
+ - **`[shared-candidato]`** marca componentes compartidos pendientes de extracción — listado consolidado en `references/form-patterns.md` §10 y distribuido donde aparece cada candidato.
49
+ - **Checklist de replicación** al final de cada ref, enumerando los pasos para aplicar los patrones a una vista nueva.
50
+ - **Notas de stack** ("En el proyecto usa X; Y es legado, no replicar") donde las inconsistencias del codebase requieren postura.
51
+
52
+ ## Sandbox read-only
53
+
54
+ Canon universal en `../session/references/sandbox-readonly-rules.md`. Esta skill es read-only por diseño — carga principios de UX/UI para mantenimientos CRUD (form patterns, listings, modales, navegación, feedback), no edita ni genera código.
55
+
56
+ En plan mode: describir en el plan file qué refs aplicarían al contexto (form-patterns, list-patterns, modal-patterns, etc.) y los componentes `[shared-candidato]` que el caso justificaría extraer. NO ejecuta `Write`, `Edit`, `MultiEdit`, ni `Bash` con efectos colaterales.
57
+
58
+ Compatible con plan mode sin restricciones adicionales.
59
+
60
+ ## Roadmap
61
+
62
+ Los 5 refs cubren el alcance actual tras análisis dirigido del frontend `core-frontend-miscuotas/admin`. Si aparecen dominios nuevos (p. ej. wizards multi-step activos, upload flows complejos, dashboards) con suficiente repetición en el codebase, se añaden como refs adicionales siguiendo el mismo proceso: analizar → generalizar → documentar.