Skip to content

chore: add build:bin and install:bin scripts - #42

Closed
jfoshee wants to merge 3 commits into
mainfrom
jfoshee/add-bun-install-bin-script
Closed

chore: add build:bin and install:bin scripts#42
jfoshee wants to merge 3 commits into
mainfrom
jfoshee/add-bun-install-bin-script

Conversation

@jfoshee

@jfoshee jfoshee commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

to simplify local testing / installation

so you can pull down the repo and just run:

bun i
bun install:bin

and it copies the clerk binary to ~/.local/bin.

It also updates the user's PATH without asking for their permission...

Summary by CodeRabbit

  • New Features
    • Standalone binary build and installation capabilities have been added for command-line tool distribution and usage
    • Installation script automatically detects your shell, updates the appropriate startup configuration files, and configures your PATH environment to make the command immediately accessible from any terminal session

@wyattjoh

Copy link
Copy Markdown
Contributor

This might be superseded by the #31 which adds this as well

@coderabbitai

coderabbitai Bot commented Mar 20, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This change adds support for distributing a standalone binary. Two npm scripts are added to package.json: build:bin compiles ./src/cli.ts into ./dist/clerk, and install:bin executes an installer script. A new scripts/install-bin.sh Bash script is created that builds the binary, installs it to ~/.local/bin/clerk, and configures the user's shell environment by updating startup files with appropriate PATH configuration for different shells (fish or POSIX-compatible shells).

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The pull request title accurately and concisely summarizes the main changes: adding build:bin and install:bin scripts to package.json and scripts directory.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


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

Tip

CodeRabbit can use oxc to improve the quality of JavaScript and TypeScript code reviews.

Add a configuration file to your project to customize how CodeRabbit runs oxc.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@package.json`:
- Around line 11-17: Add tests covering the new binary install flow: create
tests that invoke the "build:bin" and "install:bin" scripts (or call
scripts/install-bin.sh) to verify the produced binary is placed at the expected
target path and that PATH manipulation behavior (e.g., symlink creation, PATH
export, or failure modes) behaves correctly; add these tests under the existing
test suite (using the same test runner invoked by "test": "bun test") and
include cleanup steps to remove artifacts. Specifically, add a test file (e.g.,
tests/install-bin.test.*) that runs the build step (or a mocked build), runs
scripts/install-bin.sh, asserts the binary exists at the intended location and
has executable permissions, and asserts any PATH-related side effects (or mocks
environment updates) and error handling; ensure tests are deterministic by using
a temporary directory and restoring the PATH/env afterward.

In `@scripts/install-bin.sh`:
- Around line 27-35: path_snippet_present currently returns true if any of
several different shell RC files contains ".local/bin" or the MARKER, which can
skip adding the PATH snippet for the user's actual shell; update it to detect
the user's active shell (use $SHELL or fallback to $0) and only inspect that
shell's relevant RC file(s) (e.g., for bash: .bashrc/.bash_profile, for zsh:
.zshrc, for fish: config.fish), then return true only if the MARKER or
".local/bin" is present in the detected shell's RC file(s); reference the
function path_snippet_present and constant MARKER when making the change so
other callers still work as before.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 26330c3d-fb42-45b1-8540-2da398eff05f

📥 Commits

Reviewing files that changed from the base of the PR and between e470329 and 8a7ae99.

📒 Files selected for processing (2)
  • package.json
  • scripts/install-bin.sh

Comment thread package.json
Comment on lines +11 to +17
"build:bin": "bun build ./src/cli.ts --compile --outfile ./dist/clerk --external @napi-rs/keyring",
"dev": "bun run ./src/cli.ts",
"test": "bun test",
"lint": "oxlint src/",
"format": "oxfmt --write src/",
"format:check": "oxfmt --check src/",
"install:bin": "bash scripts/install-bin.sh",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Missing test coverage for new install path (build:bin / install:bin).

Please add tests for the new binary-install flow (at minimum: verifies binary placement and PATH config behavior).

As per coding guidelines, "If there are no tests added or modified as part of the PR, please suggest that tests be added to cover the changes."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@package.json` around lines 11 - 17, Add tests covering the new binary install
flow: create tests that invoke the "build:bin" and "install:bin" scripts (or
call scripts/install-bin.sh) to verify the produced binary is placed at the
expected target path and that PATH manipulation behavior (e.g., symlink
creation, PATH export, or failure modes) behaves correctly; add these tests
under the existing test suite (using the same test runner invoked by "test":
"bun test") and include cleanup steps to remove artifacts. Specifically, add a
test file (e.g., tests/install-bin.test.*) that runs the build step (or a mocked
build), runs scripts/install-bin.sh, asserts the binary exists at the intended
location and has executable permissions, and asserts any PATH-related side
effects (or mocks environment updates) and error handling; ensure tests are
deterministic by using a temporary directory and restoring the PATH/env
afterward.

