Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,11 +8,13 @@
"type": "module",
"scripts": {
"build": "bun build ./src/cli.ts --outfile ./dist/cli.js --target node --external @napi-rs/keyring",
"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",
Comment on lines +11 to +17

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.

"prepare": "git config core.hooksPath .hooks"
},
"dependencies": {
Expand Down
89 changes: 89 additions & 0 deletions scripts/install-bin.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
#!/usr/bin/env bash
# Exit on error, catch unset variables, and fail a pipeline if any step fails.
set -euo pipefail

# Resolve this file’s directory, then the repo root, and run subsequent commands from there.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
cd "${REPO_ROOT}"

# User-level bin dir
LOCAL_BIN="${HOME}/.local/bin"

# Marker (comment) in user profile for auto-updating the PATH
MARKER="# clerk-cli: ~/.local/bin on PATH"

# Compile the standalone binary, ensure the bin directory exists, then copy the binary into place.
bun run build:bin
mkdir -p "${LOCAL_BIN}"
install -m 755 "${REPO_ROOT}/dist/clerk" "${LOCAL_BIN}/clerk"

# Login shell name (used to pick config file and fish vs POSIX syntax).
shell_name() {
basename "${SHELL:-/bin/zsh}"
}

# Return true if we (or the user) already wired ~/.local/bin into shell startup files.
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
}
Comment on lines +27 to +35

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.


# Pick the startup file for the user’s login shell (fish, zsh, bash, or POSIX fallback).
pick_shell_config() {
case "$(shell_name)" in
fish) echo "${HOME}/.config/fish/config.fish" ;;
zsh) echo "${HOME}/.zshrc" ;;
bash) echo "${HOME}/.bash_profile" ;;
*) echo "${HOME}/.profile" ;;
esac
}

# Append a PATH snippet: fish uses fish_add_path; other shells use a POSIX export.
append_path_snippet() {
local config="$1"
mkdir -p "$(dirname "${config}")"
case "$(shell_name)" in
fish)
{
echo ""
echo "${MARKER}"
# fish_add_path is built into fish 3.2+ and updates PATH for new sessions.
echo "fish_add_path \$HOME/.local/bin"
} >>"${config}"
;;
*)
{
echo ""
echo "${MARKER}"
echo "export PATH=\"\${HOME}/.local/bin:\${PATH}\""
} >>"${config}"
;;
esac
}

# Append PATH setup only when it isn’t already covered in the usual shell startup files.
added_path_to_rc=false
rc=""
if path_snippet_present; then
:
else
rc="$(pick_shell_config)"
append_path_snippet "${rc}"
added_path_to_rc=true
fi

# Friendly recap of what ran (always runs after a successful install).
echo ""
echo "Installation complete."
echo " • Built the standalone clerk binary"
echo " • Copied it to ${LOCAL_BIN}/clerk"
if [[ "${added_path_to_rc}" == true ]]; then
echo " • Added ~/.local/bin to your PATH via ${rc} (new terminals will pick this up automatically)."
echo " • To reload your PATH in this terminal, run: source ${rc}"
fi
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,11 +8,13 @@
"type": "module",
"scripts": {
"build": "bun build ./src/cli.ts --outfile ./dist/cli.js --target node --external @napi-rs/keyring",
"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",
Comment on lines +11 to +17

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.

"prepare": "git config core.hooksPath .hooks"
},
"dependencies": {
Expand Down
89 changes: 89 additions & 0 deletions scripts/install-bin.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
#!/usr/bin/env bash
# Exit on error, catch unset variables, and fail a pipeline if any step fails.
set -euo pipefail

# Resolve this file’s directory, then the repo root, and run subsequent commands from there.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
cd "${REPO_ROOT}"

# User-level bin dir
LOCAL_BIN="${HOME}/.local/bin"

# Marker (comment) in user profile for auto-updating the PATH
MARKER="# clerk-cli: ~/.local/bin on PATH"

# Compile the standalone binary, ensure the bin directory exists, then copy the binary into place.
bun run build:bin
mkdir -p "${LOCAL_BIN}"
install -m 755 "${REPO_ROOT}/dist/clerk" "${LOCAL_BIN}/clerk"

# Login shell name (used to pick config file and fish vs POSIX syntax).
shell_name() {
basename "${SHELL:-/bin/zsh}"
}

# Return true if we (or the user) already wired ~/.local/bin into shell startup files.
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
}
Comment on lines +27 to +35

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.


# Pick the startup file for the user’s login shell (fish, zsh, bash, or POSIX fallback).
pick_shell_config() {
case "$(shell_name)" in
fish) echo "${HOME}/.config/fish/config.fish" ;;
zsh) echo "${HOME}/.zshrc" ;;
bash) echo "${HOME}/.bash_profile" ;;
*) echo "${HOME}/.profile" ;;
esac
}

# Append a PATH snippet: fish uses fish_add_path; other shells use a POSIX export.
append_path_snippet() {
local config="$1"
mkdir -p "$(dirname "${config}")"
case "$(shell_name)" in
fish)
{
echo ""
echo "${MARKER}"
# fish_add_path is built into fish 3.2+ and updates PATH for new sessions.
echo "fish_add_path \$HOME/.local/bin"
} >>"${config}"
;;
*)
{
echo ""
echo "${MARKER}"
echo "export PATH=\"\${HOME}/.local/bin:\${PATH}\""
} >>"${config}"
;;
esac
}

# Append PATH setup only when it isn’t already covered in the usual shell startup files.
added_path_to_rc=false
rc=""
if path_snippet_present; then
:
else
rc="$(pick_shell_config)"
append_path_snippet "${rc}"
added_path_to_rc=true
fi

# Friendly recap of what ran (always runs after a successful install).
echo ""
echo "Installation complete."
echo " • Built the standalone clerk binary"
echo " • Copied it to ${LOCAL_BIN}/clerk"
if [[ "${added_path_to_rc}" == true ]]; then
echo " • Added ~/.local/bin to your PATH via ${rc} (new terminals will pick this up automatically)."
echo " • To reload your PATH in this terminal, run: source ${rc}"
fi
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,11 +8,13 @@
"type": "module",
"scripts": {
"build": "bun build ./src/cli.ts --outfile ./dist/cli.js --target node --external @napi-rs/keyring",
"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",
Comment on lines +11 to +17

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.

"prepare": "git config core.hooksPath .hooks"
},
"dependencies": {
Expand Down
89 changes: 89 additions & 0 deletions scripts/install-bin.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
#!/usr/bin/env bash
# Exit on error, catch unset variables, and fail a pipeline if any step fails.
set -euo pipefail

# Resolve this file’s directory, then the repo root, and run subsequent commands from there.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
cd "${REPO_ROOT}"

# User-level bin dir
LOCAL_BIN="${HOME}/.local/bin"

# Marker (comment) in user profile for auto-updating the PATH
MARKER="# clerk-cli: ~/.local/bin on PATH"

# Compile the standalone binary, ensure the bin directory exists, then copy the binary into place.
bun run build:bin
mkdir -p "${LOCAL_BIN}"
install -m 755 "${REPO_ROOT}/dist/clerk" "${LOCAL_BIN}/clerk"

# Login shell name (used to pick config file and fish vs POSIX syntax).
shell_name() {
basename "${SHELL:-/bin/zsh}"
}

# Return true if we (or the user) already wired ~/.local/bin into shell startup files.
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
}
Comment on lines +27 to +35

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.


# Pick the startup file for the user’s login shell (fish, zsh, bash, or POSIX fallback).
pick_shell_config() {
case "$(shell_name)" in
fish) echo "${HOME}/.config/fish/config.fish" ;;
zsh) echo "${HOME}/.zshrc" ;;
bash) echo "${HOME}/.bash_profile" ;;
*) echo "${HOME}/.profile" ;;
esac
}

