reverse-api-engineer 0.2.2__tar.gz → 0.2.3__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 (33) hide show
  1. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/CHANGELOG.md +7 -0
  2. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/PKG-INFO +9 -12
  3. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/README.md +8 -10
  4. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/pyproject.toml +3 -2
  5. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/src/reverse_api/__init__.py +1 -1
  6. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/src/reverse_api/browser.py +46 -87
  7. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/src/reverse_api/engineer.py +5 -0
  8. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/src/reverse_api/opencode_ui.py +65 -51
  9. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/src/reverse_api/utils.py +5 -0
  10. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/uv.lock +26 -3530
  11. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/.claude/settings.local.json +0 -0
  12. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/.gitignore +0 -0
  13. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/.python-version +0 -0
  14. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/CONTRIBUTING.md +0 -0
  15. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/LICENSE +0 -0
  16. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/assets/reverse-api-banner.svg +0 -0
  17. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/assets/reverse-api-engineer.gif +0 -0
  18. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/assets/reverse-api-logo.svg +0 -0
  19. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/scripts/fetch_all_jobs/README.md +0 -0
  20. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/scripts/fetch_all_jobs/api_client.py +0 -0
  21. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/scripts/post_x/README.md +0 -0
  22. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/scripts/post_x/api_client.py +0 -0
  23. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/scripts/post_x/example_usage.py +0 -0
  24. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/scripts/web_scraping_task/README.md +0 -0
  25. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/scripts/web_scraping_task/api_client.py +0 -0
  26. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/scripts/web_scraping_task/example_usage.py +0 -0
  27. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/src/reverse_api/base_engineer.py +0 -0
  28. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/src/reverse_api/cli.py +0 -0
  29. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/src/reverse_api/config.py +0 -0
  30. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/src/reverse_api/messages.py +0 -0
  31. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/src/reverse_api/opencode_engineer.py +0 -0
  32. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/src/reverse_api/session.py +0 -0
  33. {reverse_api_engineer-0.2.2 → reverse_api_engineer-0.2.3}/src/reverse_api/tui.py +0 -0
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.2.3] - 2025-12-27
9
+
10
+ ### Changed
11
+ - **Version display**: Fix hardcoded version display
12
+ - **Logs display**: Remove agent logs, claude agent sdk logs
13
+ - **Browser-use installation**: Better instructions on how to install bu for agent mode
14
+
8
15
  ## [0.2.2] - 2025-12-26
9
16
 
10
17
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reverse-api-engineer
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: A tool to capture browser traffic for API reverse engineering
5
5
  Project-URL: Homepage, https://github.com/kalil0321/reverse-api-engineer
6
6
  Project-URL: Repository, https://github.com/kalil0321/reverse-api-engineer
@@ -30,7 +30,6 @@ Requires-Dist: questionary>=2.0.0
30
30
  Requires-Dist: requests>=2.32.5
31
31
  Requires-Dist: rich>=13.0.0
32
32
  Provides-Extra: agent
33
- Requires-Dist: browser-use; extra == 'agent'
34
33
  Requires-Dist: stagehand; extra == 'agent'
35
34
  Description-Content-Type: text/markdown
36
35
 
@@ -74,9 +73,11 @@ CLI tool that captures browser traffic and automatically generates production-re
74
73
  # Basic installation (manual and engineer modes)
75
74
  pip install reverse-api-engineer
76
75
 
77
- # With agent mode support (includes browser-use)
76
+ # With agent mode support
78
77
  pip install 'reverse-api-engineer[agent]'
