cursorflow 2.7.4__tar.gz → 2.7.6__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 (55) hide show
  1. {cursorflow-2.7.4 → cursorflow-2.7.6}/PKG-INFO +1 -1
  2. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/query_engine.py +90 -12
  3. {cursorflow-2.7.4 → cursorflow-2.7.6}/pyproject.toml +1 -1
  4. {cursorflow-2.7.4 → cursorflow-2.7.6}/LICENSE +0 -0
  5. {cursorflow-2.7.4 → cursorflow-2.7.6}/MANIFEST.in +0 -0
  6. {cursorflow-2.7.4 → cursorflow-2.7.6}/README.md +0 -0
  7. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/__init__.py +0 -0
  8. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/auto_init.py +0 -0
  9. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/auto_updater.py +0 -0
  10. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/cli.py +0 -0
  11. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/action_validator.py +0 -0
  12. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/agent.py +0 -0
  13. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/auth_handler.py +0 -0
  14. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/browser_controller.py +0 -0
  15. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/browser_engine.py +0 -0
  16. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/config_validator.py +0 -0
  17. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/css_iterator.py +0 -0
  18. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/cursor_integration.py +0 -0
  19. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/cursorflow.py +0 -0
  20. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/data_presenter.py +0 -0
  21. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/error_context_collector.py +0 -0
  22. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/error_correlator.py +0 -0
  23. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/event_correlator.py +0 -0
  24. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/file_change_monitor.py +0 -0
  25. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/hmr_detector.py +0 -0
  26. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/json_utils.py +0 -0
  27. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/log_collector.py +0 -0
  28. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/log_monitor.py +0 -0
  29. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/mockup_comparator.py +0 -0
  30. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/output_manager.py +0 -0
  31. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/persistent_session.py +0 -0
  32. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/report_generator.py +0 -0
  33. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/core/trace_manager.py +0 -0
  34. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/install_cursorflow_rules.py +0 -0
  35. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/log_sources/local_file.py +0 -0
  36. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/log_sources/ssh_remote.py +0 -0
  37. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/post_install.py +0 -0
  38. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/rules/__init__.py +0 -0
  39. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/rules/cursorflow-installation.mdc +0 -0
  40. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/rules/cursorflow-usage.mdc +0 -0
  41. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow/updater.py +0 -0
  42. {cursorflow-2.7.4 → cursorflow-2.7.6}/cursorflow.egg-info/SOURCES.txt +0 -0
  43. {cursorflow-2.7.4 → cursorflow-2.7.6}/docs/user/USAGE_GUIDE.md +0 -0
  44. {cursorflow-2.7.4 → cursorflow-2.7.6}/examples/comprehensive_screenshot_example.py +0 -0
  45. {cursorflow-2.7.4 → cursorflow-2.7.6}/examples/element_inspection_example.py +0 -0
  46. {cursorflow-2.7.4 → cursorflow-2.7.6}/examples/element_measurement_example.py +0 -0
  47. {cursorflow-2.7.4 → cursorflow-2.7.6}/examples/enhanced_screenshot_example.py +0 -0
  48. {cursorflow-2.7.4 → cursorflow-2.7.6}/examples/hot_reload_css_iteration.py +0 -0
  49. {cursorflow-2.7.4 → cursorflow-2.7.6}/examples/mockup_comparison_example.py +0 -0
  50. {cursorflow-2.7.4 → cursorflow-2.7.6}/examples/opensas_example.py +0 -0
  51. {cursorflow-2.7.4 → cursorflow-2.7.6}/examples/react_example.py +0 -0
  52. {cursorflow-2.7.4 → cursorflow-2.7.6}/examples/responsive_testing_example.py +0 -0
  53. {cursorflow-2.7.4 → cursorflow-2.7.6}/examples/v2_comprehensive_demo.py +0 -0
  54. {cursorflow-2.7.4 → cursorflow-2.7.6}/setup.cfg +0 -0
  55. {cursorflow-2.7.4 → cursorflow-2.7.6}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cursorflow
3
- Version: 2.7.4
3
+ Version: 2.7.6
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
@@ -420,16 +420,90 @@ class QueryEngine:
420
420
 
421
421
  # Phase 1: Enhanced DOM filtering
422
422
 
423
- # Filter by selector (improved matching)
423
+ # Filter by selector (improved matching with correct field paths and priority)
424
424
  if 'selector' in filters or 'select' in filters:
425
425
  selector = filters.get('selector') or filters.get('select')
