vibesurf 0.1.8__tar.gz → 0.1.9__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.

Potentially problematic release.


This version of vibesurf might be problematic. Click here for more details.

Files changed (90) hide show
  1. vibesurf-0.1.9/.github/workflows/publish.yml +222 -0
  2. {vibesurf-0.1.8 → vibesurf-0.1.9}/.gitignore +2 -1
  3. {vibesurf-0.1.8 → vibesurf-0.1.9}/PKG-INFO +1 -1
  4. vibesurf-0.1.9/build-local.bat +120 -0
  5. vibesurf-0.1.9/build-local.sh +124 -0
  6. vibesurf-0.1.9/docs/EXECUTABLE_BUILD.md +197 -0
  7. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/_version.py +3 -3
  8. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/cli.py +9 -2
  9. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibesurf.egg-info/PKG-INFO +1 -1
  10. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibesurf.egg-info/SOURCES.txt +4 -0
  11. vibesurf-0.1.9/vibesurf.spec +145 -0
  12. vibesurf-0.1.8/.github/workflows/publish.yml +0 -98
  13. {vibesurf-0.1.8 → vibesurf-0.1.9}/.env.example +0 -0
  14. {vibesurf-0.1.8 → vibesurf-0.1.9}/.python-version +0 -0
  15. {vibesurf-0.1.8 → vibesurf-0.1.9}/LICENSE +0 -0
  16. {vibesurf-0.1.8 → vibesurf-0.1.9}/MANIFEST.in +0 -0
  17. {vibesurf-0.1.8 → vibesurf-0.1.9}/README.md +0 -0
  18. {vibesurf-0.1.8 → vibesurf-0.1.9}/docs/PYPI_SETUP.md +0 -0
  19. {vibesurf-0.1.8 → vibesurf-0.1.9}/pyproject.toml +0 -0
  20. {vibesurf-0.1.8 → vibesurf-0.1.9}/setup.cfg +0 -0
  21. {vibesurf-0.1.8 → vibesurf-0.1.9}/tests/test_agents.py +0 -0
  22. {vibesurf-0.1.8 → vibesurf-0.1.9}/tests/test_backend_api.py +0 -0
  23. {vibesurf-0.1.8 → vibesurf-0.1.9}/tests/test_browser.py +0 -0
  24. {vibesurf-0.1.8 → vibesurf-0.1.9}/tests/test_controller.py +0 -0
  25. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/__init__.py +0 -0
  26. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/agents/__init__.py +0 -0
  27. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/agents/browser_use_agent.py +0 -0
  28. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/agents/prompts/__init__.py +0 -0
  29. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/agents/prompts/vibe_surf_prompt.py +0 -0
  30. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/agents/report_writer_agent.py +0 -0
  31. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/agents/vibe_surf_agent.py +0 -0
  32. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/__init__.py +0 -0
  33. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/api/__init__.py +0 -0
  34. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/api/activity.py +0 -0
  35. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/api/config.py +0 -0
  36. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/api/files.py +0 -0
  37. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/api/models.py +0 -0
  38. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/api/task.py +0 -0
  39. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/database/__init__.py +0 -0
  40. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/database/manager.py +0 -0
  41. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/database/models.py +0 -0
  42. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/database/queries.py +0 -0
  43. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/database/schemas.py +0 -0
  44. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/llm_config.py +0 -0
  45. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/main.py +0 -0
  46. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/migrations/__init__.py +0 -0
  47. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/migrations/init_db.py +0 -0
  48. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/migrations/seed_data.py +0 -0
  49. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/shared_state.py +0 -0
  50. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/utils/__init__.py +0 -0
  51. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/utils/encryption.py +0 -0
  52. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/backend/utils/llm_factory.py +0 -0
  53. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/browser/__init__.py +0 -0
  54. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/browser/agen_browser_profile.py +0 -0
  55. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/browser/agent_browser_session.py +0 -0
  56. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/browser/browser_manager.py +0 -0
  57. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/browser/utils.py +0 -0
  58. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/browser/watchdogs/__init__.py +0 -0
  59. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/browser/watchdogs/action_watchdog.py +0 -0
  60. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/browser/watchdogs/dom_watchdog.py +0 -0
  61. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/background.js +0 -0
  62. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/config.js +0 -0
  63. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/content.js +0 -0
  64. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/dev-reload.js +0 -0
  65. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/icons/convert-svg.js +0 -0
  66. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/icons/logo-preview.html +0 -0
  67. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/icons/logo.png +0 -0
  68. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/manifest.json +0 -0
  69. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/popup.html +0 -0
  70. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/scripts/api-client.js +0 -0
  71. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/scripts/main.js +0 -0
  72. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/scripts/markdown-it.min.js +0 -0
  73. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/scripts/session-manager.js +0 -0
  74. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/scripts/ui-manager.js +0 -0
  75. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/sidepanel.html +0 -0
  76. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/styles/animations.css +0 -0
  77. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/styles/components.css +0 -0
  78. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/styles/main.css +0 -0
  79. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/chrome_extension/styles/settings.css +0 -0
  80. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/controller/__init__.py +0 -0
  81. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/controller/file_system.py +0 -0
  82. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/controller/mcp_client.py +0 -0
  83. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/controller/vibesurf_tools.py +0 -0
  84. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/controller/views.py +0 -0
  85. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/llm/__init__.py +0 -0
  86. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibe_surf/llm/openai_compatible.py +0 -0
  87. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibesurf.egg-info/dependency_links.txt +0 -0
  88. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibesurf.egg-info/entry_points.txt +0 -0
  89. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibesurf.egg-info/requires.txt +0 -0
  90. {vibesurf-0.1.8 → vibesurf-0.1.9}/vibesurf.egg-info/top_level.txt +0 -0
