cursorflow 2.7.8__tar.gz → 2.7.9__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.7.8 → cursorflow-2.7.9}/PKG-INFO +4 -1
- {cursorflow-2.7.8 → cursorflow-2.7.9}/README.md +3 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/cli.py +55 -10
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/rules/cursorflow-usage.mdc +3 -1
- {cursorflow-2.7.8 → cursorflow-2.7.9}/docs/user/USAGE_GUIDE.md +43 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/pyproject.toml +1 -1
- {cursorflow-2.7.8 → cursorflow-2.7.9}/LICENSE +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/MANIFEST.in +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/__init__.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/auto_init.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/auto_updater.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/action_validator.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/agent.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/auth_handler.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/browser_controller.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/browser_engine.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/config_validator.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/css_iterator.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/cursor_integration.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/cursorflow.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/data_presenter.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/error_context_collector.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/error_correlator.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/event_correlator.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/file_change_monitor.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/hmr_detector.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/json_utils.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/log_collector.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/log_monitor.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/mockup_comparator.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/output_manager.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/persistent_session.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/query_engine.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/report_generator.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/core/trace_manager.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/install_cursorflow_rules.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/log_sources/local_file.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/log_sources/ssh_remote.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/post_install.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/rules/__init__.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/rules/cursorflow-installation.mdc +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow/updater.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/cursorflow.egg-info/SOURCES.txt +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/examples/comprehensive_screenshot_example.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/examples/element_inspection_example.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/examples/element_measurement_example.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/examples/enhanced_screenshot_example.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/examples/hot_reload_css_iteration.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/examples/mockup_comparison_example.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/examples/opensas_example.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/examples/react_example.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/examples/responsive_testing_example.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/examples/v2_comprehensive_demo.py +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/setup.cfg +0 -0
- {cursorflow-2.7.8 → cursorflow-2.7.9}/setup.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: cursorflow
|
3
|
-
Version: 2.7.
|
3
|
+
Version: 2.7.9
|
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
|
@@ -184,6 +184,7 @@ cursorflow test --use-session "user" \
|
|
184
184
|
# Capture SSO auth (opens browser for manual login)
|
185
185
|
cursorflow capture-auth --base-url http://localhost:3000 \
|
186
186
|
--path /dashboard \
|
187
|
+
--browser chrome \
|
187
188
|
--output google-sso.json
|
188
189
|
|
189
190
|
# Use captured auth
|
@@ -191,6 +192,8 @@ cursorflow capture-auth --base-url http://localhost:3000 \
|
|
191
192
|
cursorflow test --use-session "sso-user" --path /dashboard
|
192
193
|
```
|
193
194
|
|
195
|
+
**Tip:** Use `--browser chrome` on macOS for better window visibility
|
196
|
+
|
194
197
|
**See:** [Complete Authentication Guide](docs/user/USAGE_GUIDE.md#authentication--session-management)
|
195
198
|
|
196
199
|
---
|
@@ -139,6 +139,7 @@ cursorflow test --use-session "user" \
|
|
139
139
|
# Capture SSO auth (opens browser for manual login)
|
140
140
|
cursorflow capture-auth --base-url http://localhost:3000 \
|
141
141
|
--path /dashboard \
|
142
|
+
--browser chrome \
|
142
143
|
--output google-sso.json
|
143
144
|
|
144
145
|
# Use captured auth
|
@@ -146,6 +147,8 @@ cursorflow capture-auth --base-url http://localhost:3000 \
|
|
146
147
|
cursorflow test --use-session "sso-user" --path /dashboard
|
147
148
|
```
|
148
149
|
|
150
|
+
**Tip:** Use `--browser chrome` on macOS for better window visibility
|
151
|
+
|
149
152
|
**See:** [Complete Authentication Guide](docs/user/USAGE_GUIDE.md#authentication--session-management)
|
150
153
|
|
151
154
|
---
|
@@ -1121,7 +1121,8 @@ def sessions(subcommand, name):
|
|
1121
1121
|
@click.option('--path', '-p', default='/', help='Path to navigate to after login (e.g., /dashboard)')
|
1122
1122
|
@click.option('--output', '-o', default='auth-capture.json', help='Output file for captured auth state')
|
1123
1123
|
@click.option('--wait', type=int, default=60, help='Seconds to wait for manual login (default: 60)')
|
1124
|
-
|
1124
|
+
@click.option('--browser', type=click.Choice(['chromium', 'chrome', 'firefox']), default='chromium', help='Browser to use (default: chromium)')
|
1125
|
+
def capture_auth(base_url, path, output, wait, browser):
|
1125
1126
|
"""
|
1126
1127
|
Capture authentication state after manual SSO/OAuth login
|
1127
1128
|
|
@@ -1143,25 +1144,30 @@ def capture_auth(base_url, path, output, wait):
|
|
1143
1144
|
# Capture Google SSO auth
|
1144
1145
|
cursorflow capture-auth --base-url http://localhost:3000 --path /dashboard
|
1145
1146
|
|
1147
|
+
# Use system Chrome (more visible on macOS)
|
1148
|
+
cursorflow capture-auth -u http://localhost:3000 --browser chrome
|
1149
|
+
|
1146
1150
|
# Capture with custom wait time
|
1147
1151
|
cursorflow capture-auth -u http://localhost:3000 -p /dashboard --wait 120
|
1148
1152
|
|
1149
1153
|
# Save to custom file
|
1150
1154
|
cursorflow capture-auth -u http://localhost:3000 --output google-sso.json
|
1151
1155
|
"""
|
1152
|
-
console.print(f"\n🔐 SSO Authentication Capture")
|
1156
|
+
console.print(f"\n🔐 [bold]SSO Authentication Capture[/bold]")
|
1153
1157
|
console.print(f"📍 Base URL: [cyan]{base_url}[/cyan]")
|
1154
1158
|
console.print(f"🎯 Target path: [cyan]{path}[/cyan]")
|
1155
1159
|
console.print(f"⏱️ Wait time: [yellow]{wait}[/yellow] seconds")
|
1156
1160
|
console.print(f"📄 Output file: [green]{output}[/green]\n")
|
1157
1161
|
|
1158
|
-
console.print("📋 [bold]Instructions:[/bold]")
|
1159
|
-
console.print(" 1.
|
1160
|
-
console.print(" 2. [yellow]Complete SSO login manually[/yellow]
|
1162
|
+
console.print("📋 [bold yellow]Instructions:[/bold yellow]")
|
1163
|
+
console.print(" 1. [bold]A Chromium browser window will open[/bold]")
|
1164
|
+
console.print(" 2. [yellow]Complete SSO login manually[/yellow] in that browser window")
|
1161
1165
|
console.print(" 3. Navigate to a protected page (e.g., /dashboard)")
|
1162
|
-
console.print(" 4. [green]
|
1166
|
+
console.print(" 4. Return here and [green]press Enter[/green] when fully logged in")
|
1163
1167
|
console.print(" 5. CursorFlow will capture all auth state\n")
|
1164
1168
|
|
1169
|
+
console.print("[bold red]⚠️ Look for the browser window - it may open behind other windows![/bold red]\n")
|
1170
|
+
|
1165
1171
|
input("Press Enter to open browser and start capture...")
|
1166
1172
|
|
1167
1173
|
try:
|
@@ -1169,14 +1175,53 @@ def capture_auth(base_url, path, output, wait):
|
|
1169
1175
|
import json
|
1170
1176
|
|
1171
1177
|
async def capture_process():
|
1178
|
+
console.print("\n🚀 Starting Playwright...")
|
1172
1179
|
async with async_playwright() as p:
|
1180
|
+
# Select browser based on user choice
|
1181
|
+
if browser == 'chrome':
|
1182
|
+
browser_type = p.chromium
|
1183
|
+
channel = 'chrome' # Use system Chrome if available
|
1184
|
+
elif browser == 'firefox':
|
1185
|
+
browser_type = p.firefox
|
1186
|
+
channel = None
|
1187
|
+
else: # chromium
|
1188
|
+
browser_type = p.chromium
|
1189
|
+
channel = None
|
1190
|
+
|
1173
1191
|
# Launch browser in HEADED mode (user needs to interact)
|
1174
|
-
browser
|
1175
|
-
|
1192
|
+
console.print(f"🌐 Launching [bold]{browser}[/bold] browser (headed mode)...")
|
1193
|
+
console.print("[yellow]👀 Watch for browser window - it should appear shortly...[/yellow]")
|
1194
|
+
|
1195
|
+
try:
|
1196
|
+
launch_options = {
|
1197
|
+
'headless': False,
|
1198
|
+
'slow_mo': 50,
|
1199
|
+
'args': ['--start-maximized']
|
1200
|
+
}
|
1201
|
+
if channel:
|
1202
|
+
launch_options['channel'] = channel
|
1203
|
+
|
1204
|
+
browser_instance = await browser_type.launch(**launch_options)
|
1205
|
+
except Exception as e:
|
1206
|
+
console.print(f"[red]❌ Failed to launch browser: {e}[/red]")
|
1207
|
+
console.print("\n💡 Try installing Chromium:")
|
1208
|
+
console.print(" [cyan]playwright install chromium[/cyan]")
|
1209
|
+
raise
|
1210
|
+
|
1211
|
+
# Create context with viewport to ensure it's visible
|
1212
|
+
context = await browser_instance.new_context(
|
1213
|
+
viewport={'width': 1280, 'height': 720}
|
1214
|
+
)
|
1176
1215
|
page = await context.new_page()
|
1177
1216
|
|
1178
|
-
|
1217
|
+
# Bring page to front
|
1218
|
+
await page.bring_to_front()
|
1219
|
+
|
1220
|
+
console.print(f"\n✅ [bold green]Browser window opened![/bold green]")
|
1221
|
+
console.print(f" 👉 [bold]If you don't see it, check behind other windows or different desktop spaces[/bold]")
|
1222
|
+
console.print(f"\n🌐 Navigating to: [cyan]{base_url}[/cyan]...")
|
1179
1223
|
await page.goto(base_url)
|
1224
|
+
console.print(f"✅ Page loaded!")
|
1180
1225
|
|
1181
1226
|
console.print(f"\n⏳ [yellow]Complete your SSO login in the browser...[/yellow]")
|
1182
1227
|
console.print(f" Waiting up to {wait} seconds...")
|
@@ -1259,7 +1304,7 @@ def capture_auth(base_url, path, output, wait):
|
|
1259
1304
|
console.print(f'\n {{\n "auth": {{\n "method": "cookies",\n "cookies": [... paste here ...]\n }}\n }}\n')
|
1260
1305
|
console.print(f" 4. Test with: [cyan]cursorflow test --use-session sso-user[/cyan]\n")
|
1261
1306
|
|
1262
|
-
await
|
1307
|
+
await browser_instance.close()
|
1263
1308
|
|
1264
1309
|
asyncio.run(capture_process())
|
1265
1310
|
|
@@ -1084,9 +1084,11 @@ cursorflow test --actions '[
|
|
1084
1084
|
# 1. Capture SSO auth (opens browser, you login manually)
|
1085
1085
|
cursorflow capture-auth --base-url http://localhost:3000 \
|
1086
1086
|
--path /dashboard \
|
1087
|
+
--browser chrome \
|
1087
1088
|
--output google-sso.json
|
1088
1089
|
|
1089
|
-
# Browser opens
|
1090
|
+
# Browser opens (use --browser chrome for better visibility on macOS)
|
1091
|
+
# You complete SSO login, CursorFlow captures cookies
|
1090
1092
|
|
1091
1093
|
# 2. Copy cookies from google-sso.json to .cursorflow/config.json:
|
1092
1094
|
{
|
@@ -1056,6 +1056,31 @@ Clicked submit: button[type='submit']
|
|
1056
1056
|
cat .cursorflow/sessions/test_session.json | python3 -m json.tool
|
1057
1057
|
```
|
1058
1058
|
|
1059
|
+
**Problem: "Browser not appearing" (capture-auth)**
|
1060
|
+
|
1061
|
+
**Solution:**
|
1062
|
+
|
1063
|
+
The browser IS launching but may be hidden by macOS window management:
|
1064
|
+
|
1065
|
+
1. **Use system Chrome** (more visible):
|
1066
|
+
```bash
|
1067
|
+
cursorflow capture-auth --base-url http://localhost:3000 \
|
1068
|
+
--browser chrome \
|
1069
|
+
--path /dashboard
|
1070
|
+
```
|
1071
|
+
|
1072
|
+
2. **Check all desktop spaces**:
|
1073
|
+
- Press F3 or swipe up with 3 fingers (Mission Control)
|
1074
|
+
- Look for Chromium/Chrome window
|
1075
|
+
|
1076
|
+
3. **Check your Dock**:
|
1077
|
+
- Look for Chromium icon that appeared
|
1078
|
+
- Click to bring window forward
|
1079
|
+
|
1080
|
+
4. **Verify browser launched**:
|
1081
|
+
- Look for "✅ Browser opened!" in terminal output
|
1082
|
+
- If you see this, browser is running somewhere
|
1083
|
+
|
1059
1084
|
---
|
1060
1085
|
|
1061
1086
|
#### **Advanced Authentication Scenarios**
|
@@ -1161,6 +1186,12 @@ cursorflow capture-auth --base-url http://localhost:3000 \
|
|
1161
1186
|
--path /dashboard \
|
1162
1187
|
--output sso-auth.json
|
1163
1188
|
|
1189
|
+
# Use system Chrome for better visibility (recommended for macOS)
|
1190
|
+
cursorflow capture-auth --base-url http://localhost:3000 \
|
1191
|
+
--path /dashboard \
|
1192
|
+
--browser chrome \
|
1193
|
+
--output sso-auth.json
|
1194
|
+
|
1164
1195
|
# This opens a browser, lets you login, then captures:
|
1165
1196
|
# - All cookies (including third-party cookies if needed)
|
1166
1197
|
# - localStorage state
|
@@ -1168,6 +1199,18 @@ cursorflow capture-auth --base-url http://localhost:3000 \
|
|
1168
1199
|
# - Any tokens or auth data
|
1169
1200
|
```
|
1170
1201
|
|
1202
|
+
**Command Options:**
|
1203
|
+
- `--base-url`: Your application URL
|
1204
|
+
- `--path`: Page to navigate to after login (default: `/`)
|
1205
|
+
- `--output`: File to save auth state (default: `auth-capture.json`)
|
1206
|
+
- `--browser`: Browser to use - `chromium`, `chrome`, or `firefox` (default: `chromium`)
|
1207
|
+
- `--wait`: Maximum seconds to wait for login (default: `60`)
|
1208
|
+
|
1209
|
+
**Browser Visibility:**
|
1210
|
+
- Use `--browser chrome` on macOS for better window visibility
|
1211
|
+
- Browser opens maximized in headed mode
|
1212
|
+
- If you don't see it, check other desktop spaces or behind windows
|
1213
|
+
|
1171
1214
|
**Step 3: Use captured auth in config**
|
1172
1215
|
```json
|
1173
1216
|
{
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "cursorflow"
|
7
|
-
version = "2.7.
|
7
|
+
version = "2.7.9"
|
8
8
|
description = "🔥 Complete page intelligence for AI-driven development with Hot Reload Intelligence - captures DOM, network, console, performance, HMR events, and comprehensive page analysis"
|
9
9
|
authors = [
|
10
10
|
{name = "GeekWarrior Development", email = "rbush@cooltheory.com"}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|