frontend-perception-engine 0.1.0__tar.gz → 0.1.2__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 (57) hide show
  1. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/PKG-INFO +16 -4
  2. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/README.md +15 -3
  3. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/pyproject.toml +2 -1
  4. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/frontend_perception_engine.egg-info/PKG-INFO +16 -4
  5. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/frontend_perception_engine.egg-info/SOURCES.txt +2 -0
  6. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/frontend_perception_engine.egg-info/entry_points.txt +1 -0
  7. frontend_perception_engine-0.1.2/src/navigation/cli/__init__.py +1 -0
  8. frontend_perception_engine-0.1.2/src/navigation/cli/install.py +204 -0
  9. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/setup.cfg +0 -0
  10. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/frontend_perception_engine.egg-info/dependency_links.txt +0 -0
  11. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/frontend_perception_engine.egg-info/requires.txt +0 -0
  12. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/frontend_perception_engine.egg-info/top_level.txt +0 -0
  13. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/__init__.py +0 -0
  14. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/browser_use/__init__.py +0 -0
  15. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/browser_use/agent_runner.py +0 -0
  16. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/browser_use/hints.py +0 -0
  17. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/browser_use/integration.py +0 -0
  18. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/browser_use/llm.py +0 -0
  19. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/codeGraph/__init__.py +0 -0
  20. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/codeGraph/crg_impl.py +0 -0
  21. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/codeGraph/factory.py +0 -0
  22. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/codeGraph/interface.py +0 -0
  23. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/codeGraph/null_impl.py +0 -0
  24. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/mcp/__init__.py +0 -0
  25. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/mcp/__main__.py +0 -0
  26. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/mcp/diff.py +0 -0
  27. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/mcp/envelope.py +0 -0
  28. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/mcp/handlers.py +0 -0
  29. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/mcp/instructions.py +0 -0
  30. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/mcp/resources.py +0 -0
  31. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/mcp/scan_registry.py +0 -0
  32. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/mcp/server.py +0 -0
  33. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/mcp/session_store.py +0 -0
  34. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/mcp/tools.py +0 -0
  35. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/__init__.py +0 -0
  36. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/artifacts.py +0 -0
  37. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/auth_gate.py +0 -0
  38. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/budget.py +0 -0
  39. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/cdp_hub.py +0 -0
  40. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/dev_insights.py +0 -0
  41. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/exploration.py +0 -0
  42. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/feature_flags.py +0 -0
  43. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/file_upload.py +0 -0
  44. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/flow_graph.py +0 -0
  45. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/form_probe.py +0 -0
  46. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/iframe_context.py +0 -0
  47. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/observation.py +0 -0
  48. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/preflight.py +0 -0
  49. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/rich_editors.py +0 -0
  50. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/route_guards.py +0 -0
  51. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/runner.py +0 -0
  52. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/scan.py +0 -0
  53. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/scripted_actions.py +0 -0
  54. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/state_manager.py +0 -0
  55. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/verification.py +0 -0
  56. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/virtual_scroll.py +0 -0
  57. {frontend_perception_engine-0.1.0 → frontend_perception_engine-0.1.2}/src/navigation/perception/websocket_observer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frontend-perception-engine
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Frontend perception engine with optional CRG-powered navigation hints for Browser Use.
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -55,13 +55,25 @@ Your coding agent (Cursor/Claude/Codex) remains the brain.
55
55
 
56
56
  ### Install
57
57
 
58
- Development install:
58
+ Recommended (quiet output + next steps):
59
59
 
60
60
  ```bash
61
- pip install -e .
61
+ uvx --from frontend-perception-engine frontend-perception-install
62
+ ```
63
+
64
+ With Chromium for Browser Use:
65
+
66
+ ```bash
67
+ uvx --from frontend-perception-engine frontend-perception-install --with-browser
68
+ ```
69
+
70
+ Development install from this repo:
71
+
72
+ ```bash
73
+ python -m navigation.cli.install --editable .
62
74
  ```
63
75
 
64
- Published package usage (when installed from index):
76
+ Or classic pip:
65
77
 
66
78
  ```bash
67
79
  pip install frontend-perception-engine
@@ -42,13 +42,25 @@ Your coding agent (Cursor/Claude/Codex) remains the brain.
42
42
 
43
43
  ### Install
44
44
 
45
- Development install:
45
+ Recommended (quiet output + next steps):
46
46
 
47
47
  ```bash
48
- pip install -e .
48
+ uvx --from frontend-perception-engine frontend-perception-install
49
+ ```
50
+
51
+ With Chromium for Browser Use:
52
+
53
+ ```bash
54
+ uvx --from frontend-perception-engine frontend-perception-install --with-browser
55
+ ```
56
+
57
+ Development install from this repo:
58
+
59
+ ```bash
60
+ python -m navigation.cli.install --editable .
49
61
  ```
50
62
 
51
- Published package usage (when installed from index):
63
+ Or classic pip:
52
64
 
53
65
  ```bash
