gravity-core 1.0.1

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.
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Layout diagnostics engine
3
+ * Analyzes layout issues and generates diagnostic reports
4
+ */
5
+ export class DiagnosticsEngine {
6
+ constructor(connection) {
7
+ this.connection = connection;
8
+ }
9
+ /**
10
+ * Diagnose layout issues for an element
11
+ */
12
+ async diagnose(selector) {
13
+ // Validate selector
14
+ const validation = this.validateSelector(selector);
15
+ if (!validation.valid) {
16
+ throw new Error(`Invalid selector: ${validation.error}`);
17
+ }
18
+ // Get document root
19
+ const doc = await this.connection.sendCommand('DOM.getDocument', { depth: -1 });
20
+ const root = doc.root;
21
+ // Query for element
22
+ const queryResult = await this.connection.sendCommand('DOM.querySelector', {
23
+ nodeId: root.nodeId,
24
+ selector,
25
+ });
26
+ if (!queryResult.nodeId) {
27
+ throw new Error(`Element not found: ${selector}`);
28
+ }
29
+ const nodeId = queryResult.nodeId;
30
+ // Get box model
31
+ const boxResult = await this.connection.sendCommand('DOM.getBoxModel', { nodeId });
32
+ const model = boxResult.model;
33
+ // Get viewport metrics
34
+ const layoutMetrics = await this.connection.sendCommand('Page.getLayoutMetrics', {});
35
+ const viewport = layoutMetrics.layoutViewport;
36
+ // Get computed styles
37
+ const styleResult = await this.connection.sendCommand('CSS.getComputedStyleForNode', { nodeId });
38
+ const styleMap = new Map(styleResult.computedStyle.map((prop) => [prop.name, prop.value]));
39
+ // Extract bounds
40
+ const bounds = this.extractBounds(model);
41
+ // Run diagnostic checks
42
+ const issues = [];
43
+ issues.push(...this.checkVisibility(styleMap));
44
+ issues.push(...this.checkOffscreen(bounds, viewport));
45
+ issues.push(...this.checkModalIssues(styleMap, bounds, viewport));
46
+ issues.push(...this.checkOverflow(styleMap));
47
+ // Sort by severity
48
+ const severityOrder = { high: 0, medium: 1, low: 2 };
49
+ issues.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
50
+ // Build result
51
+ const result = {
52
+ element: selector,
53
+ timestamp: new Date().toISOString(),
54
+ found: true,
55
+ position: {
56
+ left: bounds.left,
57
+ top: bounds.top,
58
+ right: bounds.right,
59
+ bottom: bounds.bottom,
60
+ width: bounds.width,
61
+ height: bounds.height,
62
+ },
63
+ viewport: {
64
+ width: viewport.clientWidth,
65
+ height: viewport.clientHeight,
66
+ },
67
+ computedStyles: {
68
+ display: styleMap.get('display') ?? '',
69
+ position: styleMap.get('position') ?? '',
70
+ width: styleMap.get('width') ?? '',
71
+ height: styleMap.get('height') ?? '',
72
+ overflow: styleMap.get('overflow') ?? '',
73
+ zIndex: styleMap.get('z-index') ?? '',
74
+ visibility: styleMap.get('visibility') ?? '',
75
+ opacity: styleMap.get('opacity') ?? '',
76
+ },
77
+ issues: issues.length > 0 ? issues : [
78
+ {
79
+ type: 'none',
80
+ severity: 'low',
81
+ message: 'No layout issues detected',
82
+ suggestion: 'Element appears to be positioned correctly',
83
+ },
84
+ ],
85
+ confidence: issues.length > 0 ? 0.95 : 0.85,
86
+ summary: {
87
+ totalIssues: issues.length,
88
+ highSeverity: issues.filter(i => i.severity === 'high').length,
89
+ mediumSeverity: issues.filter(i => i.severity === 'medium').length,
90
+ lowSeverity: issues.filter(i => i.severity === 'low').length,
91
+ },
92
+ };
93
+ return result;
94
+ }
95
+ /**
96
+ * Validate CSS selector
97
+ */
98
+ validateSelector(selector) {
99
+ if (!selector || typeof selector !== 'string') {
100
+ return { valid: false, error: 'Selector must be a non-empty string' };
101
+ }
102
+ const trimmed = selector.trim();
103
+ if (trimmed.length === 0) {
104
+ return { valid: false, error: 'Selector cannot be empty' };
105
+ }
106
+ if (/^[0-9]/.test(trimmed)) {
107
+ return { valid: false, error: 'Selector cannot start with a number' };
108
+ }
109
+ const openBrackets = (trimmed.match(/\[/g) || []).length;
110
+ const closeBrackets = (trimmed.match(/\]/g) || []).length;
111
+ if (openBrackets !== closeBrackets) {
112
+ return { valid: false, error: 'Unbalanced brackets' };
113
+ }
114
+ return { valid: true };
115
+ }
116
+ /**
117
+ * Extract element bounds from box model
118
+ */
119
+ extractBounds(boxModel) {
120
+ const left = Math.min(boxModel.content[0], boxModel.content[6]);
121
+ const top = Math.min(boxModel.content[1], boxModel.content[3]);
122
+ const right = Math.max(boxModel.content[2], boxModel.content[4]);
123
+ const bottom = Math.max(boxModel.content[5], boxModel.content[7]);
124
+ return {
125
+ left: Math.round(left),
126
+ top: Math.round(top),
127
+ right: Math.round(right),
128
+ bottom: Math.round(bottom),
129
+ width: Math.round(boxModel.width),
130
+ height: Math.round(boxModel.height),
131
+ };
132
+ }
133
+ /**
134
+ * Check visibility issues
135
+ */
136
+ checkVisibility(styleMap) {
137
+ const issues = [];
138
+ const display = styleMap.get('display');
139
+ if (display === 'none') {
140
+ issues.push({
141
+ type: 'hidden-display',
142
+ severity: 'high',
143
+ message: 'Element has display: none',
144
+ suggestion: 'Change to display: block/flex/grid to make visible',
145
+ });
146
+ }
147
+ const visibility = styleMap.get('visibility');
148
+ if (visibility === 'hidden') {
149
+ issues.push({
150
+ type: 'hidden-visibility',
151
+ severity: 'high',
152
+ message: 'Element has visibility: hidden',
153
+ suggestion: 'Change to visibility: visible',
154
+ });
155
+ }
156
+ const opacity = styleMap.get('opacity');
157
+ if (opacity !== undefined) {
158
+ const opacityValue = parseFloat(opacity);
159
+ if (opacityValue === 0) {
160
+ issues.push({
161
+ type: 'hidden-opacity',
162
+ severity: 'high',
163
+ message: 'Element has opacity: 0',
164
+ suggestion: 'Change to opacity: 1',
165
+ });
166
+ }
167
+ else if (opacityValue < 0.1) {
168
+ issues.push({
169
+ type: 'low-opacity',
170
+ severity: 'medium',
171
+ message: `Element has very low opacity: ${opacity}`,
172
+ suggestion: 'Increase opacity for better visibility',
173
+ });
174
+ }
175
+ }
176
+ return issues;
177
+ }
178
+ /**
179
+ * Check offscreen issues
180
+ */
181
+ checkOffscreen(bounds, viewport) {
182
+ const issues = [];
183
+ const THRESHOLD = 2;
184
+ if (bounds.right > viewport.clientWidth + THRESHOLD) {
185
+ const overflow = bounds.right - viewport.clientWidth;
186
+ issues.push({
187
+ type: 'offscreen-right',
188
+ severity: 'high',
189
+ message: `Element extends ${overflow}px beyond right edge`,
190
+ suggestion: 'Add max-width: 100% or use overflow: hidden on parent',
191
+ pixels: overflow,
192
+ });
193
+ }
194
+ if (bounds.bottom > viewport.clientHeight + THRESHOLD) {
195
+ const overflow = bounds.bottom - viewport.clientHeight;
196
+ issues.push({
197
+ type: 'offscreen-bottom',
198
+ severity: 'medium',
199
+ message: `Element extends ${overflow}px beyond bottom edge`,
200
+ suggestion: 'Add max-height: 100vh or enable scrolling',
201
+ pixels: overflow,
202
+ });
203
+ }
204
+ if (bounds.left < -THRESHOLD) {
205
+ const overflow = Math.abs(bounds.left);
206
+ issues.push({
207
+ type: 'offscreen-left',
208
+ severity: 'high',
209
+ message: `Element starts ${overflow}px to the left`,
210
+ suggestion: 'Check left/margin-left values',
211
+ pixels: overflow,
212
+ });
213
+ }
214
+ if (bounds.top < -THRESHOLD) {
215
+ const overflow = Math.abs(bounds.top);
216
+ issues.push({
217
+ type: 'offscreen-top',
218
+ severity: 'high',
219
+ message: `Element starts ${overflow}px above viewport`,
220
+ suggestion: 'Check top/margin-top values',
221
+ pixels: overflow,
222
+ });
223
+ }
224
+ return issues;
225
+ }
226
+ /**
227
+ * Check modal/positioning issues
228
+ */
229
+ checkModalIssues(styleMap, bounds, viewport) {
230
+ const issues = [];
231
+ const position = styleMap.get('position');
232
+ const zIndex = styleMap.get('z-index');
233
+ if (position === 'fixed' || position === 'absolute') {
234
+ if (zIndex === 'auto' || !zIndex) {
235
+ issues.push({
236
+ type: 'modal-no-zindex',
237
+ severity: 'medium',
238
+ message: `Positioned element (${position}) has no z-index`,
239
+ suggestion: 'Add z-index: 1000 or higher for modals',
240
+ });
241
+ }
242
+ }
243
+ return issues;
244
+ }
245
+ /**
246
+ * Check overflow issues
247
+ */
248
+ checkOverflow(styleMap) {
249
+ const issues = [];
250
+ const overflow = styleMap.get('overflow');
251
+ if (overflow === 'hidden') {
252
+ issues.push({
253
+ type: 'overflow-hidden',
254
+ severity: 'low',
255
+ message: 'Element has overflow: hidden',
256
+ suggestion: 'Content may be clipped; change to overflow: auto if needed',
257
+ });
258
+ }
259
+ return issues;
260
+ }
261
+ }
262
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * gravity-core
3
+ *
4
+ * Universal Gravity - Connect any IDE or AI assistant to browser DevTools
5
+ * for real-time layout diagnostics and element inspection.
6
+ *
7
+ * No manual setup needed! Just:
8
+ * 1. npm install gravity-core
9
+ * 2. Load extension in Chrome (chrome://extensions)
10
+ * 3. Add MCP config to your IDE
11
+ * 4. Ask your AI to diagnose elements!
12
+ *
13
+ * Usage:
14
+ * ```typescript
15
+ * import { Gravity } from 'gravity-core';
16
+ *
17
+ * const bridge = new Gravity();
18
+ * await bridge.connectBrowser();
19
+ * const result = await bridge.diagnoseLayout('#modal');
20
+ * console.log(result);
21
+ * ```
22
+ */
23
+ export { Gravity } from './bridge.js';
24
+ export { BrowserConnection } from './browser-connection.js';
25
+ export { DiagnosticsEngine } from './diagnostics.js';
26
+ export * from './types.js';
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * gravity-core
3
+ *
4
+ * Universal Gravity - Connect any IDE or AI assistant to browser DevTools
5
+ * for real-time layout diagnostics and element inspection.
6
+ *
7
+ * No manual setup needed! Just:
8
+ * 1. npm install gravity-core
9
+ * 2. Load extension in Chrome (chrome://extensions)
10
+ * 3. Add MCP config to your IDE
11
+ * 4. Ask your AI to diagnose elements!
12
+ *
13
+ * Usage:
14
+ * ```typescript
15
+ * import { Gravity } from 'gravity-core';
16
+ *
17
+ * const bridge = new Gravity();
18
+ * await bridge.connectBrowser();
19
+ * const result = await bridge.diagnoseLayout('#modal');
20
+ * console.log(result);
21
+ * ```
22
+ */
23
+ export { Gravity } from './bridge.js';
24
+ export { BrowserConnection } from './browser-connection.js';
25
+ export { DiagnosticsEngine } from './diagnostics.js';
26
+ export * from './types.js';
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,cAAc,YAAY,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Core type definitions for Gravity
3
+ */
4
+ export interface DiagnosticResult {
5
+ element: string;
6
+ timestamp: string;
7
+ found: boolean;
8
+ position: ElementPosition;
9
+ viewport: ViewportInfo;
10
+ computedStyles: ComputedStyles;
11
+ issues: LayoutIssue[];
12
+ confidence: number;
13
+ summary: IssueSummary;
14
+ }
15
+ export interface ElementPosition {
16
+ left: number;
17
+ top: number;
18
+ right: number;
19
+ bottom: number;
20
+ width: number;
21
+ height: number;
22
+ }
23
+ export interface ViewportInfo {
24
+ width: number;
25
+ height: number;
26
+ }
27
+ export interface ComputedStyles {
28
+ display: string;
29
+ position: string;
30
+ width: string;
31
+ height: string;
32
+ overflow: string;
33
+ zIndex: string;
34
+ visibility: string;
35
+ opacity: string;
36
+ [key: string]: string;
37
+ }
38
+ export interface LayoutIssue {
39
+ type: string;
40
+ severity: 'high' | 'medium' | 'low';
41
+ message: string;
42
+ suggestion: string;
43
+ pixels?: number;
44
+ }
45
+ export interface IssueSummary {
46
+ totalIssues: number;
47
+ highSeverity: number;
48
+ mediumSeverity: number;
49
+ lowSeverity: number;
50
+ }
51
+ export interface ElementInfo {
52
+ selector: string;
53
+ tagName: string;
54
+ classes: string[];
55
+ id?: string;
56
+ position: ElementPosition;
57
+ styles: ComputedStyles;
58
+ }
59
+ export interface ConnectionStatus {
60
+ connected: boolean;
61
+ message: string;
62
+ timestamp: string;
63
+ }
64
+ export interface BridgeOptions {
65
+ port?: number;
66
+ timeout?: number;
67
+ autoReconnect?: boolean;
68
+ }
69
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,YAAY,CAAC;IACvB,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Core type definitions for Gravity
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "gravity-core",
3
+ "version": "1.0.1",
4
+ "description": "Gravity - AI-powered CSS layout diagnostics for any IDE. Connect your browser to get real-time layout issue detection.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "gravity": "dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE",
15
+ "SETUP.md"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "test": "node --test dist/**/*.test.js",
21
+ "prepublishOnly": "npm run build"
22
+ },
23
+ "keywords": [
24
+ "devtools",
25
+ "browser",
26
+ "debugging",
27
+ "layout",
28
+ "diagnostics",
29
+ "ai",
30
+ "mcp",
31
+ "css",
32
+ "vscode",
33
+ "cursor",
34
+ "ide"
35
+ ],
36
+ "author": "Gravity Contributors",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/DharuNamikaze/Gravity-Package.git"
41
+ },
42
+ "engines": {
43
+ "node": ">=16.0.0"
44
+ },
45
+ "dependencies": {
46
+ "ws": "^8.18.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^22.10.5",
50
+ "@types/ws": "^8.5.13",
51
+ "typescript": "^5.7.3"
52
+ }
53
+ }