|
1 | 1 | # Graver |
2 | 2 |
|
| 3 | +[](https://github.com/PracticalMind/graver/actions/workflows/ci.yml) |
| 4 | +[](https://pypi.org/project/graver/) |
| 5 | +[](https://pypi.org/project/graver/) |
| 6 | +[](https://opensource.org/licenses/MIT) |
| 7 | + |
3 | 8 | Git-like version control for your LLM prompts. |
4 | 9 |
|
5 | | -Save prompt versions, view history, compare diffs, and roll back — all from Python, with zero external dependencies. |
| 10 | +Save prompt versions, view history, compare diffs, and roll back, all from Python, with zero external dependencies. |
6 | 11 |
|
7 | 12 | ## Why graver? |
8 | 13 |
|
9 | 14 | LLM prompts change constantly. Tracking what changed, when, and which version performed better quickly becomes a mess. |
10 | 15 |
|
11 | 16 | graver solves this: |
12 | | -- Every change is automatically versioned — v1, v2, v3... |
| 17 | +- Every change is automatically versioned - v1, v2, v3... |
13 | 18 | - Roll back to any version instantly |
14 | 19 | - Pin a specific version as your main (canonical) prompt |
15 | 20 | - See exactly what changed between two versions |
@@ -45,7 +50,7 @@ print(p.changes("v1", "v2")) |
45 | 50 |
|
46 | 51 | ## CLI |
47 | 52 |
|
48 | | -The `gr` command lets you use graver directly from the terminal — no Python script needed. Useful for quickly saving files, inspecting version history, or integrating into shell scripts and CI/CD pipelines. |
| 53 | +The `gr` command lets you use graver directly from the terminal, no Python script needed. Useful for quickly saving files, inspecting version history, or integrating into shell scripts and CI/CD pipelines. |
49 | 54 |
|
50 | 55 | ```bash |
51 | 56 | gr list # list all saved prompts |
@@ -117,7 +122,7 @@ Returns the full version history of this prompt, ordered from oldest to newest. |
117 | 122 |
|
118 | 123 | ### `set_main(version) -> None` |
119 | 124 |
|
120 | | -Marks a specific version as the main (canonical) version. The main version does not change automatically when new versions are saved — only when `set_main()` is called again. |
| 125 | +Marks a specific version as the main (canonical) version. The main version does not change automatically when new versions are saved, only when `set_main()` is called again. |
121 | 126 |
|
122 | 127 | | Parameter | Type | Description | |
123 | 128 | |-----------|------|-------------| |
@@ -165,7 +170,7 @@ Returns the raw line-by-line difference between two versions as a dict. Use this |
165 | 170 | | `v1` | `str` | Base version (e.g. `"v1"`). | |
166 | 171 | | `v2` | `str` | Target version (e.g. `"v2"`). | |
167 | 172 |
|
168 | | -**Returns:** Dict with keys `added`, `removed`, `unchanged` — each a list of strings. |
| 173 | +**Returns:** Dict with keys `added`, `removed`, `unchanged`, each a list of strings. |
169 | 174 |
|
170 | 175 | --- |
171 | 176 |
|
@@ -238,7 +243,7 @@ Every `Prompt` writes to a `.graver/` folder in your working directory. |
238 | 243 | } |
239 | 244 | ``` |
240 | 245 |
|
241 | | -Version numbering is automatic: each `save()` call increments the counter. Versions are never overwritten — only explicitly deleted via `delete_version()`. |
| 246 | +Version numbering is automatic: each `save()` call increments the counter. Versions are never overwritten, only explicitly deleted via `delete_version()`. |
242 | 247 |
|
243 | 248 | ## License |
244 | 249 |
|
|
0 commit comments