grave-cli 2.4.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.
- grave_cli-2.4.0/.gitignore +31 -0
- grave_cli-2.4.0/.python-version +1 -0
- grave_cli-2.4.0/PKG-INFO +405 -0
- grave_cli-2.4.0/README.md +380 -0
- grave_cli-2.4.0/grave/__init__.py +3 -0
- grave_cli-2.4.0/grave/__main__.py +6 -0
- grave_cli-2.4.0/grave/api.py +341 -0
- grave_cli-2.4.0/grave/cli.py +1533 -0
- grave_cli-2.4.0/grave/db.py +552 -0
- grave_cli-2.4.0/grave/display.py +233 -0
- grave_cli-2.4.0/grave/presets.py +328 -0
- grave_cli-2.4.0/grave.png +0 -0
- grave_cli-2.4.0/pyproject.toml +72 -0
- grave_cli-2.4.0/uv.lock +90 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
venv/
|
|
3
|
+
.venv/
|
|
4
|
+
__pycache__/
|
|
5
|
+
*.egg-info/
|
|
6
|
+
.eggs/
|
|
7
|
+
dist/
|
|
8
|
+
build/
|
|
9
|
+
.ruff_cache/
|
|
10
|
+
*.pyc
|
|
11
|
+
*.pyo
|
|
12
|
+
*.pyd
|
|
13
|
+
.Python
|
|
14
|
+
|
|
15
|
+
# IDE
|
|
16
|
+
.vscode/
|
|
17
|
+
.idea/
|
|
18
|
+
*.swp
|
|
19
|
+
*.swo
|
|
20
|
+
*~
|
|
21
|
+
|
|
22
|
+
# OS
|
|
23
|
+
.DS_Store
|
|
24
|
+
Thumbs.db
|
|
25
|
+
|
|
26
|
+
# uv
|
|
27
|
+
.uv/
|
|
28
|
+
|
|
29
|
+
# Project internals (not for distribution)
|
|
30
|
+
.claude/
|
|
31
|
+
.project/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
grave_cli-2.4.0/PKG-INFO
ADDED
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: grave-cli
|
|
3
|
+
Version: 2.4.0
|
|
4
|
+
Summary: GRAVE — Git Repository Abandonment & Vintage Explorer. Dig up dead, forgotten, and vintage GitHub repositories.
|
|
5
|
+
Project-URL: Homepage, https://github.com/ul0gic/grave
|
|
6
|
+
Project-URL: Repository, https://github.com/ul0gic/grave
|
|
7
|
+
Project-URL: Issues, https://github.com/ul0gic/grave/issues
|
|
8
|
+
Author: ul0gic
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
Keywords: abandoned,archaeology,cli,github,repositories,vintage
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
21
|
+
Classifier: Topic :: Utilities
|
|
22
|
+
Requires-Python: >=3.10
|
|
23
|
+
Requires-Dist: rich>=14.3.2
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
|
|
26
|
+
<p align="center">
|
|
27
|
+
<img src="https://img.shields.io/badge/version-2.4.0-blue?style=flat-square" alt="Version">
|
|
28
|
+
<img src="https://img.shields.io/badge/python-3.10+-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python">
|
|
29
|
+
<img src="https://img.shields.io/badge/built_with-uv-DE5FE9?style=flat-square" alt="uv">
|
|
30
|
+
<img src="https://img.shields.io/badge/linter-ruff-D7FF64?style=flat-square&logo=ruff&logoColor=black" alt="Ruff">
|
|
31
|
+
<img src="https://img.shields.io/badge/terminal-rich-purple?style=flat-square" alt="Rich">
|
|
32
|
+
<img src="https://img.shields.io/badge/db-SQLite-003B57?style=flat-square&logo=sqlite&logoColor=white" alt="SQLite">
|
|
33
|
+
<img src="https://img.shields.io/badge/api-GitHub_CLI-181717?style=flat-square&logo=github&logoColor=white" alt="GitHub CLI">
|
|
34
|
+
<img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="MIT License">
|
|
35
|
+
</p>
|
|
36
|
+
|
|
37
|
+
<p align="center">
|
|
38
|
+
<img src="grave.png" alt="GRAVE — Git Repository Abandonment & Vintage Explorer" width="600">
|
|
39
|
+
</p>
|
|
40
|
+
|
|
41
|
+
<h1 align="center">GRAVE</h1>
|
|
42
|
+
<h3 align="center">Git Repository Abandonment & Vintage Explorer</h3>
|
|
43
|
+
|
|
44
|
+
<p align="center">
|
|
45
|
+
<em>Dig up dead, forgotten, and vintage GitHub repositories.</em>
|
|
46
|
+
</p>
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
**GRAVE** is a command-line tool for digital archaeology. It searches GitHub for old, weird, abandoned, and forgotten repositories using curated preset profiles and custom queries. Every result is persisted locally in SQLite so you can build your own collection of internet history.
|
|
51
|
+
|
|
52
|
+
## Features
|
|
53
|
+
|
|
54
|
+
- **27 curated presets** across 5 categories (archaeology, dead languages, eras, culture, science)
|
|
55
|
+
- **Era-based search** with named time windows (Y2K, dotcom bubble, Web 2.0, early GitHub)
|
|
56
|
+
- **Smart abandonment filters** (`--abandoned`, `--dead-since`)
|
|
57
|
+
- **Discovery commands** like `grave random` (slot machine) and `grave rabbit-hole` (find similar repos)
|
|
58
|
+
- **Thematic exploration** with `grave morgue` (dead forks) and `grave casket` (archived repos)
|
|
59
|
+
- **SQLite persistence** with automatic deduplication and scan history
|
|
60
|
+
- **Rich terminal UI** with clickable hyperlinks, colored tables, and formatted panels
|
|
61
|
+
- **Export** to JSON, CSV, or NDJSON
|
|
62
|
+
- **Zero token management** — delegates all auth to `gh` CLI
|
|
63
|
+
|
|
64
|
+
## Quick Start
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# Clone and install
|
|
68
|
+
git clone https://github.com/YOUR_USER/grave.git
|
|
69
|
+
cd grave
|
|
70
|
+
uv sync
|
|
71
|
+
|
|
72
|
+
# First-time setup (checks prerequisites)
|
|
73
|
+
uv run grave init
|
|
74
|
+
|
|
75
|
+
# Start digging
|
|
76
|
+
uv run grave scan --preset ancient
|
|
77
|
+
uv run grave random
|
|
78
|
+
uv run grave dig torvalds/linux --open
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Requirements
|
|
82
|
+
|
|
83
|
+
| Dependency | Purpose |
|
|
84
|
+
|---|---|
|
|
85
|
+
| [Python 3.10+](https://python.org) | Runtime |
|
|
86
|
+
| [uv](https://docs.astral.sh/uv/) | Package manager |
|
|
87
|
+
| [gh CLI](https://cli.github.com) | GitHub API access (handles all authentication) |
|
|
88
|
+
|
|
89
|
+
## Installation
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
git clone https://github.com/YOUR_USER/grave.git
|
|
93
|
+
cd grave
|
|
94
|
+
uv sync
|
|
95
|
+
uv run grave init
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
`grave init` will verify your Python version, check that `gh` is installed, and walk you through GitHub authentication if needed.
|
|
99
|
+
|
|
100
|
+
## Architecture
|
|
101
|
+
|
|
102
|
+
```mermaid
|
|
103
|
+
graph LR
|
|
104
|
+
subgraph CLI["grave CLI"]
|
|
105
|
+
SCAN[grave scan]
|
|
106
|
+
DIG[grave dig]
|
|
107
|
+
RANDOM[grave random]
|
|
108
|
+
RABBIT[grave rabbit-hole]
|
|
109
|
+
MORGUE[grave morgue]
|
|
110
|
+
CASKET[grave casket]
|
|
111
|
+
LIST[grave list]
|
|
112
|
+
EXPORT[grave export]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
subgraph Engine["Core Engine"]
|
|
116
|
+
API[api.py<br/>search_repos / get_repo]
|
|
117
|
+
PRESETS[presets.py<br/>27 presets / 5 categories]
|
|
118
|
+
DISPLAY[display.py<br/>Rich tables & panels]
|
|
119
|
+
DB[db.py<br/>SQLite persistence]
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
subgraph External["External"]
|
|
123
|
+
GH[gh CLI]
|
|
124
|
+
GHAPI[GitHub API]
|
|
125
|
+
SQLITE[(~/.local/share/grave/grave.db)]
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
SCAN --> API
|
|
129
|
+
SCAN --> PRESETS
|
|
130
|
+
DIG --> API
|
|
131
|
+
RANDOM --> PRESETS
|
|
132
|
+
RANDOM --> API
|
|
133
|
+
RABBIT --> API
|
|
134
|
+
MORGUE --> API
|
|
135
|
+
CASKET --> API
|
|
136
|
+
|
|
137
|
+
SCAN --> DB
|
|
138
|
+
DIG --> DB
|
|
139
|
+
RANDOM --> DB
|
|
140
|
+
RABBIT --> DB
|
|
141
|
+
MORGUE --> DB
|
|
142
|
+
CASKET --> DB
|
|
143
|
+
LIST --> DB
|
|
144
|
+
EXPORT --> DB
|
|
145
|
+
|
|
146
|
+
SCAN --> DISPLAY
|
|
147
|
+
DIG --> DISPLAY
|
|
148
|
+
RANDOM --> DISPLAY
|
|
149
|
+
LIST --> DISPLAY
|
|
150
|
+
|
|
151
|
+
API --> GH
|
|
152
|
+
GH -->|gh auth| GHAPI
|
|
153
|
+
GH -->|gh search repos| GHAPI
|
|
154
|
+
GH -->|gh api repos/| GHAPI
|
|
155
|
+
DB --> SQLITE
|
|
156
|
+
|
|
157
|
+
style CLI fill:#0d1117,stroke:#3fb950,color:#3fb950
|
|
158
|
+
style Engine fill:#0d1117,stroke:#58a6ff,color:#58a6ff
|
|
159
|
+
style External fill:#0d1117,stroke:#8b949e,color:#8b949e
|
|
160
|
+
|
|
161
|
+
style SCAN fill:#1a2332,stroke:#3fb950,color:#c9d1d9
|
|
162
|
+
style DIG fill:#1a2332,stroke:#3fb950,color:#c9d1d9
|
|
163
|
+
style RANDOM fill:#1a2332,stroke:#3fb950,color:#c9d1d9
|
|
164
|
+
style RABBIT fill:#1a2332,stroke:#3fb950,color:#c9d1d9
|
|
165
|
+
style MORGUE fill:#1a2332,stroke:#3fb950,color:#c9d1d9
|
|
166
|
+
style CASKET fill:#1a2332,stroke:#3fb950,color:#c9d1d9
|
|
167
|
+
style LIST fill:#1a2332,stroke:#3fb950,color:#c9d1d9
|
|
168
|
+
style EXPORT fill:#1a2332,stroke:#3fb950,color:#c9d1d9
|
|
169
|
+
|
|
170
|
+
style API fill:#1a2332,stroke:#58a6ff,color:#c9d1d9
|
|
171
|
+
style PRESETS fill:#1a2332,stroke:#58a6ff,color:#c9d1d9
|
|
172
|
+
style DISPLAY fill:#1a2332,stroke:#58a6ff,color:#c9d1d9
|
|
173
|
+
style DB fill:#1a2332,stroke:#58a6ff,color:#c9d1d9
|
|
174
|
+
|
|
175
|
+
style GH fill:#1a2332,stroke:#8b949e,color:#c9d1d9
|
|
176
|
+
style GHAPI fill:#1a2332,stroke:#8b949e,color:#c9d1d9
|
|
177
|
+
style SQLITE fill:#1a2332,stroke:#8b949e,color:#c9d1d9
|
|
178
|
+
|
|
179
|
+
linkStyle default stroke:#3fb950,stroke-width:1.5px
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
```mermaid
|
|
183
|
+
sequenceDiagram
|
|
184
|
+
box rgb(13,17,23) User
|
|
185
|
+
participant User
|
|
186
|
+
end
|
|
187
|
+
box rgb(26,35,50) grave CLI
|
|
188
|
+
participant CLI as grave CLI
|
|
189
|
+
end
|
|
190
|
+
box rgb(26,35,50) GitHub
|
|
191
|
+
participant Auth as gh auth status
|
|
192
|
+
participant Search as gh search repos
|
|
193
|
+
end
|
|
194
|
+
box rgb(26,35,50) Storage
|
|
195
|
+
participant DB as SQLite
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
User->>CLI: grave scan --preset ancient
|
|
199
|
+
CLI->>Auth: check_gh_auth()
|
|
200
|
+
Auth-->>CLI: authenticated
|
|
201
|
+
CLI->>Search: search_repos(query, limit)
|
|
202
|
+
Search-->>CLI: JSON results
|
|
203
|
+
CLI->>DB: save_scan(query, preset, items)
|
|
204
|
+
CLI-->>User: Rich table output
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Commands
|
|
208
|
+
|
|
209
|
+
### Core Commands
|
|
210
|
+
|
|
211
|
+
| Command | Description |
|
|
212
|
+
|---|---|
|
|
213
|
+
| `grave init` | First-time setup and prerequisite checks |
|
|
214
|
+
| `grave scan` | Search for repos with presets or custom parameters |
|
|
215
|
+
| `grave dig <owner/repo>` | Deep-dive into a specific repository |
|
|
216
|
+
| `grave presets` | List all 27 available search presets |
|
|
217
|
+
|
|
218
|
+
### Discovery Commands
|
|
219
|
+
|
|
220
|
+
| Command | Description |
|
|
221
|
+
|---|---|
|
|
222
|
+
| `grave random` | Random preset slot machine — surprise yourself |
|
|
223
|
+
| `grave rabbit-hole <owner/repo>` | Find similar repos by language, era, and topics |
|
|
224
|
+
| `grave morgue` | Search for dead forks and repos with inactive owners |
|
|
225
|
+
| `grave casket` | Find archived, unmaintained, and frozen repositories |
|
|
226
|
+
|
|
227
|
+
### Data Commands
|
|
228
|
+
|
|
229
|
+
| Command | Description |
|
|
230
|
+
|---|---|
|
|
231
|
+
| `grave list` | Browse all collected repos from the database |
|
|
232
|
+
| `grave export` | Export results as JSON, CSV, or NDJSON |
|
|
233
|
+
| `grave db stats` | Database statistics and top languages |
|
|
234
|
+
| `grave db path` | Print database file path |
|
|
235
|
+
| `grave db clear` | Clear database (requires `--confirm`) |
|
|
236
|
+
| `grave db vacuum` | Compact the database file |
|
|
237
|
+
|
|
238
|
+
## Usage Examples
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
# Preset search
|
|
242
|
+
grave scan --preset ancient
|
|
243
|
+
grave scan --preset dead-lang-cobol --limit 50
|
|
244
|
+
grave scan --preset flash-rip
|
|
245
|
+
|
|
246
|
+
# Era-based search
|
|
247
|
+
grave scan --era y2k --keyword web
|
|
248
|
+
grave scan --era dotcom --language Java
|
|
249
|
+
|
|
250
|
+
# Find abandoned repos
|
|
251
|
+
grave scan --keyword python --abandoned 10
|
|
252
|
+
grave scan --dead-since 2015 --language Ruby
|
|
253
|
+
|
|
254
|
+
# Custom search
|
|
255
|
+
grave scan --keyword "neural network" --created "2008-01-01..2012-12-31"
|
|
256
|
+
grave scan --keyword fractal --stars ">50" --language Python
|
|
257
|
+
|
|
258
|
+
# Deep dive
|
|
259
|
+
grave dig torvalds/linux
|
|
260
|
+
grave dig microsoft/MS-DOS --open # opens in browser
|
|
261
|
+
grave dig rails/rails --json
|
|
262
|
+
|
|
263
|
+
# Discovery
|
|
264
|
+
grave random
|
|
265
|
+
grave rabbit-hole torvalds/linux
|
|
266
|
+
grave morgue --limit 50
|
|
267
|
+
grave casket --language Python
|
|
268
|
+
|
|
269
|
+
# Browse your collection
|
|
270
|
+
grave list
|
|
271
|
+
grave list --language Fortran --stars ">10"
|
|
272
|
+
grave list --preset ancient --json
|
|
273
|
+
|
|
274
|
+
# Export
|
|
275
|
+
grave export --preset ancient --format json
|
|
276
|
+
grave export --from-db --language Python --format csv
|
|
277
|
+
grave export --from-db --format ndjson > repos.ndjson
|
|
278
|
+
|
|
279
|
+
# Filter presets by category
|
|
280
|
+
grave presets --category dead-languages
|
|
281
|
+
grave presets --category archaeology
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Presets
|
|
285
|
+
|
|
286
|
+
27 curated presets across 5 categories:
|
|
287
|
+
|
|
288
|
+
### Archaeology
|
|
289
|
+
| Preset | Description |
|
|
290
|
+
|---|---|
|
|
291
|
+
| `ancient` | GitHub's earliest repos (2008-2010) |
|
|
292
|
+
| `forgotten` | Old repos with few stars, untouched for 5+ years |
|
|
293
|
+
| `graveyard` | Archived and deprecated projects |
|
|
294
|
+
| `one-commit` | Repos with minimal activity, frozen in time |
|
|
295
|
+
| `abandoned-10y` | Repos untouched for 10+ years |
|
|
296
|
+
| `dotfiles-ancient` | The earliest dotfiles and system configs |
|
|
297
|
+
|
|
298
|
+
### Dead Languages
|
|
299
|
+
| Preset | Description |
|
|
300
|
+
|---|---|
|
|
301
|
+
| `dead-lang` | Fortran projects |
|
|
302
|
+
| `dead-lang-perl` | Perl relics from the CGI era |
|
|
303
|
+
| `dead-lang-pascal` | Pascal and Delphi survivors |
|
|
304
|
+
| `dead-lang-cobol` | COBOL: the language that won't die |
|
|
305
|
+
| `dead-lang-tcl` | Tcl/Tk scripts from a bygone era |
|
|
306
|
+
| `dead-lang-smalltalk` | Smalltalk: OOP's grandparent |
|
|
307
|
+
| `flash-rip` | Flash/ActionScript projects (RIP 2020) |
|
|
308
|
+
|
|
309
|
+
### Eras
|
|
310
|
+
| Preset | Description |
|
|
311
|
+
|---|---|
|
|
312
|
+
| `y2k-web` | Y2K-era web tools and relics |
|
|
313
|
+
| `pre-npm` | JavaScript before npm (2008-2011) |
|
|
314
|
+
| `pre-docker` | Infrastructure before containers |
|
|
315
|
+
| `pre-git` | CVS/SVN migration tools and relics |
|
|
316
|
+
| `homebrew-fossils` | Early macOS/Homebrew era tools |
|
|
317
|
+
|
|
318
|
+
### Culture
|
|
319
|
+
| Preset | Description |
|
|
320
|
+
|---|---|
|
|
321
|
+
| `digital-utopia` | Digital democracy and virtual world experiments |
|
|
322
|
+
| `cyber-relics` | Early internet culture and cyberspace projects |
|
|
323
|
+
| `irc-era` | IRC bots, clients, and scripts |
|
|
324
|
+
| `myspace-era` | Social network widgets and MySpace-era tools |
|
|
325
|
+
| `sourceforge-refugees` | Projects migrated from SourceForge |
|
|
326
|
+
| `bbs-era` | Bulletin board systems and BBS door games |
|
|
327
|
+
| `crypto-og` | Early blockchain and cryptocurrency (2009-2013) |
|
|
328
|
+
|
|
329
|
+
### Science
|
|
330
|
+
| Preset | Description |
|
|
331
|
+
|---|---|
|
|
332
|
+
| `weird-science` | Experimental science and simulation projects |
|
|
333
|
+
| `academic` | Thesis projects and academic research code |
|
|
334
|
+
|
|
335
|
+
## Project Structure
|
|
336
|
+
|
|
337
|
+
```
|
|
338
|
+
grave/
|
|
339
|
+
├── grave/ # Python package
|
|
340
|
+
│ ├── __init__.py # Version: 2.4.0
|
|
341
|
+
│ ├── __main__.py # python -m grave support
|
|
342
|
+
│ ├── cli.py # CLI commands and argparse setup
|
|
343
|
+
│ ├── api.py # GitHub API client (gh CLI wrapper)
|
|
344
|
+
│ ├── presets.py # 27 curated search presets
|
|
345
|
+
│ ├── display.py # Rich terminal output formatting
|
|
346
|
+
│ └── db.py # SQLite persistence layer
|
|
347
|
+
├── pyproject.toml # Package config, dependencies, ruff rules
|
|
348
|
+
├── uv.lock # Locked dependency versions
|
|
349
|
+
├── .python-version # Python version for uv
|
|
350
|
+
├── .gitignore
|
|
351
|
+
└── README.md
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
## Tech Stack
|
|
355
|
+
|
|
356
|
+
| Layer | Technology | Why |
|
|
357
|
+
|---|---|---|
|
|
358
|
+
| Language | Python 3.10+ | Rich ecosystem, sqlite3 stdlib, I/O bound workload |
|
|
359
|
+
| Package Manager | uv | Fast, modern, handles Python versions |
|
|
360
|
+
| Build Backend | hatchling | Simple, standards-compliant |
|
|
361
|
+
| Terminal UI | rich | Tables, panels, clickable links, color |
|
|
362
|
+
| Database | sqlite3 (stdlib) | Zero dependencies, local persistence |
|
|
363
|
+
| GitHub API | gh CLI (subprocess) | Handles auth, tokens, rate limits for us |
|
|
364
|
+
| Linter | ruff | Fast, strict (13 rule sets enabled) |
|
|
365
|
+
|
|
366
|
+
## Data Storage
|
|
367
|
+
|
|
368
|
+
All data is stored locally following the [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/latest/):
|
|
369
|
+
|
|
370
|
+
```
|
|
371
|
+
~/.local/share/grave/
|
|
372
|
+
└── grave.db # SQLite database
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
Override with `$XDG_DATA_HOME`:
|
|
376
|
+
```bash
|
|
377
|
+
XDG_DATA_HOME=/custom/path grave list
|
|
378
|
+
# Database at /custom/path/grave/grave.db
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
## Development
|
|
382
|
+
|
|
383
|
+
```bash
|
|
384
|
+
# Install dependencies
|
|
385
|
+
uv sync
|
|
386
|
+
|
|
387
|
+
# Run linting (13 ruff rule sets)
|
|
388
|
+
uv run ruff check .
|
|
389
|
+
|
|
390
|
+
# Run the tool
|
|
391
|
+
uv run grave --help
|
|
392
|
+
|
|
393
|
+
# Build check (run after every change)
|
|
394
|
+
uv sync && uv run ruff check . && uv run grave --help
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
## License
|
|
398
|
+
|
|
399
|
+
MIT
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
<p align="center">
|
|
404
|
+
<sub>Built for digital archaeologists, internet historians, and anyone who wonders what GitHub looked like in 2008.</sub>
|
|
405
|
+
</p>
|