CursorFlow
The measurement tool for web testing - we capture reality, not fiction
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.
🎯 The CursorFlow Philosophy
📊 We Collect Reality, Not Fiction
Other tools are simulation tools - they let you control reality:
- Mock network responses
- Simulate user interactions
- Create test environments
CursorFlow is a measurement tool - we capture reality as-is:
- Real API response times
- Actual network failures
- Genuine browser behavior
- Complete page intelligence
🔬 Pure Observation Principle
CursorFlow is like a scientific instrument:
- Microscopes don't create the cells they observe
- Telescopes don't generate the stars they capture
- CursorFlow doesn't mock the web it measures
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."
🌟 The Trust Factor
Complete Reliability: Every data point reflects real application behavior
- No mocked responses hiding slow APIs
- No simulated interactions missing real edge cases
- No test environments different from production
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.
🎯 Pass-Through Architecture
CursorFlow doesn't limit you - it exposes the full power of Playwright:
94+ Playwright actions available:
# Any Playwright Page method works
cursorflow test --actions '[
{"hover": ".menu"},
{"dblclick": ".editable"},
{"press": "Enter"},
{"drag_and_drop": {"source": ".item", "target": ".zone"}},
{"check": "#checkbox"},
{"evaluate": "window.scrollTo(0, 500)"}
]'
Full configuration pass-through:
{
"browser_config": {
"browser_launch_options": {"devtools": true, "channel": "chrome"}
},
"context_options": {
"color_scheme": "dark",
"geolocation": {"latitude": 40.7128, "longitude": -74.0060},
"timezone_id": "America/Los_Angeles"
}
}
Forward-compatible: New Playwright features work immediately without CursorFlow updates.
See: Playwright API Documentation
🧹 Artifact Management
CursorFlow generates valuable debugging data (screenshots, traces, sessions). Manage disk space:
# Clean old artifacts (>7 days)
cursorflow cleanup --artifacts --old-only
# Clean all artifacts
cursorflow cleanup --artifacts
# Clean saved sessions
cursorflow cleanup --sessions
# Clean everything
cursorflow cleanup --all
# Preview before deleting
cursorflow cleanup --all --dry-run
See: Complete Usage Guide
🔐 Authentication & Testing Protected Pages
Test authenticated pages with automatic session management.
Quick Start: Simple Username/Password Login
No configuration needed - just login with inline actions:
# Step 1: Login once and save session
cursorflow test --base-url http://localhost:3000 --actions '[
{"navigate": "/login"},
{"fill": {"selector": "#username", "value": "myuser"}},
{"fill": {"selector": "#password", "value": "mypass"}},
{"click": "#login-button"},
{"wait_for": ".dashboard"},
{"screenshot": "logged-in"}
]' --save-session "myuser"
# Step 2: Reuse session for all future tests (no re-login!)
cursorflow test --use-session "myuser" \
--path /admin/settings \
--screenshot "admin-panel"
# Step 3: Test another protected page
cursorflow test --use-session "myuser" \
--path /profile \
--screenshot "user-profile"
What's saved:
- All cookies (session cookies, auth tokens)
- localStorage and sessionStorage
- Complete authentication state
Session persists across tests - login once, test forever (until session expires).
Alternative: Config-Based Authentication
For repeated testing, configure auth once in .cursorflow/config.json:
# 1. Configure auth in .cursorflow/config.json
{
"base_url": "http://localhost:3000",
"auth": {
"method": "form",
"username": "test@example.com",
"password": "testpass",
"username_selector": "#email",
"password_selector": "#password",
"submit_selector": "#login-button"
}
}
# 2. Login once and save session
cursorflow test --base-url http://localhost:3000 \
--path /login \
--save-session "user"
# 3. Reuse session for protected pages (no re-login!)
cursorflow test --use-session "user" \
--path /dashboard \
--screenshot "dashboard"
Supports:
- Form authentication (username/password)
- Cookie authentication (JWT tokens, session cookies)
- Header authentication (Bearer tokens, API keys)
- SSO authentication (Google, Microsoft, Okta, Auth0)
SSO/OAuth Quick Start (Streamlined - No Manual Steps!):
# RECOMMENDED: Capture and save session in one command
cursorflow capture-auth --base-url http://localhost:3001 \
--path /dashboard \
--save-as-session "sso"
# Session is immediately ready to use!
cursorflow test --use-session "sso" --path /dashboard
# Or capture + test in one command:
cursorflow capture-auth --base-url http://localhost:3001 \
--path /dashboard \
--save-as-session "sso" \
--test-immediately
Features:
- ✅ Saves directly to
.cursorflow/sessions/sso_session.json(no manual copying!) - ✅ Captures cookies + localStorage + sessionStorage
- ✅ Works with Microsoft Azure AD, Google, Okta, Auth0
- ✅
--test-immediatelyvalidates session works - ✅
--debug-sessionfor troubleshooting
Tip: Use --browser chrome on macOS for better window visibility
See: Complete Authentication Guide
🚀 Complete Page Intelligence
Every test captures everything needed for debugging:
📊 Comprehensive Data Collection
- DOM: All elements with 7 selector strategies + event handlers
- Network: Requests, responses, and complete request/response bodies
- Console: All logs, errors, warnings - displayed prominently
- JavaScript: Global functions, variables, specific window objects
- Storage: localStorage, sessionStorage, cookies (sensitive data masked)
- Forms: All field values at capture time (passwords masked)
- Performance: Load times, memory usage, reliability indicators
- Visual: Screenshots with comprehensive page analysis
- Sessions: Save/restore authenticated browser state (requires auth_config - see Authentication below)
🔄 Hot Reload Intelligence
- Framework auto-detection (Vite, Webpack, Next.js, Parcel, Laravel Mix)
- Perfect timing for CSS change detection
- HMR event correlation for understanding change impact
- Persistent sessions that survive code changes
🎯 Enhanced Screenshot Options
# Clip to specific components
{"screenshot": {"name": "header", "options": {"clip": {"selector": "#header"}}}}
# Hide sensitive information
{"screenshot": {"name": "profile", "options": {"mask": [".user-email", ".api-key"]}}}
# Full page with quality control
{"screenshot": {"name": "page", "options": {"full_page": True, "quality": 90}}}
📱 Parallel Viewport Testing
# Test across multiple viewports simultaneously
await flow.test_responsive([
{"width": 375, "height": 667, "name": "mobile"},
{"width": 768, "height": 1024, "name": "tablet"},
{"width": 1440, "height": 900, "name": "desktop"}
], [
{"navigate": "/dashboard"},
{"screenshot": "responsive-test"}
])
🤖 AI-First Design
All data structured for AI consumption:
- Consistent JSON format across all features
- Multi-selector element identification for robust automation
- Accessibility-aware element analysis
- Error correlation with smart screenshot deduplication
- Performance insights with reliability metadata
✨ What's New in v2.7.1
AI-Optimized Output with Complete Data Type Coverage - All CursorFlow features now organized for AI consumption:
- Multi-File Structure: Split 3.7M token JSON → organized files under 100K tokens each
- Complete Coverage: Browser console, server logs, network, DOM, screenshots - all queryable
- AI Data Digest: Auto-generated markdown summary with server logs included
- Query Interface: Fast data extraction for ALL data types without manual JSON parsing
- Session Comparison: Compare test results to detect regressions
- Export Formats: JSON, Markdown, CSV outputs for any use case
# Test generates AI-optimized output automatically
cursorflow test --base-url http://localhost:3000 --path /app --logs local
# Query ANY data type instantly
cursorflow query session_123 --errors # Console errors
cursorflow query session_123 --server-logs # Server logs
cursorflow query session_123 --network --failed # Network failures
cursorflow query session_123 --screenshots # Screenshot index
cursorflow query session_123 --responsive # Responsive results
cursorflow query session_123 --css-iterations # CSS iterations
# Enhanced filtering
cursorflow query session_123 --errors --from-file "app.js" --contains "undefined"
cursorflow query session_123 --network --url-contains "/api/" --over 500ms
cursorflow query session_123 --server-logs --level error --pattern "database"
# Cross-referencing (time-based correlation)
cursorflow query session_123 --errors --with-network --with-server-logs
# Contextual queries
cursorflow query session_123 --context-for-error 2 --window 10
cursorflow query session_123 --group-by-url "/api/users"
# Enhanced comparison
cursorflow query session_A --compare-with session_B --errors
Impact:
- ✅ 100% AI-readable results (vs 0% before - exceeded context limits)
- ✅ 90% faster error diagnosis with AI assistants
- ✅ Zero manual JSON parsing required
- ✅ Complete backend + frontend visibility (server logs included)
Complete Data Coverage:
.cursorflow/artifacts/sessions/session_XXX/
├── server_logs.json # ⭐ Server-side logs (SSH/local/Docker)
├── errors.json # Browser console errors
├── network.json # Network requests/responses
├── screenshots.json # ⭐ Screenshot metadata
├── data_digest.md # AI summary (includes server logs)
└── + 6 more data files covering all CursorFlow features
🤖 For AI Agents: Start Here
3-Second Decision Guide
| User Says | Command | What You Get |
|---|---|---|
| "Debug this error" | cursorflow test → query session_X --errors --with-network |
Error + network + server logs correlated |
| "Fix this CSS" | Python: css_iteration_persistent() |
Visual comparison of CSS variations |
| "Why is this slow?" | query session_X --network --over 500ms |
Slow requests identified |
| "Test login flow" | cursorflow test --actions '[...]' |
Complete flow with server correlation |
Complete Debugging Example
# User: "There's a JavaScript error on the dashboard"
# 1. Capture (5 seconds)
cursorflow test --base-url http://localhost:3000 --path /dashboard
# 2. Diagnose (10 seconds)
cat .cursorflow/artifacts/sessions/session_XXX/data_digest.md
cursorflow query session_XXX --errors
# 3. Get context (5 seconds)
cursorflow query session_XXX --context-for-error 0 --export markdown
# 4. Fix based on correlated data
# (You now have: error message, stack trace, network requests, server logs)
Total time: 20 seconds from problem to actionable diagnosis
When User Mentions...
"Error", "Broken", "Not working"
cursorflow testto capturequery --errorsto identifyquery --context-for-errorto understand- Fix based on correlated data
"Slow", "Performance", "Takes forever"
cursorflow testto baselinequery --network --over 500msto find bottlenecksquery --performancefor metrics- Optimize slow requests
"CSS", "Styling", "Layout", "Spacing"
- Python API:
css_iteration_persistent() - Test 2-3 CSS approaches
- Compare screenshots
- Apply best result
"Login", "Auth", "Session"
cursorflow test --actions '[...]'with login flow--save-sessionto preserve auth--use-sessionfor subsequent tests- Check auth errors with
query --errors --contains "auth"
"Responsive", "Mobile", "Tablet"
cursorflow test --responsivequery --responsive --viewport mobile- Compare viewport results
- Fix mobile-specific issues
"Compare", "Regression", "What changed"
query session_before --compare-with session_after- Focus on
new_errorsandtiming_changes - Investigate specific regressions
🚀 Quick Start
Step 1: Install CursorFlow Package
pip install cursorflow
playwright install chromium
Step 2: Initialize Your Project (One-Time Setup)
cd /path/to/your/project
cursorflow install-rules
# Or skip prompts for automation/CI
cursorflow install-rules --yes
This creates:
.cursor/rules/- Cursor AI integration rules.cursorflow/config.json- Project-specific configuration.cursorflow/- Artifacts and session storage.gitignoreentries for CursorFlow artifacts
Step 3: Start Testing
Simple page capture:
cursorflow test --base-url http://localhost:3000 --path /dashboard
Interactive testing with inline actions:
cursorflow test --base-url http://localhost:3000 \
--path /messages \
--wait-for ".message-item" \
--hover ".message-item:first-child" \
--click ".message-item:first-child" \
--screenshot "clicked" \
--show-console \
--open-trace
# Full page screenshot (captures entire scrollable content)
cursorflow test --base-url http://localhost:3000 \
--path /dashboard \
--screenshot "complete-page" \
--full-page
Custom actions with JSON:
cursorflow test --base-url http://localhost:3000 --actions '[
{"navigate": "/login"},
{"fill": {"selector": "#email", "value": "test@example.com"}},
{"click": "#login-btn"},
{"screenshot": {"name": "result", "options": {"mask": [".sensitive-data"]}}}
]'
💻 Python API Examples
Complete Page Intelligence
from cursorflow import CursorFlow
async def capture_reality():
flow = CursorFlow("http://localhost:3000", {"source": "local", "paths": ["logs/app.log"]})
# Capture everything
results = await flow.execute_and_collect([
{"navigate": "/dashboard"},
{"screenshot": "complete-analysis"}
])
# Access comprehensive data
screenshot = results['artifacts']['screenshots'][0]
print(f"Real load time: {screenshot['performance_data']['page_load_time']}ms")
print(f"Actual memory usage: {screenshot['performance_data']['memory_usage_mb']}MB")
print(f"Elements found: {len(screenshot['dom_analysis']['elements'])}")
Enhanced Screenshot Options
# Component-focused testing
await flow.execute_and_collect([
{"navigate": "/components"},
{"screenshot": {
"name": "button-component",
"options": {"clip": {"selector": ".component-demo"}}
}}
])
# Privacy-aware testing
await flow.execute_and_collect([
{"navigate": "/admin"},
{"screenshot": {
"name": "admin-safe",
"options": {
"full_page": True,
"mask": [".api-key", ".user-data", ".sensitive-info"]
}
}}
])
Hot Reload Intelligence
# Perfect CSS iteration timing
async def hmr_workflow():
flow = CursorFlow("http://localhost:5173", {"headless": False})
# Auto-detect and monitor HMR
await flow.browser.start_hmr_monitoring()
# Baseline capture
await flow.execute_and_collect([{"screenshot": "baseline"}])
# Wait for real CSS changes with perfect timing
hmr_event = await flow.browser.wait_for_css_update()
print(f"🔥 {hmr_event['framework']} detected real change!")
# Capture immediately after actual change
await flow.execute_and_collect([{"screenshot": "updated"}])
Parallel Viewport Testing
# Test responsive design across multiple viewports
async def test_responsive_design():
flow = CursorFlow("http://localhost:3000", {"source": "local", "paths": ["logs/app.log"]})
# Define viewports
viewports = [
{"width": 375, "height": 667, "name": "mobile"},
{"width": 768, "height": 1024, "name": "tablet"},
{"width": 1440, "height": 900, "name": "desktop"}
]
# Test same actions across all viewports
results = await flow.test_responsive(viewports, [
{"navigate": "/dashboard"},
{"click": "#menu-toggle"},
{"screenshot": {"name": "navigation", "options": {"clip": {"selector": "#nav"}}}}
])
# Analyze responsive behavior
print(f"Tested {results['execution_summary']['successful_viewports']} viewports")
print(f"Fastest: {results['responsive_analysis']['performance_analysis']['fastest_viewport']}")
🔧 CLI Commands
⚠️ Two Ways to Specify Actions
1. Inline CLI Flags (use = separator for fill):
cursorflow test --base-url http://localhost:3000 \
--path /login \
--fill "#email=test@example.com" \
--fill "#password=mypass" \
--click "button[type='submit']" \
--screenshot "result"
2. JSON Actions (use dict with selector and value):
cursorflow test --base-url http://localhost:3000 --actions '[
{"navigate": "/login"},
{"fill": {"selector": "#email", "value": "test@example.com"}},
{"fill": {"selector": "#password", "value": "mypass"}},
{"click": "button[type=\"submit\"]"},
{"screenshot": "result"}
]'
❌ Don't mix formats! Using | or = inside JSON actions won't work.
Universal Testing
# Simple page test with complete intelligence
cursorflow test --base-url http://localhost:3000 --path "/dashboard"
# Responsive testing across multiple viewports
cursorflow test --base-url http://localhost:3000 --path "/dashboard" --responsive
# Complex interaction testing
cursorflow test --base-url http://localhost:3000 --actions '[
{"navigate": "/form"},
{"fill": {"selector": "#name", "value": "Test User"}},
{"click": "#submit"},
{"screenshot": {"name": "result", "options": {"clip": {"selector": ".result-area"}}}}
]'
# Responsive testing with custom actions
cursorflow test --base-url http://localhost:3000 --responsive --actions '[
{"navigate": "/products"},
{"fill": {"selector": "#search", "value": "laptop"}},
{"screenshot": "search-results"}
]'
# Custom output location
cursorflow test --base-url http://localhost:3000 --path "/api" --output "api-test-results.json"
# Inline action flags
cursorflow test --base-url http://localhost:3000 \
--path /dashboard \
--screenshot "full-page-capture" \
--full-page # Captures entire scrollable page
Design Comparison (Pure Measurement)
# Compare mockup to implementation - get similarity metrics
cursorflow compare-mockup https://mockup.com/design \
--base-url http://localhost:3000 \
--implementation-actions '[{"navigate": "/dashboard"}]'
# Output: 87.3% similarity, diff images, element measurements
# Test CSS variations - observe real rendering
cursorflow iterate-mockup https://mockup.com/design \
--base-url http://localhost:5173 \
--css-improvements '[
{"name": "spacing-fix", "css": ".container { gap: 2rem; }"},
{"name": "tighter-spacing", "css": ".container { gap: 1rem; }"}
]'
# Output: Similarity data for each variation (Cursor decides which to apply)
Element Analysis & CSS Debugging
# Comprehensive element inspection with full CSS analysis
cursorflow inspect --base-url http://localhost:3000 --selector "#messages-panel"
# Show all computed CSS properties
cursorflow inspect -u http://localhost:3000 -s ".card" --verbose
# Quick dimension check (surgical precision)
cursorflow measure --base-url http://localhost:3000 --selector "#panel"
# Measure multiple elements at once
cursorflow measure -u http://localhost:3000 -s "#panel1" -s "#panel2"
# Verify CSS changes with all properties
cursorflow measure -u http://localhost:3000 -s ".button" --verbose
AI Integration
# Install Cursor AI rules
cursorflow install-rules
# Update to latest version and rules
cursorflow update
🧠 Why This Matters
For Any Web Application:
- Trust your test results - they reflect actual behavior
- Find real performance bottlenecks - no artificial speed boosts
- Discover actual edge cases - no simulation gaps
- Debug genuine issues - real errors, real timing, real context
🌟 Framework Support
Universal Compatibility:
- Works with any web application regardless of technology
- Framework-agnostic core operations
- Smart adaptation to different environments
HMR Auto-Detection:
- ✅ Vite (port 5173)
- ✅ Webpack Dev Server (port 3000)
- ✅ Next.js (port 3000)
- ✅ Parcel (port 1234)
- ✅ Laravel Mix (port 3000)
📖 Documentation
- Usage Guide - Complete usage documentation (included in pip install)
- Examples - Practical usage examples (included in pip install)
🎪 The CursorFlow Advantage
Other Tools Say:
"We let you mock and simulate"
CursorFlow Says:
"We tell you the truth"
When you need to understand reality, choose the measurement tool - not the simulation tool.
Complete page intelligence • Real behavior measurement • AI-first design • Pure observation
Metadata
Release files for cursorflow 2.8.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cursorflow-2.8.7.tar.gz | 232.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cursorflow-2.8.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 442.8 kB
Release files / cursorflow-2.8.7.tar.gz
| Download URL | cursorflow-2.8.7.tar.gz |
|---|---|
| Size | 232.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
31175a433bcbe1403d327e28f23423bbb2ee21194c0b990d91118548b3844e0e
|
|
BLAKE2b-256 checksum How to use checksums |
6633f1476866cf19bbb7a7029729b2d0206c388206ba09e731e7d08a8b6f82ee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|
Release files / cursorflow-2.8.7-py3-none-any.whl
| Download URL | cursorflow-2.8.7-py3-none-any.whl |
|---|---|
| Size | 210.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e7a0654c32b105612eea71babbc19829f72747c348afa69a8a773d97b98534a8
|
|
BLAKE2b-256 checksum How to use checksums |
e5689882fa405184d7f3e1361c566729e3e3c4ce0a07d83a414d3749bfa91683
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.7
|