@petukhovart/agent-view 0.13.1 → 0.14.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.
Files changed (52) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +21 -21
  3. package/LICENSE +21 -21
  4. package/README.md +51 -0
  5. package/dist/cdp/transport.d.ts.map +1 -1
  6. package/dist/cdp/transport.js +139 -15
  7. package/dist/cdp/transport.js.map +1 -1
  8. package/dist/cdp/types.d.ts +51 -0
  9. package/dist/cdp/types.d.ts.map +1 -1
  10. package/dist/cdp/types.js.map +1 -1
  11. package/dist/cli/commands/click.d.ts +1 -0
  12. package/dist/cli/commands/click.d.ts.map +1 -1
  13. package/dist/cli/commands/click.js +2 -0
  14. package/dist/cli/commands/click.js.map +1 -1
  15. package/dist/cli/commands/coverage.d.ts +14 -0
  16. package/dist/cli/commands/coverage.d.ts.map +1 -0
  17. package/dist/cli/commands/coverage.js +34 -0
  18. package/dist/cli/commands/coverage.js.map +1 -0
  19. package/dist/cli/commands/listeners.d.ts +11 -0
  20. package/dist/cli/commands/listeners.d.ts.map +1 -0
  21. package/dist/cli/commands/listeners.js +34 -0
  22. package/dist/cli/commands/listeners.js.map +1 -0
  23. package/dist/cli/index.js +30 -0
  24. package/dist/cli/index.js.map +1 -1
  25. package/dist/inspectors/coverage/index.d.ts +17 -0
  26. package/dist/inspectors/coverage/index.d.ts.map +1 -0
  27. package/dist/inspectors/coverage/index.js +65 -0
  28. package/dist/inspectors/coverage/index.js.map +1 -0
  29. package/dist/inspectors/listeners/index.d.ts +4 -0
  30. package/dist/inspectors/listeners/index.d.ts.map +1 -0
  31. package/dist/inspectors/listeners/index.js +30 -0
  32. package/dist/inspectors/listeners/index.js.map +1 -0
  33. package/dist/server/server.d.ts +9 -0
  34. package/dist/server/server.d.ts.map +1 -1
  35. package/dist/server/server.js +70 -2
  36. package/dist/server/server.js.map +1 -1
  37. package/package.json +1 -1
  38. package/skills/verify/SKILL.md +157 -423
  39. package/skills/verify/references/commands.md +358 -0
  40. package/skills/verify/references/design-conformance.md +23 -0
  41. package/dist/cdp/console-stream.d.ts +0 -35
  42. package/dist/cdp/console-stream.d.ts.map +0 -1
  43. package/dist/cdp/console-stream.js +0 -103
  44. package/dist/cdp/console-stream.js.map +0 -1
  45. package/dist/inspectors/dom.d.ts +0 -17
  46. package/dist/inspectors/dom.d.ts.map +0 -1
  47. package/dist/inspectors/dom.js +0 -131
  48. package/dist/inspectors/dom.js.map +0 -1
  49. package/dist/inspectors/scene/pixi.d.ts +0 -3
  50. package/dist/inspectors/scene/pixi.d.ts.map +0 -1
  51. package/dist/inspectors/scene/pixi.js +0 -52
  52. package/dist/inspectors/scene/pixi.js.map +0 -1
