siesa-agents 2.1.72-qa.24 → 2.1.72-qa.26

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/bin/install.js CHANGED
@@ -30,6 +30,12 @@ class SiesaBmadInstaller {
30
30
  '_bmad-output/shared-artifacts'
31
31
  ];
32
32
 
33
+ // Archivos sueltos que se copian a la raíz del workspace (no van en folderMappings)
34
+ // recorder.bat: launcher del Grabador de Localizadores v4, resuelve el kit vía %~dp0
35
+ this.rootFiles = [
36
+ 'recorder.bat'
37
+ ];
38
+
33
39
  this.targetDir = process.cwd();
34
40
  // Intentar múltiples ubicaciones posibles para el paquete
35
41
  this.packageDir = this.findPackageDir();
@@ -537,6 +543,27 @@ class SiesaBmadInstaller {
537
543
  console.warn(`⚠️ Carpeta ${mapping.source} no encontrada en el paquete`);
538
544
  }
539
545
  }
546
+
547
+ // Copiar archivos sueltos a la raíz del workspace
548
+ await this.copyRootFiles();
549
+ }
550
+
551
+ async copyRootFiles() {
552
+ for (const fileName of this.rootFiles) {
553
+ const sourcePath = path.join(this.packageDir, fileName);
554
+ const targetPath = path.join(this.targetDir, fileName);
555
+
556
+ if (fs.existsSync(sourcePath)) {
557
+ try {
558
+ await fs.copy(sourcePath, targetPath, { overwrite: true });
559
+ console.log(` ✓ ${fileName}`);
560
+ } catch (error) {
561
+ console.warn(` ⚠️ Error copiando ${fileName}: ${error.message}`);
562
+ }
563
+ } else {
564
+ console.warn(` ⚠️ Archivo ${fileName} no encontrado en el paquete`);
565
+ }
566
+ }
540
567
  }
541
568
 