# Append a PATH snippet: fish uses fish_add_path; other shells use a POSIX export.
append_path_snippet() {
local config="$1"
mkdir -p "$(dirname "${config}")"
case "$(shell_name)" in
fish)
{
echo ""
echo "${MARKER}"
# fish_add_path is built into fish 3.2+ and updates PATH for new sessions.
echo "fish_add_path \$HOME/.local/bin"
} >>"${config}"
;;
*)
{
echo ""
echo "${MARKER}"
echo "export PATH=\"\${HOME}/.local/bin:\${PATH}\""
} >>"${config}"
;;
esac
}

# Append PATH setup only when it isn’t already covered in the usual shell startup files.
added_path_to_rc=false
rc=""
if path_snippet_present; then
:
else
rc="$(pick_shell_config)"
append_path_snippet "${rc}"
added_path_to_rc=true
fi

# Friendly recap of what ran (always runs after a successful install).
echo ""
echo "Installation complete."
echo " • Built the standalone clerk binary"
echo " • Copied it to ${LOCAL_BIN}/clerk"
if [[ "${added_path_to_rc}" == true ]]; then
echo " • Added ~/.local/bin to your PATH via ${rc} (new terminals will pick this up automatically)."
echo " • To reload your PATH in this terminal, run: source ${rc}"
fi
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,11 +8,13 @@
"type": "module",
"scripts": {
"build": "bun build ./src/cli.ts --outfile ./dist/cli.js --target node --external @napi-rs/keyring",
"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",
Comment on lines +11 to +17

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.

"prepare": "git config core.hooksPath .hooks"
},
"dependencies": {
Expand Down
89 changes: 89 additions & 0 deletions scripts/install-bin.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
#!/usr/bin/env bash
# Exit on error, catch unset variables, and fail a pipeline if any step fails.
set -euo pipefail

# Resolve this file’s directory, then the repo root, and run subsequent commands from there.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
cd "${REPO_ROOT}"

# User-level bin dir
LOCAL_BIN="${HOME}/.local/bin"

# Marker (comment) in user profile for auto-updating the PATH
MARKER="# clerk-cli: ~/.local/bin on PATH"

# Compile the standalone binary, ensure the bin directory exists, then copy the binary into place.
bun run build:bin
mkdir -p "${LOCAL_BIN}"
install -m 755 "${REPO_ROOT}/dist/clerk" "${LOCAL_BIN}/clerk"

# Login shell name (used to pick config file and fish vs POSIX syntax).
shell_name() {
basename "${SHELL:-/bin/zsh}"
}

# Return true if we (or the user) already wired ~/.local/bin into shell startup files.
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
}
Comment on lines +27 to +35

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.


# Pick the startup file for the user’s login shell (fish, zsh, bash, or POSIX fallback).
pick_shell_config() {
case "$(shell_name)" in
fish) echo "${HOME}/.config/fish/config.fish" ;;
zsh) echo "${HOME}/.zshrc" ;;
bash) echo "${HOME}/.bash_profile" ;;
*) echo "${HOME}/.profile" ;;
esac
}

# Append a PATH snippet: fish uses fish_add_path; other shells use a POSIX export.
append_path_snippet() {
local config="$1"
mkdir -p "$(dirname "${config}")"
case "$(shell_name)" in
fish)
{
echo ""
echo "${MARKER}"
# fish_add_path is built into fish 3.2+ and updates PATH for new sessions.
echo "fish_add_path \$HOME/.local/bin"
} >>"${config}"
;;
*)
{
echo ""
echo "${MARKER}"
echo "export PATH=\"\${HOME}/.local/bin:\${PATH}\""
} >>"${config}"
;;
esac
}

# Append PATH setup only when it isn’t already covered in the usual shell startup files.
added_path_to_rc=false
rc=""
if path_snippet_present; then
:
else
rc="$(pick_shell_config)"
append_path_snippet "${rc}"
added_path_to_rc=true
fi