79
- pip install git+https://github.com/browser-use/browser-use.git@49a345fb19e9f12befc5cc1658e0033873892455T
78
+
79
+ # Install browser-use with HAR recording support (required for agent mode)
80
+ pip install git+https://github.com/browser-use/browser-use.git@49a345fb19e9f12befc5cc1658e0033873892455
80
81
  ```
81
82
 
82
83
  ### Using uv (recommended)
@@ -84,9 +85,8 @@ pip install git+https://github.com/browser-use/browser-use.git@49a345fb19e9f12be
84
85
  # Basic installation
85
86
  uv tool install reverse-api-engineer
86
87
 
87
- # With agent mode support
88
- uv tool install 'reverse-api-engineer[agent]'
89
- uv pip install git+https://github.com/browser-use/browser-use.git@49a345fb19e9f12befc5cc1658e0033873892455
88
+ # With agent mode support (includes browser-use with HAR recording)
89
+ uv tool install 'reverse-api-engineer[agent]' --with 'browser-use @ git+https://github.com/browser-use/browser-use.git@49a345fb19e9f12befc5cc1658e0033873892455'
90
90
  ```
91
91
 
92
92
  ### From source
@@ -142,7 +142,7 @@ reverse-api-engineer engineer <run_id>
142
142
 
143
143
  Fully automated browser interaction using AI agents:
144
144
 
145
- 1. Install with agent support: `pip install 'reverse-api-engineer[agent]'` or `uv tool install 'reverse-api-engineer[agent]'`
145
+ 1. Install with agent support (see installation instructions above for pip or uv)
146
146
  2. Start the CLI: `reverse-api-engineer`
147
147
  3. Switch to agent mode (Shift+Tab until you see `[agent]`)
148
148
  4. Enter your task description (e.g., "Click on the first job listing")
@@ -151,10 +151,7 @@ Fully automated browser interaction using AI agents:
151
151
  7. HAR is captured automatically
152
152
  8. Optionally run reverse engineering to generate API client
153
153
 
154
- **Note:** If you need a specific version of browser-use from git, install it separately:
155
- ```bash
156
- pip install git+https://github.com/browser-use/browser-use.git@<commit-hash>
157
- ```
154
+ **Important:** Browser-use must be installed from the specific git commit shown in the installation instructions above. This version includes HAR recording support which is not yet available in the PyPI release.
158
155
 
159
156
  **Agent Provider Configuration:**
160
157
  - **Browser-Use** (default): Supports Browser-Use LLM, OpenAI, and Google models
@@ -38,9 +38,11 @@ CLI tool that captures browser traffic and automatically generates production-re
38
38
  # Basic installation (manual and engineer modes)
39
39
  pip install reverse-api-engineer
40
40
 
41
- # With agent mode support (includes browser-use)
41
+ # With agent mode support
42
42
  pip install 'reverse-api-engineer[agent]'
43
- pip install git+https://github.com/browser-use/browser-use.git@49a345fb19e9f12befc5cc1658e0033873892455T
43
+
44
+ # Install browser-use with HAR recording support (required for agent mode)
45
+ pip install git+https://github.com/browser-use/browser-use.git@49a345fb19e9f12befc5cc1658e0033873892455
44
46
  ```
45
47
 
46
48
  ### Using uv (recommended)
@@ -48,9 +50,8 @@ pip install git+https://github.com/browser-use/browser-use.git@49a345fb19e9f12be
48
50
  # Basic installation
49
51
  uv tool install reverse-api-engineer
50
52
 
51
- # With agent mode support
52
- uv tool install 'reverse-api-engineer[agent]'
53
- uv pip install git+https://github.com/browser-use/browser-use.git@49a345fb19e9f12befc5cc1658e0033873892455
53
+ # With agent mode support (includes browser-use with HAR recording)
54
+ uv tool install 'reverse-api-engineer[agent]' --with 'browser-use @ git+https://github.com/browser-use/browser-use.git@49a345fb19e9f12befc5cc1658e0033873892455'
54
55
  ```
55
56
 
56
57
  ### From source
@@ -106,7 +107,7 @@ reverse-api-engineer engineer <run_id>
106
107
 
107
108
  Fully automated browser interaction using AI agents:
108
109
 
