Add installer build tooling and cross-platform runtime fixes - #4

Closed
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky
Closed

Add installer build tooling and cross-platform runtime fixes#4
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky

Conversation

@eimexdev

@eimexdeveimexdev commented Apr 18, 2026

Copy link
Copy Markdown
Owner

Motivation

  • Provide a CI-driven way to produce single-file installers for macOS and Windows so users can install OpenBeat without a local Python environment.
  • Make Resolve-side Lua code more robust on Windows and non-macOS environments by normalizing paths, locating runtime binaries, and writing logs to appropriate platform locations.

Description

  • Add a GitHub Actions workflow Build Installers at .github/workflows/build-installers.yml that builds macOS and Windows installers and uploads artifacts.
  • Add scripts/build_installers.py to build a PyInstaller single-file CLI and package platform-specific installers: OpenBeat-macos-<version>.pkg and OpenBeat-windows-<version>-installer.exe, and copy Resolve script/module payloads into the installer.
  • Update resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua to handle Windows path separators, normalize dirname, choose temp directories from TMPDIR/TEMP, find .venv Python on Windows (Scripts/python.exe), create a command_prefix() that invokes the bundled CLI, and write logs to %APPDATA%/macOS locations.
  • Update .gitignore to ignore build artifacts and add installer build docs to README.md describing the new installer option and local build instructions.

Testing

  • No automated tests were executed as part of this change; the PR adds a CI workflow to build installers on push/PR and includes runtime packaging checks executed by the installer script itself when run.

Codex Task

Summary by CodeRabbit

  • New Features

    • Pre-built installers now available for macOS (.pkg) and Windows (.exe) distributions
    • Added Windows platform support for cross-platform compatibility
  • Documentation

    • Updated installation guide with recommended pre-built installer download option
    • Added local installer build instructions

@coderabbitai

coderabbitaiBot commented Apr 18, 2026

Copy link
Copy Markdown
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: 14558fc6-84f0-4875-a0c6-16595789d621

📥 Commits

Reviewing files that changed from the base of the PR and between dd5fb86 and 5be008d.

📒 Files selected for processing (5)
  • .github/workflows/build-installers.yml
  • .gitignore
  • README.md
  • resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
  • scripts/build_installers.py

📝 Walkthrough

Walkthrough

This change adds a complete installer build and distribution pipeline for OpenBeat, including a GitHub Actions workflow that automatically builds macOS and Windows installers, a Python build script that packages the CLI with platform-specific resources, cross-platform path handling in the Lua module, and updated documentation with installation instructions.

Changes

Cohort / File(s)Summary
Build Pipeline Infrastructure
.github/workflows/build-installers.yml, .gitignore
New GitHub Actions workflow that builds platform-specific installers in a matrix for macOS and Windows, runs PyInstaller, and uploads artifacts. .gitignore updated to exclude build output directories.
Documentation
README.md
Added installation instructions for CI-produced platform-specific installers (macOS .pkg, Windows .exe) as recommended Option A, reframed source-based setup as Option B, and added section on building installers locally.
Cross-Platform Core Logic
resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
Enhanced with OS detection, dynamic path separators, platform-specific temporary and log directories (Windows AppData support), dual Python venv paths (POSIX bin/python and Windows Scripts/python.exe), and conditional command prefix construction for Windows vs. non-Windows systems.
Installer Build Script
scripts/build_installers.py
New script that bundles CLI into single-file executables using PyInstaller and generates platform-specific installers: macOS .pkg with pkgbuild and postinstall script, Windows .exe with embedded Python installer entry script. Supports --platform selection and version parsing from pyproject.toml.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The review spans heterogeneous changes across infrastructure, documentation, and platform-specific logic. The cross-platform path handling in OpenBeatCommon.lua and the intricate PyInstaller integration in build_installers.py require careful verification of Windows/macOS-specific behaviors and command construction patterns.

Poem

🐰 From source to bundles, we now can fly,
With installers ready for both Mac and Windows nigh,
PyInstaller hops and packages with care,
Cross-platform paths resolved everywhere,
One push, one workflow, distribution is here! 🚀


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:5be008df0b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".



def build_cli_binary(python_bin: str = "python") -> Path:
return pyinstaller_binary("openbeat", ROOT / "openbeat" / "cli.py", python_bin=python_bin)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bundle CLI using a module entry point

build_cli_binary() passes openbeat/cli.py as a file entry script, but that file relies on package-relative imports (from .analysis ...) and does not run as a standalone script (e.g. python openbeat/cli.py raises ImportError). Because PyInstaller one-file apps execute that entry as __main__, the bundled openbeat binary produced by this path is likely to fail at startup before any subcommand runs.

Useful? React with 👍 / 👎.

local function command_prefix()
local bin = python_bin()
local lowered = string.lower(bin)
if lowered:match("python%.exe$") or lowered:match("python$") then

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Treat python3 fallback as a Python interpreter

When no local config or .venv interpreter is found, python_bin() returns python3, but command_prefix() only appends -m openbeat.cli for names ending in python/python.exe. In that fallback path the generated command becomes "python3" analyze ... (missing module invocation), so OpenBeat commands fail immediately on systems using the fallback interpreter.

Useful? React with 👍 / 👎.


def main() -> int:
parser = argparse.ArgumentParser(description="Build OpenBeat single-file installers")
parser.add_argument("--platform", choices=["macos", "windows", "all"], default="all")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Default installer builds to host platform only

The CLI defaults --platform to all, which unconditionally runs both platform builders on a single host. That makes local builds fail in normal environments (e.g., non-macOS hosts cannot run pkgbuild, and non-Windows hosts will not produce dist/openbeat-installer.exe, triggering the FileNotFoundError path), so the default behavior is broken unless users manually override it.

Useful? React with 👍 / 👎.

@eimexdev

Copy link
Copy Markdown
OwnerAuthor

Closing this as superseded by the current main branch and the merged release-hardening work in #6. Main now has installer build tooling, the artifact-safe workflow updates, Windows/runtime fixes, and the focused test coverage from the newer release-prep branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@eimexdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add installer build tooling and cross-platform runtime fixes - #4

