cursorflow 2.1.5__py3-none-any.whl → 2.1.6__py3-none-any.whl
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/__init__.py +1 -1
- cursorflow/auto_init.py +17 -13
- cursorflow/cli.py +19 -12
- cursorflow/install_cursorflow_rules.py +14 -11
- cursorflow/rules/cursorflow-installation.mdc +1 -1
- cursorflow/updater.py +4 -3
- {cursorflow-2.1.5.dist-info → cursorflow-2.1.6.dist-info}/METADATA +5 -2
- {cursorflow-2.1.5.dist-info → cursorflow-2.1.6.dist-info}/RECORD +12 -12
- {cursorflow-2.1.5.dist-info → cursorflow-2.1.6.dist-info}/WHEEL +0 -0
- {cursorflow-2.1.5.dist-info → cursorflow-2.1.6.dist-info}/entry_points.txt +0 -0
- {cursorflow-2.1.5.dist-info → cursorflow-2.1.6.dist-info}/licenses/LICENSE +0 -0
- {cursorflow-2.1.5.dist-info → cursorflow-2.1.6.dist-info}/top_level.txt +0 -0
cursorflow/__init__.py
CHANGED
cursorflow/auto_init.py
CHANGED
@@ -17,7 +17,7 @@ def is_project_initialized(project_dir: Optional[str] = None) -> bool:
|
|
17
17
|
|
18
18
|
Returns True if:
|
19
19
|
- .cursor/rules/ contains CursorFlow rules
|
20
|
-
- cursorflow
|
20
|
+
- .cursorflow/config.json exists
|
21
21
|
- .cursorflow/ directory exists
|
22
22
|
"""
|
23
23
|
if project_dir is None:
|
@@ -27,8 +27,7 @@ def is_project_initialized(project_dir: Optional[str] = None) -> bool:
|
|
27
27
|
|
28
28
|
# Check for key indicators
|
29
29
|
has_rules = (project_path / ".cursor" / "rules" / "cursorflow-usage.mdc").exists()
|
30
|
-
has_config = (project_path / "cursorflow
|
31
|
-
has_artifacts_dir = (project_path / ".cursorflow").exists()
|
30
|
+
has_config = (project_path / ".cursorflow" / "config.json").exists()
|
32
31
|
|
33
32
|
# Need at least rules and config
|
34
33
|
return has_rules and has_config
|
@@ -64,15 +63,20 @@ def auto_initialize_if_needed(project_dir: Optional[str] = None, interactive: bo
|
|
64
63
|
return False
|
65
64
|
|
66
65
|
# Interactive mode: ask user
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
66
|
+
if not sys.stdin.isatty():
|
67
|
+
# Non-interactive environment (CI, pipes, etc) - auto-accept
|
68
|
+
print("🎯 CursorFlow not initialized. Auto-initializing (non-interactive mode)...")
|
69
|
+
response = 'y'
|
70
|
+
else:
|
71
|
+
print("\n🎯 CursorFlow is not initialized in this project yet.")
|
72
|
+
print(f"📁 Project directory: {project_path}")
|
73
|
+
print("\nTo use CursorFlow, we need to set up:")
|
74
|
+
print(" • Cursor AI rules in .cursor/rules/")
|
75
|
+
print(" • Configuration file: .cursorflow/config.json")
|
76
|
+
print(" • Artifacts directory: .cursorflow/")
|
77
|
+
print(" • .gitignore entries for CursorFlow artifacts")
|
78
|
+
|
79
|
+
response = input("\n🚀 Initialize CursorFlow now? [Y/n]: ").strip().lower()
|
76
80
|
|
77
81
|
if response in ('', 'y', 'yes'):
|
78
82
|
try:
|
@@ -110,7 +114,7 @@ def get_initialization_warning() -> str:
|
|
110
114
|
║ ║
|
111
115
|
║ This creates: ║
|
112
116
|
║ • .cursor/rules/ (Cursor AI integration) ║
|
113
|
-
║ • cursorflow
|
117
|
+
║ • .cursorflow/config.json (project configuration) ║
|
114
118
|
║ • .cursorflow/ (artifacts and sessions) ║
|
115
119
|
║ • .gitignore entries ║
|
116
120
|
║ ║
|
cursorflow/cli.py
CHANGED
@@ -36,16 +36,21 @@ def main(ctx):
|
|
36
36
|
from .auto_init import is_project_initialized, auto_initialize_if_needed
|
37
37
|
|
38
38
|
if not is_project_initialized():
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
39
|
+
# Check if running in non-interactive mode (CI, scripts, etc)
|
40
|
+
import sys
|
41
|
+
is_interactive = sys.stdin.isatty()
|
42
|
+
|
43
|
+
if is_interactive:
|
44
|
+
console.print("\n[yellow]⚠️ CursorFlow not initialized in this project[/yellow]")
|
45
|
+
console.print("This is a one-time setup that creates:")
|
46
|
+
console.print(" • .cursor/rules/ (Cursor AI integration)")
|
47
|
+
console.print(" • .cursorflow/config.json (project configuration)")
|
48
|
+
console.print(" • .cursorflow/ (artifacts directory)")
|
49
|
+
|
50
|
+
# Auto-initialize with confirmation (or silently if non-interactive)
|
51
|
+
if not auto_initialize_if_needed(interactive=is_interactive):
|
47
52
|
console.print("\n[red]Cannot proceed without initialization.[/red]")
|
48
|
-
console.print("Run: [cyan]cursorflow install-rules[/cyan]")
|
53
|
+
console.print("Run: [cyan]cursorflow install-rules --yes[/cyan]")
|
49
54
|
ctx.exit(1)
|
50
55
|
|
51
56
|
@main.command()
|
@@ -474,10 +479,12 @@ async def _run_auto_tests(framework: str, base_url: str, config: Dict):
|
|
474
479
|
@click.argument('project_path', default='.')
|
475
480
|
@click.option('--framework', '-f')
|
476
481
|
@click.option('--force', is_flag=True, help='Force update existing configuration')
|
477
|
-
|
482
|
+
@click.option('--yes', '-y', is_flag=True, help='Skip confirmation prompts')
|
483
|
+
def install_rules(project_path, framework, force, yes):
|
478
484
|
"""Install CursorFlow rules and configuration in a project"""
|
479
485
|
|
480
|
-
|
486
|
+
if not yes:
|
487
|
+
console.print("🚀 Installing CursorFlow rules and configuration...")
|
481
488
|
|
482
489
|
try:
|
483
490
|
# Import and run the installation
|
@@ -487,7 +494,7 @@ def install_rules(project_path, framework, force):
|
|
487
494
|
if success:
|
488
495
|
console.print("[green]✅ CursorFlow rules installed successfully![/green]")
|
489
496
|
console.print("\nNext steps:")
|
490
|
-
console.print("1. Review cursorflow
|
497
|
+
console.print("1. Review .cursorflow/config.json")
|
491
498
|
console.print("2. Install dependencies: pip install cursorflow && playwright install chromium")
|
492
499
|
console.print("3. Start testing: Use CursorFlow in Cursor!")
|
493
500
|
else:
|
@@ -80,10 +80,9 @@ def install_cursorflow_rules(project_dir: str = ".", force: bool = False):
|
|
80
80
|
setup_update_checking(project_path)
|
81
81
|
|
82
82
|
print(f"\n📝 Next steps:")
|
83
|
-
print(f" 1. Review cursorflow
|
84
|
-
print(f" 2. Install
|
85
|
-
print(f" 3.
|
86
|
-
print(f" 4. Start using CursorFlow for UI testing and CSS iteration!")
|
83
|
+
print(f" 1. Review .cursorflow/config.json and update for your project")
|
84
|
+
print(f" 2. Install Playwright: playwright install chromium")
|
85
|
+
print(f" 3. Start using CursorFlow for UI testing and CSS iteration!")
|
87
86
|
print(f"\n🔄 Update commands:")
|
88
87
|
print(f" - Check for updates: python -m cursorflow check-updates")
|
89
88
|
print(f" - Update CursorFlow: python -m cursorflow update")
|
@@ -120,18 +119,22 @@ cursorflow_session_*.json
|
|
120
119
|
def create_config_template(project_path: Path, force: bool = False):
|
121
120
|
"""Create or update CursorFlow configuration template"""
|
122
121
|
|
123
|
-
|
122
|
+
# Create .cursorflow directory if it doesn't exist
|
123
|
+
cursorflow_dir = project_path / ".cursorflow"
|
124
|
+
cursorflow_dir.mkdir(exist_ok=True)
|
125
|
+
|
126
|
+
config_path = cursorflow_dir / "config.json"
|
124
127
|
|
125
128
|
# Get current version
|
126
129
|
try:
|
127
130
|
import cursorflow
|
128
|
-
current_version = getattr(cursorflow, '__version__', '2.1.
|
131
|
+
current_version = getattr(cursorflow, '__version__', '2.1.6')
|
129
132
|
except ImportError:
|
130
|
-
current_version = '2.1.
|
133
|
+
current_version = '2.1.6'
|
131
134
|
|
132
135
|
if config_path.exists():
|
133
136
|
if not force:
|
134
|
-
print("ℹ️ cursorflow
|
137
|
+
print("ℹ️ .cursorflow/config.json already exists (use --force to recreate)")
|
135
138
|
# Smart update: only update version and add missing fields
|
136
139
|
try:
|
137
140
|
with open(config_path) as f:
|
@@ -198,7 +201,7 @@ def create_config_template(project_path: Path, force: bool = False):
|
|
198
201
|
json.dump(config_template, f, indent=2)
|
199
202
|
|
200
203
|
action = "Recreated" if force else "Created"
|
201
|
-
print(f"✅ {action} configuration
|
204
|
+
print(f"✅ {action} configuration: .cursorflow/config.json")
|
202
205
|
print(f" Detected project type: {project_type}")
|
203
206
|
print(f" CursorFlow version: {current_version}")
|
204
207
|
|
@@ -302,9 +305,9 @@ def setup_update_checking(project_path: Path):
|
|
302
305
|
# Create initial version tracking
|
303
306
|
try:
|
304
307
|
import cursorflow
|
305
|
-
current_version = getattr(cursorflow, '__version__', '2.1.
|
308
|
+
current_version = getattr(cursorflow, '__version__', '2.1.6')
|
306
309
|
except ImportError:
|
307
|
-
current_version = '2.1.
|
310
|
+
current_version = '2.1.6'
|
308
311
|
|
309
312
|
version_info = {
|
310
313
|
"installed_version": current_version,
|
@@ -24,7 +24,7 @@ CursorFlow requires **TWO installations**:
|
|
24
24
|
This step created THIS FILE you're reading right now.
|
25
25
|
|
26
26
|
**If Cursor reports "command not found: cursorflow"**, the user needs Step 1.
|
27
|
-
**If you can run cursorflow but tests fail**, check
|
27
|
+
**If you can run cursorflow but tests fail**, check `.cursorflow/config.json` configuration.
|
28
28
|
|
29
29
|
## 🚀 **When to Install CursorFlow**
|
30
30
|
|
cursorflow/updater.py
CHANGED
@@ -363,7 +363,7 @@ class CursorFlowUpdater:
|
|
363
363
|
|
364
364
|
async def _migrate_configuration(self) -> bool:
|
365
365
|
"""Migrate configuration to new format if needed"""
|
366
|
-
config_file = self.project_dir / "cursorflow
|
366
|
+
config_file = self.project_dir / ".cursorflow" / "config.json"
|
367
367
|
|
368
368
|
if not config_file.exists():
|
369
369
|
return True
|
@@ -417,9 +417,10 @@ class CursorFlowUpdater:
|
|
417
417
|
backup_path = backup_dir / backup_name
|
418
418
|
|
419
419
|
# Backup configuration and rules
|
420
|
-
|
420
|
+
config_file = self.project_dir / ".cursorflow" / "config.json"
|
421
|
+
if config_file.exists():
|
421
422
|
shutil.copy2(
|
422
|
-
|
423
|
+
config_file,
|
423
424
|
backup_path.with_suffix('.config.json')
|
424
425
|
)
|
425
426
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: cursorflow
|
3
|
-
Version: 2.1.
|
3
|
+
Version: 2.1.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
|
@@ -148,11 +148,14 @@ playwright install chromium
|
|
148
148
|
```bash
|
149
149
|
cd /path/to/your/project
|
150
150
|
cursorflow install-rules
|
151
|
+
|
152
|
+
# Or skip prompts for automation/CI
|
153
|
+
cursorflow install-rules --yes
|
151
154
|
```
|
152
155
|
|
153
156
|
This creates:
|
154
157
|
- `.cursor/rules/` - Cursor AI integration rules
|
155
|
-
-
|
158
|
+
- `.cursorflow/config.json` - Project-specific configuration
|
156
159
|
- `.cursorflow/` - Artifacts and session storage
|
157
160
|
- `.gitignore` entries for CursorFlow artifacts
|
158
161
|
|
@@ -1,10 +1,10 @@
|
|
1
|
-
cursorflow/__init__.py,sha256=
|
2
|
-
cursorflow/auto_init.py,sha256=
|
1
|
+
cursorflow/__init__.py,sha256=6fFhPsv_4SP9xjmte1e47Sn9ikjQ-6jU_XyWpBcyMYs,2763
|
2
|
+
cursorflow/auto_init.py,sha256=dXQaXXiXe4wkUP-jd8fcJ5fYVt7ASdTb47b7SzXymOM,6122
|
3
3
|
cursorflow/auto_updater.py,sha256=oQ12TIMZ6Cm3HF-x9iRWFtvOLkRh-JWPqitS69-4roE,7851
|
4
|
-
cursorflow/cli.py,sha256=
|
5
|
-
cursorflow/install_cursorflow_rules.py,sha256=
|
4
|
+
cursorflow/cli.py,sha256=B0kmF_QdXWV2T3ibv55PKNF52Wu8wFQaLsAeVy1KGBI,28717
|
5
|
+
cursorflow/install_cursorflow_rules.py,sha256=tMjvB1zk54wuVGOaVJPCDB6v4B8A6o0WdKx6_1QBqiM,11864
|
6
6
|
cursorflow/post_install.py,sha256=WieBiKWG0qBAQpF8iMVWUyb9Fr2Xky9qECTMPrlAbpE,2678
|
7
|
-
cursorflow/updater.py,sha256=
|
7
|
+
cursorflow/updater.py,sha256=SroSQHQi5cYyzcOK_bf-WzmQmE7yeOs8qo3r__j-Z6E,19583
|
8
8
|
cursorflow/core/agent.py,sha256=f3lecgEzDRDdGTVccAtorpLGfNJJ49bbsQAmgr0vNGg,10136
|
9
9
|
cursorflow/core/auth_handler.py,sha256=oRafO6ZdxoHryBIvHsrNV8TECed4GXpJsdEiH0KdPPk,17149
|
10
10
|
cursorflow/core/browser_controller.py,sha256=KZXSrXInju09Q--D_ULej4_hc5s7qv-7ODxW4WS0nHw,131708
|
@@ -26,11 +26,11 @@ cursorflow/core/trace_manager.py,sha256=Jj9ultZrL1atiZXfcRVI6ynCnnfqZM-X0_taxt-l
|
|
26
26
|
cursorflow/log_sources/local_file.py,sha256=YAzF6oZRusNT_EOJduoeMTgP6dc1Av9wK96yNxmhSGA,7558
|
27
27
|
cursorflow/log_sources/ssh_remote.py,sha256=xLLxm5B95kUcLqMC7-oZUA66e1rU5LLeeBiR6Mw5syc,7642
|
28
28
|
cursorflow/rules/__init__.py,sha256=gPcA-IkhXj03sl7cvZV0wwo7CtEkcyuKs4y0F5oQbqE,458
|
29
|
-
cursorflow/rules/cursorflow-installation.mdc,sha256=
|
29
|
+
cursorflow/rules/cursorflow-installation.mdc,sha256=y4nj5XSROuBRXDK8GtfcEMRBqliQcEuvXYGyTPAZD8Q,10190
|
30
30
|
cursorflow/rules/cursorflow-usage.mdc,sha256=jD5IrIP2eKIeQN2TS-ehnwD1u_J6lWSXQZZ9KSUcOUU,21449
|
31
|
-
cursorflow-2.1.
|
32
|
-
cursorflow-2.1.
|
33
|
-
cursorflow-2.1.
|
34
|
-
cursorflow-2.1.
|
35
|
-
cursorflow-2.1.
|
36
|
-
cursorflow-2.1.
|
31
|
+
cursorflow-2.1.6.dist-info/licenses/LICENSE,sha256=e4QbjAsj3bW-xgQOvQelr8sGLYDoqc48k6cKgCr_pBU,1080
|
32
|
+
cursorflow-2.1.6.dist-info/METADATA,sha256=JahJbtiiK_gJyOvamARnNgLbKUjGUlMxysOe28X8UNQ,12790
|
33
|
+
cursorflow-2.1.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
34
|
+
cursorflow-2.1.6.dist-info/entry_points.txt,sha256=-Ed_n4Uff7wClEtWS-Py6xmQabecB9f0QAOjX0w7ljA,51
|
35
|
+
cursorflow-2.1.6.dist-info/top_level.txt,sha256=t1UZwRyZP4u-ng2CEcNHmk_ZT4ibQxoihB2IjTF7ovc,11
|
36
|
+
cursorflow-2.1.6.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|