cursorflow 1.3.0__tar.gz → 1.3.1__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 (34) hide show
  1. {cursorflow-1.3.0 → cursorflow-1.3.1}/PKG-INFO +28 -7
  2. {cursorflow-1.3.0 → cursorflow-1.3.1}/README.md +27 -6
  3. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/cli.py +33 -11
  4. {cursorflow-1.3.0 → cursorflow-1.3.1}/docs/USER_MANUAL.md +137 -14
  5. {cursorflow-1.3.0 → cursorflow-1.3.1}/pyproject.toml +1 -1
  6. {cursorflow-1.3.0 → cursorflow-1.3.1}/LICENSE +0 -0
  7. {cursorflow-1.3.0 → cursorflow-1.3.1}/MANIFEST.in +0 -0
  8. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/__init__.py +0 -0
  9. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/auto_updater.py +0 -0
  10. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/agent.py +0 -0
  11. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/auth_handler.py +0 -0
  12. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/browser_controller.py +0 -0
  13. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/browser_engine.py +0 -0
  14. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/css_iterator.py +0 -0
  15. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/cursor_integration.py +0 -0
  16. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/cursorflow.py +0 -0
  17. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/error_correlator.py +0 -0
  18. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/event_correlator.py +0 -0
  19. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/file_change_monitor.py +0 -0
  20. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/log_collector.py +0 -0
  21. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/log_monitor.py +0 -0
  22. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/mockup_comparator.py +0 -0
  23. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/persistent_session.py +0 -0
  24. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/core/report_generator.py +0 -0
  25. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/log_sources/local_file.py +0 -0
  26. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/log_sources/ssh_remote.py +0 -0
  27. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow/updater.py +0 -0
  28. {cursorflow-1.3.0 → cursorflow-1.3.1}/cursorflow.egg-info/SOURCES.txt +0 -0
  29. {cursorflow-1.3.0 → cursorflow-1.3.1}/examples/comprehensive_screenshot_example.py +0 -0
  30. {cursorflow-1.3.0 → cursorflow-1.3.1}/examples/mockup_comparison_example.py +0 -0
  31. {cursorflow-1.3.0 → cursorflow-1.3.1}/examples/opensas_example.py +0 -0
  32. {cursorflow-1.3.0 → cursorflow-1.3.1}/examples/react_example.py +0 -0
  33. {cursorflow-1.3.0 → cursorflow-1.3.1}/setup.cfg +0 -0
  34. {cursorflow-1.3.0 → cursorflow-1.3.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cursorflow
3
- Version: 1.3.0
3
+ Version: 1.3.1
4
4
  Summary: Complete page intelligence for AI-driven development - captures DOM, network, console, and performance data
5
5
  Author-email: GeekWarrior Development <support@cursorflow.dev>
6
6
  License-Expression: MIT
@@ -77,8 +77,12 @@ All data structured for AI consumption:
77
77
  # Install
78
78
  pip install cursorflow
79
79
 
80
- # Test any component - captures everything automatically
81
- cursorflow test dashboard --base-url http://localhost:3000
80
+ # Test any page - captures everything automatically
81
+ cursorflow test --base-url http://localhost:3000 --actions '[
82
+ {"navigate": "/dashboard"},
83
+ {"wait_for": "#main-content"},
84
+ {"screenshot": "dashboard-loaded"}
85
+ ]'
82
86
 
83
87
  # Compare mockup to implementation
84
88
  cursorflow compare-mockup https://mockup.com/design --base-url http://localhost:3000
