repr-cli 0.2.12__tar.gz → 0.2.13__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.12/repr_cli.egg-info → repr_cli-0.2.13}/PKG-INFO +1 -1
- {repr_cli-0.2.12 → repr_cli-0.2.13}/pyproject.toml +1 -1
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/auth.py +17 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13/repr_cli.egg-info}/PKG-INFO +1 -1
- {repr_cli-0.2.12 → repr_cli-0.2.13}/LICENSE +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/README.md +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/__init__.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/__main__.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/api.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/cli.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/config.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/discovery.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/doctor.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/extractor.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/hooks.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/keychain.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/llm.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/openai_analysis.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/privacy.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/storage.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/telemetry.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/templates.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/tools.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/ui.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr/updater.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr_cli.egg-info/SOURCES.txt +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr_cli.egg-info/dependency_links.txt +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr_cli.egg-info/entry_points.txt +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr_cli.egg-info/requires.txt +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/repr_cli.egg-info/top_level.txt +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/setup.cfg +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/setup.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/tests/test_environment_variables.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/tests/test_network_sandboxing.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/tests/test_privacy_guarantees.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/tests/test_profile_export.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/tests/test_repo_identity.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/tests/test_stories_review.py +0 -0
- {repr_cli-0.2.12 → repr_cli-0.2.13}/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.13"
|
|
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"}
|
|
@@ -5,12 +5,15 @@ Tokens are stored securely in OS keychain (see keychain.py).
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
import asyncio
|
|
8
|
+
import platform
|
|
9
|
+
import socket
|
|
8
10
|
import time
|
|
9
11
|
from dataclasses import dataclass
|
|
10
12
|
|
|
11
13
|
import httpx
|
|
12
14
|
|
|
13
15
|
from .config import set_auth, clear_auth, get_auth, is_authenticated, get_api_base
|
|
16
|
+
from .telemetry import get_device_id
|
|
14
17
|
|
|
15
18
|
|
|
16
19
|
def _get_device_code_url() -> str:
|
|
@@ -25,6 +28,16 @@ POLL_INTERVAL = 5 # seconds
|
|
|
25
28
|
MAX_POLL_TIME = 600 # 10 minutes
|
|
26
29
|
|
|
27
30
|
|
|
31
|
+
def _get_device_name() -> str:
|
|
32
|
+
"""Get a friendly device name for display."""
|
|
33
|
+
try:
|
|
34
|
+
hostname = socket.gethostname()
|
|
35
|
+
system = platform.system()
|
|
36
|
+
return f"{hostname} ({system})"
|
|
37
|
+
except Exception:
|
|
38
|
+
return "Unknown Device"
|
|
39
|
+
|
|
40
|
+
|
|
28
41
|
@dataclass
|
|
29
42
|
class DeviceCodeResponse:
|
|
30
43
|
"""Response from device code request."""
|
|
@@ -106,6 +119,8 @@ async def poll_for_token(device_code: str, interval: int = POLL_INTERVAL) -> Tok
|
|
|
106
119
|
json={
|
|
107
120
|
"device_code": device_code,
|
|
108
121
|
"client_id": "repr-cli",
|
|
122
|
+
"device_id": get_device_id(),
|
|
123
|
+
"device_name": _get_device_name(),
|
|
109
124
|
},
|
|
110
125
|
timeout=30,
|
|
111
126
|
)
|
|
@@ -314,6 +329,8 @@ class AuthFlow:
|
|
|
314
329
|
json={
|
|
315
330
|
"device_code": device_code_response.device_code,
|
|
316
331
|
"client_id": "repr-cli",
|
|
332
|
+
"device_id": get_device_id(),
|
|
333
|
+
"device_name": _get_device_name(),
|
|
317
334
|
},
|
|
318
335
|
timeout=30,
|
|
319
336
|
)
|
|
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
|