54
66
  pip install frontend-perception-engine
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "frontend-perception-engine"
3
- version = "0.1.0"
3
+ version = "0.1.2"
4
4
  description = "Frontend perception engine with optional CRG-powered navigation hints for Browser Use."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -13,6 +13,7 @@ dependencies = [
13
13
 
14
14
  [project.scripts]
15
15
  frontend-perception-mcp = "navigation.mcp.server:main"
16
+ frontend-perception-install = "navigation.cli.install:main"
16
17
 
17
18
  [project.optional-dependencies]
18
19
  aws = ["boto3>=1.35.0"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frontend-perception-engine
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Frontend perception engine with optional CRG-powered navigation hints for Browser Use.
5
5
  Requires-Python: >=3.10
6
6
  Description-Content-Type: text/markdown
@@ -55,13 +55,25 @@ Your coding agent (Cursor/Claude/Codex) remains the brain.
55
55
 
56
56
  ### Install
57
57
 
58
- Development install:
58
+ Recommended (quiet output + next steps):
59
59
 
60
60
  ```bash
61
- pip install -e .
61
+ uvx --from frontend-perception-engine frontend-perception-install
62
+ ```
63
+
64
+ With Chromium for Browser Use:
65
+
66
+ ```bash
67
+ uvx --from frontend-perception-engine frontend-perception-install --with-browser
68
+ ```
69
+
70
+ Development install from this repo:
71
+
72
+ ```bash
73
+ python -m navigation.cli.install --editable .
62
74
  ```
63
75
 
64
- Published package usage (when installed from index):
76
+ Or classic pip:
65
77
 
66
78
  ```bash
67
79
  pip install frontend-perception-engine
@@ -12,6 +12,8 @@ src/navigation/browser_use/agent_runner.py
12
12
  src/navigation/browser_use/hints.py
13
13
  src/navigation/browser_use/integration.py
14
14
  src/navigation/browser_use/llm.py
15
+ src/navigation/cli/__init__.py
16
+ src/navigation/cli/install.py
15
17
  src/navigation/codeGraph/__init__.py
16
18
  src/navigation/codeGraph/crg_impl.py
17
19
  src/navigation/codeGraph/factory.py
@@ -1,2 +1,3 @@
1
1
  [console_scripts]
2
+ frontend-perception-install = navigation.cli.install:main
2
3
  frontend-perception-mcp = navigation.mcp.server:main
@@ -0,0 +1 @@
1
+ """User-facing CLI helpers for frontend-perception-engine."""
@@ -0,0 +1,204 @@
1
+ """Quiet install wrapper with a simple progress indicator."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import argparse
6
+ import itertools
7
+ import platform
8
+ import shutil
9
+ import subprocess
10
+ import sys
11
+ import threading
12
+ import time
13
+ from collections.abc import Sequence
14
+ from pathlib import Path
15
+
16
+ PACKAGE_NAME = 'frontend-perception-engine'
17
+ _SPINNER_FRAMES = '|/-\\'
18
+
19
+
20
+ class _Spinner:
21
+ def __init__(self, message: str) -> None:
22
+ self._message = message
23
+ self._stop = threading.Event()
24
+ self._thread: threading.Thread | None = None
25
+
26
+ def __enter__(self) -> _Spinner:
27
+ self._thread = threading.Thread(target=self._run, daemon=True)
28
+ self._thread.start()
29
+ return self
30
+
31
+ def __exit__(self, *_args: object) -> None:
32
+ self._stop.set()
33
+ if self._thread is not None:
34
+ self._thread.join()
35
+ width = len(self._message) + 6
36
+ sys.stdout.write('\r' + (' ' * width) + '\r')
37
+ sys.stdout.flush()
38
+
39
+ def _run(self) -> None:
40
+ for frame in itertools.cycle(_SPINNER_FRAMES):
41
+ if self._stop.is_set():
42
+ break
43
+ sys.stdout.write(f'\r {frame} {self._message}')
44
+ sys.stdout.flush()
45
+ time.sleep(0.1)
46
+
47
+
48
+ def _pip_available() -> bool:
49
+ result = subprocess.run(
50
+ [sys.executable, '-m', 'pip', '--version'],
51
+ capture_output=True,
52
+ )
53
+ return result.returncode == 0
54
+
55
+
56
+ def _build_install_command(*, upgrade: bool, editable: str | None) -> list[str]:
57
+ target: list[str]
58
+ if editable is not None:
59
+ target = ['-e', editable]
60
+ else:
61
+ target = [PACKAGE_NAME]
62
+
63
+ if _pip_available():
64
+ cmd = [
65
+ sys.executable,
66
+ '-m',
67
+ 'pip',
68
+ 'install',
69
+ '-q',
70
+ '--disable-pip-version-check',
71
+ ]
72
+ if upgrade:
73
+ cmd.append('--upgrade')
74
+ cmd.extend(target)
75
+ return cmd
76
+
77
+ uv = shutil.which('uv')
78
+ if uv is not None:
79
+ cmd = [uv, 'pip', 'install', '-q']
80
+ if upgrade:
81
+ cmd.append('--upgrade')
82
+ cmd.extend(target)
83
+ return cmd
84
+
85
+ raise SystemExit(
86
+ 'No installer available. Install pip or uv, or use:\n'
87
+ ' uvx --from frontend-perception-engine frontend-perception-mcp\n',
88
+ )
89
+
90
+
91
+ def _build_browser_install_command() -> list[str]:
92
+ cmd = ['uvx', 'playwright', 'install', 'chromium']
93
+ if platform.system() == 'Linux':
94
+ cmd.append('--with-deps')
95
+ cmd.append('--no-shell')
96
+ return cmd
97
+
98
+
99
+ def _run_quiet(cmd: Sequence[str], *, label: str) -> None:
100
+ with _Spinner(label):
101
+ result = subprocess.run(
102
+ list(cmd),
103
+ capture_output=True,
104
+ text=True,
105
+ )
106
+ if result.returncode != 0:
107
+ sys.stderr.write(f'\nInstallation failed ({label}).\n')
108
+ if result.stderr.strip():
109
+ sys.stderr.write(result.stderr.strip() + '\n')
110
+ raise SystemExit(result.returncode or 1)
111
+
112
+
113
+ def _installed_version() -> str | None:
114
+ try:
115
+ from importlib.metadata import version
116
+
117
+ return version(PACKAGE_NAME)
118
+ except Exception:
119
+ return None
120
+
121
+
122
+ def _print_success(*, with_browser: bool) -> None:
123
+ version = _installed_version()
124
+ version_suffix = f' ({version})' if version else ''
125
+ sys.stdout.write(f'\n OK Successfully installed {PACKAGE_NAME}{version_suffix}\n\n')
126
+ sys.stdout.write(' Run MCP server:\n')
127
+ sys.stdout.write(' frontend-perception-mcp\n\n')
128
+ sys.stdout.write(' Or with uvx (no global install):\n')
129
+ sys.stdout.write(' uvx --from frontend-perception-engine frontend-perception-mcp\n\n')
130
+ sys.stdout.write(' Cursor MCP config:\n')
131
+ sys.stdout.write(' {\n')
132
+ sys.stdout.write(' "mcpServers": {\n')
133
+ sys.stdout.write(' "frontend-perception": {\n')
134
+ sys.stdout.write(' "command": "uvx",\n')
135
+ sys.stdout.write(' "args": ["--from", "frontend-perception-engine", "frontend-perception-mcp"]\n')
136
+ sys.stdout.write(' }\n')
137
+ sys.stdout.write(' }\n')
138
+ sys.stdout.write(' }\n')
139
+ if with_browser:
140
+ sys.stdout.write('\n Chromium is ready for Browser Use.\n')
141
+ sys.stdout.flush()
142
+
143
+
144
+ def _parse_args(argv: Sequence[str] | None = None) -> argparse.Namespace:
145
+ parser = argparse.ArgumentParser(
146
+ prog='frontend-perception-install',
147
+ description='Install frontend-perception-engine with minimal output.',
148
+ )
149
+ parser.add_argument(
150
+ '-U',
151
+ '--upgrade',
152
+ action='store_true',
153
+ help='Upgrade an existing installation.',
154
+ )
155
+ parser.add_argument(
156
+ '-e',
157
+ '--editable',
158
+ metavar='PATH',
159
+ help='Install from a local checkout (pip install -e PATH).',
160
+ )
161
+ parser.add_argument(
162
+ '--with-browser',
163
+ action='store_true',
164
+ help='Also install Chromium for Browser Use (via playwright).',
165
+ )
166
+ return parser.parse_args(list(argv) if argv is not None else None)
167
+
168
+
169
+ def main(argv: Sequence[str] | None = None) -> None:
170
+ args = _parse_args(argv)
171
+
172
+ if args.editable is not None:
173
+ editable_path = str(Path(args.editable).expanduser().resolve())
174
+ label = 'Installing frontend-perception-engine (editable)'
175
+ else:
176
+ editable_path = None
177
+ label = 'Installing frontend-perception-engine'
178
+
179
+ if (
180
+ not args.upgrade
181
+ and editable_path is None
182
+ and _installed_version() is not None
183
+ and not _pip_available()
184
+ ):
185
+ _print_success(with_browser=False)
186
+ return
187
+
188
+ _run_quiet(_build_install_command(upgrade=args.upgrade, editable=editable_path), label=label)
189
+
190
+ if args.with_browser:
191
+ browser_cmd = _build_browser_install_command()
192
+ if shutil.which(browser_cmd[0]) is None:
193
+ sys.stderr.write(
194
+ '\nSkipped browser setup: uvx not found on PATH.\n'
195
+ 'Install uv (https://docs.astral.sh/uv/) or run: uvx playwright install chromium\n',
196
+ )
197
+ else:
198
+ _run_quiet(browser_cmd, label='Setting up Chromium')
199
+
200
+ _print_success(with_browser=args.with_browser)
201
+
202
+
203
+ if __name__ == '__main__':
204
+ main()