runr-ai 0.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.
@@ -0,0 +1,35 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ dist/
5
+ build/
6
+ .eggs/
7
+ *.egg
8
+
9
+ # virtual envs
10
+ .venv/
11
+ .runr_env/
12
+ env/
13
+ venv/
14
+
15
+ # runr cache/logs (user-local)
16
+ .runr_resolved_requirements.txt
17
+
18
+ # IDE
19
+ .vscode/
20
+ .idea/
21
+ *.swp
22
+ *.swo
23
+
24
+ # OS
25
+ .DS_Store
26
+ Thumbs.db
27
+
28
+ # Claude Code local settings
29
+ .claude/
30
+
31
+ # pytest
32
+ .pytest_cache/
33
+ .mypy_cache/
34
+ htmlcov/
35
+ .coverage
runr_ai-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,178 @@
1
+ Metadata-Version: 2.4
2
+ Name: runr-ai
3
+ Version: 0.1.0
4
+ Summary: Automatically set up and run any GitHub repository using AI-powered dependency resolution
5
+ Project-URL: Homepage, https://wasifAhmed1917.github.io/runr
6
+ Project-URL: Repository, https://github.com/WasifAhmed1917/runr
7
+ Author-email: Wasif Ahmed <wasif.ahmed1687@gmail.com>
8
+ License: MIT
9
+ Keywords: ai,automation,cli,dependency-resolution,github
10
+ Classifier: Development Status :: 3 - Alpha
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Requires-Python: >=3.10
18
+ Requires-Dist: click>=8.1.0
19
+ Requires-Dist: gitpython>=3.1.40
20
+ Requires-Dist: groq>=0.9.0
21
+ Requires-Dist: httpx>=0.27.0
22
+ Requires-Dist: packaging>=24.0
23
+ Requires-Dist: rich>=13.0.0
24
+ Requires-Dist: tomli>=2.0.0; python_version < '3.11'
25
+ Provides-Extra: dev
26
+ Requires-Dist: mypy>=1.9.0; extra == 'dev'
27
+ Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
28
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
29
+ Description-Content-Type: text/markdown
30
+
31
+ # runr
32
+
33
+ > Automatically set up and run any GitHub repository using AI-powered dependency resolution.
34
+
35
+ ```
36
+ runr https://github.com/karpathy/nanoGPT
37
+ ```
38
+
39
+ That's it. runr clones the repo, reads every dependency file, resolves conflicts via an LLM, creates an isolated virtual environment, installs everything, and runs the project โ€” self-healing up to 5 times if anything goes wrong.
40
+
41
+ ---
42
+
43
+ ## Install
44
+
45
+ ```bash
46
+ pip install runr
47
+ # or, for latest:
48
+ pip install git+https://github.com/runr-cli/runr
49
+ ```
50
+
51
+ Requires Python 3.10+. Optionally install **uv** for faster installs:
52
+
53
+ ```bash
54
+ pip install uv
55
+ ```
56
+
57
+ ## Setup
58
+
59
+ Set your Groq API key (get one free at [console.groq.com](https://console.groq.com)):
60
+
61
+ ```bash
62
+ export GROQ_API_KEY=gsk_...
63
+ ```
64
+
65
+ ## Usage
66
+
67
+ ```bash
68
+ # Run a GitHub repo
69
+ runr https://github.com/karpathy/nanoGPT
70
+
71
+ # Run a local repo
72
+ runr ./my_local_project
73
+
74
+ # Force Python version
75
+ runr https://github.com/user/repo --python 3.11
76
+
77
+ # CPU-only (skip CUDA deps)
78
+ runr https://github.com/user/repo --no-gpu
79
+
80
+ # Preview plan without running
81
+ runr https://github.com/user/repo --dry-run
82
+
83
+ # Override entry point
84
+ runr https://github.com/user/repo --entry src/train.py
85
+
86
+ # Verbose (shows install logs + resolved requirements)
87
+ runr https://github.com/user/repo --verbose
88
+
89
+ # Private repo
90
+ runr https://github.com/org/private-repo --token ghp_...
91
+ # or set GITHUB_TOKEN env var
92
+ ```
93
+
94
+ ## What happens
95
+
96
+ ```
97
+ โ—† runr v0.1.0
98
+
99
+ โ— Cloning karpathy/nanoGPT... โœ“ (2.3s)
100
+ โ— Detecting dependencies... โœ“ 14 imports detected, 2 dep files
101
+ โ— Environment: Python 3.11.9, Darwin arm64, CPU only
102
+ โ— Resolving conflicts... โœ“ 12 packages resolved
103
+ โ— Creating environment & installing...โœ“ installed via uv in 18.4s
104
+ โ— Entry point: python train.py
105
+
106
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
107
+ [live repo output streams here]
108
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
109
+
110
+ โœ“ Successfully completed after 1 attempt(s)
111
+ ```
112
+
113
+ If the run fails, runr self-heals:
114
+
115
+ ```
116
+ โœ— Run failed (attempt 1/5)
117
+ Error: No module named 'flash_attn'
118
+
119
+ โ—† Healing...
120
+ โ†’ pip install flash-attn==2.3.0
121
+ Installing flash-attn compatible with CUDA 12.1
122
+
123
+ โœ“ Fix applied
124
+ โ— Retrying... โœ“ Success
125
+ ```
126
+
127
+ ## How it works
128
+
129
+ | Step | Module | What it does |
130
+ |------|--------|-------------|
131
+ | Clone | `cli.py` | Clones to a temp directory; never touches your original files |
132
+ | Detect | `detector.py` | Reads requirements.txt, setup.py, pyproject.toml, environment.yml, Dockerfile, scans .py imports |
133
+ | Resolve | `resolver.py` | Sends everything to Groq `llama-3.3-70b-versatile`; gets back a pinned requirements.txt |
134
+ | Install | `installer.py` | Creates venv via `uv venv` (falls back to `python -m venv`), installs pinned deps |
135
+ | Run | `runner.py` | Streams live output; on failure passes error to healer |
136
+ | Heal | `healer.py` | LLM returns a structured fix: install package / modify file / set env var |
137
+
138
+ ## Caching
139
+
140
+ Resolved requirements are cached in `~/.runr/cache/` keyed by a SHA-256 hash of all dependency files. Same repo + same deps = instant resolution skip. Use `--no-cache` to force a fresh resolve.
141
+
142
+ ## Logs
143
+
144
+ Full logs are written to `~/.runr/logs/<repo>_<timestamp>.log`.
145
+
146
+ ## Environment detection
147
+
148
+ runr automatically detects:
149
+ - Python version and OS/arch
150
+ - CUDA version (`nvcc --version`, `nvidia-smi`)
151
+ - GPU presence
152
+ - Already-installed packages (avoids re-pinning what's there)
153
+
154
+ ## Supported dependency files
155
+
156
+ - `requirements.txt`
157
+ - `requirements-dev.txt`
158
+ - `setup.py`
159
+ - `setup.cfg`
160
+ - `pyproject.toml`
161
+ - `environment.yml` (conda)
162
+ - `Dockerfile` (extracts `RUN pip install` lines)
163
+ - Implicit imports scanned from all `.py` files
164
+
165
+ ## Error handling
166
+
167
+ | Error | How runr handles it |
168
+ |-------|---------------------|
169
+ | torch CUDA mismatch | Detects CUDA version, installs correct `+cu*` build |
170
+ | Package not on PyPI | LLM skips or finds alternative |
171
+ | Python version mismatch | Reads `requires-python`, suggests correct version |
172
+ | Missing system deps | Prints human-readable install instructions |
173
+ | Private repo | Prompts for `--token` or `GITHUB_TOKEN` |
174
+ | Notebook-only repo | Launches `jupyter notebook` |
175
+
176
+ ## License
177
+
178
+ MIT
@@ -0,0 +1,148 @@
1
+ # runr
2
+
3
+ > Automatically set up and run any GitHub repository using AI-powered dependency resolution.
4
+
5
+ ```
6
+ runr https://github.com/karpathy/nanoGPT
7
+ ```
8
+
9
+ That's it. runr clones the repo, reads every dependency file, resolves conflicts via an LLM, creates an isolated virtual environment, installs everything, and runs the project โ€” self-healing up to 5 times if anything goes wrong.
10
+
11
+ ---
12
+
13
+ ## Install
14
+
15
+ ```bash
16
+ pip install runr
17
+ # or, for latest:
18
+ pip install git+https://github.com/runr-cli/runr
19
+ ```
20
+
21
+ Requires Python 3.10+. Optionally install **uv** for faster installs:
22
+
23
+ ```bash
24
+ pip install uv
25
+ ```
26
+
27
+ ## Setup
28
+
29
+ Set your Groq API key (get one free at [console.groq.com](https://console.groq.com)):
30
+
31
+ ```bash
32
+ export GROQ_API_KEY=gsk_...
33
+ ```
34
+
35
+ ## Usage
36
+
37
+ ```bash
38
+ # Run a GitHub repo
39
+ runr https://github.com/karpathy/nanoGPT
40
+
41
+ # Run a local repo
42
+ runr ./my_local_project
43
+
44
+ # Force Python version
45
+ runr https://github.com/user/repo --python 3.11
46
+
47
+ # CPU-only (skip CUDA deps)
48
+ runr https://github.com/user/repo --no-gpu
49
+
50
+ # Preview plan without running
51
+ runr https://github.com/user/repo --dry-run
52
+
53
+ # Override entry point
54
+ runr https://github.com/user/repo --entry src/train.py
55
+
56
+ # Verbose (shows install logs + resolved requirements)
57
+ runr https://github.com/user/repo --verbose
58
+
59
+ # Private repo
60
+ runr https://github.com/org/private-repo --token ghp_...
61
+ # or set GITHUB_TOKEN env var
62
+ ```
63
+
64
+ ## What happens
65
+
66
+ ```
67
+ โ—† runr v0.1.0
68
+
69
+ โ— Cloning karpathy/nanoGPT... โœ“ (2.3s)
70
+ โ— Detecting dependencies... โœ“ 14 imports detected, 2 dep files
71
+ โ— Environment: Python 3.11.9, Darwin arm64, CPU only
72
+ โ— Resolving conflicts... โœ“ 12 packages resolved
73
+ โ— Creating environment & installing...โœ“ installed via uv in 18.4s
74
+ โ— Entry point: python train.py
75
+
76
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
77
+ [live repo output streams here]
78
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
79
+
80
+ โœ“ Successfully completed after 1 attempt(s)
81
+ ```
82
+
83
+ If the run fails, runr self-heals:
84
+
85
+ ```
86
+ โœ— Run failed (attempt 1/5)
87
+ Error: No module named 'flash_attn'
88
+
89
+ โ—† Healing...
90
+ โ†’ pip install flash-attn==2.3.0
91
+ Installing flash-attn compatible with CUDA 12.1
92
+
93
+ โœ“ Fix applied
94
+ โ— Retrying... โœ“ Success
95
+ ```
96
+
97
+ ## How it works
98
+
99
+ | Step | Module | What it does |
100
+ |------|--------|-------------|
101
+ | Clone | `cli.py` | Clones to a temp directory; never touches your original files |
102
+ | Detect | `detector.py` | Reads requirements.txt, setup.py, pyproject.toml, environment.yml, Dockerfile, scans .py imports |
103
+ | Resolve | `resolver.py` | Sends everything to Groq `llama-3.3-70b-versatile`; gets back a pinned requirements.txt |
104
+ | Install | `installer.py` | Creates venv via `uv venv` (falls back to `python -m venv`), installs pinned deps |
105
+ | Run | `runner.py` | Streams live output; on failure passes error to healer |
106
+ | Heal | `healer.py` | LLM returns a structured fix: install package / modify file / set env var |
107
+
108
+ ## Caching
109
+
110
+ Resolved requirements are cached in `~/.runr/cache/` keyed by a SHA-256 hash of all dependency files. Same repo + same deps = instant resolution skip. Use `--no-cache` to force a fresh resolve.
111
+
112
+ ## Logs
113
+
114
+ Full logs are written to `~/.runr/logs/<repo>_<timestamp>.log`.
115
+
116
+ ## Environment detection
117
+
118
+ runr automatically detects:
119
+ - Python version and OS/arch
120
+ - CUDA version (`nvcc --version`, `nvidia-smi`)
121
+ - GPU presence
122
+ - Already-installed packages (avoids re-pinning what's there)
123
+
124
+ ## Supported dependency files
125
+
126
+ - `requirements.txt`
127
+ - `requirements-dev.txt`
128
+ - `setup.py`
129
+ - `setup.cfg`
130
+ - `pyproject.toml`
131
+ - `environment.yml` (conda)
132
+ - `Dockerfile` (extracts `RUN pip install` lines)
133
+ - Implicit imports scanned from all `.py` files
134
+
135
+ ## Error handling
136
+
137
+ | Error | How runr handles it |
138
+ |-------|---------------------|
139
+ | torch CUDA mismatch | Detects CUDA version, installs correct `+cu*` build |
140
+ | Package not on PyPI | LLM skips or finds alternative |
141
+ | Python version mismatch | Reads `requires-python`, suggests correct version |
142
+ | Missing system deps | Prints human-readable install instructions |
143
+ | Private repo | Prompts for `--token` or `GITHUB_TOKEN` |
144
+ | Notebook-only repo | Launches `jupyter notebook` |
145
+
146
+ ## License
147
+
148
+ MIT
File without changes
@@ -0,0 +1,249 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>runr</title>
7
+ <meta name="description" content="One command to run any GitHub repo. No setup. No dependency hell." />
8
+ <meta property="og:title" content="runr" />
9
+ <meta property="og:description" content="One command to run any GitHub repo. No setup. No dependency hell." />
10
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
11
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
12
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;600&display=swap" rel="stylesheet" />
13
+ <link rel="stylesheet" href="styles.css" />
14
+ </head>
15
+ <body>
16
+
17
+ <nav>
18
+ <a href="/" class="nav-logo">runr</a>
19
+ <div class="nav-right">
20
+ <a href="https://github.com/WasifAhmed1917/runr" target="_blank" rel="noopener">GitHub</a>
21
+ <a href="https://console.groq.com" target="_blank" rel="noopener" class="nav-cta">Get API key โ†’</a>
22
+ </div>
23
+ </nav>
24
+
25
+ <!-- HERO -->
26
+ <section class="hero">
27
+ <div class="hero-left">
28
+ <div class="eyebrow">Open source ยท v0.1.0</div>
29
+ <h1>Run any GitHub repo.<br />Instantly.</h1>
30
+ <p class="hero-desc">Paste a URL. runr clones it, figures out the dependencies, fixes every conflict with AI, and runs it โ€” healing itself if anything breaks.</p>
31
+ <p class="hero-sub">No more spending an afternoon fighting pip. No more mismatched CUDA versions. No more README lies.</p>
32
+
33
+ <div class="hero-actions">
34
+ <div class="install-line">
35
+ <code>pip install runr</code>
36
+ <button onclick="copyCmd(this, 'pip install runr')" class="copy">copy</button>
37
+ </div>
38
+ <a href="https://github.com/WasifAhmed1917/runr" target="_blank" rel="noopener" class="gh-btn">
39
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/></svg>
40
+ Star on GitHub
41
+ </a>
42
+ </div>
43
+ </div>
44
+
45
+ <div class="hero-right">
46
+ <div class="terminal">
47
+ <div class="term-bar">
48
+ <div class="dots"><span></span><span></span><span></span></div>
49
+ <span class="term-title">zsh โ€” 80ร—24</span>
50
+ </div>
51
+ <pre class="term-body"><span class="c-dim">$</span> <span class="c-white">runr https://github.com/karpathy/makemore</span>
52
+
53
+ <span class="c-dim"> โ— Cloning karpathy/makemore </span><span class="c-green">โœ“</span>
54
+ <span class="c-dim"> โ— Detecting dependencies </span><span class="c-green">โœ“</span>
55
+ <span class="c-dim"> โ— Resolving via AI </span><span class="c-green">โœ“</span>
56
+ <span class="c-dim"> โ— Installing (uv) </span><span class="c-green">โœ“ 57s</span>
57
+ <span class="c-dim"> โ— Entry point: makemore.py</span>
58
+
59
+ <span class="c-yellow"> โœ— attempt 1 โ€” No module 'tensorboard'</span>
60
+ <span class="c-dim"> โ—† Healing โ†’ pip install tensorboard numpy</span>
61
+ <span class="c-green"> โœ“ Fixed. Retrying...</span>
62
+
63
+ <span class="c-dim"> number of parameters: 0.20M</span>
64
+ <span class="c-dim"> step 0 | loss 3.51</span>
65
+ <span class="c-dim"> step 10 | loss 2.87</span>
66
+ <span class="c-dim"> step 100 | loss 2.52</span>
67
+ <span class="c-dim"> step 500 | loss 2.21</span>
68
+ <span class="c-green"> โœ“ Running โ€” healed in 1 attempt</span></pre>
69
+ </div>
70
+ <p class="term-caption">Real output from a real run. The self-heal on line 8 actually happened.</p>
71
+ </div>
72
+ </section>
73
+
74
+ <div class="full-divider"></div>
75
+
76
+ <!-- PROFILE MODE -->
77
+ <section class="section-split">
78
+ <div class="split-left">
79
+ <div class="tag">New feature</div>
80
+ <h2>Browse any GitHub profile.</h2>
81
+ <p>Pass a username instead of a repo URL. runr fetches all their public projects, shows you a table with stars and language, lets you pick one, and runs it.</p>
82
+ <p>Useful for recruiters reviewing candidates, or developers exploring someone's work without hunting for URLs.</p>
83
+ </div>
84
+ <div class="split-right">
85
+ <div class="terminal">
86
+ <div class="term-bar">
87
+ <div class="dots"><span></span><span></span><span></span></div>
88
+ <span class="term-title">zsh</span>
89
+ </div>
90
+ <pre class="term-body"><span class="c-dim">$</span> <span class="c-white">runr karpathy</span>
91
+
92
+ <span class="c-dim"> Fetching public repos for karpathy...</span>
93
+
94
+ <span class="c-dim"> # Repo โ˜… Lang</span>
95
+ <span class="c-dim"> โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€</span>
96
+ <span class="c-white"> 1 nanoGPT </span><span class="c-yellow">38.2k</span> <span class="c-dim">Python</span>
97
+ <span class="c-white"> 2 makemore </span><span class="c-yellow">10.1k</span> <span class="c-dim">Python</span>
98
+ <span class="c-white"> 3 micrograd </span><span class="c-yellow">9.8k</span> <span class="c-dim">Python</span>
99
+ <span class="c-white"> 4 minGPT </span><span class="c-yellow">8.3k</span> <span class="c-dim">Python</span>
100
+
101
+ Pick (1โ€“4): <span class="c-green">2</span>
102
+
103
+ <span class="c-green"> โ†’ Running makemore...</span></pre>
104
+ </div>
105
+ </div>
106
+ </section>
107
+
108
+ <div class="full-divider"></div>
109
+
110
+ <!-- HOW IT WORKS -->
111
+ <section class="how-section">
112
+ <h2>How it works.</h2>
113
+ <div class="how-grid">
114
+ <div class="how-item">
115
+ <span class="how-num">01</span>
116
+ <div>
117
+ <strong>Clone</strong>
118
+ <p>Into a temp directory. Your machine stays untouched.</p>
119
+ </div>
120
+ </div>
121
+ <div class="how-item">
122
+ <span class="how-num">02</span>
123
+ <div>
124
+ <strong>Read everything</strong>
125
+ <p>requirements.txt, pyproject.toml, setup.py, environment.yml, Dockerfile. Plus scans all .py imports that aren't listed anywhere.</p>
126
+ </div>
127
+ </div>
128
+ <div class="how-item">
129
+ <span class="how-num">03</span>
130
+ <div>
131
+ <strong>Resolve with AI</strong>
132
+ <p>Sends the full dependency graph to Llama 3.3-70B via Groq. Gets back a pinned, compatible requirements.txt. Cached by file hash so the same repo never resolves twice.</p>
133
+ </div>
134
+ </div>
135
+ <div class="how-item">
136
+ <span class="how-num">04</span>
137
+ <div>
138
+ <strong>Install fast</strong>
139
+ <p>Creates an isolated venv via uv โ€” 10ร— faster than pip. Falls back to pip if uv isn't around.</p>
140
+ </div>
141
+ </div>
142
+ <div class="how-item">
143
+ <span class="how-num">05</span>
144
+ <div>
145
+ <strong>Run + self-heal</strong>
146
+ <p>Streams live output. On failure, sends the traceback to the LLM, applies the fix, retries. Up to 5 attempts.</p>
147
+ </div>
148
+ </div>
149
+ </div>
150
+ </section>
151
+
152
+ <div class="full-divider"></div>
153
+
154
+ <!-- EDGE CASES -->
155
+ <section class="edge-section">
156
+ <h2>The annoying stuff, handled.</h2>
157
+ <div class="edge-grid">
158
+ <div class="edge-item">
159
+ <strong>CUDA version mismatches</strong>
160
+ <p>Detects your CUDA version via nvcc and nvidia-smi. Picks the right torch build and index URL automatically.</p>
161
+ </div>
162
+ <div class="edge-item">
163
+ <strong>Undeclared imports</strong>
164
+ <p>Scans every .py file for imports not listed in any requirements file. Includes them in the resolve step.</p>
165
+ </div>
166
+ <div class="edge-item">
167
+ <strong>Conda environments</strong>
168
+ <p>If environment.yml exists, uses conda or mamba instead of pip.</p>
169
+ </div>
170
+ <div class="edge-item">
171
+ <strong>Notebook repos</strong>
172
+ <p>No Python entry point found? Launches jupyter notebook instead of erroring out.</p>
173
+ </div>
174
+ <div class="edge-item">
175
+ <strong>Private repos</strong>
176
+ <p>Pass --token or set GITHUB_TOKEN. Everything else works the same.</p>
177
+ </div>
178
+ <div class="edge-item">
179
+ <strong>Resolution cache</strong>
180
+ <p>Hashes all dep files. Same repo + same deps = instant skip. --no-cache to force a fresh resolve.</p>
181
+ </div>
182
+ </div>
183
+ </section>
184
+
185
+ <div class="full-divider"></div>
186
+
187
+ <!-- QUICKSTART -->
188
+ <section class="qs-section">
189
+ <div class="qs-inner">
190
+ <h2>Get started.</h2>
191
+ <div class="qs-steps">
192
+ <div class="qs-step">
193
+ <span class="qs-num">1</span>
194
+ <div>
195
+ <p class="qs-label">Get a free Groq key at <a href="https://console.groq.com" target="_blank">console.groq.com</a></p>
196
+ <div class="code-line">
197
+ <code>export GROQ_API_KEY=gsk_...</code>
198
+ <button onclick="copyCmd(this, 'export GROQ_API_KEY=gsk_...')" class="copy">copy</button>
199
+ </div>
200
+ </div>
201
+ </div>
202
+ <div class="qs-step">
203
+ <span class="qs-num">2</span>
204
+ <div>
205
+ <p class="qs-label">Install runr</p>
206
+ <div class="code-line">
207
+ <code>pip install runr</code>
208
+ <button onclick="copyCmd(this, 'pip install runr')" class="copy">copy</button>
209
+ </div>
210
+ </div>
211
+ </div>
212
+ <div class="qs-step">
213
+ <span class="qs-num">3</span>
214
+ <div>
215
+ <p class="qs-label">Run any repo or browse a profile</p>
216
+ <div class="code-line">
217
+ <code>runr https://github.com/karpathy/nanoGPT</code>
218
+ <button onclick="copyCmd(this, 'runr https://github.com/karpathy/nanoGPT')" class="copy">copy</button>
219
+ </div>
220
+ <div class="code-line" style="margin-top:8px">
221
+ <code>runr karpathy</code>
222
+ <button onclick="copyCmd(this, 'runr karpathy')" class="copy">copy</button>
223
+ </div>
224
+ </div>
225
+ </div>
226
+ </div>
227
+ </div>
228
+ </section>
229
+
230
+ <div class="full-divider"></div>
231
+
232
+ <footer>
233
+ <span class="foot-logo">runr</span>
234
+ <span>MIT License ยท Open source</span>
235
+ <a href="https://github.com/WasifAhmed1917/runr" target="_blank" rel="noopener">GitHub โ†’</a>
236
+ </footer>
237
+
238
+ <script>
239
+ function copyCmd(btn, text) {
240
+ navigator.clipboard.writeText(text).then(() => {
241
+ const orig = btn.textContent;
242
+ btn.textContent = 'copied!';
243
+ btn.classList.add('copied');
244
+ setTimeout(() => { btn.textContent = orig; btn.classList.remove('copied'); }, 2000);
245
+ });
246
+ }
247
+ </script>
248
+ </body>
249
+ </html>