Understand your skill estate
How to use Tessl Skill Inventory to understand the skills you have across your org and the extent of your skill sprawl.
Skills are multiplying across your repos. Most teams have no idea how many they have, who owns them, or how many are near-duplicates of each other.
Tessl Skill Inventory gives you a living map of every skill in your org - what exists, where it's used, and where you're duplicating effort.
It's free, and you can run it today.
The CLI import in the Quickstart below needs at least the publisher role. Creating an inventory from the web, enabling automatic scanning, and private indexing are manager-only. See Roles for the full permission breakdown.
Quickstart
2. Download the Github CLI (we access your code through your Github auth via the CLI)
3. Authenticate
tessl login4. Run the import
tessl inventory importTessl scans your repos, collects your skills and manifests, and gives you a snapshot of your whole inventory. Run it again any time - each scan is diffed, so you get a living view of what's new, unchanged, and removed over time.
Want to test on a subset first?
tessl inventory import --repo repo-a --repo repo-b
Detailed Guide
How It Works
The tessl CLI scans your repository, collects your skills and manifest files, and uploads them to Tessl. Each upload is a snapshot — Tessl tracks what's new, what's unchanged, and what's been removed across successive uploads so you get a living view of your skill inventory over time.
The Tessl CLI
The scan runs entirely from your local machine using the tessl CLI. Before running it, you need two things:
GitHub CLI (
gh) authenticated - the CLI uses your GitHub credentials to read repos and files. Access is scoped to whatever your GitHub account can see.Logged in to Tessl - run
tessl loginto authenticate before scanning.
Running the scan
By default, tessl scans your last 100 most recently active repositories. For large organisations this is a good starting point, but you can be more selective using --repo:
tessl inventory import --repo repo-a --repo repo-b
You can pass --repo as many times as you like. This is useful for testing the import on a small subset before running it across your whole organisation.
What we don't collect
No code - only
skill.mdfiles and manifest files are read. Source code files are never accessed.No names or email addresses - only GitHub usernames are collected, never real names or email addresses.
No repo clones - repos are never checked out. Individual files are fetched directly via the GitHub API.
GitHub API rate limits
The CLI uses the GitHub API under the hood, which has a limit of 5,000 requests per hour. If you have a large number of repos or skills, you may hit this limit mid-scan. In that case, wait for the limit to reset and re-run - successive scans are diffed, so you won't lose previously collected data.
What Gets Collected
Skills (skill.md files)
Every skill.md file found anywhere in your repository is collected, including:
The full markdown body
Any YAML frontmatter (name, description, etc)
The file path within the repo
Git metadata: created/updated dates, last touched by username.
Skills inside test fixture directories are included but tagged separately so they don't pollute your inventory metrics.
Manifest files
The following manifest files are collected if present:
skills-lock.json
Skills installed via npx skills with pinned versions and content hashes
tessl.json
Tessl's installed skill manifest
tile.json
Legacy tessl plugin definition with skill declarations
.tessl-plugin/plugin.json
Tessl plugin definition
.claude-plugin/plugin.json
Claude plugin definition
.claude-plugin/marketplace.json
Marketplace plugin listing
.claude/settings.json
Claude Code agent settings. Used to determine which marketplaces are being used
Limitations
Linked files are not uploaded. If your
skill.mdreferences other markdown files (e.g. via@rules.mdor a markdown link), those files are not followed or stored — only theskill.mditself is captured.Scripts are not uploaded. Any executable files (
.sh,.py, etc.) associated with a skill are not collected.Manifest references are not resolved. The manifest files themselves are stored, but any file paths referenced inside them are not read or uploaded.
Default scan is capped at 100 repos. Only the 100 most recently active repositories are scanned by default. Use
--repoto target specific repos if needed.
Last updated

