@leverageaiapps/locus 1.0.3 → 1.0.6
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.
- package/Dockerfile +29 -0
- package/README.md +3 -3
- package/dist/exec.d.ts +20 -0
- package/dist/exec.d.ts.map +1 -0
- package/dist/exec.js +139 -0
- package/dist/exec.js.map +1 -0
- package/dist/pty.d.ts +1 -14
- package/dist/pty.d.ts.map +1 -1
- package/dist/pty.js +15 -136
- package/dist/pty.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +5 -5
- package/dist/session.js.map +1 -1
- package/dist/web-server.d.ts.map +1 -1
- package/dist/web-server.js +104 -32
- package/dist/web-server.js.map +1 -1
- package/docs/CNAME +1 -0
- package/docs/index.html +492 -0
- package/docs/install.sh +329 -0
- package/package.json +7 -5
package/docs/index.html
ADDED
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<title>Locus — Code Anywhere From Your Pocket</title>
|
|
8
|
+
<meta name="description"
|
|
9
|
+
content="Forward your terminal to your mobile device. Access Claude, vim, or any command from your phone.">
|
|
10
|
+
<meta property="og:title" content="Locus — Code Anywhere From Your Pocket">
|
|
11
|
+
<meta property="og:description"
|
|
12
|
+
content="Forward your terminal to your mobile device. One command to start, scan QR to connect.">
|
|
13
|
+
<meta property="og:type" content="website">
|
|
14
|
+
<meta property="og:url" content="https://locus.cool">
|
|
15
|
+
<link rel="icon"
|
|
16
|
+
href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📍</text></svg>">
|
|
17
|
+
<link
|
|
18
|
+
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
|
|
19
|
+
rel="stylesheet">
|
|
20
|
+
<style>
|
|
21
|
+
:root {
|
|
22
|
+
--bg: #0a0a0a;
|
|
23
|
+
--bg-card: #141414;
|
|
24
|
+
--border: #262626;
|
|
25
|
+
--text: #fafafa;
|
|
26
|
+
--text-muted: #a1a1aa;
|
|
27
|
+
--accent: #3b82f6;
|
|
28
|
+
--accent-glow: rgba(59, 130, 246, 0.3);
|
|
29
|
+
--green: #22c55e;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
* {
|
|
33
|
+
margin: 0;
|
|
34
|
+
padding: 0;
|
|
35
|
+
box-sizing: border-box;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
html {
|
|
39
|
+
scroll-behavior: smooth;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
body {
|
|
43
|
+
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
|
|
44
|
+
background: var(--bg);
|
|
45
|
+
color: var(--text);
|
|
46
|
+
line-height: 1.6;
|
|
47
|
+
min-height: 100vh;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.container {
|
|
51
|
+
max-width: 900px;
|
|
52
|
+
margin: 0 auto;
|
|
53
|
+
padding: 0 24px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* Header */
|
|
57
|
+
header {
|
|
58
|
+
padding: 20px 0;
|
|
59
|
+
border-bottom: 1px solid var(--border);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.header-content {
|
|
63
|
+
display: flex;
|
|
64
|
+
justify-content: space-between;
|
|
65
|
+
align-items: center;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.logo {
|
|
69
|
+
font-size: 1.5rem;
|
|
70
|
+
font-weight: 700;
|
|
71
|
+
color: var(--text);
|
|
72
|
+
text-decoration: none;
|
|
73
|
+
display: flex;
|
|
74
|
+
align-items: center;
|
|
75
|
+
gap: 8px;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.nav-links {
|
|
79
|
+
display: flex;
|
|
80
|
+
gap: 24px;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.nav-links a {
|
|
84
|
+
color: var(--text-muted);
|
|
85
|
+
text-decoration: none;
|
|
86
|
+
font-size: 0.95rem;
|
|
87
|
+
transition: color 0.2s;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.nav-links a:hover {
|
|
91
|
+
color: var(--text);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* Hero */
|
|
95
|
+
.hero {
|
|
96
|
+
padding: 100px 0 80px;
|
|
97
|
+
text-align: center;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.hero h1 {
|
|
101
|
+
font-size: clamp(2.5rem, 6vw, 4rem);
|
|
102
|
+
font-weight: 700;
|
|
103
|
+
margin-bottom: 20px;
|
|
104
|
+
letter-spacing: -0.02em;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.hero .tagline {
|
|
108
|
+
font-size: clamp(1.1rem, 2.5vw, 1.35rem);
|
|
109
|
+
color: var(--text-muted);
|
|
110
|
+
max-width: 600px;
|
|
111
|
+
margin: 0 auto 40px;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* Install Box */
|
|
115
|
+
.install-box {
|
|
116
|
+
background: var(--bg-card);
|
|
117
|
+
border: 1px solid var(--border);
|
|
118
|
+
border-radius: 12px;
|
|
119
|
+
padding: 24px;
|
|
120
|
+
max-width: 640px;
|
|
121
|
+
margin: 0 auto 60px;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.install-label {
|
|
125
|
+
font-size: 0.85rem;
|
|
126
|
+
color: var(--text-muted);
|
|
127
|
+
margin-bottom: 12px;
|
|
128
|
+
text-transform: uppercase;
|
|
129
|
+
letter-spacing: 0.05em;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.install-command {
|
|
133
|
+
background: var(--bg);
|
|
134
|
+
border: 1px solid var(--border);
|
|
135
|
+
border-radius: 8px;
|
|
136
|
+
padding: 16px 20px;
|
|
137
|
+
display: flex;
|
|
138
|
+
align-items: center;
|
|
139
|
+
justify-content: space-between;
|
|
140
|
+
gap: 16px;
|
|
141
|
+
margin-bottom: 16px;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.install-command code {
|
|
145
|
+
font-family: 'JetBrains Mono', monospace;
|
|
146
|
+
font-size: 0.95rem;
|
|
147
|
+
color: var(--green);
|
|
148
|
+
white-space: nowrap;
|
|
149
|
+
overflow-x: auto;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.copy-btn {
|
|
153
|
+
background: var(--accent);
|
|
154
|
+
border: none;
|
|
155
|
+
border-radius: 6px;
|
|
156
|
+
padding: 8px 16px;
|
|
157
|
+
color: white;
|
|
158
|
+
font-size: 0.85rem;
|
|
159
|
+
font-weight: 500;
|
|
160
|
+
cursor: pointer;
|
|
161
|
+
transition: all 0.2s;
|
|
162
|
+
flex-shrink: 0;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.copy-btn:hover {
|
|
166
|
+
background: #2563eb;
|
|
167
|
+
transform: translateY(-1px);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.copy-btn.copied {
|
|
171
|
+
background: var(--green);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.install-alt {
|
|
175
|
+
font-size: 0.9rem;
|
|
176
|
+
color: var(--text-muted);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.install-alt code {
|
|
180
|
+
font-family: 'JetBrains Mono', monospace;
|
|
181
|
+
background: var(--bg);
|
|
182
|
+
padding: 2px 6px;
|
|
183
|
+
border-radius: 4px;
|
|
184
|
+
color: var(--text);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* Features */
|
|
188
|
+
.features {
|
|
189
|
+
padding: 60px 0;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.section-title {
|
|
193
|
+
font-size: 0.9rem;
|
|
194
|
+
color: var(--accent);
|
|
195
|
+
text-transform: uppercase;
|
|
196
|
+
letter-spacing: 0.1em;
|
|
197
|
+
margin-bottom: 40px;
|
|
198
|
+
display: flex;
|
|
199
|
+
align-items: center;
|
|
200
|
+
gap: 8px;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.feature-grid {
|
|
204
|
+
display: grid;
|
|
205
|
+
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
|
|
206
|
+
gap: 20px;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
.feature-card {
|
|
210
|
+
background: var(--bg-card);
|
|
211
|
+
border: 1px solid var(--border);
|
|
212
|
+
border-radius: 12px;
|
|
213
|
+
padding: 24px;
|
|
214
|
+
transition: border-color 0.2s, transform 0.2s;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.feature-card:hover {
|
|
218
|
+
border-color: var(--accent);
|
|
219
|
+
transform: translateY(-2px);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.feature-icon {
|
|
223
|
+
font-size: 1.5rem;
|
|
224
|
+
margin-bottom: 12px;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.feature-card h3 {
|
|
228
|
+
font-size: 1.1rem;
|
|
229
|
+
font-weight: 600;
|
|
230
|
+
margin-bottom: 8px;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.feature-card p {
|
|
234
|
+
font-size: 0.95rem;
|
|
235
|
+
color: var(--text-muted);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/* Quick Start */
|
|
239
|
+
.quickstart {
|
|
240
|
+
padding: 60px 0;
|
|
241
|
+
border-top: 1px solid var(--border);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.step-list {
|
|
245
|
+
display: flex;
|
|
246
|
+
flex-direction: column;
|
|
247
|
+
gap: 16px;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
.step {
|
|
251
|
+
display: flex;
|
|
252
|
+
gap: 16px;
|
|
253
|
+
align-items: flex-start;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.step-num {
|
|
257
|
+
width: 32px;
|
|
258
|
+
height: 32px;
|
|
259
|
+
background: var(--accent);
|
|
260
|
+
border-radius: 50%;
|
|
261
|
+
display: flex;
|
|
262
|
+
align-items: center;
|
|
263
|
+
justify-content: center;
|
|
264
|
+
font-weight: 600;
|
|
265
|
+
font-size: 0.9rem;
|
|
266
|
+
flex-shrink: 0;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
.step-content h4 {
|
|
270
|
+
font-size: 1rem;
|
|
271
|
+
font-weight: 600;
|
|
272
|
+
margin-bottom: 4px;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.step-content p {
|
|
276
|
+
color: var(--text-muted);
|
|
277
|
+
font-size: 0.95rem;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.step-content code {
|
|
281
|
+
font-family: 'JetBrains Mono', monospace;
|
|
282
|
+
background: var(--bg-card);
|
|
283
|
+
padding: 2px 6px;
|
|
284
|
+
border-radius: 4px;
|
|
285
|
+
font-size: 0.9rem;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/* Footer */
|
|
289
|
+
footer {
|
|
290
|
+
padding: 40px 0;
|
|
291
|
+
border-top: 1px solid var(--border);
|
|
292
|
+
margin-top: 60px;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.footer-content {
|
|
296
|
+
display: flex;
|
|
297
|
+
justify-content: space-between;
|
|
298
|
+
align-items: center;
|
|
299
|
+
flex-wrap: wrap;
|
|
300
|
+
gap: 16px;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
.footer-links {
|
|
304
|
+
display: flex;
|
|
305
|
+
gap: 24px;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
.footer-links a {
|
|
309
|
+
color: var(--text-muted);
|
|
310
|
+
text-decoration: none;
|
|
311
|
+
font-size: 0.9rem;
|
|
312
|
+
transition: color 0.2s;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.footer-links a:hover {
|
|
316
|
+
color: var(--text);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.footer-copy {
|
|
320
|
+
color: var(--text-muted);
|
|
321
|
+
font-size: 0.85rem;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/* Mobile */
|
|
325
|
+
@media (max-width: 640px) {
|
|
326
|
+
.header-content {
|
|
327
|
+
flex-direction: column;
|
|
328
|
+
gap: 16px;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.hero {
|
|
332
|
+
padding: 60px 0 40px;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.install-command {
|
|
336
|
+
flex-direction: column;
|
|
337
|
+
align-items: stretch;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
.install-command code {
|
|
341
|
+
text-align: center;
|
|
342
|
+
font-size: 0.85rem;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
.copy-btn {
|
|
346
|
+
width: 100%;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.footer-content {
|
|
350
|
+
flex-direction: column;
|
|
351
|
+
text-align: center;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
</style>
|
|
355
|
+
</head>
|
|
356
|
+
|
|
357
|
+
<body>
|
|
358
|
+
<header>
|
|
359
|
+
<div class="container">
|
|
360
|
+
<div class="header-content">
|
|
361
|
+
<a href="/" class="logo">📍 Locus</a>
|
|
362
|
+
<nav class="nav-links">
|
|
363
|
+
<a href="https://github.com/leverageaiapp/Locus">GitHub</a>
|
|
364
|
+
<a href="https://www.npmjs.com/package/@leverageaiapps/locus">npm</a>
|
|
365
|
+
<a href="https://github.com/leverageaiapp/Locus#readme">Docs</a>
|
|
366
|
+
</nav>
|
|
367
|
+
</div>
|
|
368
|
+
</div>
|
|
369
|
+
</header>
|
|
370
|
+
|
|
371
|
+
<main>
|
|
372
|
+
<section class="hero">
|
|
373
|
+
<div class="container">
|
|
374
|
+
<h1>Code Anywhere From Your Pocket</h1>
|
|
375
|
+
<p class="tagline">
|
|
376
|
+
Forward your terminal to your mobile device. Access Claude, vim, or any command-line tool from your
|
|
377
|
+
phone with a single QR scan.
|
|
378
|
+
</p>
|
|
379
|
+
|
|
380
|
+
<div class="install-box">
|
|
381
|
+
<div class="install-label">One-Line Install</div>
|
|
382
|
+
<div class="install-command">
|
|
383
|
+
<code>curl -fsSL https://locus.cool/install.sh | bash</code>
|
|
384
|
+
<button class="copy-btn"
|
|
385
|
+
onclick="copyCommand(this, 'curl -fsSL https://locus.cool/install.sh | bash')">Copy</button>
|
|
386
|
+
</div>
|
|
387
|
+
<p class="install-alt">
|
|
388
|
+
Or via npm: <code>npm install -g @leverageaiapps/locus</code>
|
|
389
|
+
</p>
|
|
390
|
+
</div>
|
|
391
|
+
</div>
|
|
392
|
+
</section>
|
|
393
|
+
|
|
394
|
+
<section class="features">
|
|
395
|
+
<div class="container">
|
|
396
|
+
<div class="section-title">⟩ Features</div>
|
|
397
|
+
<div class="feature-grid">
|
|
398
|
+
<div class="feature-card">
|
|
399
|
+
<div class="feature-icon">🚀</div>
|
|
400
|
+
<h3>Instant Setup</h3>
|
|
401
|
+
<p>One command to start. No account required, no configuration needed.</p>
|
|
402
|
+
</div>
|
|
403
|
+
<div class="feature-card">
|
|
404
|
+
<div class="feature-icon">📱</div>
|
|
405
|
+
<h3>Mobile Access</h3>
|
|
406
|
+
<p>Scan QR code and access your terminal from any device with a browser.</p>
|
|
407
|
+
</div>
|
|
408
|
+
<div class="feature-card">
|
|
409
|
+
<div class="feature-icon">🎙️</div>
|
|
410
|
+
<h3>Voice Input</h3>
|
|
411
|
+
<p>Built-in voice recognition for hands-free coding on the go.</p>
|
|
412
|
+
</div>
|
|
413
|
+
<div class="feature-card">
|
|
414
|
+
<div class="feature-icon">🔒</div>
|
|
415
|
+
<h3>Secure</h3>
|
|
416
|
+
<p>PIN-protected sessions with automatic IP blocking after failed attempts.</p>
|
|
417
|
+
</div>
|
|
418
|
+
<div class="feature-card">
|
|
419
|
+
<div class="feature-icon">🌐</div>
|
|
420
|
+
<h3>No Port Forwarding</h3>
|
|
421
|
+
<p>Built-in Vortex tunnel handles everything. Works behind any firewall.</p>
|
|
422
|
+
</div>
|
|
423
|
+
<div class="feature-card">
|
|
424
|
+
<div class="feature-icon">⚡</div>
|
|
425
|
+
<h3>Real-time</h3>
|
|
426
|
+
<p>WebSocket-based communication for instant, responsive feedback.</p>
|
|
427
|
+
</div>
|
|
428
|
+
</div>
|
|
429
|
+
</div>
|
|
430
|
+
</section>
|
|
431
|
+
|
|
432
|
+
<section class="quickstart">
|
|
433
|
+
<div class="container">
|
|
434
|
+
<div class="section-title">⟩ Quick Start</div>
|
|
435
|
+
<div class="step-list">
|
|
436
|
+
<div class="step">
|
|
437
|
+
<div class="step-num">1</div>
|
|
438
|
+
<div class="step-content">
|
|
439
|
+
<h4>Install Locus</h4>
|
|
440
|
+
<p>Run the one-liner or <code>npm install -g @leverageaiapps/locus</code></p>
|
|
441
|
+
</div>
|
|
442
|
+
</div>
|
|
443
|
+
<div class="step">
|
|
444
|
+
<div class="step-num">2</div>
|
|
445
|
+
<div class="step-content">
|
|
446
|
+
<h4>Start a session</h4>
|
|
447
|
+
<p>Run <code>locus</code> or <code>locus claude</code> to start with a specific command</p>
|
|
448
|
+
</div>
|
|
449
|
+
</div>
|
|
450
|
+
<div class="step">
|
|
451
|
+
<div class="step-num">3</div>
|
|
452
|
+
<div class="step-content">
|
|
453
|
+
<h4>Scan & Connect</h4>
|
|
454
|
+
<p>Scan the QR code with your phone and start coding from anywhere</p>
|
|
455
|
+
</div>
|
|
456
|
+
</div>
|
|
457
|
+
</div>
|
|
458
|
+
</div>
|
|
459
|
+
</section>
|
|
460
|
+
</main>
|
|
461
|
+
|
|
462
|
+
<footer>
|
|
463
|
+
<div class="container">
|
|
464
|
+
<div class="footer-content">
|
|
465
|
+
<div class="footer-links">
|
|
466
|
+
<a href="https://github.com/leverageaiapp/Locus">GitHub</a>
|
|
467
|
+
<a href="https://www.npmjs.com/package/@leverageaiapps/locus">npm</a>
|
|
468
|
+
<a href="https://github.com/leverageaiapp/Locus/issues">Issues</a>
|
|
469
|
+
</div>
|
|
470
|
+
<div class="footer-copy">
|
|
471
|
+
MIT License · Built by <a href="https://github.com/leverageaiapp"
|
|
472
|
+
style="color: var(--accent);">LeverageAI</a>
|
|
473
|
+
</div>
|
|
474
|
+
</div>
|
|
475
|
+
</div>
|
|
476
|
+
</footer>
|
|
477
|
+
|
|
478
|
+
<script>
|
|
479
|
+
function copyCommand(btn, text) {
|
|
480
|
+
navigator.clipboard.writeText(text).then(() => {
|
|
481
|
+
btn.textContent = 'Copied!';
|
|
482
|
+
btn.classList.add('copied');
|
|
483
|
+
setTimeout(() => {
|
|
484
|
+
btn.textContent = 'Copy';
|
|
485
|
+
btn.classList.remove('copied');
|
|
486
|
+
}, 2000);
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
</script>
|
|
490
|
+
</body>
|
|
491
|
+
|
|
492
|
+
</html>
|