cursorflow 2.0.4__tar.gz → 2.1.1__tar.gz
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-2.0.4 → cursorflow-2.1.1}/MANIFEST.in +2 -0
- cursorflow-2.1.1/PKG-INFO +350 -0
- cursorflow-2.1.1/README.md +305 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/__init__.py +24 -17
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/cli.py +44 -13
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/browser_controller.py +119 -13
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/browser_engine.py +17 -4
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/cursorflow.py +259 -8
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/install_cursorflow_rules.py +4 -4
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow.egg-info/SOURCES.txt +2 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/docs/USER_MANUAL.md +229 -4
- cursorflow-2.1.1/examples/enhanced_screenshot_example.py +225 -0
- cursorflow-2.1.1/examples/responsive_testing_example.py +159 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/pyproject.toml +1 -1
- cursorflow-2.0.4/PKG-INFO +0 -293
- cursorflow-2.0.4/README.md +0 -248
- {cursorflow-2.0.4 → cursorflow-2.1.1}/LICENSE +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/auto_updater.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/agent.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/auth_handler.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/css_iterator.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/cursor_integration.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/error_context_collector.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/error_correlator.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/event_correlator.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/file_change_monitor.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/hmr_detector.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/log_collector.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/log_monitor.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/mockup_comparator.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/persistent_session.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/report_generator.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/core/trace_manager.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/log_sources/local_file.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/log_sources/ssh_remote.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/rules/__init__.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/rules/cursorflow-installation.mdc +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/rules/cursorflow-usage.mdc +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/cursorflow/updater.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/examples/comprehensive_screenshot_example.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/examples/mockup_comparison_example.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/examples/opensas_example.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/examples/react_example.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/examples/v2_comprehensive_demo.py +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/setup.cfg +0 -0
- {cursorflow-2.0.4 → cursorflow-2.1.1}/setup.py +0 -0
@@ -15,6 +15,8 @@ include examples/react_example.py
|
|
15
15
|
include examples/opensas_example.py
|
16
16
|
include examples/mockup_comparison_example.py
|
17
17
|
include examples/comprehensive_screenshot_example.py
|
18
|
+
include examples/enhanced_screenshot_example.py
|
19
|
+
include examples/responsive_testing_example.py
|
18
20
|
include examples/v2_comprehensive_demo.py
|
19
21
|
|
20
22
|
# INCLUDE: Single comprehensive user manual
|
@@ -0,0 +1,350 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: cursorflow
|
3
|
+
Version: 2.1.1
|
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
|
+
Author-email: GeekWarrior Development <rbush@cooltheory.com>
|
6
|
+
License-Expression: MIT
|
7
|
+
Project-URL: Homepage, https://github.com/haley-marketing-group/cursorflow
|
8
|
+
Project-URL: Documentation, https://cursorflow.readthedocs.io
|
9
|
+
Project-URL: Repository, https://github.com/haley-marketing-group/cursorflow
|
10
|
+
Keywords: ui-testing,automation,cursor,ai,web-testing,css-iteration,hot-reload,hmr,element-intelligence,page-analysis,error-context
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
12
|
+
Classifier: Intended Audience :: Developers
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
14
|
+
Classifier: Programming Language :: Python :: 3.8
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
19
|
+
Classifier: Topic :: Software Development :: Testing
|
20
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
21
|
+
Classifier: Framework :: AsyncIO
|
22
|
+
Requires-Python: >=3.8
|
23
|
+
Description-Content-Type: text/markdown
|
24
|
+
License-File: LICENSE
|
25
|
+
Requires-Dist: playwright>=1.40.0
|
26
|
+
Requires-Dist: paramiko>=3.3.1
|
27
|
+
Requires-Dist: pyyaml>=6.0.1
|
28
|
+
Requires-Dist: asyncio-mqtt>=0.11.1
|
29
|
+
Requires-Dist: click>=8.1.7
|
30
|
+
Requires-Dist: rich>=13.6.0
|
31
|
+
Requires-Dist: jinja2>=3.1.2
|
32
|
+
Requires-Dist: python-dateutil>=2.8.2
|
33
|
+
Requires-Dist: watchdog>=3.0.0
|
34
|
+
Requires-Dist: docker>=6.1.3
|
35
|
+
Requires-Dist: pillow>=10.0.0
|
36
|
+
Requires-Dist: numpy>=1.24.0
|
37
|
+
Requires-Dist: websockets>=11.0.0
|
38
|
+
Provides-Extra: dev
|
39
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
40
|
+
Requires-Dist: pytest-asyncio>=0.21.1; extra == "dev"
|
41
|
+
Requires-Dist: black>=23.9.1; extra == "dev"
|
42
|
+
Requires-Dist: flake8>=6.1.0; extra == "dev"
|
43
|
+
Requires-Dist: mypy>=1.6.1; extra == "dev"
|
44
|
+
Dynamic: license-file
|
45
|
+
|
46
|
+
# CursorFlow
|
47
|
+
|
48
|
+
**The measurement tool for web testing - we capture reality, not fiction**
|
49
|
+
|
50
|
+
CursorFlow is a pure data collection engine that captures comprehensive web application intelligence. Unlike simulation tools that let you control reality, CursorFlow measures actual reality - giving you complete trust in your test results.
|
51
|
+
|
52
|
+
## 🎯 The CursorFlow Philosophy
|
53
|
+
|
54
|
+
### **📊 We Collect Reality, Not Fiction**
|
55
|
+
|
56
|
+
**Other tools are simulation tools** - they let you control reality:
|
57
|
+
- Mock network responses
|
58
|
+
- Simulate user interactions
|
59
|
+
- Create test environments
|
60
|
+
|
61
|
+
**CursorFlow is a measurement tool** - we capture reality as-is:
|
62
|
+
- Real API response times
|
63
|
+
- Actual network failures
|
64
|
+
- Genuine browser behavior
|
65
|
+
- Complete page intelligence
|
66
|
+
|
67
|
+
### **🔬 Pure Observation Principle**
|
68
|
+
|
69
|
+
**CursorFlow is like a scientific instrument:**
|
70
|
+
- **Microscopes** don't create the cells they observe
|
71
|
+
- **Telescopes** don't generate the stars they capture
|
72
|
+
- **CursorFlow** doesn't mock the web it measures
|
73
|
+
|
74
|
+
When CursorFlow reports `"average_response_time": 416.58ms`, you can tell stakeholders: **"This is what actually happened"** - not "this is what happened in our test simulation."
|
75
|
+
|
76
|
+
### **🌟 The Trust Factor**
|
77
|
+
|
78
|
+
**Complete Reliability:** Every data point reflects real application behavior
|
79
|
+
- No mocked responses hiding slow APIs
|
80
|
+
- No simulated interactions missing real edge cases
|
81
|
+
- No test environments different from production
|
82
|
+
|
83
|
+
**Documentary vs Movie:** Both are valuable, but if you're trying to understand reality, you watch the documentary. CursorFlow is the documentary of web testing.
|
84
|
+
|
85
|
+
## 🚀 Complete Page Intelligence
|
86
|
+
|
87
|
+
Every screenshot captures everything your AI needs to make intelligent decisions:
|
88
|
+
|
89
|
+
### **📊 Comprehensive Data Collection**
|
90
|
+
- **DOM**: All elements with 7 selector strategies each
|
91
|
+
- **Network**: All requests, responses, and complete response bodies
|
92
|
+
- **Console**: All logs, errors, and smart error correlation
|
93
|
+
- **Performance**: Load times, memory usage, with reliability indicators
|
94
|
+
- **Visual**: Screenshots with pixel-perfect comparisons and enhanced options
|
95
|
+
- **Fonts**: Loading status, performance, and usage analysis
|
96
|
+
- **Animations**: Active animations and transitions tracking
|
97
|
+
- **Resources**: Complete resource loading analysis
|
98
|
+
- **Storage**: localStorage, sessionStorage, cookies, IndexedDB state
|
99
|
+
|
100
|
+
### **🔄 Hot Reload Intelligence**
|
101
|
+
- **Framework auto-detection** (Vite, Webpack, Next.js, Parcel, Laravel Mix)
|
102
|
+
- **Perfect timing** for CSS change detection
|
103
|
+
- **HMR event correlation** for understanding change impact
|
104
|
+
- **Persistent sessions** that survive code changes
|
105
|
+
|
106
|
+
### **🎯 Enhanced Screenshot Options**
|
107
|
+
```python
|
108
|
+
# Clip to specific components
|
109
|
+
{"screenshot": {"name": "header", "options": {"clip": {"selector": "#header"}}}}
|
110
|
+
|
111
|
+
# Hide sensitive information
|
112
|
+
{"screenshot": {"name": "profile", "options": {"mask": [".user-email", ".api-key"]}}}
|
113
|
+
|
114
|
+
# Full page with quality control
|
115
|
+
{"screenshot": {"name": "page", "options": {"full_page": True, "quality": 90}}}
|
116
|
+
```
|
117
|
+
|
118
|
+
### **📱 Parallel Viewport Testing**
|
119
|
+
```python
|
120
|
+
# Test across multiple viewports simultaneously
|
121
|
+
await flow.test_responsive([
|
122
|
+
{"width": 375, "height": 667, "name": "mobile"},
|
123
|
+
{"width": 768, "height": 1024, "name": "tablet"},
|
124
|
+
{"width": 1440, "height": 900, "name": "desktop"}
|
125
|
+
], [
|
126
|
+
{"navigate": "/dashboard"},
|
127
|
+
{"screenshot": "responsive-test"}
|
128
|
+
])
|
129
|
+
```
|
130
|
+
|
131
|
+
### **🤖 AI-First Design**
|
132
|
+
All data structured for AI consumption:
|
133
|
+
- Consistent JSON format across all features
|
134
|
+
- **Multi-selector element identification** for robust automation
|
135
|
+
- **Accessibility-aware** element analysis
|
136
|
+
- Error correlation with **smart screenshot deduplication**
|
137
|
+
- Performance insights with **reliability metadata**
|
138
|
+
|
139
|
+
## 🚀 Quick Start
|
140
|
+
|
141
|
+
```bash
|
142
|
+
# Install CursorFlow
|
143
|
+
pip install cursorflow
|
144
|
+
|
145
|
+
# Test real application behavior
|
146
|
+
cursorflow test --base-url http://localhost:3000 --path "/dashboard"
|
147
|
+
|
148
|
+
# Get complete intelligence with custom actions
|
149
|
+
cursorflow test --base-url http://localhost:3000 --actions '[
|
150
|
+
{"navigate": "/login"},
|
151
|
+
{"fill": {"selector": "#email", "value": "test@example.com"}},
|
152
|
+
{"click": "#login-btn"},
|
153
|
+
{"screenshot": {"name": "result", "options": {"mask": [".sensitive-data"]}}}
|
154
|
+
]'
|
155
|
+
```
|
156
|
+
|
157
|
+
## 💻 Python API Examples
|
158
|
+
|
159
|
+
### **Complete Page Intelligence**
|
160
|
+
```python
|
161
|
+
from cursorflow import CursorFlow
|
162
|
+
|
163
|
+
async def capture_reality():
|
164
|
+
flow = CursorFlow("http://localhost:3000", {"source": "local", "paths": ["logs/app.log"]})
|
165
|
+
|
166
|
+
# Capture everything
|
167
|
+
results = await flow.execute_and_collect([
|
168
|
+
{"navigate": "/dashboard"},
|
169
|
+
{"screenshot": "complete-analysis"}
|
170
|
+
])
|
171
|
+
|
172
|
+
# Access comprehensive data
|
173
|
+
screenshot = results['artifacts']['screenshots'][0]
|
174
|
+
print(f"Real load time: {screenshot['performance_data']['page_load_time']}ms")
|
175
|
+
print(f"Actual memory usage: {screenshot['performance_data']['memory_usage_mb']}MB")
|
176
|
+
print(f"Elements found: {len(screenshot['dom_analysis']['elements'])}")
|
177
|
+
```
|
178
|
+
|
179
|
+
### **Enhanced Screenshot Options**
|
180
|
+
```python
|
181
|
+
# Component-focused testing
|
182
|
+
await flow.execute_and_collect([
|
183
|
+
{"navigate": "/components"},
|
184
|
+
{"screenshot": {
|
185
|
+
"name": "button-component",
|
186
|
+
"options": {"clip": {"selector": ".component-demo"}}
|
187
|
+
}}
|
188
|
+
])
|
189
|
+
|
190
|
+
# Privacy-aware testing
|
191
|
+
await flow.execute_and_collect([
|
192
|
+
{"navigate": "/admin"},
|
193
|
+
{"screenshot": {
|
194
|
+
"name": "admin-safe",
|
195
|
+
"options": {
|
196
|
+
"full_page": True,
|
197
|
+
"mask": [".api-key", ".user-data", ".sensitive-info"]
|
198
|
+
}
|
199
|
+
}}
|
200
|
+
])
|
201
|
+
```
|
202
|
+
|
203
|
+
### **Hot Reload Intelligence**
|
204
|
+
```python
|
205
|
+
# Perfect CSS iteration timing
|
206
|
+
async def hmr_workflow():
|
207
|
+
flow = CursorFlow("http://localhost:5173", {"headless": False})
|
208
|
+
|
209
|
+
# Auto-detect and monitor HMR
|
210
|
+
await flow.browser.start_hmr_monitoring()
|
211
|
+
|
212
|
+
# Baseline capture
|
213
|
+
await flow.execute_and_collect([{"screenshot": "baseline"}])
|
214
|
+
|
215
|
+
# Wait for real CSS changes with perfect timing
|
216
|
+
hmr_event = await flow.browser.wait_for_css_update()
|
217
|
+
print(f"🔥 {hmr_event['framework']} detected real change!")
|
218
|
+
|
219
|
+
# Capture immediately after actual change
|
220
|
+
await flow.execute_and_collect([{"screenshot": "updated"}])
|
221
|
+
```
|
222
|
+
|
223
|
+
### **Parallel Viewport Testing**
|
224
|
+
```python
|
225
|
+
# Test responsive design across multiple viewports
|
226
|
+
async def test_responsive_design():
|
227
|
+
flow = CursorFlow("http://localhost:3000", {"source": "local", "paths": ["logs/app.log"]})
|
228
|
+
|
229
|
+
# Define viewports
|
230
|
+
viewports = [
|
231
|
+
{"width": 375, "height": 667, "name": "mobile"},
|
232
|
+
{"width": 768, "height": 1024, "name": "tablet"},
|
233
|
+
{"width": 1440, "height": 900, "name": "desktop"}
|
234
|
+
]
|
235
|
+
|
236
|
+
# Test same actions across all viewports
|
237
|
+
results = await flow.test_responsive(viewports, [
|
238
|
+
{"navigate": "/dashboard"},
|
239
|
+
{"click": "#menu-toggle"},
|
240
|
+
{"screenshot": {"name": "navigation", "options": {"clip": {"selector": "#nav"}}}}
|
241
|
+
])
|
242
|
+
|
243
|
+
# Analyze responsive behavior
|
244
|
+
print(f"Tested {results['execution_summary']['successful_viewports']} viewports")
|
245
|
+
print(f"Fastest: {results['responsive_analysis']['performance_analysis']['fastest_viewport']}")
|
246
|
+
```
|
247
|
+
|
248
|
+
## 🔧 CLI Commands
|
249
|
+
|
250
|
+
### **Universal Testing**
|
251
|
+
```bash
|
252
|
+
# Simple page test with complete intelligence
|
253
|
+
cursorflow test --base-url http://localhost:3000 --path "/dashboard"
|
254
|
+
|
255
|
+
# Responsive testing across multiple viewports
|
256
|
+
cursorflow test --base-url http://localhost:3000 --path "/dashboard" --responsive
|
257
|
+
|
258
|
+
# Complex interaction testing
|
259
|
+
cursorflow test --base-url http://localhost:3000 --actions '[
|
260
|
+
{"navigate": "/form"},
|
261
|
+
{"fill": {"selector": "#name", "value": "Test User"}},
|
262
|
+
{"click": "#submit"},
|
263
|
+
{"screenshot": {"name": "result", "options": {"clip": {"selector": ".result-area"}}}}
|
264
|
+
]'
|
265
|
+
|
266
|
+
# Responsive testing with custom actions
|
267
|
+
cursorflow test --base-url http://localhost:3000 --responsive --actions '[
|
268
|
+
{"navigate": "/products"},
|
269
|
+
{"fill": {"selector": "#search", "value": "laptop"}},
|
270
|
+
{"screenshot": "search-results"}
|
271
|
+
]'
|
272
|
+
|
273
|
+
# Custom output location
|
274
|
+
cursorflow test --base-url http://localhost:3000 --path "/api" --output "api-test-results.json"
|
275
|
+
```
|
276
|
+
|
277
|
+
### **Design Comparison**
|
278
|
+
```bash
|
279
|
+
# Compare mockup to implementation
|
280
|
+
cursorflow compare-mockup https://mockup.com/design \
|
281
|
+
--base-url http://localhost:3000 \
|
282
|
+
--mockup-actions '[{"navigate": "/"}]' \
|
283
|
+
--implementation-actions '[{"navigate": "/dashboard"}]'
|
284
|
+
|
285
|
+
# CSS iteration with HMR intelligence
|
286
|
+
cursorflow iterate-mockup https://mockup.com/design \
|
287
|
+
--base-url http://localhost:5173 \
|
288
|
+
--css-improvements '[
|
289
|
+
{"name": "fix-spacing", "css": ".container { gap: 2rem; }"}
|
290
|
+
]'
|
291
|
+
```
|
292
|
+
|
293
|
+
### **AI Integration**
|
294
|
+
```bash
|
295
|
+
# Install Cursor AI rules
|
296
|
+
cursorflow install-rules
|
297
|
+
|
298
|
+
# Update to latest version and rules
|
299
|
+
cursorflow update
|
300
|
+
```
|
301
|
+
|
302
|
+
## 🧠 Why This Matters
|
303
|
+
|
304
|
+
### **For Job Board v4 Testing:**
|
305
|
+
✅ **Real API response times** from `/ajax_rq.smpl?fn=gjapi_typeahead`
|
306
|
+
✅ **Actual network failures** when they occur
|
307
|
+
✅ **Real browser console errors** from production code
|
308
|
+
✅ **Genuine performance metrics** under real load
|
309
|
+
|
310
|
+
❌ **With mocking:** You'd never know the typeahead is slow in production!
|
311
|
+
|
312
|
+
### **For Any Web Application:**
|
313
|
+
- **Trust your test results** - they reflect actual behavior
|
314
|
+
- **Find real performance bottlenecks** - no artificial speed boosts
|
315
|
+
- **Discover actual edge cases** - no simulation gaps
|
316
|
+
- **Debug genuine issues** - real errors, real timing, real context
|
317
|
+
|
318
|
+
## 🌟 Framework Support
|
319
|
+
|
320
|
+
**Universal Compatibility:**
|
321
|
+
- Works with **any web application** regardless of technology
|
322
|
+
- **Framework-agnostic** core operations
|
323
|
+
- **Smart adaptation** to different environments
|
324
|
+
|
325
|
+
**HMR Auto-Detection:**
|
326
|
+
- ✅ **Vite** (port 5173)
|
327
|
+
- ✅ **Webpack Dev Server** (port 3000)
|
328
|
+
- ✅ **Next.js** (port 3000)
|
329
|
+
- ✅ **Parcel** (port 1234)
|
330
|
+
- ✅ **Laravel Mix** (port 3000)
|
331
|
+
|
332
|
+
## 📖 Documentation
|
333
|
+
|
334
|
+
- **[Complete User Manual](docs/USER_MANUAL.md)** - Full feature guide
|
335
|
+
- **[Examples](examples/)** - Practical usage examples
|
336
|
+
- **[API Reference](docs/api/)** - Complete Python API documentation
|
337
|
+
|
338
|
+
## 🎪 The CursorFlow Advantage
|
339
|
+
|
340
|
+
### **Other Tools Say:**
|
341
|
+
*"We let you mock and simulate"*
|
342
|
+
|
343
|
+
### **CursorFlow Says:**
|
344
|
+
*"We tell you the truth"*
|
345
|
+
|
346
|
+
**When you need to understand reality, choose the measurement tool - not the simulation tool.**
|
347
|
+
|
348
|
+
---
|
349
|
+
|
350
|
+
**Complete page intelligence • Real behavior measurement • AI-first design • Pure observation**
|
@@ -0,0 +1,305 @@
|
|
1
|
+
# CursorFlow
|
2
|
+
|
3
|
+
**The measurement tool for web testing - we capture reality, not fiction**
|
4
|
+
|
5
|
+
CursorFlow is a pure data collection engine that captures comprehensive web application intelligence. Unlike simulation tools that let you control reality, CursorFlow measures actual reality - giving you complete trust in your test results.
|
6
|
+
|
7
|
+
## 🎯 The CursorFlow Philosophy
|
8
|
+
|
9
|
+
### **📊 We Collect Reality, Not Fiction**
|
10
|
+
|
11
|
+
**Other tools are simulation tools** - they let you control reality:
|
12
|
+
- Mock network responses
|
13
|
+
- Simulate user interactions
|
14
|
+
- Create test environments
|
15
|
+
|
16
|
+
**CursorFlow is a measurement tool** - we capture reality as-is:
|
17
|
+
- Real API response times
|
18
|
+
- Actual network failures
|
19
|
+
- Genuine browser behavior
|
20
|
+
- Complete page intelligence
|
21
|
+
|
22
|
+
### **🔬 Pure Observation Principle**
|
23
|
+
|
24
|
+
**CursorFlow is like a scientific instrument:**
|
25
|
+
- **Microscopes** don't create the cells they observe
|
26
|
+
- **Telescopes** don't generate the stars they capture
|
27
|
+
- **CursorFlow** doesn't mock the web it measures
|
28
|
+
|
29
|
+
When CursorFlow reports `"average_response_time": 416.58ms`, you can tell stakeholders: **"This is what actually happened"** - not "this is what happened in our test simulation."
|
30
|
+
|
31
|
+
### **🌟 The Trust Factor**
|
32
|
+
|
33
|
+
**Complete Reliability:** Every data point reflects real application behavior
|
34
|
+
- No mocked responses hiding slow APIs
|
35
|
+
- No simulated interactions missing real edge cases
|
36
|
+
- No test environments different from production
|
37
|
+
|
38
|
+
**Documentary vs Movie:** Both are valuable, but if you're trying to understand reality, you watch the documentary. CursorFlow is the documentary of web testing.
|
39
|
+
|
40
|
+
## 🚀 Complete Page Intelligence
|
41
|
+
|
42
|
+
Every screenshot captures everything your AI needs to make intelligent decisions:
|
43
|
+
|
44
|
+
### **📊 Comprehensive Data Collection**
|
45
|
+
- **DOM**: All elements with 7 selector strategies each
|
46
|
+
- **Network**: All requests, responses, and complete response bodies
|
47
|
+
- **Console**: All logs, errors, and smart error correlation
|
48
|
+
- **Performance**: Load times, memory usage, with reliability indicators
|
49
|
+
- **Visual**: Screenshots with pixel-perfect comparisons and enhanced options
|
50
|
+
- **Fonts**: Loading status, performance, and usage analysis
|
51
|
+
- **Animations**: Active animations and transitions tracking
|
52
|
+
- **Resources**: Complete resource loading analysis
|
53
|
+
- **Storage**: localStorage, sessionStorage, cookies, IndexedDB state
|
54
|
+
|
55
|
+
### **🔄 Hot Reload Intelligence**
|
56
|
+
- **Framework auto-detection** (Vite, Webpack, Next.js, Parcel, Laravel Mix)
|
57
|
+
- **Perfect timing** for CSS change detection
|
58
|
+
- **HMR event correlation** for understanding change impact
|
59
|
+
- **Persistent sessions** that survive code changes
|
60
|
+
|
61
|
+
### **🎯 Enhanced Screenshot Options**
|
62
|
+
```python
|
63
|
+
# Clip to specific components
|
64
|
+
{"screenshot": {"name": "header", "options": {"clip": {"selector": "#header"}}}}
|
65
|
+
|
66
|
+
# Hide sensitive information
|
67
|
+
{"screenshot": {"name": "profile", "options": {"mask": [".user-email", ".api-key"]}}}
|
68
|
+
|
69
|
+
# Full page with quality control
|
70
|
+
{"screenshot": {"name": "page", "options": {"full_page": True, "quality": 90}}}
|
71
|
+
```
|
72
|
+
|
73
|
+
### **📱 Parallel Viewport Testing**
|
74
|
+
```python
|
75
|
+
# Test across multiple viewports simultaneously
|
76
|
+
await flow.test_responsive([
|
77
|
+
{"width": 375, "height": 667, "name": "mobile"},
|
78
|
+
{"width": 768, "height": 1024, "name": "tablet"},
|
79
|
+
{"width": 1440, "height": 900, "name": "desktop"}
|
80
|
+
], [
|
81
|
+
{"navigate": "/dashboard"},
|
82
|
+
{"screenshot": "responsive-test"}
|
83
|
+
])
|
84
|
+
```
|
85
|
+
|
86
|
+
### **🤖 AI-First Design**
|
87
|
+
All data structured for AI consumption:
|
88
|
+
- Consistent JSON format across all features
|
89
|
+
- **Multi-selector element identification** for robust automation
|
90
|
+
- **Accessibility-aware** element analysis
|
91
|
+
- Error correlation with **smart screenshot deduplication**
|
92
|
+
- Performance insights with **reliability metadata**
|
93
|
+
|
94
|
+
## 🚀 Quick Start
|
95
|
+
|
96
|
+
```bash
|
97
|
+
# Install CursorFlow
|
98
|
+
pip install cursorflow
|
99
|
+
|
100
|
+
# Test real application behavior
|
101
|
+
cursorflow test --base-url http://localhost:3000 --path "/dashboard"
|
102
|
+
|
103
|
+
# Get complete intelligence with custom actions
|
104
|
+
cursorflow test --base-url http://localhost:3000 --actions '[
|
105
|
+
{"navigate": "/login"},
|
106
|
+
{"fill": {"selector": "#email", "value": "test@example.com"}},
|
107
|
+
{"click": "#login-btn"},
|
108
|
+
{"screenshot": {"name": "result", "options": {"mask": [".sensitive-data"]}}}
|
109
|
+
]'
|
110
|
+
```
|
111
|
+
|
112
|
+
## 💻 Python API Examples
|
113
|
+
|
114
|
+
### **Complete Page Intelligence**
|
115
|
+
```python
|
116
|
+
from cursorflow import CursorFlow
|
117
|
+
|
118
|
+
async def capture_reality():
|
119
|
+
flow = CursorFlow("http://localhost:3000", {"source": "local", "paths": ["logs/app.log"]})
|
120
|
+
|
121
|
+
# Capture everything
|
122
|
+
results = await flow.execute_and_collect([
|
123
|
+
{"navigate": "/dashboard"},
|
124
|
+
{"screenshot": "complete-analysis"}
|
125
|
+
])
|
126
|
+
|
127
|
+
# Access comprehensive data
|
128
|
+
screenshot = results['artifacts']['screenshots'][0]
|
129
|
+
print(f"Real load time: {screenshot['performance_data']['page_load_time']}ms")
|
130
|
+
print(f"Actual memory usage: {screenshot['performance_data']['memory_usage_mb']}MB")
|
131
|
+
print(f"Elements found: {len(screenshot['dom_analysis']['elements'])}")
|
132
|
+
```
|
133
|
+
|
134
|
+
### **Enhanced Screenshot Options**
|
135
|
+
```python
|
136
|
+
# Component-focused testing
|
137
|
+
await flow.execute_and_collect([
|
138
|
+
{"navigate": "/components"},
|
139
|
+
{"screenshot": {
|
140
|
+
"name": "button-component",
|
141
|
+
"options": {"clip": {"selector": ".component-demo"}}
|
142
|
+
}}
|
143
|
+
])
|
144
|
+
|
145
|
+
# Privacy-aware testing
|
146
|
+
await flow.execute_and_collect([
|
147
|
+
{"navigate": "/admin"},
|
148
|
+
{"screenshot": {
|
149
|
+
"name": "admin-safe",
|
150
|
+
"options": {
|
151
|
+
"full_page": True,
|
152
|
+
"mask": [".api-key", ".user-data", ".sensitive-info"]
|
153
|
+
}
|
154
|
+
}}
|
155
|
+
])
|
156
|
+
```
|
157
|
+
|
158
|
+
### **Hot Reload Intelligence**
|
159
|
+
```python
|
160
|
+
# Perfect CSS iteration timing
|
161
|
+
async def hmr_workflow():
|
162
|
+
flow = CursorFlow("http://localhost:5173", {"headless": False})
|
163
|
+
|
164
|
+
# Auto-detect and monitor HMR
|
165
|
+
await flow.browser.start_hmr_monitoring()
|
166
|
+
|
167
|
+
# Baseline capture
|
168
|
+
await flow.execute_and_collect([{"screenshot": "baseline"}])
|
169
|
+
|
170
|
+
# Wait for real CSS changes with perfect timing
|
171
|
+
hmr_event = await flow.browser.wait_for_css_update()
|
172
|
+
print(f"🔥 {hmr_event['framework']} detected real change!")
|
173
|
+
|
174
|
+
# Capture immediately after actual change
|
175
|
+
await flow.execute_and_collect([{"screenshot": "updated"}])
|
176
|
+
```
|
177
|
+
|
178
|
+
### **Parallel Viewport Testing**
|
179
|
+
```python
|
180
|
+
# Test responsive design across multiple viewports
|
181
|
+
async def test_responsive_design():
|
182
|
+
flow = CursorFlow("http://localhost:3000", {"source": "local", "paths": ["logs/app.log"]})
|
183
|
+
|
184
|
+
# Define viewports
|
185
|
+
viewports = [
|
186
|
+
{"width": 375, "height": 667, "name": "mobile"},
|
187
|
+
{"width": 768, "height": 1024, "name": "tablet"},
|
188
|
+
{"width": 1440, "height": 900, "name": "desktop"}
|
189
|
+
]
|
190
|
+
|
191
|
+
# Test same actions across all viewports
|
192
|
+
results = await flow.test_responsive(viewports, [
|
193
|
+
{"navigate": "/dashboard"},
|
194
|
+
{"click": "#menu-toggle"},
|
195
|
+
{"screenshot": {"name": "navigation", "options": {"clip": {"selector": "#nav"}}}}
|
196
|
+
])
|
197
|
+
|
198
|
+
# Analyze responsive behavior
|
199
|
+
print(f"Tested {results['execution_summary']['successful_viewports']} viewports")
|
200
|
+
print(f"Fastest: {results['responsive_analysis']['performance_analysis']['fastest_viewport']}")
|
201
|
+
```
|
202
|
+
|
203
|
+
## 🔧 CLI Commands
|
204
|
+
|
205
|
+
### **Universal Testing**
|
206
|
+
```bash
|
207
|
+
# Simple page test with complete intelligence
|
208
|
+
cursorflow test --base-url http://localhost:3000 --path "/dashboard"
|
209
|
+
|
210
|
+
# Responsive testing across multiple viewports
|
211
|
+
cursorflow test --base-url http://localhost:3000 --path "/dashboard" --responsive
|
212
|
+
|
213
|
+
# Complex interaction testing
|
214
|
+
cursorflow test --base-url http://localhost:3000 --actions '[
|
215
|
+
{"navigate": "/form"},
|
216
|
+
{"fill": {"selector": "#name", "value": "Test User"}},
|
217
|
+
{"click": "#submit"},
|
218
|
+
{"screenshot": {"name": "result", "options": {"clip": {"selector": ".result-area"}}}}
|
219
|
+
]'
|
220
|
+
|
221
|
+
# Responsive testing with custom actions
|
222
|
+
cursorflow test --base-url http://localhost:3000 --responsive --actions '[
|
223
|
+
{"navigate": "/products"},
|
224
|
+
{"fill": {"selector": "#search", "value": "laptop"}},
|
225
|
+
{"screenshot": "search-results"}
|
226
|
+
]'
|
227
|
+
|
228
|
+
# Custom output location
|
229
|
+
cursorflow test --base-url http://localhost:3000 --path "/api" --output "api-test-results.json"
|
230
|
+
```
|
231
|
+
|
232
|
+
### **Design Comparison**
|
233
|
+
```bash
|
234
|
+
# Compare mockup to implementation
|
235
|
+
cursorflow compare-mockup https://mockup.com/design \
|
236
|
+
--base-url http://localhost:3000 \
|
237
|
+
--mockup-actions '[{"navigate": "/"}]' \
|
238
|
+
--implementation-actions '[{"navigate": "/dashboard"}]'
|
239
|
+
|
240
|
+
# CSS iteration with HMR intelligence
|
241
|
+
cursorflow iterate-mockup https://mockup.com/design \
|
242
|
+
--base-url http://localhost:5173 \
|
243
|
+
--css-improvements '[
|
244
|
+
{"name": "fix-spacing", "css": ".container { gap: 2rem; }"}
|
245
|
+
]'
|
246
|
+
```
|
247
|
+
|
248
|
+
### **AI Integration**
|
249
|
+
```bash
|
250
|
+
# Install Cursor AI rules
|
251
|
+
cursorflow install-rules
|
252
|
+
|
253
|
+
# Update to latest version and rules
|
254
|
+
cursorflow update
|
255
|
+
```
|
256
|
+
|
257
|
+
## 🧠 Why This Matters
|
258
|
+
|
259
|
+
### **For Job Board v4 Testing:**
|
260
|
+
✅ **Real API response times** from `/ajax_rq.smpl?fn=gjapi_typeahead`
|
261
|
+
✅ **Actual network failures** when they occur
|
262
|
+
✅ **Real browser console errors** from production code
|
263
|
+
✅ **Genuine performance metrics** under real load
|
264
|
+
|
265
|
+
❌ **With mocking:** You'd never know the typeahead is slow in production!
|
266
|
+
|
267
|
+
### **For Any Web Application:**
|
268
|
+
- **Trust your test results** - they reflect actual behavior
|
269
|
+
- **Find real performance bottlenecks** - no artificial speed boosts
|
270
|
+
- **Discover actual edge cases** - no simulation gaps
|
271
|
+
- **Debug genuine issues** - real errors, real timing, real context
|
272
|
+
|
273
|
+
## 🌟 Framework Support
|
274
|
+
|
275
|
+
**Universal Compatibility:**
|
276
|
+
- Works with **any web application** regardless of technology
|
277
|
+
- **Framework-agnostic** core operations
|
278
|
+
- **Smart adaptation** to different environments
|
279
|
+
|
280
|
+
**HMR Auto-Detection:**
|
281
|
+
- ✅ **Vite** (port 5173)
|
282
|
+
- ✅ **Webpack Dev Server** (port 3000)
|
283
|
+
- ✅ **Next.js** (port 3000)
|
284
|
+
- ✅ **Parcel** (port 1234)
|
285
|
+
- ✅ **Laravel Mix** (port 3000)
|
286
|
+
|
287
|
+
## 📖 Documentation
|
288
|
+
|
289
|
+
- **[Complete User Manual](docs/USER_MANUAL.md)** - Full feature guide
|
290
|
+
- **[Examples](examples/)** - Practical usage examples
|
291
|
+
- **[API Reference](docs/api/)** - Complete Python API documentation
|
292
|
+
|
293
|
+
## 🎪 The CursorFlow Advantage
|
294
|
+
|
295
|
+
### **Other Tools Say:**
|
296
|
+
*"We let you mock and simulate"*
|
297
|
+
|
298
|
+
### **CursorFlow Says:**
|
299
|
+
*"We tell you the truth"*
|
300
|
+
|
301
|
+
**When you need to understand reality, choose the measurement tool - not the simulation tool.**
|
302
|
+
|
303
|
+
---
|
304
|
+
|
305
|
+
**Complete page intelligence • Real behavior measurement • AI-first design • Pure observation**
|