Closed
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky
Closed

Add installer build tooling and cross-platform runtime fixes#4
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky

Conversation

@eimexdev

@eimexdeveimexdev commented Apr 18, 2026

Copy link
Copy Markdown
Owner

Motivation

  • Provide a CI-driven way to produce single-file installers for macOS and Windows so users can install OpenBeat without a local Python environment.
  • Make Resolve-side Lua code more robust on Windows and non-macOS environments by normalizing paths, locating runtime binaries, and writing logs to appropriate platform locations.

Description

  • Add a GitHub Actions workflow Build Installers at .github/workflows/build-installers.yml that builds macOS and Windows installers and uploads artifacts.
  • Add scripts/build_installers.py to build a PyInstaller single-file CLI and package platform-specific installers: OpenBeat-macos-<version>.pkg and OpenBeat-windows-<version>-installer.exe, and copy Resolve script/module payloads into the installer.
  • Update resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua to handle Windows path separators, normalize dirname, choose temp directories from TMPDIR/TEMP, find .venv Python on Windows (Scripts/python.exe), create a command_prefix() that invokes the bundled CLI, and write logs to %APPDATA%/macOS locations.
  • Update .gitignore to ignore build artifacts and add installer build docs to README.md describing the new installer option and local build instructions.

Testing

  • No automated tests were executed as part of this change; the PR adds a CI workflow to build installers on push/PR and includes runtime packaging checks executed by the installer script itself when run.

Codex Task

Summary by CodeRabbit

  • New Features

    • Pre-built installers now available for macOS (.pkg) and Windows (.exe) distributions
    • Added Windows platform support for cross-platform compatibility
  • Documentation

    • Updated installation guide with recommended pre-built installer download option
    • Added local installer build instructions

@coderabbitai

coderabbitaiBot commented Apr 18, 2026

Copy link
Copy Markdown
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: 14558fc6-84f0-4875-a0c6-16595789d621

📥 Commits

Reviewing files that changed from the base of the PR and between dd5fb86 and 5be008d.

📒 Files selected for processing (5)
  • .github/workflows/build-installers.yml
  • .gitignore
  • README.md
  • resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
  • scripts/build_installers.py

📝 Walkthrough

Walkthrough

This change adds a complete installer build and distribution pipeline for OpenBeat, including a GitHub Actions workflow that automatically builds macOS and Windows installers, a Python build script that packages the CLI with platform-specific resources, cross-platform path handling in the Lua module, and updated documentation with installation instructions.

Changes

Cohort / File(s)Summary
Build Pipeline Infrastructure
.github/workflows/build-installers.yml, .gitignore
New GitHub Actions workflow that builds platform-specific installers in a matrix for macOS and Windows, runs PyInstaller, and uploads artifacts. .gitignore updated to exclude build output directories.
Documentation
README.md
Added installation instructions for CI-produced platform-specific installers (macOS .pkg, Windows .exe) as recommended Option A, reframed source-based setup as Option B, and added section on building installers locally.
Cross-Platform Core Logic
resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
Enhanced with OS detection, dynamic path separators, platform-specific temporary and log directories (Windows AppData support), dual Python venv paths (POSIX bin/python and Windows Scripts/python.exe), and conditional command prefix construction for Windows vs. non-Windows systems.
Installer Build Script
scripts/build_installers.py
New script that bundles CLI into single-file executables using PyInstaller and generates platform-specific installers: macOS .pkg with pkgbuild and postinstall script, Windows .exe with embedded Python installer entry script. Supports --platform selection and version parsing from pyproject.toml.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The review spans heterogeneous changes across infrastructure, documentation, and platform-specific logic. The cross-platform path handling in OpenBeatCommon.lua and the intricate PyInstaller integration in build_installers.py require careful verification of Windows/macOS-specific behaviors and command construction patterns.

Poem

🐰 From source to bundles, we now can fly,
With installers ready for both Mac and Windows nigh,
PyInstaller hops and packages with care,
Cross-platform paths resolved everywhere,
One push, one workflow, distribution is here! 🚀


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:5be008df0b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".



def build_cli_binary(python_bin: str = "python") -> Path:
return pyinstaller_binary("openbeat", ROOT / "openbeat" / "cli.py", python_bin=python_bin)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bundle CLI using a module entry point

build_cli_binary() passes openbeat/cli.py as a file entry script, but that file relies on package-relative imports (from .analysis ...) and does not run as a standalone script (e.g. python openbeat/cli.py raises ImportError). Because PyInstaller one-file apps execute that entry as __main__, the bundled openbeat binary produced by this path is likely to fail at startup before any subcommand runs.

Useful? React with 👍 / 👎.

local function command_prefix()
local bin = python_bin()
local lowered = string.lower(bin)
if lowered:match("python%.exe$") or lowered:match("python$") then

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Treat python3 fallback as a Python interpreter

When no local config or .venv interpreter is found, python_bin() returns python3, but command_prefix() only appends -m openbeat.cli for names ending in python/python.exe. In that fallback path the generated command becomes "python3" analyze ... (missing module invocation), so OpenBeat commands fail immediately on systems using the fallback interpreter.

Useful? React with 👍 / 👎.


def main() -> int:
parser = argparse.ArgumentParser(description="Build OpenBeat single-file installers")
parser.add_argument("--platform", choices=["macos", "windows", "all"], default="all")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Default installer builds to host platform only

The CLI defaults --platform to all, which unconditionally runs both platform builders on a single host. That makes local builds fail in normal environments (e.g., non-macOS hosts cannot run pkgbuild, and non-Windows hosts will not produce dist/openbeat-installer.exe, triggering the FileNotFoundError path), so the default behavior is broken unless users manually override it.

Useful? React with 👍 / 👎.

@eimexdev

Copy link
Copy Markdown
OwnerAuthor

Closing this as superseded by the current main branch and the merged release-hardening work in #6. Main now has installer build tooling, the artifact-safe workflow updates, Windows/runtime fixes, and the focused test coverage from the newer release-prep branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@eimexdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add installer build tooling and cross-platform runtime fixes - #4

