cursorflow 2.7.5__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.5 → cursorflow-2.7.6}/PKG-INFO +1 -1
  2. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/query_engine.py +85 -20
  3. {cursorflow-2.7.5 → cursorflow-2.7.6}/pyproject.toml +1 -1
  4. {cursorflow-2.7.5 → cursorflow-2.7.6}/LICENSE +0 -0
  5. {cursorflow-2.7.5 → cursorflow-2.7.6}/MANIFEST.in +0 -0
  6. {cursorflow-2.7.5 → cursorflow-2.7.6}/README.md +0 -0
  7. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/__init__.py +0 -0
  8. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/auto_init.py +0 -0
  9. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/auto_updater.py +0 -0
  10. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/cli.py +0 -0
  11. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/action_validator.py +0 -0
  12. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/agent.py +0 -0
  13. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/auth_handler.py +0 -0
  14. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/browser_controller.py +0 -0
  15. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/browser_engine.py +0 -0
  16. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/config_validator.py +0 -0
  17. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/css_iterator.py +0 -0
  18. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/cursor_integration.py +0 -0
  19. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/cursorflow.py +0 -0
  20. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/data_presenter.py +0 -0
  21. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/error_context_collector.py +0 -0
  22. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/error_correlator.py +0 -0
  23. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/event_correlator.py +0 -0
  24. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/file_change_monitor.py +0 -0
  25. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/hmr_detector.py +0 -0
  26. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/json_utils.py +0 -0
  27. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/log_collector.py +0 -0
  28. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/log_monitor.py +0 -0
  29. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/mockup_comparator.py +0 -0
  30. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/output_manager.py +0 -0
  31. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/persistent_session.py +0 -0
  32. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/report_generator.py +0 -0
  33. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/core/trace_manager.py +0 -0
  34. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/install_cursorflow_rules.py +0 -0
  35. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/log_sources/local_file.py +0 -0
  36. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/log_sources/ssh_remote.py +0 -0
  37. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/post_install.py +0 -0
  38. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/rules/__init__.py +0 -0
  39. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/rules/cursorflow-installation.mdc +0 -0
  40. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/rules/cursorflow-usage.mdc +0 -0
  41. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow/updater.py +0 -0
  42. {cursorflow-2.7.5 → cursorflow-2.7.6}/cursorflow.egg-info/SOURCES.txt +0 -0
  43. {cursorflow-2.7.5 → cursorflow-2.7.6}/docs/user/USAGE_GUIDE.md +0 -0
  44. {cursorflow-2.7.5 → cursorflow-2.7.6}/examples/comprehensive_screenshot_example.py +0 -0
  45. {cursorflow-2.7.5 → cursorflow-2.7.6}/examples/element_inspection_example.py +0 -0
  46. {cursorflow-2.7.5 → cursorflow-2.7.6}/examples/element_measurement_example.py +0 -0
  47. {cursorflow-2.7.5 → cursorflow-2.7.6}/examples/enhanced_screenshot_example.py +0 -0
  48. {cursorflow-2.7.5 → cursorflow-2.7.6}/examples/hot_reload_css_iteration.py +0 -0
  49. {cursorflow-2.7.5 → cursorflow-2.7.6}/examples/mockup_comparison_example.py +0 -0
  50. {cursorflow-2.7.5 → cursorflow-2.7.6}/examples/opensas_example.py +0 -0
  51. {cursorflow-2.7.5 → cursorflow-2.7.6}/examples/react_example.py +0 -0
  52. {cursorflow-2.7.5 → cursorflow-2.7.6}/examples/responsive_testing_example.py +0 -0
  53. {cursorflow-2.7.5 → cursorflow-2.7.6}/examples/v2_comprehensive_demo.py +0 -0
  54. {cursorflow-2.7.5 → cursorflow-2.7.6}/setup.cfg +0 -0
  55. {cursorflow-2.7.5 → 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.5
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,29 +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
- # Remove leading dot if present (e.g., ".class" -> "class")
427
- selector_clean = selector.lstrip('.')
428
426
 
429
- filtered_elements = [
430
- el for el in filtered_elements
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
431
486
  if (
432
- # Check nested uniqueSelector
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)
433
498
  (selector in el.get('selectors', {}).get('uniqueSelector', '')) or
434
- # Check top-level uniqueSelector (old format)
499
+ # Backward compatibility: Check top-level uniqueSelector (old format)
435
500
  (selector in el.get('uniqueSelector', '')) or
436
- # Check tagName
437
- (selector in el.get('tagName', '')) or
438
- # Check ID
439
- (selector == el.get('id', '')) or
440
- # Check className string
441
- (el.get('className') and selector_clean in el.get('className', '')) or
442
- # Check classes array (old format)
501
+ # Backward compatibility: Check classes array (old format)
443
502
  (selector_clean in el.get('classes', []))
444
- )
445
- ]
503
+ ):
504
+ result_elements.append(el)
505
+
506
+ filtered_elements = result_elements
446
507
 
447
508
  # Filter by attributes
448
509
  if 'with_attr' in filters:
@@ -460,18 +521,18 @@ class QueryEngine:
460
521
  if el.get('accessibility', {}).get('role') == role
461
522
  ]
462
523
 
463
- # Filter by visibility
524
+ # Filter by visibility (use correct nested path)
464
525
  if 'visible' in filters and filters['visible']:
465
526
  filtered_elements = [
466
527
  el for el in filtered_elements
467
- if el.get('visual_context', {}).get('isVisible', True)
528
+ if el.get('visual_context', {}).get('visibility', {}).get('is_visible', False)
468
529
  ]
469
530
 
470
- # Filter by interactivity
531
+ # Filter by interactivity (use correct nested path)
471
532
  if 'interactive' in filters and filters['interactive']:
472
533
  filtered_elements = [
473
534
  el for el in filtered_elements
474
- if el.get('accessibility', {}).get('isInteractive', False)
535
+ if el.get('accessibility', {}).get('is_interactive', False)
475
536
  ]
476
537
 
477
538
  # Filter elements with errors (from console errors)
@@ -958,6 +1019,10 @@ class QueryEngine:
958
1019
  elif format == "csv":
959
1020
  return self._to_csv(data, data_type)
960
1021
 
1022
+ elif format == "dict" or format == "raw":
1023
+ # Return raw dictionary (useful for programmatic access)
1024
+ return data
1025
+
961
1026
  else:
962
1027
  return data
963
1028
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cursorflow"
7
- version = "2.7.5"
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