cursorflow 2.2.1__py3-none-any.whl → 2.2.3__py3-none-any.whl

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/__init__.py CHANGED
@@ -56,7 +56,7 @@ def _get_version():
56
56
  pass
57
57
 
58
58
  # Fallback version - should match pyproject.toml
59
- return "2.2.1"
59
+ return "2.2.3"
60
60
 
61
61
  __version__ = _get_version()
62
62
  __author__ = "GeekWarrior Development"
cursorflow/cli.py CHANGED
@@ -33,6 +33,9 @@ def main(ctx):
33
33
  if ctx.invoked_subcommand in skip_init_check:
34
34
  return
35
35
 
36
+ # Check for version mismatch and auto-update rules
37
+ _check_and_update_rules_if_needed()
38
+
36
39
  # Check if project is initialized, offer to auto-initialize
37
40
  from .auto_init import is_project_initialized, auto_initialize_if_needed
38
41
 
@@ -87,6 +90,8 @@ def main(ctx):
87
90
  help='Timeout in seconds for wait operations')
88
91
  @click.option('--wait-for-network-idle', is_flag=True,
89
92
  help='Wait for network to be idle (no requests for 2s)')
93
+ @click.option('--wait', type=float,
94
+ help='Wait for specified seconds before continuing')
90
95
  @click.option('--click', multiple=True,
91
96
  help='Click element by selector (can specify multiple)')
