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.
@@ -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
@@ -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>