542
569
  async update() {
package/package.json CHANGED
@@ -1,42 +1,43 @@
1
- {
2
- "name": "siesa-agents",
3
- "version": "2.1.72-qa.24",
4
- "description": "Paquete para instalar y configurar agentes SIESA en tu proyecto",
5
- "main": "index.js",
6
- "bin": {
7
- "siesa-agents": "./bin/install.js"
8
- },
9
- "scripts": {
10
- "postinstall": "node ./bin/install.js",
11
- "build": "echo 'Build complete'"
12
- },
13
- "keywords": [
14
- "siesa",
15
- "bmad",
16
- "agents",
17
- "automation",
18
- "cli"
19
- ],
20
- "author": "Sistemas de Información Empresarial",
21
- "license": "MIT",
22
- "files": [
23
- "bmad/**/*",
24
- "siesa-agents/**/*",
25
- "vscode/**/*",
26
- "github/**/*",
27
- "claude/**/*",
28
- "gemini/**/*",
29
- "kiro/**/*",
30
- "bin/**/*",
31
- "resources/**/*",
32
- "README.md",
33
- "mcp.json"
34
- ],
35
- "engines": {
36
- "node": ">=14.0.0"
37
- },
38
- "dependencies": {
39
- "fs-extra": "^11.1.1",
40
- "path": "^0.12.7"
41
- }
42
- }
1
+ {
2
+ "name": "siesa-agents",
3
+ "version": "2.1.72-qa.26",
4
+ "description": "Paquete para instalar y configurar agentes SIESA en tu proyecto",
5
+ "main": "index.js",
6
+ "bin": {
7
+ "siesa-agents": "./bin/install.js"
8
+ },
9
+ "scripts": {
10
+ "postinstall": "node ./bin/install.js",
11
+ "build": "echo 'Build complete'"
12
+ },
13
+ "keywords": [
14
+ "siesa",
15
+ "bmad",
16
+ "agents",
17
+ "automation",
18
+ "cli"
19
+ ],
20
+ "author": "Sistemas de Información Empresarial",
21
+ "license": "MIT",
22
+ "files": [
23
+ "bmad/**/*",
24
+ "siesa-agents/**/*",
25
+ "vscode/**/*",
26
+ "github/**/*",
27
+ "claude/**/*",
28
+ "gemini/**/*",
29
+ "kiro/**/*",
30
+ "bin/**/*",
31
+ "resources/**/*",
32
+ "README.md",
33
+ "mcp.json",
34
+ "recorder.bat"
35
+ ],
36
+ "engines": {
37
+ "node": ">=14.0.0"
38
+ },
39
+ "dependencies": {
40
+ "fs-extra": "^11.1.1",
41
+ "path": "^0.12.7"
42
+ }
43
+ }
package/recorder.bat ADDED
@@ -0,0 +1,46 @@
1
+ @echo off
2
+ REM ============================================================
3
+ REM Grabador de Localizadores v4 — Launcher
4
+ REM
5
+ REM Uso:
6
+ REM recorder Modo ERP SIESA (login automatico)
7
+ REM recorder blank Lienzo en blanco (sin login)
8
+ REM recorder fin Financiero (qa.finance.siesa.dev)
9
+ REM recorder nom Nomina (qas.nomina.siesa.dev)
10
+ REM ============================================================
11
+
12
+ set "KIT_DIR=%~dp0_siesa-agents\resources\playwright-kit"
13
+
14
+ if not exist "%KIT_DIR%\tools\locator-recorder.spec.ts" (
15
+ echo [Grabador v4] ERROR: No se encontro playwright-kit en %KIT_DIR%
16
+ exit /b 1
17
+ )
18
+
19
+ pushd "%KIT_DIR%"
20
+
21
+ if /i "%~1"=="blank" (
22
+ echo [Grabador v4] Lienzo en blanco
23
+ set "SKIP_LOGIN=1"
24
+ set "START_URL="
25
+ npm run recorder
26
+ set "SKIP_LOGIN="
27
+ ) else if /i "%~1"=="fin" (
28
+ echo [Grabador v4] Financiero — qa.finance.siesa.dev
29
+ set "SKIP_LOGIN=1"
30
+ set "START_URL=https://qa.finance.siesa.dev"
31
+ npm run recorder
32
+ set "SKIP_LOGIN="
33
+ set "START_URL="
34
+ ) else if /i "%~1"=="nom" (
35
+ echo [Grabador v4] Nomina — qas.nomina.siesa.dev
36
+ set "SKIP_LOGIN=1"
37
+ set "START_URL=https://qas.nomina.siesa.dev/mfe/payroll-frontend/"
38
+ npm run recorder
39
+ set "SKIP_LOGIN="
40
+ set "START_URL="
41
+ ) else (
42
+ echo [Grabador v4] ERP SIESA (login automatico)
43
+ npm run recorder
44
+ )
45
+
46
+ popd
@@ -5,11 +5,12 @@
5
5
  # ============================================================
6
6
 
7
7
  # Credenciales de login (Modo 1: ERP SIESA)
8
- TEST_USER=Carlos1
9
- TEST_PASS=1234
8
+ TEST_USER=
9
+ TEST_PASS=
10
+ # ^^^ Definir con las credenciales de tu proyecto
10
11
 
11
- # URL base del ERP
12
- BASE_URL=https://erp-qa-beta.siesaerp.com
12
+ # URL base del ambiente QA de tu proyecto (ej: https://qa.finance.siesa.dev)
13
+ BASE_URL=
13
14
 
14
15
  # Base de datos a seleccionar en login (busca por texto en el combo)
15
16
  # Opciones tipicas: sqlserver, postgresql
@@ -18,7 +19,7 @@ DB_ENGINE=sqlserver
18
19
  # Cultura/idioma (comentar para usar la predeterminada del ERP)
19
20
  # CULTURE=es-CO
20
21
 
21
- # Ruta inicial del modulo a verificar/grabar (opcional, ej: /BLSurveyDocument/)
22
+ # Ruta inicial del modulo a verificar/grabar (opcional, ej: /BLTuModulo/)
22
23
  # Usada por seed-example.spec.ts (test de navegacion) y por el grabador.
23
24
  # START_URL=
24
25
 
@@ -5,8 +5,8 @@
5
5
  Kit portable para automatización E2E con agentes IA (Planner → Generator → Healer).
6
6
  Desarrollado por el equipo QA de I&D — Procesos y Calidad de Software.
7
7
 
8
- Validado en **9 réplicas**, 2 módulos (Encuestas + Capacitaciones), 271 tests,
9
- mejora de **160 min → 4 min**, 5 réplicas consecutivas sin Healer (R5-R9).
8
+ Validado en múltiples proyectos Siesa (HCM, Financiero, Nómina),
9
+ con mejoras de tiempo de pipeline de **160 min → 4 min** en réplicas consecutivas sin Healer.
10
10
 
11
11
  ## Estructura
12
12
 
@@ -49,7 +49,7 @@ npm install
49
49
  npx playwright install chromium
50
50
 
51
51
  # 4. Verificar con el seed
52
- TEST_USER=Carlos1 TEST_PASS=1234 npx playwright test tests/seed-example.spec.ts --headed
52
+ TEST_USER=<tu_usuario> TEST_PASS=<tu_password> npx playwright test tests/seed-example.spec.ts --headed
53
53
  ```
54
54
 
55
55
  ## Reportes de ejecución
@@ -156,7 +156,7 @@ Ajustar `playwright.config.ts`:
156
156
 
157
157
  ```typescript
158
158
  use: {
159
- baseURL: process.env.BASE_URL || 'https://erp-qa-beta.siesaerp.com',
159
+ baseURL: process.env.BASE_URL || 'http://localhost:5000',
160
160
  }
161
161
  ```
162
162
 
@@ -164,9 +164,9 @@ Variables de entorno:
164
164
 
165
165
  | Variable | Default | Descripción |
166
166
  |----------|---------|-------------|
167
- | `BASE_URL` | `https://erp-qa-beta.siesaerp.com` | URL base del ERP |
168
- | `TEST_USER` | `Carlos1` | Usuario ERP |
169
- | `TEST_PASS` | `1234` | Contraseña ERP |
167
+ | `BASE_URL` | (definir en .env) | URL base del ambiente QA |
168
+ | `TEST_USER` | (definir en .env) | Usuario ERP |
169
+ | `TEST_PASS` | (definir en .env) | Contraseña ERP |
170
170
  | `DB_ENGINE` | `sqlserver` | BD a seleccionar en el login (match por texto) |
171
171
  | `PORTAL_LOGIN` | - | `1` para login Portal de Empleo |
172
172
  | `PORTAL_URL` | - | URL del portal |
@@ -197,20 +197,24 @@ Variables de entorno:
197
197
 
198
198
  ## Resultados validados
199
199
 
200
- | Réplica | Módulo | Tests | Resultado | Tiempo Pipeline | Tiempo Ejecución |
201
- |---------|--------|-------|-----------|-----------------|------------------|
202
- | R1 | Encuestas | 20 | 20/20 PASS | ~160 min | ~8 min |
203
- | R3 | Encuestas | 21 | 20/21 PASS | ~40 min | 4.2 min |
204
- | R4 | Capacitaciones | 16 | 16/16 PASS | ~35 min | 5.2 min |
205
- | R5-R7 | Capacitaciones | 16 | 16/16 PASS | <15 min | ~5 min |
206
- | R8 | Capacitaciones | 16 | 16/16 PASS | 4 min | 4 min |
207
- | R9 | Capacitaciones | 16 | 16/16 PASS | 4 min | 4 min |
200
+ Kit validado en múltiples proyectos Siesa (HCM, Financiero, Nómina). La tabla
201
+ siguiente conserva, a modo de historial, la evolución del tiempo de pipeline
202
+ durante el piloto (réplicas consecutivas sin Healer):
203
+
204
+ | Réplica | Tests | Resultado | Tiempo Pipeline | Tiempo Ejecución |
205
+ |---------|-------|-----------|-----------------|------------------|
206
+ | R1 | 20 | 20/20 PASS | ~160 min | ~8 min |
207
+ | R3 | 21 | 20/21 PASS | ~40 min | 4.2 min |
208
+ | R4 | 16 | 16/16 PASS | ~35 min | 5.2 min |
209
+ | R5-R7 | 16 | 16/16 PASS | <15 min | ~5 min |
210
+ | R8 | 16 | 16/16 PASS | 4 min | 4 min |
211
+ | R9 | 16 | 16/16 PASS | 4 min | 4 min |
208
212
 
209
213
  ## Equipo
210
214
 
211
- - **Líder QA**: Juan Manuel Reina Montoya
212
- - **QA HCM**: Carlos Felipe Diaz Lombana, Jose Alejandro Bravo Escobar
213
- - **I&D**: Equipo de Procesos y Calidad de Software, SIESA
215
+ - **Líder QA**: {nombre del líder del proyecto}
216
+ - **Equipo QA**: {integrantes del equipo}
217
+ - **Área**: {área o unidad organizacional}
214
218
 
215
219
  ## Capacitación
216
220
 
@@ -1,9 +1,9 @@
1
1
  /**
2
- * Blazor E2E Helpers — Módulo reutilizable para specs GP HCM
2
+ * Blazor E2E Helpers — Módulo reutilizable para specs Siesa ERP (Blazor Server)
3
3
  * Siesa Business ERP (Blazor Server + DevExpress + Radzen + SignalR)
4
4
  *
5
- * Extraído de Replica 4 (Capacitaciones) con refinamientos arquitectónicos.
6
- * Patrones validados en R1-R4 (4 módulos, 191+ tests).
5
+ * Desarrollado y validado en múltiples proyectos Siesa.
6
+ * Patrones validados en múltiples módulos (191+ tests).
7
7
  *
8
8
  * Uso:
9
9
  * import { createObsCollector, login, searchInGrid, ... } from './blazor-e2e-helpers';
@@ -120,7 +120,7 @@ export async function settle(page: Page, extraMs = 0) {
120
120
  /**
121
121
  * Selecciona la BD en el login si el combo está presente y `DB_ENGINE` está definido.
122
122
  * Opt-in y best-effort: si no hay combo, `DB_ENGINE` no está, o algo falla, NO lanza
123
- * y deja el login directo (comportamiento validado R1-R9 intacto).
123
+ * y deja el login directo (comportamiento validado).
124
124
  * Soporta los dos mecanismos del ERP: DevExpress (SDKDropDownField) y <select> nativo.
125
125
  */
126
126
  export async function selectDbIfPresent(page: Page, db?: string) {
@@ -151,12 +151,9 @@ export async function selectDbIfPresent(page: Page, db?: string) {
151
151
 
152
152
  export async function login(page: Page, user?: string, pass?: string, db?: string) {
153
153
  const cred = {
154
- user: user || process.env.TEST_USER || 'Carlos1',
155
- password: pass || process.env.TEST_PASS || '1234',
154
+ user: user || process.env.TEST_USER || (() => { throw new Error('TEST_USER no definido. Configura TEST_USER en .env'); })(),
155
+ password: pass || process.env.TEST_PASS || (() => { throw new Error('TEST_PASS no definido. Configura TEST_PASS en .env'); })(),
156
156
  };
157
- if (!user && !process.env.TEST_USER) {
158
- console.warn('[blazor login] TEST_USER no definido — usando credencial demo "Carlos1". Define TEST_USER/TEST_PASS en .env para tu entorno.');
159
- }
160
157
  await page.goto('/login');
161
158
  // Opt-in: solo selecciona BD si DB_ENGINE está definido y el combo existe (si no, login directo).
162
159
  await selectDbIfPresent(page, db);
@@ -59,7 +59,7 @@ export default defineConfig({
59
59
  }],
60
60
  ],
61
61
  use: {
62
- baseURL: process.env.BASE_URL || 'https://erp-qa-beta.siesaerp.com',
62
+ baseURL: process.env.BASE_URL || (() => { console.warn('BASE_URL no definida en .env'); return 'http://localhost:5000'; })(),
63
63
  // CI corre en runners Linux sin display → headless obligatorio.
64
64
  headless: !!process.env.CI,
65
65
  viewport: null,
@@ -8,7 +8,7 @@
8
8
  * AGILETEST_CLIENT_ID, AGILETEST_CLIENT_SECRET
9
9
  * AGILETEST_EXECUTION_ID — ID interno de la ejecución (ej: 115230)
10
10
  * AGILETEST_TC_ID — ID interno del test case (ej: 1531352)
11
- * AGILETEST_PROJECT_ID — ID del proyecto Jira (default: 10032)
11
+ * AGILETEST_PROJECT_ID — ID del proyecto Jira (requerido, sin default)
12
12
  * AGILETEST_TOTAL_STEPS — Total de pasos del TC (default: 17)
13
13
  * Si se ejecutan menos, el TC queda "In Progress"
14
14
  */
@@ -23,15 +23,16 @@ import type {
23
23
 
24
24
  const AGILETEST_BASE = 'https://jira.agiletest.app';
25
25
 
26
- /** Status IDs para proyecto HCM (10032) */
26
+ // Status IDs de AgileTest — cada proyecto Jira tiene IDs diferentes.
27
+ // Configurar en .env si difieren de los defaults.
27
28
  const STATUS_IDS = {
28
- todo: 15016,
29
- pass: 15017,
30
- fail: 15018,
31
- blocked: 15019,
32
- inProgress: 15020,
33
- skipped: 15021,
34
- retest: 15022,
29
+ todo: Number(process.env.AT_STATUS_TODO || 15016),
30
+ pass: Number(process.env.AT_STATUS_PASS || 15017),
31
+ fail: Number(process.env.AT_STATUS_FAIL || 15018),
32
+ blocked: Number(process.env.AT_STATUS_BLOCKED || 15019),
33
+ inProgress: Number(process.env.AT_STATUS_INPROGRESS || 15020),
34
+ skipped: Number(process.env.AT_STATUS_SKIPPED || 15021),
35
+ retest: Number(process.env.AT_STATUS_RETEST || 15022),
35
36
  } as const;
36
37
 
37
38
  interface StepResult {
@@ -66,7 +67,7 @@ function readConfig(): AgileTestConfig | null {
66
67
  clientSecret,
67
68
  executionId,
68
69
  tcId,
69
- projectId: process.env.AGILETEST_PROJECT_ID || '10032',
70
+ projectId: process.env.AGILETEST_PROJECT_ID || (() => { console.warn('AGILETEST_PROJECT_ID no definido'); return ''; })(),
70
71
  totalSteps: parseInt(process.env.AGILETEST_TOTAL_STEPS || '17', 10),
71
72
  };
72
73
  }
@@ -76,9 +76,7 @@
76
76
 
77
77
  | Aplicación | Stack | URL base | Auth |
78
78
  |-----------|-------|----------|------|
79
- | Portal de Empleo | Blazor + DevExpress + Radzen | beta-aws.siesadev.com/BLPortalLogin | Email+Password |
80
- | ERP HCM | Blazor + DevExpress + SDK UI Kit | beta-aws.siesadev.com | MasterCrud + SSO |
81
- | Encuestas | Blazor + DevExpress + SDK UI Kit | beta-aws.siesadev.com | SSO |
79
+ | ERP Siesa | Blazor + DevExpress + SDK UI Kit | {BASE_URL} | MasterCrud + SSO |
82
80
  | Financiero | React 18 + siesa-ui-kit + .NET 8 | qa.finance.siesa.dev/app | SSO |
83
81
 
84
82
  > **Patrones transferibles:** entity field, SDKSelectField, SDKCharField, TopBarButton,
@@ -1,22 +1,22 @@
1
1
  /**
2
- * seed-gp.spec.ts — Seed file para Playwright Test Agents (GP / HCM)
2
+ * seed-example.spec.ts — Seed file para Playwright Test Agents (Siesa ERP)
3
3
  *
4
4
  * Establece el contexto de navegacion: Login ERP + seleccion de BD
5
5
  * Usado como referencia por los agentes Planner/Generator/Healer
6
6
  *
7
- * Ambiente por defecto: erp-qa-beta.siesaerp.com (baseURL del playwright.config.ts)
7
+ * Ambiente: definido por BASE_URL en .env (baseURL del playwright.config.ts)
8
8
  * Credenciales y BD se toman de .env (ver .env.example): TEST_USER / TEST_PASS / DB_ENGINE
9
9
  */
10
10
  import { test, expect } from '@playwright/test';
11
11
 
12
12
  // ─── Credenciales via env vars (alineadas con .env.example) ────────────────────
13
13
  const CRED = {
14
- user: process.env.TEST_USER ?? 'Carlos1',
15
- pass: process.env.TEST_PASS ?? '1234',
14
+ user: process.env.TEST_USER ?? '',
15
+ pass: process.env.TEST_PASS ?? '',
16
16
  bd: process.env.DB_ENGINE ?? 'sqlserver',
17
17
  };
18
18
 
19
- test.describe('GP HCM — Seed', () => {
19
+ test.describe('Siesa ERP — Seed', () => {
20
20
  test('login ERP + verificar dashboard', async ({ page }) => {
21
21
  // 1. Navegar al login
22
22
  await page.goto('/login');
@@ -32,15 +32,15 @@ import * as path from 'path';
32
32
  dotenvConfig({ path: path.join(__dirname, '..', '.env') });
33
33
 
34
34
  const CRED = {
35
- user: process.env.TEST_USER || 'Carlos1',
36
- password: process.env.TEST_PASS || '1234',
35
+ user: process.env.TEST_USER || '',
36
+ password: process.env.TEST_PASS || '',
37
37
  dbEngine: process.env.DB_ENGINE || 'sqlserver',
38
38
  };
39
39
  const OUTPUT_DIR = path.join(__dirname, '..', 'captured-locators');
40
40
  const SCREENSHOTS_DIR = path.join(OUTPUT_DIR, 'screenshots'); // v4: visual baseline
41
41
  const MODULES_DIR = path.join(OUTPUT_DIR, 'modules'); // v4: modulos reutilizables
42
42
 
43
- // ─── Login reutilizado del flujo encuestas ──────────────────────
43
+ // ─── Login ERP (reutilizable por cualquier modulo) ──────────────────────
44
44
  async function login(page: Page) {
45
45
  await page.goto('/login');
46
46
  await page.waitForLoadState('networkidle').catch(() => {});
@@ -148,7 +148,7 @@ function generatePlaywrightTS(captures: any[]): {
148
148
  captures.forEach((c: any) => {
149
149
  let base = '';
150
150
  if (c.autoId) {
151
- // Quitar prefijo SDK: SDKCharField_BLSurvey.NameBLSurvey_Name
151
+ // Quitar prefijo SDK: SDKCharField_BLMiModulo.CampoBLMiModulo_Campo
152
152
  base = c.autoId
153
153
  .replace(
154
154
  /^SDK(CharField|NumericField|Button|DateField|ComboBox|CheckBox|Grid|DataGrid|Dialog|TreeView|RadioGroup|Toolbar|DropDown|ListBox|Tab|Panel|Switch|Menu|Popup|Upload)_/,