caveman-discover — Claude Code skill: what it does, how to install
Finds and labels every LLM workflow in your repository so Caveman Cloud breaks down spend by actual job rather than grouping everything into one bucket.
npx skills add JuliusBrussee/caveman --skill caveman-discover -a claude-codeWhat caveman-discover does
The skill inventories the repository starting from its entry points: HTTP handlers, cron jobs, queue workers, CLI scripts, and AI agent definitions. It identifies distinct user-facing tasks like support-reply or nightly-digest rather than tracking raw libraries. Shared helpers like llm.ts are left untouched; labels go directly to callers.
Before editing files, the skill presents a review table showing proposed workflow slugs, target files, and wiring methods. Gateway slugs must stay within 1 to 96 lowercase alphanumeric characters, dashes, or underscores. It then injects the x-cave-workflow header, SDK options, or environment variables into your provider clients. Callsites not routed through the Caveman gateway are skipped and noted in the report.
Run this if your traffic already passes through Caveman Cloud and you want clear attribution in /activity?tab=workflows. If you have not wired the gateway yet, configure that first because unrouted labels are ignored.
What it helps with
- split repository LLM spend into per-task workflows in Caveman Cloud
- inventory model callsites across handlers, cron jobs, and agent chains
- inject x-cave-workflow headers and SDK options without breaking callers
- verify workflow slug formatting against Caveman gateway rules
Example prompts for the agent
- discover workflows in this repository
- Label all LLM callsites for Caveman Cloud
- Break down LLM spend by workflow
How to install caveman-discover
1Skills CLI (Vercel)
npx skills add JuliusBrussee/caveman --skill caveman-discover -a claude-code2Manually: put the files in place
~/.claude/skills/caveman-discover/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/caveman-discover/
1Skills CLI (Vercel)
npx skills add JuliusBrussee/caveman --skill caveman-discover -a codex2Manually: put the files in place
.agents/skills/caveman-discover/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add JuliusBrussee/caveman --skill caveman-discover -a cursor2Manually: put the files in place
.cursor/skills/caveman-discover/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install JuliusBrussee/caveman caveman-discover2Manually: put the files in place
.github/skills/caveman-discover/SKILL.md1Skills CLI (Vercel)
npx skills add JuliusBrussee/caveman --skill caveman-discover -a gemini-cli2Platform CLI
gemini skills install https://github.com/JuliusBrussee/caveman --path skills/caveman-discoverManually: put the files in place
.devin/skills/caveman-discover/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add JuliusBrussee/caveman --skill caveman-discover -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set22
The whole set →Similar
Questions about caveman-discover
How to install caveman-discover in Claude Code?
Run npx skills add JuliusBrussee/caveman --skill caveman-discover -a claude-code or save the definition to ~/.claude/skills/caveman-discover/SKILL.md.
What does caveman-discover do?
It finds LLM call sites across the codebase, assigns job-focused slugs, and wires workflow labels via headers or SDK options. This prevents telemetry from lumping all requests into unlabeled-workflow.
Does caveman-discover modify files automatically?
No. It first displays an inventory table with proposed slugs and file paths, waits for user approval, and applies changes only after you agree.
Source text
SKILL.md · Apache-2.0
--- name: caveman-discover description: > Find and label every LLM workflow in the repository so Caveman Cloud groups spend by workflow instead of one bucket. Use for "discover workflows" or breaking LLM spend down by workflow. --- You are labeling this repository's LLM workflows for Caveman Cloud. A *workflow* is a job the code performs — "answer a support ticket", "build the nightly digest", "run the eval suite" — not a technology. Every gateway request can carry a workflow label; unlabeled traffic all lands in one `unlabeled-workflow` bucket. Your job: find the workflows, name them well, wire the labels, and verify nothing broke. This changes code, so it goes through the user's normal review: **propose the table first, apply after the user agrees.** Re-running on an already-labeled repo must change nothing (idempotent). This skill is operator-invoked. An `unlabeled-traffic` Cave Plan observation is review-only and does not create an advisory file, proposal, or Draft PR. Do not infer that telemetry selected a callsite or authorized an edit. Independently inventory the repository, present the labeling table, and wait for the user's approval before changing code. ## Step 1 — Inventory the workflows Walk the repo from its entry points, not from its imports: - HTTP/RPC handlers that call an LLM (directly or through layers) - Scheduled jobs: cron definitions, queue consumers, workers, GitHub Actions that invoke LLM code - CLI commands and scripts (`scripts/`, `bin/`, package.json scripts) - Eval / test harnesses that burn real tokens - Distinct agents or chains inside a framework (each LangGraph graph, each crew, each agent definition is usually its own workflow) One workflow = one job a human would name. Ten callsites inside the same request handler are one workflow; one shared `llm.ts` helper used by three jobs is three workflows (label at the callers, never the shared helper). ## Step 2 — Name them Slug grammar (the gateway enforces this): lowercase `[a-z0-9_-]`, 1–96 chars. Name the job, not the tech: - Good: `support-reply`, `nightly-digest`, `pr-review`, `eval-suite`, `onboarding-email` - Bad: `openai-calls` (tech), `main` (says nothing), `SupportReply` (invalid), `johns-test-3` (won't age) Names are forever-ish — renaming later splits the spend history. When a job's purpose isn't clear from the code, derive the slug from the file name and mark it `review` in the table rather than inventing a purpose. ## Step 3 — Propose, then apply Present this table and ask to proceed: ``` | workflow | job | where | how it gets labeled | |---|---|---|---| | support-reply | answers inbound tickets | src/bot/reply.ts:41 | defaultHeaders on the reply client | | nightly-digest | 02:00 summary job | jobs/digest.ts:12 | header on the digest client | | eval-suite (review) | scripts/eval.ts:8 — purpose inferred from filename | scripts/eval.ts:8 | env override at invocation | ``` Then wire each label with the lightest mechanism available at that callsite: - **@caveman-ai/sdk / caveman_cloud SDK**: per-trace `workflow` option, or `defaultWorkflow` on the client a single-job service constructs. - **Raw provider SDKs** (OpenAI/Anthropic/LangChain/LiteLLM/Vercel): add `"x-cave-workflow": "<slug>"` to the same `defaultHeaders` / `default_headers` / `extra_headers` block that already carries `x-cave-api-key`. Shared client used by several jobs → pass the header per call (every SDK above accepts per-request header overrides), or give each job its own thin client. - **Wrapped coding agents** (`caveman wrap`): `--workflow <slug>` flag or `CAVE_WORKFLOW=<slug>` env at the invocation site (cron line, CI step). - **Raw HTTP**: add the `x-cave-workflow` header to the request. Label the callers, keep the diff minimal, match the repo's style. If a callsite is not routed through the Caveman gateway at all, don't label it — list it under "not wired" in the report (labels only travel on gateway traffic; wiring is the caveman-setup skill's job). ## Step 4 — Verify Run whatever the repo already uses to exercise one labeled path (a test, a dev script, one curl). Then confirm: the request still succeeds (the gateway rejects an invalid label with 400 `cave_invalid_request_header` — fix the slug if so). Labeled spend appears on the dashboard at `/activity?tab=workflows` as each workflow next runs; jobs on a schedule show up when the schedule fires, and that's worth saying in the report rather than pretending they're live. ## Step 5 — Report ``` ## Workflows labeled | workflow | job | where | |---|---|---| | support-reply | answers inbound tickets | src/bot/reply.ts:41 | | nightly-digest | 02:00 summary job | jobs/digest.ts:12 | Verified: <the labeled path you actually exercised, and what you observed> Lands at: <DASHBOARD>/activity?tab=workflows — each row appears as that workflow next runs. Anything still unlabeled shows as `unlabeled-workflow`. Not wired (no gateway routing, so no label): <list or "none"> Marked review: <slugs whose purpose was inferred from filenames, or "none"> ``` If you found no LLM entry points at all: say exactly that, and point at the setup skill (`<docs origin>/docs/agent-setup.md`) instead of manufacturing a table.
© JuliusBrussee · Apache-2.0 · JuliusBrussee/caveman