# Discover LLM Workflows

Finds and labels every LLM workflow in a repo so spend can be grouped by workflow.

- Repository: https://github.com/JuliusBrussee/caveman (116680 stars)
- Category: Data and ML
- License: Apache-2.0
- Last updated: 2026-11-01
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add JuliusBrussee/caveman --skill caveman-discover -g -a claude-code -y`
Codex: `npx skills add JuliusBrussee/caveman --skill caveman-discover -g -a codex -y`
Cursor: `npx skills add JuliusBrussee/caveman --skill caveman-discover -g -a cursor -y`
Gemini CLI: `npx skills add JuliusBrussee/caveman --skill caveman-discover -g -a gemini-cli -y`
Claude Code plugin marketplace: `/plugin marketplace add JuliusBrussee/caveman`

## 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.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

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:

The rest: https://github.com/JuliusBrussee/caveman/blob/HEAD/skills/caveman-discover/SKILL.md
