gitglimpse 0.1.5__tar.gz → 0.1.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/.gitignore +3 -0
  2. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/PKG-INFO +1 -1
  3. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/pyproject.toml +1 -1
  4. gitglimpse-0.1.7/src/gitglimpse/__init__.py +1 -0
  5. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/cli.py +60 -7
  6. gitglimpse-0.1.5/src/gitglimpse/__init__.py +0 -1
  7. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/LICENSE +0 -0
  8. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/PYPI_README.md +0 -0
  9. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/commands/__init__.py +0 -0
  10. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/commands/pr.md +0 -0
  11. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/commands/report.md +0 -0
  12. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/commands/standup.md +0 -0
  13. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/commands/week.md +0 -0
  14. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/config.py +0 -0
  15. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/estimation.py +0 -0
  16. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/formatters/__init__.py +0 -0
  17. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/formatters/json.py +0 -0
  18. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/formatters/markdown.py +0 -0
  19. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/formatters/pr.py +0 -0
  20. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/formatters/template.py +0 -0
  21. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/git.py +0 -0
  22. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/grouping.py +0 -0
  23. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/onboarding.py +0 -0
  24. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/providers/__init__.py +0 -0
  25. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/providers/base.py +0 -0
  26. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/providers/claude.py +0 -0
  27. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/providers/gemini.py +0 -0
  28. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/providers/local.py +0 -0
  29. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/providers/openai.py +0 -0
  30. {gitglimpse-0.1.5 → gitglimpse-0.1.7}/src/gitglimpse/py.typed +0 -0
@@ -213,3 +213,6 @@ __marimo__/
213
213
  # Build
214
214
  *.pyc
215
215
  .venv/
216
+
217
+ .claude/
218
+ .cursor
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitglimpse
3
- Version: 0.1.5
3
+ Version: 0.1.7
4
4
  Summary: Extract structured context from your git history — PR descriptions, standups, weekly reports, and LLM-ready JSON.
5
5
  Project-URL: Homepage, https://github.com/dino/gitglimpse
6
6
  Project-URL: Repository, https://github.com/dino/gitglimpse
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "gitglimpse"
7
- version = "0.1.5"
7
+ version = "0.1.7"
8
8
  description = "Extract structured context from your git history — PR descriptions, standups, weekly reports, and LLM-ready JSON."
9
9
  readme = "PYPI_README.md"
10
10
  authors = [{ name = "Dino" }]
