repr-cli 0.2.18__tar.gz → 0.2.20__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.
- {repr_cli-0.2.18 → repr_cli-0.2.20}/PKG-INFO +1 -1
- {repr_cli-0.2.18 → repr_cli-0.2.20}/pyproject.toml +1 -1
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/cli.py +28 -14
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/story_synthesis.py +6 -4
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr_cli.egg-info/PKG-INFO +1 -1
- {repr_cli-0.2.18 → repr_cli-0.2.20}/LICENSE +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/README.md +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/__init__.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/__main__.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/api.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/auth.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/change_synthesis.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/config.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/configure.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/cron.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/__init__.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/build.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/assets/index-B-aCjaCw.js +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/assets/index-BYFVbEev.css +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/assets/index-BrrhyJFO.css +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/assets/index-C7Gzxc4f.js +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/assets/index-CQdMXo6g.js +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/assets/index-CcEg74ts.js +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/assets/index-Cerc-iA_.js +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/assets/index-CjVcBW2L.css +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/assets/index-Cs8ofFGd.js +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/assets/index-Dfl3mR5E.js +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/assets/index-DwN0SeMc.css +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/assets/index-YFch_e0S.js +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/favicon.svg +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/dist/index.html +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/manager.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/dashboard/server.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/db.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/discovery.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/doctor.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/extractor.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/hooks.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/keychain.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/llm.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/loaders/__init__.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/loaders/base.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/loaders/claude_code.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/loaders/clawdbot.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/loaders/gemini_antigravity.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/mcp_server.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/models.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/openai_analysis.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/privacy.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/session_extractor.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/storage.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/telemetry.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/templates.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/timeline.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/tools.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/ui.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr/updater.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr_cli.egg-info/SOURCES.txt +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr_cli.egg-info/dependency_links.txt +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr_cli.egg-info/entry_points.txt +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr_cli.egg-info/requires.txt +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/repr_cli.egg-info/top_level.txt +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/setup.cfg +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/setup.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/tests/test_deduplication.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/tests/test_environment_variables.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/tests/test_network_sandboxing.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/tests/test_privacy_guarantees.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/tests/test_profile_export.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/tests/test_repo_identity.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/tests/test_stories_review.py +0 -0
- {repr_cli-0.2.18 → repr_cli-0.2.20}/tests/test_token_budget.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "repr-cli"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.20"
|
|
8
8
|
description = "A beautiful, privacy-first CLI that analyzes your code repositories and generates a compelling developer profile"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {file = "LICENSE"}
|
|
@@ -933,24 +933,40 @@ def generate(
|
|
|
933
933
|
console.print(" repr generate --local")
|
|
934
934
|
raise typer.Exit(1)
|
|
935
935
|
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
936
|
+
# Resolve LLM mode and model from config
|
|
937
|
+
llm_config = get_llm_config()
|
|
938
|
+
default_mode = llm_config.get("default", "local")
|
|
939
|
+
byok_provider = None
|
|
940
940
|
|
|
941
|
+
if not local and not cloud:
|
|
941
942
|
if default_mode == "local":
|
|
942
943
|
local = True
|
|
943
944
|
elif default_mode == "cloud" and is_authenticated() and is_cloud_allowed():
|
|
944
945
|
cloud = True
|
|
946
|
+
elif default_mode.startswith("byok:"):
|
|
947
|
+
byok_provider = default_mode.split(":", 1)[1]
|
|
945
948
|
else:
|
|
946
949
|
# Fallback: local if not signed in or cloud not allowed
|
|
947
950
|
local = True
|
|
948
|
-
|
|
951
|
+
|
|
952
|
+
# Determine model and provider string for display
|
|
953
|
+
if byok_provider:
|
|
954
|
+
from .config import get_byok_config, BYOK_PROVIDERS
|
|
955
|
+
byok_cfg = get_byok_config(byok_provider)
|
|
956
|
+
model_name = byok_cfg.get("model") if byok_cfg else None
|
|
957
|
+
provider_name = BYOK_PROVIDERS.get(byok_provider, {}).get("name", byok_provider)
|
|
958
|
+
mode_str = f"{provider_name}: {model_name}" if model_name else provider_name
|
|
959
|
+
elif local:
|
|
960
|
+
provider_name = llm_config.get("local_provider") or "Ollama"
|
|
961
|
+
model_name = llm_config.get("local_model") or "llama3.2"
|
|
962
|
+
mode_str = f"{provider_name}: {model_name}"
|
|
963
|
+
else:
|
|
964
|
+
model_name = llm_config.get("cloud_model") or "gpt-4o-mini"
|
|
965
|
+
mode_str = f"Cloud: {model_name}"
|
|
966
|
+
|
|
949
967
|
if not json_output:
|
|
950
968
|
print_header()
|
|
951
969
|
|
|
952
|
-
mode_str = "local LLM" if local else "cloud LLM"
|
|
953
|
-
|
|
954
970
|
# Build timeframe string for display
|
|
955
971
|
if commits:
|
|
956
972
|
timeframe_str = f"specific commits"
|
|
@@ -1073,13 +1089,8 @@ def generate(
|
|
|
1073
1089
|
if not json_output:
|
|
1074
1090
|
console.print(f" Batch {current}/{total}")
|
|
1075
1091
|
|
|
1076
|
-
#
|
|
1077
|
-
|
|
1078
|
-
use_local = local or (not cloud and llm_config.get("default") == "local")
|
|
1079
|
-
if use_local:
|
|
1080
|
-
model = llm_config.get("local_model") or "llama3.2"
|
|
1081
|
-
else:
|
|
1082
|
-
model = None # Use default cloud model
|
|
1092
|
+
# Use model_name resolved earlier (handles local, cloud, and BYOK)
|
|
1093
|
+
model = model_name
|
|
1083
1094
|
|
|
1084
1095
|
try:
|
|
1085
1096
|
# Run synthesis sync
|
|
@@ -1125,6 +1136,9 @@ def generate(
|
|
|
1125
1136
|
story.public_show = result.show
|
|
1126
1137
|
story.internal_show = result.show
|
|
1127
1138
|
except Exception as e:
|
|
1139
|
+
# Print error for visibility
|
|
1140
|
+
if not json_output:
|
|
1141
|
+
print_warning(f" Post generation failed: {e}")
|
|
1128
1142
|
# Fallback: build from story data
|
|
1129
1143
|
from .story_synthesis import _build_fallback_codex
|
|
1130
1144
|
result = _build_fallback_codex(story, "internal")
|
|
@@ -683,10 +683,9 @@ class StorySynthesizer:
|
|
|
683
683
|
analysis = BatchAnalysis.model_validate_json(content)
|
|
684
684
|
|
|
685
685
|
except Exception as e:
|
|
686
|
-
#
|
|
687
|
-
import
|
|
688
|
-
|
|
689
|
-
print(f"DEBUG: Exception in LLM call: {type(e).__name__}: {e}")
|
|
686
|
+
# Always print error for visibility
|
|
687
|
+
from rich.console import Console
|
|
688
|
+
Console(stderr=True).print(f"[yellow] LLM error: {type(e).__name__}: {e}[/]")
|
|
690
689
|
|
|
691
690
|
# Fallback: each commit is its own story
|
|
692
691
|
analysis = BatchAnalysis(stories=[
|
|
@@ -1095,6 +1094,9 @@ async def transform_story_for_feed(
|
|
|
1095
1094
|
return result
|
|
1096
1095
|
|
|
1097
1096
|
except Exception as e:
|
|
1097
|
+
# Print error for visibility
|
|
1098
|
+
from rich.console import Console
|
|
1099
|
+
Console(stderr=True).print(f"[yellow] Transform error: {type(e).__name__}: {e}[/]")
|
|
1098
1100
|
# Fallback: construct structured content from available data
|
|
1099
1101
|
return _build_fallback_codex(story, mode)
|
|
1100
1102
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|