cursorflow 2.1.2__py3-none-any.whl → 2.1.4__py3-none-any.whl
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.
- cursorflow/__init__.py +1 -1
- cursorflow/core/browser_controller.py +15 -5
- cursorflow/install_cursorflow_rules.py +4 -4
- cursorflow/log_sources/local_file.py +12 -2
- cursorflow/log_sources/ssh_remote.py +5 -1
- cursorflow/rules/cursorflow-installation.mdc +2 -2
- cursorflow/rules/cursorflow-usage.mdc +71 -3
- {cursorflow-2.1.2.dist-info → cursorflow-2.1.4.dist-info}/METADATA +1 -1
- {cursorflow-2.1.2.dist-info → cursorflow-2.1.4.dist-info}/RECORD +13 -13
- {cursorflow-2.1.2.dist-info → cursorflow-2.1.4.dist-info}/WHEEL +0 -0
- {cursorflow-2.1.2.dist-info → cursorflow-2.1.4.dist-info}/entry_points.txt +0 -0
- {cursorflow-2.1.2.dist-info → cursorflow-2.1.4.dist-info}/licenses/LICENSE +0 -0
- {cursorflow-2.1.2.dist-info → cursorflow-2.1.4.dist-info}/top_level.txt +0 -0
cursorflow/__init__.py
CHANGED
@@ -419,11 +419,21 @@ class BrowserController:
|
|
419
419
|
"""
|
420
420
|
try:
|
421
421
|
# Process options with defaults
|
422
|
-
|
423
|
-
full_page =
|
424
|
-
clip_config =
|
425
|
-
mask_selectors =
|
426
|
-
quality =
|
422
|
+
raw_options = options or {}
|
423
|
+
full_page = raw_options.get("full_page", False)
|
424
|
+
clip_config = raw_options.get("clip")
|
425
|
+
mask_selectors = raw_options.get("mask", [])
|
426
|
+
quality = raw_options.get("quality", 80)
|
427
|
+
|
428
|
+
# Build actual screenshot options used (for metadata)
|
429
|
+
screenshot_options = {
|
430
|
+
"full_page": full_page,
|
431
|
+
"quality": quality
|
432
|
+
}
|
433
|
+
if clip_config:
|
434
|
+
screenshot_options["clip"] = clip_config
|
435
|
+
if mask_selectors:
|
436
|
+
screenshot_options["mask"] = mask_selectors
|
427
437
|
|
428
438
|
timestamp = int(time.time())
|
429
439
|
screenshot_filename = f".cursorflow/artifacts/screenshots/{name}_{timestamp}.png"
|
@@ -125,9 +125,9 @@ def create_config_template(project_path: Path, force: bool = False):
|
|
125
125
|
# Get current version
|
126
126
|
try:
|
127
127
|
import cursorflow
|
128
|
-
current_version = getattr(cursorflow, '__version__', '2.1.
|
128
|
+
current_version = getattr(cursorflow, '__version__', '2.1.4')
|
129
129
|
except ImportError:
|
130
|
-
current_version = '2.1.
|
130
|
+
current_version = '2.1.4'
|
131
131
|
|
132
132
|
if config_path.exists():
|
133
133
|
if not force:
|
@@ -302,9 +302,9 @@ def setup_update_checking(project_path: Path):
|
|
302
302
|
# Create initial version tracking
|
303
303
|
try:
|
304
304
|
import cursorflow
|
305
|
-
current_version = getattr(cursorflow, '__version__', '2.1.
|
305
|
+
current_version = getattr(cursorflow, '__version__', '2.1.4')
|
306
306
|
except ImportError:
|
307
|
-
current_version = '2.1.
|
307
|
+
current_version = '2.1.4'
|
308
308
|
|
309
309
|
version_info = {
|
310
310
|
"installed_version": current_version,
|
@@ -30,11 +30,17 @@ class LocalFileLogSource:
|
|
30
30
|
'next_server': '.next/trace.log'
|
31
31
|
}
|
32
32
|
"""
|
33
|
-
|
33
|
+
# Handle case where log_paths is a string instead of dict
|
34
|
+
if isinstance(log_paths, str):
|
35
|
+
self.log_paths = {"default": log_paths}
|
36
|
+
elif isinstance(log_paths, list):
|
37
|
+
self.log_paths = {f"log_{i}": path for i, path in enumerate(log_paths)}
|
38
|
+
else:
|
39
|
+
self.log_paths = log_paths
|
34
40
|
self.log_queue = queue.Queue()
|
35
41
|
self.tail_processes = {}
|
36
42
|
self.monitoring = False
|
37
|
-
|
43
|
+
# Note: connect() method implemented below for compatibility
|
38
44
|
|
39
45
|
import logging
|
40
46
|
self.logger = logging.getLogger(__name__)
|
@@ -158,6 +164,10 @@ class LocalFileLogSource:
|
|
158
164
|
|
159
165
|
return logs
|
160
166
|
|
167
|
+
async def connect(self):
|
168
|
+
"""Connect to log sources - compatibility method for log_collector"""
|
169
|
+
return await self.start_monitoring()
|
170
|
+
|
161
171
|
def get_recent_logs(self, seconds: int = 10) -> List[Dict]:
|
162
172
|
"""Get logs from the last N seconds"""
|
163
173
|
from datetime import timedelta
|
@@ -43,7 +43,7 @@ class SSHRemoteLogSource:
|
|
43
43
|
self.ssh_client = None
|
44
44
|
self.monitoring_threads = []
|
45
45
|
self.monitoring = False
|
46
|
-
|
46
|
+
# Note: connect() method implemented below for compatibility
|
47
47
|
|
48
48
|
self.logger = logging.getLogger(__name__)
|
49
49
|
|
@@ -161,6 +161,10 @@ class SSHRemoteLogSource:
|
|
161
161
|
|
162
162
|
return logs
|
163
163
|
|
164
|
+
async def connect(self):
|
165
|
+
"""Connect to SSH log sources - compatibility method for log_collector"""
|
166
|
+
return await self.start_monitoring()
|
167
|
+
|
164
168
|
def get_recent_logs(self, seconds: int = 10) -> List[Dict]:
|
165
169
|
"""Get logs from the last N seconds without stopping monitoring"""
|
166
170
|
|
@@ -3,9 +3,9 @@ title: CursorFlow 2.0.0 Installation & Setup Guide for Cursor
|
|
3
3
|
description: How to install and configure CursorFlow 2.0.0 for complete page intelligence in AI-driven development
|
4
4
|
---
|
5
5
|
|
6
|
-
# CursorFlow 2.
|
6
|
+
# CursorFlow 2.1.4 Installation & Setup Guide for Cursor
|
7
7
|
|
8
|
-
## 🚀 **When to Install CursorFlow 2.
|
8
|
+
## 🚀 **When to Install CursorFlow 2.1.4**
|
9
9
|
|
10
10
|
### **Automatically Install When:**
|
11
11
|
- User mentions UI testing, visual debugging, or layout issues
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# CursorFlow Usage Rules for Cursor AI
|
2
2
|
|
3
|
-
## 🔥 **CursorFlow 2.
|
3
|
+
## 🔥 **CursorFlow 2.1.4: Complete Page Intelligence for AI-Driven Development**
|
4
4
|
|
5
5
|
**CursorFlow provides comprehensive data collection for rapid UI iteration:**
|
6
6
|
|
@@ -9,6 +9,8 @@
|
|
9
9
|
- 📊 **Comprehensive Page Analysis** - Fonts, animations, resources, storage state
|
10
10
|
- 🎯 **Enhanced Error Context Collection** - Smart screenshot deduplication
|
11
11
|
- ⚡ **Enhanced Browser Data Capture** - Playwright traces + network interception
|
12
|
+
- 📱 **Parallel Viewport Testing** - Mobile, tablet, desktop responsive testing
|
13
|
+
- 🖼️ **Enhanced Screenshot Options** - Clipping, masking, quality control
|
12
14
|
|
13
15
|
## When to Use CursorFlow
|
14
16
|
|
@@ -217,7 +219,7 @@ print(f"Performance metrics: {screenshot_data['performance_data']}")
|
|
217
219
|
# Playwright trace available at: .cursorflow/artifacts/traces/session.zip
|
218
220
|
```
|
219
221
|
|
220
|
-
## 🚀 **CursorFlow CLI Usage (v2.
|
222
|
+
## 🚀 **CursorFlow CLI Usage (v2.1.4)**
|
221
223
|
|
222
224
|
### **Basic Testing:**
|
223
225
|
```bash
|
@@ -233,12 +235,33 @@ cursorflow test \
|
|
233
235
|
{"screenshot": "state"}
|
234
236
|
]'
|
235
237
|
|
238
|
+
# 🆕 Parallel responsive testing (mobile, tablet, desktop)
|
239
|
+
cursorflow test --base-url http://localhost:3000 --path "/dashboard" --responsive
|
240
|
+
|
241
|
+
# 🆕 Enhanced screenshot options
|
242
|
+
cursorflow test \
|
243
|
+
--base-url http://localhost:3000 \
|
244
|
+
--actions '[
|
245
|
+
{"navigate": "/page"},
|
246
|
+
{"screenshot": {
|
247
|
+
"name": "clipped-header",
|
248
|
+
"options": {
|
249
|
+
"clip": {"selector": "#header"},
|
250
|
+
"mask": [".user-email", ".sensitive-data"],
|
251
|
+
"full_page": false,
|
252
|
+
"quality": 90
|
253
|
+
}
|
254
|
+
}}
|
255
|
+
]'
|
256
|
+
|
236
257
|
# Results include:
|
237
258
|
# - Hot Reload Intelligence status
|
238
259
|
# - Advanced Element Intelligence (7 selector types)
|
239
260
|
# - Comprehensive Page Analysis (fonts, animations, resources)
|
240
261
|
# - Enhanced Error Context (smart deduplication)
|
241
262
|
# - Enhanced Browser Data (Playwright traces)
|
263
|
+
# - 🆕 Parallel Viewport Analysis (responsive testing)
|
264
|
+
# - 🆕 Enhanced Screenshot Metadata (options used)
|
242
265
|
```
|
243
266
|
|
244
267
|
### **Available CLI Commands:**
|
@@ -260,7 +283,10 @@ cursorflow --help # Show all commands and options
|
|
260
283
|
| `fill` | `{"fill": {"selector": "#input", "value": "text"}}` | Fill form field |
|
261
284
|
| `wait` | `{"wait": 2}` | Wait seconds |
|
262
285
|
| `wait_for` | `{"wait_for": "#element"}` | Wait for element |
|
263
|
-
| `screenshot` | `{"screenshot": "name"}` | Take screenshot |
|
286
|
+
| `screenshot` | `{"screenshot": "name"}` | Take basic screenshot |
|
287
|
+
| 🆕 `screenshot` | `{"screenshot": {"name": "test", "options": {"clip": {"selector": "#header"}}}}` | Enhanced screenshot with clipping |
|
288
|
+
| 🆕 `screenshot` | `{"screenshot": {"name": "test", "options": {"mask": [".sensitive"]}}}` | Screenshot with masked elements |
|
289
|
+
| 🆕 `screenshot` | `{"screenshot": {"name": "test.jpg", "options": {"quality": 90}}}` | JPEG screenshot with quality |
|
264
290
|
|
265
291
|
## Common Usage Patterns
|
266
292
|
|
@@ -279,6 +305,48 @@ cursorflow test \
|
|
279
305
|
]'
|
280
306
|
```
|
281
307
|
|
308
|
+
### 🆕 Responsive Testing (Parallel Viewports)
|
309
|
+
```bash
|
310
|
+
# Simple responsive test across mobile, tablet, desktop
|
311
|
+
cursorflow test --base-url http://localhost:3000 --path "/dashboard" --responsive
|
312
|
+
|
313
|
+
# Custom responsive test with actions
|
314
|
+
cursorflow test --base-url http://localhost:3000 --responsive --actions '[
|
315
|
+
{"navigate": "/dashboard"},
|
316
|
+
{"wait_for": "#main-content"},
|
317
|
+
{"screenshot": "responsive-dashboard"},
|
318
|
+
{"click": "#menu-toggle"},
|
319
|
+
{"screenshot": "responsive-menu"}
|
320
|
+
]'
|
321
|
+
|
322
|
+
# Results include:
|
323
|
+
# - Performance comparison across viewports
|
324
|
+
# - Layout differences analysis
|
325
|
+
# - Responsive behavior insights
|
326
|
+
# - Cross-viewport screenshots
|
327
|
+
```
|
328
|
+
|
329
|
+
### 🆕 Enhanced Screenshot Options
|
330
|
+
```bash
|
331
|
+
# Component-focused screenshots
|
332
|
+
cursorflow test --base-url http://localhost:3000 --actions '[
|
333
|
+
{"navigate": "/page"},
|
334
|
+
{"screenshot": {"name": "header", "options": {"clip": {"selector": "#header"}}}}
|
335
|
+
]'
|
336
|
+
|
337
|
+
# Privacy-aware screenshots (mask sensitive data)
|
338
|
+
cursorflow test --base-url http://localhost:3000 --actions '[
|
339
|
+
{"navigate": "/profile"},
|
340
|
+
{"screenshot": {"name": "profile", "options": {"mask": [".user-email", ".api-key"]}}}
|
341
|
+
]'
|
342
|
+
|
343
|
+
# High-quality JPEG screenshots
|
344
|
+
cursorflow test --base-url http://localhost:3000 --actions '[
|
345
|
+
{"navigate": "/page"},
|
346
|
+
{"screenshot": {"name": "page.jpg", "options": {"quality": 95, "full_page": true}}}
|
347
|
+
]'
|
348
|
+
```
|
349
|
+
|
282
350
|
### Login Flow Testing
|
283
351
|
```bash
|
284
352
|
cursorflow test \
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: cursorflow
|
3
|
-
Version: 2.1.
|
3
|
+
Version: 2.1.4
|
4
4
|
Summary: 🔥 Complete page intelligence for AI-driven development with Hot Reload Intelligence - captures DOM, network, console, performance, HMR events, and comprehensive page analysis
|
5
5
|
Author-email: GeekWarrior Development <rbush@cooltheory.com>
|
6
6
|
License-Expression: MIT
|
@@ -1,11 +1,11 @@
|
|
1
|
-
cursorflow/__init__.py,sha256=
|
1
|
+
cursorflow/__init__.py,sha256=3zdOAvMaLDe_OLKUbh-G9q0jXnprS-9CHxpRxKJPWy8,2763
|
2
2
|
cursorflow/auto_updater.py,sha256=oQ12TIMZ6Cm3HF-x9iRWFtvOLkRh-JWPqitS69-4roE,7851
|
3
3
|
cursorflow/cli.py,sha256=ca36aTHFLYpiaeQYoj3TB4o39CEfj3WWaePze8yNvdg,27280
|
4
|
-
cursorflow/install_cursorflow_rules.py,sha256=
|
4
|
+
cursorflow/install_cursorflow_rules.py,sha256=xIVw1DhqHL9YDT_JM7sXfVcMXIB0OuYZjC18jac-v8o,11792
|
5
5
|
cursorflow/updater.py,sha256=rAST7STjw-SgKxn_jsQJWOoyEMia-MQVxpKMwzPRnOA,19573
|
6
6
|
cursorflow/core/agent.py,sha256=f3lecgEzDRDdGTVccAtorpLGfNJJ49bbsQAmgr0vNGg,10136
|
7
7
|
cursorflow/core/auth_handler.py,sha256=oRafO6ZdxoHryBIvHsrNV8TECed4GXpJsdEiH0KdPPk,17149
|
8
|
-
cursorflow/core/browser_controller.py,sha256=
|
8
|
+
cursorflow/core/browser_controller.py,sha256=KZXSrXInju09Q--D_ULej4_hc5s7qv-7ODxW4WS0nHw,131708
|
9
9
|
cursorflow/core/browser_engine.py,sha256=RpGtMOjyE7WW2BiR1cKcNnXNuiUbKt5svFgn1k3zozo,14415
|
10
10
|
cursorflow/core/css_iterator.py,sha256=whLCIwbHZEWaH1HCbmqhNX5zrh_fL-r3hsxKjYsukcE,16478
|
11
11
|
cursorflow/core/cursor_integration.py,sha256=MAeHjXYeqzaXnhskqkTDB-n5ixIHqapGe93X0lLKhws,67501
|
@@ -21,14 +21,14 @@ cursorflow/core/mockup_comparator.py,sha256=VLfEEaTgbcY0oTb-bhBD2uTbXGjbnOV7LXNV
|
|
21
21
|
cursorflow/core/persistent_session.py,sha256=FsEHj4wKkycmdp6PFRHv3g333Y74yqra0x_qhUTQpik,36075
|
22
22
|
cursorflow/core/report_generator.py,sha256=-vosfyrnfVyWDbAIMlMurl90xOXqBae8d6aLd9sEqiY,10113
|
23
23
|
cursorflow/core/trace_manager.py,sha256=Jj9ultZrL1atiZXfcRVI6ynCnnfqZM-X0_taxt-llJ0,7189
|
24
|
-
cursorflow/log_sources/local_file.py,sha256=
|
25
|
-
cursorflow/log_sources/ssh_remote.py,sha256=
|
24
|
+
cursorflow/log_sources/local_file.py,sha256=YAzF6oZRusNT_EOJduoeMTgP6dc1Av9wK96yNxmhSGA,7558
|
25
|
+
cursorflow/log_sources/ssh_remote.py,sha256=xLLxm5B95kUcLqMC7-oZUA66e1rU5LLeeBiR6Mw5syc,7642
|
26
26
|
cursorflow/rules/__init__.py,sha256=gPcA-IkhXj03sl7cvZV0wwo7CtEkcyuKs4y0F5oQbqE,458
|
27
|
-
cursorflow/rules/cursorflow-installation.mdc,sha256=
|
28
|
-
cursorflow/rules/cursorflow-usage.mdc,sha256=
|
29
|
-
cursorflow-2.1.
|
30
|
-
cursorflow-2.1.
|
31
|
-
cursorflow-2.1.
|
32
|
-
cursorflow-2.1.
|
33
|
-
cursorflow-2.1.
|
34
|
-
cursorflow-2.1.
|
27
|
+
cursorflow/rules/cursorflow-installation.mdc,sha256=dLyQmKvER5J54EV5GAb-g4xNPMZP8pqecZpOlxf-tKA,9511
|
28
|
+
cursorflow/rules/cursorflow-usage.mdc,sha256=jD5IrIP2eKIeQN2TS-ehnwD1u_J6lWSXQZZ9KSUcOUU,21449
|
29
|
+
cursorflow-2.1.4.dist-info/licenses/LICENSE,sha256=e4QbjAsj3bW-xgQOvQelr8sGLYDoqc48k6cKgCr_pBU,1080
|
30
|
+
cursorflow-2.1.4.dist-info/METADATA,sha256=97woSQvbkl5nqSs2kOKwriTlwz1S41gp2u4dHOusFNU,12300
|
31
|
+
cursorflow-2.1.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
32
|
+
cursorflow-2.1.4.dist-info/entry_points.txt,sha256=-Ed_n4Uff7wClEtWS-Py6xmQabecB9f0QAOjX0w7ljA,51
|
33
|
+
cursorflow-2.1.4.dist-info/top_level.txt,sha256=t1UZwRyZP4u-ng2CEcNHmk_ZT4ibQxoihB2IjTF7ovc,11
|
34
|
+
cursorflow-2.1.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|