Closed
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky
Closed

Add installer build tooling and cross-platform runtime fixes#4
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky

Conversation

@eimexdev

@eimexdeveimexdev commented Apr 18, 2026

Copy link
Copy Markdown
Owner

Motivation

  • Provide a CI-driven way to produce single-file installers for macOS and Windows so users can install OpenBeat without a local Python environment.
  • Make Resolve-side Lua code more robust on Windows and non-macOS environments by normalizing paths, locating runtime binaries, and writing logs to appropriate platform locations.

Description

  • Add a GitHub Actions workflow Build Installers at .github/workflows/build-installers.yml that builds macOS and Windows installers and uploads artifacts.
  • Add scripts/build_installers.py to build a PyInstaller single-file CLI and package platform-specific installers: OpenBeat-macos-<version>.pkg and OpenBeat-windows-<version>-installer.exe, and copy Resolve script/module payloads into the installer.
  • Update resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua to handle Windows path separators, normalize dirname, choose temp directories from TMPDIR/TEMP, find .venv Python on Windows (Scripts/python.exe), create a command_prefix() that invokes the bundled CLI, and write logs to %APPDATA%/macOS locations.
  • Update .gitignore to ignore build artifacts and add installer build docs to README.md describing the new installer option and local build instructions.

Testing

  • No automated tests were executed as part of this change; the PR adds a CI workflow to build installers on push/PR and includes runtime packaging checks executed by the installer script itself when run.

Codex Task

Summary by CodeRabbit

  • New Features

    • Pre-built installers now available for macOS (.pkg) and Windows (.exe) distributions
    • Added Windows platform support for cross-platform compatibility
  • Documentation

    • Updated installation guide with recommended pre-built installer download option
    • Added local installer build instructions

@coderabbitai

coderabbitaiBot commented Apr 18, 2026

Copy link
Copy Markdown
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: 14558fc6-84f0-4875-a0c6-16595789d621

📥 Commits

Reviewing files that changed from the base of the PR and between dd5fb86 and 5be008d.

📒 Files selected for processing (5)
  • .github/workflows/build-installers.yml
  • .gitignore
  • README.md
  • resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
  • scripts/build_installers.py

📝 Walkthrough

Walkthrough

This change adds a complete installer build and distribution pipeline for OpenBeat, including a GitHub Actions workflow that automatically builds macOS and Windows installers, a Python build script that packages the CLI with platform-specific resources, cross-platform path handling in the Lua module, and updated documentation with installation instructions.

Changes

Cohort / File(s)Summary
Build Pipeline Infrastructure
.github/workflows/build-installers.yml, .gitignore
New GitHub Actions workflow that builds platform-specific installers in a matrix for macOS and Windows, runs PyInstaller, and uploads artifacts. .gitignore updated to exclude build output directories.
Documentation
README.md
Added installation instructions for CI-produced platform-specific installers (macOS .pkg, Windows .exe) as recommended Option A, reframed source-based setup as Option B, and added section on building installers locally.
Cross-Platform Core Logic
resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
Enhanced with OS detection, dynamic path separators, platform-specific temporary and log directories (Windows AppData support), dual Python venv paths (POSIX bin/python and Windows Scripts/python.exe), and conditional command prefix construction for Windows vs. non-Windows systems.
Installer Build Script
scripts/build_installers.py
New script that bundles CLI into single-file executables using PyInstaller and generates platform-specific installers: macOS .pkg with pkgbuild and postinstall script, Windows .exe with embedded Python installer entry script. Supports --platform selection and version parsing from pyproject.toml.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The review spans heterogeneous changes across infrastructure, documentation, and platform-specific logic. The cross-platform path handling in OpenBeatCommon.lua and the intricate PyInstaller integration in build_installers.py require careful verification of Windows/macOS-specific behaviors and command construction patterns.

Poem

🐰 From source to bundles, we now can fly,
With installers ready for both Mac and Windows nigh,
PyInstaller hops and packages with care,
Cross-platform paths resolved everywhere,
One push, one workflow, distribution is here! 🚀


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:5be008df0b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".



def build_cli_binary(python_bin: str = "python") -> Path:
return pyinstaller_binary("openbeat", ROOT / "openbeat" / "cli.py", python_bin=python_bin)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bundle CLI using a module entry point

build_cli_binary() passes openbeat/cli.py as a file entry script, but that file relies on package-relative imports (from .analysis ...) and does not run as a standalone script (e.g. python openbeat/cli.py raises ImportError). Because PyInstaller one-file apps execute that entry as __main__, the bundled openbeat binary produced by this path is likely to fail at startup before any subcommand runs.

Useful? React with 👍 / 👎.

local function command_prefix()
local bin = python_bin()
local lowered = string.lower(bin)
if lowered:match("python%.exe$") or lowered:match("python$") then

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Treat python3 fallback as a Python interpreter

When no local config or .venv interpreter is found, python_bin() returns python3, but command_prefix() only appends -m openbeat.cli for names ending in python/python.exe. In that fallback path the generated command becomes "python3" analyze ... (missing module invocation), so OpenBeat commands fail immediately on systems using the fallback interpreter.

Useful? React with 👍 / 👎.


def main() -> int:
parser = argparse.ArgumentParser(description="Build OpenBeat single-file installers")
parser.add_argument("--platform", choices=["macos", "windows", "all"], default="all")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Default installer builds to host platform only

The CLI defaults --platform to all, which unconditionally runs both platform builders on a single host. That makes local builds fail in normal environments (e.g., non-macOS hosts cannot run pkgbuild, and non-Windows hosts will not produce dist/openbeat-installer.exe, triggering the FileNotFoundError path), so the default behavior is broken unless users manually override it.

Useful? React with 👍 / 👎.

@eimexdev

Copy link
Copy Markdown
OwnerAuthor

Closing this as superseded by the current main branch and the merged release-hardening work in #6. Main now has installer build tooling, the artifact-safe workflow updates, Windows/runtime fixes, and the focused test coverage from the newer release-prep branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@eimexdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add installer build tooling and cross-platform runtime fixes - #4

Closed
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky
Closed