@@ -1,131 +0,0 @@
1
- export function formatAccessibilityTree(nodes, options = {}) {
2
- const { filter, depth: maxDepth } = options;
3
- const refs = [];
4
- let nextRef = options.startRef ?? 1;
5
- const lines = [];
6
- const nodeMap = new Map();
7
- for (const node of nodes) {
8
- nodeMap.set(node.nodeId, node);
9
- }
10
- const rootNodeId = nodes[0]?.nodeId;
11
- if (!rootNodeId)
12
- return { text: '(empty)', refs: [], nextRef };
13
- const ALWAYS_SKIP_ROLES = new Set(['InlineTextBox']);
14
- const SKIP_WHEN_EMPTY_ROLES = new Set(['none', 'generic', 'StaticText']);
15
- // WAI-ARIA-like fallback: when a node has no accessible name,
16
- // walk its children to find the first non-empty name, description, or title.
17
- // This handles cases like v-list-item with title on a child v-icon.
18
- function resolveNameFromChildren(node, depthLimit = 5) {
19
- if (depthLimit <= 0 || !node.childIds)
20
- return '';
21
- for (const childId of node.childIds) {
22
- const child = nodeMap.get(childId);
23
- if (!child)
24
- continue;
25
- // Check child's own name
26
- if (child.name?.value)
27
- return child.name.value;
28
- // Check description/title in AX properties
29
- const desc = child.properties?.find(p => p.name === 'description');
30
- if (desc?.value?.value && typeof desc.value.value === 'string')
31
- return desc.value.value;
32
- // Recurse into grandchildren
33
- const deeper = resolveNameFromChildren(child, depthLimit - 1);
34
- if (deeper)
35
- return deeper;
36
- }
37
- return '';
38
- }
39
- // Collect all descendant text for heuristic filter matching.
40
- // Searches name and description of all descendants, not just current node.
41
- function getDescendantText(node, depthLimit = 10) {
42
- const parts = [];
43
- function collect(n, depth) {
44
- if (depth > depthLimit || !n.childIds)
45
- return;
46
- for (const childId of n.childIds) {
47
- const child = nodeMap.get(childId);
48
- if (!child)
49
- continue;
50
- if (child.name?.value)
51
- parts.push(child.name.value);
52
- const desc = child.properties?.find(p => p.name === 'description');
53
- if (desc?.value?.value && typeof desc.value.value === 'string')
54
- parts.push(desc.value.value);
55
- collect(child, depth + 1);
56
- }
57
- }
58
- collect(node, 0);
59
- return parts.join(' ').toLowerCase();
60
- }
61
- function hasMatchingDescendant(node, lowerFilter) {
62
- if (!node.childIds)
63
- return false;
64
- for (const childId of node.childIds) {
65
- const child = nodeMap.get(childId);
66
- if (!child)
67
- continue;
68
- const childRole = child.role?.value ?? '';
69
- if (ALWAYS_SKIP_ROLES.has(childRole))
70
- continue;
71
- const childName = child.name?.value?.toLowerCase() ?? '';
72
- if (childName.includes(lowerFilter) || childRole.toLowerCase().includes(lowerFilter))
73
- return true;
74
- if (hasMatchingDescendant(child, lowerFilter))
75
- return true;
76
- }
77
- return false;
78
- }
79
- const HARD_MAX_DEPTH = 100;
80
- function walk(nodeId, depth, indent) {
81
- if (indent > HARD_MAX_DEPTH)
82
- return;
83
- if (maxDepth !== undefined && indent > maxDepth)
84
- return;
85
- const node = nodeMap.get(nodeId);
86
- if (!node)
87
- return;
88
- const role = node.role?.value ?? '';
89
- const ownName = node.name?.value ?? '';
90
- // Fallback: resolve name from children when node has no accessible name
91
- const fallbackName = !ownName ? resolveNameFromChildren(node) : '';
92
- const name = ownName || fallbackName;
93
- if (ALWAYS_SKIP_ROLES.has(role))
94
- return;
95
- const skip = SKIP_WHEN_EMPTY_ROLES.has(role) && !name;
96
- if (!skip) {
97
- if (filter) {
98
- const lowerFilter = filter.toLowerCase();
99
- const matchesName = name.toLowerCase().includes(lowerFilter);
100
- const matchesRole = role.toLowerCase().includes(lowerFilter);
101
- // Heuristic: also search descendant names/descriptions
102
- const matchesDescendants = !matchesName && !matchesRole
103
- ? getDescendantText(node, 10).includes(lowerFilter)
104
- : false;
105
- if (!matchesName && !matchesRole && !matchesDescendants && !hasMatchingDescendant(node, lowerFilter)) {
106
- return;
107
- }
108
- }
109
- const ref = nextRef++;
110
- if (node.backendDOMNodeId) {
111
- refs.push({ ref, backendDOMNodeId: node.backendDOMNodeId });
112
- }
113
- const padding = ' '.repeat(indent);
114
- const isFallback = !ownName && fallbackName;
115
- const nameStr = name ? ` "${name}"${isFallback ? ' [fallback]' : ''}` : '';
116
- lines.push(`${padding}${role}${nameStr} [ref=${ref}]`);
117
- }
118
- if (node.childIds) {
119
- for (const childId of node.childIds) {
120
- walk(childId, depth + 1, skip ? indent : indent + 1);
121
- }
122
- }
123
- }
124
- walk(rootNodeId, 0, 0);
125
- return {
126
- text: lines.join('\n') || '(no matching elements)',
127
- refs,
128
- nextRef,
129
- };
130
- }
131
- //# sourceMappingURL=dom.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/inspectors/dom.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { SceneExtractor } from './types.js';
2
- export declare const pixiExtractor: SceneExtractor;
3
- //# sourceMappingURL=pixi.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pixi.d.ts","sourceRoot":"","sources":["../../../src/inspectors/scene/pixi.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,YAAY,CAAA;AA8C3D,eAAO,MAAM,aAAa,EAAE,cAM3B,CAAA"}
@@ -1,52 +0,0 @@
1
- import { WebGLEngine } from '../../types.js';
2
- // Depth limit is also enforced in JS to guard against stack overflow
3
- // in the target process for pathologically deep trees
4
- const EXTRACT_JS = `
5
- (function() {
6
- const devtools = window.__PIXI_DEVTOOLS__;
7
- if (!devtools) return null;
8
- const app = devtools.app || devtools.stage?.parent;
9
- if (!app) return null;
10
- const stage = app.stage || devtools.stage;
11
- if (!stage) return null;
12
-
13
- function serialize(node, depth) {
14
- if (depth > 100) return null;
15
- const result = {
16
- type: node.constructor?.name || 'Unknown',
17
- name: node.label || node.name || '',
18
- x: Math.round(node.x || 0),
19
- y: Math.round(node.y || 0),
20
- visible: node.visible !== false,
21
- tint: typeof node.tint === 'number' ? '#' + node.tint.toString(16).padStart(6, '0') : '0xffffff',
22
- alpha: node.alpha ?? 1,
23
- scaleX: node.scale?.x ?? 1,
24
- scaleY: node.scale?.y ?? 1,
25
- rotation: Math.round((node.rotation || 0) * 180 / Math.PI * 100) / 100,
26
- width: Math.round(node.width || 0),
27
- height: Math.round(node.height || 0),
28
- };
29
- const kids = node.children || [];
30
- if (kids.length > 0) {
31
- result.children = kids.map(c => serialize(c, depth + 1)).filter(Boolean);
32
- }
33
- return result;
34
- }
35
-
36
- return serialize(stage, 0);
37
- })()
38
- `;
39
- function isSceneNode(val) {
40
- if (!val || typeof val !== 'object')
41
- return false;
42
- const n = val;
43
- return typeof n.type === 'string' && typeof n.name === 'string';
44
- }
45
- export const pixiExtractor = {
46
- engine: WebGLEngine.Pixi,
47
- async extract(conn) {
48
- const result = await conn.evaluate(EXTRACT_JS);
49
- return isSceneNode(result) ? result : null;
50
- },
51
- };
52
- //# sourceMappingURL=pixi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pixi.js","sourceRoot":"","sources":["../../../src/inspectors/scene/pixi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAI5C,qEAAqE;AACrE,sDAAsD;AACtD,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkClB,CAAA;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACjD,MAAM,CAAC,GAAG,GAA8B,CAAA;IACxC,OAAO,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAA;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,MAAM,EAAE,WAAW,CAAC,IAAI;IACxB,KAAK,CAAC,OAAO,CAAC,IAAoB;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QAC9C,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;IAC5C,CAAC;CACF,CAAA"}