@@ -134,14 +138,31 @@ results = await flow.css_iteration_persistent(
134
138
  ## 🔧 CLI Commands
135
139
 
136
140
  ```bash
137
- # Test component with complete data capture
138
- cursorflow test component --base-url http://localhost:3000
141
+ # Test any page with custom actions
142
+ cursorflow test --base-url http://localhost:3000 --actions '[
143
+ {"navigate": "/login"},
144
+ {"fill": {"selector": "#username", "value": "test@example.com"}},
145
+ {"fill": {"selector": "#password", "value": "password123"}},
146
+ {"click": "#login-button"},
147
+ {"wait_for": ".dashboard"},
148
+ {"screenshot": "logged-in"}
149
+ ]'
150
+
151
+ # Simple page test (just navigate and screenshot)
152
+ cursorflow test --base-url http://localhost:3000 --path "/dashboard"
139
153
 
140
154
  # Compare mockup to implementation
141
- cursorflow compare-mockup https://mockup.com/design --base-url http://localhost:3000
155
+ cursorflow compare-mockup https://mockup.com/design \
156
+ --base-url http://localhost:3000 \
157
+ --viewports '[{"width": 1440, "height": 900, "name": "desktop"}]'
142
158
 
143
159
  # Iterate on CSS improvements
144
- cursorflow iterate-mockup https://mockup.com/design --base-url http://localhost:3000
160
+ cursorflow iterate-mockup https://mockup.com/design \
161
+ --base-url http://localhost:3000 \
162
+ --css-improvements '[
163
+ {"name": "spacing", "css": ".container { gap: 2rem; }"},
164
+ {"name": "colors", "css": ".button { background: blue; }"}
165
+ ]'
145
166
  ```
146
167
 
147
168
  ## 🌐 Universal Framework Support
@@ -35,8 +35,12 @@ All data structured for AI consumption:
35
35
  # Install
36
36
  pip install cursorflow
37
37
 
38
- # Test any component - captures everything automatically
39
- cursorflow test dashboard --base-url http://localhost:3000
38
+ # Test any page - captures everything automatically
39
+ cursorflow test --base-url http://localhost:3000 --actions '[
40
+ {"navigate": "/dashboard"},
41
+ {"wait_for": "#main-content"},
42
+ {"screenshot": "dashboard-loaded"}
43
+ ]'
40
44
 
41
45
  # Compare mockup to implementation
42
46
  cursorflow compare-mockup https://mockup.com/design --base-url http://localhost:3000
