Pistis

Define an agent in your repository

The files Pistis reads to import an agent, every field, how updates are picked up, and examples.

An agent can live in a git repository: its name, instructions, skills and MCP servers as plain files. You review a change to it like any other change, and Pistis imports it as a new revision of the agent.

The smallest agent

One file, .claude-plugin/plugin.json, with a name:

.claude-plugin/plugin.json
{
  "name": "Reviewer"
}

Commit it, then open Agents → Import from git, paste the repository's address and click Import.

Import from git: paste the repository's address, and the agent is there.

The import screen shows this page's reference too, and Copy starter file copies this starter:

.claude-plugin/plugin.json
{
  "name": "My agent",
  "description": "What it does, in one line",
  "version": "1.0.0"
}

Where the files go

At the top of the repository's default branch:

FileWhat it holds
.claude-plugin/plugin.json or plugin.jsonRequiredThe agent's name and description.
AGENTS.mdOptionalThe agent's instructions, added to every session on it.
skills/<skill>/SKILL.mdOptionalA skill: instructions the agent opens when they fit. Other files in its folder go with it.
.mcp.jsonOptionalTools from MCP servers.

Pistis reads only plain files inside the repository; links are ignored. A skill's folder may hold other files the skill needs, up to 1 MB each.

Every field

.claude-plugin/plugin.json

FieldValueWhat it means
name (required)textThe agent's name, shown when people pick one. Its id is made from it, so keep it once people use it.
descriptiontextOne line people see beside the name.
versiontextYour version of the agent, kept with its skills.

skills/<skill>/SKILL.md

FieldValueWhat it means
nametextThe skill's name. Left out, the folder's name.
descriptiontextWhen the skill helps. The agent sees this line and opens the skill when it fits.

.mcp.json

FieldValueWhat it means
mcpServersobjectServers by name. The agent calls a server's tool as <name>__<tool>.
mcpServers.<name>.type"http" or "streamable-http"http: the server is called at its url.
mcpServers.<name>.urltextThe server's web address. Your Pistis server calls it, never the sandbox.
mcpServers.<name>.headersnames → textHeaders sent with each call, such as Authorization. ${PISTIS_MCP_NAME} reads a value from your server's environment.
mcpServers.<name>.auth"per-person"per-person: each person connects their own account, and calls go out as them.
mcpServers.<name>.connect"token" or "oauth" or "enterprise"How each person connects: a pasted token, signing in (oauth), or your company sign-in (enterprise).
mcpServers.<name>.commandtextA program to start. On your Pistis server it stays off until an admin reads it and turns it on.
mcpServers.<name>.argslist of textThe program's arguments.
mcpServers.<name>.envnames → textEnvironment for the program. ${PISTIS_MCP_NAME} reads a value from your server's environment.
mcpServers.<name>.placement"sandbox"sandbox: start the program inside each session's sandbox instead, with no secrets.
mcpServers.<name>.fileslist of textFiles from the repository copied next to a sandbox program.
mcpServers.<name>.toolslistA sandbox program's tools, listed ahead: name, description and inputSchema each.

A skill is a SKILL.md whose front matter sits between two --- lines; the rest of the file is what the agent reads. A server with a command and no placement runs on your Pistis server and stays off until an admin reads the command on the agent's page and clicks Enable, because a repository is someone else's code.

How updates are picked up

  • Nothing changes by itself. Import again, or click Update from repository on the agent's page, to read the default branch as it is now. Each import makes a new revision.
  • Running sessions keep the revision they started on; new sessions get the new one.
  • The model, approvals, browser and pull request feedback settings you choose on the agent's page stay through an update. The repository brings the name, description, instructions, skills and MCP servers.
  • The agent's id comes from name. Renaming it in plugin.json imports a different agent.

When an import fails

The import screen lists everything wrong at once, each with its file and field: no plugin.json where Pistis looked, a file that isn't valid JSON (with the line and column), a missing or wrong field, or a repository Pistis can't read. Nothing is saved until all of them are fixed. Pistis reads repositories it can reach without a password.

Examples

Reviewer

Reads a change and reports bugs, risky edits and missing tests, without changing anything.

.claude-plugin/plugin.json
{
  "name": "Reviewer",
  "description": "Reviews a change for bugs, risky edits and missing tests",
  "version": "1.0.0"
}
AGENTS.md
You review code changes. Read the diff and the code around it before you say anything.
- Report bugs first, then risky edits, then missing tests. Quote the lines you mean.
- Don't change files. Finish with a short list a person can act on.
skills/review-checklist/SKILL.md
---
name: review-checklist
description: The checks to run on every change before calling it ready.
---
1. Does each changed function still handle empty, missing and very large input?
2. Is every new branch covered by a test?
3. Could this change leak a secret, a token or personal data into logs?

Test fixer

Finds why a test fails and fixes the cause, not the test.

.claude-plugin/plugin.json
{
  "name": "Test fixer",
  "description": "Finds why a test fails and fixes the cause",
  "version": "1.0.0"
}
AGENTS.md
You fix failing tests. Run the failing test alone first and read its whole output.
- Fix the code under test. Change a test only when it checks the wrong thing, and say why.
- Run the full suite before you finish, then commit with a message that names the cause.
skills/run-tests/SKILL.md
---
name: run-tests
description: How to find and run this repository's tests.
---
Look for the test command in package.json, Makefile or the CI workflow, in that order. Run one test file first, then everything.

Docs writer

Writes and updates documentation from the code, and can look up other projects' docs.

.claude-plugin/plugin.json
{
  "name": "Docs writer",
  "description": "Writes and updates docs from the code",
  "version": "1.0.0"
}
AGENTS.md
You write documentation. Read the code before you describe it, and run every command you document.
- Write for someone new to the project: short sentences, one idea each, real examples.
- Update the docs that the change touches; don't start new pages unless asked.
.mcp.json
{
  "mcpServers": {
    "deepwiki": {
      "type": "http",
      "url": "https://mcp.deepwiki.com/mcp"
    }
  }
}

On this page