Comment thread scripts/install-bin.sh
Comment on lines +27 to +35
path_snippet_present() {
local f
for f in "${HOME}/.config/fish/config.fish" "${HOME}/.zshrc" "${HOME}/.bash_profile" "${HOME}/.bashrc" "${HOME}/.profile"; do
[[ -f "${f}" ]] || continue
grep -qF "${MARKER}" "${f}" && return 0
grep -qF ".local/bin" "${f}" && return 0
done
return 1
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Cross-shell PATH detection can skip required shell config update (runtime install break).

At Line 73, path_snippet_present returns true if any rc file has .local/bin (Lines 29-33), so the script may skip writing the snippet for the user’s actual shell rc file. Result: clerk may not be on PATH in new sessions for that shell.

Proposed fix
-path_snippet_present() {
-  local f
-  for f in "${HOME}/.config/fish/config.fish" "${HOME}/.zshrc" "${HOME}/.bash_profile" "${HOME}/.bashrc" "${HOME}/.profile"; do
-    [[ -f "${f}" ]] || continue
-    grep -qF "${MARKER}" "${f}" && return 0
-    grep -qF ".local/bin" "${f}" && return 0
-  done
-  return 1
-}
+path_snippet_present() {
+  local f="$1"
+  [[ -f "${f}" ]] || return 1
+  grep -qF "${MARKER}" "${f}" && return 0
+  grep -qF ".local/bin" "${f}" && return 0
+  return 1
+}
@@
-added_path_to_rc=false
-rc=""
-if path_snippet_present; then
+added_path_to_rc=false
+rc="$(pick_shell_config)"
+if path_snippet_present "${rc}"; then
   :
 else
-  rc="$(pick_shell_config)"
   append_path_snippet "${rc}"
   added_path_to_rc=true
 fi

Also applies to: 73-79

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@scripts/install-bin.sh` around lines 27 - 35, path_snippet_present currently
returns true if any of several different shell RC files contains ".local/bin" or
the MARKER, which can skip adding the PATH snippet for the user's actual shell;
update it to detect the user's active shell (use $SHELL or fallback to $0) and
only inspect that shell's relevant RC file(s) (e.g., for bash:
.bashrc/.bash_profile, for zsh: .zshrc, for fish: config.fish), then return true
only if the MARKER or ".local/bin" is present in the detected shell's RC
file(s); reference the function path_snippet_present and constant MARKER when
making the change so other callers still work as before.

@jfoshee

jfoshee commented Mar 20, 2026

Copy link
Copy Markdown
Contributor Author

This might be superseded by the #31 which adds this as well

ah ok @wyattjoh, that is a pretty big PR. Can we take this small one and then stomp on it when that is merged? wdyt?

@jfoshee

jfoshee commented Mar 20, 2026

Copy link
Copy Markdown
Contributor Author

Closing this one as superseded by @wyattjoh's work which adds a build:compile target. I'll open another PR with the install local script.

@jfoshee jfoshee closed this Mar 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants