git2report 0.1.0__tar.gz → 0.1.1__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.
- {git2report-0.1.0 → git2report-0.1.1}/PKG-INFO +28 -7
- {git2report-0.1.0 → git2report-0.1.1}/README.md +27 -6
- {git2report-0.1.0 → git2report-0.1.1}/git2report/__init__.py +1 -1
- {git2report-0.1.0 → git2report-0.1.1}/git2report/web.py +52 -1
- {git2report-0.1.0 → git2report-0.1.1}/git2report.egg-info/PKG-INFO +28 -7
- {git2report-0.1.0 → git2report-0.1.1}/pyproject.toml +1 -1
- {git2report-0.1.0 → git2report-0.1.1}/LICENSE +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/__main__.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/branches.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/cache.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/charts.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/chunker.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/cli.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/clustering.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/config.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/eval_tools.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/extractor.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/filtering.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/metrics.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/models.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/pipeline.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/report.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/rules.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/summarizer.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report/timeutil.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report.egg-info/SOURCES.txt +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report.egg-info/dependency_links.txt +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report.egg-info/entry_points.txt +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report.egg-info/requires.txt +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/git2report.egg-info/top_level.txt +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/setup.cfg +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/tests/test_chunker.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/tests/test_end_to_end.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/tests/test_eval_tools.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/tests/test_filter_cluster_metrics.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/tests/test_rules.py +0 -0
- {git2report-0.1.0 → git2report-0.1.1}/tests/test_summarizer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: git2report
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: Turn Git history into a plain-language, evidence-linked progress report with visual charts and Terminal Web Studio.
|
|
5
5
|
Author-email: Vijay <vijaykd04@users.noreply.github.com>
|
|
6
6
|
License: MIT
|
|
@@ -31,21 +31,42 @@ Dynamic: license-file
|
|
|
31
31
|
|
|
32
32
|
# Git2Report
|
|
33
33
|
|
|
34
|
+
[](https://pypi.org/project/git2report/)
|
|
35
|
+
[](https://www.python.org/downloads/)
|
|
36
|
+
[](https://opensource.org/licenses/MIT)
|
|
37
|
+
|
|
34
38
|
Turn a Git repository's history into a plain-language weekly progress report, where **every number is
|
|
35
|
-
counted by code** and **every line carries commit IDs as proof**. The AI (optional, local) only writes
|
|
39
|
+
counted by code** and **every line carries commit IDs as proof**. The AI (optional, local Ollama or Google Gemini) only writes
|
|
36
40
|
sentences.
|
|
37
41
|
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## ⚡ Quick 1-Command Run (No Cloning Required!)
|
|
45
|
+
|
|
46
|
+
Anyone with Python can install and run Git2Report globally in one command:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pip install git2report
|
|
50
|
+
git2report --ui
|
|
51
|
+
# Or if your PATH isn't updated:
|
|
52
|
+
python -m git2report --ui
|
|
38
53
|
```
|
|
39
|
-
|
|
54
|
+
|
|
55
|
+
Or run directly without installing using `pipx`:
|
|
56
|
+
```bash
|
|
57
|
+
pipx run git2report --ui
|
|
40
58
|
```
|
|
41
59
|
|
|
42
|
-
|
|
60
|
+
---
|
|
43
61
|
|
|
44
|
-
|
|
62
|
+
## Install for Development
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
git clone https://github.com/vijaykd04/Git2Report.git
|
|
66
|
+
cd Git2Report
|
|
45
67
|
python -m venv .venv
|
|
46
68
|
.venv\Scripts\activate # Windows (Linux/macOS: source .venv/bin/activate)
|
|
47
|
-
pip install -e ".[dev]" #
|
|
48
|
-
pip install -e ".[ollama]" # only if you want AI sentences (also install Ollama from ollama.com)
|
|
69
|
+
pip install -e ".[dev]" # includes test suite
|
|
49
70
|
```
|
|
50
71
|
|
|
51
72
|
## Use
|
|
@@ -1,20 +1,41 @@
|
|
|
1
1
|
# Git2Report
|
|
2
2
|
|
|
3
|
+
[](https://pypi.org/project/git2report/)
|
|
4
|
+
[](https://www.python.org/downloads/)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
3
7
|
Turn a Git repository's history into a plain-language weekly progress report, where **every number is
|
|
4
|
-
counted by code** and **every line carries commit IDs as proof**. The AI (optional, local) only writes
|
|
8
|
+
counted by code** and **every line carries commit IDs as proof**. The AI (optional, local Ollama or Google Gemini) only writes
|
|
5
9
|
sentences.
|
|
6
10
|
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## ⚡ Quick 1-Command Run (No Cloning Required!)
|
|
14
|
+
|
|
15
|
+
Anyone with Python can install and run Git2Report globally in one command:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pip install git2report
|
|
19
|
+
git2report --ui
|
|
20
|
+
# Or if your PATH isn't updated:
|
|
21
|
+
python -m git2report --ui
|
|
7
22
|
```
|
|
8
|
-
|
|
23
|
+
|
|
24
|
+
Or run directly without installing using `pipx`:
|
|
25
|
+
```bash
|
|
26
|
+
pipx run git2report --ui
|
|
9
27
|
```
|
|
10
28
|
|
|
11
|
-
|
|
29
|
+
---
|
|
12
30
|
|
|
13
|
-
|
|
31
|
+
## Install for Development
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
git clone https://github.com/vijaykd04/Git2Report.git
|
|
35
|
+
cd Git2Report
|
|
14
36
|
python -m venv .venv
|
|
15
37
|
.venv\Scripts\activate # Windows (Linux/macOS: source .venv/bin/activate)
|
|
16
|
-
pip install -e ".[dev]" #
|
|
17
|
-
pip install -e ".[ollama]" # only if you want AI sentences (also install Ollama from ollama.com)
|
|
38
|
+
pip install -e ".[dev]" # includes test suite
|
|
18
39
|
```
|
|
19
40
|
|
|
20
41
|
## Use
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""Git2Report: turn Git history into a plain-language, evidence-linked progress report."""
|
|
2
|
-
__version__ = "0.1.
|
|
2
|
+
__version__ = "0.1.1"
|
|
@@ -683,6 +683,18 @@ TERMINAL_HTML = """<!DOCTYPE html>
|
|
|
683
683
|
</select>
|
|
684
684
|
</div>
|
|
685
685
|
|
|
686
|
+
<!-- Gemini API Key Input (Shows when gemini is selected) -->
|
|
687
|
+
<div class="arg-group" id="apiKeyGroup">
|
|
688
|
+
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
689
|
+
<label class="arg-label" for="apiKeyInput">
|
|
690
|
+
<span>--api-key</span>
|
|
691
|
+
<span class="arg-desc"><gemini key></span>
|
|
692
|
+
</label>
|
|
693
|
+
<span id="apiKeyStatusBadge" style="font-size: 0.68rem; color: var(--text-muted);"></span>
|
|
694
|
+
</div>
|
|
695
|
+
<input type="password" id="apiKeyInput" class="term-input" placeholder="Paste your GEMINI_API_KEY here..." oninput="updateCliPreview()">
|
|
696
|
+
</div>
|
|
697
|
+
|
|
686
698
|
<!-- Model Selection (Shows for Ollama & Gemini) -->
|
|
687
699
|
<div class="arg-group" id="modelGroup" style="display: none;">
|
|
688
700
|
<div style="display: flex; justify-content: space-between; align-items: center;">
|
|
@@ -819,6 +831,14 @@ TERMINAL_HTML = """<!DOCTYPE html>
|
|
|
819
831
|
}
|
|
820
832
|
updateCliPreview();
|
|
821
833
|
checkOllamaStatus();
|
|
834
|
+
try {
|
|
835
|
+
const cfgRes = await fetch('/api/config');
|
|
836
|
+
const cfg = await cfgRes.json();
|
|
837
|
+
if (cfg.has_gemini_key) {
|
|
838
|
+
document.getElementById('apiKeyInput').placeholder = '●●●●●●●● (API key detected on system)';
|
|
839
|
+
document.getElementById('apiKeyStatusBadge').innerHTML = '<span style="color: var(--accent-green);">● KEY ACTIVE</span>';
|
|
840
|
+
}
|
|
841
|
+
} catch (e) {}
|
|
822
842
|
});
|
|
823
843
|
|
|
824
844
|
async function checkOllamaStatus() {
|
|
@@ -852,12 +872,18 @@ TERMINAL_HTML = """<!DOCTYPE html>
|
|
|
852
872
|
function onLlmChange() {
|
|
853
873
|
const llm = document.getElementById('llmSelect').value;
|
|
854
874
|
const modelGroup = document.getElementById('modelGroup');
|
|
875
|
+
const apiKeyGroup = document.getElementById('apiKeyGroup');
|
|
855
876
|
if (llm === 'ollama') {
|
|
856
877
|
modelGroup.style.display = 'flex';
|
|
878
|
+
apiKeyGroup.style.display = 'none';
|
|
857
879
|
document.getElementById('modelLabelDesc').innerText = '<ollama model, e.g. llama3:8b>';
|
|
858
880
|
checkOllamaStatus();
|
|
881
|
+
} else if (llm === 'gemini') {
|
|
882
|
+
modelGroup.style.display = 'none';
|
|
883
|
+
apiKeyGroup.style.display = 'flex';
|
|
859
884
|
} else {
|
|
860
885
|
modelGroup.style.display = 'none';
|
|
886
|
+
apiKeyGroup.style.display = 'none';
|
|
861
887
|
}
|
|
862
888
|
updateCliPreview();
|
|
863
889
|
}
|
|
@@ -882,12 +908,16 @@ TERMINAL_HTML = """<!DOCTYPE html>
|
|
|
882
908
|
const audience = document.getElementById('audienceSelect').value;
|
|
883
909
|
const llm = document.getElementById('llmSelect').value;
|
|
884
910
|
const model = document.getElementById('modelInput').value.trim();
|
|
911
|
+
const apiKey = document.getElementById('apiKeyInput').value.trim();
|
|
885
912
|
const next = document.getElementById('nextGoalInput').value.trim();
|
|
886
913
|
|
|
887
914
|
let cmd = `git2report --repo ${repo} --since ${since} --audience ${audience} --llm ${llm}`;
|
|
888
915
|
if (llm === 'ollama' && model) {
|
|
889
916
|
cmd += ` --model ${model}`;
|
|
890
917
|
}
|
|
918
|
+
if (llm === 'gemini' && apiKey) {
|
|
919
|
+
cmd += ` --api-key "●●●●"`;
|
|
920
|
+
}
|
|
891
921
|
if (next) {
|
|
892
922
|
cmd += ` --next "${next}"`;
|
|
893
923
|
}
|
|
@@ -957,6 +987,7 @@ TERMINAL_HTML = """<!DOCTYPE html>
|
|
|
957
987
|
const audience = document.getElementById('audienceSelect').value;
|
|
958
988
|
const llm = document.getElementById('llmSelect').value;
|
|
959
989
|
const model = document.getElementById('modelInput').value.trim();
|
|
990
|
+
const apiKey = document.getElementById('apiKeyInput').value.trim();
|
|
960
991
|
const nextGoal = document.getElementById('nextGoalInput').value.trim();
|
|
961
992
|
|
|
962
993
|
const payload = {
|
|
@@ -965,6 +996,7 @@ TERMINAL_HTML = """<!DOCTYPE html>
|
|
|
965
996
|
audience,
|
|
966
997
|
llm,
|
|
967
998
|
model: (llm === 'ollama') ? model : '',
|
|
999
|
+
api_key: (llm === 'gemini') ? apiKey : '',
|
|
968
1000
|
next_goals: nextGoal ? [nextGoal] : [],
|
|
969
1001
|
formats: {
|
|
970
1002
|
pdf: document.getElementById('fmtPdf').checked,
|
|
@@ -1060,6 +1092,16 @@ class WebStudioHandler(BaseHTTPRequestHandler):
|
|
|
1060
1092
|
self.wfile.write(json.dumps({"online": len(models) > 0, "models": models}).encode("utf-8"))
|
|
1061
1093
|
return
|
|
1062
1094
|
|
|
1095
|
+
if path == "/api/config":
|
|
1096
|
+
from git2report.summarizer import _load_env_file
|
|
1097
|
+
_load_env_file()
|
|
1098
|
+
has_key = bool(os.environ.get("GEMINI_API_KEY") or os.environ.get("GOOGLE_API_KEY"))
|
|
1099
|
+
self.send_response(HTTPStatus.OK)
|
|
1100
|
+
self.send_header("Content-Type", "application/json")
|
|
1101
|
+
self.end_headers()
|
|
1102
|
+
self.wfile.write(json.dumps({"has_gemini_key": has_key}).encode("utf-8"))
|
|
1103
|
+
return
|
|
1104
|
+
|
|
1063
1105
|
if path == "/api/preview":
|
|
1064
1106
|
html_path = self.last_generated_files.get("html")
|
|
1065
1107
|
if html_path and html_path.exists():
|
|
@@ -1110,8 +1152,17 @@ class WebStudioHandler(BaseHTTPRequestHandler):
|
|
|
1110
1152
|
audience = data.get("audience", "guide")
|
|
1111
1153
|
llm = data.get("llm", "gemini")
|
|
1112
1154
|
model = data.get("model", "")
|
|
1155
|
+
user_api_key = data.get("api_key", "").strip()
|
|
1113
1156
|
planned = data.get("next_goals", [])
|
|
1114
1157
|
|
|
1158
|
+
if user_api_key:
|
|
1159
|
+
os.environ["GEMINI_API_KEY"] = user_api_key
|
|
1160
|
+
try:
|
|
1161
|
+
env_file = Path.home() / ".git2report_env"
|
|
1162
|
+
env_file.write_text(f"GEMINI_API_KEY={user_api_key}\n", encoding="utf-8")
|
|
1163
|
+
except Exception:
|
|
1164
|
+
pass
|
|
1165
|
+
|
|
1115
1166
|
repo_path = Path(repo_str)
|
|
1116
1167
|
if repo_str.startswith(("http://", "https://", "git@")):
|
|
1117
1168
|
repo_name = repo_str.rstrip("/").split("/")[-1]
|
|
@@ -1135,7 +1186,7 @@ class WebStudioHandler(BaseHTTPRequestHandler):
|
|
|
1135
1186
|
)
|
|
1136
1187
|
|
|
1137
1188
|
chosen_model = model or ("gemini-2.5-flash" if llm == "gemini" else ("llama3:8b" if llm == "ollama" else ""))
|
|
1138
|
-
summarizer = get_summarizer(llm, chosen_model)
|
|
1189
|
+
summarizer = get_summarizer(llm, chosen_model, api_key=user_api_key or None)
|
|
1139
1190
|
report_data = run_pipeline(opts, summarizer, log=log_fn)
|
|
1140
1191
|
|
|
1141
1192
|
reports_dir = Path("reports")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: git2report
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: Turn Git history into a plain-language, evidence-linked progress report with visual charts and Terminal Web Studio.
|
|
5
5
|
Author-email: Vijay <vijaykd04@users.noreply.github.com>
|
|
6
6
|
License: MIT
|
|
@@ -31,21 +31,42 @@ Dynamic: license-file
|
|
|
31
31
|
|
|
32
32
|
# Git2Report
|
|
33
33
|
|
|
34
|
+
[](https://pypi.org/project/git2report/)
|
|
35
|
+
[](https://www.python.org/downloads/)
|
|
36
|
+
[](https://opensource.org/licenses/MIT)
|
|
37
|
+
|
|
34
38
|
Turn a Git repository's history into a plain-language weekly progress report, where **every number is
|
|
35
|
-
counted by code** and **every line carries commit IDs as proof**. The AI (optional, local) only writes
|
|
39
|
+
counted by code** and **every line carries commit IDs as proof**. The AI (optional, local Ollama or Google Gemini) only writes
|
|
36
40
|
sentences.
|
|
37
41
|
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## ⚡ Quick 1-Command Run (No Cloning Required!)
|
|
45
|
+
|
|
46
|
+
Anyone with Python can install and run Git2Report globally in one command:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pip install git2report
|
|
50
|
+
git2report --ui
|
|
51
|
+
# Or if your PATH isn't updated:
|
|
52
|
+
python -m git2report --ui
|
|
38
53
|
```
|
|
39
|
-
|
|
54
|
+
|
|
55
|
+
Or run directly without installing using `pipx`:
|
|
56
|
+
```bash
|
|
57
|
+
pipx run git2report --ui
|
|
40
58
|
```
|
|
41
59
|
|
|
42
|
-
|
|
60
|
+
---
|
|
43
61
|
|
|
44
|
-
|
|
62
|
+
## Install for Development
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
git clone https://github.com/vijaykd04/Git2Report.git
|
|
66
|
+
cd Git2Report
|
|
45
67
|
python -m venv .venv
|
|
46
68
|
.venv\Scripts\activate # Windows (Linux/macOS: source .venv/bin/activate)
|
|
47
|
-
pip install -e ".[dev]" #
|
|
48
|
-
pip install -e ".[ollama]" # only if you want AI sentences (also install Ollama from ollama.com)
|
|
69
|
+
pip install -e ".[dev]" # includes test suite
|
|
49
70
|
```
|
|
50
71
|
|
|
51
72
|
## Use
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "git2report"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.1"
|
|
8
8
|
description = "Turn Git history into a plain-language, evidence-linked progress report with visual charts and Terminal Web Studio."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
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
|