synapse-hub 0.0.0-stage → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/agents/failure-analyst.md +47 -0
- package/.agents/agents/live-explorer.md +41 -0
- package/.agents/agents/orchestrator.md +43 -0
- package/.agents/agents/pom-crafter.md +81 -0
- package/.agents/agents/quality-gatekeeper.md +47 -0
- package/.agents/agents/test-runner.md +43 -0
- package/.agents/rules/context-engineering.md +88 -0
- package/.agents/rules/git-push-protocol.md +101 -0
- package/.agents/rules/graphify.md +14 -0
- package/.agents/rules/lessons-learned.md +23 -0
- package/.agents/rules/mandatory-playwright-live.md +29 -0
- package/.agents/rules/skill-precedence.md +42 -0
- package/.agents/rules/systematic-debugging.md +99 -0
- package/.agents/skills/agent-orchestration-multi-agent-optimize/SKILL.md +239 -0
- package/.agents/skills/antigravity-test-sentinel/SKILL.md +64 -0
- package/.agents/skills/api-network-mocking-interception/SKILL.md +142 -0
- package/.agents/skills/api-spec-to-e2e-matrix/SKILL.md +70 -0
- package/.agents/skills/architecture-decision-records/SKILL.md +441 -0
- package/.agents/skills/auth-session-and-cookie-manager/SKILL.md +72 -0
- package/.agents/skills/backend-load-and-stress-patterns/SKILL.md +214 -0
- package/.agents/skills/bats-testing-patterns/SKILL.md +100 -0
- package/.agents/skills/bats-testing-patterns/resources/implementation-playbook.md +614 -0
- package/.agents/skills/clean-pom-crafter/SKILL.md +75 -0
- package/.agents/skills/clean-pom-crafter/examples/standard_test_case.groovy +28 -0
- package/.agents/skills/clean-pom-crafter/references/pom_patterns.groovy +138 -0
- package/.agents/skills/code-refactoring-refactor-clean/SKILL.md +64 -0
- package/.agents/skills/code-refactoring-refactor-clean/resources/implementation-playbook.md +879 -0
- package/.agents/skills/db-state-verifier-and-seeder/SKILL.md +123 -0
- package/.agents/skills/e2e-testing-patterns/SKILL.md +103 -0
- package/.agents/skills/e2e-testing-patterns/resources/implementation-playbook.md +522 -0
- package/.agents/skills/failure-autopsy-and-healing/SKILL.md +54 -0
- package/.agents/skills/failure-autopsy-and-healing/references/healing_matrix.md +64 -0
- package/.agents/skills/failure-autopsy-and-healing/references/qa_investigation_protocol.md +56 -0
- package/.agents/skills/failure-autopsy-and-healing/scripts/triage_failures.sh +98 -0
- package/.agents/skills/file-and-report-validator/SKILL.md +90 -0
- package/.agents/skills/flaky-test-sentinel-and-quarantine/SKILL.md +114 -0
- package/.agents/skills/github-actions-templates/SKILL.md +334 -0
- package/.agents/skills/graphify-impact-analyzer/SKILL.md +78 -0
- package/.agents/skills/katalon-cli-runner/SKILL.md +76 -0
- package/.agents/skills/katalon-cli-runner/references/groovy-patterns.md +209 -0
- package/.agents/skills/katalon-cli-runner/references/katalon-api.md +155 -0
- package/.agents/skills/katalon-cli-runner/references/runner_commands.md +67 -0
- package/.agents/skills/lam-script-generator/SKILL.md +83 -0
- package/.agents/skills/playwright-live-interaction/SKILL.md +86 -0
- package/.agents/skills/playwright-live-interaction/references/advanced_superpowers.md +160 -0
- package/.agents/skills/playwright-live-interaction/references/compact_accessibility_snapshots.md +75 -0
- package/.agents/skills/playwright-live-interaction/references/recipes.md +388 -0
- package/.agents/skills/playwright-live-interaction/references/swarm_orchestration.md +134 -0
- package/.agents/skills/security-dast-sentinel/SKILL.md +176 -0
- package/.agents/skills/self-healing-locator/SKILL.md +73 -0
- package/.agents/skills/synthetic-test-data-generator/SKILL.md +135 -0
- package/.agents/skills/token-and-context-optimizer/SKILL.md +70 -0
- package/.agents/skills/visual-regression-sentinel/SKILL.md +62 -0
- package/.agents/skills/wcag-audit-patterns/SKILL.md +77 -0
- package/.agents/skills/wcag-audit-patterns/resources/implementation-playbook.md +541 -0
- package/.agents/skills/web-vitals-and-performance-profiler/SKILL.md +65 -0
- package/.agents/templates/completion_report.md +57 -0
- package/.agents/workflows/graphify.md +10 -0
- package/.agents/workflows/test-impact.md +15 -0
- package/.agents/workflows/verify.md +34 -0
- package/AGENTS.md +115 -0
- package/README.md +394 -2
- package/bin/agent-qa.js +90 -0
- package/package.json +59 -4
- package/skills_manifest.json +262 -0
- package/templates/PROJECT_AI_GUIDE_TEMPLATE.md +97 -0
- package/templates/PROJECT_STATE_TEMPLATE.md +20 -0
- package/tools/TOOLS_RUNBOOK.md +298 -0
- package/tools/agent_canary.py +501 -0
- package/tools/analyze_project.py +242 -0
- package/tools/api_drift_sentinel.py +208 -0
- package/tools/auto_heal.py +189 -0
- package/tools/browser_helpers.js +593 -0
- package/tools/bug_reporter.py +224 -0
- package/tools/cache_resolver.py +846 -0
- package/tools/check_env.py +288 -0
- package/tools/ci_healing_hook.py +128 -0
- package/tools/cli.py +402 -0
- package/tools/config_decoupler.py +253 -0
- package/tools/db_sandbox.py +341 -0
- package/tools/distill_log.py +152 -0
- package/tools/e2e_flow_prober.ps1 +65 -0
- package/tools/flaky_detector.py +222 -0
- package/tools/fuzz_payloads.py +197 -0
- package/tools/generate_allure_report.ps1 +30 -0
- package/tools/generate_api_matrix.py +193 -0
- package/tools/generate_tc_from_story.py +182 -0
- package/tools/generate_test_reports.ps1 +135 -0
- package/tools/git_pre_commit_guard.py +203 -0
- package/tools/heal_pr_automator.py +195 -0
- package/tools/heuristic_locator_matcher.py +202 -0
- package/tools/infer_linter.py +238 -0
- package/tools/lint_ai_docs.py +254 -0
- package/tools/lookup_tc.py +165 -0
- package/tools/lookup_xpath.py +167 -0
- package/tools/matrix_sharder.py +146 -0
- package/tools/mcp_excel_server.ps1 +251 -0
- package/tools/mcp_server.py +490 -0
- package/tools/micro_mutator.py +309 -0
- package/tools/network_mock_shield.py +170 -0
- package/tools/omni_emitter.py +500 -0
- package/tools/omni_parser.py +435 -0
- package/tools/omni_transpiler.py +168 -0
- package/tools/pinpoint_failure.py +88 -0
- package/tools/project_state.py +169 -0
- package/tools/repo_map.json +12 -0
- package/tools/repo_map.py +277 -0
- package/tools/repo_map.txt +7 -0
- package/tools/safety_firewall.py +245 -0
- package/tools/setup_project.py +265 -0
- package/tools/smart_visual_masker.py +134 -0
- package/tools/test_impact.py +321 -0
- package/tools/tms_sync_bridge.py +342 -0
- package/tools/trace_data_flow.py +240 -0
- package/tools/traffic_session_converter.py +256 -0
- package/tools/universal_ir.py +480 -0
- package/tools/validate_groovy_scripts.py +173 -0
- package/tools/verify_all.py +496 -0
- package/tools/verify_all.sh +4 -0
- package/tools/visual_diff_canvas.py +142 -0
- package/tools/visual_som_helper.py +418 -0
- package/tools/wcag_audit.py +214 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: playwright-live-interaction
|
|
3
|
+
description: >-
|
|
4
|
+
Fast live web interaction and interactive debugging via Playwright MCP.
|
|
5
|
+
Use for rapid feedback, testing selectors, verifying Angular/PrimeNG components,
|
|
6
|
+
and executing test actions across enterprise web test suites without restarting Katalon/Selenium.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Playwright Live Interaction & Fast Debugging Handbook (Enterprise Web & Clean POM)
|
|
10
|
+
|
|
11
|
+
Direct in-browser interaction and rapid debugging via **Playwright MCP Tools** (`browser_run_code_unsafe` / `call_mcp_tool`), executing live JavaScript/Playwright commands without rebuilding or restarting test runs.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 1. Scope & Enterprise Architecture Coverage
|
|
16
|
+
|
|
17
|
+
All live web flows map strictly to the **Clean Page Object Model Architecture** (`BasePage` + Domain Page Classes in `Keywords/<project_namespace>/pages/` or `pages/*.ts`):
|
|
18
|
+
|
|
19
|
+
1. **Authentication & Session:** Login, multi-factor, session renewal, profile update, logout.
|
|
20
|
+
2. **Administration & RBAC:** User accounts, roles, permission matrices, tenant management.
|
|
21
|
+
3. **Master Data & System Catalogs:** Lookup dictionaries, unit definitions, category trees.
|
|
22
|
+
4. **Business Workflows & Approvals:** Multi-step submission, validation state gates, approval chains.
|
|
23
|
+
5. **Data Tables & Search:** Server-side pagination, two-phase search filtering, batch mutations.
|
|
24
|
+
6. **Reporting & Analytics:** Dashboard metrics, dynamic chart canvases, Excel/CSV exports.
|
|
25
|
+
7. **Integrations & API Tokens:** Token lifecycle management, webhook verification, data sharing.
|
|
26
|
+
|
|
27
|
+
### 1.1. Cross-Harness Tool Mapping (Portability Matrix)
|
|
28
|
+
|
|
29
|
+
To ensure skills operate seamlessly across different AI agent environments:
|
|
30
|
+
|
|
31
|
+
| Action / Intent | Antigravity MCP | Claude Code / Cursor / Standard Playwright MCP | Vanilla Playwright Script |
|
|
32
|
+
|---|---|---|---|
|
|
33
|
+
| **Run JS in Browser** | `browser_run_code_unsafe` | `browser_evaluate` | `page.evaluate(...)` |
|
|
34
|
+
| **Navigate to URL** | `browser_navigate` | `navigate_page` / `page.goto` | `page.goto(url)` |
|
|
35
|
+
| **Click Element** | `browser_click` | `click_element` | `page.locator(sel).click()` |
|
|
36
|
+
| **Inspect DOM/AOM** | `browser_snapshot` | `get_accessibility_tree` | `page.accessibility.snapshot()` |
|
|
37
|
+
| **Wait for State** | `browser_wait_for` | `wait_for_selector` | `page.waitForSelector(...)` |
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 2. Three-Stage Fast-Loop Workflow
|
|
42
|
+
|
|
43
|
+
```mermaid
|
|
44
|
+
flowchart LR
|
|
45
|
+
A["1. Flow Discovery<br/>Inspect live DOM & AOM"] --> B["2. Script Generation<br/>Verify 100% selector hit rate"]
|
|
46
|
+
B --> C["3. In-Place Debugging<br/>Fix error at current screen"]
|
|
47
|
+
C --> D["4. Codify Clean POM<br/>Package into Page Classes"]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
1. **Flow Discovery:** Probe accessibility tree (`accessibility.snapshot()`) or DOM to extract live URLs, menus, and dialogs in under 2 minutes.
|
|
51
|
+
2. **Script Generation:** Test selectors live (`await page.locator(...).count() > 0`). Only codify when the selector hits 100% in 200ms.
|
|
52
|
+
3. **In-Place Debugging:** When step $N$ fails, **keep the browser paused at that step**. Use `page.evaluate()` to diagnose disabled buttons, obscuring overlays, or validation errors. Fix in place; never re-run from step 1.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 3. Mapping Matrix (Playwright Live Code ↔ Clean POM)
|
|
57
|
+
|
|
58
|
+
| UI Action | Playwright Live Code (MCP) | Clean POM Groovy / Java Code | Clean POM TypeScript (Playwright) |
|
|
59
|
+
|---|---|---|---|
|
|
60
|
+
| **Fill Input** | `await page.locator(sel).fill(val);` | `WebElement el = findElement(By.cssSelector(sel)); jsSetInput(el, val);` | `await this.inputField.fill(val);` |
|
|
61
|
+
| **Safe Click / Overlay** | `await page.locator(sel).click();` | `WebElement el = findElement(By.cssSelector(sel)); clickElement(el);` | `await this.submitButton.click();` |
|
|
62
|
+
| **Dropdown Selection** | `await page.locator('p-dropdown').click(); await page.locator('.p-dropdown-item:has-text("X")').click();` | `selectDropdownByText(dropdownEl, "X")` | `await this.dropdown.selectOption("X");` |
|
|
63
|
+
| **Calendar Picker** | Synthetic `input` + `change` event | `jsSetInput(calendarInput, "25/10/2026")` | `await this.datePicker.fill("2026-10-25");` |
|
|
64
|
+
| **Catch Success Toast** | `await page.waitForSelector('.toast-success')` | `verifyToastMessage("Success")` | `await expect(this.toast).toBeVisible();` |
|
|
65
|
+
| **Two-Phase Search** | Click search icon -> Enter Keyword -> Enter | `searchRecord(keyword)` in Page Class | `await this.search(keyword);` |
|
|
66
|
+
| **Delete & Confirm** | Click Trash -> Accept Confirm -> Verify Gone | `deleteRecord(keyword)` in Page Class | `await this.delete(keyword);` |
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 4. Pre-Codify Quality Checklist
|
|
71
|
+
|
|
72
|
+
Mandatory 5-point verification before committing POM code:
|
|
73
|
+
- [x] **100% UTF-8 No BOM:** Must NOT contain `0xEF, 0xBB, 0xBF`.
|
|
74
|
+
- [x] **Flat Architecture:** Zero raw XPaths or unencapsulated selectors in test scripts.
|
|
75
|
+
- [x] **Dynamic Test Data:** Use `BasePage.uniqueCode("PREFIX_")`; no static colliding strings.
|
|
76
|
+
- [x] **Truth Anchor (No Fake Pass):** Real toast assertions or live data table row verification.
|
|
77
|
+
- [x] **Synthetic Event Dispatch:** 100% framework inputs trigger synthetic `input` and `change` events.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 5. Reference Documentation (Progressive Disclosure)
|
|
82
|
+
|
|
83
|
+
- [**20 Complete UI Recipes**](references/recipes.md): Code recipes for Auth, Data Tables, Dropdowns, Modals, Confirm Dialogs, File Upload, Calendar, MultiSelect, Stale Retries, Form Audit, Smart Action Batching, and Self-Healing Locators.
|
|
84
|
+
- [**Runtime Browser Helper (`tools/browser_helpers.js`)**](tools/browser_helpers.js): Unified JavaScript module providing `window.__qa` (`batch`, `audit`, `heal`, `clickSafe`, `exportSession`).
|
|
85
|
+
- [**5 Superpowers & 5 AI Paradigms**](references/advanced_superpowers.md): Zero-Second Auth (`session.json`), Direct API Seeding, AOM Snapshots, Multi-Context Dual Role, Route Mocking, Self-Healing Locators, Fuzzing, CDP Profiling.
|
|
86
|
+
- [**Multi-Agent Swarm Orchestration**](references/swarm_orchestration.md): Specialized swarm roles and collaboration protocol.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# 5 Advanced Superpowers & 5 AI Paradigms for Playwright Live Interaction
|
|
2
|
+
|
|
3
|
+
In-depth technical reference for complex testing scenarios across enterprise web test suites.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Five Native Advanced Superpowers
|
|
8
|
+
|
|
9
|
+
### 1.1. Zero-Second Auth (Bypass Login Form)
|
|
10
|
+
```javascript
|
|
11
|
+
// Step 1: Save storage state after login
|
|
12
|
+
async (page) => {
|
|
13
|
+
await page.context().storageState({ path: '.agents/session.json' });
|
|
14
|
+
return { status: "Session saved successfully" };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Step 2: Load stored session in subsequent contexts
|
|
18
|
+
const context = await browser.newContext({ storageState: '.agents/session.json' });
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 1.2. Network Interception & Direct Seeding
|
|
22
|
+
```javascript
|
|
23
|
+
async (page) => {
|
|
24
|
+
page.on('request', request => {
|
|
25
|
+
if (request.url().includes('/api/') && request.method() === 'POST') {
|
|
26
|
+
console.log('API URL:', request.url());
|
|
27
|
+
console.log('Headers:', request.headers());
|
|
28
|
+
console.log('Payload:', request.postData());
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 1.3. Accessibility Tree (AOM Snapshot — 90% Token Reduction)
|
|
35
|
+
```javascript
|
|
36
|
+
async (page) => {
|
|
37
|
+
const a11yTree = await page.accessibility.snapshot({
|
|
38
|
+
interestingOnly: true // Captures interactive elements only
|
|
39
|
+
});
|
|
40
|
+
return a11yTree;
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 1.4. Multi-Context Dual Role Testing (Parallel Roles)
|
|
45
|
+
```javascript
|
|
46
|
+
async (browser) => {
|
|
47
|
+
const specialistContext = await browser.newContext();
|
|
48
|
+
const leaderContext = await browser.newContext();
|
|
49
|
+
|
|
50
|
+
const pageSpecialist = await specialistContext.newPage();
|
|
51
|
+
const pageLeader = await leaderContext.newPage();
|
|
52
|
+
|
|
53
|
+
// Specialist submits dossier
|
|
54
|
+
await pageSpecialist.goto('https://app.example.com/planning');
|
|
55
|
+
// Leader reviews and approves
|
|
56
|
+
await pageLeader.goto('https://app.example.com/planning-approval');
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 1.5. API Route Mocking (Negative Scenarios & Fault Injection)
|
|
61
|
+
```javascript
|
|
62
|
+
async (page) => {
|
|
63
|
+
await page.route('**/api/**', route => {
|
|
64
|
+
route.fulfill({
|
|
65
|
+
status: 500,
|
|
66
|
+
contentType: 'application/json',
|
|
67
|
+
body: JSON.stringify({ message: 'Database connection failed!' })
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
await page.locator('button:has-text("Lưu")').click();
|
|
72
|
+
await page.waitForTimeout(500);
|
|
73
|
+
const toastMsg = await page.locator('.p-toast-message').innerText();
|
|
74
|
+
return { toastMsg };
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 2. Five AI Engineering Paradigms
|
|
81
|
+
|
|
82
|
+
### 2.1. Self-Healing Locator Engine (Multi-Tier Fallback)
|
|
83
|
+
```javascript
|
|
84
|
+
async (page, targetName) => {
|
|
85
|
+
const strategies = [
|
|
86
|
+
() => page.locator(`button[formcontrolname="${targetName}"]`),
|
|
87
|
+
() => page.getByRole('button', { name: targetName }),
|
|
88
|
+
() => page.locator(`button:has-text("${targetName}")`),
|
|
89
|
+
() => page.locator(`button[title*="${targetName}"]`),
|
|
90
|
+
() => page.locator(`.p-button:has-text("${targetName}")`)
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
for (const getLocator of strategies) {
|
|
94
|
+
const loc = getLocator();
|
|
95
|
+
if (await loc.count() > 0 && await loc.first().isVisible()) {
|
|
96
|
+
return loc.first(); // Self-healed successfully
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
throw new Error(`Self-healing failed: Element not found: ${targetName}`);
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 2.2. Multimodal Visual Verification (GIS & Layout)
|
|
104
|
+
```javascript
|
|
105
|
+
async (page) => {
|
|
106
|
+
const mapElement = page.locator('div.ol-viewport');
|
|
107
|
+
const screenshotBuffer = await mapElement.screenshot({ path: '.agents/screenshots/gis_canvas_live.png' });
|
|
108
|
+
const box = await mapElement.boundingBox();
|
|
109
|
+
return {
|
|
110
|
+
isRenderedProperly: box && box.width > 300 && box.height > 200,
|
|
111
|
+
width: box ? box.width : 0,
|
|
112
|
+
height: box ? box.height : 0,
|
|
113
|
+
screenshotPath: '.agents/screenshots/gis_canvas_live.png'
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 2.3. Autonomous Exploratory Fuzzing (Edge & Crash Hunting)
|
|
119
|
+
```javascript
|
|
120
|
+
async (page) => {
|
|
121
|
+
const edgePayloads = [
|
|
122
|
+
"'-DROP TABLE--",
|
|
123
|
+
"<script>alert(1)</script>",
|
|
124
|
+
"-99999999",
|
|
125
|
+
" ",
|
|
126
|
+
"A".repeat(500)
|
|
127
|
+
];
|
|
128
|
+
const results = [];
|
|
129
|
+
const input = page.locator('input[formcontrolname="code"]').first();
|
|
130
|
+
|
|
131
|
+
for (const payload of edgePayloads) {
|
|
132
|
+
await input.fill(payload);
|
|
133
|
+
await page.locator('button:has-text("Lưu"), button:has-text("Xác nhận")').first().click();
|
|
134
|
+
await page.waitForTimeout(600);
|
|
135
|
+
|
|
136
|
+
const hasCrash = await page.evaluate(() => {
|
|
137
|
+
const text = document.body.innerText;
|
|
138
|
+
return text.includes('500 Internal') || text.includes('HttpErrorResponse');
|
|
139
|
+
});
|
|
140
|
+
results.push({ payload, hasCrash });
|
|
141
|
+
}
|
|
142
|
+
return results;
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 2.4. CDP Deep Profiling (RAM & Heap Monitoring)
|
|
147
|
+
```javascript
|
|
148
|
+
async (page) => {
|
|
149
|
+
const memoryInfo = await page.evaluate(() => {
|
|
150
|
+
return window.performance && window.performance.memory ? {
|
|
151
|
+
usedJSHeapSizeMB: (window.performance.memory.usedJSHeapSize / (1024 * 1024)).toFixed(2),
|
|
152
|
+
totalJSHeapSizeMB: (window.performance.memory.totalJSHeapSize / (1024 * 1024)).toFixed(2)
|
|
153
|
+
} : { note: "Memory API only available in Chromium" };
|
|
154
|
+
});
|
|
155
|
+
return memoryInfo;
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 2.5. Multi-Agent Swarm Orchestration
|
|
160
|
+
For swarm roles (Lead Orchestrator, Live Explorer, Code Crafter, Test Runner, Quality Gatekeeper, Scribe), refer to [swarm_orchestration.md](swarm_orchestration.md).
|
package/.agents/skills/playwright-live-interaction/references/compact_accessibility_snapshots.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Compact Accessibility-Tree Snapshots for PrimeNG Inspection
|
|
2
|
+
|
|
3
|
+
*(Inherited from `vercel-labs/agent-browser`)*
|
|
4
|
+
|
|
5
|
+
A token-efficient browser inspection technique for exploring enterprise Angular & PrimeNG single-page interface without dumping heavy raw DOM HTML.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Problem: The Raw HTML Token Trap
|
|
10
|
+
|
|
11
|
+
On modern Angular/PrimeNG applications:
|
|
12
|
+
- A single complex screen (e.g. `DataMiningPage` with GIS Canvas, sidebar, and multi-field dialogs) contains **3,000+ lines of HTML**.
|
|
13
|
+
- Dumping raw DOM trees consumes **15,000 to 30,000 tokens** per inspection, cluttering the agent's context window.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 2. Solution: Semantic Accessibility Snapshot
|
|
18
|
+
|
|
19
|
+
Following the `agent-browser` architecture, we extract a **Compact Accessibility Tree** focused exclusively on interactive elements (`button`, `input`, `select`, `p-dropdown`, `p-calendar`, `p-table` headers and rows) assigned with lightweight identifier references (`@e1`, `@e2`, ...).
|
|
20
|
+
|
|
21
|
+
### 2.1. In-Browser JavaScript Extractor
|
|
22
|
+
Inject the following lightweight snippet via Playwright browser evaluate:
|
|
23
|
+
|
|
24
|
+
```javascript
|
|
25
|
+
(() => {
|
|
26
|
+
const interactiveSelectors = [
|
|
27
|
+
'button:not([disabled])',
|
|
28
|
+
'input:not([type="hidden"])',
|
|
29
|
+
'select',
|
|
30
|
+
'textarea',
|
|
31
|
+
'p-dropdown',
|
|
32
|
+
'p-calendar input',
|
|
33
|
+
'p-multiselect',
|
|
34
|
+
'a[href]',
|
|
35
|
+
'[role="button"]',
|
|
36
|
+
'[role="dialog"]',
|
|
37
|
+
'.p-toast-message'
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const elements = Array.from(document.querySelectorAll(interactiveSelectors.join(',')))
|
|
41
|
+
.filter(el => {
|
|
42
|
+
const rect = el.getBoundingClientRect();
|
|
43
|
+
return rect.width > 0 && rect.height > 0 && window.getComputedStyle(el).visibility !== 'hidden';
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
return elements.map((el, idx) => {
|
|
47
|
+
const tag = el.tagName.toLowerCase();
|
|
48
|
+
const type = el.getAttribute('type') || '';
|
|
49
|
+
const name = el.getAttribute('name') || el.getAttribute('formcontrolname') || '';
|
|
50
|
+
const label = (el.innerText || el.placeholder || el.getAttribute('aria-label') || el.title || '').trim().replace(/\s+/g, ' ').slice(0, 50);
|
|
51
|
+
const role = el.getAttribute('role') || tag;
|
|
52
|
+
return `[@e${idx + 1}] <${tag}${type ? ' type=' + type : ''}${name ? ' name=' + name : ''}> "${label}"`;
|
|
53
|
+
}).join('\n');
|
|
54
|
+
})();
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 2.2. Sample Compact Output (Under 500 Tokens vs 25,000 Tokens)
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
[@e1] <input name=username> "Tên đăng nhập"
|
|
61
|
+
[@e2] <input type=password name=password> "Mật khẩu"
|
|
62
|
+
[@e3] <button type=submit> "Đăng nhập"
|
|
63
|
+
[@e4] <p-dropdown name=layerSelect> "Chọn lớp dữ liệu"
|
|
64
|
+
[@e5] <input placeholder="Nhập từ khóa tìm kiếm..."> "Tìm kiếm"
|
|
65
|
+
[@e6] <button> "Thêm mới"
|
|
66
|
+
[@e7] <button title="Xóa"> "Xóa"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 3. Benefits for Enterprise Test Automation
|
|
72
|
+
|
|
73
|
+
1. **Token Savings:** Reduces DOM inspection size by **90% - 95%**.
|
|
74
|
+
2. **Speed:** Instant parsing in `< 20ms`.
|
|
75
|
+
3. **Selector Mapping:** Once an element reference `@eN` is identified on screen, map it directly into the Clean POM Page Class using `BasePage.x()`.
|