109
- 1. Install with agent support: `pip install 'reverse-api-engineer[agent]'` or `uv tool install 'reverse-api-engineer[agent]'`
110
+ 1. Install with agent support (see installation instructions above for pip or uv)
110
111
  2. Start the CLI: `reverse-api-engineer`
111
112
  3. Switch to agent mode (Shift+Tab until you see `[agent]`)
112
113
  4. Enter your task description (e.g., "Click on the first job listing")
@@ -115,10 +116,7 @@ Fully automated browser interaction using AI agents:
115
116
  7. HAR is captured automatically
116
117
  8. Optionally run reverse engineering to generate API client
117
118
 
118
- **Note:** If you need a specific version of browser-use from git, install it separately:
119
- ```bash
120
- pip install git+https://github.com/browser-use/browser-use.git@<commit-hash>
121
- ```
119
+ **Important:** Browser-use must be installed from the specific git commit shown in the installation instructions above. This version includes HAR recording support which is not yet available in the PyPI release.
122
120
 
123
121
  **Agent Provider Configuration:**
124
122
  - **Browser-Use** (default): Supports Browser-Use LLM, OpenAI, and Google models
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "reverse-api-engineer"
3
- version = "0.2.2"
3
+ version = "0.2.3"
4
4
  description = "A tool to capture browser traffic for API reverse engineering"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -35,7 +35,8 @@ dependencies = [
35
35
 
36
36
  [project.optional-dependencies]
37
37
  agent = [
38
- "browser-use",
38
+ # browser-use must be installed separately from git (PyPI doesn't allow git dependencies)
39
+ # See installation instructions in README
39
40
  "stagehand"
40
41
  ]
41
42
 
@@ -1,3 +1,3 @@
1
1
  """Reverse API - Browser traffic capture for API reverse engineering."""
2
2
 
3
- __version__ = "0.2.2"
3
+ __version__ = "0.2.3"
@@ -19,6 +19,7 @@ from rich.console import Console
19
19
  from rich.status import Status
20
20
 
21
21
  from .utils import get_har_dir, get_timestamp
22
+ from . import __version__
22
23
 
23
24
  console = Console()
24
25
 
@@ -386,7 +387,7 @@ class ManualBrowser:
386
387
  # Wait for browser to close
387
388
  try:
388
389
  while self._context.pages:
389
- self._context.pages[0].wait_for_timeout(100)
390
+ self._context.pages[0].wait_for_timeout(100)
390
391
  except Exception:
391
392
  pass
392
393
 
@@ -435,7 +436,7 @@ class ManualBrowser:
435
436
  time.sleep(1)
436
437
 
437
438
  status.update(" [dim]saving har file...[/dim]")
438
- self._context.close()
439
+ self._context.close()
439
440
 
440
441
  if self.har_path.exists():
441
442
  har_size = self.har_path.stat().st_size
@@ -675,69 +676,43 @@ class AgentBrowser:
675
676
  async def _run_with_browser_use(self) -> dict:
676
677
  """Run agent with HAR recording via browser-use's built-in HAR capture."""
677
678
  import logging
679
+ import os
678
680
 
679
- # Custom handler to capture memory logs
680
- class MemoryLogHandler(logging.Handler):
681
- def __init__(self, console_instance):
682
- super().__init__()
683
- self.console = console_instance
684
-
685
- def emit(self, record):
686
- try:
687
- msg = record.getMessage()
688
-
689
- if "🧠 Memory:" in msg or ("Memory:" in msg and "🧠" not in msg):
690
- if "🧠 Memory:" in msg:
691
- memory_text = msg.split("🧠 Memory:", 1)[-1].strip()
692
- elif "Memory:" in msg:
693
- memory_text = msg.split("Memory:", 1)[-1].strip()
694
- else:
695
- memory_text = msg
696
-
697
- memory_text = " ".join(memory_text.split())
698
-
699
- if memory_text:
700
- self.console.print(f" [dim]{memory_text}[/dim]")
701
- except Exception:
702
- pass # Silently ignore handler errors
703
-
704
- # Suppress all browser-use logs completely
705
- # Keep INFO level for memory capture, but prevent propagation to parent handlers
706
- null_handler = logging.NullHandler()
707
-
708
- browser_use_logger = logging.getLogger("browser_use")
709
- browser_use_logger.setLevel(logging.INFO)
710
- browser_use_logger.handlers.clear() # Remove existing handlers
711
- browser_use_logger.propagate = False
712
-
713
- agent_logger = logging.getLogger("Agent")
714
- agent_logger.setLevel(logging.INFO)
715
- agent_logger.handlers.clear() # Remove existing handlers
716
- agent_logger.propagate = False
717
-
718
- # Suppress these loggers completely
719
- for logger_name in ["BrowserSession", "service", "tools"]:
720
- logger = logging.getLogger(logger_name)
721
- logger.setLevel(logging.CRITICAL)
722
- logger.handlers.clear()
723
- logger.addHandler(null_handler)
724
- logger.propagate = False
681
+ # Set before importing to ensure it takes effect
682
+ os.environ['BROWSER_USE_LOGGING_LEVEL'] = 'WARNING'
725
683
 
684
+ # Import browser-use after setting environment variable
726
685
  try:
727
686
  from browser_use import Agent, Browser
728
687
  from browser_use import ChatBrowserUse
688
+
689
+ # Suppress all browser-use loggers after import
690
+ def suppress_browser_use_logs():
691
+ for logger_name in [
692
+ "browser_use",
693
+ "Agent",
694
+ "BrowserSession",
695
+ "service",
696
+ "tools",
697
+ ]:
698
+ logger = logging.getLogger(logger_name)
699
+ logger.setLevel(logging.CRITICAL)
700
+ logger.handlers.clear()
701
+ logger.addHandler(logging.NullHandler())
702
+ logger.propagate = False
703
+
704
+ suppress_browser_use_logs()
729
705
  except ImportError:
730
706
  result = {
731
707
  "success": False,
732
708
  "message": None,
733
- "error": "browser-use is required for agent mode. Install it with: pip install 'reverse-api-engineer[agent]' or pip install browser-use",
709
+ "error": "browser-use is required for agent mode. Install it with: pip install git+https://github.com/browser-use/browser-use.git@49a345fb19e9f12befc5cc1658e0033873892455",
734
710
  }
735
711
  console.print(f" [red]error:[/red] {result['error']}")
736
712
  return result
737
713
 
738
714
  result = {"success": False, "message": None, "error": None}
739
715
  browser = None
740
- memory_handler = None
741
716
 
742
717
  try:
743
718
  # Parse agent model and validate API key
@@ -786,60 +761,41 @@ class AgentBrowser:
786
761
  console.print(f" [red]error:[/red] {result['error']}")
787
762
  return result
788
763
 
764
+ suppress_browser_use_logs()
765
+
789
766
  console.print(f" [dim]starting browser with har...[/dim]")
790
767
  browser = Browser(
791
768
  record_har_path=str(self.har_path),
792
769
  record_har_mode="full",
793
770
  record_har_content="attach",
794
771
  )
772
+
773
+ suppress_browser_use_logs()
774
+
795
775
  await browser.start()
796
776
 
777
+ suppress_browser_use_logs()
778
+
797
779
  console.print(f" [dim]browser started[/dim]")
798
780
 
799
781
  task = self.prompt
800
782
 
801
- # Set up memory log handler
802
- memory_handler = MemoryLogHandler(console)
803
- memory_handler.setLevel(logging.INFO)
804
- browser_use_logger.addHandler(memory_handler)
805
- agent_logger.addHandler(memory_handler)
806
-
807
783
  agent = Agent(task=task, llm=llm, browser=browser)
808
- agent_result = await agent.run()
809
784
 
810
- if memory_handler:
811
- browser_use_logger.removeHandler(memory_handler)
812
- agent_logger.removeHandler(memory_handler)
785
+ suppress_browser_use_logs()
786
+
787
+ agent_result = await agent.run()
813
788
 
814
- # Extract final result from agent_result
789
+ # Extract final result using browser-use's built-in method
815
790
  final_message = None
816
- if agent_result:
817
- if hasattr(agent_result, "all_results") and agent_result.all_results:
818
- last_result = agent_result.all_results[-1]
819
- if hasattr(last_result, "text") and last_result.text:
820
- final_message = last_result.text
821
- elif hasattr(last_result, "result") and last_result.result:
822
- final_message = str(last_result.result)
823
- elif hasattr(agent_result, "result"):
824
- final_message = str(agent_result.result)
825
- elif hasattr(agent_result, "text"):
826
- final_message = agent_result.text
827
- else:
828
- msg_str = str(agent_result)
829
- if "Final Result:" in msg_str:
830
- parts = msg_str.split("Final Result:")
831
- if len(parts) > 1:
832
- final_message = parts[-1].strip()
833
- else:
834
- final_message = msg_str
791
+ if agent_result and hasattr(agent_result, "final_result"):
792
+ final_result_attr = agent_result.final_result
793
+ final_message = final_result_attr() if callable(final_result_attr) else final_result_attr
835
794
 
836
795
  result["success"] = True
837
796
  result["message"] = final_message or "Task completed"
838
797
 
839
798
  except Exception as e:
840
- if memory_handler:
841
- browser_use_logger.removeHandler(memory_handler)
842
- agent_logger.removeHandler(memory_handler)
843
799
  result["error"] = str(e)
844
800
  console.print(f" [yellow]agent error: {e}[/yellow]")
845
801
  finally:
@@ -908,7 +864,10 @@ class AgentBrowser:
908
864
  empty_har = {
909
865
  "log": {
910
866
  "version": "1.2",
911
- "creator": {"name": "reverse-api-engineer", "version": "0.2.0"},
867
+ "creator": {
868
+ "name": "reverse-api-engineer",
869
+ "version": __version__,
870
+ },
912
871
  "pages": [],
913
872
  "entries": [],
914
873
  }
@@ -1062,11 +1021,11 @@ class AgentBrowser:
1062
1021
 
1063
1022
  if result.get("success"):
1064
1023
  console.print(f" [green]agent task completed[/green]")
1065
- if result.get("message"):
1066
- msg = result["message"]
1024
+ msg = result.get("message", "").strip()
1025
+ if msg:
1067
1026
  if len(msg) > 500:
1068
1027
  msg = msg[:500] + "..."
1069
- console.print(f" [dim]result:[/dim] [white]{msg}[/white]")
1028
+ console.print(f" [dim]result:[/dim]\n [white]{msg}[/white]")
1070
1029
  else:
1071
1030
  error = result.get("error", "unknown error")
1072
1031
  console.print(f" [yellow]agent error: {error}[/yellow]")
@@ -1,6 +1,7 @@
1
1
  """Reverse engineering module with SDK dispatch."""
2
2
 
3
3
  import asyncio
4
+ import logging
4
5
  from pathlib import Path
5
6
  from typing import Optional, Dict, Any
6
7
 
@@ -16,6 +17,10 @@ from claude_agent_sdk import (
16
17
 
17
18
  from .base_engineer import BaseEngineer
18
19
 
20
+ # Suppress claude_agent_sdk logs
21
+ logging.getLogger("claude_agent_sdk").setLevel(logging.WARNING)
22
+ logging.getLogger("claude_agent_sdk._internal.transport.subprocess_cli").setLevel(logging.WARNING)
23
+
19
24
 
20
25
  class ClaudeEngineer(BaseEngineer):
21
26
  """Uses Claude Agent SDK to analyze HAR files and generate Python API scripts."""