Files
DevGen/devgen/cli/commit.py
T
sankalp 0b023482d7 feat(devgen/cli): introduce --max-groups and --max-diff-size options for commit command
Add limits to prevent token‑limit errors during commit generation.
- New `--max-groups` option to cap the number of commit groups.
- New `--max-diff-size` option to set maximum diff size per group (default 8000 chars).
Update logging to reflect the new options and pass them to the engine.
2026-06-06 16:45:07 +05:45

149 lines
4.1 KiB
Python

from typing import Annotated
import questionary
import typer
from devgen.modules.commit_generator import run_commit_engine
from devgen.utils import (
configure_logger,
delete_file,
get_commit_dry_run_path,
get_git_staged_files,
get_main_log_path,
read_file_content,
)
app = typer.Typer(
name="commit",
help="🚀 AI-powered semantic commit message generator.",
no_args_is_help=True,
rich_markup_mode="markdown",
)
@app.command("run")
def run_commit(
dry_run: Annotated[
bool,
typer.Option(
"--dry-run",
help="Simulate the commit process without making changes.",
),
] = False,
push: Annotated[
bool,
typer.Option(
"--push",
help="Automatically push changes to the remote repository.",
),
] = False,
debug: Annotated[
bool,
typer.Option(
"--debug",
help="Enable debug mode for detailed logging.",
),
] = False,
force_rebuild: Annotated[
bool,
typer.Option(
"--force-rebuild",
help="Force regeneration of commit messages.",
),
] = False,
check: Annotated[
bool,
typer.Option(
"--check",
help="Review/edit commit message before committing.",
),
] = False,
max_groups: Annotated[
int | None,
typer.Option(
"--max-groups",
help="Maximum number of commit groups. Lower this if you hit token-limit errors.",
),
] = None,
max_diff_size: Annotated[
int | None,
typer.Option(
"--max-diff-size",
help="Maximum diff size in chars per group (default 8000). "
"Lower this if you hit token-limit errors.",
),
] = None,
) -> None:
log_file = get_main_log_path()
logger = configure_logger("devgen.cli.commit", log_file, console=debug)
logger.info(f"Log file: {log_file}")
logger.info(
f"Options: dry_run={dry_run}, push={push}, debug={debug}, force={force_rebuild}, "
f"check={check}, max_groups={max_groups}, max_diff_size={max_diff_size}"
)
run_commit_engine(
dry_run=dry_run,
push=push,
debug=debug,
force_rebuild=force_rebuild,
check=check,
logger=logger,
max_groups=max_groups,
max_diff_size=max_diff_size,
)
@app.command("clear-cache")
def clear_cache() -> None:
if delete_file(get_commit_dry_run_path()):
typer.secho("Cache cleared.", fg=typer.colors.GREEN)
else:
typer.secho("[i] No cache found.", fg=typer.colors.YELLOW)
@app.command("list-cached")
def list_cached() -> None:
content = read_file_content(get_commit_dry_run_path())
if content:
typer.secho("--- Cached Dry-Run ---", fg=typer.colors.CYAN)
typer.echo(content)
else:
typer.secho("[i] No cache found.", fg=typer.colors.YELLOW)
@app.command("validate")
def validate() -> None:
staged = get_git_staged_files()
if staged:
typer.secho(f"{len(staged)} staged file(s):", fg=typer.colors.GREEN)
for f in staged:
typer.echo(f"- {f}")
else:
typer.secho("[i] No staged files.", fg=typer.colors.RED)
@app.command("undo")
def undo_commit() -> None:
"""Undoes the last commit but keeps changes staged."""
from devgen.utils import run_git_command
try:
# Check if there's at least one commit
run_git_command(["git", "rev-parse", "HEAD"])
except Exception:
typer.secho("No commits found to undo.", fg=typer.colors.RED)
return
if questionary.confirm(
"Are you sure you want to undo the last commit? (Changes will remain staged)",
default=False,
).ask():
try:
run_git_command(["git", "reset", "--soft", "HEAD~1"])
typer.secho(
"Last commit undone. Changes are still staged.", fg=typer.colors.GREEN
)
except Exception as e:
typer.secho(f"Failed to undo commit: {e}", fg=typer.colors.RED)