cursorflow 2.4.2__tar.gz → 2.4.3__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.
Files changed (51) hide show
  1. {cursorflow-2.4.2 → cursorflow-2.4.3}/PKG-INFO +1 -1
  2. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/cli.py +11 -12
  3. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/browser_controller.py +5 -31
  4. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/mockup_comparator.py +13 -8
  5. {cursorflow-2.4.2 → cursorflow-2.4.3}/pyproject.toml +2 -2
  6. {cursorflow-2.4.2 → cursorflow-2.4.3}/LICENSE +0 -0
  7. {cursorflow-2.4.2 → cursorflow-2.4.3}/MANIFEST.in +0 -0
  8. {cursorflow-2.4.2 → cursorflow-2.4.3}/README.md +0 -0
  9. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/__init__.py +0 -0
  10. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/auto_init.py +0 -0
  11. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/auto_updater.py +0 -0
  12. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/action_validator.py +0 -0
  13. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/agent.py +0 -0
  14. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/auth_handler.py +0 -0
  15. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/browser_engine.py +0 -0
  16. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/config_validator.py +0 -0
  17. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/css_iterator.py +0 -0
  18. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/cursor_integration.py +0 -0
  19. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/cursorflow.py +0 -0
  20. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/error_context_collector.py +0 -0
  21. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/error_correlator.py +0 -0
  22. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/event_correlator.py +0 -0
  23. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/file_change_monitor.py +0 -0
  24. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/hmr_detector.py +0 -0
  25. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/log_collector.py +0 -0
  26. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/log_monitor.py +0 -0
  27. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/persistent_session.py +0 -0
  28. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/report_generator.py +0 -0
  29. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/core/trace_manager.py +0 -0
  30. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/install_cursorflow_rules.py +0 -0
  31. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/log_sources/local_file.py +0 -0
  32. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/log_sources/ssh_remote.py +0 -0
  33. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/post_install.py +0 -0
  34. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/rules/__init__.py +0 -0
  35. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/rules/cursorflow-installation.mdc +0 -0
  36. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/rules/cursorflow-usage.mdc +0 -0
  37. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow/updater.py +0 -0
  38. {cursorflow-2.4.2 → cursorflow-2.4.3}/cursorflow.egg-info/SOURCES.txt +0 -0
  39. {cursorflow-2.4.2 → cursorflow-2.4.3}/docs/user/USAGE_GUIDE.md +0 -0
  40. {cursorflow-2.4.2 → cursorflow-2.4.3}/examples/comprehensive_screenshot_example.py +0 -0
  41. {cursorflow-2.4.2 → cursorflow-2.4.3}/examples/element_inspection_example.py +0 -0
  42. {cursorflow-2.4.2 → cursorflow-2.4.3}/examples/element_measurement_example.py +0 -0
  43. {cursorflow-2.4.2 → cursorflow-2.4.3}/examples/enhanced_screenshot_example.py +0 -0
  44. {cursorflow-2.4.2 → cursorflow-2.4.3}/examples/hot_reload_css_iteration.py +0 -0
  45. {cursorflow-2.4.2 → cursorflow-2.4.3}/examples/mockup_comparison_example.py +0 -0
  46. {cursorflow-2.4.2 → cursorflow-2.4.3}/examples/opensas_example.py +0 -0
  47. {cursorflow-2.4.2 → cursorflow-2.4.3}/examples/react_example.py +0 -0
  48. {cursorflow-2.4.2 → cursorflow-2.4.3}/examples/responsive_testing_example.py +0 -0
  49. {cursorflow-2.4.2 → cursorflow-2.4.3}/examples/v2_comprehensive_demo.py +0 -0
  50. {cursorflow-2.4.2 → cursorflow-2.4.3}/setup.cfg +0 -0
  51. {cursorflow-2.4.2 → cursorflow-2.4.3}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cursorflow
3
- Version: 2.4.2
3
+ Version: 2.4.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
@@ -357,13 +357,11 @@ def test(base_url, path, actions, output, logs, config, verbose, headless, timeo
357
357
  help='JSON array of viewports to test: [{"width": 1440, "height": 900, "name": "desktop"}]')
