@arcadialdev/arcality 4.1.0 → 4.1.1
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/.agents/skills/db-validation-evidence/SKILL.md +43 -0
- package/.agents/skills/db-validation-evidence/agents/openai.yaml +4 -0
- package/.agents/skills/db-validation-evidence/references/mission-patterns.md +130 -0
- package/.agents/skills/evidence-synthesis-reporting/SKILL.md +31 -0
- package/.agents/skills/form-expert/SKILL.md +98 -0
- package/.agents/skills/investigation-protocol/SKILL.md +56 -0
- package/.agents/skills/mission-generation-reviewer/SKILL.md +25 -0
- package/.agents/skills/modal-master/SKILL.md +46 -0
- package/.agents/skills/native-control-expert/SKILL.md +74 -0
- package/.agents/skills/qa-context-governance/SKILL.md +23 -0
- package/.agents/skills/security-evidence-triage/SKILL.md +23 -0
- package/.agents/skills/test-data-lifecycle/SKILL.md +24 -0
- package/README.md +103 -163
- package/bin/arcality.mjs +25 -25
- package/package.json +75 -75
- package/scripts/edit-config.mjs +843 -0
- package/scripts/gen-and-run.mjs +237 -169
- package/scripts/generate.mjs +236 -236
- package/scripts/init.mjs +47 -47
- package/src/configManager.mjs +13 -13
- package/src/envSetup.ts +229 -205
- package/src/services/codebaseAnalyzer.mjs +59 -59
- package/src/services/databaseValidationService.mjs +598 -0
- package/src/services/executionEvidenceService.mjs +124 -0
- package/src/services/generatedMissionSchema.mjs +76 -76
- package/src/services/generatedMissionStore.mjs +117 -117
- package/src/services/generationContext.mjs +242 -242
- package/src/services/mcpStdioClient.mjs +204 -0
- package/src/services/missionGenerator.mjs +329 -329
- package/src/services/routeDiscovery.mjs +762 -762
- package/tests/_helpers/ArcalityReporter.js +1342 -1255
- package/tests/_helpers/agentic-runner.bundle.spec.js +1354 -243
- package/.agent/skills/form-expert.md +0 -102
- package/.agent/skills/investigation-protocol.md +0 -61
- package/.agent/skills/modal-master.md +0 -41
- package/.agent/skills/native-control-expert.md +0 -82
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: form-expert
|
|
3
|
-
description: Metodología experta para explorar, identificar y llenar formularios complejos en aplicaciones web.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Form Expert Skill
|
|
7
|
-
|
|
8
|
-
Esta habilidad define el protocolo que el agente DEBE seguir cuando la misión involucra llenar, crear o editar registros a través de formularios.
|
|
9
|
-
|
|
10
|
-
## Principio Fundamental
|
|
11
|
-
**NUNCA interactúes con un campo que no hayas inspeccionado primero.** Si un componente tiene un nombre genérico, un tag inferred como `[INFERRED]`, o simplemente no estás seguro de qué es, usa `inspect_element_details` ANTES de hacer click o fill.
|
|
12
|
-
|
|
13
|
-
## Protocolo de Formularios (4 fases obligatorias)
|
|
14
|
-
|
|
15
|
-
### Fase 1: RECONOCIMIENTO (Scan)
|
|
16
|
-
Antes de llenar cualquier campo, dedica tu primer turno en el formulario a **analizar todos los componentes visibles**:
|
|
17
|
-
|
|
18
|
-
1. **Lee la lista completa de CURRENT COMPONENTS** — identifica:
|
|
19
|
-
- Campos de tipo FIELD (inputs, textareas, selects)
|
|
20
|
-
- Campos con label visible (prioritarios)
|
|
21
|
-
- Campos sin label o con nombre genérico (requieren inspección)
|
|
22
|
-
- Botones de acción (GUARDAR, CANCELAR, etc.)
|
|
23
|
-
- Tabs o pestañas si el formulario tiene secciones
|
|
24
|
-
|
|
25
|
-
2. **Clasifica los campos** en:
|
|
26
|
-
- ✅ **Confiables**: Tienen un nombre claro como `[input] Título del documento`
|
|
27
|
-
- ⚠️ **Sospechosos**: Tienen nombre genérico como `[input] Editar` o `[INFERRED] xxx`
|
|
28
|
-
- ❌ **Desconocidos**: Solo tienen tag genérico como `[input]`
|
|
29
|
-
|
|
30
|
-
3. **Para campos sospechosos o desconocidos**: Usa `inspect_element_details` para obtener:
|
|
31
|
-
- El placeholder text
|
|
32
|
-
- El aria-label
|
|
33
|
-
- El atributo name o id
|
|
34
|
-
- Si está disabled o readonly
|
|
35
|
-
|
|
36
|
-
### Fase 2: PLANIFICACIÓN (Plan)
|
|
37
|
-
Con la información del reconocimiento, planifica la secuencia de acciones:
|
|
38
|
-
|
|
39
|
-
1. **Prioriza los campos obligatorios** — los que tienen asterisco (*), clase "required", o están marcados en rojo.
|
|
40
|
-
2. **Genera datos únicos** — Si la misión dice "genérico" o "aleatorio", genera datos que incluyan un timestamp o ID único para evitar duplicados. Ejemplo: `TEST-${timestamp}` o `Prueba QA Feb24`.
|
|
41
|
-
3. **Planifica el orden**: Llena los campos de arriba a abajo, izquierda a derecha, siguiendo el orden del DOM.
|
|
42
|
-
|
|
43
|
-
### Fase 3: EJECUCIÓN (Act)
|
|
44
|
-
Ejecuta las acciones planificadas:
|
|
45
|
-
|
|
46
|
-
1. **Llena múltiples campos por turno** — No pierdas un turno por campo. Agrupa 3-5 fills en una sola llamada a `perform_ui_actions`.
|
|
47
|
-
2. **Para cada campo fill**: click + fill (en ese orden). El click asegura que el campo tiene focus.
|
|
48
|
-
3. **Para dropdowns/selects** — Protocolo de Re-render:
|
|
49
|
-
- **Turno A**: Click para abrir el dropdown, espera el siguiente turno para ver las opciones.
|
|
50
|
-
- **Turno B**: Click en la opción deseada. ¡PRECAUCIÓN DE SEGURIDAD DOM! Si el formulario requiere llenar más campos después de seleccionar (ej. se habilitan nuevos inputs), **DETENTE AQUÍ**. NO agrupes el select con los siguientes fills en el mismo turno, porque React re-redenrizará el DOM y tus IDs se romperán. Espera al Turno C para seguir llenando.
|
|
51
|
-
- Si la selección del dropdown era el *último* paso, Y YA NO HAY MÁS campos que llenar, SÍ puedes hacer click en `Siguiente`/`Guardar` en ese mismo turno.
|
|
52
|
-
4. **Si un fill falla**: NO reintentes inmediatamente. Usa `inspect_element_details` para ver si el campo es un select, un datepicker, o tiene un overlay encima.
|
|
53
|
-
|
|
54
|
-
### Fase 4: VERIFICACIÓN (Verify)
|
|
55
|
-
Antes de hacer GUARDAR:
|
|
56
|
-
|
|
57
|
-
1. **Usa `validate_element_state`** en el botón de GUARDAR para confirmar que está enabled.
|
|
58
|
-
2. **Revisa visualmente** si hay campos en rojo o mensajes de error.
|
|
59
|
-
3. **Solo entonces** haz click en GUARDAR.
|
|
60
|
-
4. **Después de GUARDAR**: Espera la respuesta de la UI. Si aparece un toast de éxito o regresas a la lista, la misión fue exitosa.
|
|
61
|
-
|
|
62
|
-
## Manejo de Errores en Formularios
|
|
63
|
-
|
|
64
|
-
### Si un campo falla con Timeout:
|
|
65
|
-
```
|
|
66
|
-
1. NO reintentes el mismo click/fill inmediatamente
|
|
67
|
-
2. Usa inspect_element_details en ese IDX
|
|
68
|
-
3. Analiza si:
|
|
69
|
-
- El elemento está cubierto por un overlay/modal
|
|
70
|
-
- El elemento es readonly/disabled
|
|
71
|
-
- El IDX cambió (la página se re-renderizó)
|
|
72
|
-
4. Si el elemento no sirve, busca un campo alternativo con nombre similar
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### Si aparece un error de "duplicado" o "ya existe":
|
|
76
|
-
```
|
|
77
|
-
1. Identifica qué campo causó el error (claves, códigos, nombres)
|
|
78
|
-
2. Cambia el valor a algo único (agrega sufijo numérico o timestamp)
|
|
79
|
-
3. Reintenta GUARDAR
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Si el formulario tiene tabs o secciones:
|
|
83
|
-
```
|
|
84
|
-
1. Llena los campos de la sección actual PRIMERO.
|
|
85
|
-
2. Identifica el elemento de la pestaña: Busca el texto de la pestaña (ej: "CAMPOS DE LA FORMA") en componentes tipo ACTION.
|
|
86
|
-
3. PRECISIÓN: Evita hacer click en contenedores grandes que agrupan varias pestañas. Prefiere el elemento más pequeño (span o label) que contenga el texto exacto.
|
|
87
|
-
4. Haz click en la pestaña. Si un click simple no funciona tras 2 intentos, usa 'double_click'.
|
|
88
|
-
5. Espera el siguiente turno para ver los nuevos campos.
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Uso de Double Click
|
|
92
|
-
- Úsalo SOLO cuando:
|
|
93
|
-
- La misión lo pida explícitamente (ej: "haz doble clic en la celda").
|
|
94
|
-
- Un elemento (como una pestaña o un icono) no responda tras dos intentos de click simple.
|
|
95
|
-
- Quieras activar modos de edición en tablas o componentes complejos.
|
|
96
|
-
|
|
97
|
-
## Anti-patrones (NUNCA hagas esto)
|
|
98
|
-
- ❌ Hacer click en un campo `[INFERRED]` sin inspeccionarlo primero
|
|
99
|
-
- ❌ Intentar llenar TODO el formulario en el primer turno sin saber qué campos hay
|
|
100
|
-
- ❌ Hacer click en el botón GUARDAR sin haber verificado que los campos están llenos
|
|
101
|
-
- ❌ Reintentar la misma acción fallida sin investigar la causa
|
|
102
|
-
- ❌ Asumir que un componente con nombre largo (>50 chars) es un campo — probablemente es un contenedor
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: investigation-protocol
|
|
3
|
-
description: Protocolo obligatorio de investigación cuando una acción falla o un elemento es ambiguo.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Investigation Protocol Skill
|
|
7
|
-
|
|
8
|
-
## Regla de Oro
|
|
9
|
-
**NUNCA reintentes una acción fallida sin investigar primero.** Si algo falla, SIEMPRE ejecuta el protocolo de investigación antes de intentar de nuevo.
|
|
10
|
-
|
|
11
|
-
## Protocolo de Investigación (Obligatorio tras cualquier fallo)
|
|
12
|
-
|
|
13
|
-
### Paso 1: Inspección del elemento
|
|
14
|
-
```
|
|
15
|
-
Usa: inspect_element_details (idx del elemento que falló)
|
|
16
|
-
Objetivo: Determinar POR QUÉ falló
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
Revisa en el resultado:
|
|
20
|
-
- ¿El elemento es `disabled` o `readonly`?
|
|
21
|
-
- ¿El elemento está cubierto por otro (`pointer-events: none`, overlay)?
|
|
22
|
-
- ¿El elemento es un `<select>` que requiere interacción diferente a fill?
|
|
23
|
-
- ¿El elemento está en un iframe diferente (`frameIdx`)?
|
|
24
|
-
|
|
25
|
-
### Paso 2: Auditoría de consola
|
|
26
|
-
```
|
|
27
|
-
Usa: capture_console_errors
|
|
28
|
-
Objetivo: Buscar errores JavaScript silenciosos
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
Si la UI no responde o está congelada, puede haber un error JS no visible. Revisa:
|
|
32
|
-
- Errores de red (fetch failed, 404, 500)
|
|
33
|
-
- Errores de JS (TypeError, undefined)
|
|
34
|
-
- Warnings de frameworks (React, Angular)
|
|
35
|
-
|
|
36
|
-
### Paso 3: Captura de evidencia
|
|
37
|
-
```
|
|
38
|
-
Usa: create_test_evidence (type: annotated_screenshot)
|
|
39
|
-
Objetivo: Documentar el estado actual para debugging
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Si identificas un bug real de la aplicación (no un error tuyo), documéntalo con evidencia anotada.
|
|
43
|
-
|
|
44
|
-
### Paso 4: Decisión
|
|
45
|
-
Después de investigar, toma UNA de estas decisiones:
|
|
46
|
-
1. **Reintentar con variación**: Si descubriste que el campo es un select, usa click en vez de fill.
|
|
47
|
-
2. **Buscar alternativa**: Si el elemento está cubierto, busca otro camino al mismo objetivo.
|
|
48
|
-
3. **Reportar bug**: Si es un bug de la aplicación, usa `report_application_bug`.
|
|
49
|
-
4. **Reportar incapacidad**: Si no puedes avanzar, usa `report_inability_to_proceed`.
|
|
50
|
-
|
|
51
|
-
## Cuándo usar cada herramienta de investigación
|
|
52
|
-
|
|
53
|
-
| Situación | Herramienta | Obligatoria |
|
|
54
|
-
|-----------|------------|-------------|
|
|
55
|
-
| Acción falló con Timeout | `inspect_element_details` | ✅ SÍ |
|
|
56
|
-
| Elemento con nombre [INFERRED] | `inspect_element_details` | ✅ SÍ |
|
|
57
|
-
| UI no responde / congelada | `capture_console_errors` | ✅ SÍ |
|
|
58
|
-
| Antes de hacer GUARDAR/SAVE | `validate_element_state` | ✅ SÍ |
|
|
59
|
-
| Después de GUARDAR exitoso | `extract_table_data` | Recomendada |
|
|
60
|
-
| Bug encontrado | `create_test_evidence` | ✅ SÍ |
|
|
61
|
-
| Fin de misión exitosa | `create_test_evidence` | Recomendada |
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: modal-master
|
|
3
|
-
description: Gestión experta de ventanas modales, diálogos y popups en pruebas de QA.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Modal Master Skill
|
|
7
|
-
|
|
8
|
-
Esta habilidad permite al agente detectar, navegar y cerrar ventanas modales de manera eficiente, evitando que el flujo del test se bloquee por elementos superpuestos.
|
|
9
|
-
|
|
10
|
-
## Cuándo usar esta habilidad
|
|
11
|
-
- Cuando el agente realiza una acción y aparece un diálogo de confirmación (ej: "¿Desea guardar los cambios?").
|
|
12
|
-
- Cuando un popup de error o notificación bloquea el acceso al resto de la página.
|
|
13
|
-
- Cuando la misión requiere interactuar específicamente con elementos dentro de un modal.
|
|
14
|
-
|
|
15
|
-
## Instrucciones para el Agente
|
|
16
|
-
|
|
17
|
-
### 1. Detección de Modales
|
|
18
|
-
Antes de intentar interactuar con un elemento del fondo, verifica si hay un modal activo buscando:
|
|
19
|
-
- Elementos con `role="dialog"` o `role="alertdialog"`.
|
|
20
|
-
- Atributos `aria-modal="true"`.
|
|
21
|
-
- Overlays oscuros que cubren la pantalla (ej: clases tipo `backdrop`, `overlay`, `modal-open`).
|
|
22
|
-
- Títulos destacados que no estaban antes de la acción.
|
|
23
|
-
|
|
24
|
-
### 2. Prioridad de Interacción
|
|
25
|
-
Si un modal está abierto:
|
|
26
|
-
- **Prioridad 1**: Si el modal es informativo (Warning/Error), léelo y repórtalo en tu pensamiento antes de cerrarlo.
|
|
27
|
-
- **Prioridad 2**: Si el modal es de confirmación para la acción que acabas de realizar, haz clic en el botón afirmativo (ej: "Aceptar", "Sí", "Confirmar").
|
|
28
|
-
- **Prioridad 3**: Si el modal es intrusivo y no permite seguir, busca el botón de cierre (usualmente una 'X', un botón "Cerrar" o "Cancelar").
|
|
29
|
-
|
|
30
|
-
### 3. Estrategias de Cierre
|
|
31
|
-
Si no encuentras un botón de cierre claro:
|
|
32
|
-
- Busca botones con clases `close`, `btn-close` o que tengan un ícono dentro.
|
|
33
|
-
- Usa `send_keyboard_event` con key `Escape` para intentar cerrar el modal/popup/dropdown.
|
|
34
|
-
- Verifica si el modal desaparece al hacer clic en el backdrop (el área fuera del cuadro blanco).
|
|
35
|
-
|
|
36
|
-
### 4. Flujo de Trabajo (Ejemplo)
|
|
37
|
-
1. **Acción**: Clic en "Eliminar".
|
|
38
|
-
2. **Scan**: Detecto un modal con el texto "¿Está seguro?".
|
|
39
|
-
3. **Validación**: Uso `validate_element_state` para verificar que el botón "Eliminar permanentemente" es visible dentro del modal.
|
|
40
|
-
4. **Ejecución**: Clic en el botón del modal.
|
|
41
|
-
5. **Verificación**: Espero a que el modal desaparezca antes de realizar la siguiente acción de la misión.
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: native-control-expert
|
|
3
|
-
description: Protocolo experto para interactuar con controles nativos del navegador (time pickers, date pickers, selects, etc.)
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Native Control Expert Skill
|
|
7
|
-
|
|
8
|
-
Esta habilidad define el protocolo que el agente DEBE seguir cuando la misión involucra interactuar con controles nativos del navegador que **NO responden bien** a la acción estándar `fill`.
|
|
9
|
-
|
|
10
|
-
## Controles Nativos que REQUIEREN esta skill
|
|
11
|
-
|
|
12
|
-
| Control | Ejemplo | Acción preferida |
|
|
13
|
-
|---------|---------|-----------------|
|
|
14
|
-
| `<input type="time">` | Campo de hora `HH:mm` | `interact_native_control` con `control_type: "time"` |
|
|
15
|
-
| `<input type="date">` | Campo de fecha `YYYY-MM-DD` | `interact_native_control` con `control_type: "date"` |
|
|
16
|
-
| `<input type="datetime-local">` | Fecha y hora combinados | `interact_native_control` con `control_type: "datetime"` |
|
|
17
|
-
| `<input type="color">` | Selector de color | `interact_native_control` con `control_type: "color"` |
|
|
18
|
-
| `<input type="range">` | Slider numérico | `interact_native_control` con `control_type: "range"` |
|
|
19
|
-
| `<select>` nativo | Dropdown estándar HTML | `interact_native_control` con `control_type: "select"` |
|
|
20
|
-
| Combobox/Autocomplete | Campos con `role="combobox"` | `click` + `fill` letra + `send_keyboard_event` ArrowDown + Enter |
|
|
21
|
-
| Time picker con diálogo | Campos que abren un popup al hacer click | `send_keyboard_event` con Arrow keys |
|
|
22
|
-
|
|
23
|
-
## Protocolo de Interacción con Time Pickers
|
|
24
|
-
|
|
25
|
-
### ❌ LO QUE NUNCA DEBES HACER:
|
|
26
|
-
- Intentar `fill` repetidamente si falla la primera vez
|
|
27
|
-
- Hacer click una y otra vez sin cambiar de estrategia (esto causa loop detection)
|
|
28
|
-
- Asumir que un time picker funciona como un input de texto normal
|
|
29
|
-
|
|
30
|
-
### ✅ LO QUE SÍ DEBES HACER:
|
|
31
|
-
|
|
32
|
-
**Estrategia 1: interact_native_control (PREFERIDA)**
|
|
33
|
-
```
|
|
34
|
-
1. Usa inspect_element_details para confirmar que es type="time"
|
|
35
|
-
2. Usa interact_native_control con control_type: "time", value: "13:05"
|
|
36
|
-
3. Verifica el resultado
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
**Estrategia 2: Keyboard Navigation (FALLBACK)**
|
|
40
|
-
```
|
|
41
|
-
1. Haz click en el campo de hora
|
|
42
|
-
2. Usa send_keyboard_event con key: "Control+a" para seleccionar todo
|
|
43
|
-
3. Usa send_keyboard_event para escribir los dígitos del tiempo
|
|
44
|
-
4. Ejemplo: Para "13:05", envía las teclas: "1", "3", "0", "5"
|
|
45
|
-
5. Usa send_keyboard_event con key: "Tab" para navegar al siguiente campo
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
**Estrategia 3: Arrow Keys (ULTIMO RECURSO)**
|
|
49
|
-
```
|
|
50
|
-
1. Haz click en el segmento de horas del campo
|
|
51
|
-
2. Usa send_keyboard_event con key: "ArrowUp" o "ArrowDown" para ajustar la hora
|
|
52
|
-
3. Usa send_keyboard_event con key: "Tab" para mover al segmento de minutos
|
|
53
|
-
4. Repite con ArrowUp/ArrowDown para los minutos
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## Protocolo de Interacción con Date Pickers
|
|
57
|
-
|
|
58
|
-
### ✅ Estrategia preferida:
|
|
59
|
-
```
|
|
60
|
-
1. Confirma con inspect_element_details que es type="date"
|
|
61
|
-
2. Usa interact_native_control con control_type: "date", value: "2026-03-25"
|
|
62
|
-
3. IMPORTANTE: El formato SIEMPRE es YYYY-MM-DD
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
## Detección: ¿Cuándo usar esta skill?
|
|
66
|
-
|
|
67
|
-
Debes activar esta skill cuando:
|
|
68
|
-
1. Ves un componente FIELD con nombre que incluye "HH:mm" o "hora" o "time"
|
|
69
|
-
2. Un campo tiene `role="combobox"` y `aria-expanded`
|
|
70
|
-
3. Un `fill()` falla en un campo de fecha/hora con Timeout o sin efecto
|
|
71
|
-
4. El inspector muestra `type="time"` o `type="date"` en los atributos
|
|
72
|
-
|
|
73
|
-
## Keyboard Shortcuts Útiles
|
|
74
|
-
|
|
75
|
-
| Tecla | Efecto en controles nativos |
|
|
76
|
-
|-------|-----------------------------|
|
|
77
|
-
| `Tab` | Mover al siguiente segmento (horas → minutos → AM/PM) |
|
|
78
|
-
| `ArrowUp` | Incrementar valor del segmento actual |
|
|
79
|
-
| `ArrowDown` | Decrementar valor del segmento actual |
|
|
80
|
-
| `Escape` | Cerrar dropdown/calendar que se abrió |
|
|
81
|
-
| `Enter` | Confirmar selección en calendarios |
|
|
82
|
-
| `Control+a` | Seleccionar todo el contenido del campo |
|