---
title: "List Skills From Bound Repo"
method: GET
path: "/v1/environments/{environmentId}/repo-skills"
tags: ["Environments"]
---

# List Skills From Bound Repo

`GET /v1/environments/{environmentId}/repo-skills`

Returns skills, agents, commands, prompts, and rule files committed to the repository (or repository set) the environment is bound to. Resolved live from the repo's default branch via GitHub. Read-only: these are sourced from the user's git tree, not from `skills.sh`. When the environment is not bound to a repo, returns an empty list with no error.

## Path parameters

- `environmentId` string, required

## Response `200`

Successful response. `error` is populated when discovery encountered a partial failure (e.g. the repo has no GitHub App installation); the UI surfaces it inline rather than treating it as a 5xx.

- ListRepoSkillsResponse
  - `repo_skills` RepoSkill[], required
    - `id` string, required — Stable id, formed from the repository UUID and the in-repo path.
    - `repository_id` string, uuid, required
    - `repository_full_name` string, required — Repo's `owner/name` (denormalized for the UI).
    - `branch` string, required — Default branch the file was resolved against.
    - `path` string, required — Repo-relative path of the discovered file or skill directory.
    - `name` string, required — Human-friendly name (from YAML frontmatter when present, otherwise the filename or directory).
    - `description` string, nullable, required — Single-line description, populated from frontmatter when available.
    - `framework` 'claude' | 'codex' | 'cursor' | 'agents', required — Which AI tool owns the discovered file's on-disk convention.
    - `kind` 'skill' | 'agent' | 'command' | 'prompt' | 'plugin', required — Sub-kind within the framework.
    - `html_url` string, uri, required — Direct GitHub blob link.
  - `error` string, nullable, required — Populated when discovery couldn't run end-to-end (e.g. the bound repo has no GitHub App installation). The list may still be partially filled; the UI shows this as an inline banner rather than a 5xx.

## Other responses

- `400` — Bad request - Missing or invalid parameters
- `401` — Unauthorized - Invalid or missing API key
- `404` — Resource not found
- `500` — Internal server error

---

[API](https://skmtc.net/tryreplicas/apis/replica-api.md) · [All operations](https://skmtc.net/tryreplicas/apis/replica-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/tryreplicas/replica-api/versions/aa3b4c932f7a/schema)