358
358
  @click.option('--diff-threshold', '-t', type=float, default=0.1,
359
359
  help='Visual difference threshold (0.0-1.0)')
360
- @click.option('--block-tracking', is_flag=True,
361
- help='Block tracking scripts (Google Analytics, Facebook Pixel, etc.) to prevent timeout')
362
360
  @click.option('--output', '-o', default='mockup_comparison_results.json',
363
361
  help='Output file for comparison results')
364
362
  @click.option('--verbose', is_flag=True,
365
363
  help='Verbose output')
366
- def compare_mockup(mockup_url, base_url, mockup_actions, implementation_actions, viewports, diff_threshold, block_tracking, output, verbose):
364
+ def compare_mockup(mockup_url, base_url, mockup_actions, implementation_actions, viewports, diff_threshold, output, verbose):
367
365
  """Compare mockup design to work-in-progress implementation"""
368
366
 
369
367
  console.print(f"🎨 Comparing mockup [blue]{mockup_url}[/blue] to implementation [blue]{base_url}[/blue]")
@@ -407,16 +405,10 @@ def compare_mockup(mockup_url, base_url, mockup_actions, implementation_actions,
407
405
  try:
408
406
  from .core.cursorflow import CursorFlow
409
407
 
410
- # Configure browser with tracking blocking if requested
411
- browser_config = {'headless': True}
412
- if block_tracking:
413
- browser_config['block_tracking'] = True
414
- console.print("🚫 Blocking tracking scripts (Google Analytics, Facebook Pixel, etc.)")
415
-
416
408
  flow = CursorFlow(
417
409
  base_url=base_url,
418
410
  log_config={'source': 'local', 'paths': ['logs/app.log']},
419
- browser_config=browser_config
411
+ browser_config={'headless': True}
420
412
  )
421
413
  except Exception as e:
422
414
  console.print(f"[red]Error initializing CursorFlow: {e}[/red]")
@@ -449,9 +441,16 @@ def compare_mockup(mockup_url, base_url, mockup_actions, implementation_actions,
449
441
  for i, rec in enumerate(recommendations[:3]): # Show first 3
450
442
  console.print(f" {i+1}. {rec.get('description', 'No description')}")
451
443
 
452
- # Save results
444
+ # Save results with numpy type handling
453
445
  with open(output, 'w') as f:
454
- json.dump(results, f, indent=2, default=str)
446
+ def json_serializer(obj):
447
+ # Handle numpy types
448
+ if hasattr(obj, 'item'): # numpy scalars (bool_, int_, float_)
449
+ return obj.item()
450
+ if hasattr(obj, 'tolist'): # numpy arrays
451
+ return obj.tolist()
452
+ return str(obj)
453
+ json.dump(results, f, indent=2, default=json_serializer)
455
454
 
456
455
  console.print(f"💾 Full results saved to: [cyan]{output}[/cyan]")
457
456
  console.print(f"📁 Visual diffs stored in: [cyan].cursorflow/artifacts/[/cyan]")
@@ -131,9 +131,9 @@ class BrowserController:
131
131
  self.context = await self.browser.new_context(**context_config)
132
132
  self.page = await self.context.new_page()
133
133
 
134
- # Block tracking scripts if requested (prevents timeout on pages with analytics)
135
- if self.config.get("block_tracking", False):
136
- await self._setup_tracking_blocker()
134
+ # Note: We do NOT block tracking scripts by default
135
+ # CursorFlow philosophy: "Capture reality, not fiction"
136
+ # Blocking scripts would alter the actual page behavior we're measuring
137
137
 
138
138
  # v2.0 Enhancement: Initialize Error Context Collector
139
139
  self.error_context_collector = ErrorContextCollector(self.page, self.logger)
@@ -173,33 +173,6 @@ class BrowserController:
173
173
 
174
174
  raise
175
175
 
176
- async def _setup_tracking_blocker(self):
177
- """Block common tracking scripts to prevent networkidle timeout"""
178
- tracking_patterns = [
179
- "*google-analytics.com/*",
180
- "*googletagmanager.com/*",
181
- "*facebook.com/tr/*",
182
- "*facebook.net/*",
183
- "*doubleclick.net/*",
184
- "*analytics.google.com/*",
185
- "*hotjar.com/*",
186
- "*mixpanel.com/*",
187
- "*segment.com/*",
188
- "*googleadservices.com/*",
189
- "*connect.facebook.net/*",
190
- "*/analytics/*",
191
- "*/tracking/*"
192
- ]
193
-
194
- async def block_tracking(route):
195
- """Block tracking request"""
196
- await route.abort()
197
-
198
- for pattern in tracking_patterns:
199
- await self.page.route(pattern, block_tracking)
200
-
201
- self.logger.info("🚫 Tracking scripts blocked")
202
-
203
176
  async def _setup_event_listeners(self):
204
177
  """Set up universal event listeners for any framework"""
205
178
 
@@ -388,8 +361,9 @@ class BrowserController:
388
361
  self.logger.info(f"Navigating to: {url}")
389
362
 
390
363
  # Navigate and wait
364
+ # Use 'load' instead of 'networkidle' to avoid timeout on pages with tracking scripts
391
365
  if wait_for_load:
392
- await self.page.goto(url, wait_until="networkidle", timeout=30000)
366
+ await self.page.goto(url, wait_until="load", timeout=30000)
393
367
  else:
394
368
  await self.page.goto(url, timeout=30000)
395
369
 
@@ -170,7 +170,12 @@ class MockupComparator:
170
170
  # Save comparison report
171
171
  report_path = self.artifacts_base / "mockup_comparisons" / f"{comparison_name}.json"
172
172
  with open(report_path, 'w') as f:
173
- json.dump(comparison_report, f, indent=2, default=str)
173
+ # Custom JSON encoder to handle numpy booleans/integers
174
+ def json_serializer(obj):
175
+ if hasattr(obj, 'item'): # numpy types
176
+ return obj.item()
177
+ return str(obj)
178
+ json.dump(comparison_report, f, indent=2, default=json_serializer)
174
179
 
175
180
  self.logger.info(f"Mockup comparison completed: {comparison_name}")
176
181
  return comparison_report
@@ -1194,11 +1199,11 @@ class MockupComparator:
1194
1199
  improvement = improved_similarity - baseline_similarity
1195
1200
 
1196
1201
  return {
1197
- "baseline_similarity": baseline_similarity,
1198
- "improved_similarity": improved_similarity,
1199
- "improvement": improvement,
1200
- "improvement_percentage": round(improvement, 2),
1201
- "is_improvement": improvement > 0
1202
+ "baseline_similarity": float(baseline_similarity),
1203
+ "improved_similarity": float(improved_similarity),
1204
+ "improvement": float(improvement),
1205
+ "improvement_percentage": round(float(improvement), 2),
1206
+ "is_improvement": bool(improvement > 0) # Convert to Python bool
1202
1207
  }
1203
1208
 
1204
1209
  except Exception as e:
@@ -1219,10 +1224,10 @@ class MockupComparator:
1219
1224
  avg_similarity = sum(similarities) / len(similarities) if similarities else 0
1220
1225
 
1221
1226
  return {
1222
- "average_similarity": round(avg_similarity, 2),
1227
+ "average_similarity": round(float(avg_similarity), 2),
1223
1228
  "viewports_tested": len(comparison_results),
1224
1229
  "best_viewport_match": max(comparison_results, key=lambda x: x.get("visual_diff", {}).get("similarity_score", 0)),
1225
- "needs_improvement": avg_similarity < 80 # Threshold for "good enough"
1230
+ "needs_improvement": bool(avg_similarity < 80) # Convert numpy.bool_ to Python bool
1226
1231
  }
1227
1232
 
1228
1233
  def _generate_improvement_recommendations(self, comparison_results: List[Dict]) -> List[Dict]:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cursorflow"
7
- version = "2.4.2"
7
+ version = "2.4.3"
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.4.2"
75
+ python_version = "2.4.3"
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