426
- filtered_elements = [
427
- el for el in filtered_elements
428
- if (selector in el.get('uniqueSelector', '') or
429
- selector in el.get('tagName', '') or
430
- selector == el.get('id', '') or
431
- selector in el.get('classes', []))
432
- ]
426
+
427
+ # Detect selector type
428
+ is_id_selector = selector.startswith('#')
429
+ is_class_selector = selector.startswith('.')
430
+
431
+ # Remove leading dot or hash if present (e.g., ".class" -> "class", "#id" -> "id")
432
+ selector_clean = selector.lstrip('.#')
433
+
434
+ # Determine if this looks like a simple tag name (no special characters)
435
+ is_simple_tag = selector.isalpha() and not is_id_selector and not is_class_selector
436
+
437
+ result_elements = []
438
+ for el in filtered_elements:
439
+ matched = False
440
+
441
+ # Priority 1: ID selector (#id) - only check ID field
442
+ if is_id_selector:
443
+ if selector_clean == el.get('id', ''):
444
+ result_elements.append(el)
445
+ continue
446
+
447
+ # Priority 2: Class selector (.class) - only check className
448
+ if is_class_selector:
449
+ if el.get('className'):
450
+ class_names = str(el.get('className')).split()
451
+ if selector_clean in class_names:
452
+ result_elements.append(el)
453
+ # Backward compatibility: Check classes array (old format)
454
+ elif selector_clean in el.get('classes', []):
455
+ result_elements.append(el)
456
+ continue
457
+
458
+ # Priority 3: For simple alphanumeric selectors, check tagName, ID, and className
459
+ # This handles ambiguous cases like "page" (could be tag or ID)
460
+ if is_simple_tag:
461
+ # Check tag name match (exact, case insensitive)
462
+ if selector.lower() == el.get('tagName', '').lower():
463
+ result_elements.append(el)
464
+ continue
465
+
466
+ # Check ID match (exact)
467
+ if selector_clean == el.get('id', ''):
468
+ result_elements.append(el)
469
+ continue
470
+
471
+ # Class name match (whole word match to avoid "a" matching "navbar")
472
+ if el.get('className'):
473
+ class_names = str(el.get('className')).split()
474
+ if selector_clean in class_names:
475
+ result_elements.append(el)
476
+ continue
477
+
478
+ # Backward compatibility: Check classes array (old format)
479
+ if selector_clean in el.get('classes', []):
480
+ result_elements.append(el)
481
+
482
+ # Don't fall through to selector string checks for simple tags
483
+ continue
484
+
485
+ # Priority 2: For complex selectors, check selector strings and attributes
486
+ if (
487
+ # Check selectors.unique_css (current format)
488
+ (selector in el.get('selectors', {}).get('unique_css', '')) or
489
+ # Check selectors.css (current format)
490
+ (selector in el.get('selectors', {}).get('css', '')) or
491
+ # Check selectors.xpath
492
+ (selector in el.get('selectors', {}).get('xpath', '')) or
493
+ # Check ID (exact match or contains for partial IDs)
494
+ (el.get('id') and selector_clean in str(el.get('id'))) or
495
+ # Check className (can be string or None)
496
+ (el.get('className') and selector_clean in str(el.get('className'))) or
497
+ # Backward compatibility: Check nested uniqueSelector (old format)
498
+ (selector in el.get('selectors', {}).get('uniqueSelector', '')) or
499
+ # Backward compatibility: Check top-level uniqueSelector (old format)
500
+ (selector in el.get('uniqueSelector', '')) or
501
+ # Backward compatibility: Check classes array (old format)
502
+ (selector_clean in el.get('classes', []))
503
+ ):
504
+ result_elements.append(el)
505
+
506
+ filtered_elements = result_elements
433
507
 
434
508
  # Filter by attributes
435
509
  if 'with_attr' in filters:
@@ -447,18 +521,18 @@ class QueryEngine:
447
521
  if el.get('accessibility', {}).get('role') == role
448
522
  ]
449
523
 
450
- # Filter by visibility
524
+ # Filter by visibility (use correct nested path)
451
525
  if 'visible' in filters and filters['visible']:
452
526
  filtered_elements = [
453
527
  el for el in filtered_elements
454
- if el.get('visual_context', {}).get('isVisible', True)
528
+ if el.get('visual_context', {}).get('visibility', {}).get('is_visible', False)
455
529
  ]
456
530
 
457
- # Filter by interactivity
531
+ # Filter by interactivity (use correct nested path)
458
532
  if 'interactive' in filters and filters['interactive']:
459
533
  filtered_elements = [
460
534
  el for el in filtered_elements
461
- if el.get('accessibility', {}).get('isInteractive', False)
535
+ if el.get('accessibility', {}).get('is_interactive', False)
462
536
  ]
463
537
 
464
538
  # Filter elements with errors (from console errors)
@@ -945,6 +1019,10 @@ class QueryEngine:
945
1019
  elif format == "csv":
946
1020
  return self._to_csv(data, data_type)
947
1021
 
1022
+ elif format == "dict" or format == "raw":
1023
+ # Return raw dictionary (useful for programmatic access)
1024
+ return data
1025
+
948
1026
  else:
949
1027
  return data
950
1028
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cursorflow"
7
- version = "2.7.4"
7
+ version = "2.7.6"
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