diffly-cli 0.4.0__tar.gz → 1.1.0__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.
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/CHANGELOG.md +33 -1
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/PKG-INFO +10 -9
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/README.md +9 -8
- diffly_cli-1.1.0/assets/logo-v2.svg +35 -0
- diffly_cli-1.1.0/assets/logo.png +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/phase-2-contract.md +1 -1
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/pyproject.toml +1 -1
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/__init__.py +1 -1
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/cli.py +208 -60
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/diffparse.py +27 -8
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/explainer.py +67 -3
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/github.py +23 -1
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/triage.py +77 -26
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/tests/test_explainer.py +7 -5
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/tests/test_local.py +4 -4
- diffly_cli-1.1.0/tests/test_regressions.py +511 -0
- diffly_cli-1.1.0/tests/test_triage.py +160 -0
- diffly_cli-0.4.0/assets/logo.png +0 -0
- diffly_cli-0.4.0/tests/test_regressions.py +0 -212
- diffly_cli-0.4.0/tests/test_triage.py +0 -74
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/.github/workflows/ci.yml +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/.github/workflows/example-diffly.yml +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/.github/workflows/publish.yml +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/.gitignore +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/CONTRIBUTING.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/LICENSE +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/SECURITY.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/action/format_comment.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/action/post_comment.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/action.yml +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/diffly-cli-demo.gif +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/real-captures/kubernetes-141413.ansi +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/real-captures/ruff-27808.ansi +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/real-captures/vscode-330848.ansi +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/screenshots/kubernetes-141413.png +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/screenshots/ruff-27808.png +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/screenshots/vscode-330848.png +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/demo/kubernetes-141413-phase2.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/demo/kubernetes-141413.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/demo/ruff-27808-phase2.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/demo/ruff-27808.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/demo/vscode-330848.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/audit-report.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/benchmarks.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/launch/reddit-opensource.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/launch/reddit-programming.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/launch/show-hn.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/launch/x-thread.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/live-model-catalog.json +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/phase-0-research.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/visual-verification.md +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/homebrew/diffly-cli.rb +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/install.sh +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/scripts/capture_real_sessions.sh +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/scripts/discover_benchmarks.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/scripts/render_real_captures.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/scripts/run_benchmarks.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/scripts/validate_action.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/scripts/write_benchmarks_doc.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/__main__.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/astmap.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/local.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/models.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/redact.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/update.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/tests/test_action.py +0 -0
- {diffly_cli-0.4.0 → diffly_cli-1.1.0}/upgrade.sh +0 -0
|
@@ -2,7 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to diffly are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
4
|
|
|
5
|
-
## [
|
|
5
|
+
## [1.1.0] - 2026-08-23
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- Fast keystroke bursts in the interactive review menu register every press: escape sequences stop at their terminator instead of swallowing neighboring keys.
|
|
10
|
+
- Diff content lines beginning with `++` or `--` are counted, scanned for credentials, and analyzed instead of being mistaken for the file's header lines.
|
|
11
|
+
- `diffly setup` no longer runs the update check twice in a row (once in `main()` and again inside the wizard it launches).
|
|
12
|
+
- Pressing an arrow key in the interactive review menu no longer crashes with `NameError: name '_read_escape_sequence' is not defined`; the escape-sequence reader is defined again and a lone Escape still exits without blocking.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
|
|
16
|
+
- Verdicts rebalanced around merge-readiness: pending required checks and version-bump-only manifest edits are now review notes instead of quarantine gates, so healthy pull requests pass.
|
|
17
|
+
- `BLOCK` is reserved for major signals only — failed required checks, or credential-like values added to production code. Credential-like values limited to tests, fixtures, or docs quarantine for confirmation instead of blocking.
|
|
18
|
+
- `QUARANTINE` now targets newly added dependencies; lockfile refreshes and version bumps without new packages stay visible as notes.
|
|
19
|
+
|
|
20
|
+
## [1.0.0] - 2026-08-22
|
|
21
|
+
|
|
22
|
+
Diffly 1.0.0 is the first production-ready release of the deterministic pull-request triage workflow. It stabilizes the command-line experience, interactive review, local analysis, GitHub Action, and explanation behavior around a clear three-outcome policy: healthy pull requests pass, focused review gates quarantine, and severe failures block.
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- Reliable opted-in explanations: Diffly uses the configured AI provider when available and otherwise renders a clearly labelled local explanation from deterministic review facts.
|
|
27
|
+
- Automatic reuse of an authenticated `gh` session when `GITHUB_TOKEN` is not set.
|
|
28
|
+
- A centred terminal experience across the guided wizard, loading transition, interactive review, diagnostics, and focused report.
|
|
29
|
+
- Local analysis, stable JSON output, interactive review, GitHub Action integration, an update workflow, diagnostics, and guided setup as supported 1.0.0 workflows.
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
|
|
33
|
+
- Rebalanced verdicts so `PASS` is the normal healthy outcome. Missing obvious test coverage, unavailable checks, and incomplete repository-tree hints remain visible as review notes instead of automatically forcing `QUARANTINE`.
|
|
34
|
+
- `QUARANTINE` is reserved for concrete review gates: security-sensitive code, database schema or migrations, dependency changes, and pending required checks.
|
|
35
|
+
- `BLOCK` is reserved for failed required checks and high-confidence credential exposure in a changed hunk.
|
|
36
|
+
- The guided prompts and recovery messages now give clearer next steps.
|
|
37
|
+
- Updated Diffly’s visual identity with the refreshed logo and terminal loading mark.
|
|
6
38
|
|
|
7
39
|
### Fixed
|
|
8
40
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: diffly-cli
|
|
3
|
-
Version:
|
|
3
|
+
Version: 1.1.0
|
|
4
4
|
Summary: Deterministic triage for large GitHub pull requests
|
|
5
5
|
Author: Vivaan Dhawan
|
|
6
6
|
License: MIT License — diffly
|
|
@@ -128,7 +128,7 @@ Requires-Dist: pyyaml>=6; extra == 'dev'
|
|
|
128
128
|
Description-Content-Type: text/markdown
|
|
129
129
|
|
|
130
130
|
<p align="center">
|
|
131
|
-
<img src="assets/logo.
|
|
131
|
+
<img src="assets/logo-v2.svg" alt="diffly logo" width="280">
|
|
132
132
|
</p>
|
|
133
133
|
|
|
134
134
|
# ⚡ diffly
|
|
@@ -141,7 +141,7 @@ Description-Content-Type: text/markdown
|
|
|
141
141
|
|
|
142
142
|
<p align="center">
|
|
143
143
|
<a href="https://github.com/VIVAAN-DHAWAN/diffly-cli/actions/workflows/ci.yml"><img src="https://img.shields.io/badge/CI-passing-brightgreen?style=for-the-badge&logo=githubactions" alt="CI"></a>
|
|
144
|
-
<a href="https://github.com/VIVAAN-DHAWAN/diffly-cli/releases/latest"><img src="https://img.shields.io/badge/release-
|
|
144
|
+
<a href="https://github.com/VIVAAN-DHAWAN/diffly-cli/releases/latest"><img src="https://img.shields.io/badge/release-v1.0.0-blue?style=for-the-badge" alt="Release"></a>
|
|
145
145
|
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.10%2B-3776AB?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.10+"></a>
|
|
146
146
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green?style=for-the-badge" alt="License: MIT"></a>
|
|
147
147
|
</p>
|
|
@@ -161,7 +161,6 @@ curl -fsSL https://raw.githubusercontent.com/VIVAAN-DHAWAN/diffly-cli/main/insta
|
|
|
161
161
|
```bash
|
|
162
162
|
pip install diffly-cli
|
|
163
163
|
```
|
|
164
|
-
|
|
165
164
|
**uv**
|
|
166
165
|
```bash
|
|
167
166
|
uv tool install diffly-cli
|
|
@@ -270,6 +269,8 @@ For automation prefer `--json`: successful triage exits `0` regardless of verdic
|
|
|
270
269
|
|
|
271
270
|
### Optional AI explanation
|
|
272
271
|
|
|
272
|
+
Every opted-in explanation is shown in the review. With an AI key, Diffly produces a bounded, redacted AI narrative; without one—or if the provider is unavailable—it creates a clearly labelled local explanation from deterministic review facts instead. Neither path can alter the verdict.
|
|
273
|
+
|
|
273
274
|
```bash
|
|
274
275
|
export DIFFLY_LLM_API_KEY="your-key"
|
|
275
276
|
export DIFFLY_LLM_BASE_URL="https://api.openai.com/v1" # omit for the default endpoint
|
|
@@ -282,11 +283,11 @@ Default model is `gpt-5-mini`; override with `DIFFLY_LLM_MODEL` or `--llm-model`
|
|
|
282
283
|
|
|
283
284
|
| Verdict | Rule |
|
|
284
285
|
| --- | --- |
|
|
285
|
-
| **BLOCK** | A required check failed, or
|
|
286
|
-
| **QUARANTINE** |
|
|
287
|
-
| **PASS** |
|
|
286
|
+
| **BLOCK** | A required check failed, or production code appears to add a credential-like value. |
|
|
287
|
+
| **QUARANTINE** | Security-sensitive code, database schema/migrations, or newly added dependencies need focused review. Credential-like values limited to tests, fixtures, or docs also quarantine rather than block. |
|
|
288
|
+
| **PASS** | Healthy changes, ready to merge. Pending or unavailable checks, version-bump-only manifest edits, and missing obvious tests stay visible as review notes, not gates. `SHIP` remains accepted as a legacy alias. |
|
|
288
289
|
|
|
289
|
-
|
|
290
|
+
`PASS` is the normal healthy outcome. A verdict is a review signal, not a claim that a PR is correct or safe in every context.
|
|
290
291
|
|
|
291
292
|
## Real examples
|
|
292
293
|
|
|
@@ -304,7 +305,7 @@ Live AI-explainer reports (deterministic verdict preserved): [ruff phase 2](demo
|
|
|
304
305
|
|
|
305
306
|
## Current limitations
|
|
306
307
|
|
|
307
|
-
|
|
308
|
+
Tree-sitter parsing covers symbols and direct calls visible in changed hunks, not a full repository-wide call graph. Test-coverage detection is heuristic (filenames + repository tree), so it is presented as a review note rather than a verdict gate. AI model context is bounded and may truncate on very large PRs. A local explanation is used when AI generation is not available.
|
|
308
309
|
|
|
309
310
|
## Roadmap
|
|
310
311
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="assets/logo.
|
|
2
|
+
<img src="assets/logo-v2.svg" alt="diffly logo" width="280">
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
# ⚡ diffly
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
<p align="center">
|
|
14
14
|
<a href="https://github.com/VIVAAN-DHAWAN/diffly-cli/actions/workflows/ci.yml"><img src="https://img.shields.io/badge/CI-passing-brightgreen?style=for-the-badge&logo=githubactions" alt="CI"></a>
|
|
15
|
-
<a href="https://github.com/VIVAAN-DHAWAN/diffly-cli/releases/latest"><img src="https://img.shields.io/badge/release-
|
|
15
|
+
<a href="https://github.com/VIVAAN-DHAWAN/diffly-cli/releases/latest"><img src="https://img.shields.io/badge/release-v1.0.0-blue?style=for-the-badge" alt="Release"></a>
|
|
16
16
|
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/python-3.10%2B-3776AB?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.10+"></a>
|
|
17
17
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green?style=for-the-badge" alt="License: MIT"></a>
|
|
18
18
|
</p>
|
|
@@ -32,7 +32,6 @@ curl -fsSL https://raw.githubusercontent.com/VIVAAN-DHAWAN/diffly-cli/main/insta
|
|
|
32
32
|
```bash
|
|
33
33
|
pip install diffly-cli
|
|
34
34
|
```
|
|
35
|
-
|
|
36
35
|
**uv**
|
|
37
36
|
```bash
|
|
38
37
|
uv tool install diffly-cli
|
|
@@ -141,6 +140,8 @@ For automation prefer `--json`: successful triage exits `0` regardless of verdic
|
|
|
141
140
|
|
|
142
141
|
### Optional AI explanation
|
|
143
142
|
|
|
143
|
+
Every opted-in explanation is shown in the review. With an AI key, Diffly produces a bounded, redacted AI narrative; without one—or if the provider is unavailable—it creates a clearly labelled local explanation from deterministic review facts instead. Neither path can alter the verdict.
|
|
144
|
+
|
|
144
145
|
```bash
|
|
145
146
|
export DIFFLY_LLM_API_KEY="your-key"
|
|
146
147
|
export DIFFLY_LLM_BASE_URL="https://api.openai.com/v1" # omit for the default endpoint
|
|
@@ -153,11 +154,11 @@ Default model is `gpt-5-mini`; override with `DIFFLY_LLM_MODEL` or `--llm-model`
|
|
|
153
154
|
|
|
154
155
|
| Verdict | Rule |
|
|
155
156
|
| --- | --- |
|
|
156
|
-
| **BLOCK** | A required check failed, or
|
|
157
|
-
| **QUARANTINE** |
|
|
158
|
-
| **PASS** |
|
|
157
|
+
| **BLOCK** | A required check failed, or production code appears to add a credential-like value. |
|
|
158
|
+
| **QUARANTINE** | Security-sensitive code, database schema/migrations, or newly added dependencies need focused review. Credential-like values limited to tests, fixtures, or docs also quarantine rather than block. |
|
|
159
|
+
| **PASS** | Healthy changes, ready to merge. Pending or unavailable checks, version-bump-only manifest edits, and missing obvious tests stay visible as review notes, not gates. `SHIP` remains accepted as a legacy alias. |
|
|
159
160
|
|
|
160
|
-
|
|
161
|
+
`PASS` is the normal healthy outcome. A verdict is a review signal, not a claim that a PR is correct or safe in every context.
|
|
161
162
|
|
|
162
163
|
## Real examples
|
|
163
164
|
|
|
@@ -175,7 +176,7 @@ Live AI-explainer reports (deterministic verdict preserved): [ruff phase 2](demo
|
|
|
175
176
|
|
|
176
177
|
## Current limitations
|
|
177
178
|
|
|
178
|
-
|
|
179
|
+
Tree-sitter parsing covers symbols and direct calls visible in changed hunks, not a full repository-wide call graph. Test-coverage detection is heuristic (filenames + repository tree), so it is presented as a review note rather than a verdict gate. AI model context is bounded and may truncate on very large PRs. A local explanation is used when AI generation is not available.
|
|
179
180
|
|
|
180
181
|
## Roadmap
|
|
181
182
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" role="img" aria-labelledby="title description">
|
|
2
|
+
<title id="title">Diffly logo</title>
|
|
3
|
+
<description id="description">A mint hexagonal code-diff mark with plus, slash, and minus symbols.</description>
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="mint" x1="104" y1="88" x2="416" y2="424" gradientUnits="userSpaceOnUse">
|
|
6
|
+
<stop stop-color="#B9FFCB"/>
|
|
7
|
+
<stop offset=".45" stop-color="#68E5A4"/>
|
|
8
|
+
<stop offset="1" stop-color="#2EB67D"/>
|
|
9
|
+
</linearGradient>
|
|
10
|
+
<linearGradient id="core" x1="138" y1="112" x2="375" y2="405" gradientUnits="userSpaceOnUse">
|
|
11
|
+
<stop stop-color="#16211F"/>
|
|
12
|
+
<stop offset="1" stop-color="#0A1114"/>
|
|
13
|
+
</linearGradient>
|
|
14
|
+
<filter id="glow" x="-30%" y="-30%" width="160%" height="160%">
|
|
15
|
+
<feGaussianBlur stdDeviation="5" result="blur"/>
|
|
16
|
+
<feMerge>
|
|
17
|
+
<feMergeNode in="blur"/>
|
|
18
|
+
<feMergeNode in="SourceGraphic"/>
|
|
19
|
+
</feMerge>
|
|
20
|
+
</filter>
|
|
21
|
+
</defs>
|
|
22
|
+
|
|
23
|
+
<path d="M256 52 431 153v206L256 460 81 359V153L256 52Z" fill="#0A1114"/>
|
|
24
|
+
<path d="M256 52 431 153v206L256 460 81 359V153L256 52Z" fill="none" stroke="url(#mint)" stroke-width="18" stroke-linejoin="round"/>
|
|
25
|
+
<path d="M256 91 397 172v168L256 421 115 340V172L256 91Z" fill="url(#core)" stroke="#6FE9AA" stroke-opacity=".56" stroke-width="4" stroke-linejoin="round"/>
|
|
26
|
+
<path d="M256 116 375 185v142L256 396 137 327V185L256 116Z" fill="none" stroke="#B9FFCB" stroke-opacity=".12" stroke-width="2" stroke-linejoin="round"/>
|
|
27
|
+
|
|
28
|
+
<g fill="url(#mint)" filter="url(#glow)">
|
|
29
|
+
<rect x="154" y="215" width="82" height="22" rx="11"/>
|
|
30
|
+
<rect x="184" y="185" width="22" height="82" rx="11"/>
|
|
31
|
+
<rect x="286" y="274" width="72" height="22" rx="11"/>
|
|
32
|
+
<path d="M271 177h25l-58 158h-25l58-158Z"/>
|
|
33
|
+
</g>
|
|
34
|
+
|
|
35
|
+
</svg>
|
|
Binary file
|
|
@@ -28,4 +28,4 @@ The explainer receives PR metadata, deterministic flags and verdict, changed-fil
|
|
|
28
28
|
|
|
29
29
|
## Testing target
|
|
30
30
|
|
|
31
|
-
Phase 2 is complete only when redaction, schema validation, prompt construction,
|
|
31
|
+
Phase 2 is complete only when redaction, schema validation, prompt construction, a clearly labelled local fallback, deterministic-verdict immutability, CLI integration, and at least one live public pull-request explanation are verified.
|