bet-cli 0.3.0 → 0.3.1
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/README.md +19 -2
- package/dist/lib/help.js +8 -0
- package/dist/main.js +1 -1
- package/landing-page/index.html +996 -0
- package/landing-page/vercel.json +25 -0
- package/package.json +1 -1
- package/skills/bet/SKILL.md +129 -0
- package/src/lib/help.ts +13 -0
- package/src/main.ts +1 -1
package/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Keep your house in order. Explore and jump between local projects.
|
|
4
4
|
|
|
5
|
-
**bet** is a lightweight project index for your machine: point it at one or more “root” folders (like `~/code`), let it scan for projects, then use fast commands to **search**, **inspect**, and **jump** to them.
|
|
5
|
+
**bet** is a lightweight project index for your machine: point it at one or more “root” folders (like `~/code`), let it scan for projects, then use fast commands to **search**, **inspect**, and **jump** to them — for you _and_ for the AI coding agents working inside your repos.
|
|
6
6
|
|
|
7
|
-
If your `~/code` folder is chaos, **bet turns it into a map**.
|
|
7
|
+
If your `~/code` folder is chaos, **bet turns it into a map**. The same map an agent can read in a handful of tokens instead of burning a context window on a sprawling `find` dump.
|
|
8
8
|
|
|
9
9
|
```
|
|
10
10
|
|
|
@@ -33,6 +33,7 @@ If your `~/code` folder is chaos, **bet turns it into a map**.
|
|
|
33
33
|
- **No guessing paths**
|
|
34
34
|
- **No brittle aliases**
|
|
35
35
|
- Just indexed homes you can find instantly
|
|
36
|
+
- **Context-efficient for AI agents** — `bet path X` resolves a project name to a path in a handful of tokens; `bet list --json | jq` answers questions across hundreds of projects without spending tokens on a full `find` tree
|
|
36
37
|
|
|
37
38
|
“bet” (𐤁) is the Phoenician letter for **house**. Every project is a house—bet builds your registry of houses.
|
|
38
39
|
|
|
@@ -168,6 +169,22 @@ You can combine `bet list --json` with [jq](https://stedolan.github.io/jq/) for
|
|
|
168
169
|
|
|
169
170
|
You can customize these jq expressions to target any field present in the project index for fully custom workflows.
|
|
170
171
|
|
|
172
|
+
## Use with AI agents
|
|
173
|
+
|
|
174
|
+
bet ships an agent skill at [`skills/bet/SKILL.md`](skills/bet/SKILL.md) that teaches an LLM-driven coding agent (Claude Code, Cursor, etc.) how to drive the CLI from natural-language requests like _"jump to my payments project"_, _"open the api repo in my editor"_, or _"which of my projects have uncommitted changes?"_.
|
|
175
|
+
|
|
176
|
+
The skill codifies:
|
|
177
|
+
|
|
178
|
+
- The **intent → command map** (`path`, `info`, `list`, `search`, `edit`, `update`, `ignore`)
|
|
179
|
+
- The **mandatory `--plain` / `--json` flags** so the interactive TUI does not hang the agent
|
|
180
|
+
- The **`cd "$(bet path X)"` pattern** for non-interactive shells, since `bet go` relies on shell integration the agent cannot load
|
|
181
|
+
- The **`bet list --json` schema** and ready-made `jq` recipes for dirty / recently modified / stale / grouped queries
|
|
182
|
+
- **Slug rules** (including `slugParentFolders`) and common pitfalls
|
|
183
|
+
|
|
184
|
+
To use it with Claude Code, drop the `skills/bet/` folder into a discovered skills directory (e.g. `~/.claude/skills/bet/`) — or import the skill into whichever harness your agent uses. Once loaded, `/bet` invokes it explicitly, and natural-language triggers in the description load it automatically.
|
|
185
|
+
|
|
186
|
+
This means an agent can navigate hundreds of projects on your machine using a few-line skill instead of spending tokens on directory listings, ad-hoc shell aliases, or hard-coded paths in its prompt.
|
|
187
|
+
|
|
171
188
|
### Development setup (contributors)
|
|
172
189
|
|
|
173
190
|
To work on bet locally (without necessarily linking it globally), install deps and build:
|
package/dist/lib/help.js
CHANGED
|
@@ -80,6 +80,14 @@ export class GroupedHelp extends Help {
|
|
|
80
80
|
output.push(`${heading}:`, formatList(commandList), "");
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
+
output.push("AI agent skill:", formatList([
|
|
84
|
+
"bet ships an agent skill that teaches AI coding agents (Claude Code,",
|
|
85
|
+
"Cursor, etc.) how to drive this CLI from natural-language requests.",
|
|
86
|
+
"Install it to supercharge your agent — drop the skills/bet/ folder",
|
|
87
|
+
"into your harness's skills directory (e.g. ~/.claude/skills/bet/).",
|
|
88
|
+
"",
|
|
89
|
+
" https://github.com/kenzic/bet-cli/tree/main/skills/bet",
|
|
90
|
+
]), "");
|
|
83
91
|
return output.join("\n");
|
|
84
92
|
}
|
|
85
93
|
}
|
package/dist/main.js
CHANGED
|
@@ -0,0 +1,996 @@
|
|
|
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>bet | A local project index for developers</title>
|
|
7
|
+
<meta
|
|
8
|
+
name="description"
|
|
9
|
+
content="bet helps developers search, inspect, and jump between local projects without memorizing paths."
|
|
10
|
+
/>
|
|
11
|
+
<script>
|
|
12
|
+
window.BET_ANALYTICS = window.BET_ANALYTICS || {
|
|
13
|
+
gaMeasurementId: "G-CS4JC3HKS5",
|
|
14
|
+
};
|
|
15
|
+
</script>
|
|
16
|
+
<script>
|
|
17
|
+
(() => {
|
|
18
|
+
const measurementId = window.BET_ANALYTICS?.gaMeasurementId;
|
|
19
|
+
|
|
20
|
+
if (!measurementId || measurementId === "G-XXXXXXXXXX") {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
window.dataLayer = window.dataLayer || [];
|
|
25
|
+
|
|
26
|
+
function gtag() {
|
|
27
|
+
window.dataLayer.push(arguments);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
window.gtag = window.gtag || gtag;
|
|
31
|
+
gtag("js", new Date());
|
|
32
|
+
gtag("config", measurementId);
|
|
33
|
+
|
|
34
|
+
const script = document.createElement("script");
|
|
35
|
+
script.async = true;
|
|
36
|
+
script.src = `https://www.googletagmanager.com/gtag/js?id=${encodeURIComponent(measurementId)}`;
|
|
37
|
+
document.head.appendChild(script);
|
|
38
|
+
|
|
39
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
40
|
+
document.querySelectorAll("[data-analytics-event]").forEach((element) => {
|
|
41
|
+
element.addEventListener("click", () => {
|
|
42
|
+
window.gtag?.("event", element.dataset.analyticsEvent, {
|
|
43
|
+
cta_label: element.dataset.analyticsLabel,
|
|
44
|
+
cta_location: element.dataset.analyticsLocation,
|
|
45
|
+
link_url: element.getAttribute("href"),
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
})();
|
|
51
|
+
</script>
|
|
52
|
+
<style>
|
|
53
|
+
:root {
|
|
54
|
+
--sand: #f5f0e7;
|
|
55
|
+
--sand-deep: #e2d7c7;
|
|
56
|
+
--stone: #cfc5b7;
|
|
57
|
+
--ink: #121617;
|
|
58
|
+
--ink-soft: #273033;
|
|
59
|
+
--moss: #6d7b52;
|
|
60
|
+
--brass: #b08a45;
|
|
61
|
+
--line: rgba(18, 22, 23, 0.1);
|
|
62
|
+
--panel: rgba(255, 255, 255, 0.62);
|
|
63
|
+
--shadow: 0 24px 60px rgba(18, 22, 23, 0.12);
|
|
64
|
+
--radius-xl: 32px;
|
|
65
|
+
--radius-lg: 24px;
|
|
66
|
+
--radius-md: 16px;
|
|
67
|
+
--max: 1180px;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
* {
|
|
71
|
+
box-sizing: border-box;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
html {
|
|
75
|
+
scroll-behavior: smooth;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
body {
|
|
79
|
+
margin: 0;
|
|
80
|
+
font-family:
|
|
81
|
+
"Avenir Next",
|
|
82
|
+
"Segoe UI",
|
|
83
|
+
"Helvetica Neue",
|
|
84
|
+
Arial,
|
|
85
|
+
sans-serif;
|
|
86
|
+
color: var(--ink);
|
|
87
|
+
background:
|
|
88
|
+
radial-gradient(circle at 0% 0%, rgba(176, 138, 69, 0.18), transparent 24%),
|
|
89
|
+
radial-gradient(circle at 85% 10%, rgba(109, 123, 82, 0.16), transparent 28%),
|
|
90
|
+
linear-gradient(180deg, #f9f5ef 0%, #efe8dd 54%, #e8dfd2 100%);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
body::before {
|
|
94
|
+
content: "";
|
|
95
|
+
position: fixed;
|
|
96
|
+
inset: 0;
|
|
97
|
+
pointer-events: none;
|
|
98
|
+
background-image:
|
|
99
|
+
linear-gradient(rgba(18, 22, 23, 0.028) 1px, transparent 1px),
|
|
100
|
+
linear-gradient(90deg, rgba(18, 22, 23, 0.028) 1px, transparent 1px);
|
|
101
|
+
background-size: 34px 34px;
|
|
102
|
+
mask-image: linear-gradient(180deg, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0.12));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
img {
|
|
106
|
+
max-width: 100%;
|
|
107
|
+
display: block;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
a {
|
|
111
|
+
color: inherit;
|
|
112
|
+
text-decoration: none;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.page {
|
|
116
|
+
width: min(var(--max), calc(100vw - 32px));
|
|
117
|
+
margin: 0 auto;
|
|
118
|
+
padding: 26px 0 72px;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.mono,
|
|
122
|
+
.nav-links a,
|
|
123
|
+
.eyebrow,
|
|
124
|
+
.pill,
|
|
125
|
+
.meta,
|
|
126
|
+
.terminal,
|
|
127
|
+
.step-index,
|
|
128
|
+
.faq summary,
|
|
129
|
+
code {
|
|
130
|
+
font-family:
|
|
131
|
+
"SFMono-Regular",
|
|
132
|
+
"Menlo",
|
|
133
|
+
"Monaco",
|
|
134
|
+
"Cascadia Mono",
|
|
135
|
+
"Segoe UI Mono",
|
|
136
|
+
monospace;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.nav {
|
|
140
|
+
display: flex;
|
|
141
|
+
align-items: center;
|
|
142
|
+
justify-content: space-between;
|
|
143
|
+
gap: 18px;
|
|
144
|
+
padding: 14px 18px;
|
|
145
|
+
border: 1px solid rgba(255, 255, 255, 0.55);
|
|
146
|
+
border-radius: 999px;
|
|
147
|
+
background: rgba(245, 240, 231, 0.72);
|
|
148
|
+
backdrop-filter: blur(18px);
|
|
149
|
+
box-shadow: 0 12px 28px rgba(18, 22, 23, 0.06);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.brand {
|
|
153
|
+
display: flex;
|
|
154
|
+
align-items: center;
|
|
155
|
+
gap: 12px;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.brand-mark {
|
|
159
|
+
width: 52px;
|
|
160
|
+
height: 52px;
|
|
161
|
+
border-radius: 16px;
|
|
162
|
+
display: grid;
|
|
163
|
+
place-items: center;
|
|
164
|
+
background: var(--ink);
|
|
165
|
+
box-shadow:
|
|
166
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.08),
|
|
167
|
+
0 14px 24px rgba(18, 22, 23, 0.18);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.brand-mark img {
|
|
171
|
+
width: 34px;
|
|
172
|
+
height: 34px;
|
|
173
|
+
object-fit: contain;
|
|
174
|
+
filter: brightness(0) invert(1);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
.brand-text {
|
|
178
|
+
display: grid;
|
|
179
|
+
gap: 2px;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.brand-text strong {
|
|
183
|
+
font-size: 0.96rem;
|
|
184
|
+
letter-spacing: 0.05em;
|
|
185
|
+
text-transform: lowercase;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.brand-text span,
|
|
189
|
+
.nav-links a {
|
|
190
|
+
font-size: 0.78rem;
|
|
191
|
+
color: rgba(18, 22, 23, 0.7);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.nav-links {
|
|
195
|
+
display: flex;
|
|
196
|
+
gap: 18px;
|
|
197
|
+
flex-wrap: wrap;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
.hero {
|
|
201
|
+
display: grid;
|
|
202
|
+
grid-template-columns: minmax(0, 1.06fr) minmax(320px, 0.94fr);
|
|
203
|
+
gap: 24px;
|
|
204
|
+
margin-top: 24px;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.card {
|
|
208
|
+
position: relative;
|
|
209
|
+
overflow: hidden;
|
|
210
|
+
border: 1px solid rgba(255, 255, 255, 0.55);
|
|
211
|
+
border-radius: var(--radius-xl);
|
|
212
|
+
background: var(--panel);
|
|
213
|
+
backdrop-filter: blur(24px);
|
|
214
|
+
box-shadow: var(--shadow);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.hero-copy {
|
|
218
|
+
padding: 44px;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.hero-copy::after {
|
|
222
|
+
content: "";
|
|
223
|
+
position: absolute;
|
|
224
|
+
right: -90px;
|
|
225
|
+
bottom: -90px;
|
|
226
|
+
width: 280px;
|
|
227
|
+
height: 280px;
|
|
228
|
+
border-radius: 50%;
|
|
229
|
+
background: radial-gradient(circle, rgba(176, 138, 69, 0.18), transparent 66%);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.eyebrow {
|
|
233
|
+
display: inline-flex;
|
|
234
|
+
align-items: center;
|
|
235
|
+
gap: 10px;
|
|
236
|
+
margin-bottom: 16px;
|
|
237
|
+
font-size: 0.78rem;
|
|
238
|
+
letter-spacing: 0.12em;
|
|
239
|
+
text-transform: uppercase;
|
|
240
|
+
color: rgba(18, 22, 23, 0.62);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.eyebrow::before {
|
|
244
|
+
content: "";
|
|
245
|
+
width: 24px;
|
|
246
|
+
height: 1px;
|
|
247
|
+
background: currentColor;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
h1,
|
|
251
|
+
h2,
|
|
252
|
+
h3,
|
|
253
|
+
p {
|
|
254
|
+
margin: 0;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
h1 {
|
|
258
|
+
max-width: 10ch;
|
|
259
|
+
font-size: clamp(3.2rem, 6vw, 5.6rem);
|
|
260
|
+
line-height: 0.92;
|
|
261
|
+
letter-spacing: -0.065em;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.lede {
|
|
265
|
+
max-width: 42rem;
|
|
266
|
+
margin-top: 18px;
|
|
267
|
+
font-size: 1.1rem;
|
|
268
|
+
line-height: 1.75;
|
|
269
|
+
color: rgba(18, 22, 23, 0.82);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
.hero-actions {
|
|
273
|
+
display: flex;
|
|
274
|
+
flex-wrap: wrap;
|
|
275
|
+
gap: 14px;
|
|
276
|
+
margin-top: 28px;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.button {
|
|
280
|
+
display: inline-flex;
|
|
281
|
+
align-items: center;
|
|
282
|
+
justify-content: center;
|
|
283
|
+
min-height: 50px;
|
|
284
|
+
padding: 0 20px;
|
|
285
|
+
border-radius: 999px;
|
|
286
|
+
border: 1px solid transparent;
|
|
287
|
+
font-weight: 700;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.button-primary {
|
|
291
|
+
background: var(--ink);
|
|
292
|
+
color: var(--sand);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.button-secondary {
|
|
296
|
+
border-color: rgba(18, 22, 23, 0.14);
|
|
297
|
+
background: rgba(255, 255, 255, 0.44);
|
|
298
|
+
color: var(--ink);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.install-links {
|
|
302
|
+
margin-top: 22px;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.hero-pills {
|
|
306
|
+
display: flex;
|
|
307
|
+
flex-wrap: wrap;
|
|
308
|
+
gap: 10px;
|
|
309
|
+
margin-top: 28px;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
.pill {
|
|
313
|
+
padding: 10px 12px;
|
|
314
|
+
border-radius: 999px;
|
|
315
|
+
border: 1px solid rgba(18, 22, 23, 0.1);
|
|
316
|
+
background: rgba(255, 255, 255, 0.46);
|
|
317
|
+
font-size: 0.75rem;
|
|
318
|
+
color: rgba(18, 22, 23, 0.72);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.hero-demo {
|
|
322
|
+
padding: 24px;
|
|
323
|
+
display: grid;
|
|
324
|
+
gap: 16px;
|
|
325
|
+
background:
|
|
326
|
+
linear-gradient(180deg, rgba(18, 22, 23, 0.96), rgba(18, 22, 23, 0.9)),
|
|
327
|
+
linear-gradient(180deg, rgba(255, 255, 255, 0.08), transparent);
|
|
328
|
+
color: #eef0eb;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.dots {
|
|
332
|
+
display: flex;
|
|
333
|
+
gap: 8px;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
.dots span {
|
|
337
|
+
width: 11px;
|
|
338
|
+
height: 11px;
|
|
339
|
+
border-radius: 999px;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.dots span:nth-child(1) {
|
|
343
|
+
background: #d6745b;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
.dots span:nth-child(2) {
|
|
347
|
+
background: #d8a84d;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
.dots span:nth-child(3) {
|
|
351
|
+
background: #6d7b52;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
.meta {
|
|
355
|
+
font-size: 0.78rem;
|
|
356
|
+
color: rgba(238, 240, 235, 0.62);
|
|
357
|
+
letter-spacing: 0.08em;
|
|
358
|
+
text-transform: uppercase;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
.terminal-stack {
|
|
362
|
+
display: grid;
|
|
363
|
+
gap: 10px;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
.terminal {
|
|
367
|
+
display: grid;
|
|
368
|
+
grid-template-columns: 18px minmax(0, 1fr);
|
|
369
|
+
align-items: center;
|
|
370
|
+
gap: 12px;
|
|
371
|
+
padding: 14px 16px;
|
|
372
|
+
border-radius: 14px;
|
|
373
|
+
background: rgba(255, 255, 255, 0.04);
|
|
374
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
375
|
+
color: #f8f5ef;
|
|
376
|
+
font-size: 0.92rem;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
.terminal span {
|
|
380
|
+
color: #9cab90;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
.terminal code {
|
|
384
|
+
color: inherit;
|
|
385
|
+
font: inherit;
|
|
386
|
+
white-space: nowrap;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
.demo-note {
|
|
390
|
+
padding-top: 12px;
|
|
391
|
+
border-top: 1px solid rgba(255, 255, 255, 0.08);
|
|
392
|
+
color: rgba(238, 240, 235, 0.72);
|
|
393
|
+
line-height: 1.65;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
.section {
|
|
397
|
+
margin-top: 24px;
|
|
398
|
+
padding: 30px;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
.section h2 {
|
|
402
|
+
font-size: clamp(1.7rem, 2.5vw, 2.5rem);
|
|
403
|
+
letter-spacing: -0.045em;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
.section-intro {
|
|
407
|
+
max-width: 46rem;
|
|
408
|
+
margin-top: 10px;
|
|
409
|
+
color: rgba(18, 22, 23, 0.78);
|
|
410
|
+
line-height: 1.75;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
.three-up,
|
|
414
|
+
.two-up {
|
|
415
|
+
display: grid;
|
|
416
|
+
gap: 16px;
|
|
417
|
+
margin-top: 22px;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
.three-up {
|
|
421
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
.two-up {
|
|
425
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
.feature,
|
|
429
|
+
.step,
|
|
430
|
+
.quote,
|
|
431
|
+
.objection,
|
|
432
|
+
.final-panel {
|
|
433
|
+
padding: 22px;
|
|
434
|
+
border-radius: var(--radius-lg);
|
|
435
|
+
border: 1px solid var(--line);
|
|
436
|
+
background: rgba(255, 255, 255, 0.48);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
.feature h3,
|
|
440
|
+
.step h3,
|
|
441
|
+
.quote h3,
|
|
442
|
+
.objection h3,
|
|
443
|
+
.final-panel h3 {
|
|
444
|
+
margin-bottom: 10px;
|
|
445
|
+
font-size: 1.02rem;
|
|
446
|
+
letter-spacing: -0.03em;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
.feature p,
|
|
450
|
+
.step p,
|
|
451
|
+
.quote p,
|
|
452
|
+
.objection p,
|
|
453
|
+
.final-panel p {
|
|
454
|
+
color: rgba(18, 22, 23, 0.76);
|
|
455
|
+
line-height: 1.7;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
.doc-grid {
|
|
459
|
+
display: grid;
|
|
460
|
+
gap: 16px;
|
|
461
|
+
margin-top: 22px;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
.doc-item {
|
|
465
|
+
padding: 22px;
|
|
466
|
+
border-radius: var(--radius-lg);
|
|
467
|
+
border: 1px solid var(--line);
|
|
468
|
+
background: rgba(255, 255, 255, 0.5);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
.doc-item h3 {
|
|
472
|
+
margin-bottom: 8px;
|
|
473
|
+
font-size: 1.02rem;
|
|
474
|
+
letter-spacing: -0.03em;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
.doc-item p {
|
|
478
|
+
color: rgba(18, 22, 23, 0.76);
|
|
479
|
+
line-height: 1.7;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
.doc-item .terminal-stack {
|
|
483
|
+
margin-top: 14px;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
.step {
|
|
487
|
+
position: relative;
|
|
488
|
+
padding-top: 54px;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
.step-index {
|
|
492
|
+
position: absolute;
|
|
493
|
+
top: 18px;
|
|
494
|
+
left: 20px;
|
|
495
|
+
color: rgba(18, 22, 23, 0.42);
|
|
496
|
+
font-size: 0.76rem;
|
|
497
|
+
letter-spacing: 0.12em;
|
|
498
|
+
text-transform: uppercase;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
.step .terminal-stack {
|
|
502
|
+
margin-top: 14px;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
.quote {
|
|
506
|
+
background:
|
|
507
|
+
linear-gradient(180deg, rgba(109, 123, 82, 0.08), transparent 100%),
|
|
508
|
+
rgba(255, 255, 255, 0.52);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
.quote p {
|
|
512
|
+
font-size: 1.05rem;
|
|
513
|
+
color: var(--ink-soft);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
.quote span {
|
|
517
|
+
display: block;
|
|
518
|
+
margin-top: 14px;
|
|
519
|
+
color: rgba(18, 22, 23, 0.6);
|
|
520
|
+
font-size: 0.88rem;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
.faq {
|
|
524
|
+
margin-top: 22px;
|
|
525
|
+
display: grid;
|
|
526
|
+
gap: 12px;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
.faq details {
|
|
530
|
+
border: 1px solid var(--line);
|
|
531
|
+
border-radius: 18px;
|
|
532
|
+
background: rgba(255, 255, 255, 0.46);
|
|
533
|
+
padding: 18px 20px;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
.faq summary {
|
|
537
|
+
cursor: pointer;
|
|
538
|
+
list-style: none;
|
|
539
|
+
font-size: 0.86rem;
|
|
540
|
+
color: var(--ink);
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
.faq summary::-webkit-details-marker {
|
|
544
|
+
display: none;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
.faq p {
|
|
548
|
+
margin-top: 12px;
|
|
549
|
+
color: rgba(18, 22, 23, 0.76);
|
|
550
|
+
line-height: 1.7;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
.final {
|
|
554
|
+
display: grid;
|
|
555
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
556
|
+
gap: 18px;
|
|
557
|
+
align-items: center;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
.footer {
|
|
561
|
+
margin-top: 24px;
|
|
562
|
+
padding: 16px 18px;
|
|
563
|
+
text-align: center;
|
|
564
|
+
color: rgba(18, 22, 23, 0.62);
|
|
565
|
+
font-size: 0.78rem;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
.reveal {
|
|
569
|
+
opacity: 0;
|
|
570
|
+
transform: translateY(18px);
|
|
571
|
+
animation: fade-up 0.7s ease forwards;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
.delay-1 { animation-delay: 0.08s; }
|
|
575
|
+
.delay-2 { animation-delay: 0.16s; }
|
|
576
|
+
.delay-3 { animation-delay: 0.24s; }
|
|
577
|
+
.delay-4 { animation-delay: 0.32s; }
|
|
578
|
+
|
|
579
|
+
@keyframes fade-up {
|
|
580
|
+
to {
|
|
581
|
+
opacity: 1;
|
|
582
|
+
transform: translateY(0);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
@media (max-width: 980px) {
|
|
587
|
+
.hero,
|
|
588
|
+
.three-up,
|
|
589
|
+
.two-up,
|
|
590
|
+
.final {
|
|
591
|
+
grid-template-columns: 1fr;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
@media (max-width: 720px) {
|
|
596
|
+
.page {
|
|
597
|
+
width: min(calc(100vw - 20px), var(--max));
|
|
598
|
+
padding-top: 10px;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
.nav {
|
|
602
|
+
flex-direction: column;
|
|
603
|
+
align-items: flex-start;
|
|
604
|
+
border-radius: 28px;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
.hero-copy,
|
|
608
|
+
.hero-demo,
|
|
609
|
+
.section {
|
|
610
|
+
padding: 22px;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
h1 {
|
|
614
|
+
max-width: 100%;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
</style>
|
|
618
|
+
</head>
|
|
619
|
+
<body>
|
|
620
|
+
<div class="page">
|
|
621
|
+
<header class="nav reveal">
|
|
622
|
+
<div class="brand">
|
|
623
|
+
<div class="brand-mark" aria-label="bet logo">
|
|
624
|
+
<img
|
|
625
|
+
src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/Phoenician_beth.svg/2000px-Phoenician_beth.svg.png"
|
|
626
|
+
alt=""
|
|
627
|
+
/>
|
|
628
|
+
</div>
|
|
629
|
+
<div class="brand-text">
|
|
630
|
+
<strong>bet</strong>
|
|
631
|
+
<span>local project index</span>
|
|
632
|
+
</div>
|
|
633
|
+
</div>
|
|
634
|
+
<nav class="nav-links">
|
|
635
|
+
<a
|
|
636
|
+
href="#why"
|
|
637
|
+
data-analytics-event="cta_clicked"
|
|
638
|
+
data-analytics-label="why_bet_nav"
|
|
639
|
+
data-analytics-location="header_nav"
|
|
640
|
+
>Why bet</a
|
|
641
|
+
>
|
|
642
|
+
<a
|
|
643
|
+
href="#how"
|
|
644
|
+
data-analytics-event="cta_clicked"
|
|
645
|
+
data-analytics-label="how_it_works_nav"
|
|
646
|
+
data-analytics-location="header_nav"
|
|
647
|
+
>How it works</a
|
|
648
|
+
>
|
|
649
|
+
<a
|
|
650
|
+
href="#faq"
|
|
651
|
+
data-analytics-event="cta_clicked"
|
|
652
|
+
data-analytics-label="faq_nav"
|
|
653
|
+
data-analytics-location="header_nav"
|
|
654
|
+
>FAQ</a
|
|
655
|
+
>
|
|
656
|
+
</nav>
|
|
657
|
+
</header>
|
|
658
|
+
|
|
659
|
+
<section class="hero">
|
|
660
|
+
<article class="card hero-copy reveal delay-1">
|
|
661
|
+
<div class="eyebrow">Developer productivity CLI</div>
|
|
662
|
+
<h1>Search, inspect, and jump between local projects fast.</h1>
|
|
663
|
+
<p class="lede">
|
|
664
|
+
bet gives you a fast way to find the right repo, inspect it, and jump into it
|
|
665
|
+
without memorizing paths or digging through a crowded <code>~/code</code> folder.
|
|
666
|
+
</p>
|
|
667
|
+
<div class="hero-actions">
|
|
668
|
+
<a
|
|
669
|
+
class="button button-primary"
|
|
670
|
+
href="#install"
|
|
671
|
+
data-analytics-event="cta_clicked"
|
|
672
|
+
data-analytics-label="install_bet_hero"
|
|
673
|
+
data-analytics-location="hero"
|
|
674
|
+
>Install bet</a
|
|
675
|
+
>
|
|
676
|
+
<a
|
|
677
|
+
class="button button-secondary"
|
|
678
|
+
href="#how"
|
|
679
|
+
data-analytics-event="cta_clicked"
|
|
680
|
+
data-analytics-label="see_how_it_works_hero"
|
|
681
|
+
data-analytics-location="hero"
|
|
682
|
+
>See how it works</a
|
|
683
|
+
>
|
|
684
|
+
</div>
|
|
685
|
+
<div class="hero-pills">
|
|
686
|
+
<span class="pill">local project index</span>
|
|
687
|
+
<span class="pill">shell-native workflow</span>
|
|
688
|
+
<span class="pill">lightweight setup</span>
|
|
689
|
+
</div>
|
|
690
|
+
</article>
|
|
691
|
+
|
|
692
|
+
<aside class="card hero-demo reveal delay-2">
|
|
693
|
+
<div class="dots" aria-hidden="true">
|
|
694
|
+
<span></span><span></span><span></span>
|
|
695
|
+
</div>
|
|
696
|
+
<div class="meta">core workflow</div>
|
|
697
|
+
<div class="terminal-stack">
|
|
698
|
+
<div class="terminal"><span>$</span><code>bet update --roots "$HOME/code,$HOME/work"</code></div>
|
|
699
|
+
<div class="terminal"><span>$</span><code>bet search payments</code></div>
|
|
700
|
+
<div class="terminal"><span>$</span><code>bet info marketing-site</code></div>
|
|
701
|
+
<div class="terminal"><span>$</span><code>bet go api</code></div>
|
|
702
|
+
</div>
|
|
703
|
+
<p class="demo-note">
|
|
704
|
+
Point bet at the places where you keep projects, build the index once, and use it
|
|
705
|
+
every day when you need to switch context quickly.
|
|
706
|
+
</p>
|
|
707
|
+
</aside>
|
|
708
|
+
</section>
|
|
709
|
+
|
|
710
|
+
<section class="card section reveal delay-2" id="why">
|
|
711
|
+
<div class="eyebrow">Why bet</div>
|
|
712
|
+
<h2>Your machine probably has more projects than your folder structure can handle.</h2>
|
|
713
|
+
<p class="section-intro">
|
|
714
|
+
As your local workspace grows, simple navigation gets slower. Repos end up spread
|
|
715
|
+
across work, client, and side-project folders. bet gives you one fast interface for
|
|
716
|
+
finding what you need and getting into it.
|
|
717
|
+
</p>
|
|
718
|
+
<div class="three-up">
|
|
719
|
+
<article class="feature">
|
|
720
|
+
<h3>Stop guessing paths</h3>
|
|
721
|
+
<p>
|
|
722
|
+
Search and jump by project slug instead of remembering exactly where a repo lives.
|
|
723
|
+
</p>
|
|
724
|
+
</article>
|
|
725
|
+
<article class="feature">
|
|
726
|
+
<h3>Keep local work organized</h3>
|
|
727
|
+
<p>
|
|
728
|
+
Define your roots once, scan them, and treat your machine like a structured workspace.
|
|
729
|
+
</p>
|
|
730
|
+
</article>
|
|
731
|
+
<article class="feature">
|
|
732
|
+
<h3>Stay in the terminal</h3>
|
|
733
|
+
<p>
|
|
734
|
+
Use a shell-native workflow that fits how developers already work instead of forcing a new system.
|
|
735
|
+
</p>
|
|
736
|
+
</article>
|
|
737
|
+
</div>
|
|
738
|
+
</section>
|
|
739
|
+
|
|
740
|
+
<section class="card section reveal delay-3" id="how">
|
|
741
|
+
<div class="eyebrow">How it works</div>
|
|
742
|
+
<h2>Set it up once. Use it every day.</h2>
|
|
743
|
+
<p class="section-intro">
|
|
744
|
+
bet is intentionally simple. You point it at the directories where you keep projects,
|
|
745
|
+
let it build the index, and then use focused commands to search, inspect, and jump.
|
|
746
|
+
</p>
|
|
747
|
+
<div class="three-up">
|
|
748
|
+
<article class="step">
|
|
749
|
+
<div class="step-index">Step 01</div>
|
|
750
|
+
<h3>Index your roots</h3>
|
|
751
|
+
<p>
|
|
752
|
+
Run <code>bet update --roots "$HOME/code,$HOME/work"</code> to scan the places
|
|
753
|
+
where you keep your projects.
|
|
754
|
+
</p>
|
|
755
|
+
</article>
|
|
756
|
+
<article class="step">
|
|
757
|
+
<div class="step-index">Step 02</div>
|
|
758
|
+
<h3>Find what you need</h3>
|
|
759
|
+
<p>
|
|
760
|
+
Use commands like <code>bet list</code>, <code>bet search api</code>, and
|
|
761
|
+
<code>bet info payments</code> to locate the right project fast.
|
|
762
|
+
</p>
|
|
763
|
+
</article>
|
|
764
|
+
<article class="step">
|
|
765
|
+
<div class="step-index">Step 03</div>
|
|
766
|
+
<h3>Jump into the work</h3>
|
|
767
|
+
<p>
|
|
768
|
+
Add shell integration once, then use <code>bet go <slug></code> to move into
|
|
769
|
+
projects without breaking your flow.
|
|
770
|
+
</p>
|
|
771
|
+
</article>
|
|
772
|
+
</div>
|
|
773
|
+
</section>
|
|
774
|
+
|
|
775
|
+
<section class="card section reveal delay-3">
|
|
776
|
+
<div class="eyebrow">Functionality</div>
|
|
777
|
+
<h2>Common tasks, shown as commands.</h2>
|
|
778
|
+
<p class="section-intro">
|
|
779
|
+
Think of bet as a focused command set for local project navigation. These are the
|
|
780
|
+
core workflows most users need day to day.
|
|
781
|
+
</p>
|
|
782
|
+
<div class="doc-grid">
|
|
783
|
+
<article class="doc-item">
|
|
784
|
+
<h3>Index the directories where you keep code</h3>
|
|
785
|
+
<p>
|
|
786
|
+
Run this the first time to tell bet where your projects live.
|
|
787
|
+
</p>
|
|
788
|
+
<div class="terminal-stack">
|
|
789
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
790
|
+
<span>$</span><code>bet update --roots "$HOME/code,$HOME/work"</code>
|
|
791
|
+
</div>
|
|
792
|
+
</div>
|
|
793
|
+
</article>
|
|
794
|
+
<article class="doc-item">
|
|
795
|
+
<h3>List everything bet has indexed</h3>
|
|
796
|
+
<p>
|
|
797
|
+
Use this when you want a quick view of all known projects.
|
|
798
|
+
</p>
|
|
799
|
+
<div class="terminal-stack">
|
|
800
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
801
|
+
<span>$</span><code>bet list</code>
|
|
802
|
+
</div>
|
|
803
|
+
</div>
|
|
804
|
+
</article>
|
|
805
|
+
<article class="doc-item">
|
|
806
|
+
<h3>Search for a project by name</h3>
|
|
807
|
+
<p>
|
|
808
|
+
Use fuzzy search when you know part of the repo name but not the exact slug.
|
|
809
|
+
</p>
|
|
810
|
+
<div class="terminal-stack">
|
|
811
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
812
|
+
<span>$</span><code>bet search api</code>
|
|
813
|
+
</div>
|
|
814
|
+
</div>
|
|
815
|
+
</article>
|
|
816
|
+
<article class="doc-item">
|
|
817
|
+
<h3>Inspect a project before you open it</h3>
|
|
818
|
+
<p>
|
|
819
|
+
Check metadata or print the absolute path when you want to confirm you have the right
|
|
820
|
+
project.
|
|
821
|
+
</p>
|
|
822
|
+
<div class="terminal-stack">
|
|
823
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
824
|
+
<span>$</span><code>bet info marketing-site</code>
|
|
825
|
+
</div>
|
|
826
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
827
|
+
<span>$</span><code>bet path marketing-site</code>
|
|
828
|
+
</div>
|
|
829
|
+
</div>
|
|
830
|
+
</article>
|
|
831
|
+
<article class="doc-item">
|
|
832
|
+
<h3>Jump into a project from your shell</h3>
|
|
833
|
+
<p>
|
|
834
|
+
After enabling shell integration (add <code></code>eval "$(bet shell)"</code> to your shell rc file), use <code>bet go</code> to change directly into the
|
|
835
|
+
project directory.
|
|
836
|
+
</p>
|
|
837
|
+
<div class="terminal-stack">
|
|
838
|
+
|
|
839
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
840
|
+
<span>$</span><code>bet go marketing-site</code>
|
|
841
|
+
</div>
|
|
842
|
+
</div>
|
|
843
|
+
</article>
|
|
844
|
+
<article class="doc-item">
|
|
845
|
+
<h3>Open a project in your editor</h3>
|
|
846
|
+
<p>
|
|
847
|
+
Launch the selected project with your configured editor or your system default app.
|
|
848
|
+
</p>
|
|
849
|
+
<div class="terminal-stack">
|
|
850
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
851
|
+
<span>$</span><code>bet edit marketing-site</code>
|
|
852
|
+
</div>
|
|
853
|
+
</div>
|
|
854
|
+
</article>
|
|
855
|
+
<article class="doc-item">
|
|
856
|
+
<h3>Keep the index up to date automatically</h3>
|
|
857
|
+
<p>
|
|
858
|
+
If you want bet to refresh itself on a schedule, install a cron update interval.
|
|
859
|
+
</p>
|
|
860
|
+
<div class="terminal-stack">
|
|
861
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
862
|
+
<span>$</span><code>bet update --cron 1h</code>
|
|
863
|
+
</div>
|
|
864
|
+
</div>
|
|
865
|
+
</article>
|
|
866
|
+
</div>
|
|
867
|
+
</section>
|
|
868
|
+
|
|
869
|
+
<section class="card section reveal delay-4" id="faq">
|
|
870
|
+
<div class="eyebrow">FAQ</div>
|
|
871
|
+
<h2>Answer the obvious objections early.</h2>
|
|
872
|
+
<p class="section-intro">
|
|
873
|
+
Developers already have workarounds. The page should acknowledge that and explain why bet
|
|
874
|
+
is still useful.
|
|
875
|
+
</p>
|
|
876
|
+
<div class="faq">
|
|
877
|
+
<details open>
|
|
878
|
+
<summary>I already use <code>cd</code>, <code>find</code>, or <code>fzf</code>.</summary>
|
|
879
|
+
<p>
|
|
880
|
+
bet is not trying to replace the shell. It gives frequent project navigation a
|
|
881
|
+
dedicated, repeatable interface so you spend less time improvising path lookup.
|
|
882
|
+
</p>
|
|
883
|
+
</details>
|
|
884
|
+
<details>
|
|
885
|
+
<summary>I do not want another tool to maintain.</summary>
|
|
886
|
+
<p>
|
|
887
|
+
The setup is lightweight: define roots, run update, and use the index. The value is
|
|
888
|
+
in removing daily friction, not adding process.
|
|
889
|
+
</p>
|
|
890
|
+
</details>
|
|
891
|
+
<details>
|
|
892
|
+
<summary>My folders are already fairly organized.</summary>
|
|
893
|
+
<p>
|
|
894
|
+
bet becomes more valuable as project count grows or work spreads across multiple roots.
|
|
895
|
+
Even tidy systems benefit from faster search, inspect, and jump workflows.
|
|
896
|
+
</p>
|
|
897
|
+
</details>
|
|
898
|
+
</div>
|
|
899
|
+
</section>
|
|
900
|
+
|
|
901
|
+
<section class="card section reveal delay-4" id="install">
|
|
902
|
+
<article class="final-panel">
|
|
903
|
+
<div class="eyebrow">Install</div>
|
|
904
|
+
<h2>Install bet in three steps.</h2>
|
|
905
|
+
<p class="section-intro">
|
|
906
|
+
Install the CLI, build your project index, then enable shell integration so
|
|
907
|
+
<code>bet go</code> can drop you into a project instantly.
|
|
908
|
+
</p>
|
|
909
|
+
<div class="doc-grid" style="margin-top: 22px;">
|
|
910
|
+
<article class="step">
|
|
911
|
+
<div class="step-index">Step 01</div>
|
|
912
|
+
<h3>Install the CLI</h3>
|
|
913
|
+
<p>Use your preferred package manager.</p>
|
|
914
|
+
<div class="terminal-stack">
|
|
915
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
916
|
+
<span>$</span><code>pnpm add -g bet-cli</code>
|
|
917
|
+
</div>
|
|
918
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
919
|
+
<span>$</span><code>npm install -g bet-cli</code>
|
|
920
|
+
</div>
|
|
921
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
922
|
+
<span>$</span><code>yarn global add bet-cli</code>
|
|
923
|
+
</div>
|
|
924
|
+
<!--
|
|
925
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
926
|
+
<span>$</span><code>brew install bet</code>
|
|
927
|
+
</div>
|
|
928
|
+
-->
|
|
929
|
+
</div>
|
|
930
|
+
</article>
|
|
931
|
+
|
|
932
|
+
<article class="step">
|
|
933
|
+
<div class="step-index">Step 02</div>
|
|
934
|
+
<h3>Initialize your project index</h3>
|
|
935
|
+
<p>
|
|
936
|
+
Point bet at the directories where you keep code. If you want bet to refresh the
|
|
937
|
+
index automatically, add the optional cron command after the initial setup.
|
|
938
|
+
</p>
|
|
939
|
+
<div class="terminal-stack">
|
|
940
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
941
|
+
<span>$</span><code>bet update --roots "$HOME/code,$HOME/work"</code>
|
|
942
|
+
</div>
|
|
943
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
944
|
+
<span>#</span><code>optional cron for indexing</code>
|
|
945
|
+
<span>$</span><code>bet update --cron 1h</code>
|
|
946
|
+
</div>
|
|
947
|
+
</div>
|
|
948
|
+
</article>
|
|
949
|
+
|
|
950
|
+
<article class="step">
|
|
951
|
+
<div class="step-index">Step 03</div>
|
|
952
|
+
<h3>Enable shell integration and jump in</h3>
|
|
953
|
+
<p>
|
|
954
|
+
Add the shell snippet to your rc file, reload your shell, and use
|
|
955
|
+
<code>bet go</code> to move directly into a project.
|
|
956
|
+
</p>
|
|
957
|
+
<div class="terminal-stack">
|
|
958
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
959
|
+
<span>$</span><code>echo 'eval "$(bet shell)"' >> ~/.zshrc</code>
|
|
960
|
+
</div>
|
|
961
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
962
|
+
<span>$</span><code>source ~/.zshrc</code>
|
|
963
|
+
</div>
|
|
964
|
+
<div class="terminal" style="background: rgba(18, 22, 23, 0.92); border-color: rgba(255, 255, 255, 0.06);">
|
|
965
|
+
<span>$</span><code>bet go marketing-site</code>
|
|
966
|
+
</div>
|
|
967
|
+
</div>
|
|
968
|
+
</article>
|
|
969
|
+
</div>
|
|
970
|
+
<div class="hero-actions install-links">
|
|
971
|
+
<a
|
|
972
|
+
class="button button-primary"
|
|
973
|
+
href="https://github.com/kenzic/bet-cli"
|
|
974
|
+
data-analytics-event="cta_clicked"
|
|
975
|
+
data-analytics-label="view_on_github_final"
|
|
976
|
+
data-analytics-location="install_section"
|
|
977
|
+
>View on GitHub</a
|
|
978
|
+
>
|
|
979
|
+
<a
|
|
980
|
+
class="button button-secondary"
|
|
981
|
+
href="https://www.npmjs.com/package/bet-cli"
|
|
982
|
+
data-analytics-event="cta_clicked"
|
|
983
|
+
data-analytics-label="view_on_npm_final"
|
|
984
|
+
data-analytics-location="install_section"
|
|
985
|
+
>View on npm</a
|
|
986
|
+
>
|
|
987
|
+
</div>
|
|
988
|
+
</article>
|
|
989
|
+
</section>
|
|
990
|
+
|
|
991
|
+
<div class="footer mono reveal delay-4">
|
|
992
|
+
bet is an open-source CLI for developers who want a faster way to navigate local projects.
|
|
993
|
+
</div>
|
|
994
|
+
</div>
|
|
995
|
+
</body>
|
|
996
|
+
</html>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"headers": [
|
|
3
|
+
{
|
|
4
|
+
"source": "/(.*)",
|
|
5
|
+
"headers": [
|
|
6
|
+
{
|
|
7
|
+
"key": "Referrer-Policy",
|
|
8
|
+
"value": "strict-origin-when-cross-origin"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"key": "X-Content-Type-Options",
|
|
12
|
+
"value": "nosniff"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"key": "X-Frame-Options",
|
|
16
|
+
"value": "DENY"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"key": "Permissions-Policy",
|
|
20
|
+
"value": "camera=(), microphone=(), geolocation=()"
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bet
|
|
3
|
+
description: Use the bet CLI to find, inspect, and jump between local projects from natural-language requests. Triggers on requests like "jump to my X project", "open the api repo in my editor", "what's the path to X", "find projects matching Y", "which of my projects have uncommitted changes", "list projects I haven't touched in N months", or any task where the user refers to a local project by name/topic instead of by path. Also use when the user types /bet.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# bet
|
|
7
|
+
|
|
8
|
+
`bet` is a local project index. It scans configured root folders, detects projects by `.git`/`README.md`, and exposes them through fast lookup commands. Treat it as the canonical way to resolve a project name → an absolute path on this machine.
|
|
9
|
+
|
|
10
|
+
## Quick command map
|
|
11
|
+
|
|
12
|
+
Map the user's intent to a command. Always use the slug (kebab-case folder name), not a fuzzy display name.
|
|
13
|
+
|
|
14
|
+
| User asks for… | Run |
|
|
15
|
+
|---|---|
|
|
16
|
+
| The path to project `X` | `bet path X` |
|
|
17
|
+
| Details / metadata about `X` (description, root, git state) | `bet info X --json` |
|
|
18
|
+
| The full README of `X` | `bet info X --full` |
|
|
19
|
+
| A list of all projects | `bet list --json` |
|
|
20
|
+
| Search by keyword `Y` | `bet search Y --json` |
|
|
21
|
+
| Open `X` in the user's editor | `bet edit X` |
|
|
22
|
+
| Re-scan disk for new projects | `bet update` |
|
|
23
|
+
| Add/remove/list ignored paths | `bet ignore add <path>` / `bet ignore rm <path>` / `bet ignore list` |
|
|
24
|
+
|
|
25
|
+
## Non-interactive flags are mandatory
|
|
26
|
+
|
|
27
|
+
`bet list` and `bet search` launch an interactive TUI by default. **Never** run them without `--plain` or `--json` from an agent context — they will hang waiting for keystrokes.
|
|
28
|
+
|
|
29
|
+
- `--json` — machine-readable, the right default for filtering/parsing
|
|
30
|
+
- `--plain` — line-per-project text, fine when only a name is needed
|
|
31
|
+
- `--print` — emit the selected absolute path only
|
|
32
|
+
|
|
33
|
+
## Resolving a path before `cd`
|
|
34
|
+
|
|
35
|
+
`bet go <slug>` only changes the shell's directory when the user has the shell integration (`eval "$(bet shell)"`) active. From a Bash tool call, that integration is **not** loaded, so `bet go` will not actually `cd`.
|
|
36
|
+
|
|
37
|
+
When you need to enter a project directory inside a Bash tool call, resolve the path first:
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
cd "$(bet path X)" && <command>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
This works without any shell integration and is the correct pattern for agent-driven workflows.
|
|
44
|
+
|
|
45
|
+
## The `--json` schema
|
|
46
|
+
|
|
47
|
+
`bet list --json` and `bet info <slug> --json` return objects with these fields:
|
|
48
|
+
|
|
49
|
+
```jsonc
|
|
50
|
+
{
|
|
51
|
+
"id": "/abs/path", // unique id (= path)
|
|
52
|
+
"slug": "my-project", // use this with all commands
|
|
53
|
+
"name": "my-project",
|
|
54
|
+
"path": "/abs/path",
|
|
55
|
+
"root": "/abs/root", // which configured root it lives under
|
|
56
|
+
"rootName": "code", // friendly root label
|
|
57
|
+
"hasGit": true,
|
|
58
|
+
"hasReadme": true,
|
|
59
|
+
"auto": {
|
|
60
|
+
"description": "...", // first paragraph of README
|
|
61
|
+
"startedAt": "ISO-8601", // first git commit date
|
|
62
|
+
"lastModifiedAt": "ISO-8601",// most recent file mtime
|
|
63
|
+
"lastIndexedAt": "ISO-8601",
|
|
64
|
+
"dirty": true // uncommitted changes
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
`bet list --json` returns an array of these.
|
|
70
|
+
|
|
71
|
+
## `--json | jq` recipes
|
|
72
|
+
|
|
73
|
+
The single highest-leverage feature for an agent. Reach for these when the user asks anything analytical about their projects:
|
|
74
|
+
|
|
75
|
+
```sh
|
|
76
|
+
# Projects with uncommitted work
|
|
77
|
+
bet list --json | jq 'map(select(.auto.dirty)) | .[].slug'
|
|
78
|
+
|
|
79
|
+
# Projects modified in the last 30 days, newest first
|
|
80
|
+
bet list --json | jq 'sort_by(.auto.lastModifiedAt) | reverse | map(select(.auto.lastModifiedAt > (now - 86400*30 | todateiso8601)))'
|
|
81
|
+
|
|
82
|
+
# Stale projects (untouched > 6 months)
|
|
83
|
+
bet list --json | jq --arg cutoff "$(date -u -v-6m +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d '6 months ago' +%Y-%m-%dT%H:%M:%SZ)" \
|
|
84
|
+
'map(select(.auto.lastModifiedAt < $cutoff)) | .[].slug'
|
|
85
|
+
|
|
86
|
+
# Group projects by root
|
|
87
|
+
bet list --json | jq 'group_by(.rootName) | map({root: .[0].rootName, count: length, slugs: map(.slug)})'
|
|
88
|
+
|
|
89
|
+
# Projects whose description mentions a keyword
|
|
90
|
+
bet list --json | jq --arg q "rust" 'map(select(.auto.description | test($q; "i"))) | .[].slug'
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Compose `jq` filters from `auto.*` fields rather than re-implementing logic in shell. The user's README at `bet --help` calls out this pattern explicitly.
|
|
94
|
+
|
|
95
|
+
## When `bet` returns nothing
|
|
96
|
+
|
|
97
|
+
If `bet list --json` is empty or `bet path X` errors with an unknown slug, the user has not indexed yet (or the index is stale). Run:
|
|
98
|
+
|
|
99
|
+
```sh
|
|
100
|
+
bet update
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
If this is their first run, `bet update` will fail without roots. Tell the user to run:
|
|
104
|
+
|
|
105
|
+
```sh
|
|
106
|
+
bet update --roots "$HOME/code,$HOME/work"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
…with whatever roots make sense for their machine. Do not pick roots for them.
|
|
110
|
+
|
|
111
|
+
## Slug rules — what to actually pass
|
|
112
|
+
|
|
113
|
+
- The slug is the project folder's basename, kebab-cased.
|
|
114
|
+
- If the project sits inside a wrapper folder named in `slugParentFolders` (defaults: `src`, `app`), the slug is the **parent's** name. Example: `~/code/foo/src` → slug `foo`, not `src`.
|
|
115
|
+
- When unsure, run `bet search <fuzzy>` first and read back the slug from JSON.
|
|
116
|
+
|
|
117
|
+
## Common pitfalls
|
|
118
|
+
|
|
119
|
+
- **TUI hang** — `bet list` / `bet search` without `--plain`/`--json` will block waiting for keystrokes. Always pass one.
|
|
120
|
+
- **`bet go` in Bash** — won't actually change directory; use `cd "$(bet path X)"` instead.
|
|
121
|
+
- **Treating the name as the slug** — `bet info "My Project"` will fail; use the slug from `bet list --json`.
|
|
122
|
+
- **Stale index after creating a new project** — run `bet update` before assuming the new project is searchable. Suggest `bet update --cron 1h` if the user creates projects often.
|
|
123
|
+
- **Editing config by hand** — config lives at `~/.config/bet/config.json` (or `$XDG_CONFIG_HOME/bet/config.json`). Prefer commands (`bet update --roots`, `bet ignore add`) over hand-editing.
|
|
124
|
+
|
|
125
|
+
## File locations (for debugging only)
|
|
126
|
+
|
|
127
|
+
- Config + ignore list: `~/.config/bet/config.json`
|
|
128
|
+
- Project index: `~/.config/bet/projects.json`
|
|
129
|
+
- Logs: `~/Library/Logs/bet/bet.log` (macOS) or `~/.local/state/bet/bet.log` (Linux). Set `BET_LOG_LEVEL=debug` for verbose output.
|
package/src/lib/help.ts
CHANGED
|
@@ -117,6 +117,19 @@ export class GroupedHelp extends Help {
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
+
output.push(
|
|
121
|
+
"AI agent skill:",
|
|
122
|
+
formatList([
|
|
123
|
+
"bet ships an agent skill that teaches AI coding agents (Claude Code,",
|
|
124
|
+
"Cursor, etc.) how to drive this CLI from natural-language requests.",
|
|
125
|
+
"Install it to supercharge your agent — drop the skills/bet/ folder",
|
|
126
|
+
"into your harness's skills directory (e.g. ~/.claude/skills/bet/).",
|
|
127
|
+
"",
|
|
128
|
+
" https://github.com/kenzic/bet-cli/tree/main/skills/bet",
|
|
129
|
+
]),
|
|
130
|
+
"",
|
|
131
|
+
);
|
|
132
|
+
|
|
120
133
|
return output.join("\n");
|
|
121
134
|
}
|
|
122
135
|
}
|
package/src/main.ts
CHANGED