browser-debugger-cli 0.6.1 → 0.6.2
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/README.md +55 -0
- package/dist/__tests__/smoke/error-handling.smoke.test.js +9 -4
- package/dist/__tests__/smoke/error-handling.smoke.test.js.map +1 -1
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.js +27 -24
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.js.map +1 -1
- package/dist/__testutils__/daemonHelpers.d.ts +13 -1
- package/dist/__testutils__/daemonHelpers.d.ts.map +1 -1
- package/dist/__testutils__/daemonHelpers.js +54 -5
- package/dist/__testutils__/daemonHelpers.js.map +1 -1
- package/dist/cdp/protocol.d.ts.map +1 -1
- package/dist/cdp/protocol.js +9 -7
- package/dist/cdp/protocol.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +21 -6
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/dom/a11y.d.ts +18 -0
- package/dist/commands/dom/a11y.d.ts.map +1 -0
- package/dist/commands/dom/a11y.js +134 -0
- package/dist/commands/dom/a11y.js.map +1 -0
- package/dist/commands/dom/evalHelpers.js +1 -1
- package/dist/commands/dom/evalHelpers.js.map +1 -1
- package/dist/commands/dom/index.d.ts.map +1 -1
- package/dist/commands/dom/index.js +41 -20
- package/dist/commands/dom/index.js.map +1 -1
- package/dist/commands/peek.d.ts.map +1 -1
- package/dist/commands/peek.js +2 -0
- package/dist/commands/peek.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +12 -4
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/types.d.ts +3 -0
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -1
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.d.ts +19 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.d.ts.map +1 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.js +212 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.js.map +1 -0
- package/dist/daemon/launcher.d.ts.map +1 -1
- package/dist/daemon/launcher.js +4 -3
- package/dist/daemon/launcher.js.map +1 -1
- package/dist/daemon/lifecycle/workerCleanup.d.ts.map +1 -1
- package/dist/daemon/lifecycle/workerCleanup.js +1 -1
- package/dist/daemon/lifecycle/workerCleanup.js.map +1 -1
- package/dist/daemon/services/SessionService.js +1 -1
- package/dist/daemon/services/SessionService.js.map +1 -1
- package/dist/ipc/__tests__/client.contract.test.js +251 -19
- package/dist/ipc/__tests__/client.contract.test.js.map +1 -1
- package/dist/ipc/__tests__/jsonl.unit.test.js +19 -1
- package/dist/ipc/__tests__/jsonl.unit.test.js.map +1 -1
- package/dist/ipc/transport/jsonl.d.ts +16 -0
- package/dist/ipc/transport/jsonl.d.ts.map +1 -1
- package/dist/ipc/transport/jsonl.js +25 -0
- package/dist/ipc/transport/jsonl.js.map +1 -1
- package/dist/session/chrome.js +2 -2
- package/dist/session/chrome.js.map +1 -1
- package/dist/session/cleanup.d.ts +21 -0
- package/dist/session/cleanup.d.ts.map +1 -1
- package/dist/session/cleanup.js +101 -1
- package/dist/session/cleanup.js.map +1 -1
- package/dist/session/lock.js +1 -1
- package/dist/session/lock.js.map +1 -1
- package/dist/telemetry/__tests__/a11y.unit.test.d.ts +10 -0
- package/dist/telemetry/__tests__/a11y.unit.test.d.ts.map +1 -0
- package/dist/telemetry/__tests__/a11y.unit.test.js +265 -0
- package/dist/telemetry/__tests__/a11y.unit.test.js.map +1 -0
- package/dist/telemetry/a11y.d.ts +78 -0
- package/dist/telemetry/a11y.d.ts.map +1 -0
- package/dist/telemetry/a11y.js +280 -0
- package/dist/telemetry/a11y.js.map +1 -0
- package/dist/telemetry/dom.d.ts +1 -1
- package/dist/telemetry/dom.d.ts.map +1 -1
- package/dist/telemetry/dom.js +32 -1
- package/dist/telemetry/dom.js.map +1 -1
- package/dist/types.d.ts +77 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/formatters/__tests__/semantic.unit.test.d.ts +2 -0
- package/dist/ui/formatters/__tests__/semantic.unit.test.d.ts.map +1 -0
- package/dist/ui/formatters/__tests__/semantic.unit.test.js +111 -0
- package/dist/ui/formatters/__tests__/semantic.unit.test.js.map +1 -0
- package/dist/ui/formatters/a11y.d.ts +30 -0
- package/dist/ui/formatters/a11y.d.ts.map +1 -0
- package/dist/ui/formatters/a11y.js +178 -0
- package/dist/ui/formatters/a11y.js.map +1 -0
- package/dist/ui/formatters/preview.d.ts +2 -0
- package/dist/ui/formatters/preview.d.ts.map +1 -1
- package/dist/ui/formatters/preview.js +27 -4
- package/dist/ui/formatters/preview.js.map +1 -1
- package/dist/ui/formatters/semantic.d.ts +36 -0
- package/dist/ui/formatters/semantic.d.ts.map +1 -0
- package/dist/ui/formatters/semantic.js +98 -0
- package/dist/ui/formatters/semantic.js.map +1 -0
- package/dist/ui/formatters/status.js +1 -1
- package/dist/ui/formatters/status.js.map +1 -1
- package/dist/ui/messages/commands.d.ts +7 -0
- package/dist/ui/messages/commands.d.ts.map +1 -1
- package/dist/ui/messages/commands.js +9 -0
- package/dist/ui/messages/commands.js.map +1 -1
- package/dist/utils/__tests__/errors.unit.test.d.ts +12 -0
- package/dist/utils/__tests__/errors.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/errors.unit.test.js +255 -0
- package/dist/utils/__tests__/errors.unit.test.js.map +1 -0
- package/dist/utils/__tests__/http.unit.test.d.ts +12 -0
- package/dist/utils/__tests__/http.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/http.unit.test.js +218 -0
- package/dist/utils/__tests__/http.unit.test.js.map +1 -0
- package/dist/utils/__tests__/process.unit.test.d.ts +14 -0
- package/dist/utils/__tests__/process.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/process.unit.test.js +124 -0
- package/dist/utils/__tests__/process.unit.test.js.map +1 -0
- package/dist/utils/__tests__/session.contract.test.js +1 -1
- package/dist/utils/__tests__/session.contract.test.js.map +1 -1
- package/package.json +22 -1
package/README.md
CHANGED
|
@@ -204,12 +204,59 @@ bdg dom get "button.primary" # Get HTML
|
|
|
204
204
|
bdg dom eval "document.title" # Run JavaScript
|
|
205
205
|
bdg dom highlight ".navbar" # Visual debugging
|
|
206
206
|
|
|
207
|
+
# Accessibility inspection
|
|
208
|
+
bdg dom a11y tree # View full accessibility tree
|
|
209
|
+
bdg dom a11y query role=button # Find elements by ARIA role
|
|
210
|
+
bdg dom a11y describe "#login" # Get a11y info for element
|
|
211
|
+
|
|
207
212
|
# Inspect collected data
|
|
208
213
|
bdg peek # Quick snapshot
|
|
209
214
|
bdg peek --network # Just network data
|
|
210
215
|
bdg tail # Stream like tail -f
|
|
211
216
|
```
|
|
212
217
|
|
|
218
|
+
### Accessibility Testing
|
|
219
|
+
|
|
220
|
+
Built-in accessibility tree inspection via Chrome DevTools Protocol:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
# Semantic DOM inspection (70-99% token reduction vs raw HTML)
|
|
224
|
+
bdg dom get "button" # [Button] "Submit" (focusable)
|
|
225
|
+
bdg dom get "#searchInput" # [Searchbox] "Search" (focusable, required)
|
|
226
|
+
bdg dom get "nav" # [Navigation] "Main menu"
|
|
227
|
+
|
|
228
|
+
# Compare with raw HTML
|
|
229
|
+
bdg dom get "button" --raw # Full HTML with all attributes
|
|
230
|
+
|
|
231
|
+
# Full accessibility tree
|
|
232
|
+
bdg dom a11y tree # View first 50 nodes
|
|
233
|
+
bdg dom a11y tree --json # Complete tree in JSON
|
|
234
|
+
|
|
235
|
+
# Find unlabeled buttons
|
|
236
|
+
bdg dom a11y query role=button --json | jq '.nodes[] | select(.name == null)'
|
|
237
|
+
|
|
238
|
+
# Verify form labels
|
|
239
|
+
bdg dom a11y query role=textbox --json | jq '.nodes[] | {id: .nodeId, label: .name}'
|
|
240
|
+
|
|
241
|
+
# Check landmark structure
|
|
242
|
+
bdg dom a11y query role=main --json | jq '.count' # Should be 1
|
|
243
|
+
|
|
244
|
+
# Audit specific element
|
|
245
|
+
bdg dom a11y describe "button#submit" --json | jq '{role, name, focusable, disabled}'
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Token efficiency:**
|
|
249
|
+
- Simple button: 82% reduction (41 chars vs 233 chars HTML)
|
|
250
|
+
- Search input: 85% reduction (42 chars vs 278 chars HTML)
|
|
251
|
+
- Navigation: 99.5% reduction (19 chars vs 4,218 chars HTML)
|
|
252
|
+
|
|
253
|
+
Use cases:
|
|
254
|
+
- **AI agents**: Massive token savings for LLM-based automation
|
|
255
|
+
- **Automated testing**: Verify all interactive elements have accessible names
|
|
256
|
+
- **CI/CD integration**: Catch accessibility regressions before deployment
|
|
257
|
+
- **Screen reader simulation**: See what assistive tech sees
|
|
258
|
+
- **ARIA validation**: Check landmark roles and ARIA attributes
|
|
259
|
+
|
|
213
260
|
## Page Readiness
|
|
214
261
|
|
|
215
262
|
By default, `bdg` waits for pages to fully load using three signals:
|
|
@@ -242,6 +289,14 @@ This tool is built on principles learned from building CLI tools for autonomous
|
|
|
242
289
|
|
|
243
290
|
These docs capture observations from real agent interactions and explain the reasoning behind design decisions. If you're building tools for AI agents, they might be useful.
|
|
244
291
|
|
|
292
|
+
## Documentation
|
|
293
|
+
|
|
294
|
+
- **[Roadmap](docs/roadmap/ROADMAP.md)** - Product vision, milestones, and priorities
|
|
295
|
+
- **[Implementation Status](docs/roadmap/IMPLEMENTATION_STATUS.md)** - Feature completion tracking
|
|
296
|
+
- **[CLI Reference](docs/CLI_REFERENCE.md)** - Complete command documentation
|
|
297
|
+
- **[Agent Guide](docs/principles/AGENT_FRIENDLY_TOOLS.md)** - Building tools for AI agents
|
|
298
|
+
- **[Self-Documenting Systems](docs/principles/SELF_DOCUMENTING_SYSTEMS.md)** - Design philosophy
|
|
299
|
+
|
|
245
300
|
## Contributing
|
|
246
301
|
|
|
247
302
|
If you use this and something breaks, [open an issue](https://github.com/szymdzum/browser-debugger-cli/issues/new). If you have ideas, start a [discussion](https://github.com/szymdzum/browser-debugger-cli/discussions). PRs welcome.
|
|
@@ -5,13 +5,18 @@
|
|
|
5
5
|
* WHY: Errors are high-risk areas - tests ensure helpful messages and proper exit codes.
|
|
6
6
|
*/
|
|
7
7
|
import * as assert from 'node:assert/strict';
|
|
8
|
-
import { describe, it, afterEach } from 'node:test';
|
|
8
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
9
9
|
import { runCommand } from '../../__testutils__/commandRunner.js';
|
|
10
10
|
import { cleanupAllSessions } from '../../__testutils__/daemonHelpers.js';
|
|
11
11
|
import { EXIT_CODES } from '../../utils/exitCodes.js';
|
|
12
12
|
void describe('Error Handling Smoke Tests', () => {
|
|
13
|
+
let allocatedPort;
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
const basePort = 9222;
|
|
16
|
+
const portOffset = Math.floor(Math.random() * 100);
|
|
17
|
+
allocatedPort = basePort + portOffset;
|
|
18
|
+
});
|
|
13
19
|
afterEach(async () => {
|
|
14
|
-
// Cleanup after each test (no beforeEach needed if this works properly)
|
|
15
20
|
await cleanupAllSessions();
|
|
16
21
|
});
|
|
17
22
|
void it('should fail with helpful message when daemon not running', async () => {
|
|
@@ -37,8 +42,8 @@ void describe('Error Handling Smoke Tests', () => {
|
|
|
37
42
|
// TODO: Re-enable with better synchronization/retry logic
|
|
38
43
|
void it('should provide helpful error when Chrome fails to launch', async () => {
|
|
39
44
|
// Try to start with invalid Chrome path and unique port
|
|
40
|
-
const result = await runCommand('http://example.com', ['--port',
|
|
41
|
-
timeout:
|
|
45
|
+
const result = await runCommand('http://example.com', ['--port', allocatedPort.toString(), '--headless'], {
|
|
46
|
+
timeout: 60000,
|
|
42
47
|
env: {
|
|
43
48
|
CHROME_PATH: '/nonexistent/chrome',
|
|
44
49
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handling.smoke.test.js","sourceRoot":"","sources":["../../../src/__tests__/smoke/error-handling.smoke.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"error-handling.smoke.test.js","sourceRoot":"","sources":["../../../src/__tests__/smoke/error-handling.smoke.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,KAAK,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC/C,IAAI,aAAqB,CAAC;IAE1B,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QACnD,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,kBAAkB,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,KAAK,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC7E,qCAAqC;QACrC,wEAAwE;QACxE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/D,mDAAmD;QACnD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;QAE7D,wDAAwD;QACxD,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,KAAK,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACzF,8BAA8B;QAC9B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/D,cAAc;QACd,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEpC,uCAAuC;QACvC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,oEAAoE;IACpE,mFAAmF;IACnF,0DAA0D;IAE1D,KAAK,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC7E,wDAAwD;QACxD,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,oBAAoB,EACpB,CAAC,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,EAAE,YAAY,CAAC,EAClD;YACE,OAAO,EAAE,KAAK;YACd,GAAG,EAAE;gBACH,WAAW,EAAE,qBAAqB;aACnC;SACF,CACF,CAAC;QAEF,8DAA8D;QAC9D,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAEpC,yDAAyD;QACzD,MAAM,CAAC,EAAE,CAAC,+BAA+B,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,oEAAoE;IACpE,oEAAoE;IACpE,+EAA+E;IAC/E,wEAAwE;IACxE,4BAA4B;IAC5B,sDAAsD;IACtD,+BAA+B;IAC/B,wEAAwE;IACxE,gFAAgF;AAClF,CAAC,CAAC,CAAC"}
|
|
@@ -5,30 +5,33 @@
|
|
|
5
5
|
* WHY: Highest-risk path with 0% coverage despite being critical user flow.
|
|
6
6
|
*/
|
|
7
7
|
import * as assert from 'node:assert/strict';
|
|
8
|
-
import { describe, it, afterEach } from 'node:test';
|
|
8
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
9
9
|
import { runCommand, runCommandJSON } from '../../__testutils__/commandRunner.js';
|
|
10
10
|
import { cleanupAllSessions, isDaemonRunning, isSessionActive, readSessionOutput, waitForDaemon, } from '../../__testutils__/daemonHelpers.js';
|
|
11
11
|
void describe('Session Lifecycle Smoke Tests', () => {
|
|
12
|
+
let allocatedPort;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
const basePort = 9222;
|
|
15
|
+
const portOffset = Math.floor(Math.random() * 100);
|
|
16
|
+
allocatedPort = basePort + portOffset;
|
|
17
|
+
});
|
|
12
18
|
afterEach(async () => {
|
|
13
|
-
// Cleanup after each test (no beforeEach needed if this works properly)
|
|
14
19
|
await cleanupAllSessions();
|
|
15
20
|
});
|
|
16
21
|
void it('should start session and create daemon', async () => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
timeout: 15000, // Increased from 10s to handle slow CI runners
|
|
22
|
+
const result = await runCommand('http://example.com', ['--port', allocatedPort.toString(), '--headless'], {
|
|
23
|
+
timeout: 60000,
|
|
20
24
|
});
|
|
21
25
|
// Should succeed
|
|
22
|
-
assert.equal(result.exitCode, 0);
|
|
26
|
+
assert.equal(result.exitCode, 0, `Start failed: ${result.stderr}`);
|
|
23
27
|
// Daemon should be running
|
|
24
28
|
assert.equal(isDaemonRunning(), true);
|
|
25
29
|
// Session should be active
|
|
26
30
|
assert.equal(isSessionActive(), true);
|
|
27
31
|
});
|
|
28
32
|
void it('should collect data during session', async () => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
timeout: 10000,
|
|
33
|
+
const startResult = await runCommand('http://example.com', ['--port', allocatedPort.toString(), '--headless'], {
|
|
34
|
+
timeout: 60000,
|
|
32
35
|
});
|
|
33
36
|
assert.equal(startResult.exitCode, 0, `Session start failed: ${startResult.stderr}`);
|
|
34
37
|
// Wait for daemon to be ready
|
|
@@ -36,29 +39,27 @@ void describe('Session Lifecycle Smoke Tests', () => {
|
|
|
36
39
|
// Give Chrome time to navigate and collect some data
|
|
37
40
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
38
41
|
// Peek at collected data
|
|
39
|
-
const peekResult = await runCommandJSON('peek', [
|
|
40
|
-
'--json',
|
|
41
|
-
]);
|
|
42
|
+
const peekResult = await runCommandJSON('peek', ['--json']);
|
|
42
43
|
// Should have collected some data
|
|
43
44
|
assert.ok(peekResult);
|
|
44
45
|
assert.ok(typeof peekResult === 'object');
|
|
45
|
-
assert.ok('
|
|
46
|
-
assert.ok('data' in peekResult
|
|
46
|
+
assert.ok('version' in peekResult);
|
|
47
|
+
assert.ok('data' in peekResult);
|
|
47
48
|
// Stop session to clean up
|
|
48
|
-
const stopResult = await runCommand('stop', [], { timeout:
|
|
49
|
+
const stopResult = await runCommand('stop', [], { timeout: 60000 });
|
|
49
50
|
assert.equal(stopResult.exitCode, 0, `Stop failed: ${stopResult.stderr}`);
|
|
50
51
|
});
|
|
51
52
|
void it('should write output on stop', async () => {
|
|
52
53
|
// Start session with unique port
|
|
53
|
-
const startResult = await runCommand('http://example.com', ['--port',
|
|
54
|
-
timeout:
|
|
54
|
+
const startResult = await runCommand('http://example.com', ['--port', allocatedPort.toString(), '--headless'], {
|
|
55
|
+
timeout: 60000,
|
|
55
56
|
});
|
|
56
57
|
assert.equal(startResult.exitCode, 0, `Session start failed: ${startResult.stderr}`);
|
|
57
58
|
await waitForDaemon(5000);
|
|
58
59
|
// Give Chrome time to collect data
|
|
59
60
|
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
60
61
|
// Stop session
|
|
61
|
-
const stopResult = await runCommand('stop', [], { timeout:
|
|
62
|
+
const stopResult = await runCommand('stop', [], { timeout: 60000 });
|
|
62
63
|
// Should succeed
|
|
63
64
|
assert.equal(stopResult.exitCode, 0, `Stop failed: ${stopResult.stderr}`);
|
|
64
65
|
// Give filesystem time to write the file (increased for test stability)
|
|
@@ -77,10 +78,12 @@ void describe('Session Lifecycle Smoke Tests', () => {
|
|
|
77
78
|
});
|
|
78
79
|
void it('should cleanup daemon on stop', async () => {
|
|
79
80
|
// Start session with unique port
|
|
80
|
-
await runCommand('http://example.com', ['--port',
|
|
81
|
+
await runCommand('http://example.com', ['--port', allocatedPort.toString(), '--headless'], {
|
|
82
|
+
timeout: 60000,
|
|
83
|
+
});
|
|
81
84
|
await waitForDaemon(5000);
|
|
82
85
|
// Stop session
|
|
83
|
-
await runCommand('stop', [], { timeout:
|
|
86
|
+
await runCommand('stop', [], { timeout: 60000 });
|
|
84
87
|
// Wait for cleanup
|
|
85
88
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
86
89
|
// Daemon should no longer be running
|
|
@@ -90,14 +93,14 @@ void describe('Session Lifecycle Smoke Tests', () => {
|
|
|
90
93
|
});
|
|
91
94
|
void it('should handle concurrent session attempts gracefully', async () => {
|
|
92
95
|
// Start first session with unique port
|
|
93
|
-
const firstResult = await runCommand('http://example.com', ['--port',
|
|
94
|
-
timeout:
|
|
96
|
+
const firstResult = await runCommand('http://example.com', ['--port', allocatedPort.toString(), '--headless'], {
|
|
97
|
+
timeout: 60000,
|
|
95
98
|
});
|
|
96
99
|
assert.equal(firstResult.exitCode, 0, `First session start failed: ${firstResult.stderr}`);
|
|
97
100
|
await waitForDaemon(5000);
|
|
98
101
|
// Try to start second session (should fail)
|
|
99
|
-
const secondResult = await runCommand('http://another.com', ['--port',
|
|
100
|
-
timeout:
|
|
102
|
+
const secondResult = await runCommand('http://another.com', ['--port', allocatedPort.toString(), '--headless'], {
|
|
103
|
+
timeout: 60000,
|
|
101
104
|
});
|
|
102
105
|
// Should fail with daemon already running error
|
|
103
106
|
assert.notEqual(secondResult.exitCode, 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-lifecycle.smoke.test.js","sourceRoot":"","sources":["../../../src/__tests__/smoke/session-lifecycle.smoke.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"session-lifecycle.smoke.test.js","sourceRoot":"","sources":["../../../src/__tests__/smoke/session-lifecycle.smoke.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -77,5 +77,17 @@ export declare function readSessionOutput(): unknown;
|
|
|
77
77
|
* assert.ok(await waitForDaemon(5000));
|
|
78
78
|
* ```
|
|
79
79
|
*/
|
|
80
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Wait for daemon to be fully ready (socket listening + IPC responsive).
|
|
82
|
+
*
|
|
83
|
+
* Enhanced version that polls for:
|
|
84
|
+
* 1. PID file exists and process alive
|
|
85
|
+
* 2. Daemon socket exists and is connectable
|
|
86
|
+
* 3. IPC handshake succeeds (optional verification)
|
|
87
|
+
*
|
|
88
|
+
* @param timeoutMs - Maximum time to wait (default: 10s, increased from 5s)
|
|
89
|
+
* @param verifyHandshake - Whether to verify IPC handshake (default: false for backwards compat)
|
|
90
|
+
* @returns True if daemon is ready, false if timeout
|
|
91
|
+
*/
|
|
92
|
+
export declare function waitForDaemon(timeoutMs?: number, verifyHandshake?: boolean): Promise<boolean>;
|
|
81
93
|
//# sourceMappingURL=daemonHelpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemonHelpers.d.ts","sourceRoot":"","sources":["../../src/__testutils__/daemonHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"daemonHelpers.d.ts","sourceRoot":"","sources":["../../src/__testutils__/daemonHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAmBzC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAYzC;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,MAAM,GAAE,MAAM,CAAC,OAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BlF;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiDxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAa3C;AAED;;;;;;;;;;;GAWG;AACH;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CACjC,SAAS,GAAE,MAAc,EACzB,eAAe,GAAE,OAAe,GAC/B,OAAO,CAAC,OAAO,CAAC,CAsDlB"}
|
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
* WHY: Enables testing daemon lifecycle without exposing internals.
|
|
6
6
|
*/
|
|
7
7
|
import * as fs from 'fs';
|
|
8
|
+
import * as net from 'net';
|
|
8
9
|
import { getSessionFilePath } from '../session/paths.js';
|
|
9
10
|
import { readPid } from '../session/pid.js';
|
|
10
|
-
import { isProcessAlive } from '../
|
|
11
|
+
import { isProcessAlive } from '../utils/process.js';
|
|
11
12
|
import { ensureTestSessionDir } from './testHome.js';
|
|
12
13
|
ensureTestSessionDir();
|
|
13
14
|
/**
|
|
@@ -193,13 +194,61 @@ export function readSessionOutput() {
|
|
|
193
194
|
* assert.ok(await waitForDaemon(5000));
|
|
194
195
|
* ```
|
|
195
196
|
*/
|
|
196
|
-
|
|
197
|
+
/**
|
|
198
|
+
* Wait for daemon to be fully ready (socket listening + IPC responsive).
|
|
199
|
+
*
|
|
200
|
+
* Enhanced version that polls for:
|
|
201
|
+
* 1. PID file exists and process alive
|
|
202
|
+
* 2. Daemon socket exists and is connectable
|
|
203
|
+
* 3. IPC handshake succeeds (optional verification)
|
|
204
|
+
*
|
|
205
|
+
* @param timeoutMs - Maximum time to wait (default: 10s, increased from 5s)
|
|
206
|
+
* @param verifyHandshake - Whether to verify IPC handshake (default: false for backwards compat)
|
|
207
|
+
* @returns True if daemon is ready, false if timeout
|
|
208
|
+
*/
|
|
209
|
+
export async function waitForDaemon(timeoutMs = 10000, verifyHandshake = false) {
|
|
197
210
|
const startTime = Date.now();
|
|
211
|
+
const pollInterval = 100;
|
|
198
212
|
while (Date.now() - startTime < timeoutMs) {
|
|
199
|
-
if (isDaemonRunning()) {
|
|
200
|
-
|
|
213
|
+
if (!isDaemonRunning()) {
|
|
214
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const socketPath = getSessionFilePath('DAEMON_SOCKET');
|
|
218
|
+
if (!fs.existsSync(socketPath)) {
|
|
219
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
const isListening = await new Promise((resolve) => {
|
|
223
|
+
const socket = net.createConnection(socketPath);
|
|
224
|
+
socket.on('connect', () => {
|
|
225
|
+
socket.end();
|
|
226
|
+
resolve(true);
|
|
227
|
+
});
|
|
228
|
+
socket.on('error', () => {
|
|
229
|
+
resolve(false);
|
|
230
|
+
});
|
|
231
|
+
setTimeout(() => {
|
|
232
|
+
socket.destroy();
|
|
233
|
+
resolve(false);
|
|
234
|
+
}, 500);
|
|
235
|
+
});
|
|
236
|
+
if (!isListening) {
|
|
237
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
if (verifyHandshake) {
|
|
241
|
+
try {
|
|
242
|
+
const { connectToDaemon } = await import('../ipc/client.js');
|
|
243
|
+
await connectToDaemon();
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
201
250
|
}
|
|
202
|
-
|
|
251
|
+
return true;
|
|
203
252
|
}
|
|
204
253
|
return false;
|
|
205
254
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemonHelpers.js","sourceRoot":"","sources":["../../src/__testutils__/daemonHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"daemonHelpers.js","sourceRoot":"","sources":["../../src/__testutils__/daemonHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/cdp/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/cdp/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAOlE;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,IAAI,cAAc,CAyB7C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIjE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAQxF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBjE"}
|
package/dist/cdp/protocol.js
CHANGED
|
@@ -6,10 +6,9 @@
|
|
|
6
6
|
* and introspection.
|
|
7
7
|
*/
|
|
8
8
|
import { readFileSync } from 'fs';
|
|
9
|
+
import { createRequire } from 'module';
|
|
9
10
|
import { dirname, join } from 'path';
|
|
10
|
-
|
|
11
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
-
const __dirname = dirname(__filename);
|
|
11
|
+
const require = createRequire(import.meta.url);
|
|
13
12
|
// Cache the protocol to avoid re-reading the file
|
|
14
13
|
let cachedProtocol = null;
|
|
15
14
|
/**
|
|
@@ -33,10 +32,13 @@ export function loadProtocol() {
|
|
|
33
32
|
if (cachedProtocol) {
|
|
34
33
|
return cachedProtocol;
|
|
35
34
|
}
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
const
|
|
35
|
+
// Resolve protocol files using require.resolve to dynamically locate the package
|
|
36
|
+
// We resolve the package.json, then navigate to the json/ directory
|
|
37
|
+
// This works regardless of build output structure or installation location
|
|
38
|
+
const packageJsonPath = require.resolve('devtools-protocol/package.json');
|
|
39
|
+
const protocolDir = dirname(packageJsonPath);
|
|
40
|
+
const browserProtocolPath = join(protocolDir, 'json/browser_protocol.json');
|
|
41
|
+
const jsProtocolPath = join(protocolDir, 'json/js_protocol.json');
|
|
40
42
|
const browserProtocol = JSON.parse(readFileSync(browserProtocolPath, 'utf-8'));
|
|
41
43
|
const jsProtocol = JSON.parse(readFileSync(jsProtocolPath, 'utf-8'));
|
|
42
44
|
// Merge the two protocols
|
package/dist/cdp/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/cdp/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/cdp/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqDzC;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqDzC;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2J7D"}
|
package/dist/commands/cleanup.js
CHANGED
|
@@ -5,10 +5,10 @@ import { getErrorMessage } from '../connection/errors.js';
|
|
|
5
5
|
import { cleanupSession } from '../session/cleanup.js';
|
|
6
6
|
import { getSessionFilePath } from '../session/paths.js';
|
|
7
7
|
import { readPid } from '../session/pid.js';
|
|
8
|
-
import { isProcessAlive } from '../session/process.js';
|
|
9
8
|
import { joinLines } from '../ui/formatting.js';
|
|
10
9
|
import { sessionFilesCleanedMessage, sessionOutputRemovedMessage, sessionDirectoryCleanMessage, noSessionFilesMessage, staleSessionFoundMessage, forceCleanupWarningMessage, sessionStillActiveError, warningMessage, } from '../ui/messages/commands.js';
|
|
11
10
|
import { EXIT_CODES } from '../utils/exitCodes.js';
|
|
11
|
+
import { isProcessAlive } from '../utils/process.js';
|
|
12
12
|
/**
|
|
13
13
|
* Format cleanup result for human-readable output.
|
|
14
14
|
*
|
|
@@ -29,19 +29,29 @@ export function registerCleanupCommand(program) {
|
|
|
29
29
|
.description('Clean up stale session files')
|
|
30
30
|
.option('-f, --force', 'Force cleanup even if session appears active', false)
|
|
31
31
|
.option('-a, --all', 'Also remove session.json output file', false)
|
|
32
|
-
.option('--aggressive', 'Kill
|
|
32
|
+
.option('--aggressive', 'Kill orphaned daemon processes and all stale Chrome instances', false)
|
|
33
33
|
.addOption(jsonOption)
|
|
34
34
|
.action(async (options) => {
|
|
35
35
|
await runCommand(async (opts) => {
|
|
36
|
-
// Import
|
|
36
|
+
// Import cleanup functions dynamically
|
|
37
37
|
const { cleanupStaleChrome } = await import('../session/chrome.js');
|
|
38
|
+
const { cleanupOrphanedDaemons } = await import('../session/cleanup.js');
|
|
38
39
|
let didCleanup = false;
|
|
39
40
|
let cleanedSession = false;
|
|
40
41
|
let cleanedOutput = false;
|
|
41
42
|
let cleanedChrome = false;
|
|
43
|
+
let cleanedDaemons = false;
|
|
42
44
|
const warnings = [];
|
|
43
|
-
// Handle aggressive
|
|
45
|
+
// Handle aggressive cleanup first if requested
|
|
44
46
|
if (opts.aggressive) {
|
|
47
|
+
// Kill orphaned daemon processes
|
|
48
|
+
const daemonsKilled = cleanupOrphanedDaemons();
|
|
49
|
+
if (daemonsKilled > 0) {
|
|
50
|
+
cleanedDaemons = true;
|
|
51
|
+
didCleanup = true;
|
|
52
|
+
console.error(`✓ Killed ${daemonsKilled} orphaned daemon process(es)`);
|
|
53
|
+
}
|
|
54
|
+
// Kill stale Chrome processes
|
|
45
55
|
const errorCount = await cleanupStaleChrome();
|
|
46
56
|
cleanedChrome = true;
|
|
47
57
|
if (errorCount > 0) {
|
|
@@ -135,7 +145,7 @@ export function registerCleanupCommand(program) {
|
|
|
135
145
|
return {
|
|
136
146
|
success: true,
|
|
137
147
|
data: {
|
|
138
|
-
cleaned: { session: false, output: false, chrome: false },
|
|
148
|
+
cleaned: { session: false, output: false, chrome: false, daemons: false },
|
|
139
149
|
message: noSessionFilesMessage(),
|
|
140
150
|
},
|
|
141
151
|
};
|
|
@@ -143,7 +153,12 @@ export function registerCleanupCommand(program) {
|
|
|
143
153
|
return {
|
|
144
154
|
success: true,
|
|
145
155
|
data: {
|
|
146
|
-
cleaned: {
|
|
156
|
+
cleaned: {
|
|
157
|
+
session: cleanedSession,
|
|
158
|
+
output: cleanedOutput,
|
|
159
|
+
chrome: cleanedChrome,
|
|
160
|
+
daemons: cleanedDaemons,
|
|
161
|
+
},
|
|
147
162
|
message: sessionDirectoryCleanMessage(),
|
|
148
163
|
...(warnings.length > 0 && { warnings }),
|
|
149
164
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAKzB,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accessibility tree inspection commands for semantic element queries.
|
|
3
|
+
*
|
|
4
|
+
* Provides three core commands:
|
|
5
|
+
* - tree: Dump full accessibility tree
|
|
6
|
+
* - query: Search by role/name/description patterns
|
|
7
|
+
* - describe: Get A11y properties for CSS selector
|
|
8
|
+
*
|
|
9
|
+
* Uses IPC/callCDP pattern for consistency with other DOM commands.
|
|
10
|
+
*/
|
|
11
|
+
import type { Command } from 'commander';
|
|
12
|
+
/**
|
|
13
|
+
* Register accessibility commands under 'bdg dom a11y'
|
|
14
|
+
*
|
|
15
|
+
* @param domCmd - Parent DOM command
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerA11yCommands(domCmd: Command): void;
|
|
18
|
+
//# sourceMappingURL=a11y.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/a11y.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiJzC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAiC1D"}
|