mirror of
https://github.com/dtzp555-max/ocp.git
synced 2026-07-23 05:55:09 +00:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4ea2705012 |
+13
-3
@@ -582,11 +582,19 @@ print(k if k else '')
|
|||||||
if [[ "${SHELL:-}" == */fish ]]; then
|
if [[ "${SHELL:-}" == */fish ]]; then
|
||||||
echo " Note: fish shell detected. Writing to ~/.bashrc — add to fish config manually."
|
echo " Note: fish shell detected. Writing to ~/.bashrc — add to fish config manually."
|
||||||
rc_files+=("$HOME/.bashrc")
|
rc_files+=("$HOME/.bashrc")
|
||||||
|
elif $is_mac; then
|
||||||
|
# macOS: default shell since Catalina (2019) is zsh.
|
||||||
|
# Always write ~/.zshrc (create if absent — zsh tolerates an empty file).
|
||||||
|
# Only write ~/.bashrc if it already exists (don't surprise users with new files).
|
||||||
|
[[ -f "$HOME/.bashrc" ]] && rc_files+=("$HOME/.bashrc")
|
||||||
|
# zshrc: always include on macOS; create the file if it doesn't exist yet
|
||||||
|
[[ -f "$HOME/.zshrc" ]] || touch "$HOME/.zshrc"
|
||||||
|
rc_files+=("$HOME/.zshrc")
|
||||||
else
|
else
|
||||||
# Always write both on macOS (default shell is zsh but some tools source bashrc)
|
# Linux / other: write to whichever rc files already exist or match current shell
|
||||||
[[ -f "$HOME/.bashrc" || "${SHELL:-}" == */bash ]] && rc_files+=("$HOME/.bashrc")
|
[[ -f "$HOME/.bashrc" || "${SHELL:-}" == */bash ]] && rc_files+=("$HOME/.bashrc")
|
||||||
[[ -f "$HOME/.zshrc" || "${SHELL:-}" == */zsh ]] && rc_files+=("$HOME/.zshrc")
|
[[ -f "$HOME/.zshrc" || "${SHELL:-}" == */zsh ]] && rc_files+=("$HOME/.zshrc")
|
||||||
# If neither exists, create for current shell
|
# If neither exists, fall back to creating one for the current shell
|
||||||
[[ ${#rc_files[@]} -eq 0 ]] && rc_files+=("$HOME/.${SHELL##*/}rc")
|
[[ ${#rc_files[@]} -eq 0 ]] && rc_files+=("$HOME/.${SHELL##*/}rc")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -705,7 +713,9 @@ PYEOF
|
|||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo " Done. Reload your shell to apply:"
|
echo " Done. Reload your shell to apply:"
|
||||||
echo " source $rc_file"
|
for rc_file in "${rc_files[@]}"; do
|
||||||
|
echo " source $rc_file"
|
||||||
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
main "$@"
|
main "$@"
|
||||||
|
|||||||
+4
-48
@@ -30,7 +30,7 @@
|
|||||||
import { createServer } from "node:http";
|
import { createServer } from "node:http";
|
||||||
import { spawn, execFileSync } from "node:child_process";
|
import { spawn, execFileSync } from "node:child_process";
|
||||||
import { randomUUID, timingSafeEqual } from "node:crypto";
|
import { randomUUID, timingSafeEqual } from "node:crypto";
|
||||||
import { readFileSync, readdirSync, accessSync, existsSync, constants } from "node:fs";
|
import { readFileSync, accessSync, existsSync, constants } from "node:fs";
|
||||||
import { fileURLToPath } from "node:url";
|
import { fileURLToPath } from "node:url";
|
||||||
import { dirname, join } from "node:path";
|
import { dirname, join } from "node:path";
|
||||||
import { homedir } from "node:os";
|
import { homedir } from "node:os";
|
||||||
@@ -41,48 +41,8 @@ const _pkg = JSON.parse(readFileSync(join(__dirname, "package.json"), "utf8"));
|
|||||||
const modelsConfig = JSON.parse(readFileSync(join(__dirname, "models.json"), "utf8"));
|
const modelsConfig = JSON.parse(readFileSync(join(__dirname, "models.json"), "utf8"));
|
||||||
|
|
||||||
// ── Resolve claude binary ───────────────────────────────────────────────
|
// ── Resolve claude binary ───────────────────────────────────────────────
|
||||||
// Priority: CLAUDE_BIN env > well-known paths > nvm/fnm/asdf user-local
|
// Priority: CLAUDE_BIN env > well-known paths > which lookup
|
||||||
// installs > which lookup. Fail-fast if not found — never start with an
|
// Fail-fast if not found — never start with an unresolvable binary.
|
||||||
// unresolvable binary.
|
|
||||||
function _listVersionDirs(parent) {
|
|
||||||
try { return readdirSync(parent); } catch { return []; }
|
|
||||||
}
|
|
||||||
function _collectNodeManagerCandidates(home) {
|
|
||||||
if (!home) return [];
|
|
||||||
const out = [];
|
|
||||||
|
|
||||||
// nvm: $HOME/.nvm/versions/node/<version>/bin/claude
|
|
||||||
const nvmRoot = join(home, ".nvm/versions/node");
|
|
||||||
for (const v of _listVersionDirs(nvmRoot)) {
|
|
||||||
out.push(join(nvmRoot, v, "bin/claude"));
|
|
||||||
}
|
|
||||||
// nvm default alias: resolve $HOME/.nvm/aliases/default if it points to a version
|
|
||||||
try {
|
|
||||||
const aliasFile = join(home, ".nvm/aliases/default");
|
|
||||||
const aliasVer = readFileSync(aliasFile, "utf8").trim();
|
|
||||||
if (aliasVer) {
|
|
||||||
const direct = join(nvmRoot, aliasVer, "bin/claude");
|
|
||||||
if (!out.includes(direct)) out.unshift(direct);
|
|
||||||
}
|
|
||||||
} catch {}
|
|
||||||
|
|
||||||
// fnm: $HOME/.fnm/node-versions/<version>/installation/bin/claude
|
|
||||||
const fnmRoot = join(home, ".fnm/node-versions");
|
|
||||||
for (const v of _listVersionDirs(fnmRoot)) {
|
|
||||||
out.push(join(fnmRoot, v, "installation/bin/claude"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// asdf: $HOME/.asdf/installs/nodejs/<version>/bin/claude
|
|
||||||
const asdfRoot = join(home, ".asdf/installs/nodejs");
|
|
||||||
for (const v of _listVersionDirs(asdfRoot)) {
|
|
||||||
out.push(join(asdfRoot, v, "bin/claude"));
|
|
||||||
}
|
|
||||||
|
|
||||||
// npm prefix-relocated: $HOME/.npm-global/bin/claude
|
|
||||||
out.push(join(home, ".npm-global/bin/claude"));
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
function resolveClaude() {
|
function resolveClaude() {
|
||||||
if (process.env.CLAUDE_BIN) {
|
if (process.env.CLAUDE_BIN) {
|
||||||
try {
|
try {
|
||||||
@@ -94,13 +54,11 @@ function resolveClaude() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const home = process.env.HOME || "";
|
|
||||||
const candidates = [
|
const candidates = [
|
||||||
"/opt/homebrew/bin/claude",
|
"/opt/homebrew/bin/claude",
|
||||||
"/usr/local/bin/claude",
|
"/usr/local/bin/claude",
|
||||||
"/usr/bin/claude",
|
"/usr/bin/claude",
|
||||||
join(home, ".local/bin/claude"),
|
join(process.env.HOME || "", ".local/bin/claude"),
|
||||||
..._collectNodeManagerCandidates(home),
|
|
||||||
];
|
];
|
||||||
for (const p of candidates) {
|
for (const p of candidates) {
|
||||||
try { accessSync(p, constants.X_OK); console.warn(`[init] CLAUDE_BIN not set, resolved to ${p}`); return p; } catch {}
|
try { accessSync(p, constants.X_OK); console.warn(`[init] CLAUDE_BIN not set, resolved to ${p}`); return p; } catch {}
|
||||||
@@ -114,8 +72,6 @@ function resolveClaude() {
|
|||||||
console.error(
|
console.error(
|
||||||
"FATAL: claude binary not found.\n" +
|
"FATAL: claude binary not found.\n" +
|
||||||
" Set CLAUDE_BIN=/path/to/claude or ensure claude is in PATH.\n" +
|
" Set CLAUDE_BIN=/path/to/claude or ensure claude is in PATH.\n" +
|
||||||
" Hint: if you use nvm/fnm/asdf, set CLAUDE_BIN to the absolute path\n" +
|
|
||||||
" shown by `which claude` in your interactive shell.\n" +
|
|
||||||
" Checked: " + candidates.join(", ")
|
" Checked: " + candidates.join(", ")
|
||||||
);
|
);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
|
|||||||
Reference in New Issue
Block a user