Add installer build tooling and cross-platform runtime fixes#4
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky

Conversation

@eimexdev

@eimexdeveimexdev commented Apr 18, 2026

Copy link
Copy Markdown
Owner

Motivation

  • Provide a CI-driven way to produce single-file installers for macOS and Windows so users can install OpenBeat without a local Python environment.
  • Make Resolve-side Lua code more robust on Windows and non-macOS environments by normalizing paths, locating runtime binaries, and writing logs to appropriate platform locations.

Description

  • Add a GitHub Actions workflow Build Installers at .github/workflows/build-installers.yml that builds macOS and Windows installers and uploads artifacts.
  • Add scripts/build_installers.py to build a PyInstaller single-file CLI and package platform-specific installers: OpenBeat-macos-<version>.pkg and OpenBeat-windows-<version>-installer.exe, and copy Resolve script/module payloads into the installer.
  • Update resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua to handle Windows path separators, normalize dirname, choose temp directories from TMPDIR/TEMP, find .venv Python on Windows (Scripts/python.exe), create a command_prefix() that invokes the bundled CLI, and write logs to %APPDATA%/macOS locations.
  • Update .gitignore to ignore build artifacts and add installer build docs to README.md describing the new installer option and local build instructions.

Testing

  • No automated tests were executed as part of this change; the PR adds a CI workflow to build installers on push/PR and includes runtime packaging checks executed by the installer script itself when run.

Codex Task

Summary by CodeRabbit

  • New Features

    • Pre-built installers now available for macOS (.pkg) and Windows (.exe) distributions
    • Added Windows platform support for cross-platform compatibility
  • Documentation

    • Updated installation guide with recommended pre-built installer download option
    • Added local installer build instructions

@coderabbitai

coderabbitaiBot commented Apr 18, 2026

Copy link
Copy Markdown
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: 14558fc6-84f0-4875-a0c6-16595789d621

📥 Commits

Reviewing files that changed from the base of the PR and between dd5fb86 and 5be008d.

📒 Files selected for processing (5)
  • .github/workflows/build-installers.yml
  • .gitignore
  • README.md
  • resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
  • scripts/build_installers.py

📝 Walkthrough

Walkthrough

This change adds a complete installer build and distribution pipeline for OpenBeat, including a GitHub Actions workflow that automatically builds macOS and Windows installers, a Python build script that packages the CLI with platform-specific resources, cross-platform path handling in the Lua module, and updated documentation with installation instructions.

Changes

Cohort / File(s)Summary
Build Pipeline Infrastructure
.github/workflows/build-installers.yml, .gitignore
New GitHub Actions workflow that builds platform-specific installers in a matrix for macOS and Windows, runs PyInstaller, and uploads artifacts. .gitignore updated to exclude build output directories.
Documentation
README.md
Added installation instructions for CI-produced platform-specific installers (macOS .pkg, Windows .exe) as recommended Option A, reframed source-based setup as Option B, and added section on building installers locally.
Cross-Platform Core Logic
resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
Enhanced with OS detection, dynamic path separators, platform-specific temporary and log directories (Windows AppData support), dual Python venv paths (POSIX bin/python and Windows Scripts/python.exe), and conditional command prefix construction for Windows vs. non-Windows systems.
Installer Build Script
scripts/build_installers.py
New script that bundles CLI into single-file executables using PyInstaller and generates platform-specific installers: macOS .pkg with pkgbuild and postinstall script, Windows .exe with embedded Python installer entry script. Supports --platform selection and version parsing from pyproject.toml.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The review spans heterogeneous changes across infrastructure, documentation, and platform-specific logic. The cross-platform path handling in OpenBeatCommon.lua and the intricate PyInstaller integration in build_installers.py require careful verification of Windows/macOS-specific behaviors and command construction patterns.

Poem

🐰 From source to bundles, we now can fly,
With installers ready for both Mac and Windows nigh,
PyInstaller hops and packages with care,
Cross-platform paths resolved everywhere,
One push, one workflow, distribution is here! 🚀


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:5be008df0b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".



def build_cli_binary(python_bin: str = "python") -> Path:
return pyinstaller_binary("openbeat", ROOT / "openbeat" / "cli.py", python_bin=python_bin)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bundle CLI using a module entry point

build_cli_binary() passes openbeat/cli.py as a file entry script, but that file relies on package-relative imports (from .analysis ...) and does not run as a standalone script (e.g. python openbeat/cli.py raises ImportError). Because PyInstaller one-file apps execute that entry as __main__, the bundled openbeat binary produced by this path is likely to fail at startup before any subcommand runs.

Useful? React with 👍 / 👎.

local function command_prefix()
local bin = python_bin()
local lowered = string.lower(bin)
if lowered:match("python%.exe$") or lowered:match("python$") then

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Treat python3 fallback as a Python interpreter

When no local config or .venv interpreter is found, python_bin() returns python3, but command_prefix() only appends -m openbeat.cli for names ending in python/python.exe. In that fallback path the generated command becomes "python3" analyze ... (missing module invocation), so OpenBeat commands fail immediately on systems using the fallback interpreter.

Useful? React with 👍 / 👎.


def main() -> int:
parser = argparse.ArgumentParser(description="Build OpenBeat single-file installers")
parser.add_argument("--platform", choices=["macos", "windows", "all"], default="all")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Default installer builds to host platform only

The CLI defaults --platform to all, which unconditionally runs both platform builders on a single host. That makes local builds fail in normal environments (e.g., non-macOS hosts cannot run pkgbuild, and non-Windows hosts will not produce dist/openbeat-installer.exe, triggering the FileNotFoundError path), so the default behavior is broken unless users manually override it.

Useful? React with 👍 / 👎.

@eimexdev

Copy link
Copy Markdown
OwnerAuthor

Closing this as superseded by the current main branch and the merged release-hardening work in #6. Main now has installer build tooling, the artifact-safe workflow updates, Windows/runtime fixes, and the focused test coverage from the newer release-prep branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@eimexdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add installer build tooling and cross-platform runtime fixes - #4

Closed
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky
Closed

Add installer build tooling and cross-platform runtime fixes#4
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky

Conversation

@eimexdev

@eimexdeveimexdev commented Apr 18, 2026

Copy link
Copy Markdown
Owner

Motivation

  • Provide a CI-driven way to produce single-file installers for macOS and Windows so users can install OpenBeat without a local Python environment.
  • Make Resolve-side Lua code more robust on Windows and non-macOS environments by normalizing paths, locating runtime binaries, and writing logs to appropriate platform locations.

Description

  • Add a GitHub Actions workflow Build Installers at .github/workflows/build-installers.yml that builds macOS and Windows installers and uploads artifacts.
  • Add scripts/build_installers.py to build a PyInstaller single-file CLI and package platform-specific installers: OpenBeat-macos-<version>.pkg and OpenBeat-windows-<version>-installer.exe, and copy Resolve script/module payloads into the installer.
  • Update resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua to handle Windows path separators, normalize dirname, choose temp directories from TMPDIR/TEMP, find .venv Python on Windows (Scripts/python.exe), create a command_prefix() that invokes the bundled CLI, and write logs to %APPDATA%/macOS locations.
  • Update .gitignore to ignore build artifacts and add installer build docs to README.md describing the new installer option and local build instructions.

Testing

  • No automated tests were executed as part of this change; the PR adds a CI workflow to build installers on push/PR and includes runtime packaging checks executed by the installer script itself when run.

Codex Task

Summary by CodeRabbit

  • New Features

    • Pre-built installers now available for macOS (.pkg) and Windows (.exe) distributions
    • Added Windows platform support for cross-platform compatibility
  • Documentation

    • Updated installation guide with recommended pre-built installer download option
    • Added local installer build instructions

@coderabbitai

coderabbitaiBot commented Apr 18, 2026

Copy link
Copy Markdown
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: 14558fc6-84f0-4875-a0c6-16595789d621

📥 Commits

Reviewing files that changed from the base of the PR and between dd5fb86 and 5be008d.

📒 Files selected for processing (5)
  • .github/workflows/build-installers.yml
  • .gitignore
  • README.md
  • resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
  • scripts/build_installers.py

📝 Walkthrough

Walkthrough

This change adds a complete installer build and distribution pipeline for OpenBeat, including a GitHub Actions workflow that automatically builds macOS and Windows installers, a Python build script that packages the CLI with platform-specific resources, cross-platform path handling in the Lua module, and updated documentation with installation instructions.

Changes

Cohort / File(s)Summary
Build Pipeline Infrastructure
.github/workflows/build-installers.yml, .gitignore
New GitHub Actions workflow that builds platform-specific installers in a matrix for macOS and Windows, runs PyInstaller, and uploads artifacts. .gitignore updated to exclude build output directories.
Documentation
README.md
Added installation instructions for CI-produced platform-specific installers (macOS .pkg, Windows .exe) as recommended Option A, reframed source-based setup as Option B, and added section on building installers locally.
Cross-Platform Core Logic
resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
Enhanced with OS detection, dynamic path separators, platform-specific temporary and log directories (Windows AppData support), dual Python venv paths (POSIX bin/python and Windows Scripts/python.exe), and conditional command prefix construction for Windows vs. non-Windows systems.
Installer Build Script
scripts/build_installers.py
New script that bundles CLI into single-file executables using PyInstaller and generates platform-specific installers: macOS .pkg with pkgbuild and postinstall script, Windows .exe with embedded Python installer entry script. Supports --platform selection and version parsing from pyproject.toml.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The review spans heterogeneous changes across infrastructure, documentation, and platform-specific logic. The cross-platform path handling in OpenBeatCommon.lua and the intricate PyInstaller integration in build_installers.py require careful verification of Windows/macOS-specific behaviors and command construction patterns.

Poem

🐰 From source to bundles, we now can fly,
With installers ready for both Mac and Windows nigh,
PyInstaller hops and packages with care,
Cross-platform paths resolved everywhere,
One push, one workflow, distribution is here! 🚀


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:5be008df0b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".



def build_cli_binary(python_bin: str = "python") -> Path:
return pyinstaller_binary("openbeat", ROOT / "openbeat" / "cli.py", python_bin=python_bin)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bundle CLI using a module entry point

build_cli_binary() passes openbeat/cli.py as a file entry script, but that file relies on package-relative imports (from .analysis ...) and does not run as a standalone script (e.g. python openbeat/cli.py raises ImportError). Because PyInstaller one-file apps execute that entry as __main__, the bundled openbeat binary produced by this path is likely to fail at startup before any subcommand runs.

Useful? React with 👍 / 👎.

local function command_prefix()
local bin = python_bin()
local lowered = string.lower(bin)
if lowered:match("python%.exe$") or lowered:match("python$") then

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Treat python3 fallback as a Python interpreter

When no local config or .venv interpreter is found, python_bin() returns python3, but command_prefix() only appends -m openbeat.cli for names ending in python/python.exe. In that fallback path the generated command becomes "python3" analyze ... (missing module invocation), so OpenBeat commands fail immediately on systems using the fallback interpreter.

Useful? React with 👍 / 👎.


def main() -> int:
parser = argparse.ArgumentParser(description="Build OpenBeat single-file installers")
parser.add_argument("--platform", choices=["macos", "windows", "all"], default="all")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Default installer builds to host platform only

The CLI defaults --platform to all, which unconditionally runs both platform builders on a single host. That makes local builds fail in normal environments (e.g., non-macOS hosts cannot run pkgbuild, and non-Windows hosts will not produce dist/openbeat-installer.exe, triggering the FileNotFoundError path), so the default behavior is broken unless users manually override it.

Useful? React with 👍 / 👎.

@eimexdev

Copy link
Copy Markdown
OwnerAuthor

Closing this as superseded by the current main branch and the merged release-hardening work in #6. Main now has installer build tooling, the artifact-safe workflow updates, Windows/runtime fixes, and the focused test coverage from the newer release-prep branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@eimexdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add installer build tooling and cross-platform runtime fixes - #4

Closed
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky
Closed

Add installer build tooling and cross-platform runtime fixes#4
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky

