fix: improve jq dependency handling and JSON escaping in setup-qodercli.sh

- Move jq check from global scope to only where needed, allowing
  config creation to work without jq installed
- Add json_escape_path() helper for safe JSON string escaping
- Fix unsafe string interpolation in jq filter (use --arg instead)
- Use jq -n --arg for safe JSON generation when jq is available
- Properly escape paths with special characters (quotes, backslashes)
  in fallback heredoc when jq is unavailable

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
shengwei.psw
2026-03-12 19:27:58 +08:00
parent 88418c40a3
commit 0bacc98351

View File

@@ -43,25 +43,27 @@ echo "Plugin path: ${PLUGIN_DIR}"
echo "Config file: ${QODER_CONFIG}"
echo ""
# Check if jq is available
if ! command -v jq &> /dev/null; then
echo -e "${YELLOW}jq not found. Please install jq or manually add to ${QODER_CONFIG}:${NC}"
echo ""
echo '{'
echo ' "plugins": {'
echo ' "sources": {'
echo ' "local": [{"path": "'"${PLUGIN_DIR}"'"}]'
echo ' }'
echo ' }'
echo '}'
echo ""
exit 1
fi
# JSON escape helper for paths when jq is not available
json_escape_path() {
printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'
}
# Create or update config
if [ -f "${QODER_CONFIG}" ]; then
# Check if plugin already registered
if jq -e ".plugins.sources.local[]? | select(.path == \"${PLUGIN_DIR}\")" "${QODER_CONFIG}" > /dev/null 2>&1; then
# Config exists - need jq to safely update it
if ! command -v jq &> /dev/null; then
ESCAPED_PATH=$(json_escape_path "${PLUGIN_DIR}")
echo -e "${YELLOW}jq not found. Please install jq or manually add to ${QODER_CONFIG}:${NC}"
echo ""
echo "Add this entry to plugins.sources.local array:"
echo ""
echo " {\"path\": \"${ESCAPED_PATH}\"}"
echo ""
exit 1
fi
# Check if plugin already registered (using --arg for safe variable passing)
if jq -e --arg path "${PLUGIN_DIR}" '.plugins.sources.local[]? | select(.path == $path)' "${QODER_CONFIG}" > /dev/null 2>&1; then
echo -e "${GREEN}✓ Plugin already registered in ${QODER_CONFIG}${NC}"
else
# Add plugin to existing config
@@ -76,16 +78,31 @@ if [ -f "${QODER_CONFIG}" ]; then
echo -e "${GREEN}✓ Plugin added to ${QODER_CONFIG}${NC}"
fi
else
# Create new config
cat > "${QODER_CONFIG}" << EOF
# Config does not exist - create new
if command -v jq &> /dev/null; then
# Use jq for safe JSON generation
jq -n --arg path "${PLUGIN_DIR}" '
{
"plugins": {
"sources": {
"local": [{"path": $path}]
}
}
}
' > "${QODER_CONFIG}"
else
# Fallback: use bash with escaped path
ESCAPED_PATH=$(json_escape_path "${PLUGIN_DIR}")
cat > "${QODER_CONFIG}" << EOF
{
"plugins": {
"sources": {
"local": [{"path": "${PLUGIN_DIR}"}]
"local": [{"path": "${ESCAPED_PATH}"}]
}
}
}
EOF
fi
echo -e "${GREEN}✓ Created ${QODER_CONFIG} with plugin registered${NC}"
fi