Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions agents/update_docs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ trigger:
repositories: [cli]

session:
claude:
harness:
type: claude_code
model: claude-opus-4-8
system: |
You are an Ellipsis agent. You are tasked with updating the Ellipsis documentation (www.ellipsis.dev/docs) when new CLI changes are made. An agent run will be started when a pull request is merged into the main branch. Your job is to update the documentation to reflect the changes and open a pull request in ellipsis-dev/ellipsis with the changes. Make sure your changes adhere to the rules of the documentation repository (available in the docs skill in the ellipsis-dev/ellipsis repository).
instructions: |
You are an Ellipsis agent. You are tasked with updating the Ellipsis documentation (www.ellipsis.dev/docs) when new CLI changes are made. An agent run will be started when a pull request is merged into the main branch. Your job is to update the documentation to reflect the changes and open a pull request in ellipsis-dev/ellipsis with the changes. Make sure your changes adhere to the rules of the documentation repository (available in the docs skill in the ellipsis-dev/ellipsis repository).
environment:
repositories:
- name: ellipsis
4 changes: 2 additions & 2 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"test:watch": "vitest"
},
"dependencies": {
"@ellipsis-dev/sdk": "^0.27.0",
"@ellipsis-dev/sdk": "^0.28.0",
"chalk": "^5.6.2",
"cli-table3": "^0.6.5",
"commander": "^12.1.0",
Expand Down
65 changes: 35 additions & 30 deletions skills/ellipsis/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,14 @@ trigger:
schedule: "0 9 * * 1"

session:
claude:
harness:
type: claude_code
model: claude-haiku-4-5-20251001
system: |
Summarize the pull requests merged in api and web over the last 7
days. Group them by theme, lead with user-facing changes, and return
the summary as your answer. Ground every line in a real PR. Never
invent activity.
instructions: |
Summarize the pull requests merged in api and web over the last 7
days. Group them by theme, lead with user-facing changes, and return
the summary as your answer. Ground every line in a real PR. Never
invent activity.

environment:
repositories:
Expand Down Expand Up @@ -194,13 +195,14 @@ trigger:
paths: ["migrations/**"]

session:
claude:
system: |
Review the database migrations in this pull request for production
safety: locking that blocks writes on large tables, missing backfills
for new non-null columns, and rollout ordering that breaks if the
migration and the code deploy out of order. Comment on the pull
request with what you find.
harness:
type: claude_code
instructions: |
Review the database migrations in this pull request for production
safety: locking that blocks writes on large tables, missing backfills
for new non-null columns, and rollout ordering that breaks if the
migration and the code deploy out of order. Comment on the pull
request with what you find.

environment:
repositories:
Expand Down Expand Up @@ -304,21 +306,23 @@ pull_requests:

review:
- name: migration-safety
claude:
system: |
Review database migrations for production safety. Check for
locking that blocks writes on large tables, missing backfills for
new non-null columns, and rollout ordering that breaks if the
migration and the code deploy out of order.
harness:
type: claude_code
instructions: |
Review database migrations for production safety. Check for
locking that blocks writes on large tables, missing backfills for
new non-null columns, and rollout ordering that breaks if the
migration and the code deploy out of order.
pull_requests:
paths: ["**/migrations/**"]

filter:
name: strict-gate
claude:
system: |
Approve only findings a staff engineer would raise in review.
Reject style opinions and anything a linter catches.
harness:
type: claude_code
instructions: |
Approve only findings a staff engineer would raise in review.
Reject style opinions and anything a linter catches.

budget:
run: 15.00
Expand Down Expand Up @@ -450,7 +454,7 @@ agent automation delete <id> # delete it; it stops and frees its
agent automation link <id> --repo api # move it into a repo, via a pull request
agent automation unlink <id> # take it over from its file
agent template list # built-in templates and their slugs
agent model list # the model ids valid under claude.model
agent model list # model ids and their supported harnesses
```

An agent is owned by one of two writers, and that is what these verbs move.
Expand Down Expand Up @@ -492,8 +496,8 @@ Under `session`:

| Key | Purpose |
| --- | --- |
| `claude` | `system`, `model`, `effort`, `fallback_model`, `max_turns`, `settings`. |
| `codex` | Run on OpenAI's Codex CLI instead. Declaring the block selects the harness. |
| `harness` | Required: `type: claude_code` or `type: codex`, plus that harness's native `model` and `effort` options. Claude Code also accepts `fallback_model`, `max_turns`, and `settings`. |
| `instructions` | Text or repository file references appended to the harness prompt. |
| `environment` | A saved environment by name, or an inline block: `repositories`, `variables`, `ports`, `compute`, `image`, `hooks`, `mcp_servers`. |
| `permissions` | What it may do: `github` scopes its GitHub token, `ellipsis` its API token. |
| `skills` | Claude Code skills beyond what the cloned repositories provide. |
Expand All @@ -503,11 +507,12 @@ Under `session`:
The schema is strict, so an unknown or misplaced key fails validation rather
than being silently dropped. Points that decide whether a config works:

- `session.claude.system` takes inline text, a `{file: path}` reference to a repository
- `session.instructions` takes inline text, a `{file: path}` reference to a repository
file, or an ordered list of both, joined at session start. It is appended to
Claude Code's default prompt. 64 KiB per file.
- `session.claude.model` defaults to `claude-opus-5`. Claude, GPT, and GLM models are
available, and `agent model list` is the authoritative list of ids. Digest and
the selected harness's default prompt. 64 KiB per file.
- `session.harness.model` selects a model for the chosen harness. Claude Code
inherits the organization default when omitted. `agent model list` reports
the available ids and the harness certified for each. Digest and
summary jobs run well on `claude-haiku-4-5-20251001`; judgment jobs earn the
frontier model.
- `session.budget.session` defaults to $250, which is also the platform maximum, so it
Expand Down
16 changes: 8 additions & 8 deletions src/commands/automation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ export function registerAutomation(program: Command): void {
// goes to stderr so the YAML on stdout stays clean for piping.
const [{ automation: a }, me] = await Promise.all([
client.automations.get(automationId),
client.me(),
client.identity(),
])
printYaml(a)
console.error(`\nview: ${automationUrl(resolveAppBase(), me.customer_login, automationId)}`)
Expand Down Expand Up @@ -176,7 +176,7 @@ export function registerAutomation(program: Command): void {
printJson(session)
return
}
const me = await client.me()
const me = await client.identity()
console.log(`✓ started ${session.id}`)
console.log(` ${sessionUrl(resolveAppBase(), me.customer_login, session.id)}`)
console.log(` follow with: agent session get ${session.id} --watch`)
Expand Down Expand Up @@ -445,8 +445,8 @@ function automationName(a: Automation): string {
return a.config.ellipsis.name ?? a.id
}

// A minimal valid automation. `session.claude.system` is the only required
// field; everything else has a server-side default. Roots Ellipsis syncs from:
// A minimal automation with an explicit harness and task instructions.
// Roots Ellipsis syncs from:
// agents/, .agents/, ellipsis/, .ellipsis/ (any depth), as .yaml/.yml.
function starterConfig(name: string): string {
return `# Ellipsis automation. Commit this to your default branch; Ellipsis syncs it
Expand All @@ -463,11 +463,11 @@ ellipsis:

# What each session runs on.
session:
claude:
# System prompt defining the agent's behavior (required).
system: |
You are an Ellipsis agent. Describe the task you want it to perform here.
harness:
type: claude_code
# model: claude-opus-5 # optional; defaults to the organization default
instructions: |
You are an Ellipsis agent. Describe the task you want it to perform here.
# environment: backend # a saved environment, by name
`
}
Expand Down
2 changes: 1 addition & 1 deletion src/commands/connect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ export async function runConnect(

const [{ session }, me] = await Promise.all([
client.sessions.get(sessionId),
client.me(),
client.identity(),
// Pick the palette for this terminal's background before the first frame.
applyDetectedThemeMode(),
])
Expand Down
4 changes: 2 additions & 2 deletions src/commands/me.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export function renderMe(me: WhoAmI): void {
export function registerMe(program: Command): void {
apiRoutes(
program.command('me').description('Show the identity behind the current credential'),
'GET /v1/me',
'GET /v1/identity',
)
.option('--json', 'output raw JSON')
.action(async (opts: { json?: boolean }) => {
Expand All @@ -27,7 +27,7 @@ export function registerMe(program: Command): void {
// without this the request would go out unauthenticated and come back
// as a 401.
requireToken()
const me = await api().me()
const me = await api().identity()
if (opts.json) {
printJson(me)
return
Expand Down
10 changes: 5 additions & 5 deletions src/commands/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ export function registerModel(program: Command): void {
),
'ls',
),
'GET /v1/models',
'GET /v1/account/models',
)
.option('--json', 'output raw JSON')
.action(async (opts: { json?: boolean }) => {
await runAction(async () => {
const { models } = await api().models.list()
const { models } = await api().account.models.list()
if (opts.json) {
printJson(models)
return
Expand All @@ -33,10 +33,10 @@ export function registerModel(program: Command): void {
return
}
printTable(
['ID', 'NAME', 'DEFAULT'],
models.map((m) => [m.id, m.display_name, m.is_default_agent_model ? 'yes' : '']),
['ID', 'NAME', 'HARNESS', 'DEFAULT'],
models.map((m) => [m.id, m.display_name, m.harness, m.is_default_agent_model ? 'yes' : '']),
)
console.log('\nSelect one by setting `model:` under `claude:` in your automation YAML.')
console.log('\nSet `session.harness.type` and `session.harness.model` in your automation YAML, or use `agent session start --harness <type> --model <id>`.')
})
})
}
4 changes: 2 additions & 2 deletions src/commands/ping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ export function registerPing(program: Command): void {
program
.command('ping')
.description('Check that the API is reachable and the credential is valid'),
'GET /v1/me',
'GET /v1/identity',
)
.action(async () => {
// There's no unauthenticated health route on the public API, so we probe
// the lightest authenticated endpoint (/me): a 200 proves the API is
// reachable AND the stored token is valid.
try {
const me = await api().me()
const me = await api().identity()
console.log(`ok: ${me.customer_login} (${me.customer_id})`)
} catch (err) {
if (err instanceof APIError && err.status === 401) {
Expand Down
14 changes: 8 additions & 6 deletions src/commands/review.ts
Original file line number Diff line number Diff line change
Expand Up @@ -250,9 +250,10 @@ ellipsis:
#
# review:
# - name: migration-safety
# claude:
# system: |
# Review SQL migrations for locks that block writes on a large table.
# harness:
# type: claude_code
# instructions: |
# Review SQL migrations for locks that block writes on a large table.
# pull_requests:
# paths: ["sql/migrations/**"]
#
Expand All @@ -261,9 +262,10 @@ ellipsis:
#
# filter:
# name: gatekeeper
# claude:
# system: |
# Drop any finding that is not worth the author's time.
# harness:
# type: claude_code
# instructions: |
# Drop any finding that is not worth the author's time.

budget:
run: 2.00
Expand Down
Loading