Conversation

@eimexdev

@eimexdeveimexdev commented Apr 18, 2026

Copy link
Copy Markdown
Owner

Motivation

  • Provide a CI-driven way to produce single-file installers for macOS and Windows so users can install OpenBeat without a local Python environment.
  • Make Resolve-side Lua code more robust on Windows and non-macOS environments by normalizing paths, locating runtime binaries, and writing logs to appropriate platform locations.

Description

  • Add a GitHub Actions workflow Build Installers at .github/workflows/build-installers.yml that builds macOS and Windows installers and uploads artifacts.
  • Add scripts/build_installers.py to build a PyInstaller single-file CLI and package platform-specific installers: OpenBeat-macos-<version>.pkg and OpenBeat-windows-<version>-installer.exe, and copy Resolve script/module payloads into the installer.
  • Update resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua to handle Windows path separators, normalize dirname, choose temp directories from TMPDIR/TEMP, find .venv Python on Windows (Scripts/python.exe), create a command_prefix() that invokes the bundled CLI, and write logs to %APPDATA%/macOS locations.
  • Update .gitignore to ignore build artifacts and add installer build docs to README.md describing the new installer option and local build instructions.

Testing

  • No automated tests were executed as part of this change; the PR adds a CI workflow to build installers on push/PR and includes runtime packaging checks executed by the installer script itself when run.

Codex Task

Summary by CodeRabbit

  • New Features

    • Pre-built installers now available for macOS (.pkg) and Windows (.exe) distributions
    • Added Windows platform support for cross-platform compatibility
  • Documentation

    • Updated installation guide with recommended pre-built installer download option
    • Added local installer build instructions

@coderabbitai

coderabbitaiBot commented Apr 18, 2026

Copy link
Copy Markdown
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: 14558fc6-84f0-4875-a0c6-16595789d621

📥 Commits

Reviewing files that changed from the base of the PR and between dd5fb86 and 5be008d.

📒 Files selected for processing (5)
  • .github/workflows/build-installers.yml
  • .gitignore
  • README.md
  • resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
  • scripts/build_installers.py

📝 Walkthrough

Walkthrough

This change adds a complete installer build and distribution pipeline for OpenBeat, including a GitHub Actions workflow that automatically builds macOS and Windows installers, a Python build script that packages the CLI with platform-specific resources, cross-platform path handling in the Lua module, and updated documentation with installation instructions.

Changes

Cohort / File(s)Summary
Build Pipeline Infrastructure
.github/workflows/build-installers.yml, .gitignore
New GitHub Actions workflow that builds platform-specific installers in a matrix for macOS and Windows, runs PyInstaller, and uploads artifacts. .gitignore updated to exclude build output directories.
Documentation
README.md
Added installation instructions for CI-produced platform-specific installers (macOS .pkg, Windows .exe) as recommended Option A, reframed source-based setup as Option B, and added section on building installers locally.
Cross-Platform Core Logic
resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
Enhanced with OS detection, dynamic path separators, platform-specific temporary and log directories (Windows AppData support), dual Python venv paths (POSIX bin/python and Windows Scripts/python.exe), and conditional command prefix construction for Windows vs. non-Windows systems.
Installer Build Script
scripts/build_installers.py
New script that bundles CLI into single-file executables using PyInstaller and generates platform-specific installers: macOS .pkg with pkgbuild and postinstall script, Windows .exe with embedded Python installer entry script. Supports --platform selection and version parsing from pyproject.toml.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The review spans heterogeneous changes across infrastructure, documentation, and platform-specific logic. The cross-platform path handling in OpenBeatCommon.lua and the intricate PyInstaller integration in build_installers.py require careful verification of Windows/macOS-specific behaviors and command construction patterns.

Poem

🐰 From source to bundles, we now can fly,
With installers ready for both Mac and Windows nigh,
PyInstaller hops and packages with care,
Cross-platform paths resolved everywhere,
One push, one workflow, distribution is here! 🚀


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:5be008df0b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".



def build_cli_binary(python_bin: str = "python") -> Path:
return pyinstaller_binary("openbeat", ROOT / "openbeat" / "cli.py", python_bin=python_bin)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bundle CLI using a module entry point

build_cli_binary() passes openbeat/cli.py as a file entry script, but that file relies on package-relative imports (from .analysis ...) and does not run as a standalone script (e.g. python openbeat/cli.py raises ImportError). Because PyInstaller one-file apps execute that entry as __main__, the bundled openbeat binary produced by this path is likely to fail at startup before any subcommand runs.

Useful? React with 👍 / 👎.

local function command_prefix()
local bin = python_bin()
local lowered = string.lower(bin)
if lowered:match("python%.exe$") or lowered:match("python$") then

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Treat python3 fallback as a Python interpreter

When no local config or .venv interpreter is found, python_bin() returns python3, but command_prefix() only appends -m openbeat.cli for names ending in python/python.exe. In that fallback path the generated command becomes "python3" analyze ... (missing module invocation), so OpenBeat commands fail immediately on systems using the fallback interpreter.

Useful? React with 👍 / 👎.


def main() -> int:
parser = argparse.ArgumentParser(description="Build OpenBeat single-file installers")
parser.add_argument("--platform", choices=["macos", "windows", "all"], default="all")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Default installer builds to host platform only

The CLI defaults --platform to all, which unconditionally runs both platform builders on a single host. That makes local builds fail in normal environments (e.g., non-macOS hosts cannot run pkgbuild, and non-Windows hosts will not produce dist/openbeat-installer.exe, triggering the FileNotFoundError path), so the default behavior is broken unless users manually override it.

Useful? React with 👍 / 👎.

@eimexdev

Copy link
Copy Markdown
OwnerAuthor

Closing this as superseded by the current main branch and the merged release-hardening work in #6. Main now has installer build tooling, the artifact-safe workflow updates, Windows/runtime fixes, and the focused test coverage from the newer release-prep branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@eimexdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add installer build tooling and cross-platform runtime fixes - #4

Closed
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky
Closed

Add installer build tooling and cross-platform runtime fixes#4
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky

Conversation

@eimexdev

