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

@jfosheejfoshee 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

coderabbitaiBot 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 nameStatusExplanation
Title check✅ PassedThe 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✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Description Check✅ PassedCheck 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.

@coderabbitaicoderabbitaiBot 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 threadpackage.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 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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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.

@jfosheejfoshee closed this Mar 20, 2026
Sign up for freeto 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

@jfoshee@wyattjoh
, '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

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

@jfosheejfoshee 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

coderabbitaiBot 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 nameStatusExplanation
Title check✅ PassedThe 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✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Description Check✅ PassedCheck 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.

@coderabbitaicoderabbitaiBot 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 threadpackage.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 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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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.

@jfosheejfoshee closed this Mar 20, 2026
Sign up for freeto 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

@jfoshee@wyattjoh
, '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

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

@jfosheejfoshee 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

coderabbitaiBot 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 nameStatusExplanation
Title check✅ PassedThe 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✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Description Check✅ PassedCheck 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.

@coderabbitaicoderabbitaiBot 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 threadpackage.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 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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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.

@jfosheejfoshee closed this Mar 20, 2026
Sign up for freeto 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

@jfoshee@wyattjoh
, '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

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

@jfosheejfoshee 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

coderabbitaiBot 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 nameStatusExplanation
Title check✅ PassedThe 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✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Description Check✅ PassedCheck 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.

@coderabbitaicoderabbitaiBot 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 threadpackage.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 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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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.

@jfosheejfoshee closed this Mar 20, 2026
Sign up for freeto 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

@jfoshee@wyattjoh
, '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

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

@jfosheejfoshee 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

coderabbitaiBot 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 nameStatusExplanation
Title check✅ PassedThe 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✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Description Check✅ PassedCheck 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.

@coderabbitaicoderabbitaiBot 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 threadpackage.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 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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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.

@jfosheejfoshee closed this Mar 20, 2026
Sign up for freeto 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

@jfoshee@wyattjoh
, '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

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

@jfosheejfoshee 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

coderabbitaiBot 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 nameStatusExplanation
Title check✅ PassedThe 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✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Description Check✅ PassedCheck 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.

@coderabbitaicoderabbitaiBot 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 threadpackage.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 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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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.

@jfosheejfoshee closed this Mar 20, 2026
Sign up for freeto 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

@jfoshee@wyattjoh
, '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

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

@jfosheejfoshee 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

coderabbitaiBot 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 nameStatusExplanation
Title check✅ PassedThe 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✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Description Check✅ PassedCheck 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.

@coderabbitaicoderabbitaiBot 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 threadpackage.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 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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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.

@jfosheejfoshee closed this Mar 20, 2026
Sign up for freeto 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

@jfoshee@wyattjoh
, '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

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

@jfosheejfoshee 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

coderabbitaiBot 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 nameStatusExplanation
Title check✅ PassedThe 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✅ PassedDocstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Description Check✅ PassedCheck 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.

@coderabbitaicoderabbitaiBot 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 threadpackage.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 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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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.

@jfosheejfoshee closed this Mar 20, 2026
Sign up for freeto 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

@jfoshee@wyattjoh