Code Index
Brand-scoped code-index reads for repository orientation, directory trees, stored files and symbols, pre-write existence checks, imports, callers, and the tests a change can break.
Give your agents a map of your code. When a project has a GitHub repository attached, OPVS keeps a structural index of it: every file, function and class it can find, where each one lives, and what imports it. This skill lets your agents read that map. They can check whether something already exists before they write it again, and see who calls a function before they change it.
Install it when agents work on a real repository. An agent can find its way around a project it has never seen, open the right file first, ask what a change could break, and pick which tests to run. A parser builds the index, so no source goes to a model provider. The skill only reads: it cannot change the index or your code.
Three limits hold for every answer. The index is as old as its last commit, so check its age. A heuristic caller may be wrong. A test hint is not coverage. When callers cannot be known, for example in a language with no call data, the answer says unknown, never zero.
Features6
Read the summary, folder tree, files and symbols of the indexed repository, and how fresh each answer is.
Ask whether a function or an idea already exists, and where, before an agent writes it again.
See the functions that call a file or symbol, each marked exact or heuristic, with nearby test hints. A hint is not coverage. Calls are indexed for Python.
List the test files that reach a file through imports and through files they read. It is a selection to run first, not proof of coverage.
Walk what a file imports and what imports it, or roll a folder up to see its busiest files. Works for Python, TypeScript and JavaScript.
Follow a file or symbol through renames and removals with stable ids, and page through what changed.
Articles about Code Index1 article
Articles about Code Index1 article
Showing all 1
SKILL.mdthe file your agent reads
SKILL.md loads when you open this tab.
What's new9 releases · newest first · from the package's CHANGELOG
v0.6.02026-10-28Latest
### Added
- `testsFor` (`POST /{project_id}/tests-for`) — list the test files that can
reach up to 200 repo-relative files through stored `import` and `reads`
edges, nearest first, with `hops` and `edge_kinds` per test. Same
`code.index.read` entitlement and `code:read` PAT scope as every other
method. Body: `paths` (1–200, each at most 1024 chars), `depth` (1–6,
default 4), `limit` (1–500 per path, default 200); `format=yaml|md` is a
query parameter. The route fails open: with no ready index it answers 200,
every path `known: false`, and the reason in `degraded`.v0.4.12026-10-11
### Fixed - `listFiles` now exposes the API's `order=symbols|path` selection and repo-relative `after` cursor. Use `order=path` and pass the last returned path as `after` to page through large directories.
v0.4.02026-10-11
### Added
- `getGraphFolders` (`GET /{project_id}/graph/folders`) — read the folder-level
import map beneath a repo-relative directory: which folders import which,
which files are hubs, and which import each other. Joins the skill under the same
`code.index.read` entitlement and the same `code:read` PAT scope (D52).
Parameters: `dir` (the route's wire name, exposed via `Query(alias="dir")`;
a dot is the repository root; max 1024 chars), `depth` (1–10, default 2),
`limit` (positive; the server clamps it), `branch` (max 255 chars), and
optional `format=yaml|md`. The response reports `truncated`,
`limit_clamped`, and `effective_limit`. Edges are imports only (Python and
TS/JS, D43): no Go edges and no call edges; `indexed: false` means "no
ready index", never "no imports".
- `SKILL.md` adds a short section on what to do when OPVS cannot answer: if a
call 5xxs, times out, or cannot connect, the agent carries on WITHOUT the
index (reading the repository or using the handbook), does NOT retry in a
loop, and says ONCE in its reply that the code index was unavailable. A 4xx
is not this case — a 4xx is a wrong call, and the agent fixes the call.v0.3.32026-10-05
### Added - `listNodeChanges` accepts `order=asc|desc` (default `asc`, unchanged) and a `before` cursor for newest-first paging; `after` stays valid only with `order=asc`. Reuse `next_after` as `after` for ascending pages or as `before` for descending pages. The API side shipped in TCI-153 (#2885); this release makes it visible to agents.
v0.3.22026-10-03
### Added - `listFiles` and `listSymbols` accept `format=yaml|md`, matching the API's text renderings while JSON remains the default when `format` is omitted. Both renderings preserve the selected commit and branch, every returned row, and any truncation reason.
v0.3.12026-10-02
### Added - `getGraph` accepts `format=yaml|md` for a text rendering of the import neighbourhood. JSON stays the default when `format` is omitted. The yaml and md renderings carry every field the JSON does, including each neighbour's edge `kind`, `truncated` and `limit_clamped`.
v0.3.02026-10-02
### Added
- `getGraph` (`GET /{project_id}/graph`) — read the depth-1 or depth-2
IMPORT neighbourhood of one stable node (`direction` is `in`, `out`, or the
default `both`; `depth` is 1 or 2). Joins the skill under the same
`code.index.read` entitlement and the same `code:read` PAT scope (D46).
Edges are imports only (Python and TS/JS, D43): there are no Go edges and
no call edges. Each neighbour carries `state` (`live`, `removed`,
`moved`), `kind: "import"`, and `derivation` (`parsed` or `regex`). The
route does not render `format=yaml|md`, so the schema declares no `format`
parameter (per the format-dial test). `limit` is positive and the API
clamps it; the response reports `truncated`, `limit_clamped`, and
`effective_limit`.v0.2.02026-10-02
### Added
- `resolveNodes` (`POST /{project_id}/nodes/resolve`) — batch-resolve stable
code anchors against the ledger; one `live | removed | moved | unknown`
verdict per anchor, with `moved_to_anchor` and `fallback: "file"`
follow-on fields. `format` is declared `in: query` so the runtime does not
forward it as a body field that `CodeNodesResolveRequest` (extra="forbid")
would reject as a 422.
- `listNodeChanges` (`GET /{project_id}/nodes/changes`) — page the attached
branch's appended node events, oldest first, with `after` as the cursor
and `history_skipped_reason` exposed when history is not being recorded.
Adds `node_id` (a list of up to 100 stable node UUIDs) and `path_prefix`
(a repo-relative path, max 1024 chars) as filters, mirroring TCI-122.v0.1.02026-09-29
### Added - Initial read-only marketplace skill with tree, summary, files, symbols, and context-search methods.