@eimexdeveimexdev commented Apr 18, 2026

Copy link
Copy Markdown
Owner

Motivation

  • Provide a CI-driven way to produce single-file installers for macOS and Windows so users can install OpenBeat without a local Python environment.
  • Make Resolve-side Lua code more robust on Windows and non-macOS environments by normalizing paths, locating runtime binaries, and writing logs to appropriate platform locations.

Description

  • Add a GitHub Actions workflow Build Installers at .github/workflows/build-installers.yml that builds macOS and Windows installers and uploads artifacts.
  • Add scripts/build_installers.py to build a PyInstaller single-file CLI and package platform-specific installers: OpenBeat-macos-<version>.pkg and OpenBeat-windows-<version>-installer.exe, and copy Resolve script/module payloads into the installer.
  • Update resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua to handle Windows path separators, normalize dirname, choose temp directories from TMPDIR/TEMP, find .venv Python on Windows (Scripts/python.exe), create a command_prefix() that invokes the bundled CLI, and write logs to %APPDATA%/macOS locations.
  • Update .gitignore to ignore build artifacts and add installer build docs to README.md describing the new installer option and local build instructions.

Testing

  • No automated tests were executed as part of this change; the PR adds a CI workflow to build installers on push/PR and includes runtime packaging checks executed by the installer script itself when run.

Codex Task

Summary by CodeRabbit

  • New Features

    • Pre-built installers now available for macOS (.pkg) and Windows (.exe) distributions
    • Added Windows platform support for cross-platform compatibility
  • Documentation

    • Updated installation guide with recommended pre-built installer download option
    • Added local installer build instructions

@coderabbitai

coderabbitaiBot commented Apr 18, 2026

Copy link
Copy Markdown
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: 14558fc6-84f0-4875-a0c6-16595789d621

📥 Commits

Reviewing files that changed from the base of the PR and between dd5fb86 and 5be008d.

📒 Files selected for processing (5)
  • .github/workflows/build-installers.yml
  • .gitignore
  • README.md
  • resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
  • scripts/build_installers.py

📝 Walkthrough

Walkthrough

This change adds a complete installer build and distribution pipeline for OpenBeat, including a GitHub Actions workflow that automatically builds macOS and Windows installers, a Python build script that packages the CLI with platform-specific resources, cross-platform path handling in the Lua module, and updated documentation with installation instructions.

Changes

Cohort / File(s)Summary
Build Pipeline Infrastructure
.github/workflows/build-installers.yml, .gitignore
New GitHub Actions workflow that builds platform-specific installers in a matrix for macOS and Windows, runs PyInstaller, and uploads artifacts. .gitignore updated to exclude build output directories.
Documentation
README.md
Added installation instructions for CI-produced platform-specific installers (macOS .pkg, Windows .exe) as recommended Option A, reframed source-based setup as Option B, and added section on building installers locally.
Cross-Platform Core Logic
resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
Enhanced with OS detection, dynamic path separators, platform-specific temporary and log directories (Windows AppData support), dual Python venv paths (POSIX bin/python and Windows Scripts/python.exe), and conditional command prefix construction for Windows vs. non-Windows systems.
Installer Build Script
scripts/build_installers.py
New script that bundles CLI into single-file executables using PyInstaller and generates platform-specific installers: macOS .pkg with pkgbuild and postinstall script, Windows .exe with embedded Python installer entry script. Supports --platform selection and version parsing from pyproject.toml.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The review spans heterogeneous changes across infrastructure, documentation, and platform-specific logic. The cross-platform path handling in OpenBeatCommon.lua and the intricate PyInstaller integration in build_installers.py require careful verification of Windows/macOS-specific behaviors and command construction patterns.

Poem

🐰 From source to bundles, we now can fly,
With installers ready for both Mac and Windows nigh,
PyInstaller hops and packages with care,
Cross-platform paths resolved everywhere,
One push, one workflow, distribution is here! 🚀


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:5be008df0b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".



def build_cli_binary(python_bin: str = "python") -> Path:
return pyinstaller_binary("openbeat", ROOT / "openbeat" / "cli.py", python_bin=python_bin)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bundle CLI using a module entry point

build_cli_binary() passes openbeat/cli.py as a file entry script, but that file relies on package-relative imports (from .analysis ...) and does not run as a standalone script (e.g. python openbeat/cli.py raises ImportError). Because PyInstaller one-file apps execute that entry as __main__, the bundled openbeat binary produced by this path is likely to fail at startup before any subcommand runs.

Useful? React with 👍 / 👎.

local function command_prefix()
local bin = python_bin()
local lowered = string.lower(bin)
if lowered:match("python%.exe$") or lowered:match("python$") then

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Treat python3 fallback as a Python interpreter

When no local config or .venv interpreter is found, python_bin() returns python3, but command_prefix() only appends -m openbeat.cli for names ending in python/python.exe. In that fallback path the generated command becomes "python3" analyze ... (missing module invocation), so OpenBeat commands fail immediately on systems using the fallback interpreter.

Useful? React with 👍 / 👎.


def main() -> int:
parser = argparse.ArgumentParser(description="Build OpenBeat single-file installers")
parser.add_argument("--platform", choices=["macos", "windows", "all"], default="all")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Default installer builds to host platform only

The CLI defaults --platform to all, which unconditionally runs both platform builders on a single host. That makes local builds fail in normal environments (e.g., non-macOS hosts cannot run pkgbuild, and non-Windows hosts will not produce dist/openbeat-installer.exe, triggering the FileNotFoundError path), so the default behavior is broken unless users manually override it.

Useful? React with 👍 / 👎.

@eimexdev

Copy link
Copy Markdown
OwnerAuthor

Closing this as superseded by the current main branch and the merged release-hardening work in #6. Main now has installer build tooling, the artifact-safe workflow updates, Windows/runtime fixes, and the focused test coverage from the newer release-prep branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@eimexdev
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add installer build tooling and cross-platform runtime fixes - #4

Closed
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky
Closed

Add installer build tooling and cross-platform runtime fixes#4
eimexdev wants to merge 1 commit into
mainfrom
codex/improve-install-flow-with-bundled-python-zktfky

