79 lines
1.5 KiB
Bash
Executable File
79 lines
1.5 KiB
Bash
Executable File
#!/bin/bash
|
|
set -eu
|
|
|
|
ARGS=("${@-}")
|
|
|
|
TMP_FILE="/tmp/aicommit"
|
|
system="You are an expert programmer that values clear, unambiguous communication and are specialized in generating concise and informative git commit messages. Only reply with the commit message and nothing else."
|
|
|
|
pushd "$(pwd)" >/dev/null
|
|
|
|
hasFlag() {
|
|
local flags=("$@")
|
|
for var in "${ARGS[@]}"; do
|
|
for flag in "${flags[@]}"; do
|
|
if [[ ${flag} == "${var}" ]]; then
|
|
echo 'true'
|
|
return
|
|
fi
|
|
done
|
|
done
|
|
echo 'false'
|
|
}
|
|
|
|
spin() {
|
|
echo "${@}"
|
|
while true; do
|
|
spinner=('-' '\' '|' '/')
|
|
for i in "${spinner[@]}"; do
|
|
echo -ne "\r${i}"
|
|
sleep .05
|
|
done
|
|
done
|
|
echo ""
|
|
}
|
|
|
|
if ! diff=$(git diff --cached); then
|
|
echo "Failed to get diff."
|
|
exit 1
|
|
fi
|
|
|
|
message_cat="${system} diff: ${diff}"
|
|
|
|
message=$(
|
|
jq -n \
|
|
".message = $(jq -R -s '@json' <<<"${message_cat}")"
|
|
)
|
|
|
|
# trunk-ignore(shellcheck/SC2091)
|
|
# trunk-ignore(shellcheck/SC2310)
|
|
if $(hasFlag -r --reset); then
|
|
spin "resetting AI history." &
|
|
SPINNER="$!"
|
|
if ! curl -s -X POST https://infer.x64.world/reset-conversation >/dev/null; then
|
|
echo "Failed to reset conversation."
|
|
kill ${SPINNER}
|
|
exit 1
|
|
fi
|
|
kill "${SPINNER}"
|
|
fi
|
|
|
|
spin "AI is thinking." &
|
|
SPINNER="$!"
|
|
curl -s "https://infer.x64.world/chat" \
|
|
-X POST \
|
|
-H "Content-Type: application/json" \
|
|
-d "${message}" | jq -r '.content | gsub("\""; "")' >"${TMP_FILE}"
|
|
|
|
# trunk-ignore(shellcheck/SC2181)
|
|
if [[ 0 -ne $? ]]; then
|
|
kill "${SPINNER}"
|
|
echo "Failed to get response."
|
|
exit 1
|
|
fi
|
|
kill "${SPINNER}"
|
|
|
|
git commit -e -m "$(cat "${TMP_FILE}")" && rm "${TMP_FILE}"
|
|
|
|
popd >/dev/null
|