# Friendly recap of what ran (always runs after a successful install).
echo ""
echo "Installation complete."
echo " • Built the standalone clerk binary"
echo " • Copied it to ${LOCAL_BIN}/clerk"
if [[ "${added_path_to_rc}" == true ]]; then
echo " • Added ~/.local/bin to your PATH via ${rc} (new terminals will pick this up automatically)."
echo " • To reload your PATH in this terminal, run: source ${rc}"
fi
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,11 +8,13 @@
"type": "module",
"scripts": {
"build": "bun build ./src/cli.ts --outfile ./dist/cli.js --target node --external @napi-rs/keyring",
"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",
Comment on lines +11 to +17

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.

"prepare": "git config core.hooksPath .hooks"
},
"dependencies": {
Expand Down
89 changes: 89 additions & 0 deletions scripts/install-bin.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
#!/usr/bin/env bash
# Exit on error, catch unset variables, and fail a pipeline if any step fails.
set -euo pipefail

# Resolve this file’s directory, then the repo root, and run subsequent commands from there.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
cd "${REPO_ROOT}"

# User-level bin dir
LOCAL_BIN="${HOME}/.local/bin"

# Marker (comment) in user profile for auto-updating the PATH
MARKER="# clerk-cli: ~/.local/bin on PATH"

# Compile the standalone binary, ensure the bin directory exists, then copy the binary into place.
bun run build:bin
mkdir -p "${LOCAL_BIN}"
install -m 755 "${REPO_ROOT}/dist/clerk" "${LOCAL_BIN}/clerk"

# Login shell name (used to pick config file and fish vs POSIX syntax).
shell_name() {
basename "${SHELL:-/bin/zsh}"
}

# Return true if we (or the user) already wired ~/.local/bin into shell startup files.
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
}
Comment on lines +27 to +35

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.


# Pick the startup file for the user’s login shell (fish, zsh, bash, or POSIX fallback).
pick_shell_config() {
case "$(shell_name)" in
fish) echo "${HOME}/.config/fish/config.fish" ;;
zsh) echo "${HOME}/.zshrc" ;;
bash) echo "${HOME}/.bash_profile" ;;
*) echo "${HOME}/.profile" ;;
esac
}

# Append a PATH snippet: fish uses fish_add_path; other shells use a POSIX export.
append_path_snippet() {
local config="$1"
mkdir -p "$(dirname "${config}")"
case "$(shell_name)" in
fish)
{
echo ""
echo "${MARKER}"
# fish_add_path is built into fish 3.2+ and updates PATH for new sessions.
echo "fish_add_path \$HOME/.local/bin"
} >>"${config}"
;;
*)
{
echo ""
echo "${MARKER}"
echo "export PATH=\"\${HOME}/.local/bin:\${PATH}\""
} >>"${config}"
;;
esac
}

# Append PATH setup only when it isn’t already covered in the usual shell startup files.
added_path_to_rc=false
rc=""
if path_snippet_present; then
:
else
rc="$(pick_shell_config)"
append_path_snippet "${rc}"
added_path_to_rc=true
fi

# Friendly recap of what ran (always runs after a successful install).
echo ""
echo "Installation complete."
echo " • Built the standalone clerk binary"
echo " • Copied it to ${LOCAL_BIN}/clerk"
if [[ "${added_path_to_rc}" == true ]]; then
echo " • Added ~/.local/bin to your PATH via ${rc} (new terminals will pick this up automatically)."
echo " • To reload your PATH in this terminal, run: source ${rc}"
fi
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,11 +8,13 @@
"type": "module",
"scripts": {
"build": "bun build ./src/cli.ts --outfile ./dist/cli.js --target node --external @napi-rs/keyring",
"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",
Comment on lines +11 to +17

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.

"prepare": "git config core.hooksPath .hooks"
},
"dependencies": {
Expand Down
89 changes: 89 additions & 0 deletions scripts/install-bin.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
#!/usr/bin/env bash
# Exit on error, catch unset variables, and fail a pipeline if any step fails.
set -euo pipefail

# Resolve this file’s directory, then the repo root, and run subsequent commands from there.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
cd "${REPO_ROOT}"

# User-level bin dir
LOCAL_BIN="${HOME}/.local/bin"

# Marker (comment) in user profile for auto-updating the PATH
MARKER="# clerk-cli: ~/.local/bin on PATH"

# Compile the standalone binary, ensure the bin directory exists, then copy the binary into place.
bun run build:bin
mkdir -p "${LOCAL_BIN}"
install -m 755 "${REPO_ROOT}/dist/clerk" "${LOCAL_BIN}/clerk"

# Login shell name (used to pick config file and fish vs POSIX syntax).
shell_name() {
basename "${SHELL:-/bin/zsh}"
}

# Return true if we (or the user) already wired ~/.local/bin into shell startup files.
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
}
Comment on lines +27 to +35

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.


# Pick the startup file for the user’s login shell (fish, zsh, bash, or POSIX fallback).
pick_shell_config() {
case "$(shell_name)" in
fish) echo "${HOME}/.config/fish/config.fish" ;;
zsh) echo "${HOME}/.zshrc" ;;
bash) echo "${HOME}/.bash_profile" ;;
*) echo "${HOME}/.profile" ;;
esac
}

# Append a PATH snippet: fish uses fish_add_path; other shells use a POSIX export.
append_path_snippet() {
local config="$1"
mkdir -p "$(dirname "${config}")"
case "$(shell_name)" in
fish)
{
echo ""
echo "${MARKER}"
# fish_add_path is built into fish 3.2+ and updates PATH for new sessions.
echo "fish_add_path \$HOME/.local/bin"
} >>"${config}"
;;
*)
{
echo ""
echo "${MARKER}"
echo "export PATH=\"\${HOME}/.local/bin:\${PATH}\""
} >>"${config}"
;;
esac
}

# Append PATH setup only when it isn’t already covered in the usual shell startup files.
added_path_to_rc=false
rc=""
if path_snippet_present; then
:
else
rc="$(pick_shell_config)"
append_path_snippet "${rc}"
added_path_to_rc=true
fi

# Friendly recap of what ran (always runs after a successful install).
echo ""
echo "Installation complete."
echo " • Built the standalone clerk binary"
echo " • Copied it to ${LOCAL_BIN}/clerk"
if [[ "${added_path_to_rc}" == true ]]; then
echo " • Added ~/.local/bin to your PATH via ${rc} (new terminals will pick this up automatically)."
echo " • To reload your PATH in this terminal, run: source ${rc}"
fi
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,11 +8,13 @@
"type": "module",
"scripts": {
"build": "bun build ./src/cli.ts --outfile ./dist/cli.js --target node --external @napi-rs/keyring",
"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",
Comment on lines +11 to +17

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.

"prepare": "git config core.hooksPath .hooks"
},
"dependencies": {
Expand Down
89 changes: 89 additions & 0 deletions scripts/install-bin.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
#!/usr/bin/env bash
# Exit on error, catch unset variables, and fail a pipeline if any step fails.
set -euo pipefail

# Resolve this file’s directory, then the repo root, and run subsequent commands from there.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
cd "${REPO_ROOT}"

# User-level bin dir
LOCAL_BIN="${HOME}/.local/bin"

# Marker (comment) in user profile for auto-updating the PATH
MARKER="# clerk-cli: ~/.local/bin on PATH"

# Compile the standalone binary, ensure the bin directory exists, then copy the binary into place.
bun run build:bin
mkdir -p "${LOCAL_BIN}"
install -m 755 "${REPO_ROOT}/dist/clerk" "${LOCAL_BIN}/clerk"

# Login shell name (used to pick config file and fish vs POSIX syntax).
shell_name() {
basename "${SHELL:-/bin/zsh}"
}

# Return true if we (or the user) already wired ~/.local/bin into shell startup files.
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
}
Comment on lines +27 to +35

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.


# Pick the startup file for the user’s login shell (fish, zsh, bash, or POSIX fallback).
pick_shell_config() {
case "$(shell_name)" in
fish) echo "${HOME}/.config/fish/config.fish" ;;
zsh) echo "${HOME}/.zshrc" ;;
bash) echo "${HOME}/.bash_profile" ;;
*) echo "${HOME}/.profile" ;;
esac
}

# Append a PATH snippet: fish uses fish_add_path; other shells use a POSIX export.
append_path_snippet() {
local config="$1"
mkdir -p "$(dirname "${config}")"
case "$(shell_name)" in
fish)
{
echo ""
echo "${MARKER}"
# fish_add_path is built into fish 3.2+ and updates PATH for new sessions.
echo "fish_add_path \$HOME/.local/bin"
} >>"${config}"
;;
*)
{
echo ""
echo "${MARKER}"
echo "export PATH=\"\${HOME}/.local/bin:\${PATH}\""
} >>"${config}"
;;
esac
}

# Append PATH setup only when it isn’t already covered in the usual shell startup files.
added_path_to_rc=false
rc=""
if path_snippet_present; then
:
else
rc="$(pick_shell_config)"
append_path_snippet "${rc}"
added_path_to_rc=true
fi

# Friendly recap of what ran (always runs after a successful install).
echo ""
echo "Installation complete."
echo " • Built the standalone clerk binary"
echo " • Copied it to ${LOCAL_BIN}/clerk"
if [[ "${added_path_to_rc}" == true ]]; then
echo " • Added ~/.local/bin to your PATH via ${rc} (new terminals will pick this up automatically)."
echo " • To reload your PATH in this terminal, run: source ${rc}"
fi
Loading
, '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
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,11 +8,13 @@
"type": "module",
"scripts": {
"build": "bun build ./src/cli.ts --outfile ./dist/cli.js --target node --external @napi-rs/keyring",
"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",
Comment on lines +11 to +17

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.

"prepare": "git config core.hooksPath .hooks"
},
"dependencies": {
Expand Down
89 changes: 89 additions & 0 deletions scripts/install-bin.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
#!/usr/bin/env bash
# Exit on error, catch unset variables, and fail a pipeline if any step fails.
set -euo pipefail

# Resolve this file’s directory, then the repo root, and run subsequent commands from there.
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
cd "${REPO_ROOT}"

# User-level bin dir
LOCAL_BIN="${HOME}/.local/bin"

# Marker (comment) in user profile for auto-updating the PATH
MARKER="# clerk-cli: ~/.local/bin on PATH"

# Compile the standalone binary, ensure the bin directory exists, then copy the binary into place.
bun run build:bin
mkdir -p "${LOCAL_BIN}"
install -m 755 "${REPO_ROOT}/dist/clerk" "${LOCAL_BIN}/clerk"

# Login shell name (used to pick config file and fish vs POSIX syntax).
shell_name() {
basename "${SHELL:-/bin/zsh}"
}

# Return true if we (or the user) already wired ~/.local/bin into shell startup files.
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
}
Comment on lines +27 to +35

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.


# Pick the startup file for the user’s login shell (fish, zsh, bash, or POSIX fallback).
pick_shell_config() {
case "$(shell_name)" in
fish) echo "${HOME}/.config/fish/config.fish" ;;
zsh) echo "${HOME}/.zshrc" ;;
bash) echo "${HOME}/.bash_profile" ;;
*) echo "${HOME}/.profile" ;;
esac
}

# Append a PATH snippet: fish uses fish_add_path; other shells use a POSIX export.
append_path_snippet() {
local config="$1"
mkdir -p "$(dirname "${config}")"
case "$(shell_name)" in
fish)
{
echo ""
echo "${MARKER}"
# fish_add_path is built into fish 3.2+ and updates PATH for new sessions.
echo "fish_add_path \$HOME/.local/bin"
} >>"${config}"
;;
*)
{
echo ""
echo "${MARKER}"
echo "export PATH=\"\${HOME}/.local/bin:\${PATH}\""
} >>"${config}"
;;
esac
}

# Append PATH setup only when it isn’t already covered in the usual shell startup files.
added_path_to_rc=false
rc=""
if path_snippet_present; then
:
else
rc="$(pick_shell_config)"
append_path_snippet "${rc}"
added_path_to_rc=true
fi

# Friendly recap of what ran (always runs after a successful install).
echo ""
echo "Installation complete."
echo " • Built the standalone clerk binary"
echo " • Copied it to ${LOCAL_BIN}/clerk"
if [[ "${added_path_to_rc}" == true ]]; then
echo " • Added ~/.local/bin to your PATH via ${rc} (new terminals will pick this up automatically)."
echo " • To reload your PATH in this terminal, run: source ${rc}"
fi
Loading