Conversation

@eimexdev

@eimexdeveimexdev commented Apr 18, 2026

Copy link
Copy Markdown
Owner

Motivation

  • Provide a CI-driven way to produce single-file installers for macOS and Windows so users can install OpenBeat without a local Python environment.
  • Make Resolve-side Lua code more robust on Windows and non-macOS environments by normalizing paths, locating runtime binaries, and writing logs to appropriate platform locations.

Description

  • Add a GitHub Actions workflow Build Installers at .github/workflows/build-installers.yml that builds macOS and Windows installers and uploads artifacts.
  • Add scripts/build_installers.py to build a PyInstaller single-file CLI and package platform-specific installers: OpenBeat-macos-<version>.pkg and OpenBeat-windows-<version>-installer.exe, and copy Resolve script/module payloads into the installer.
  • Update resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua to handle Windows path separators, normalize dirname, choose temp directories from TMPDIR/TEMP, find .venv Python on Windows (Scripts/python.exe), create a command_prefix() that invokes the bundled CLI, and write logs to %APPDATA%/macOS locations.
  • Update .gitignore to ignore build artifacts and add installer build docs to README.md describing the new installer option and local build instructions.

Testing

  • No automated tests were executed as part of this change; the PR adds a CI workflow to build installers on push/PR and includes runtime packaging checks executed by the installer script itself when run.

Codex Task

Summary by CodeRabbit

  • New Features

    • Pre-built installers now available for macOS (.pkg) and Windows (.exe) distributions
    • Added Windows platform support for cross-platform compatibility
  • Documentation

    • Updated installation guide with recommended pre-built installer download option
    • Added local installer build instructions

@coderabbitai

coderabbitaiBot commented Apr 18, 2026

Copy link
Copy Markdown
ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: 14558fc6-84f0-4875-a0c6-16595789d621

📥 Commits

Reviewing files that changed from the base of the PR and between dd5fb86 and 5be008d.

📒 Files selected for processing (5)
  • .github/workflows/build-installers.yml
  • .gitignore
  • README.md
  • resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
  • scripts/build_installers.py

📝 Walkthrough

Walkthrough

This change adds a complete installer build and distribution pipeline for OpenBeat, including a GitHub Actions workflow that automatically builds macOS and Windows installers, a Python build script that packages the CLI with platform-specific resources, cross-platform path handling in the Lua module, and updated documentation with installation instructions.

Changes

Cohort / File(s)Summary
Build Pipeline Infrastructure
.github/workflows/build-installers.yml, .gitignore
New GitHub Actions workflow that builds platform-specific installers in a matrix for macOS and Windows, runs PyInstaller, and uploads artifacts. .gitignore updated to exclude build output directories.
Documentation
README.md
Added installation instructions for CI-produced platform-specific installers (macOS .pkg, Windows .exe) as recommended Option A, reframed source-based setup as Option B, and added section on building installers locally.
Cross-Platform Core Logic
resolve/Fusion/Modules/OpenBeat/OpenBeatCommon.lua
Enhanced with OS detection, dynamic path separators, platform-specific temporary and log directories (Windows AppData support), dual Python venv paths (POSIX bin/python and Windows Scripts/python.exe), and conditional command prefix construction for Windows vs. non-Windows systems.
Installer Build Script
scripts/build_installers.py
New script that bundles CLI into single-file executables using PyInstaller and generates platform-specific installers: macOS .pkg with pkgbuild and postinstall script, Windows .exe with embedded Python installer entry script. Supports --platform selection and version parsing from pyproject.toml.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

The review spans heterogeneous changes across infrastructure, documentation, and platform-specific logic. The cross-platform path handling in OpenBeatCommon.lua and the intricate PyInstaller integration in build_installers.py require careful verification of Windows/macOS-specific behaviors and command construction patterns.

Poem

🐰 From source to bundles, we now can fly,
With installers ready for both Mac and Windows nigh,
PyInstaller hops and packages with care,
Cross-platform paths resolved everywhere,
One push, one workflow, distribution is here! 🚀


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

@chatgpt-codex-connectorchatgpt-codex-connectorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit:5be008df0b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".



def build_cli_binary(python_bin: str = "python") -> Path:
return pyinstaller_binary("openbeat", ROOT / "openbeat" / "cli.py", python_bin=python_bin)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bundle CLI using a module entry point

build_cli_binary() passes openbeat/cli.py as a file entry script, but that file relies on package-relative imports (from .analysis ...) and does not run as a standalone script (e.g. python openbeat/cli.py raises ImportError). Because PyInstaller one-file apps execute that entry as __main__, the bundled openbeat binary produced by this path is likely to fail at startup before any subcommand runs.

Useful? React with 👍 / 👎.

local function command_prefix()
local bin = python_bin()
local lowered = string.lower(bin)
if lowered:match("python%.exe$") or lowered:match("python$") then

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Treat python3 fallback as a Python interpreter

When no local config or .venv interpreter is found, python_bin() returns python3, but command_prefix() only appends -m openbeat.cli for names ending in python/python.exe. In that fallback path the generated command becomes "python3" analyze ... (missing module invocation), so OpenBeat commands fail immediately on systems using the fallback interpreter.

Useful? React with 👍 / 👎.


def main() -> int:
parser = argparse.ArgumentParser(description="Build OpenBeat single-file installers")
parser.add_argument("--platform", choices=["macos", "windows", "all"], default="all")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Default installer builds to host platform only

The CLI defaults --platform to all, which unconditionally runs both platform builders on a single host. That makes local builds fail in normal environments (e.g., non-macOS hosts cannot run pkgbuild, and non-Windows hosts will not produce dist/openbeat-installer.exe, triggering the FileNotFoundError path), so the default behavior is broken unless users manually override it.

Useful? React with 👍 / 👎.

@eimexdev

Copy link
Copy Markdown
OwnerAuthor

Closing this as superseded by the current main branch and the merged release-hardening work in #6. Main now has installer build tooling, the artifact-safe workflow updates, Windows/runtime fixes, and the focused test coverage from the newer release-prep branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@eimexdev