cursorflow 2.2.2__tar.gz → 2.2.4__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.2 → cursorflow-2.2.4}/PKG-INFO +26 -1
- {cursorflow-2.2.2 → cursorflow-2.2.4}/README.md +25 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/__init__.py +1 -1
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/cli.py +113 -1
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/browser_controller.py +1 -1
- {cursorflow-2.2.2 → cursorflow-2.2.4}/pyproject.toml +1 -1
- {cursorflow-2.2.2 → cursorflow-2.2.4}/FIRST_TIME_SETUP.md +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/LICENSE +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/MANIFEST.in +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/POST_INSTALL_MESSAGE.txt +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/auto_init.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/auto_updater.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/action_validator.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/agent.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/auth_handler.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/browser_engine.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/config_validator.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/css_iterator.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/cursor_integration.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/cursorflow.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/error_context_collector.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/error_correlator.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/event_correlator.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/file_change_monitor.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/hmr_detector.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/log_collector.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/log_monitor.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/mockup_comparator.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/persistent_session.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/report_generator.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/core/trace_manager.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/install_cursorflow_rules.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/log_sources/local_file.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/log_sources/ssh_remote.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/post_install.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/rules/__init__.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/rules/cursorflow-installation.mdc +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/rules/cursorflow-usage.mdc +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow/updater.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/cursorflow.egg-info/SOURCES.txt +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/docs/USER_MANUAL.md +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/examples/comprehensive_screenshot_example.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/examples/enhanced_screenshot_example.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/examples/mockup_comparison_example.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/examples/opensas_example.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/examples/react_example.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/examples/responsive_testing_example.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/examples/v2_comprehensive_demo.py +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/setup.cfg +0 -0
- {cursorflow-2.2.2 → cursorflow-2.2.4}/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.4
|
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
|
@@ -119,6 +119,31 @@ cursorflow test --actions '[
|
|
119
119
|
|
120
120
|
---
|
121
121
|
|
122
|
+
## 🧹 Artifact Management
|
123
|
+
|
124
|
+
CursorFlow generates valuable debugging data (screenshots, traces, sessions). Manage disk space:
|
125
|
+
|
126
|
+
```bash
|
127
|
+
# Clean old artifacts (>7 days)
|
128
|
+
cursorflow cleanup --artifacts --old-only
|
129
|
+
|
130
|
+
# Clean all artifacts
|
131
|
+
cursorflow cleanup --artifacts
|
132
|
+
|
133
|
+
# Clean saved sessions
|
134
|
+
cursorflow cleanup --sessions
|
135
|
+
|
136
|
+
# Clean everything
|
137
|
+
cursorflow cleanup --all
|
138
|
+
|
139
|
+
# Preview before deleting
|
140
|
+
cursorflow cleanup --all --dry-run
|
141
|
+
```
|
142
|
+
|
143
|
+
**See:** [Artifact Cleanup Guide](docs/user/ARTIFACT_CLEANUP_GUIDE.md)
|
144
|
+
|
145
|
+
---
|
146
|
+
|
122
147
|
## 🚀 Complete Page Intelligence
|
123
148
|
|
124
149
|
Every test captures everything needed for debugging:
|
@@ -74,6 +74,31 @@ cursorflow test --actions '[
|
|
74
74
|
|
75
75
|
---
|
76
76
|
|
77
|
+
## 🧹 Artifact Management
|
78
|
+
|
79
|
+
CursorFlow generates valuable debugging data (screenshots, traces, sessions). Manage disk space:
|
80
|
+
|
81
|
+
```bash
|
82
|
+
# Clean old artifacts (>7 days)
|
83
|
+
cursorflow cleanup --artifacts --old-only
|
84
|
+
|
85
|
+
# Clean all artifacts
|
86
|
+
cursorflow cleanup --artifacts
|
87
|
+
|
88
|
+
# Clean saved sessions
|
89
|
+
cursorflow cleanup --sessions
|
90
|
+
|
91
|
+
# Clean everything
|
92
|
+
cursorflow cleanup --all
|
93
|
+
|
94
|
+
# Preview before deleting
|
95
|
+
cursorflow cleanup --all --dry-run
|
96
|
+
```
|
97
|
+
|
98
|
+
**See:** [Artifact Cleanup Guide](docs/user/ARTIFACT_CLEANUP_GUIDE.md)
|
99
|
+
|
100
|
+
---
|
101
|
+
|
77
102
|
## 🚀 Complete Page Intelligence
|
78
103
|
|
79
104
|
Every test captures everything needed for debugging:
|
@@ -90,6 +90,8 @@ def main(ctx):
|
|
90
90
|
help='Timeout in seconds for wait operations')
|
91
91
|
@click.option('--wait-for-network-idle', is_flag=True,
|
92
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')
|
93
95
|
@click.option('--click', multiple=True,
|
94
96
|
help='Click element by selector (can specify multiple)')
|
95
97
|
@click.option('--hover', multiple=True,
|
@@ -107,7 +109,7 @@ def main(ctx):
|
|
107
109
|
@click.option('--quiet', '-q', is_flag=True,
|
108
110
|
help='Minimal output, JSON results only')
|
109
111
|
def test(base_url, path, actions, output, logs, config, verbose, headless, timeout, responsive,
|
110
|
-
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,
|
111
113
|
click, hover, fill, screenshot, open_trace, show_console, show_all_console, quiet):
|
112
114
|
"""
|
113
115
|
Test UI flows and interactions with real-time log monitoring
|
@@ -149,6 +151,8 @@ def test(base_url, path, actions, output, logs, config, verbose, headless, timeo
|
|
149
151
|
test_actions.append({"navigate": path})
|
150
152
|
|
151
153
|
# Wait options
|
154
|
+
if wait:
|
155
|
+
test_actions.append({"wait_for_timeout": int(wait * 1000)})
|
152
156
|
if wait_for:
|
153
157
|
test_actions.append({"wait_for_selector": wait_for})
|
154
158
|
if wait_for_network_idle:
|
@@ -909,6 +913,114 @@ def timeline(session):
|
|
909
913
|
except Exception as e:
|
910
914
|
console.print(f"[red]❌ Failed to load timeline: {e}[/red]")
|
911
915
|
|
916
|
+
@main.command()
|
917
|
+
@click.option('--artifacts', is_flag=True, help='Clean all artifacts (screenshots, traces)')
|
918
|
+
@click.option('--sessions', is_flag=True, help='Clean all saved sessions')
|
919
|
+
@click.option('--old-only', is_flag=True, help='Only clean artifacts older than 7 days')
|
920
|
+
@click.option('--all', 'clean_all', is_flag=True, help='Clean everything (artifacts, sessions, results)')
|
921
|
+
@click.option('--dry-run', is_flag=True, help='Show what would be deleted without deleting')
|
922
|
+
def cleanup(artifacts, sessions, old_only, clean_all, dry_run):
|
923
|
+
"""
|
924
|
+
Clean up CursorFlow artifacts and data
|
925
|
+
|
926
|
+
Examples:
|
927
|
+
cursorflow cleanup --artifacts # Clean screenshots and traces
|
928
|
+
cursorflow cleanup --sessions # Clean saved sessions
|
929
|
+
cursorflow cleanup --all # Clean everything
|
930
|
+
cursorflow cleanup --old-only --artifacts # Clean old artifacts only
|
931
|
+
cursorflow cleanup --dry-run --all # Preview what would be deleted
|
932
|
+
"""
|
933
|
+
import shutil
|
934
|
+
from datetime import datetime, timedelta
|
935
|
+
|
936
|
+
cursorflow_dir = Path('.cursorflow')
|
937
|
+
|
938
|
+
if not cursorflow_dir.exists():
|
939
|
+
console.print("[yellow]⚠️ No .cursorflow directory found[/yellow]")
|
940
|
+
return
|
941
|
+
|
942
|
+
total_size = 0
|
943
|
+
items_to_delete = []
|
944
|
+
|
945
|
+
# Calculate cutoff time for old-only mode
|
946
|
+
cutoff_time = datetime.now() - timedelta(days=7) if old_only else None
|
947
|
+
|
948
|
+
# Artifacts cleanup
|
949
|
+
if artifacts or clean_all:
|
950
|
+
artifacts_dir = cursorflow_dir / 'artifacts'
|
951
|
+
if artifacts_dir.exists():
|
952
|
+
for item in artifacts_dir.rglob('*'):
|
953
|
+
if item.is_file():
|
954
|
+
# Check age if old-only mode
|
955
|
+
if old_only:
|
956
|
+
file_time = datetime.fromtimestamp(item.stat().st_mtime)
|
957
|
+
if file_time > cutoff_time:
|
958
|
+
continue
|
959
|
+
|
960
|
+
size = item.stat().st_size
|
961
|
+
total_size += size
|
962
|
+
items_to_delete.append(('artifact', item, size))
|
963
|
+
|
964
|
+
# Sessions cleanup
|
965
|
+
if sessions or clean_all:
|
966
|
+
sessions_dir = cursorflow_dir / 'sessions'
|
967
|
+
if sessions_dir.exists():
|
968
|
+
for session_dir in sessions_dir.iterdir():
|
969
|
+
if session_dir.is_dir():
|
970
|
+
# Calculate session size
|
971
|
+
session_size = sum(f.stat().st_size for f in session_dir.rglob('*') if f.is_file())
|
972
|
+
total_size += session_size
|
973
|
+
items_to_delete.append(('session', session_dir, session_size))
|
974
|
+
|
975
|
+
# Display what will be deleted
|
976
|
+
if not items_to_delete:
|
977
|
+
console.print("✨ Nothing to clean - directory is already tidy!")
|
978
|
+
return
|
979
|
+
|
980
|
+
console.print(f"\n📊 Cleanup Summary:")
|
981
|
+
console.print(f" • Items to delete: {len(items_to_delete)}")
|
982
|
+
console.print(f" • Total size: {total_size / 1024 / 1024:.2f} MB")
|
983
|
+
|
984
|
+
# Show breakdown
|
985
|
+
artifact_count = sum(1 for t, _, _ in items_to_delete if t == 'artifact')
|
986
|
+
session_count = sum(1 for t, _, _ in items_to_delete if t == 'session')
|
987
|
+
|
988
|
+
if artifact_count:
|
989
|
+
artifact_size = sum(s for t, _, s in items_to_delete if t == 'artifact')
|
990
|
+
console.print(f" • Artifacts: {artifact_count} files ({artifact_size / 1024 / 1024:.2f} MB)")
|
991
|
+
if session_count:
|
992
|
+
session_size = sum(s for t, _, s in items_to_delete if t == 'session')
|
993
|
+
console.print(f" • Sessions: {session_count} sessions ({session_size / 1024 / 1024:.2f} MB)")
|
994
|
+
|
995
|
+
if dry_run:
|
996
|
+
console.print("\n🔍 Dry run - nothing deleted")
|
997
|
+
console.print(" Run without --dry-run to actually delete")
|
998
|
+
return
|
999
|
+
|
1000
|
+
# Confirm deletion
|
1001
|
+
import sys
|
1002
|
+
if sys.stdin.isatty():
|
1003
|
+
response = input("\n❓ Proceed with cleanup? [y/N]: ").strip().lower()
|
1004
|
+
if response != 'y':
|
1005
|
+
console.print("❌ Cleanup cancelled")
|
1006
|
+
return
|
1007
|
+
|
1008
|
+
# Delete items
|
1009
|
+
deleted_count = 0
|
1010
|
+
for item_type, item_path, _ in items_to_delete:
|
1011
|
+
try:
|
1012
|
+
if item_path.is_dir():
|
1013
|
+
shutil.rmtree(item_path)
|
1014
|
+
else:
|
1015
|
+
item_path.unlink()
|
1016
|
+
deleted_count += 1
|
1017
|
+
except Exception as e:
|
1018
|
+
console.print(f"[red]⚠️ Failed to delete {item_path}: {e}[/red]")
|
1019
|
+
|
1020
|
+
console.print(f"\n✅ Cleanup complete!")
|
1021
|
+
console.print(f" • Deleted {deleted_count}/{len(items_to_delete)} items")
|
1022
|
+
console.print(f" • Freed {total_size / 1024 / 1024:.2f} MB")
|
1023
|
+
|
912
1024
|
@main.command()
|
913
1025
|
@click.argument('project_path')
|
914
1026
|
# Framework detection removed - CursorFlow is framework-agnostic
|
@@ -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,
|
@@ -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.4"
|
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
|