@@ -92,14 +96,31 @@ results = await flow.css_iteration_persistent(
92
96
  ## 🔧 CLI Commands
93
97
 
94
98
  ```bash
95
- # Test component with complete data capture
96
- cursorflow test component --base-url http://localhost:3000
99
+ # Test any page with custom actions
100
+ cursorflow test --base-url http://localhost:3000 --actions '[
101
+ {"navigate": "/login"},
102
+ {"fill": {"selector": "#username", "value": "test@example.com"}},
103
+ {"fill": {"selector": "#password", "value": "password123"}},
104
+ {"click": "#login-button"},
105
+ {"wait_for": ".dashboard"},
106
+ {"screenshot": "logged-in"}
107
+ ]'
108
+
109
+ # Simple page test (just navigate and screenshot)
110
+ cursorflow test --base-url http://localhost:3000 --path "/dashboard"
97
111
 
98
112
  # Compare mockup to implementation
99
- cursorflow compare-mockup https://mockup.com/design --base-url http://localhost:3000
113
+ cursorflow compare-mockup https://mockup.com/design \
114
+ --base-url http://localhost:3000 \
115
+ --viewports '[{"width": 1440, "height": 900, "name": "desktop"}]'
100
116
 
101
117
  # Iterate on CSS improvements
102
- cursorflow iterate-mockup https://mockup.com/design --base-url http://localhost:3000
118
+ cursorflow iterate-mockup https://mockup.com/design \
119
+ --base-url http://localhost:3000 \
120
+ --css-improvements '[
121
+ {"name": "spacing", "css": ".container { gap: 2rem; }"},
122
+ {"name": "colors", "css": ".button { background: blue; }"}
123
+ ]'
103
124
  ```
104
125
 
105
126
  ## 🌐 Universal Framework Support
@@ -26,11 +26,14 @@ def main():
26
26
  pass
27
27
 
28
28
  @main.command()
29
- @click.argument('test_name', required=False, default='ui-test')
30
- @click.option('--base-url', '-u', default='http://localhost:3000',
31
- help='Base URL for testing')
29
+ @click.option('--base-url', '-u', required=True,
30
+ help='Base URL for testing (e.g., http://localhost:3000)')
31
+ @click.option('--path', '-p',
32
+ help='Simple path to navigate to (e.g., "/dashboard")')
32
33
  @click.option('--actions', '-a',
33
34
  help='JSON file with test actions, or inline JSON string')
35
+ @click.option('--output', '-o',
36
+ help='Output file for results (auto-generated if not specified)')
34
37
  @click.option('--logs', '-l',
35
38
  type=click.Choice(['local', 'ssh', 'docker', 'systemd']),
36
39
  default='local',
@@ -39,7 +42,11 @@ def main():
39
42
  help='Configuration file path')
40
43
  @click.option('--verbose', '-v', is_flag=True,
41
44
  help='Verbose output')
42
- def test(test_name, base_url, actions, logs, config, verbose):
45
+ @click.option('--headless', is_flag=True, default=True,
46
+ help='Run browser in headless mode')
47
+ @click.option('--timeout', type=int, default=30,
48
+ help='Timeout in seconds for actions')
49
+ def test(base_url, path, actions, output, logs, config, verbose, headless, timeout):
43
50
  """Test UI flows and interactions with real-time log monitoring"""
44
51
 
45
52
  if verbose:
@@ -65,14 +72,22 @@ def test(test_name, base_url, actions, logs, config, verbose):
65
72
  except Exception as e:
66
73
  console.print(f"[red]❌ Failed to load actions: {e}[/red]")
67
74
  return
75
+ elif path:
76
+ # Simple path navigation
77
+ test_actions = [
78
+ {"navigate": path},
79
+ {"wait_for": "body"},
80
+ {"screenshot": "page_loaded"}
81
+ ]
82
+ console.print(f"📋 Using simple path navigation to [cyan]{path}[/cyan]")
68
83
  else:
69
- # Default actions - just navigate and screenshot
84
+ # Default actions - just navigate to root and screenshot
70
85
  test_actions = [
71
86
  {"navigate": "/"},
72
87
  {"wait_for": "body"},
73
88
  {"screenshot": "baseline"}
74
89
  ]
75
- console.print(f"📋 Using default actions (navigate + screenshot)")
90
+ console.print(f"📋 Using default actions (navigate to root + screenshot)")
76
91
 
77
92
  # Load configuration
78
93
  agent_config = {}
@@ -80,7 +95,8 @@ def test(test_name, base_url, actions, logs, config, verbose):
80
95
  with open(config, 'r') as f:
81
96
  agent_config = json.load(f)
82
97
 
83
- console.print(f"🎯 Testing [bold]{test_name}[/bold] at [blue]{base_url}[/blue]")
98
+ test_description = path if path else "root page"
99
+ console.print(f"🎯 Testing [bold]{test_description}[/bold] at [blue]{base_url}[/blue]")
84
100
 
85
101
  # Initialize CursorFlow (framework-agnostic)
86
102
  try:
@@ -88,6 +104,7 @@ def test(test_name, base_url, actions, logs, config, verbose):
88
104
  flow = CursorFlow(
89
105
  base_url=base_url,
90
106
  log_config={'source': logs, 'paths': ['logs/app.log']},
107
+ browser_config={'headless': headless, 'timeout': timeout},
91
108
  **agent_config
92
109
  )
93
110
  except Exception as e:
@@ -99,7 +116,7 @@ def test(test_name, base_url, actions, logs, config, verbose):
99
116
  console.print(f"🚀 Executing {len(test_actions)} actions...")
100
117
  results = asyncio.run(flow.execute_and_collect(test_actions))
101
118
 
102
- console.print(f"✅ Test completed: {test_name}")
119
+ console.print(f"✅ Test completed: {test_description}")
103
120
  console.print(f"📊 Browser events: {len(results.get('browser_events', []))}")
104
121
  console.print(f"📋 Server logs: {len(results.get('server_logs', []))}")
105
122
  console.print(f"📸 Screenshots: {len(results.get('artifacts', {}).get('screenshots', []))}")
@@ -110,11 +127,16 @@ def test(test_name, base_url, actions, logs, config, verbose):
110
127
  console.print(f"⏰ Timeline events: {len(timeline)}")
111
128
 
112
129
  # Save results to file for Cursor analysis
113
- output_file = f"{test_name.replace(' ', '_')}_test_results.json"
114
- with open(output_file, 'w') as f:
130
+ if not output:
131
+ # Auto-generate meaningful filename
132
+ session_id = results.get('session_id', 'unknown')
133
+ path_part = path.replace('/', '_') if path else 'root'
134
+ output = f"cursorflow_{path_part}_{session_id}.json"
135
+
136
+ with open(output, 'w') as f:
115
137
  json.dump(results, f, indent=2, default=str)
116
138
 
117
- console.print(f"💾 Full results saved to: [cyan]{output_file}[/cyan]")
139
+ console.print(f"💾 Full results saved to: [cyan]{output}[/cyan]")
118
140
  console.print(f"📁 Artifacts stored in: [cyan].cursorflow/artifacts/[/cyan]")
119
141
 
120
142
  except Exception as e:
@@ -26,7 +26,7 @@
26
26
  pip install cursorflow
27
27
 
28
28
  # Test your app
29
- cursorflow test my-component --base-url http://localhost:3000
29
+ cursorflow test --base-url http://localhost:3000 --path "/dashboard"
30
30
  ```
31
31
 
32
32
  **That's it!** CursorFlow captures screenshots, DOM data, network activity, console logs, and performance metrics automatically.
@@ -53,9 +53,9 @@ playwright install chromium # Optional - happens automatically
53
53
 
54
54
  ## 🎯 Basic Usage
55
55
 
56
- ### 1. Test Any Component
56
+ ### 1. Test Any Page
57
57
  ```bash
58
- cursorflow test dashboard --base-url http://localhost:3000
58
+ cursorflow test --base-url http://localhost:3000 --path "/dashboard"
59
59
  ```
60
60
 
61
61
  ### 2. Compare Design to Implementation
@@ -136,39 +136,162 @@ All data is structured for AI analysis:
136
136
 
137
137
  ### **Basic Testing**
138
138
  ```bash
139
- # Test a component
140
- cursorflow test component-name --base-url http://localhost:3000
139
+ # Simple page test (navigate and screenshot)
140
+ cursorflow test --base-url http://localhost:3000 --path "/dashboard"
141
141
 
142
142
  # Test with custom actions
143
- cursorflow test login --actions '[
143
+ cursorflow test --base-url http://localhost:3000 --actions '[
144
144
  {"navigate": "/login"},
145
- {"fill": {"selector": "#username", "value": "test"}},
146
- {"click": "#submit"},
147
- {"screenshot": "result"}
145
+ {"fill": {"selector": "#username", "value": "test@example.com"}},
146
+ {"fill": {"selector": "#password", "value": "password123"}},
147
+ {"click": "#login-button"},
148
+ {"wait_for": ".dashboard"},
149
+ {"screenshot": "logged-in"}
148
150
  ]'