92
97
  @click.option('--hover', multiple=True,
@@ -104,7 +109,7 @@ def main(ctx):
104
109
  @click.option('--quiet', '-q', is_flag=True,
105
110
  help='Minimal output, JSON results only')
106
111
  def test(base_url, path, actions, output, logs, config, verbose, headless, timeout, responsive,
107
- save_session, use_session, wait_for, wait_timeout, wait_for_network_idle,
112
+ save_session, use_session, wait_for, wait_timeout, wait_for_network_idle, wait,
108
113
  click, hover, fill, screenshot, open_trace, show_console, show_all_console, quiet):
109
114
  """
110
115
  Test UI flows and interactions with real-time log monitoring
@@ -146,6 +151,8 @@ def test(base_url, path, actions, output, logs, config, verbose, headless, timeo
146
151
  test_actions.append({"navigate": path})
147
152
 
148
153
  # Wait options
154
+ if wait:
155
+ test_actions.append({"wait_for_timeout": int(wait * 1000)})
149
156
  if wait_for:
150
157
  test_actions.append({"wait_for_selector": wait_for})
151
158
  if wait_for_network_idle:
@@ -1065,5 +1072,47 @@ def display_smoke_test_summary(results: Dict):
1065
1072
 
1066
1073
  console.print(table)
1067
1074
 
1075
+ def _check_and_update_rules_if_needed():
1076
+ """
1077
+ Auto-update Cursor rules when package version changes
1078
+
1079
+ Silently updates rules to match installed package version
1080
+ """
1081
+ try:
1082
+ # Check if project has rules installed
1083
+ rules_dir = Path('.cursor/rules')
1084
+ if not rules_dir.exists():
1085
+ return # Not initialized yet
1086
+
1087
+ # Check version file
1088
+ version_file = Path('.cursorflow/version_info.json')
1089
+ if not version_file.exists():
1090
+ return # No version tracking
1091
+
1092
+ # Compare versions
1093
+ import json
1094
+ with open(version_file, 'r') as f:
1095
+ version_info = json.load(f)
1096
+
1097
+ installed_version = version_info.get('installed_version', '0.0.0')
1098
+ current_version = __version__
1099
+
1100
+ # If versions don't match, auto-update rules
1101
+ if installed_version != current_version:
1102
+ from .install_cursorflow_rules import install_cursorflow_rules
1103
+
1104
+ # Silent update
1105
+ import logging
1106
+ logger = logging.getLogger(__name__)
1107
+ logger.info(f"Auto-updating Cursor rules: {installed_version} → {current_version}")
1108
+
1109
+ install_cursorflow_rules('.', force=False)
1110
+
1111
+ except Exception as e:
1112
+ # Silent failure - don't break user's workflow
1113
+ import logging
1114
+ logging.getLogger(__name__).debug(f"Rules auto-update skipped: {e}")
1115
+
1116
+
1068
1117
  if __name__ == '__main__':
1069
1118
  main()
@@ -1313,7 +1313,7 @@ class BrowserController:
1313
1313
  const animInfo = {
1314
1314
  element_selector: element.tagName.toLowerCase() +
1315
1315
  (element.id ? '#' + element.id : '') +
1316
- (element.className ? '.' + element.className.split(' ').join('.') : ''),
1316
+ (element.className && typeof element.className === 'string' ? '.' + element.className.split(' ').join('.') : ''),
1317
1317
  animation_name: animation.animationName || 'transition',
1318
1318
  duration: animation.effect?.getTiming?.()?.duration || 0,
1319
1319
  delay: animation.effect?.getTiming?.()?.delay || 0,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cursorflow
3
- Version: 2.2.1
3
+ Version: 2.2.3
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
@@ -1,14 +1,14 @@
1
- cursorflow/__init__.py,sha256=3szUCSDj7rxLr4NkfDoXWq7BWqMf7__8vTFg15LWcXo,2763
1
+ cursorflow/__init__.py,sha256=x8fOUcON6ZcxoWYy_Yut_iNdcNLasE3Kb2sanysnmMk,2763
2
2
  cursorflow/auto_init.py,sha256=dXQaXXiXe4wkUP-jd8fcJ5fYVt7ASdTb47b7SzXymOM,6122
3
3
  cursorflow/auto_updater.py,sha256=oQ12TIMZ6Cm3HF-x9iRWFtvOLkRh-JWPqitS69-4roE,7851
4
- cursorflow/cli.py,sha256=qSungpsi9OgL55w-LqgmGj-S7eJhfJq7ve_QwSoSEhI,43588
4
+ cursorflow/cli.py,sha256=2e1582m3QBqNlrfEDYN2_7UETWxxJZHU8XXGQS0q9Rw,45348
5
5
  cursorflow/install_cursorflow_rules.py,sha256=DsZ0680y9JMuTKFXjdgYtOKIEAjBMsdwL8LmA9WEb5A,11864
6
6
  cursorflow/post_install.py,sha256=WieBiKWG0qBAQpF8iMVWUyb9Fr2Xky9qECTMPrlAbpE,2678
7
7
  cursorflow/updater.py,sha256=SroSQHQi5cYyzcOK_bf-WzmQmE7yeOs8qo3r__j-Z6E,19583
8
8
  cursorflow/core/action_validator.py,sha256=SCk3w_62D1y0cCRDOajK8L44-abSj_KpnUBgR_yNVW4,6846
9
9
  cursorflow/core/agent.py,sha256=f3lecgEzDRDdGTVccAtorpLGfNJJ49bbsQAmgr0vNGg,10136
10
10
  cursorflow/core/auth_handler.py,sha256=oRafO6ZdxoHryBIvHsrNV8TECed4GXpJsdEiH0KdPPk,17149
11
- cursorflow/core/browser_controller.py,sha256=jA3zmdULJb4FLn3pS3zlK5RmbpRK8k4UVgwiVM6_pts,146990
11
+ cursorflow/core/browser_controller.py,sha256=GLAdXP4JiMm27cNjpF_LyB8xV82Mo4_ZH56AC7hYpSs,147031
12
12
  cursorflow/core/browser_engine.py,sha256=7N9hPOyDrEhLWYgZW2981N9gKlHF6Lbp7D7h0zBzuz8,14851
13
13
  cursorflow/core/config_validator.py,sha256=HRtONSOmM0Xxt3-ok3xwnBADRiNnI0nNOMaS2OqOkDk,7286
14
14
  cursorflow/core/css_iterator.py,sha256=whLCIwbHZEWaH1HCbmqhNX5zrh_fL-r3hsxKjYsukcE,16478
@@ -30,9 +30,9 @@ cursorflow/log_sources/ssh_remote.py,sha256=kZRpLpiO7cLd67wlCiTvz4Prwx1_Vu3ytB5K
30
30
  cursorflow/rules/__init__.py,sha256=gPcA-IkhXj03sl7cvZV0wwo7CtEkcyuKs4y0F5oQbqE,458
31
31
  cursorflow/rules/cursorflow-installation.mdc,sha256=D55pzzDPAVVbE3gAtKPUGoT-2fvB-FI2l6yrTdzUIEo,10208
32
32
  cursorflow/rules/cursorflow-usage.mdc,sha256=hCbA9koCtRoeLOkB-PXmLlGzsag_15RuOveOE_R4JZ0,21628
33
- cursorflow-2.2.1.dist-info/licenses/LICENSE,sha256=e4QbjAsj3bW-xgQOvQelr8sGLYDoqc48k6cKgCr_pBU,1080
34
- cursorflow-2.2.1.dist-info/METADATA,sha256=gnoZ9OAIuFBdOyJ9Kcow_yIB4kGQwTt4G7KD6nkWxcQ,14014
35
- cursorflow-2.2.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
36
- cursorflow-2.2.1.dist-info/entry_points.txt,sha256=-Ed_n4Uff7wClEtWS-Py6xmQabecB9f0QAOjX0w7ljA,51
37
- cursorflow-2.2.1.dist-info/top_level.txt,sha256=t1UZwRyZP4u-ng2CEcNHmk_ZT4ibQxoihB2IjTF7ovc,11
38
- cursorflow-2.2.1.dist-info/RECORD,,
33
+ cursorflow-2.2.3.dist-info/licenses/LICENSE,sha256=e4QbjAsj3bW-xgQOvQelr8sGLYDoqc48k6cKgCr_pBU,1080
34
+ cursorflow-2.2.3.dist-info/METADATA,sha256=N7WonXzbDp99DIxqDLQTbxc_iITk2GlSPb2XhOjXfH4,14014
35
+ cursorflow-2.2.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
36
+ cursorflow-2.2.3.dist-info/entry_points.txt,sha256=-Ed_n4Uff7wClEtWS-Py6xmQabecB9f0QAOjX0w7ljA,51
37
+ cursorflow-2.2.3.dist-info/top_level.txt,sha256=t1UZwRyZP4u-ng2CEcNHmk_ZT4ibQxoihB2IjTF7ovc,11
38
+ cursorflow-2.2.3.dist-info/RECORD,,