From 23236b19cba107acbc1f42b4b691bafe147db79b Mon Sep 17 00:00:00 2001 From: Mohammad Rafiq Date: Thu, 12 Jun 2025 23:22:08 +0800 Subject: [PATCH] feat(packages/commit): add interactive mode to revise commit messages --- packages/commit/default.nix | 45 ++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/packages/commit/default.nix b/packages/commit/default.nix index 70930b9..b352cee 100644 --- a/packages/commit/default.nix +++ b/packages/commit/default.nix @@ -1,9 +1,11 @@ { pkgs, ... }: pkgs.writeShellScriptBin "commit" # bash '' - PROMPT="Please generate a one-line commit message using." - GUIDELINES="1. Use conventional commit syntax, following the context." + PROMPT="Please generate a one-line commit message using conventional commit syntax, following the context." + GUIDELINES="1. Use conventional commit syntax, following the context. " NUM_ANCESTORS=0 + + # Parse arguments while [[ $# -gt 0 ]]; do case "$1" in --num-ancestors | -n) @@ -16,9 +18,42 @@ pkgs.writeShellScriptBin "commit" # bash ;; esac done + + # Get context and diff CONTEXT=$(git --no-pager log -n 10) DIFF=$(git --no-pager diff HEAD~$NUM_ANCESTORS) - RESPONSE=$(aichat "$PROMPT\nGuidelines: $GUIDELINES\nContext from git log: $CONTEXT\nDiff from git diff HEAD: $DIFF") - #TODO: revise commit message - git commit -am "$RESPONSE" + + # Generate initial response + RESPONSE=$(aichat "$PROMPT\nGuidelines: $GUIDELINES\nContext from git log:\n$CONTEXT\nDiff from git diff HEAD:\n$DIFF") + + while true; do + echo "Generated Commit Message:" + echo "$RESPONSE" + echo "Options: [y]es, [r]eroll, [e]dit, [q]uit?" + read -r -p "Choose an action: " choice + + case "$choice" in + y | yes) + git commit -am "$RESPONSE" + echo "Committed successfully." + exit 0 + ;; + r | reroll) + RESPONSE=$(aichat "$PROMPT\nGuidelines: $GUIDELINES\nContext from git log:\n$CONTEXT\nDiff from git diff HEAD:\n$DIFF") + ;; + e | edit) + echo "$RESPONSE" > /tmp/commit_msg.txt + "$EDITOR" /tmp/commit_msg.txt + RESPONSE=$(cat /tmp/commit_msg.txt) + rm /tmp/commit_msg.txt + ;; + q | quit | "") + echo "Aborted." + exit 1 + ;; + *) + echo "Invalid choice. Please choose again." + ;; + esac + done ''