151
+
152
+ # Test with all options
153
+ cursorflow test \
154
+ --base-url http://localhost:3000 \
155
+ --actions '[
156
+ {"navigate": "/products"},
157
+ {"wait_for": ".product-grid"},
158
+ {"click": ".filter-button"},
159
+ {"fill": {"selector": "#search", "value": "laptop"}},
160
+ {"click": "#apply-filter"},
161
+ {"wait": 2},
162
+ {"screenshot": "filtered-products"}
163
+ ]' \
164
+ --output results.json \
165
+ --verbose
149
166
  ```
150
167
 
151
168
  ### **Mockup Comparison**
152
169
  ```bash
153
- # Compare mockup to implementation
170
+ # Basic mockup comparison
154
171
  cursorflow compare-mockup https://mockup.com/design \
155
172
  --base-url http://localhost:3000
156
173
 
157
- # Test multiple viewports
174
+ # Compare with multiple viewports
158
175
  cursorflow compare-mockup https://mockup.com/design \
159
176
  --base-url http://localhost:3000 \
160
177
  --viewports '[
161
178
  {"width": 1440, "height": 900, "name": "desktop"},
162
- {"width": 768, "height": 1024, "name": "tablet"}
179
+ {"width": 768, "height": 1024, "name": "tablet"},
180
+ {"width": 375, "height": 667, "name": "mobile"}
163
181
  ]'
182
+
183
+ # Compare with custom actions on both mockup and implementation
184
+ cursorflow compare-mockup https://mockup.com/design \
185
+ --base-url http://localhost:3000 \
186
+ --mockup-actions '[
187
+ {"navigate": "/"},
188
+ {"click": "#menu-toggle"},
189
+ {"screenshot": "menu-open"}
190
+ ]' \
191
+ --implementation-actions '[
192
+ {"navigate": "/"},
193
+ {"wait_for": "#main-nav"},
194
+ {"click": "#menu-toggle"},
195
+ {"wait": 1},
196
+ {"screenshot": "menu-open"}
197
+ ]' \
198
+ --diff-threshold 0.1 \
199
+ --output comparison-results.json
164
200
  ```
165
201
 
166
202
  ### **CSS Iteration**
167
203
  ```bash
