@arcadialdev/arcality 2.4.30 → 2.4.31
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/e2e-testing-expert/SKILL.md +28 -0
- package/.agents/skills/frontend-design/LICENSE.txt +177 -0
- package/.agents/skills/frontend-design/SKILL.md +42 -0
- package/.agents/skills/nodejs-backend-patterns/SKILL.md +639 -0
- package/.agents/skills/nodejs-backend-patterns/references/advanced-patterns.md +430 -0
- package/.agents/skills/playwright-best-practices/LICENSE.md +7 -0
- package/.agents/skills/playwright-best-practices/README.md +147 -0
- package/.agents/skills/playwright-best-practices/SKILL.md +303 -0
- package/.agents/skills/playwright-best-practices/advanced/authentication-flows.md +360 -0
- package/.agents/skills/playwright-best-practices/advanced/authentication.md +871 -0
- package/.agents/skills/playwright-best-practices/advanced/clock-mocking.md +364 -0
- package/.agents/skills/playwright-best-practices/advanced/mobile-testing.md +409 -0
- package/.agents/skills/playwright-best-practices/advanced/multi-context.md +288 -0
- package/.agents/skills/playwright-best-practices/advanced/multi-user.md +393 -0
- package/.agents/skills/playwright-best-practices/advanced/network-advanced.md +452 -0
- package/.agents/skills/playwright-best-practices/advanced/third-party.md +464 -0
- package/.agents/skills/playwright-best-practices/architecture/pom-vs-fixtures.md +363 -0
- package/.agents/skills/playwright-best-practices/architecture/test-architecture.md +369 -0
- package/.agents/skills/playwright-best-practices/architecture/when-to-mock.md +383 -0
- package/.agents/skills/playwright-best-practices/browser-apis/browser-apis.md +391 -0
- package/.agents/skills/playwright-best-practices/browser-apis/iframes.md +403 -0
- package/.agents/skills/playwright-best-practices/browser-apis/service-workers.md +504 -0
- package/.agents/skills/playwright-best-practices/browser-apis/websockets.md +403 -0
- package/.agents/skills/playwright-best-practices/core/annotations.md +424 -0
- package/.agents/skills/playwright-best-practices/core/assertions-waiting.md +361 -0
- package/.agents/skills/playwright-best-practices/core/configuration.md +452 -0
- package/.agents/skills/playwright-best-practices/core/fixtures-hooks.md +417 -0
- package/.agents/skills/playwright-best-practices/core/global-setup.md +434 -0
- package/.agents/skills/playwright-best-practices/core/locators.md +242 -0
- package/.agents/skills/playwright-best-practices/core/page-object-model.md +315 -0
- package/.agents/skills/playwright-best-practices/core/projects-dependencies.md +453 -0
- package/.agents/skills/playwright-best-practices/core/test-data.md +492 -0
- package/.agents/skills/playwright-best-practices/core/test-suite-structure.md +361 -0
- package/.agents/skills/playwright-best-practices/core/test-tags.md +298 -0
- package/.agents/skills/playwright-best-practices/debugging/console-errors.md +420 -0
- package/.agents/skills/playwright-best-practices/debugging/debugging.md +504 -0
- package/.agents/skills/playwright-best-practices/debugging/error-testing.md +360 -0
- package/.agents/skills/playwright-best-practices/debugging/flaky-tests.md +496 -0
- package/.agents/skills/playwright-best-practices/frameworks/angular.md +530 -0
- package/.agents/skills/playwright-best-practices/frameworks/nextjs.md +469 -0
- package/.agents/skills/playwright-best-practices/frameworks/react.md +531 -0
- package/.agents/skills/playwright-best-practices/frameworks/vue.md +574 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/ci-cd.md +468 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/docker.md +283 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/github-actions.md +546 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/gitlab.md +397 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/other-providers.md +521 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/parallel-sharding.md +371 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/performance.md +453 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/reporting.md +424 -0
- package/.agents/skills/playwright-best-practices/infrastructure-ci-cd/test-coverage.md +497 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/accessibility.md +359 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/api-testing.md +719 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/browser-extensions.md +506 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/canvas-webgl.md +493 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/component-testing.md +500 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/drag-drop.md +576 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/electron.md +509 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/file-operations.md +377 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/file-upload-download.md +562 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/forms-validation.md +561 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/graphql-testing.md +331 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/i18n.md +508 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/performance-testing.md +476 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/security-testing.md +430 -0
- package/.agents/skills/playwright-best-practices/testing-patterns/visual-regression.md +634 -0
- package/.agents/skills/security-qa/SKILL.md +254 -0
- package/package.json +2 -1
- package/scripts/gen-and-run.mjs +2 -2
- package/scripts/init.mjs +2 -2
- package/scripts/setup.mjs +2 -2
- package/src/arcalityClient.mjs +1 -1
- package/tests/_helpers/agentic-runner.bundle.spec.js +83 -8
- package/scripts/cleanup-qmsdev.mjs +0 -63
- package/scripts/discover-view.mjs +0 -52
- package/scripts/extract-view.mjs +0 -64
- package/scripts/migrate-to-central-out.mjs +0 -157
package/scripts/extract-view.mjs
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import 'dotenv/config';
|
|
3
|
-
import fs from 'node:fs';
|
|
4
|
-
import { spawn } from 'node:child_process';
|
|
5
|
-
import path from 'node:path';
|
|
6
|
-
|
|
7
|
-
const targetPath = process.argv[2] || '/';
|
|
8
|
-
const isWin = process.platform === 'win32';
|
|
9
|
-
const cmd = isWin ? 'npx.cmd' : 'npx';
|
|
10
|
-
|
|
11
|
-
// Use POSIX-style forward slashes so Playwright reliably matches the file on all platforms
|
|
12
|
-
const testFile = 'tests/_helpers/extract-view.spec.ts';
|
|
13
|
-
|
|
14
|
-
function parseDotEnvFile(p) {
|
|
15
|
-
try {
|
|
16
|
-
const raw = fs.readFileSync(p, 'utf8');
|
|
17
|
-
const lines = raw.split(/\r?\n/);
|
|
18
|
-
const out = {};
|
|
19
|
-
for (const line of lines) {
|
|
20
|
-
const trimmed = line.trim();
|
|
21
|
-
if (!trimmed || trimmed.startsWith('#')) continue;
|
|
22
|
-
const idx = trimmed.indexOf('=');
|
|
23
|
-
if (idx === -1) continue;
|
|
24
|
-
let k = trimmed.slice(0, idx).trim();
|
|
25
|
-
let v = trimmed.slice(idx + 1).trim();
|
|
26
|
-
if ((v.startsWith('"') && v.endsWith('"')) || (v.startsWith("'") && v.endsWith("'"))) v = v.slice(1, -1);
|
|
27
|
-
out[k] = v;
|
|
28
|
-
}
|
|
29
|
-
return out;
|
|
30
|
-
} catch {
|
|
31
|
-
return {};
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const fileEnv = parseDotEnvFile(path.join(process.cwd(), '.env'));
|
|
36
|
-
const env = { ...process.env, ...fileEnv, TARGET_PATH: targetPath };
|
|
37
|
-
|
|
38
|
-
const args = ['playwright', 'test', testFile, '--project=chromium', '--headed'];
|
|
39
|
-
|
|
40
|
-
// Debug printing removed to avoid leaking placeholders; command is spawned directly
|
|
41
|
-
|
|
42
|
-
const child = spawn(cmd, args, {
|
|
43
|
-
stdio: 'inherit',
|
|
44
|
-
shell: isWin,
|
|
45
|
-
env,
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
child.on('exit', (code) => {
|
|
49
|
-
// DESACTIVADO POR PETICIÓN DE USUARIO: Evitar pantallas extras/consolas
|
|
50
|
-
/*
|
|
51
|
-
try {
|
|
52
|
-
const showCmd = isWin ? 'npx.cmd' : 'npx';
|
|
53
|
-
spawn(showCmd, ['playwright', 'show-report'], { stdio: 'ignore', shell: isWin, detached: true });
|
|
54
|
-
} catch (e) {
|
|
55
|
-
// ignore
|
|
56
|
-
}
|
|
57
|
-
*/
|
|
58
|
-
process.exit(code ?? 0);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
child.on('error', (err) => {
|
|
62
|
-
console.error('Failed to run playwright:', err);
|
|
63
|
-
process.exit(1);
|
|
64
|
-
});
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
|
|
5
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
-
const __dirname = path.dirname(__filename);
|
|
7
|
-
const PROJECT_ROOT = path.join(__dirname, "..");
|
|
8
|
-
|
|
9
|
-
function migrate() {
|
|
10
|
-
const outDirs = fs.readdirSync(PROJECT_ROOT).filter(f => f.startsWith('out_') && fs.statSync(path.join(PROJECT_ROOT, f)).isDirectory());
|
|
11
|
-
const centralOut = path.join(PROJECT_ROOT, 'out');
|
|
12
|
-
|
|
13
|
-
if (!fs.existsSync(centralOut)) fs.mkdirSync(centralOut);
|
|
14
|
-
|
|
15
|
-
console.log(`🚀 Starting migration of ${outDirs.length} legacy output directories...`);
|
|
16
|
-
|
|
17
|
-
for (const oldDirName of outDirs) {
|
|
18
|
-
const oldDirPath = path.join(PROJECT_ROOT, oldDirName);
|
|
19
|
-
const children = fs.readdirSync(oldDirPath);
|
|
20
|
-
|
|
21
|
-
// Try to find a config name
|
|
22
|
-
let configName = oldDirName.replace('out_', '');
|
|
23
|
-
const configSubDir = children.find(c => fs.statSync(path.join(oldDirPath, c)).isDirectory());
|
|
24
|
-
|
|
25
|
-
if (configSubDir) {
|
|
26
|
-
configName = configSubDir;
|
|
27
|
-
console.log(`📦 Found configuration folder "${configName}" inside ${oldDirName}`);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const newConfigPath = path.join(centralOut, configName);
|
|
31
|
-
const contextPath = path.join(newConfigPath, 'context');
|
|
32
|
-
const missionsPath = path.join(newConfigPath, 'missions');
|
|
33
|
-
const reportsPath = path.join(newConfigPath, 'reports');
|
|
34
|
-
|
|
35
|
-
[contextPath, missionsPath, reportsPath].forEach(p => fs.mkdirSync(p, { recursive: true }));
|
|
36
|
-
|
|
37
|
-
// Move files
|
|
38
|
-
children.forEach(child => {
|
|
39
|
-
const oldChildPath = path.join(oldDirPath, child);
|
|
40
|
-
const isDir = fs.statSync(oldChildPath).isDirectory();
|
|
41
|
-
|
|
42
|
-
if (child === configSubDir) {
|
|
43
|
-
// Move internals of config subDir to context/projects or similar?
|
|
44
|
-
// For now, let's just move the whole folder to context
|
|
45
|
-
moveFolder(oldChildPath, path.join(contextPath, child));
|
|
46
|
-
} else if (child.startsWith('agent-log') || child.includes('memory') || child.includes('memoria') || child.includes('components-')) {
|
|
47
|
-
moveFile(oldChildPath, path.join(contextPath, child));
|
|
48
|
-
} else if (child.endsWith('.yaml') || child.endsWith('.yml')) {
|
|
49
|
-
moveFile(oldChildPath, path.join(missionsPath, child));
|
|
50
|
-
} else if (child === 'saved_missions') {
|
|
51
|
-
const subMissions = fs.readdirSync(oldChildPath);
|
|
52
|
-
subMissions.forEach(sm => moveFile(path.join(oldChildPath, sm), path.join(missionsPath, sm)));
|
|
53
|
-
fs.rmdirSync(oldChildPath, { recursive: true });
|
|
54
|
-
} else {
|
|
55
|
-
// Default to context
|
|
56
|
-
if (isDir) moveFolder(oldChildPath, path.join(contextPath, child));
|
|
57
|
-
else moveFile(oldChildPath, path.join(contextPath, child));
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
// Remove the old out_ directory if empty
|
|
62
|
-
if (fs.readdirSync(oldDirPath).length === 0) {
|
|
63
|
-
fs.rmdirSync(oldDirPath);
|
|
64
|
-
console.log(`✅ Cleaned up ${oldDirName}`);
|
|
65
|
-
} else {
|
|
66
|
-
console.warn(`⚠️ ${oldDirName} not empty after migration.`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Move tests/projects folders
|
|
71
|
-
const projectsDir = path.join(PROJECT_ROOT, 'tests', 'projects');
|
|
72
|
-
if (fs.existsSync(projectsDir)) {
|
|
73
|
-
const projects = fs.readdirSync(projectsDir).filter(f => fs.statSync(path.join(projectsDir, f)).isDirectory());
|
|
74
|
-
console.log(`📁 Migrating ${projects.length} project models from tests/projects...`);
|
|
75
|
-
for (const pName of projects) {
|
|
76
|
-
const oldPPath = path.join(projectsDir, pName);
|
|
77
|
-
// We assume project name matches or is related to a config
|
|
78
|
-
// If out/[pName] exists, move there
|
|
79
|
-
const targetConfigPath = path.join(centralOut, pName);
|
|
80
|
-
const targetContextPath = path.join(targetConfigPath, 'context');
|
|
81
|
-
if (!fs.existsSync(targetContextPath)) fs.mkdirSync(targetContextPath, { recursive: true });
|
|
82
|
-
|
|
83
|
-
moveFolder(oldPPath, path.join(targetContextPath, pName));
|
|
84
|
-
console.log(`✅ Moved project model "${pName}" to out/${pName}/context/`);
|
|
85
|
-
}
|
|
86
|
-
// If empty, remove tests/projects
|
|
87
|
-
if (fs.readdirSync(projectsDir).length === 0) {
|
|
88
|
-
fs.rmdirSync(projectsDir);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Move loose files in central out/ to out/Default/context/
|
|
93
|
-
const looseFiles = fs.readdirSync(centralOut).filter(f => fs.statSync(path.join(centralOut, f)).isFile());
|
|
94
|
-
if (looseFiles.length > 0) {
|
|
95
|
-
console.log(`📄 Migrating ${looseFiles.length} loose files from out/ to out/Default/context/...`);
|
|
96
|
-
const defaultContext = path.join(centralOut, 'Default', 'context');
|
|
97
|
-
if (!fs.existsSync(defaultContext)) fs.mkdirSync(defaultContext, { recursive: true });
|
|
98
|
-
looseFiles.forEach(f => moveFile(path.join(centralOut, f), path.join(defaultContext, f)));
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Move global reports
|
|
102
|
-
const globalReports = ['tests-report', 'playwright-internal-report', 'test-results'];
|
|
103
|
-
for (const gr of globalReports) {
|
|
104
|
-
const grPath = path.join(PROJECT_ROOT, gr);
|
|
105
|
-
if (fs.existsSync(grPath)) {
|
|
106
|
-
const activeConfig = process.env.ACTIVE_CONFIG || 'Default';
|
|
107
|
-
const targetDir = path.join(centralOut, activeConfig, 'reports', gr);
|
|
108
|
-
fs.mkdirSync(path.dirname(targetDir), { recursive: true });
|
|
109
|
-
moveFolder(grPath, targetDir);
|
|
110
|
-
console.log(`📊 Moved global report "${gr}" to out/${activeConfig}/reports/`);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
console.log('✨ Migration completed successfully.');
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function moveFile(src, dest) {
|
|
118
|
-
if (!fs.existsSync(src)) return;
|
|
119
|
-
try {
|
|
120
|
-
fs.renameSync(src, dest);
|
|
121
|
-
} catch (e) {
|
|
122
|
-
if (e.code === 'EXDEV') {
|
|
123
|
-
fs.copyFileSync(src, dest);
|
|
124
|
-
fs.unlinkSync(src);
|
|
125
|
-
} else {
|
|
126
|
-
console.error(`Error moving ${src}:`, e.message);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
function moveFolder(src, dest) {
|
|
132
|
-
if (!fs.existsSync(src)) return;
|
|
133
|
-
try {
|
|
134
|
-
if (fs.existsSync(dest)) {
|
|
135
|
-
// Merge content if exists
|
|
136
|
-
const files = fs.readdirSync(src);
|
|
137
|
-
files.forEach(f => {
|
|
138
|
-
const s = path.join(src, f);
|
|
139
|
-
const d = path.join(dest, f);
|
|
140
|
-
if (fs.statSync(s).isDirectory()) moveFolder(s, d);
|
|
141
|
-
else moveFile(s, d);
|
|
142
|
-
});
|
|
143
|
-
fs.rmdirSync(src, { recursive: true });
|
|
144
|
-
} else {
|
|
145
|
-
fs.renameSync(src, dest);
|
|
146
|
-
}
|
|
147
|
-
} catch (e) {
|
|
148
|
-
if (e.code === 'EXDEV') {
|
|
149
|
-
fs.cpSync(src, dest, { recursive: true });
|
|
150
|
-
fs.rmSync(src, { recursive: true });
|
|
151
|
-
} else {
|
|
152
|
-
console.error(`Error moving folder ${src}:`, e.message);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
migrate();
|