cursorflow 2.2.0__tar.gz → 2.2.2__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.2.0 → cursorflow-2.2.2}/PKG-INFO +1 -1
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/__init__.py +1 -1
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/cli.py +50 -4
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/browser_controller.py +25 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/pyproject.toml +1 -1
- {cursorflow-2.2.0 → cursorflow-2.2.2}/FIRST_TIME_SETUP.md +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/LICENSE +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/MANIFEST.in +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/POST_INSTALL_MESSAGE.txt +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/README.md +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/auto_init.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/auto_updater.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/action_validator.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/agent.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/auth_handler.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/browser_engine.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/config_validator.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/css_iterator.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/cursor_integration.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/cursorflow.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/error_context_collector.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/error_correlator.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/event_correlator.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/file_change_monitor.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/hmr_detector.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/log_collector.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/log_monitor.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/mockup_comparator.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/persistent_session.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/report_generator.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/core/trace_manager.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/install_cursorflow_rules.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/log_sources/local_file.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/log_sources/ssh_remote.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/post_install.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/rules/__init__.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/rules/cursorflow-installation.mdc +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/rules/cursorflow-usage.mdc +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow/updater.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/cursorflow.egg-info/SOURCES.txt +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/docs/USER_MANUAL.md +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/examples/comprehensive_screenshot_example.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/examples/enhanced_screenshot_example.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/examples/mockup_comparison_example.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/examples/opensas_example.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/examples/react_example.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/examples/responsive_testing_example.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/examples/v2_comprehensive_demo.py +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/setup.cfg +0 -0
- {cursorflow-2.2.0 → cursorflow-2.2.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: cursorflow
|
3
|
-
Version: 2.2.
|
3
|
+
Version: 2.2.2
|
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
|
@@ -9,6 +9,7 @@ import click
|
|
9
9
|
import asyncio
|
10
10
|
import json
|
11
11
|
import os
|
12
|
+
import time
|
12
13
|
from pathlib import Path
|
13
14
|
from typing import Dict
|
14
15
|
from rich.console import Console
|
@@ -32,6 +33,9 @@ def main(ctx):
|
|
32
33
|
if ctx.invoked_subcommand in skip_init_check:
|
33
34
|
return
|
34
35
|
|
36
|
+
# Check for version mismatch and auto-update rules
|
37
|
+
_check_and_update_rules_if_needed()
|
38
|
+
|
35
39
|
# Check if project is initialized, offer to auto-initialize
|
36
40
|
from .auto_init import is_project_initialized, auto_initialize_if_needed
|
37
41
|
|
@@ -86,13 +90,13 @@ def main(ctx):
|
|
86
90
|
help='Timeout in seconds for wait operations')
|
87
91
|
@click.option('--wait-for-network-idle', is_flag=True,
|
88
92
|
help='Wait for network to be idle (no requests for 2s)')
|
89
|
-
@click.option('--click',
|
93
|
+
@click.option('--click', multiple=True,
|
90
94
|
help='Click element by selector (can specify multiple)')
|
91
|
-
@click.option('--hover',
|
95
|
+
@click.option('--hover', multiple=True,
|
92
96
|
help='Hover over element by selector')
|
93
|
-
@click.option('--fill',
|
97
|
+
@click.option('--fill', multiple=True,
|
94
98
|
help='Fill input field. Format: selector=value')
|
95
|
-
@click.option('--screenshot',
|
99
|
+
@click.option('--screenshot', multiple=True,
|
96
100
|
help='Capture screenshot with name')
|
97
101
|
@click.option('--open-trace', is_flag=True,
|
98
102
|
help='Automatically open Playwright trace viewer after test')
|
@@ -1064,5 +1068,47 @@ def display_smoke_test_summary(results: Dict):
|
|
1064
1068
|
|
1065
1069
|
console.print(table)
|
1066
1070
|
|
1071
|
+
def _check_and_update_rules_if_needed():
|
1072
|
+
"""
|
1073
|
+
Auto-update Cursor rules when package version changes
|
1074
|
+
|
1075
|
+
Silently updates rules to match installed package version
|
1076
|
+
"""
|
1077
|
+
try:
|
1078
|
+
# Check if project has rules installed
|
1079
|
+
rules_dir = Path('.cursor/rules')
|
1080
|
+
if not rules_dir.exists():
|
1081
|
+
return # Not initialized yet
|
1082
|
+
|
1083
|
+
# Check version file
|
1084
|
+
version_file = Path('.cursorflow/version_info.json')
|
1085
|
+
if not version_file.exists():
|
1086
|
+
return # No version tracking
|
1087
|
+
|
1088
|
+
# Compare versions
|
1089
|
+
import json
|
1090
|
+
with open(version_file, 'r') as f:
|
1091
|
+
version_info = json.load(f)
|
1092
|
+
|
1093
|
+
installed_version = version_info.get('installed_version', '0.0.0')
|
1094
|
+
current_version = __version__
|
1095
|
+
|
1096
|
+
# If versions don't match, auto-update rules
|
1097
|
+
if installed_version != current_version:
|
1098
|
+
from .install_cursorflow_rules import install_cursorflow_rules
|
1099
|
+
|
1100
|
+
# Silent update
|
1101
|
+
import logging
|
1102
|
+
logger = logging.getLogger(__name__)
|
1103
|
+
logger.info(f"Auto-updating Cursor rules: {installed_version} → {current_version}")
|
1104
|
+
|
1105
|
+
install_cursorflow_rules('.', force=False)
|
1106
|
+
|
1107
|
+
except Exception as e:
|
1108
|
+
# Silent failure - don't break user's workflow
|
1109
|
+
import logging
|
1110
|
+
logging.getLogger(__name__).debug(f"Rules auto-update skipped: {e}")
|
1111
|
+
|
1112
|
+
|
1067
1113
|
if __name__ == '__main__':
|
1068
1114
|
main()
|
@@ -1798,6 +1798,31 @@ class BrowserController:
|
|
1798
1798
|
return selectors;
|
1799
1799
|
}
|
1800
1800
|
|
1801
|
+
// Phase 2.1: Event Handler Capture
|
1802
|
+
function getEventHandlers(element) {
|
1803
|
+
const handlers = {};
|
1804
|
+
|
1805
|
+
// Common event handler attributes
|
1806
|
+
const eventAttributes = [
|
1807
|
+
'onclick', 'ondblclick', 'onmousedown', 'onmouseup',
|
1808
|
+
'onmouseover', 'onmouseout', 'onmousemove', 'onmouseenter', 'onmouseleave',
|
1809
|
+
'onkeydown', 'onkeyup', 'onkeypress',
|
1810
|
+
'onsubmit', 'onchange', 'oninput', 'onfocus', 'onblur',
|
1811
|
+
'onload', 'onerror', 'onabort',
|
1812
|
+
'ontouchstart', 'ontouchend', 'ontouchmove',
|
1813
|
+
'ondrag', 'ondrop', 'ondragover', 'ondragstart', 'ondragend'
|
1814
|
+
];
|
1815
|
+
|
1816
|
+
eventAttributes.forEach(attr => {
|
1817
|
+
const handler = element.getAttribute(attr);
|
1818
|
+
if (handler) {
|
1819
|
+
handlers[attr] = handler;
|
1820
|
+
}
|
1821
|
+
});
|
1822
|
+
|
1823
|
+
return Object.keys(handlers).length > 0 ? handlers : null;
|
1824
|
+
}
|
1825
|
+
|
1801
1826
|
// Enhanced accessibility analysis
|
1802
1827
|
function getAccessibilityData(element) {
|
1803
1828
|
return {
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "cursorflow"
|
7
|
-
version = "2.2.
|
7
|
+
version = "2.2.2"
|
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
|