168
- # Iterate on CSS improvements
204
+ # Basic CSS iteration
205
+ cursorflow iterate-mockup https://mockup.com/design \
206
+ --base-url http://localhost:3000 \
207
+ --css-improvements '[
208
+ {"name": "spacing", "css": ".container { gap: 2rem; padding: 1.5rem; }"},
209
+ {"name": "colors", "css": ".button { background: #007bff; color: white; }"}
210
+ ]'
211
+
212
+ # CSS iteration with custom base actions
213
+ cursorflow iterate-mockup https://mockup.com/design \
214
+ --base-url http://localhost:3000 \
215
+ --base-actions '[
216
+ {"navigate": "/dashboard"},
217
+ {"wait_for": "#main-content"},
218
+ {"screenshot": "baseline"}
219
+ ]' \
220
+ --css-improvements '[
221
+ {"name": "improve-layout", "css": ".grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; }"},
222
+ {"name": "better-typography", "css": "h1 { font-size: 2.5rem; font-weight: 600; }"},
223
+ {"name": "enhanced-buttons", "css": ".btn { border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }"}
224
+ ]' \
225
+ --diff-threshold 0.05 \
226
+ --output iteration-results.json
227
+
228
+ # Load CSS improvements from file
169
229
  cursorflow iterate-mockup https://mockup.com/design \
170
230
  --base-url http://localhost:3000 \
171
- --css-improvements improvements.json
231
+ --css-improvements @css-improvements.json
232
+ ```
233
+
234
+ ### **Complete CLI Options Reference**
235
+
236
+ #### **`cursorflow test` Options:**
237
+ ```bash
238
+ cursorflow test [OPTIONS]
239
+
240
+ Required:
241
+ --base-url TEXT Base URL of the application to test
242
+
243
+ Optional:
244
+ --path TEXT Simple path to navigate to (e.g., "/dashboard")
245
+ --actions TEXT JSON array of actions to perform
246
+ --output TEXT Output file for results (default: prints to stdout)
247
+ --verbose Enable verbose logging
248
+ --headless Run browser in headless mode (default: true)
249
+ --timeout INTEGER Timeout in seconds for actions (default: 30)
250
+ ```
251
+
252
+ #### **`cursorflow compare-mockup` Options:**
253
+ ```bash
254
+ cursorflow compare-mockup MOCKUP_URL [OPTIONS]
255
+
256
+ Required:
257
+ MOCKUP_URL URL of the mockup/design to compare against
258
+ --base-url TEXT Base URL of the implementation
259
+
260
+ Optional:
261
+ --mockup-actions TEXT JSON array of actions for mockup
262
+ --implementation-actions TEXT JSON array of actions for implementation
263
+ --viewports TEXT JSON array of viewport configurations
264
+ --diff-threshold FLOAT Similarity threshold (0.0-1.0, default: 0.1)
265
+ --output TEXT Output file for comparison results
266
+ --verbose Enable verbose logging
267
+ ```
268
+
269
+ #### **`cursorflow iterate-mockup` Options:**
270
+ ```bash
271
+ cursorflow iterate-mockup MOCKUP_URL [OPTIONS]
272
+
273
+ Required:
274
+ MOCKUP_URL URL of the mockup/design to match
275
+ --base-url TEXT Base URL of the implementation
276
+
277
+ Optional:
278
+ --base-actions TEXT JSON array of base actions before CSS changes
279
+ --css-improvements TEXT JSON array of CSS improvements to test
280
+ --diff-threshold FLOAT Similarity threshold (0.0-1.0, default: 0.05)
281
+ --output TEXT Output file for iteration results
282
+ --verbose Enable verbose logging
283
+ ```
284
+
285
+ #### **Action Types Reference:**
286
+ ```json
287
+ {"navigate": "/path"} // Navigate to path
288
+ {"click": "#selector"} // Click element
289
+ {"fill": {"selector": "#input", "value": "text"}} // Fill input field
290
+ {"select": {"selector": "#dropdown", "value": "option"}} // Select dropdown option
291
+ {"wait": 2} // Wait seconds
292
+ {"wait_for": "#selector"} // Wait for element
293
+ {"screenshot": "name"} // Take screenshot
294
+ {"screenshot": "name", "full_page": true} // Full page screenshot
172
295
  ```
173
296
 
174
297
  ---
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cursorflow"
7
- version = "1.3.0"
7
+ version = "1.3.1"
8
8
  description = "Complete page intelligence for AI-driven development - captures DOM, network, console, and performance data"
9
9
  authors = [
10
10
  {name = "GeekWarrior Development", email = "support@cursorflow.dev"}
File without changes
File without changes
File without changes
File without changes