@factor_ec/ai-tools 0.1.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.
- package/cli.js +275 -0
- package/lib/agents.d.ts +9 -0
- package/lib/agents.d.ts.map +1 -0
- package/lib/agents.js +28 -0
- package/lib/agents.js.map +1 -0
- package/lib/index.d.ts +5 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +4 -0
- package/lib/index.js.map +1 -0
- package/lib/install.d.ts +24 -0
- package/lib/install.d.ts.map +1 -0
- package/lib/install.js +84 -0
- package/lib/install.js.map +1 -0
- package/lib/resolve-target.d.ts +15 -0
- package/lib/resolve-target.d.ts.map +1 -0
- package/lib/resolve-target.js +33 -0
- package/lib/resolve-target.js.map +1 -0
- package/package.json +34 -0
- package/templates/git-commit/SKILL.md +124 -0
- package/templates/project-create/SKILL.md +57 -0
- package/templates/project-create/references/angular.md +124 -0
- package/templates/user-story-add-task/SKILL.md +169 -0
- package/templates/user-story-create/SKILL.md +167 -0
- package/templates/work-item-develop/SKILL.md +125 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ab-git-commit
|
|
3
|
+
description: 'Ejecutar git commit con análisis de mensajes conventional commits, staging inteligente y generación de mensajes. Usar cuando el usuario pida hacer commit de cambios, crear un git commit o mencione "/commit". Soporta: (1) Detección automática de tipo y scope desde los cambios, (2) Generación de mensajes conventional commit desde el diff, (3) Commit interactivo con opciones para sobrescribir tipo/scope/descripción, (4) Staging inteligente de archivos para agrupación lógica'
|
|
4
|
+
license: MIT
|
|
5
|
+
allowed-tools: Bash
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Git Commit con Conventional Commits
|
|
9
|
+
|
|
10
|
+
## Resumen
|
|
11
|
+
|
|
12
|
+
Crear commits de git estandarizados y semánticos usando la especificación Conventional Commits. Analizar el diff real para determinar el tipo, scope y mensaje apropiados.
|
|
13
|
+
|
|
14
|
+
## Formato Conventional Commit
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
<type>[optional scope]: <description>
|
|
18
|
+
|
|
19
|
+
[optional body]
|
|
20
|
+
|
|
21
|
+
[optional footer(s)]
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Tipos de Commit
|
|
25
|
+
|
|
26
|
+
| Tipo | Propósito |
|
|
27
|
+
| ---------- | --------------------------------- |
|
|
28
|
+
| `feat` | Nueva funcionalidad |
|
|
29
|
+
| `fix` | Corrección de bug |
|
|
30
|
+
| `docs` | Solo documentación |
|
|
31
|
+
| `style` | Formato/estilo (sin lógica) |
|
|
32
|
+
| `refactor` | Refactorización (sin feature/fix) |
|
|
33
|
+
| `perf` | Mejora de rendimiento |
|
|
34
|
+
| `test` | Añadir/actualizar tests |
|
|
35
|
+
| `build` | Sistema de build/dependencias |
|
|
36
|
+
| `ci` | Cambios en CI/configuración |
|
|
37
|
+
| `chore` | Mantenimiento/miscelánea |
|
|
38
|
+
| `revert` | Revertir commit |
|
|
39
|
+
|
|
40
|
+
## Cambios Breaking
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
# Signo de exclamación después de type/scope
|
|
44
|
+
feat!: remove deprecated endpoint
|
|
45
|
+
|
|
46
|
+
# Footer BREAKING CHANGE
|
|
47
|
+
feat: allow config to extend other configs
|
|
48
|
+
|
|
49
|
+
BREAKING CHANGE: `extends` key behavior changed
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Flujo de Trabajo
|
|
53
|
+
|
|
54
|
+
### 1. Analizar el Diff
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# Si hay archivos en staging, usar el diff staged
|
|
58
|
+
git diff --staged
|
|
59
|
+
|
|
60
|
+
# Si no hay nada en staging, usar el diff del árbol de trabajo
|
|
61
|
+
git diff
|
|
62
|
+
|
|
63
|
+
# También verificar el estado
|
|
64
|
+
git status --porcelain
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 2. Añadir Archivos al Staging (si es necesario)
|
|
68
|
+
|
|
69
|
+
Si no hay nada en staging o quieres agrupar los cambios de otra forma:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# Añadir archivos específicos
|
|
73
|
+
git add path/to/file1 path/to/file2
|
|
74
|
+
|
|
75
|
+
# Añadir por patrón
|
|
76
|
+
git add *.test.*
|
|
77
|
+
git add src/components/*
|
|
78
|
+
|
|
79
|
+
# Staging interactivo
|
|
80
|
+
git add -p
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Nunca hacer commit de secretos** (.env, credentials.json, claves privadas).
|
|
84
|
+
|
|
85
|
+
### 3. Generar el Mensaje del Commit
|
|
86
|
+
|
|
87
|
+
Analizar el diff para determinar:
|
|
88
|
+
|
|
89
|
+
- **Tipo**: ¿Qué tipo de cambio es este?
|
|
90
|
+
- **Scope**: ¿Qué área/módulo está afectado?
|
|
91
|
+
- **Descripción**: Resumen en una línea de lo que cambió (tiempo presente, modo imperativo, <72 caracteres)
|
|
92
|
+
|
|
93
|
+
### 4. Ejecutar el Commit
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Una sola línea
|
|
97
|
+
git commit -m "<type>[scope]: <description>"
|
|
98
|
+
|
|
99
|
+
# Multi-línea con body/footer
|
|
100
|
+
git commit -m "$(cat <<'EOF'
|
|
101
|
+
<type>[scope]: <description>
|
|
102
|
+
|
|
103
|
+
<optional body>
|
|
104
|
+
|
|
105
|
+
<optional footer>
|
|
106
|
+
EOF
|
|
107
|
+
)"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Buenas Prácticas
|
|
111
|
+
|
|
112
|
+
- Un cambio lógico por commit
|
|
113
|
+
- Tiempo presente: "add" no "added"
|
|
114
|
+
- Modo imperativo: "fix bug" no "fixes bug"
|
|
115
|
+
- Referenciar issues: `Closes #123`, `Refs #456`
|
|
116
|
+
- Mantener la descripción bajo 72 caracteres
|
|
117
|
+
|
|
118
|
+
## Protocolo de Seguridad Git
|
|
119
|
+
|
|
120
|
+
- NUNCA actualizar la configuración de git
|
|
121
|
+
- NUNCA ejecutar comandos destructivos (--force, hard reset) sin petición explícita
|
|
122
|
+
- NUNCA saltar hooks (--no-verify) a menos que el usuario lo pida
|
|
123
|
+
- NUNCA hacer force push a main/master
|
|
124
|
+
- Si el commit falla por hooks, corregir y crear un NUEVO commit (no amend)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: project-create
|
|
3
|
+
description: Orienta la creación de un proyecto nuevo según el stack tecnológico disponible (Angular, React, Symfony u otros registrados), usando la plantilla del equipo en el repo del usuario. No crea ni modifica los repos plantilla. Si el usuario no indica el stack, el agente debe preguntar cuál desea antes de seguir. Para cada stack documentado, sigue el archivo en references/. Usar con skill project-create (/project-create) o cuando el usuario pida crear un proyecto de un stack concreto.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Crear proyecto nuevo (desde proyecto base)
|
|
7
|
+
|
|
8
|
+
## Qué es (y qué no es)
|
|
9
|
+
|
|
10
|
+
- **Sí**: crear un **proyecto nuevo para el usuario** importando el contenido de un **proyecto base** ya mantenido por el equipo (template).
|
|
11
|
+
- **No**: crear, publicar ni mantener el repositorio del proyecto base; ese es otro flujo.
|
|
12
|
+
|
|
13
|
+
El patrón habitual: **repo git del usuario ya existente** → remote hacia la plantilla → **fetch/merge** → instalación de dependencias del stack → **sustitución** de nombres/IDs/envs según el tipo.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Obligatorio: tipo de proyecto
|
|
18
|
+
|
|
19
|
+
Antes de ejecutar comandos o merges:
|
|
20
|
+
|
|
21
|
+
1. Si el usuario usa **`/project-create`** (skill **project-create**) o pide explícitamente “crear proyecto” / “nuevo proyecto desde plantilla”, **comprueba si ha indicado el stack tecnológico**: Angular, React, Symfony, u otro listado en [Registro de proyectos base](#registro-de-proyectos-base).
|
|
22
|
+
2. **Si el tipo no está claro o no lo ha dicho**, **no asumas Angular ni otro stack**. **Pregunta de forma explícita**, por ejemplo: *¿Qué tipo de proyecto quieres crear? (Por ahora el procedimiento detallado está para **Angular**; **React** y **Symfony** están pendientes de documentar.)*
|
|
23
|
+
3. Cuando el tipo esté claro, **lee el material de referencia de ese stack** (si existe) y sigue solo ese flujo.
|
|
24
|
+
|
|
25
|
+
| Stack | Referencia detallada | Estado |
|
|
26
|
+
|----------|----------------------|--------|
|
|
27
|
+
| Angular | **[references/angular.md](references/angular.md)** — **leer este archivo al completo** cuando el usuario quiera un **proyecto Angular** nuevo desde la plantilla (no confundir con mantener el repo `angular-base-project`). | Completo |
|
|
28
|
+
| React | _pendiente_ | Preguntar; avisar si aún no hay `references/react.md`. |
|
|
29
|
+
| Symfony | _pendiente_ | Idem. |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Convenciones comunes (cualquier stack)
|
|
34
|
+
|
|
35
|
+
1. **Repo del usuario**: debe ser **raíz de un repositorio git** (`.git` presente). Si no: `git init` o clonar antes.
|
|
36
|
+
2. **Remote hacia la plantilla**: convención `upstream` salvo que el repo ya lo use para otra cosa; si hay conflicto, acordar nombre y anotarlo en el registro.
|
|
37
|
+
3. **Merge**: normalmente `git merge upstream/<rama-default> --allow-unrelated-histories` con mensaje que nombre el template.
|
|
38
|
+
4. **Post-merge**: comandos del stack (`npm install`, `composer install`, …) y sustituciones acordadas.
|
|
39
|
+
5. **Conflictos**: si el merge falla, orientar resolución manual.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Registro de proyectos base
|
|
44
|
+
|
|
45
|
+
Cada fila describe **de dónde** se parte para crear el **proyecto nuevo** del usuario. El detalle operativo por stack vive en `references/<stack>.md` cuando exista.
|
|
46
|
+
|
|
47
|
+
| Tipo | Repo del proyecto base | Referencia |
|
|
48
|
+
|---------|-------------------------|------------|
|
|
49
|
+
| Angular | `https://github.com/juanca202/angular-base-project.git` | [references/angular.md](references/angular.md) |
|
|
50
|
+
| React | _TBD_ | _TBD_ |
|
|
51
|
+
| Symfony | _TBD_ | _TBD_ |
|
|
52
|
+
|
|
53
|
+
### Extender este skill
|
|
54
|
+
|
|
55
|
+
1. Añadir `references/<stack>.md` con el mismo nivel de detalle que Angular.
|
|
56
|
+
2. Registrar la fila en [Registro de proyectos base](#registro-de-proyectos-base) y enlazar desde la tabla “tipo de proyecto”.
|
|
57
|
+
3. Mantener la lista de stacks en la tabla alineada con los procedimientos reales de cada plantilla del equipo.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Proyecto nuevo Angular (desde plantilla `angular-base-project`)
|
|
2
|
+
|
|
3
|
+
## Alcance
|
|
4
|
+
|
|
5
|
+
Esta referencia describe cómo **crear un proyecto nuevo** para el usuario **a partir del proyecto base** del equipo (`angular-base-project`), dentro de un repositorio git **ya existente**.
|
|
6
|
+
|
|
7
|
+
- **Aplica** cuando el usuario pida un **proyecto Angular** nuevo.
|
|
8
|
+
- **No aplica** si el objetivo es **crear, publicar o mantener** el repositorio del proyecto base en sí; ese es otro proceso.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Requisitos previos
|
|
13
|
+
|
|
14
|
+
1. **Git**: el directorio de trabajo (`targetPath` o el actual) debe ser la **raíz de un repo** con `.git`. Si no existe: `git init` o clonar antes de seguir.
|
|
15
|
+
2. **Herramientas**: `git` y **Node/npm** disponibles en el PATH para `npm install` y `npm start`.
|
|
16
|
+
3. **Red**: acceso a GitHub para `git fetch` del remoto de la plantilla.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Parámetros
|
|
21
|
+
|
|
22
|
+
| Parámetro | Obligatorio | Descripción |
|
|
23
|
+
|----------------|-------------|-------------|
|
|
24
|
+
| `projectName` | Sí | Nombre legible del paquete / app (ej. `mi-app`). |
|
|
25
|
+
| `projectId` | Sí | Identificador (ej. `mi-app` o `com.empresa.miapp`). |
|
|
26
|
+
| `targetPath` | No | Raíz del repo donde ejecutar; si se omite o está vacío: directorio actual. |
|
|
27
|
+
|
|
28
|
+
### Validación
|
|
29
|
+
|
|
30
|
+
Ambos `projectName` y `projectId` deben cumplir:
|
|
31
|
+
|
|
32
|
+
- No vacíos; `projectName` máx. **64** caracteres, `projectId` máx. **128**.
|
|
33
|
+
- Patrón: deben **empezar** con letra o número; el resto puede ser letras, números, `.`, `_`, `-` (regex: `^[a-zA-Z0-9][a-zA-Z0-9._-]*$`).
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Proyecto base (plantilla)
|
|
38
|
+
|
|
39
|
+
| Concepto | Valor |
|
|
40
|
+
|----------|--------|
|
|
41
|
+
| URL del repo | `https://github.com/juanca202/angular-base-project.git` |
|
|
42
|
+
| Nombre del remote | `upstream` |
|
|
43
|
+
| Rama a integrar | `upstream/main` |
|
|
44
|
+
| Mensaje de merge sugerido | `Merge angular-base-project template` |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Procedimiento paso a paso
|
|
49
|
+
|
|
50
|
+
Ejecutar desde la **raíz del repo del usuario** (`targetPath`).
|
|
51
|
+
|
|
52
|
+
### 1. Añadir remote `upstream`
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
git remote add upstream https://github.com/juanca202/angular-base-project.git
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- Si Git responde que el remote **ya existe** y apunta al repo correcto del equipo, **continuar** sin duplicar.
|
|
59
|
+
- Si existe pero apunta a **otra** URL, no sobrescribir sin acuerdo con el usuario; puede ser un `upstream` legítimo para forks.
|
|
60
|
+
|
|
61
|
+
### 2. Obtener la plantilla
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
git fetch upstream
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 3. Merge con historias no relacionadas
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
git merge upstream/main --allow-unrelated-histories -m "Merge angular-base-project template"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
- Si hay **conflictos**, el usuario (o el agente guiando) debe resolverlos antes de seguir.
|
|
74
|
+
- Si la plantilla cambiara la rama por defecto en el futuro, ajustar la ref (`upstream/<rama>`) según el registro del skill principal.
|
|
75
|
+
|
|
76
|
+
### 4. Dependencias
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npm install
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
En la raíz del proyecto (donde está `package.json` tras el merge).
|
|
83
|
+
|
|
84
|
+
### 5. Personalizar `package.json`
|
|
85
|
+
|
|
86
|
+
- Campo **`name`**: debe quedar como `projectName` (valor JSON entre comillas dobles).
|
|
87
|
+
|
|
88
|
+
Sustituir el valor actual del campo `"name"` por `projectName`.
|
|
89
|
+
|
|
90
|
+
### 6. Personalizar environments (si existen)
|
|
91
|
+
|
|
92
|
+
Archivos típicos (rutas relativas al repo):
|
|
93
|
+
|
|
94
|
+
- `src/environments/environment.ts`
|
|
95
|
+
- `src/environments/environment.development.ts`
|
|
96
|
+
|
|
97
|
+
En cada uno que exista, alinear:
|
|
98
|
+
|
|
99
|
+
- `appName: '…'` → `appName: '<projectName>'` (comillas simples como en la plantilla esperada).
|
|
100
|
+
- `appId: '…'` → `appId: '<projectId>'`
|
|
101
|
+
|
|
102
|
+
Si la plantilla añade más archivos `environment.*.ts`, aplicar la misma convención si existe `appName` / `appId`.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Después del setup
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
npm start
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Desde la raíz del proyecto. Confirmar la ruta final con el usuario si usó `targetPath` distinto del cwd.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## Errores habituales
|
|
117
|
+
|
|
118
|
+
| Situación | Qué hacer |
|
|
119
|
+
|-----------|-----------|
|
|
120
|
+
| No hay `.git` en la ruta | Inicializar o clonar repo antes. |
|
|
121
|
+
| `git remote add` falla por otra razón que no sea “already exists” | Revisar stderr; corregir URL o nombre de remote. |
|
|
122
|
+
| `git fetch` / `git merge` fallan | Red, permisos, rama inexistente, o **conflictos** en merge. |
|
|
123
|
+
| `npm install` falla | Revisar versión de Node, lockfile, y errores de red/registry. |
|
|
124
|
+
| Validación de nombres | Ajustar `projectName` / `projectId` al patrón y longitudes indicados. |
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: user-story-add-task
|
|
3
|
+
description: Crea especificaciones en TK-XXX.md bajo docs/product/US-.../ (sin implementar código), con metadatos, unidad de trabajo obligatoria e implementador previsto opcional (inferible con git config user.name o lo que indique el usuario). Enlaza technical-docs y docs/adr; valida coherencia con la historia (US) y otras tareas.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Crear tarea de historia de usuario (TK-XXX)
|
|
7
|
+
|
|
8
|
+
## Alcance de este skill: solo especificaciones
|
|
9
|
+
|
|
10
|
+
Cuando se pida **crear una tarea**, el agente debe producir **únicamente el documento de especificación** (`TK-XXX-....md`) y, si corresponde, actualizar o enlazar documentación existente autorizada. **No implementar** código, migraciones, APIs ni pruebas: solo redactar las especificaciones que luego guiarán la implementación.
|
|
11
|
+
|
|
12
|
+
## Cuándo aplicar
|
|
13
|
+
|
|
14
|
+
Al documentar trabajo técnico asociado a una historia de usuario existente.
|
|
15
|
+
|
|
16
|
+
**Prerrequisito:** debe existir la carpeta `docs/product/US-XXX-[nombre-corto]/` con su `README.md`.
|
|
17
|
+
|
|
18
|
+
Las historias de usuario pueden descomponerse en tareas técnicas. Cada tarea se documenta en un **archivo independiente** dentro de la carpeta de la historia.
|
|
19
|
+
|
|
20
|
+
## Contexto obligatorio: la historia de usuario
|
|
21
|
+
|
|
22
|
+
Antes de redactar o crear el archivo de tarea:
|
|
23
|
+
|
|
24
|
+
1. **Leer y usar** el `README.md` de la historia (US-XXX) a la que pertenece la tarea como contexto principal (Como/Quiero/Para, características, reglas de negocio, criterios de aceptación).
|
|
25
|
+
2. **Revisar todas las tareas ya existentes** en esa misma carpeta (`TK-*.md` del mismo `US-XXX`) y comprobar que la nueva tarea **no contradiga** alcances, supuestos ni entregables de las demás; si hay solapamiento o conflicto, **aclarar con el usuario** o ajustar el alcance en el documento antes de dar la tarea por **lista para implementar**.
|
|
26
|
+
|
|
27
|
+
## Aclaraciones previas
|
|
28
|
+
|
|
29
|
+
Si la descripción solicitada para la tarea es **poco clara**, **incompleta** o **ambigua**, **no crear** aún el `TK-XXX-....md`. **Preguntar al usuario** lo necesario (límites técnicos, flujos, datos, integraciones, dependencias entre tareas, etc.) y **solo cuando la información sea suficiente** para cumplir la validación previa (apartado siguiente), proceder a la creación del documento.
|
|
30
|
+
|
|
31
|
+
## Validación previa a la creación del documento
|
|
32
|
+
|
|
33
|
+
Antes de crear el archivo de tarea, comprobar lo siguiente. Si algo no se cumple, resolver preguntando o completando referencias — **no avanzar** con un TK vacío o genérico.
|
|
34
|
+
|
|
35
|
+
- **Sin ambigüedades:** la descripción y el alcance técnico se entienden sin suposiciones ocultas.
|
|
36
|
+
- **Contexto técnico suficiente** en la medida que aplique, referenciado o explícito: por ejemplo modelo **entidad-relación** o esquema de datos, **DTOs** o contratos, **flujos** (secuencia, estados), y decisiones de arquitectura ya documentadas.
|
|
37
|
+
- **ADRs y arquitectura:** las definiciones arquitectónicas deben **apoyarse en ADRs existentes** bajo **`docs/adr/`**. **No crear** archivos ADR de forma automática. Si la tarea revela la necesidad de una decisión arquitectónica no documentada, **sugerir al usuario** que conviene añadir o actualizar un ADR en `docs/adr/` y enlazarlo desde la tarea cuando exista.
|
|
38
|
+
- **Referencias:** usar `docs/product/technical-docs/` para detalle técnico de producto (DTOs, endpoints, etc.) cuando aporte claridad, y rutas al código o contratos del repo según el proyecto.
|
|
39
|
+
- **Unidad de trabajo:** debe estar definida (inferida con criterio o confirmada por el usuario); sin ella, no crear el TK.
|
|
40
|
+
|
|
41
|
+
## Ubicación
|
|
42
|
+
|
|
43
|
+
- Directorio: `docs/product/US-XXX-[nombre-corto]/` (mismo nivel que `README.md` y `assets/`).
|
|
44
|
+
- Documentación transversal (DTOs, contratos API, etc.): `docs/product/technical-docs/`, enlazada con rutas relativas desde la tarea (`../technical-docs/...`).
|
|
45
|
+
- Decisiones de arquitectura: enlazar archivos bajo **`docs/adr/`** con ruta relativa adecuada desde el repo (p. ej. `../../../docs/adr/...` según la profundidad real del proyecto).
|
|
46
|
+
|
|
47
|
+
## Formato del nombre del archivo
|
|
48
|
+
|
|
49
|
+
`TK-XXX-[nombre-descriptivo].md`
|
|
50
|
+
|
|
51
|
+
**Convenciones:**
|
|
52
|
+
|
|
53
|
+
- El prefijo `TK-XXX` debe estar en mayúsculas (ejemplo: `TK-001`, `TK-002`)
|
|
54
|
+
- El número es secuencial **dentro de la historia**
|
|
55
|
+
- El nombre descriptivo debe estar en minúsculas y en formato kebab-case
|
|
56
|
+
- Ejemplos: `TK-001-seleccion-materiales.md`, `TK-002-creacion-dry-good-temporal.md`
|
|
57
|
+
|
|
58
|
+
## Metadatos en cabecera y unidad de trabajo
|
|
59
|
+
|
|
60
|
+
Toda tarea debe incluir al inicio del cuerpo (después del título `#`), una lista de metadatos **en el mismo espíritu** que la historia de usuario:
|
|
61
|
+
|
|
62
|
+
- **ID:** `TK-XXX` (alineado al archivo y al título)
|
|
63
|
+
- **Nombre corto:** etiqueta breve de la tarea
|
|
64
|
+
- **Estado:** Draft / Ready / In Progress / Done
|
|
65
|
+
- **Prioridad:** Alta / Media / Baja
|
|
66
|
+
|
|
67
|
+
### Implementador previsto (opcional)
|
|
68
|
+
|
|
69
|
+
Campo **no obligatorio** que indica **quién** tiene previsto implementar la tarea.
|
|
70
|
+
|
|
71
|
+
- Si el **usuario** indica responsable o implementador, usar **esa** indicación.
|
|
72
|
+
- Si no lo indica y conviene rellenarlo, el agente puede **inferir** el valor con la configuración de Git del entorno: `git config user.name` (nombre habitual en el repo local). Si no hay valor útil, omitir la línea o dejar explícito que está pendiente de asignar.
|
|
73
|
+
- **No** es requisito para dar la tarea por lista para implementar: se puede omitir toda la línea.
|
|
74
|
+
|
|
75
|
+
### Unidad de trabajo (obligatoria)
|
|
76
|
+
|
|
77
|
+
El campo **Unidad de trabajo** es **obligatorio** en cada `TK-XXX`: identifica *dónde* o *en qué artefacto del ecosistema* se ejecuta principalmente el trabajo (paquete, app, módulo, servicio, librería, etc.).
|
|
78
|
+
|
|
79
|
+
- **Inferencia:** si el contexto del repositorio lo permite, el agente puede **inferir** la unidad sin preguntar. Ejemplos:
|
|
80
|
+
- Proyecto **npm/node:** el campo `name` del `package.json` más cercano al alcance de la tarea (raíz del paquete o workspace).
|
|
81
|
+
- **Monorepo:** nombre del paquete o app concreta (según `package.json`, `pnpm-workspace`, `nx.json`, etc.).
|
|
82
|
+
- Otros tipos: equivalente habitual del stack (módulo Gradle/Maven, proyecto .NET, crate de Rust, etc.) según archivos del repo.
|
|
83
|
+
- Si **no** está claro qué conviene (varios paquetes, límites difusos, tarea transversal), **preguntar al usuario** qué unidad de trabajo debe constar antes de crear el documento.
|
|
84
|
+
|
|
85
|
+
En la plantilla, el valor debe quedar escrito de forma explícita (p. ej. `**Unidad de trabajo:** @scope/mi-paquete` o el nombre acordado con el usuario).
|
|
86
|
+
|
|
87
|
+
## Plantilla del documento
|
|
88
|
+
|
|
89
|
+
```markdown
|
|
90
|
+
# TK-XXX: Título corto de la tarea
|
|
91
|
+
|
|
92
|
+
- **ID:** TK-XXX
|
|
93
|
+
- **Nombre corto:**
|
|
94
|
+
- **Estado:** Draft / Ready / In Progress / Done
|
|
95
|
+
- **Prioridad:** Alta / Media / Baja
|
|
96
|
+
- **Unidad de trabajo:** _[obligatorio: paquete/módulo/servicio/etc.; inferido del proyecto o indicado por el usuario]_
|
|
97
|
+
- **Implementador previsto:** _[opcional — priorizar lo indicado por el usuario; si no, inferir con `git config user.name`; omitir línea si no aplica]_
|
|
98
|
+
|
|
99
|
+
## Descripción
|
|
100
|
+
|
|
101
|
+
[Descripción técnica de qué implementar y desde dónde se accede — sin ambigüedad]
|
|
102
|
+
|
|
103
|
+
## Referencias
|
|
104
|
+
|
|
105
|
+
- **Historia de usuario:** [US-XXX](./README.md) — Nombre de la historia
|
|
106
|
+
- **ADRs (arquitectura):** enlaces a `docs/adr/...` cuando la tarea dependa de decisiones ya registradas; no inventar ADRs nuevos
|
|
107
|
+
- **Documentación técnica (producto):** [título](../technical-docs/archivo.md) — DTOs, ER, flujos, endpoints en `docs/product/technical-docs/` si aplica
|
|
108
|
+
- **Modelos de datos / código:** rutas o enlaces en el repo
|
|
109
|
+
- **Diseño:** [Figma - ...](URL)
|
|
110
|
+
- **Punto de acceso:** ruta en el código
|
|
111
|
+
- **Plantilla:** componente o patrón a reutilizar
|
|
112
|
+
|
|
113
|
+
## Componentes a usar
|
|
114
|
+
|
|
115
|
+
- Lista de componentes UI o servicios existentes
|
|
116
|
+
|
|
117
|
+
## Criterios de aceptación
|
|
118
|
+
|
|
119
|
+
- Criterio 1
|
|
120
|
+
- Criterio 2
|
|
121
|
+
- ...
|
|
122
|
+
|
|
123
|
+
## Alcance técnico
|
|
124
|
+
|
|
125
|
+
- Modelos, DTOs, componentes, repositorios, mutaciones involucradas
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Alcance del contenido (técnico)
|
|
129
|
+
|
|
130
|
+
La tarea debe ser **técnica**: implementación *descrita*, componentes, modelos, repositorios y criterios verificables por desarrollo. No duplicar la narrativa funcional de la historia de usuario; enlazar `./README.md`.
|
|
131
|
+
|
|
132
|
+
### Validación de contexto (funcional vs técnico)
|
|
133
|
+
|
|
134
|
+
Antes de dar una tarea por **lista para implementar**, valida que el contexto sea **técnico** (no solo lenguaje funcional del `README.md` de la historia).
|
|
135
|
+
|
|
136
|
+
| Artefacto | Contexto esperado | Ejemplo |
|
|
137
|
+
| --- | --- | --- |
|
|
138
|
+
| **Historia de usuario** (`README.md`) | **Funcional** — valor para el usuario, negocio y criterios en lenguaje de dominio | "Como desarrollador quiero agregar materiales temporales para analizar costos" |
|
|
139
|
+
| **Tarea** (`TK-XXX`) | **Técnico** — implementación, componentes, modelos, repositorios y criterios verificables por desarrollo | "Implementar el diálogo DryGoodPicker usando Material Button, Checkbox y DryGoodRepository" |
|
|
140
|
+
|
|
141
|
+
Para la historia: contexto funcional. Para la tarea: contexto técnico y **lista para implementar** solo si cumple las validaciones de este skill.
|
|
142
|
+
|
|
143
|
+
## Checklist de evaluación — Tarea (lista para implementar)
|
|
144
|
+
|
|
145
|
+
Antes de considerar una tarea **lista para implementar**, pásala por este checklist:
|
|
146
|
+
|
|
147
|
+
- ¿Está alineada con el `README.md` de la historia (misma carpeta `US-XXX-...`) y **no entra en conflicto** con otras `TK-*.md` de la misma historia?
|
|
148
|
+
- ¿La descripción **no tiene ambigüedades** y el contexto necesario está citado o descrito (ER, DTOs, flujos, **ADRs en `docs/adr/`**, etc.)?
|
|
149
|
+
- ¿Tiene referencia explícita a la historia de usuario?
|
|
150
|
+
- ¿La descripción usa contexto técnico (no funcional)?
|
|
151
|
+
- ¿Incluye referencias necesarias (technical-docs, diseño, punto de acceso, plantilla, ADRs existentes)?
|
|
152
|
+
- ¿Los criterios de aceptación son verificables por desarrollo?
|
|
153
|
+
- ¿El alcance técnico está definido (componentes, repositorios, DTOs)?
|
|
154
|
+
- ¿Está acotada y se puede implementar en un sprint?
|
|
155
|
+
- ¿Se ha **especificado** el trabajo sin **implementar** código en el repositorio?
|
|
156
|
+
- ¿Consta la **unidad de trabajo** (inferida del tipo de proyecto o confirmada preguntando al usuario)?
|
|
157
|
+
- (Opcional) Si figura **Implementador previsto**, ¿coincide con lo dicho por el usuario o con `git config user.name` cuando se infirió?
|
|
158
|
+
|
|
159
|
+
## Pasos para el agente
|
|
160
|
+
|
|
161
|
+
1. Leer `./README.md` de la historia objetivo (carpeta `docs/product/US-XXX-...`) y **todas** las tareas `TK-*.md` ya existentes en esa carpeta; detectar solapamientos o conflictos y resolverlos con el usuario o en el texto.
|
|
162
|
+
2. Determinar **unidad de trabajo**: revisar contexto del repo (p. ej. `package.json`, estructura de monorepo) para inferirla; si no es clara, **preguntar al usuario** antes de crear el archivo.
|
|
163
|
+
3. **Implementador previsto (opcional):** si el usuario indica quién implementa, usar ese valor; si no y conviene rellenarlo, obtener `git config user.name` en el repositorio y añadir el campo solo si el resultado es útil; en caso contrario omitir la línea.
|
|
164
|
+
4. Si la petición es incompleta o ambigua, **preguntar aclaraciones**; **no crear** el archivo hasta tener información suficiente para la [Validación previa a la creación del documento](#validación-previa-a-la-creación-del-documento).
|
|
165
|
+
5. Verificar criterios de validación previa (sin ambigüedad, unidad de trabajo definida, contexto ER/DTOs/flujos/ADRs según aplique; **ADRs solo como referencia a `docs/adr/`** o sugerencia explícita al usuario si falta decisión documentada).
|
|
166
|
+
6. Identificar el siguiente `TK-XXX` en esa carpeta.
|
|
167
|
+
7. **Solo entonces** crear el archivo `TK-XXX-....md` con la plantilla (metadatos + **Unidad de trabajo** rellenados; **Implementador previsto** solo si aplica); **no** implementar producto ni tests.
|
|
168
|
+
8. Si hace falta documentación en `docs/product/technical-docs/`, crear o actualizar allí y enlazar; **no** crear ADRs automáticamente — sugerir al usuario si procede.
|
|
169
|
+
9. Asegurar el enlace a la historia de usuario: `[US-XXX](./README.md)`.
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: user-story-create
|
|
3
|
+
description: Crea historias de usuario US-XXX bajo docs/product/ con plantilla funcional, Given/When/Then, INVEST, Fibonacci y Definition of Ready. Si la descripción o características son ambiguas o faltan datos para INVEST, pregunta al usuario antes de crear la historia. Usar al crear historias de usuario o docs de producto; technical-docs cuando corresponda.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Crear historia de usuario
|
|
7
|
+
|
|
8
|
+
## Cuándo aplicar
|
|
9
|
+
|
|
10
|
+
Al generar o reorganizar una historia de usuario según las convenciones de este repositorio.
|
|
11
|
+
|
|
12
|
+
## Aclaraciones previas (INVEST)
|
|
13
|
+
|
|
14
|
+
Antes de crear la historia, revisar la **descripción**, las **características**, reglas de negocio y cualquier contexto aportado. Si hay **ambigüedad**, **huecos** o **falta de información** que impida completar con criterio honesto la **validación INVEST** (p. ej. usuario o valor poco claro, alcance indefinido, dependencias desconocidas, criterios de aceptación imposibles de testear sin más detalle), **no** crear aún la carpeta ni el `README.md`.
|
|
15
|
+
|
|
16
|
+
En ese caso, **preguntar al usuario** de forma explícita todo lo necesario: actor y beneficio, límites del alcance, reglas y excepciones, integraciones o dependencias con otras historias (US) o sistemas, supuestos de datos o permisos, y cualquier matiz que permita redactar criterios **Given / When / Then** y valorar **I, N, V, E, S, T** sin forzar respuestas. Solo cuando los insumos sean suficientes, proceder con la creación de la historia.
|
|
17
|
+
|
|
18
|
+
## Estructura de carpetas
|
|
19
|
+
|
|
20
|
+
Cada historia de usuario se organiza bajo **`docs/product/`**:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
docs/product/
|
|
24
|
+
├── technical-docs/ (Opcional — documentación técnica transversal o por feature)
|
|
25
|
+
│ └── ...
|
|
26
|
+
└── US-[Número]-[Nombre-corto]/
|
|
27
|
+
├── README.md (Historia de usuario — contexto funcional)
|
|
28
|
+
├── TK-XXX-[nombre-tarea].md (Tareas — contexto técnico, opcional; ver skill user-story-add-task)
|
|
29
|
+
└── assets/
|
|
30
|
+
├── imagen-1.png
|
|
31
|
+
├── diagrama-flujo.svg
|
|
32
|
+
└── ...
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**`docs/product/technical-docs/`:** usar para documentar DTOs, entidades, endpoints, reglas de negocio **técnicas** (validaciones, contratos API, invariantes de implementación), etc. Las reglas en **lenguaje de negocio** siguen en el `README.md` de la historia. Nombrar archivos en kebab-case y enlazarlos desde el `README.md` o desde los `TK-XXX` con rutas relativas (por ejemplo `../technical-docs/contrato-api.md`).
|
|
36
|
+
|
|
37
|
+
### Convenciones del nombre de carpeta
|
|
38
|
+
|
|
39
|
+
- El nombre de la carpeta debe seguir el formato: `US-XXX-[nombre-corto]`
|
|
40
|
+
- El código `US-XXX` debe estar en mayúsculas (ejemplo: `US-001`, `US-002`)
|
|
41
|
+
- El nombre corto debe estar completamente en minúsculas
|
|
42
|
+
- El nombre corto debe ser en formato kebab-case (palabras separadas por guiones)
|
|
43
|
+
- **El nombre debe ser descriptivo pero corto**: eliminar palabras innecesarias como artículos ("de", "del", "la", "una"), preposiciones redundantes y frases largas. Priorizar palabras clave que identifiquen claramente la funcionalidad.
|
|
44
|
+
- Ejemplos de nombres cortos y descriptivos:
|
|
45
|
+
- `US-001-seleccion-item-sdp-desde-receta` (en lugar de "seleccion-de-item-de-sdp-cuando-estoy-en-la-receta")
|
|
46
|
+
- `US-002-seleccion-item-sdp-desde-sdp` (en lugar de "seleccion-de-item-de-sdp-cuando-estoy-en-el-sdp")
|
|
47
|
+
- `US-003-mostrar-contexto-al-crear-receta` (en lugar de "mostrar-datos-de-contexto-al-crear-una-receta")
|
|
48
|
+
- `US-004-resumen-costos-receta` (en lugar de "visualizar-resumen-de-costos-de-la-receta")
|
|
49
|
+
- `US-007-importar-receta` (en lugar de "importar-una-receta")
|
|
50
|
+
- El archivo principal siempre debe llamarse `README.md`
|
|
51
|
+
- Todas las imágenes y recursos visuales deben estar en la carpeta `assets/`
|
|
52
|
+
- Las referencias a imágenes en el README.md deben usar rutas relativas: ``
|
|
53
|
+
|
|
54
|
+
## Plantilla README.md
|
|
55
|
+
|
|
56
|
+
Usar esta estructura en el `README.md` de la carpeta de la historia (`US-XXX-...`).
|
|
57
|
+
|
|
58
|
+
````markdown
|
|
59
|
+
- **ID:** US-XXX
|
|
60
|
+
- **Nombre corto:**
|
|
61
|
+
- **Estado:** Draft / Ready / In Progress / Done
|
|
62
|
+
- **Prioridad:** Alta / Media / Baja
|
|
63
|
+
|
|
64
|
+
## Descripción
|
|
65
|
+
|
|
66
|
+
**Como** _[tipo de usuario]_
|
|
67
|
+
**Quiero** _[necesidad / acción]_
|
|
68
|
+
**Para** _[beneficio / resultado esperado]_
|
|
69
|
+
|
|
70
|
+
## Características
|
|
71
|
+
|
|
72
|
+
- Característica 1:
|
|
73
|
+
- Característica 2:
|
|
74
|
+
- Característica 3:
|
|
75
|
+
|
|
76
|
+
## Reglas de negocio
|
|
77
|
+
|
|
78
|
+
- Regla 1
|
|
79
|
+
- Regla 2
|
|
80
|
+
- Regla 3
|
|
81
|
+
|
|
82
|
+
## Criterios de Aceptación
|
|
83
|
+
|
|
84
|
+
Formato **Given / When / Then** (obligatorio para considerarse "Ready").
|
|
85
|
+
|
|
86
|
+
```gherkin
|
|
87
|
+
Given
|
|
88
|
+
When
|
|
89
|
+
Then
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Validación INVEST
|
|
93
|
+
|
|
94
|
+
La historia debe alinearse con el modelo **INVEST**. Marcar cada criterio solo si se cumple; si alguno no aplica o está en riesgo, documentarlo en observaciones.
|
|
95
|
+
|
|
96
|
+
- [ ] **I — Independiente:** se puede entregar valor sin quedar bloqueada por otras historias no resueltas (o las dependencias están explícitas y acotadas).
|
|
97
|
+
- [ ] **N — Negociable:** el detalle del *qué* es discutible con producto; no impone solución técnica cerrada.
|
|
98
|
+
- [ ] **V — Valiosa:** beneficio claro para usuario o negocio.
|
|
99
|
+
- [ ] **E — Estimable:** hay suficiente contexto para que el equipo estime con confianza razonable.
|
|
100
|
+
- [ ] **S — Pequeña:** alcance acotado para completarse en un sprint; si no, conviene dividir la historia.
|
|
101
|
+
- [ ] **T — Testeable:** los criterios de aceptación permiten comprobar el resultado de forma objetiva.
|
|
102
|
+
|
|
103
|
+
## Complejidad (Fibonacci)
|
|
104
|
+
|
|
105
|
+
Usar la escala típica de story points: **1, 2, 3, 5, 8, 13** (solo Fibonacci en ese conjunto).
|
|
106
|
+
|
|
107
|
+
- **Story points propuestos:** _[elegir uno: 1 | 2 | 3 | 5 | 8 | 13]_
|
|
108
|
+
- **Justificación breve:** _[por qué ese valor: incertidumbre, alcance, integraciones, riesgo]_
|
|
109
|
+
|
|
110
|
+
El agente debe **proponer** un valor y una justificación acorde al alcance descrito; el equipo puede ajustarlo en refinamiento.
|
|
111
|
+
|
|
112
|
+
## Definition of Ready
|
|
113
|
+
|
|
114
|
+
Criterios para considerar la historia lista para entrar a planificación / desarrollo. Marcar cuando se cumplan:
|
|
115
|
+
|
|
116
|
+
- [ ] Descripción **Como / Quiero / Para** clara y sin ambigüedad mayor
|
|
117
|
+
- [ ] Criterios de aceptación en **Given / When / Then** redactados
|
|
118
|
+
- [ ] Reglas de negocio y alcance revisados con producto (o explícitamente pendientes en Observaciones)
|
|
119
|
+
- [ ] **INVEST** revisado; bloqueos o dependencias críticas documentadas
|
|
120
|
+
- [ ] Dependencias externas identificadas (diseño, APIs, datos, otras historias US, flags)
|
|
121
|
+
- [ ] **Estimación Fibonacci** propuesta y registrada arriba
|
|
122
|
+
- [ ] Prioridad y valor de negocio coherentes con el backlog
|
|
123
|
+
|
|
124
|
+
## Observaciones
|
|
125
|
+
|
|
126
|
+
- Observaciones adicionales:
|
|
127
|
+
- Notas importantes:
|
|
128
|
+
- Decisiones pendientes:
|
|
129
|
+
````
|
|
130
|
+
|
|
131
|
+
## Alcance del contenido (funcional)
|
|
132
|
+
|
|
133
|
+
La historia debe ser **funcional**: valor para el usuario, el problema de negocio y los criterios de aceptación en lenguaje de dominio — no detalle de implementación (eso va en tareas `TK-XXX` y en `technical-docs/` si aplica).
|
|
134
|
+
|
|
135
|
+
### Validación de contexto
|
|
136
|
+
|
|
137
|
+
Antes de dar una historia por **lista**, valida que el contexto sea **funcional** (no técnico).
|
|
138
|
+
|
|
139
|
+
| Artefacto | Contexto esperado | Ejemplo |
|
|
140
|
+
| --- | --- | --- |
|
|
141
|
+
| **Historia de usuario** (`README.md`) | **Funcional** — valor para el usuario, negocio y criterios en lenguaje de dominio | "Como desarrollador quiero agregar materiales temporales para analizar costos" |
|
|
142
|
+
| **Tarea** (`TK-XXX`) | **Técnico** — implementación, componentes, modelos, repositorios y criterios verificables por desarrollo | "Implementar el diálogo DryGoodPicker usando Material Button, Checkbox y DryGoodRepository" |
|
|
143
|
+
|
|
144
|
+
Para crear o revisar tareas, usar el skill **user-story-add-task**.
|
|
145
|
+
|
|
146
|
+
## Checklist de evaluación — Historia de usuario
|
|
147
|
+
|
|
148
|
+
Antes de dar una historia como "lista", pásala por este checklist (complementa **INVEST** y **Definition of Ready** en la plantilla):
|
|
149
|
+
|
|
150
|
+
- ¿Tiene usuario, acción y razón?
|
|
151
|
+
- ¿Es comprensible por producto y dev?
|
|
152
|
+
- ¿Tiene criterios de aceptación claros?
|
|
153
|
+
- ¿Se puede verificar con pruebas?
|
|
154
|
+
- ¿Tiene criterios de "no casos"? (edge cases)
|
|
155
|
+
- ¿Está acotada / no es demasiado grande?
|
|
156
|
+
|
|
157
|
+
## Pasos para el agente
|
|
158
|
+
|
|
159
|
+
1. Analizar descripción, **características** y contexto: si hay ambigüedad o falta información para cumplir **INVEST** con rigor, **preguntar primero** al usuario (ver [Aclaraciones previas](#aclaraciones-previas-invest)); no crear archivos hasta tener respuestas suficientes.
|
|
160
|
+
2. Determinar el siguiente `US-XXX` si no lo da el usuario (revisar carpetas `US-*` existentes en `docs/product/`).
|
|
161
|
+
3. Proponer `nombre-corto` en kebab-case según las convenciones anteriores.
|
|
162
|
+
4. Crear carpeta `docs/product/US-XXX-[nombre-corto]/` y `assets/` si hay o habrá imágenes.
|
|
163
|
+
5. Escribir `README.md` con la plantilla completa, rellenando con la información del usuario.
|
|
164
|
+
6. Si el usuario pide DTOs, entidades, endpoints o reglas técnicas documentadas: crear `docs/product/technical-docs/` si no existe y añadir o actualizar los documentos allí; enlazarlos desde la historia o desde las tareas.
|
|
165
|
+
7. Completar **Validación INVEST** (valorar cada letra; si algo falla, anotarlo en Observaciones).
|
|
166
|
+
8. **Proponer story points (Fibonacci: 1, 2, 3, 5, 8, 13)** con justificación breve según alcance, riesgo e incertidumbre.
|
|
167
|
+
9. Rellenar el checklist **Definition of Ready**; estado **Ready** implica criterios Given/When/Then en gherkin y, idealmente, DoR marcado en lo esencial según el equipo.
|