cursorflow 2.3.3__tar.gz → 2.4.0__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.3.3 → cursorflow-2.4.0}/PKG-INFO +1 -1
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/cli.py +2 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/browser_controller.py +39 -48
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/cursorflow.py +1 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/pyproject.toml +2 -2
- {cursorflow-2.3.3 → cursorflow-2.4.0}/LICENSE +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/MANIFEST.in +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/README.md +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/__init__.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/auto_init.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/auto_updater.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/action_validator.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/agent.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/auth_handler.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/browser_engine.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/config_validator.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/css_iterator.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/cursor_integration.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/error_context_collector.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/error_correlator.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/event_correlator.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/file_change_monitor.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/hmr_detector.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/log_collector.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/log_monitor.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/mockup_comparator.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/persistent_session.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/report_generator.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/core/trace_manager.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/install_cursorflow_rules.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/log_sources/local_file.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/log_sources/ssh_remote.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/post_install.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/rules/__init__.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/rules/cursorflow-installation.mdc +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/rules/cursorflow-usage.mdc +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow/updater.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/cursorflow.egg-info/SOURCES.txt +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/docs/user/USAGE_GUIDE.md +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/examples/comprehensive_screenshot_example.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/examples/element_inspection_example.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/examples/element_measurement_example.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/examples/enhanced_screenshot_example.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/examples/hot_reload_css_iteration.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/examples/mockup_comparison_example.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/examples/opensas_example.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/examples/react_example.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/examples/responsive_testing_example.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/examples/v2_comprehensive_demo.py +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/setup.cfg +0 -0
- {cursorflow-2.3.3 → cursorflow-2.4.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: cursorflow
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.4.0
|
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
|
@@ -801,6 +801,7 @@ def inspect(base_url, path, selector, verbose):
|
|
801
801
|
)
|
802
802
|
|
803
803
|
# Comprehensive inspection with full data capture
|
804
|
+
# v2.1: Captures ALL visible elements automatically
|
804
805
|
console.print("📸 Capturing comprehensive page data...")
|
805
806
|
results = asyncio.run(flow.execute_and_collect([
|
806
807
|
{"navigate": path},
|
@@ -996,6 +997,7 @@ def measure(base_url, path, selector, verbose):
|
|
996
997
|
selectors_list = list(selector)
|
997
998
|
|
998
999
|
# Execute with screenshot to get comprehensive data
|
1000
|
+
# v2.1: Captures ALL visible elements automatically
|
999
1001
|
results = asyncio.run(flow.execute_and_collect([
|
1000
1002
|
{"navigate": path},
|
1001
1003
|
{"wait_for_selector": "body"},
|
@@ -550,7 +550,7 @@ class BrowserController:
|
|
550
550
|
}
|
551
551
|
|
552
552
|
if capture_comprehensive_data:
|
553
|
-
# Capture comprehensive page analysis
|
553
|
+
# Capture comprehensive page analysis (ALL visible elements)
|
554
554
|
comprehensive_data = await self._capture_comprehensive_page_analysis()
|
555
555
|
|
556
556
|
# Save comprehensive data alongside screenshot
|
@@ -1122,9 +1122,13 @@ class BrowserController:
|
|
1122
1122
|
return failed
|
1123
1123
|
|
1124
1124
|
async def _capture_comprehensive_page_analysis(self) -> Dict[str, Any]:
|
1125
|
-
"""
|
1125
|
+
"""
|
1126
|
+
Enhanced comprehensive page analysis with v2.0 features: fonts, animations, resources, storage
|
1127
|
+
|
1128
|
+
v2.1: Now captures ALL visible elements - truly comprehensive, no hardcoded limits.
|
1129
|
+
"""
|
1126
1130
|
try:
|
1127
|
-
# Capture DOM analysis
|
1131
|
+
# Capture DOM analysis (ALL visible elements)
|
1128
1132
|
dom_analysis = await self._capture_dom_analysis()
|
1129
1133
|
|
1130
1134
|
# Capture current network state
|
@@ -1684,7 +1688,12 @@ class BrowserController:
|
|
1684
1688
|
}
|
1685
1689
|
|
1686
1690
|
async def _capture_dom_analysis(self) -> Dict[str, Any]:
|
1687
|
-
"""
|
1691
|
+
"""
|
1692
|
+
Enhanced DOM analysis with multi-selector strategies and accessibility data (v2.0)
|
1693
|
+
|
1694
|
+
Captures ALL visible elements on the page - truly comprehensive analysis.
|
1695
|
+
No hardcoded selector limits, no artificial filtering.
|
1696
|
+
"""
|
1688
1697
|
try:
|
1689
1698
|
dom_analysis = await self.page.evaluate("""
|
1690
1699
|
() => {
|
@@ -2022,46 +2031,29 @@ class BrowserController:
|
|
2022
2031
|
};
|
2023
2032
|
}
|
2024
2033
|
|
2025
|
-
// Get
|
2034
|
+
// Get ALL visible elements - truly comprehensive analysis
|
2026
2035
|
const elements = [];
|
2027
|
-
const selectors = [
|
2028
|
-
// Structural elements
|
2029
|
-
'body', 'main', 'header', 'nav', 'aside', 'footer', 'section', 'article',
|
2030
|
-
// Common containers
|
2031
|
-
'.container', '.wrapper', '.content', '.sidebar', '.header', '.footer',
|
2032
|
-
'.navbar', '.nav', '.menu', '.main', '.page', '.app', '.layout',
|
2033
|
-
// Interactive elements
|
2034
|
-
'button', '.btn', '.button', 'a', '.link', 'input', 'form', '.form',
|
2035
|
-
'select', 'textarea', '.input', '.field',
|
2036
|
-
// Content elements
|
2037
|
-
'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', '.title', '.heading',
|
2038
|
-
'.text', '.content', '.description',
|
2039
|
-
// Layout elements
|
2040
|
-
'.row', '.col', '.column', '.grid', '.flex', '.card', '.panel',
|
2041
|
-
'.box', '.item', '.component',
|
2042
|
-
// Common UI components
|
2043
|
-
'.modal', '.dropdown', '.tooltip', '.alert', '.badge', '.tab',
|
2044
|
-
'.table', '.list', '.menu-item'
|
2045
|
-
];
|
2046
2036
|
|
2047
|
-
|
2037
|
+
// Query EVERY element on the page (true comprehensive capture)
|
2038
|
+
const allElements = document.querySelectorAll('*');
|
2039
|
+
|
2040
|
+
allElements.forEach((element, globalIndex) => {
|
2048
2041
|
try {
|
2049
|
-
|
2050
|
-
|
2051
|
-
|
2042
|
+
const computedStyles = getComputedStylesDetailed(element);
|
2043
|
+
const visualContext = getVisualContext(element, computedStyles);
|
2044
|
+
|
2045
|
+
// Only include elements with meaningful size OR important semantic meaning
|
2046
|
+
// This filters out invisible helper elements but keeps everything visible
|
2047
|
+
if (visualContext.bounding_box.width > 0 && visualContext.bounding_box.height > 0 ||
|
2048
|
+
['HTML', 'BODY', 'HEAD', 'HEADER', 'NAV', 'MAIN', 'ASIDE', 'FOOTER'].includes(element.tagName)) {
|
2052
2049
|
|
2053
|
-
|
2054
|
-
|
2055
|
-
|
2056
|
-
|
2057
|
-
|
2058
|
-
|
2059
|
-
|
2060
|
-
index: index,
|
2061
|
-
tagName: element.tagName.toLowerCase(),
|
2062
|
-
id: element.id || null,
|
2063
|
-
className: element.className || null,
|
2064
|
-
textContent: element.textContent ? element.textContent.trim().substring(0, 200) : null,
|
2050
|
+
elements.push({
|
2051
|
+
// Basic element info
|
2052
|
+
index: globalIndex,
|
2053
|
+
tagName: element.tagName.toLowerCase(),
|
2054
|
+
id: element.id || null,
|
2055
|
+
className: element.className || null,
|
2056
|
+
textContent: element.textContent ? element.textContent.trim().substring(0, 200) : null,
|
2065
2057
|
|
2066
2058
|
// v2.0 Enhancement: Multiple selector strategies
|
2067
2059
|
selectors: generateMultipleSelectors(element),
|
@@ -2084,14 +2076,13 @@ class BrowserController:
|
|
2084
2076
|
return attrs;
|
2085
2077
|
}, {}),
|
2086
2078
|
|
2087
|
-
|
2088
|
-
|
2089
|
-
|
2090
|
-
|
2091
|
-
|
2092
|
-
});
|
2079
|
+
// Element hierarchy info
|
2080
|
+
childrenCount: element.children.length,
|
2081
|
+
parentTagName: element.parentElement ? element.parentElement.tagName.toLowerCase() : null
|
2082
|
+
});
|
2083
|
+
}
|
2093
2084
|
} catch (e) {
|
2094
|
-
|
2085
|
+
// Skip elements that fail to analyze (e.g., detached nodes, iframes)
|
2095
2086
|
}
|
2096
2087
|
});
|
2097
2088
|
|
@@ -2166,7 +2157,7 @@ class BrowserController:
|
|
2166
2157
|
elements: elements,
|
2167
2158
|
totalElements: elements.length,
|
2168
2159
|
captureTimestamp: Date.now(),
|
2169
|
-
analysisVersion: "2.
|
2160
|
+
analysisVersion: "2.1" // v2.1: Truly comprehensive (ALL elements)
|
2170
2161
|
};
|
2171
2162
|
}
|
2172
2163
|
""")
|
@@ -736,6 +736,7 @@ class CursorFlow:
|
|
736
736
|
name = "screenshot"
|
737
737
|
options = None
|
738
738
|
|
739
|
+
# v2.1: No need for additional_selectors - we capture ALL visible elements now
|
739
740
|
screenshot_data = await self.browser.screenshot(name, options)
|
740
741
|
self.artifacts["screenshots"].append(screenshot_data)
|
741
742
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "cursorflow"
|
7
|
-
version = "2.
|
7
|
+
version = "2.4.0"
|
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"}
|
@@ -72,6 +72,6 @@ line-length = 88
|
|
72
72
|
target-version = ['py38']
|
73
73
|
|
74
74
|
[tool.mypy]
|
75
|
-
python_version = "2.
|
75
|
+
python_version = "2.4.0"
|
76
76
|
warn_return_any = true
|
77
77
|
warn_unused_configs = true
|
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
|