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.
Files changed (67) hide show
  1. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/CHANGELOG.md +33 -1
  2. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/PKG-INFO +10 -9
  3. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/README.md +9 -8
  4. diffly_cli-1.1.0/assets/logo-v2.svg +35 -0
  5. diffly_cli-1.1.0/assets/logo.png +0 -0
  6. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/phase-2-contract.md +1 -1
  7. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/pyproject.toml +1 -1
  8. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/__init__.py +1 -1
  9. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/cli.py +208 -60
  10. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/diffparse.py +27 -8
  11. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/explainer.py +67 -3
  12. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/github.py +23 -1
  13. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/triage.py +77 -26
  14. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/tests/test_explainer.py +7 -5
  15. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/tests/test_local.py +4 -4
  16. diffly_cli-1.1.0/tests/test_regressions.py +511 -0
  17. diffly_cli-1.1.0/tests/test_triage.py +160 -0
  18. diffly_cli-0.4.0/assets/logo.png +0 -0
  19. diffly_cli-0.4.0/tests/test_regressions.py +0 -212
  20. diffly_cli-0.4.0/tests/test_triage.py +0 -74
  21. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/.github/workflows/ci.yml +0 -0
  22. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/.github/workflows/example-diffly.yml +0 -0
  23. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/.github/workflows/publish.yml +0 -0
  24. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/.gitignore +0 -0
  25. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/CONTRIBUTING.md +0 -0
  26. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/LICENSE +0 -0
  27. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/SECURITY.md +0 -0
  28. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/action/format_comment.py +0 -0
  29. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/action/post_comment.py +0 -0
  30. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/action.yml +0 -0
  31. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/diffly-cli-demo.gif +0 -0
  32. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/real-captures/kubernetes-141413.ansi +0 -0
  33. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/real-captures/ruff-27808.ansi +0 -0
  34. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/real-captures/vscode-330848.ansi +0 -0
  35. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/screenshots/kubernetes-141413.png +0 -0
  36. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/screenshots/ruff-27808.png +0 -0
  37. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/assets/screenshots/vscode-330848.png +0 -0
  38. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/demo/kubernetes-141413-phase2.md +0 -0
  39. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/demo/kubernetes-141413.md +0 -0
  40. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/demo/ruff-27808-phase2.md +0 -0
  41. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/demo/ruff-27808.md +0 -0
  42. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/demo/vscode-330848.md +0 -0
  43. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/audit-report.md +0 -0
  44. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/benchmarks.md +0 -0
  45. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/launch/reddit-opensource.md +0 -0
  46. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/launch/reddit-programming.md +0 -0
  47. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/launch/show-hn.md +0 -0
  48. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/launch/x-thread.md +0 -0
  49. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/live-model-catalog.json +0 -0
  50. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/phase-0-research.md +0 -0
  51. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/docs/visual-verification.md +0 -0
  52. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/homebrew/diffly-cli.rb +0 -0
  53. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/install.sh +0 -0
  54. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/scripts/capture_real_sessions.sh +0 -0
  55. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/scripts/discover_benchmarks.py +0 -0
  56. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/scripts/render_real_captures.py +0 -0
  57. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/scripts/run_benchmarks.py +0 -0
  58. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/scripts/validate_action.py +0 -0
  59. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/scripts/write_benchmarks_doc.py +0 -0
  60. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/__main__.py +0 -0
  61. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/astmap.py +0 -0
  62. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/local.py +0 -0
  63. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/models.py +0 -0
  64. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/redact.py +0 -0
  65. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/src/diffly_cli/update.py +0 -0
  66. {diffly_cli-0.4.0 → diffly_cli-1.1.0}/tests/test_action.py +0 -0
  67. {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
- ## [Unreleased]
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: 0.4.0
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.png" alt="diffly logo" width="140">
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-v0.4.0-blue?style=for-the-badge" alt="Release"></a>
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 the PR touches authentication, credentials, secrets, or security-sensitive files. |
286
- | **QUARANTINE** | Database schema/migrations, dependency changes, missing obvious test coverage for production files, or unavailable/pending checks. |
287
- | **PASS** | No rule fired and observed checks passed. `SHIP` remains accepted as a legacy alias. |
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
- Deliberately conservative: a verdict is a review gate, not a claim that a PR is correct or safe in every context.
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
- The Phase 2 explainer requires an OpenAI-compatible API key and never influences the verdict. 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). Unavailable checks are quarantined rather than assumed passing. Model context is bounded and may truncate on very large PRs.
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.png" alt="diffly logo" width="140">
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-v0.4.0-blue?style=for-the-badge" alt="Release"></a>
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 the PR touches authentication, credentials, secrets, or security-sensitive files. |
157
- | **QUARANTINE** | Database schema/migrations, dependency changes, missing obvious test coverage for production files, or unavailable/pending checks. |
158
- | **PASS** | No rule fired and observed checks passed. `SHIP` remains accepted as a legacy alias. |
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
- Deliberately conservative: a verdict is a review gate, not a claim that a PR is correct or safe in every context.
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
- The Phase 2 explainer requires an OpenAI-compatible API key and never influences the verdict. 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). Unavailable checks are quarantined rather than assumed passing. Model context is bounded and may truncate on very large PRs.
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, API failure fallback, deterministic-verdict immutability, CLI integration, and at least one live public pull-request explanation are verified.
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.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "diffly-cli"
7
- version = "0.4.0"
7
+ version = "1.1.0"
8
8
  description = "Deterministic triage for large GitHub pull requests"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1,3 +1,3 @@
1
1
  """Deterministic triage for large GitHub pull requests."""
2
2
 
3
- __version__ = "0.4.0"
3
+ __version__ = "1.1.0"