@@ -0,0 +1,222 @@
1
+ name: Build and Publish
2
+
3
+ on:
4
+ release:
5
+ types: [published, edited]
6
+ workflow_dispatch: # Allow manual trigger
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-latest
11
+ strategy:
12
+ matrix:
13
+ python-version: ['3.11', '3.12']
14
+
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ with:
18
+ ref: 'main' # Always checkout main branch for latest code
19
+ fetch-depth: 0 # Full history for setuptools-scm
20
+
21
+ - name: Set up Python ${{ matrix.python-version }}
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: ${{ matrix.python-version }}
25
+
26
+ - name: Install dependencies
27
+ run: |
28
+ python -m pip install --upgrade pip
29
+ pip install build pytest
30
+ pip install -e .
31
+
32
+ - name: Test CLI import
33
+ run: |
34
+ python -c "import vibe_surf; print(f'VibeSurf version: {vibe_surf.__version__}')"
35
+ python -c "from vibe_surf.cli import main; print('CLI import successful')"
36
+
37
+ build-wheels:
38
+ needs: test
39
+ runs-on: ubuntu-latest
40
+
41
+ steps:
42
+ - uses: actions/checkout@v4
43
+ with:
44
+ ref: 'main' # Always checkout main branch for latest code
45
+ fetch-depth: 0 # Full history for setuptools-scm
46
+
47
+ - name: Set up Python
48
+ uses: actions/setup-python@v5
49
+ with:
50
+ python-version: '3.11'
51
+
52
+ - name: Install build dependencies
53
+ run: |
54
+ python -m pip install --upgrade pip
55
+ pip install build setuptools-scm[toml]
56
+
57
+ - name: Build package
58
+ run: python -m build
59
+
60
+ - name: Check built package
61
+ run: |
62
+ pip install twine
63
+ twine check dist/*
64
+
65
+ # Show package contents
66
+ echo "=== Built packages ==="
67
+ ls -la dist/
68
+
69
+ echo "=== Package info ==="
70
+ python -m pip install dist/*.whl
71
+ python -c "import vibe_surf; print(f'Installed version: {vibe_surf.__version__}')"
72
+
73
+ - name: Upload build artifacts
74
+ uses: actions/upload-artifact@v4
75
+ with:
76
+ name: dist
77
+ path: dist/
78
+
79
+ build-executables:
80
+ needs: test
81
+ strategy:
82
+ matrix:
83
+ include:
84
+ # Windows x64
85
+ - os: windows-latest
86
+ asset_name: vibesurf-windows-x64.exe
87
+ activate_cmd: .venv\Scripts\activate.bat
88
+ # macOS Intel (x86_64) - compatible with Apple Silicon via Rosetta 2
89
+ - os: macos-13
90
+ asset_name: vibesurf-macos-intel-x64
91
+ activate_cmd: source .venv/bin/activate
92
+ # macOS Apple Silicon (arm64) - native performance
93
+ - os: macos-14
94
+ asset_name: vibesurf-macos-apple-silicon
95
+ activate_cmd: source .venv/bin/activate
96
+ # Linux x64
97
+ - os: ubuntu-latest
98
+ asset_name: vibesurf-linux-x64
99
+ activate_cmd: source .venv/bin/activate
100
+
101
+ runs-on: ${{ matrix.os }}
102
+
103
+ steps:
104
+ - uses: actions/checkout@v4
105
+ with:
106
+ fetch-depth: 0
107
+
108
+ # Install uv (key step for consistent environment)
109
+ - name: Install uv
110
+ uses: astral-sh/setup-uv@v3
111
+ with:
112
+ version: "latest"
113
+
114
+ # Create uv environment and install current repository code
115
+ - name: Create uv environment
116
+ shell: bash
117
+ run: |
118
+ uv venv --python 3.12
119
+ if [[ "$RUNNER_OS" == "Windows" ]]; then
120
+ .venv/Scripts/activate.bat
121
+ uv pip install -e .
122
+ uv pip install pyinstaller
123
+ else
124
+ source .venv/bin/activate
125
+ uv pip install -e .
126
+ uv pip install pyinstaller
127
+ fi
128
+
129
+ # Verify environment
130
+ - name: Verify environment
131
+ shell: bash
132
+ run: |
133
+ if [[ "$RUNNER_OS" == "Windows" ]]; then
134
+ .venv/Scripts/activate.bat
135
+ python --version
136
+ python -c "from vibe_surf.cli import main; print('CLI available')"
137
+ else
138
+ source .venv/bin/activate
139
+ python --version
140
+ which python
141
+ python -c "from vibe_surf.cli import main; print('CLI available')"
142
+ fi
143
+
144
+ # Build executable using uv environment
145
+ - name: Build executable with uv environment
146
+ shell: bash
147
+ run: |
148
+ if [[ "$RUNNER_OS" == "Windows" ]]; then
149
+ .venv/Scripts/activate.bat
150
+ pyinstaller vibesurf.spec --clean --noconfirm
151
+ else
152
+ source .venv/bin/activate
153
+ pyinstaller vibesurf.spec --clean --noconfirm
154
+ fi
155
+
156
+ - name: Prepare executable
157
+ shell: bash
158
+ run: |
159
+ if [[ "$RUNNER_OS" == "Windows" ]]; then
160
+ mv dist/vibesurf.exe dist/${{ matrix.asset_name }}
161
+ else
162
+ mv dist/vibesurf dist/${{ matrix.asset_name }}
163
+ chmod +x dist/${{ matrix.asset_name }}
164
+ fi
165
+
166
+ - name: Test executable
167
+ shell: bash
168
+ run: |
169
+ # Basic test to ensure executable runs
170
+ if [[ "$RUNNER_OS" == "Windows" ]]; then
171
+ echo "Testing Windows executable..."
172
+ # Simple existence check for Windows
173
+ ls -la dist/${{ matrix.asset_name }}
174
+ else
175
+ echo "Testing Unix executable..."
176
+ ./dist/${{ matrix.asset_name }} --help || echo "Basic test completed"
177
+ fi
178
+
179
+ - name: Upload executable
180
+ uses: actions/upload-artifact@v4
181
+ with:
182
+ name: ${{ matrix.asset_name }}
183
+ path: dist/${{ matrix.asset_name }}
184
+
185
+ publish-pypi:
186
+ needs: [test, build-wheels]
187
+ runs-on: ubuntu-latest
188
+ environment: release
189
+ permissions:
190
+ id-token: write # Required for trusted publishing
191
+
192
+ steps:
193
+ - name: Download build artifacts
194
+ uses: actions/download-artifact@v4
195
+ with:
196
+ name: dist
197
+ path: dist/
198
+
199
+ - name: Publish to PyPI
200
+ uses: pypa/gh-action-pypi-publish@release/v1
201
+ with:
202
+ password: ${{ secrets.PYPI_API_TOKEN }}
203
+ # Use the following line if you want to use trusted publishing instead
204
+ # skip-existing: true
205
+
206
+ publish-executables:
207
+ needs: [test, build-executables]
208
+ runs-on: ubuntu-latest
209
+ if: github.event_name == 'release'
210
+
211
+ steps:
212
+ - name: Download all artifacts
213
+ uses: actions/download-artifact@v4
214
+
215
+ - name: Upload executables to release
216
+ uses: softprops/action-gh-release@v1
217
+ with:
218
+ files: |
219
+ vibesurf-windows-x64.exe/vibesurf-windows-x64.exe
220
+ vibesurf-macos-intel-x64/vibesurf-macos-intel-x64
221
+ vibesurf-macos-apple-silicon/vibesurf-macos-apple-silicon
222
+ vibesurf-linux-x64/vibesurf-linux-x64
@@ -19,4 +19,5 @@ uv.lock
19
19
  swarmsurf_workspace
20
20
  workspace
21
21
  *.db
22
- vibe_surf/_version.py
22
+ vibe_surf/_version.py
23
+ .build-env
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vibesurf
3
- Version: 0.1.8
3
+ Version: 0.1.9
4
4
  Summary: VibeSurf: A powerful browser assistant for vibe surfing
5
5
  Author: Shao Warm
6
6
  License: Apache-2.0
@@ -0,0 +1,120 @@
1
+ @echo off
2
+ :: Local build script for Windows
3
+ :: This script creates a uv environment and builds a standalone executable
4
+
5
+ setlocal enabledelayedexpansion
6
+
7
+ echo 🚀 VibeSurf Local Build Script for Windows
8
+ echo ==========================================
9
+
10
+ :: Check if uv is installed
11
+ where uv >nul 2>nul
12
+ if %ERRORLEVEL% neq 0 (
13
+ echo [ERROR] uv is not installed. Please install it first:
14
+ echo powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
15
+ exit /b 1
16
+ )
17
+
18
+ echo [SUCCESS] uv is installed
19
+
20
+ :: Use dedicated build environment directory
21
+ set BUILD_ENV=.build-env
22
+
23
+ :: Clean up existing build environment if it exists
24
+ if exist "%BUILD_ENV%" (
25
+ echo [WARNING] Removing existing build environment directory
26
+ rmdir /s /q "%BUILD_ENV%"
27
+ )
28
+
29
+ :: Step 1: Create dedicated build environment
30
+ echo [INFO] Creating dedicated build environment with Python 3.12...
31
+ uv venv %BUILD_ENV% --python 3.12
32
+ if %ERRORLEVEL% neq 0 (
33
+ echo [ERROR] Failed to create build environment
34
+ exit /b 1
35
+ )
36
+
37
+ :: Step 2: Activate build environment and install dependencies
38
+ echo [INFO] Activating build environment and installing dependencies...
39
+ call %BUILD_ENV%\Scripts\activate.bat
40
+
41
+ :: Verify Python version
42
+ python --version
43
+ if %ERRORLEVEL% neq 0 (
44
+ echo [ERROR] Failed to activate Python environment
45
+ exit /b 1
46
+ )
47
+
48
+ :: Install local VibeSurf and PyInstaller
49
+ echo [INFO] Installing local vibesurf in development mode and pyinstaller...
50
+ uv pip install -e .
51
+ if %ERRORLEVEL% neq 0 (
52
+ echo [ERROR] Failed to install local vibesurf
53
+ exit /b 1
54
+ )
55
+
56
+ uv pip install pyinstaller
57
+ if %ERRORLEVEL% neq 0 (
58
+ echo [ERROR] Failed to install pyinstaller
59
+ exit /b 1
60
+ )
61
+
62
+ :: Verify installation
63
+ echo [INFO] Verifying installation...
64
+ python -c "import vibe_surf; print(f'VibeSurf version: {vibe_surf.__version__}')"
65
+ if %ERRORLEVEL% neq 0 (
66
+ echo [ERROR] Failed to import vibe_surf
67
+ exit /b 1
68
+ )
69
+
70
+ python -c "from vibe_surf.cli import main; print('CLI import successful')"
71
+ if %ERRORLEVEL% neq 0 (
72
+ echo [ERROR] Failed to import CLI
73
+ exit /b 1
74
+ )
75
+
76
+ :: Step 3: Build executable
77
+ echo [INFO] Building executable with PyInstaller...
78
+ if not exist "vibesurf.spec" (
79
+ echo [ERROR] vibesurf.spec file not found!
80
+ exit /b 1
81
+ )
82
+
83
+ pyinstaller vibesurf.spec --clean --noconfirm
84
+ if %ERRORLEVEL% neq 0 (
85
+ echo [ERROR] PyInstaller build failed
86
+ exit /b 1
87
+ )
88
+
89
+ :: Step 4: Test executable
90
+ if exist "dist\vibesurf.exe" (
91
+ echo [SUCCESS] Executable built successfully!
92
+
93
+ echo [INFO] Testing executable...
94
+ dist\vibesurf.exe --help >nul 2>&1
95
+ if %ERRORLEVEL% equ 0 (
96
+ echo [SUCCESS] Executable test passed!
97
+ ) else (
98
+ echo [WARNING] Executable test failed, but this might be expected for CLI apps
99
+ )
100
+
101
+ :: Show file info
102
+ echo.
103
+ echo 📊 Executable Information:
104
+ echo =========================
105
+ dir /q dist\vibesurf.exe
106
+
107
+ echo.
108
+ echo [SUCCESS] 🎉 Build completed successfully!
109
+ echo.
110
+ echo 📁 Your executable is located at: .\dist\vibesurf.exe
111
+ echo 🚀 To run: .\dist\vibesurf.exe
112
+ echo.
113
+
114
+ ) else (
115
+ echo [ERROR] Build failed - executable not found
116
+ exit /b 1
117
+ )
118
+
119
+ echo Press any key to exit...
120
+ pause >nul
@@ -0,0 +1,124 @@
1
+ #!/bin/bash
2
+ # Local build script for Unix-like systems (Linux/macOS)
3
+ # This script creates a uv environment and builds a standalone executable
4
+
5
+ set -e # Exit on any error
6
+
7
+ echo "🚀 VibeSurf Local Build Script"
8
+ echo "=============================="
9
+
10
+ # Colors for output
11
+ RED='\033[0;31m'
12
+ GREEN='\033[0;32m'
13
+ YELLOW='\033[1;33m'
14
+ CYAN='\033[0;36m'
15
+ NC='\033[0m' # No Color
16
+
17
+ # Function to print colored output
18
+ print_status() {
19
+ echo -e "${CYAN}[INFO]${NC} $1"
20
+ }
21
+
22
+ print_success() {
23
+ echo -e "${GREEN}[SUCCESS]${NC} $1"
24
+ }
25
+
26
+ print_warning() {
27
+ echo -e "${YELLOW}[WARNING]${NC} $1"
28
+ }
29
+
30
+ print_error() {
31
+ echo -e "${RED}[ERROR]${NC} $1"
32
+ }
33
+
34
+ # Check if uv is installed
35
+ if ! command -v uv &> /dev/null; then
36
+ print_error "uv is not installed. Please install it first:"
37
+ echo "curl -LsSf https://astral.sh/uv/install.sh | sh"
38
+ exit 1
39
+ fi
40
+
41
+ print_success "uv is installed"
42
+
43
+ # Use dedicated build environment directory
44
+ BUILD_ENV=".build-env"
45
+
46
+ # Clean up existing build environment if it exists
47
+ if [ -d "$BUILD_ENV" ]; then
48
+ print_warning "Removing existing build environment directory"
49
+ rm -rf "$BUILD_ENV"
50
+ fi
51
+
52
+ # Step 1: Create dedicated build environment
53
+ print_status "Creating dedicated build environment with Python 3.12..."
54
+ uv venv "$BUILD_ENV" --python 3.12
55
+
56
+ # Step 2: Activate build environment and install dependencies
57
+ print_status "Activating build environment and installing dependencies..."
58
+ source "$BUILD_ENV/bin/activate"
59
+
60
+ # Verify Python version
61
+ PYTHON_VERSION=$(python --version)
62
+ print_success "Using Python: $PYTHON_VERSION"
63
+
64
+ # Install local VibeSurf and PyInstaller
65
+ print_status "Installing local vibesurf in development mode and pyinstaller..."
66
+ uv pip install -e .
67
+ uv pip install pyinstaller
68
+
69
+ # Verify installation
70
+ print_status "Verifying installation..."
71
+ python -c "import vibe_surf; print(f'VibeSurf version: {vibe_surf.__version__}')" || {
72
+ print_error "Failed to import vibe_surf"
73
+ exit 1
74
+ }
75
+
76
+ python -c "from vibe_surf.cli import main; print('CLI import successful')" || {
77
+ print_error "Failed to import CLI"
78
+ exit 1
79
+ }
80
+
81
+ # Step 3: Build executable
82
+ print_status "Building executable with PyInstaller..."
83
+ if [ ! -f "vibesurf.spec" ]; then
84
+ print_error "vibesurf.spec file not found!"
85
+ exit 1
86
+ fi
87
+
88
+ pyinstaller vibesurf.spec --clean --noconfirm
89
+
90
+ # Step 4: Test executable
91
+ if [ -f "dist/vibesurf" ]; then
92
+ print_success "Executable built successfully!"
93
+
94
+ # Make executable and test
95
+ chmod +x dist/vibesurf
96
+
97
+ print_status "Testing executable..."
98
+ ./dist/vibesurf --help > /dev/null 2>&1 && {
99
+ print_success "Executable test passed!"
100
+ } || {
101
+ print_warning "Executable test failed, but this might be expected for CLI apps"
102
+ }
103
+
104
+ # Show file info
105
+ echo ""
106
+ echo "📊 Executable Information:"
107
+ echo "========================="
108
+ ls -lh dist/vibesurf
109
+
110
+ if command -v file &> /dev/null; then
111
+ file dist/vibesurf
112
+ fi
113
+
114
+ echo ""
115
+ print_success "🎉 Build completed successfully!"
116
+ echo ""
117
+ echo "📁 Your executable is located at: ./dist/vibesurf"
118
+ echo "🚀 To run: ./dist/vibesurf"
119
+ echo ""
120
+
121
+ else
122
+ print_error "Build failed - executable not found"
123
+ exit 1
124
+ fi
@@ -0,0 +1,197 @@
1
+ # VibeSurf Executable Build Guide
2
+
3
+ This guide explains how to build standalone executable files for VibeSurf that can run without requiring Python installation.
4
+
5
+ ## 🎯 Overview
6
+
7
+ VibeSurf can be packaged into standalone executables for:
8
+ - **Windows**: `vibesurf-windows-x64.exe`
9
+ - **macOS Intel**: `vibesurf-macos-intel-x64` (compatible with Apple Silicon via Rosetta 2)
10
+ - **macOS Apple Silicon**: `vibesurf-macos-apple-silicon` (native arm64 performance)
11
+ - **Linux**: `vibesurf-linux-x64`
12
+
13
+ ## 🔧 Local Build Instructions
14
+
15
+ ### Prerequisites
16
+
17
+ 1. **Install uv** (Python package manager):
18
+ ```bash
19
+ # On macOS and Linux
20
+ curl -LsSf https://astral.sh/uv/install.sh | sh
21
+
22
+ # On Windows (PowerShell)
23
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
24
+ ```
25
+
26
+ 2. **Clone the repository**:
27
+ ```bash
28
+ git clone https://github.com/your-repo/VibeSurf.git
29
+ cd VibeSurf
30
+ ```
31
+
32
+ ### Building on Linux/macOS
33
+
34
+ 1. **Run the build script**:
35
+ ```bash
36
+ chmod +x build-local.sh
37
+ ./build-local.sh
38
+ ```
39
+
40
+ 2. **Find your executable**:
41
+ - Location: `./dist/vibesurf`
42
+ - Run with: `./dist/vibesurf`
43
+
44
+ **Note**:
45
+ - The script creates a dedicated `.build-env` directory for building, preserving your existing `.venv`
46
+ - Uses your current local code (`-e .`), not the PyPI published version
47
+
48
+ ### Building on Windows
49
+
50
+ 1. **Run the build script**:
51
+ ```cmd
52
+ build-local.bat
53
+ ```
54
+
55
+ 2. **Find your executable**:
56
+ - Location: `.\dist\vibesurf.exe`
57
+ - Run with: `.\dist\vibesurf.exe`
58
+
59
+ **Note**:
60
+ - The script creates a dedicated `.build-env` directory for building, preserving your existing `.venv`
61
+ - Uses your current local code (`-e .`), not the PyPI published version
62
+
63
+ ## 🧪 Testing the Executable
64
+
65
+ ### Basic Test
66
+ ```bash
67
+ # Linux/macOS
68
+ ./dist/vibesurf --help
69
+
70
+ # Windows
71
+ .\dist\vibesurf.exe --help
72
+ ```
73
+
74
+ ### Full Test
75
+ ```bash
76
+ # Linux/macOS
77
+ ./dist/vibesurf
78
+
79
+ # Windows
80
+ .\dist\vibesurf.exe
81
+ ```
82
+
83
+ The executable should:
84
+ 1. Display the VibeSurf logo
85
+ 2. Show version information
86
+ 3. Detect browsers automatically
87
+ 4. Configure ports and start the backend
88
+
89
+ ## 📦 What's Included
90
+
91
+ The executable contains:
92
+ - **Complete Python runtime** (Python 3.12)
93
+ - **All VibeSurf dependencies** (FastAPI, uvicorn, browser-use, etc.)
94
+ - **Chrome extension files** (bundled within the executable)
95
+ - **Backend API and database components**
96
+ - **VibeSurf logo as executable icon** (from `vibe_surf/chrome_extension/icons/logo.png`)
97
+
98
+ ## 🔍 Build Process Details
99
+
100
+ ### Environment Setup
101
+
102
+ **Local Building:**
103
+ - Creates isolated `uv` build environment (`.build-env`) with Python 3.12
104
+ - Preserves existing development environment (`.venv`)
105
+ - Installs local VibeSurf in development mode (`-e .`) for latest code
106
+ - Adds PyInstaller for building
107
+
108
+ **GitHub Actions Building:**
109
+ - Uses matrix strategy with native OS runners (Windows, macOS, Linux)
110
+ - Each runner builds the executable for its native platform
111
+ - Installs current repository code (`-e .`) at release time
112
+ - Ensures executables match the exact released code version
113
+
114
+ ### PyInstaller Configuration
115
+ - **Entry point**: `vibe_surf/cli.py`
116
+ - **Data files**: Chrome extension, backend templates
117
+ - **Hidden imports**: All dynamic imports declared
118
+ - **Exclusions**: Removes unnecessary packages (matplotlib, tkinter)
119
+ - **Compression**: Uses UPX for smaller file size
120
+ - **Icon**: VibeSurf logo embedded as executable icon
121
+
122
+ ### Output
123
+ - **File size**: ~100-200MB (varies by platform)
124
+ - **Startup time**: 2-5 seconds (first run)
125
+ - **Dependencies**: None (fully self-contained)
126
+
127
+ ## 🚀 Distribution
128
+
129
+ ### Manual Distribution
130
+ 1. Build the executable for your target platform
131
+ 2. Copy the `dist/vibesurf*` file to target machines
132
+ 3. Users can run directly without any installation
133
+
134
+ ### GitHub Releases (Automated)
135
+ The repository includes GitHub Actions workflows that automatically:
136
+ 1. **Multi-platform building**: Uses GitHub runners for each target platform
137
+ - `windows-latest` → `vibesurf-windows-x64.exe`
138
+ - `macos-13` (Intel) → `vibesurf-macos-intel-x64`
139
+ - `macos-14` (Apple Silicon) → `vibesurf-macos-apple-silicon`
140
+ - `ubuntu-latest` → `vibesurf-linux-x64`
141
+ 2. **Current code**: Builds from the repository code at release time (`-e .`)
142
+ 3. **Upload binaries**: Automatically uploads all platform executables to GitHub Releases
143
+ 4. **User downloads**: Platform-specific executables ready for distribution
144
+
145
+ **macOS Compatibility:**
146
+ - **Intel build**: Works on Intel Macs natively, Apple Silicon Macs via Rosetta 2
147
+ - **Apple Silicon build**: Native arm64 performance on Apple Silicon Macs
148
+ - **Recommendation**: Use Apple Silicon build for M1/M2/M3 Macs for best performance
149
+
150
+ **Why different OS runners?**
151
+ PyInstaller creates native executables and requires the target operating system to build properly. Cross-compilation is not supported.
152
+
153
+ ## 🐛 Troubleshooting
154
+
155
+ ### Build Issues
156
+
157
+ **"uv not found"**
158
+ - Install uv following the prerequisites
159
+
160
+ **"vibesurf.spec not found"**
161
+ - Ensure you're in the project root directory
162
+
163
+ **"Import errors during build"**
164
+ - Check that all dependencies are correctly installed
165
+ - Verify the `hiddenimports` list in `vibesurf.spec`
166
+
167
+ ### Runtime Issues
168
+
169
+ **"Extension not found"**
170
+ - The executable includes bundled extensions
171
+ - Check the console output for path information
172
+
173
+ **"Port already in use"**
174
+ - VibeSurf automatically finds available ports
175
+ - Check for other running instances
176
+
177
+ **"Browser not detected"**
178
+ - The executable includes the same browser detection as the regular installation
179
+ - Manually specify browser path if needed
180
+
181
+ ## 📊 Performance Comparison
182
+
183
+ | Aspect | Regular Install | Executable |
184
+ |--------|----------------|------------|
185
+ | Installation | Requires Python + pip/uv | Download & run |
186
+ | Startup Time | ~1 second | ~3 seconds |
187
+ | File Size | ~50MB (dependencies) | ~150MB (self-contained) |
188
+ | Updates | `uv pip install -U` | Download new executable |
189
+ | Portability | Requires Python | Fully portable |
190
+
191
+ ## 🔄 Updates
192
+
193
+ To update the executable:
194
+ 1. Download the latest release executable, or
195
+ 2. Rebuild locally with the latest code
196
+
197
+ The executable version matches the PyPI package version.
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.1.8'
32
- __version_tuple__ = version_tuple = (0, 1, 8)
31
+ __version__ = version = '0.1.9'
32
+ __version_tuple__ = version_tuple = (0, 1, 9)
33
33
 
34
- __commit_id__ = commit_id = 'gaa38d8984'
34
+ __commit_id__ = commit_id = 'g4c710adab'
@@ -297,8 +297,15 @@ def configure_extension_path() -> str:
297
297
  console.print(f"[green]✅ Using extension from environment: {env_extension}[/green]")
298
298
  return env_extension
299
299
 
300
- # Default to chrome_extension in parent directory of this file
301
- default_extension = Path(__file__).parent / "chrome_extension"
300
+ # Check if running in PyInstaller frozen environment
301
+ if getattr(sys, 'frozen', False):
302
+ # PyInstaller frozen environment
303
+ bundle_dir = Path(sys._MEIPASS)
304
+ default_extension = bundle_dir / "vibe_surf" / "chrome_extension"
305
+ console.print(f"[cyan]📦 Detected packaged environment, using bundled extension[/cyan]")
306
+ else:
307
+ # Development environment
308
+ default_extension = Path(__file__).parent / "chrome_extension"
302
309
 
303
310
  if default_extension.exists():
304
311
  extension_path = str(default_extension.resolve())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vibesurf
3
- Version: 0.1.8
3
+ Version: 0.1.9
4
4
  Summary: VibeSurf: A powerful browser assistant for vibe surfing
5
5
  Author: Shao Warm
6
6
  License: Apache-2.0
@@ -4,7 +4,10 @@
4
4
  LICENSE
5
5
  MANIFEST.in
6
6
  README.md
7
+ build-local.bat
8
+ build-local.sh
7
9
  pyproject.toml
10
+ vibesurf.spec
8
11
  ./vibe_surf/__init__.py
9
12
  ./vibe_surf/_version.py
10
13
  ./vibe_surf/cli.py
@@ -70,6 +73,7 @@ pyproject.toml
70
73
  ./vibe_surf/llm/__init__.py
71
74
  ./vibe_surf/llm/openai_compatible.py
72
75
  .github/workflows/publish.yml
76
+ docs/EXECUTABLE_BUILD.md
73
77
  docs/PYPI_SETUP.md
74
78
  tests/test_agents.py
75
79
  tests/test_backend_api.py
@@ -0,0 +1,145 @@
1
+ # -*- mode: python ; coding: utf-8 -*-
2
+
3
+ import os
4
+ import sys
5
+ from pathlib import Path
6
+
7
+ # Ensure using current environment's Python
8
+ python_path = sys.executable
9
+ print(f"Using Python: {python_path}")
10
+
11
+ block_cipher = None
12
+
13
+ # Dynamically find vibe_surf installation location
14
+ try:
15
+ import vibe_surf
16
+ vibe_surf_path = Path(vibe_surf.__file__).parent
17
+ print(f"VibeSurf package location: {vibe_surf_path}")
18
+ cli_path = vibe_surf_path / 'cli.py'
19
+ except ImportError:
20
+ # Fallback to relative path (development environment)
21
+ vibe_surf_path = Path.cwd() / 'vibe_surf'
22
+ cli_path = vibe_surf_path / 'cli.py'
23
+ print(f"Using development path: {vibe_surf_path}")
24
+
25
+ # Check if CLI file exists
26
+ if not cli_path.exists():
27
+ print(f"ERROR: CLI file not found at {cli_path}")
28
+ print("Please ensure vibe_surf is properly installed or run from project directory")
29
+ sys.exit(1)
30
+
31
+ # Data files collection - include all necessary static files
32
+ datas = [
33
+ (str(vibe_surf_path / 'chrome_extension'), 'vibe_surf/chrome_extension'),
34
+ (str(vibe_surf_path / 'backend'), 'vibe_surf/backend'),
35
+ ]
36
+
37
+ # Hidden imports - all dynamic imports that PyInstaller might miss
38
+ hiddenimports = [
39
+ # Core web framework
40
+ 'uvicorn.main',
41
+ 'uvicorn.config',
42
+ 'uvicorn.server',
43
+ 'uvicorn.protocols.http.auto',
44
+ 'uvicorn.protocols.websockets.auto',
45
+ 'uvicorn.lifespan.on',
46
+ 'fastapi.applications',
47
+ 'fastapi.routing',
48
+ 'fastapi.middleware',
49
+ 'fastapi.middleware.cors',
50
+
51
+ # Browser automation
52
+ 'browser_use',
53
+ 'cdp_use',
54
+
55
+ # HTTP and networking
56
+ 'aiohttp.web',
57
+ 'aiohttp.client',
58
+ 'websockets.server',
59
+ 'websockets.client',
60
+
61
+ # Database
62
+ 'sqlalchemy.dialects.sqlite',
63
+ 'sqlalchemy.pool',
64
+ 'aiosqlite',
65
+
66
+ # Core dependencies
67
+ 'rich.console',
68
+ 'rich.panel',
69
+ 'rich.prompt',
70
+ 'rich.text',
71
+ 'pydantic',
72
+ 'pydantic.main',
73
+ 'pydantic.fields',
74
+ 'langgraph',
75
+ 'langgraph.graph',
76
+
77
+ # Image processing
78
+ 'scikit-image',
79
+ 'skimage.io',
80
+ 'skimage.transform',
81
+
82
+ # JSON and data processing
83
+ 'json_repair',
84
+ 'uuid7',
85
+ 'psutil',
86
+ 'aiofiles',
87
+ 'anyio',
88
+ 'python_socks',
89
+ 'python_multipart',
90
+ 'python_dotenv',
91
+ 'greenlet',
92
+ 'getmac',
93
+ ]
94
+
95
+ # Analysis configuration
96
+ a = Analysis(
97
+ [str(cli_path)],
98
+ pathex=[str(vibe_surf_path.parent)],
99
+ binaries=[],
100
+ datas=datas,
101
+ hiddenimports=hiddenimports,
102
+ hookspath=[],
103
+ hooksconfig={},
104
+ runtime_hooks=[],
105
+ excludes=[
106
+ 'matplotlib', # Large plotting library not needed
107
+ 'tkinter', # GUI library not needed
108
+ 'PyQt5', # GUI library not needed
109
+ 'PyQt6', # GUI library not needed
110
+ 'PySide2', # GUI library not needed
111
+ 'PySide6', # GUI library not needed
112
+ 'jupyter', # Jupyter notebook not needed
113
+ 'IPython', # Interactive Python not needed
114
+ ],
115
+ win_no_prefer_redirects=False,
116
+ win_private_assemblies=False,
117
+ cipher=block_cipher,
118
+ noarchive=False,
119
+ )
120
+
121
+ # Remove duplicate files to reduce size
122
+ pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
123
+
124
+ # Create executable
125
+ exe = EXE(
126
+ pyz,
127
+ a.scripts,
128
+ a.binaries,
129
+ a.zipfiles,
130
+ a.datas,
131
+ [],
132
+ name='vibesurf',
133
+ debug=False,
134
+ bootloader_ignore_signals=False,
135
+ strip=False,
136
+ upx=True, # Compress to reduce file size
137
+ upx_exclude=[],
138
+ runtime_tmpdir=None,
139
+ console=True,
140
+ disable_windowed_traceback=False,
141
+ target_arch=None,
142
+ codesign_identity=None,
143
+ entitlements_file=None,
144
+ icon=str(vibe_surf_path / 'chrome_extension' / 'icons' / 'logo.png'),
145
+ )
@@ -1,98 +0,0 @@
1
- name: Publish to PyPI
2
-
3
- on:
4
- release:
5
- types: [published, edited]
6
- workflow_dispatch: # Allow manual trigger
7
-
8
- jobs:
9
- test:
10
- runs-on: ubuntu-latest
11
- strategy:
12
- matrix:
13
- python-version: ['3.11', '3.12']
14
-
15
- steps:
16
- - uses: actions/checkout@v4
17
- with:
18
- ref: 'main' # Always checkout main branch for latest code
19
- fetch-depth: 0 # Full history for setuptools-scm
20
-
21
- - name: Set up Python ${{ matrix.python-version }}
22
- uses: actions/setup-python@v5
23
- with:
24
- python-version: ${{ matrix.python-version }}
25
-
26
- - name: Install dependencies
27
- run: |
28
- python -m pip install --upgrade pip
29
- pip install build pytest
30
- pip install -e .
31
-
32
- - name: Test CLI import
33
- run: |
34
- python -c "import vibe_surf; print(f'VibeSurf version: {vibe_surf.__version__}')"
35
- python -c "from vibe_surf.cli import main; print('CLI import successful')"
36
-
37
- build:
38
- needs: test
39
- runs-on: ubuntu-latest
40
-
41
- steps:
42
- - uses: actions/checkout@v4
43
- with:
44
- ref: 'main' # Always checkout main branch for latest code
45
- fetch-depth: 0 # Full history for setuptools-scm
46
-
47
- - name: Set up Python
48
- uses: actions/setup-python@v5
49
- with:
50
- python-version: '3.11'
51
-
52
- - name: Install build dependencies
53
- run: |
54
- python -m pip install --upgrade pip
55
- pip install build setuptools-scm[toml]
56
-
57
- - name: Build package
58
- run: python -m build
59
-
60
- - name: Check built package
61
- run: |
62
- pip install twine
63
- twine check dist/*
64
-
65
- # Show package contents
66
- echo "=== Built packages ==="
67
- ls -la dist/
68
-
69
- echo "=== Package info ==="
70
- python -m pip install dist/*.whl
71
- python -c "import vibe_surf; print(f'Installed version: {vibe_surf.__version__}')"
72
-
73
- - name: Upload build artifacts
74
- uses: actions/upload-artifact@v4
75
- with:
76
- name: dist
77
- path: dist/
78
-
79
- publish:
80
- needs: [test, build]
81
- runs-on: ubuntu-latest
82
- environment: release
83
- permissions:
84
- id-token: write # Required for trusted publishing
85
-
86
- steps:
87
- - name: Download build artifacts
88
- uses: actions/download-artifact@v4
89
- with:
90
- name: dist
91
- path: dist/
92
-
93
- - name: Publish to PyPI
94
- uses: pypa/gh-action-pypi-publish@release/v1
95
- with:
96
- password: ${{ secrets.PYPI_API_TOKEN }}
97
- # Use the following line if you want to use trusted publishing instead
98
- # skip-existing: true
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes