theniceboy/zsh/functions/_cl_common.zsh
2026-02-03 17:20:41 -08:00

102 lines
3.1 KiB
Bash

_cl_run() {
local tag="$1"
shift
local base_home="${XDG_CONFIG_HOME:-$HOME/.config}/claude"
local opencode_home="${XDG_CONFIG_HOME:-$HOME/.config}/opencode"
setopt local_options null_glob
local -a extra_args=(--dangerously-skip-permissions --model opus)
# Build system prompt from AGENTS.md files
local system_prompt=""
if [ -f "$opencode_home/AGENTS.md" ]; then
system_prompt=$(cat "$opencode_home/AGENTS.md")
fi
if [ -f "$PWD/AGENTS.md" ]; then
system_prompt="${system_prompt}
$(cat "$PWD/AGENTS.md")"
print -u2 "$tag: appended project AGENTS.md"
fi
if [ -n "$system_prompt" ]; then
extra_args+=(--append-system-prompt "$system_prompt")
fi
# Build MCP config
local mcp_config=""
if [ -f "$base_home/mcpServers.json" ] && command -v jq >/dev/null 2>&1; then
mcp_config=$(jq -c '.mcpServers // {}' "$base_home/mcpServers.json" 2>/dev/null)
if [ "$mcp_config" = "{}" ]; then
mcp_config=""
else
print -u2 "$tag: loaded MCP servers from mcpServers.json"
fi
fi
# Merge MCP from project opencode.json (transform format)
local opencode_project_config="$PWD/opencode.json"
if [ -f "$opencode_project_config" ] && command -v jq >/dev/null 2>&1; then
local project_mcp=$(jq -c '.mcp // {}' "$opencode_project_config" 2>/dev/null)
if [ -n "$project_mcp" ] && [ "$project_mcp" != "{}" ]; then
local transformed_mcp=$(echo "$project_mcp" | jq -c '
to_entries | map({
key: .key,
value: (
if .value.command | type == "array" then
{
type: "stdio",
command: .value.command[0],
args: .value.command[1:],
env: (.value.environment // .value.env // {})
}
else
.value
end
)
}) | from_entries
')
if [ -n "$mcp_config" ]; then
mcp_config=$(echo "$mcp_config" "$transformed_mcp" | jq -sc '.[0] + .[1]')
else
mcp_config="$transformed_mcp"
fi
print -u2 "$tag: merged MCP servers from project opencode.json"
fi
fi
if [ -n "$mcp_config" ]; then
local mcp_file="${TMPDIR:-/tmp}/claude-mcp-$$.json"
printf '%s\n' "{\"mcpServers\": $mcp_config}" > "$mcp_file"
extra_args+=(--mcp-config "$mcp_file")
trap "rm -f '$mcp_file'" EXIT INT TERM
fi
# Create temp symlink for project commands if .opencode/command exists
local created_claude_dir=0
local created_commands_link=0
if [ -d "$PWD/.opencode/command" ]; then
if [ ! -d "$PWD/.claude" ]; then
mkdir -p "$PWD/.claude"
created_claude_dir=1
fi
if [ ! -e "$PWD/.claude/commands" ]; then
ln -s "$PWD/.opencode/command" "$PWD/.claude/commands"
created_commands_link=1
print -u2 "$tag: linked .opencode/command -> .claude/commands"
fi
fi
claude "$@" "${extra_args[@]}"
local exit_code=$?
# Cleanup temp symlink
if [ "$created_commands_link" = 1 ]; then
rm -f "$PWD/.claude/commands"
fi
if [ "$created_claude_dir" = 1 ]; then
rmdir "$PWD/.claude" 2>/dev/null
fi
return $exit_code
}