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.
- package/LICENSE +21 -0
- package/README.md +281 -0
- package/SETUP.md +458 -0
- package/dist/bridge.d.ts +44 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +86 -0
- package/dist/bridge.js.map +1 -0
- package/dist/browser-connection.d.ts +48 -0
- package/dist/browser-connection.d.ts.map +1 -0
- package/dist/browser-connection.js +184 -0
- package/dist/browser-connection.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +231 -0
- package/dist/cli.js.map +1 -0
- package/dist/diagnostics.d.ts +39 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +262 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
|
@@ -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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"}
|
package/dist/index.d.ts
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.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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|