@@ -0,0 +1 @@
1
+ __version__ = "0.1.7"
@@ -301,6 +301,35 @@ def _print_status_line(
301
301
  console.print("[dim]" + " · ".join(parts) + "[/dim]", highlight=False)
302
302
 
303
303
 
304
+ _PROVIDER_DEFAULTS: dict[str, dict[str, str]] = {
305
+ "openai": {"api_key_env": "OPENAI_API_KEY", "model": "gpt-4o-mini", "mode": "api"},
306
+ "anthropic": {"api_key_env": "ANTHROPIC_API_KEY", "model": "claude-sonnet-4-20250514", "mode": "api"},
307
+ "gemini": {"api_key_env": "GEMINI_API_KEY", "model": "gemini-2.5-flash", "mode": "api"},
308
+ "local": {"api_key_env": "", "model": "qwen2.5-coder:latest", "mode": "local-llm"},
309
+ }
310
+
311
+
312
+ def _apply_provider_override(
313
+ cfg: Config,
314
+ provider_name: Optional[str],
315
+ model_override: Optional[str],
316
+ ) -> None:
317
+ """Mutate *cfg* in-place when --provider is passed on the CLI."""
318
+ if not provider_name:
319
+ return
320
+ defaults = _PROVIDER_DEFAULTS.get(provider_name)
321
+ if defaults is None:
322
+ _stderr_console.print(
323
+ f"[bold red]Error:[/bold red] Unknown provider '{provider_name}'. "
324
+ f"Choose from: {', '.join(_PROVIDER_DEFAULTS)}"
325
+ )
326
+ raise typer.Exit(1)
327
+ cfg.default_mode = defaults["mode"]
328
+ cfg.llm_provider = provider_name if provider_name != "local" else None
329
+ cfg.api_key_env = defaults["api_key_env"] or None
330
+ cfg.llm_model = model_override or defaults["model"]
331
+
332
+
304
333
  def _resolve_provider(
305
334
  cfg: Config,
306
335
  use_local: bool,
@@ -381,6 +410,10 @@ def standup(
381
410
  Optional[str],
382
411
  typer.Option("--output", "-o", help="Save output to file instead of printing."),
383
412
  ] = None,
413
+ provider: Annotated[
414
+ Optional[str],
415
+ typer.Option("--provider", help="LLM provider override: openai, anthropic, gemini, local.", hidden=True),
416
+ ] = None,
384
417
  skip_setup: Annotated[
385
418
  bool,
386
419
  typer.Option("--skip-setup", help="Skip first-run onboarding.", hidden=True),
@@ -397,6 +430,7 @@ def standup(
397
430
  glimpse standup --repos "api,frontend,landing"
398
431
  """
399
432
  cfg = _load_or_onboard(skip_setup)
433
+ _apply_provider_override(cfg, provider, model)
400
434
  effective = _effective_since(since, cfg.default_since)
401
435
  ctx_mode = context or cfg.context_mode
402
436
  resolved_author = _resolve_author(author, cfg.author_email)
@@ -539,6 +573,10 @@ def week(
539
573
  typer.Option("--filter-noise/--no-filter-noise",
540
574
  help="Filter out noise commits (merges, formatting, lock files)."),
541
575
  ] = None,
576
+ provider: Annotated[
577
+ Optional[str],
578
+ typer.Option("--provider", help="LLM provider override: openai, anthropic, gemini, local.", hidden=True),
579
+ ] = None,
542
580
  skip_setup: Annotated[
543
581
  bool,
544
582
  typer.Option("--skip-setup", help="Skip first-run onboarding.", hidden=True),
@@ -553,6 +591,7 @@ def week(
553
591
  glimpse week --json
554
592
  """
555
593
  cfg = _load_or_onboard(skip_setup)
594
+ _apply_provider_override(cfg, provider, model)
556
595
  ctx_mode = context or cfg.context_mode
557
596
  resolved_author = _resolve_author(author, cfg.author_email)
558
597
  do_filter = filter_noise if filter_noise is not None else cfg.filter_noise
@@ -661,6 +700,10 @@ def pr(
661
700
  typer.Option("--filter-noise/--no-filter-noise",
662
701
  help="Filter out noise commits (merges, formatting, lock files)."),
663
702
  ] = None,
703
+ provider: Annotated[
704
+ Optional[str],
705
+ typer.Option("--provider", help="LLM provider override: openai, anthropic, gemini, local.", hidden=True),
706
+ ] = None,
664
707
  skip_setup: Annotated[
665
708
  bool,
666
709
  typer.Option("--skip-setup", help="Skip first-run onboarding.", hidden=True),
@@ -676,6 +719,7 @@ def pr(
676
719
  glimpse pr --context diffs
677
720
  """
678
721
  cfg = _load_or_onboard(skip_setup)
722
+ _apply_provider_override(cfg, provider, model)
679
723
  # PR defaults to "both" context for richer output, unless explicitly overridden.
680
724
  ctx_mode = context or "both"
681
725
  do_filter = filter_noise if filter_noise is not None else cfg.filter_noise
@@ -843,7 +887,11 @@ def _write_command_file(
843
887
  def init(
844
888
  cursor: Annotated[
845
889
  bool,
846
- typer.Option("--cursor", help="Also create .cursor/commands/ files."),
890
+ typer.Option("--cursor", help="Create .cursor/commands/ files."),
891
+ ] = False,
892
+ claude: Annotated[
893
+ bool,
894
+ typer.Option("--claude", help="Create .claude/commands/ files."),
847
895
  ] = False,
848
896
  force: Annotated[
849
897
  bool,
@@ -854,19 +902,24 @@ def init(
854
902
  typer.Option("--repo", help="Target repository root. Defaults to current directory."),
855
903
  ] = None,
856
904
  ) -> None:
857
- """Initialize Claude Code (and optionally Cursor) slash-command files.
905
+ """Initialize Claude Code and/or Cursor slash-command files.
858
906
 
859
907
  \b
860
908
  Examples:
861
- glimpse init
862
- glimpse init --cursor
909
+ glimpse init # Claude Code only (default)
910
+ glimpse init --cursor # Cursor only
911
+ glimpse init --claude --cursor # both
863
912
  glimpse init --force
864
913
  """
865
914
  root = Path(repo) if repo else Path.cwd()
866
915
 
867
- targets: list[tuple[Path, str]] = [
868
- (root / ".claude" / "commands", "Claude Code"),
869
- ]
916
+ # Default to Claude Code if neither flag is specified.
917
+ if not cursor and not claude:
918
+ claude = True
919
+
920
+ targets: list[tuple[Path, str]] = []
921
+ if claude:
922
+ targets.append((root / ".claude" / "commands", "Claude Code"))
870
923
  if cursor:
871
924
  targets.append((root / ".cursor" / "commands", "Cursor"))
872
925
 
@@ -1 +0,0 @@
1
- __version__ = "0.1.5"
File without changes
File without changes