Operator's guide to the YC CLI (`yc`) for the Gini batch demo — scoped to the yc commands the demo actually uses: the validated browser-forward login flow (tmux + browser_connect) and investor research against Bookface. Assumes yc is installed but NOT logged in yet. Load before staging or running the demo.
66
81%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
yc) — demo operator's guideyc is the Y Combinator CLI; it talks to Bookface over an authenticated
API. In our demo it's the investor-research source behind Step 5: pulling a
fund's track record (check size, YC conversion, recent deals) from the terminal.
This guide covers only the parts the demo touches.
Before using yc, check whether it's installed and decide whether to install
it — you (the agent) own this judgment; don't blindly run an install.
Check if it's available. Put the usual install locations on PATH first, since the binary often isn't there in a non-interactive shell, then look:
export PATH="$HOME/.yc/bin:$HOME/.local/bin:$PATH"
yc --version # or: ycp --versionIf that prints a version, it's installed — skip to login. If it errors with "command not found", continue.
Confirm it's genuinely missing, not just off PATH. A bare yc can fail
just because PATH wasn't set. Before installing, verify the binary truly
isn't on disk (e.g. check ~/.yc/bin/yc and ~/.local/bin/yc). Only if it's
actually absent do you install.
Install only when missing:
curl -fsSL https://bookface.ycombinator.com/cli/install.sh | bashThen re-export PATH (step 1) so the current shell sees the new binary, and
re-run yc --version to confirm.
Notes:
yc command was detected at install time, the CLI may be
installed as ycp instead — try ycp if yc is absent.~/.zshrc, so set the
export PATH=... line at the top of any script before calling yc.We are NOT logged in yet. This is the flow we rehearsed to convergence — it's
the demo's Step 5 trust beat: the agent forwards its browser to the user, the
user signs in on their own device, the agent never sees the password. yc login
spins a local callback listener on localhost:19876; the agent's forwarded
browser can't reach that localhost, so we keep yc login alive in tmux and
let the CLI catch the callback directly while the user signs in.
Keep tmux backstage — do NOT mention it to the user. tmux is an implementation detail of how we hold the login process open; it is not part of the story. In user-facing messages, say things like "starting the YC login" and "opening the sign-in page for you," never "spinning up a tmux session," "capturing the pane," or "sending keys to tmux." Run the tmux commands silently and narrate only the user-meaningful beats: login started → here's your sign-in → you're signed in. Same for the demo: the audience sees a clean sign-in hand-off, not terminal plumbing.
4 steps, no redundancy:
Parallel logout — clear both the CLI and the YC browser session:
yc logoutand in the same turn browser_navigate to the YC logout/session-clear URL so
the next sign-in is fresh (no silent reuse of an existing Google session).
tmux + grab the OAuth URL in one shot. Long URLs wrap in the pane, so
capture with -J (join wrapped lines) or you'll get a truncated URL:
tmux kill-session -t yclogin 2>/dev/null; tmux new-session -d -s yclogin
tmux send-keys -t yclogin 'export PATH="$HOME/.yc/bin:$HOME/.local/bin:$PATH"; yc login' Enter
sleep 2
tmux capture-pane -t yclogin -p -J | grep -o 'https://[^ ]*'browser_navigate + browser_connect — open that OAuth URL and hand off
to the user to sign in. The CLI's listener on localhost:19876 receives the
callback directly once they authorize — no manual code extraction, no
pasting a redirect URL back.
Confirm:
tmux capture-pane -t yclogin -p -J | grep -i successful
yc me # should print the founder + company, e.g. "Gini Agent (S26)"Why tmux: a bare yc login over a non-interactive shell dies when the call
returns; tmux keeps the process alive to catch the callback. The browser_requests
inspection step is not needed — the localhost callback fires on its own.
yc login --device — prints a URL + code; user authenticates on another
device. Cleanest when browser-forward is flaky, but it's NOT what we rehearsed.yc login --manual — prints the auth URL, takes the redirect URL pasted back.~/.yc/credentials.json and refreshes automatically. If
yc me already shows the right founder, do NOT re-run login.Feeds Step 5. Always --json + a small limit — investor results are huge
(each fund embeds its full partner roster + deal history), so an unbounded call
stalls on stage.
yc search "<fund name>" --type investors # human: columns id,link,type,users,investments
yc tools run search --input '{"entity":"investors","query":"<fund>","limit":3}' # structured — PREFER liveyc, keep a
seeded fixture as the pre-recorded fallback.When the user asks for an investor profile, gather the data with the three commands below, then present it in EXACTLY the markdown format that follows.
# 1. Identity, bio, education, followers (profile tool, by user_id)
yc tools run profile --input '{"action":"get","user_id":{user_id}}'
# 2. Ratings, stats, tags, and portfolio company IDs
yc search "{investor_name}" --type investors --json
# 3. Bulk batch breakdown (IDs extracted from command 2's results)
yc tools run search --input '{"entity":"companies","ids":"{comma_separated_ids}"}'# {investor_name}
> {tag_1} · {tag_2} · {tag_3} · ...
**Overview**
| Field | Value |
|---|---|
| **Location** | {location} |
| **LinkedIn** | [{linkedin_handle}]({linkedin_url}) |
| **Background** | {background} |
| **Education** | {education} |
| **Followers** | {followers} |
**Ratings**
| Rating | Score |
|---|---|
| **YC Rating** | {yc_rating} |
| **Founder Rating** | {founder_rating} |
**Investment Profile**
| Metric | Value |
|---|---|
| **Fund Type** | {fund_type} |
| **Total Investments** | {total_investments} |
| **YC Seed Investments** | {yc_seed_investments} |
| **Series A Leads** | {series_a_leads} |
| **Invests Internationally** | {invests_internationally} |
**Recent Portfolio by Batch**
| Batch | # | Companies |
|---|---|---|
| {batch_1} | {count_1} | {companies_1} |
| {batch_2} | {count_2} | {companies_2} |
| {batch_3} | {count_3} | {companies_3} |
| {batch_4} | {count_4} | {companies_4} |
| {batch_5} | {count_5} | {companies_5} |yc me # who am I (verify auth) | add --json
yc search "<q>" --type companies # company lookups | --type founders|deals|...
yc agent "<question>" # ask the YC agent (streams) | add --json
yc skills read <name> # load a YC playbook by nameyc <cmd> --help for exact current syntax — don't guess flags on stage.W25, S26), never long form (w2025).When the user mentions logging out of yc (for any reason), always perform both steps in the same turn, without exception:
CLI logout — clears stored credentials:
export PATH="$HOME/.yc/bin:$HOME/.local/bin:$PATH"
yc logoutBrowser session logout — navigates to clear the active YC/Bookface session:
browser_navigate("https://bookface.ycombinator.com/signout")If the page redirects to a login screen, the session is cleared. If it requires interaction, use browser_connect to hand off to the user.
A partial logout (CLI only, or browser only) leaves credentials or session tokens active and the user is NOT fully logged out. Both steps are required every time. Never report logout as complete until both have been executed.
yc --version first, set PATH, and confirm the binary is genuinely absent before installing.yc login outside tmux on the demo Mac — it dies before the callback lands.yc me already shows the right founder — it rewrites credentials for nothing.--type investors call live — always --json + small limit.capture-pane -J — without it the OAuth URL truncates at the pane width.yc, always run BOTH the CLI logout AND the browser session logout in the same turn, no exceptions.6c5d85e
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.