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
28 changes: 14 additions & 14 deletions .agents/skills/browser/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,24 @@ description: A real browser you drive from the shell, to see or act on a web pag

# The browser

A headless Chrome of your own, on an empty profile: nobody's logins are in it. Drive it with the `browser` command, a dependency of this repository (`@openagt/skill-browser`), run as `npx browser`. When that fails for a missing `node_modules`, install with the lockfile's package manager (`npm install` for `package-lock.json`) and run it again. It needs Chrome on the machine, or `CHROME_PATH` set to a Chrome or Chromium executable.
A headless Chrome of your own, on an empty profile: nobody's logins are in it. Drive it with the `browser` command, always run by its full name: `npx @openagt/skill-browser@0.1`. It needs Chrome on the machine, or `CHROME_PATH` set to a Chrome or Chromium executable.

```
npx browser open <address> open the address, starting the browser if none is open
npx browser read print the page again
npx browser click <n> click element n
npx browser type <n> <text> replace what element n holds with the text; on a select, pick that option;
on a date or time field, give the value as 2024-01-31, 13:45, 2024-01
npx browser press <key> Enter, Tab, Escape, Backspace, Space, ArrowUp, ArrowDown, ArrowLeft, ArrowRight
npx browser screenshot [file] save what the page shows as a PNG and print its path (a temporary file
when none is named; never name one inside the repository)
npx browser eval <script> run a JavaScript expression in the page and print its value, as JSON
(`document.title`, not `return document.title`; `await` works; an
element prints as `{}`, so ask for its properties)
npx browser close close the browser
npx @openagt/skill-browser@0.1 open <address> open the address, starting the browser if none is open
npx @openagt/skill-browser@0.1 read print the page again
npx @openagt/skill-browser@0.1 click <n> click element n
npx @openagt/skill-browser@0.1 type <n> <text> replace what element n holds with the text; on a select, pick that option;
on a date or time field, give the value as 2024-01-31, 13:45, 2024-01
npx @openagt/skill-browser@0.1 press <key> Enter, Tab, Escape, Backspace, Space, ArrowUp, ArrowDown, ArrowLeft, ArrowRight
npx @openagt/skill-browser@0.1 screenshot [file] save what the page shows as a PNG and print its path (a temporary file
when none is named; never name one inside the repository)
npx @openagt/skill-browser@0.1 eval <script> run a JavaScript expression in the page and print its value, as JSON
(`document.title`, not `return document.title`; `await` works; an
element prints as `{}`, so ask for its properties)
npx @openagt/skill-browser@0.1 close close the browser
```

Quote a `<text>` or `<script>` with spaces as one argument: `npx browser type 2 'Ada Lovelace'`.
Quote a `<text>` or `<script>` with spaces as one argument: `npx @openagt/skill-browser@0.1 type 2 'Ada Lovelace'`.

`open`, `read`, `click`, `type` and `press` print the page once it has loaded (or after 10 seconds, as it stands): its title, its address, its text (the first 10,000 characters), then its elements (links, buttons, fields; the first 300) numbered `[n]`. What is inside an iframe or a shadow root is not printed; reach it with `eval`. `click` and `type` take that number, from the last print: when the page changes, the numbers do too. The numbers are written on the page's elements as `data-browser-ref` attributes. An address without `http://` or `https://` gets `http://`; no other kind opens. A dialog the page opens (alert, confirm, prompt) is accepted at once, and the next print begins with a `Dialog, accepted:` line naming it.

Expand Down
10 changes: 5 additions & 5 deletions .agents/skills/discord/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@ description: Post a message to the team's Discord channel from the shell, when a

# Discord

Post one message to a Discord channel with the `discord` command, a dependency of this repository (`@openagt/skill-discord`), run as `npx discord`. When that fails for a missing `node_modules`, install with the lockfile's package manager (`npm install` for `package-lock.json`) and run it again.
Post one message to a Discord channel with the `discord` command, always run by its full name: `npx @openagt/skill-discord@0.1`.

```
npx discord send "<message>" post the message to this machine's webhook
npx discord status whether this machine has a webhook, and where it comes from
npx @openagt/skill-discord@0.1 send "<message>" post the message to this machine's webhook
npx @openagt/skill-discord@0.1 status whether this machine has a webhook, and where it comes from
```

Quote the message as one argument. It is posted as a Discord message, so Discord's markdown formats it (`*`, `_`, backticks), up to 2,000 characters (a longer one is cut and says so); `@everyone` and other mentions in it do not ping anyone.

The channel is the one whose webhook this machine was given, by a person: `npx discord setup <webhook>` saves it for this user on this machine, `npx discord setup --clear` forgets it, and `DISCORD_WEBHOOK` in the environment wins over the saved one. Never ask for the webhook, never print it, and never write it into the repository: anyone holding it can post to the channel.
The channel is the one whose webhook this machine was given, by a person: `npx @openagt/skill-discord@0.1 setup <webhook>` saves it for this user on this machine, `npx @openagt/skill-discord@0.1 setup --clear` forgets it, and `DISCORD_WEBHOOK` in the environment wins over the saved one. Never ask for the webhook, never print it, and never write it into the repository: anyone holding it can post to the channel.

`send`, `setup` and `status` print one JSON line on stdout. A refusal exits 1 with the reason on stderr: `no-webhook` (none on this machine: say so and go on, a person sets it), `not-posted` (Discord or the network refused it; the detail says which, never the URL), `empty`, and for `setup`, `invalid`. A wrong command line exits 2 with the usage on stderr.

Expand All @@ -23,5 +23,5 @@ The channel is the one whose webhook this machine was given, by a person: `npx d
A tool that runs coding agents may run a line of the person's when a run ends, with the message in `$MESSAGE`. This is the line:

```
npx discord send "$MESSAGE"
npx @openagt/skill-discord@0.1 send "$MESSAGE"
```
8 changes: 4 additions & 4 deletions .agents/skills/github/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ The project's pull requests and issues are on GitHub. This skill is how you reac

## The command

`github` is a dependency of this repository (`@openagt/skill-github`). If `node_modules` is missing, install with the lockfile's package manager (`npm install` for `package-lock.json`). Then run `npx github` inside your checkout. It prints JSON; a refusal exits 1 with a line on stderr; a wrong command line exits 2 with the usage.
Run the `github` command inside your checkout, always by its full name: `npx @openagt/skill-github@0.1`. It prints JSON; a refusal exits 1 with a line on stderr; a wrong command line exits 2 with the usage.

## Your pull request

Open a pull request only when your task or the person asks for one, or asks you to publish your work. Push your branch first (your branches skill says how), then:

```
npx github open --title "<one line naming what the change does>" --body "<what changed, and why>"
npx @openagt/skill-github@0.1 open --title "<one line naming what the change does>" --body "<what changed, and why>"
```

It opens the pull request for the branch you are on and prints it in `request` (`number`, `url`). A branch that already has an open pull request gets no second one: that one is answered, with `existing` true. Add `--merge` when the work may land on its own: the pull request then merges once its checks pass, also where the repository does not allow auto-merge (`merge` in the answer says `auto-armed`, `merged` or `watching`). Add `--draft` instead for a pull request a person should look at first; with `--merge` too, `--draft` is dropped.
Expand All @@ -26,7 +26,7 @@ A pull request whose body has a line `Closes #<number>` closes that issue when i
## Reading pull requests and issues

```
npx github requests [--branch <b>] [--state open|merged|all] [--since <iso>]
npx @openagt/skill-github@0.1 requests [--branch <b>] [--state open|merged|all] [--since <iso>]
```

The project's newest 50 pull requests, newest first, all states unless `--state`, only `<b>`'s with `--branch`; `--since` keeps those created since, or merged since with `--state merged`. Each has `number`, `url`, `state` (`open`, `merged`, `closed`), `title`, `draft`, `branch`, `head`, `createdAt`, and for a merged one `mergedAt` and `mergeCommit` (the commit it landed as).
Expand All @@ -36,7 +36,7 @@ For a pull request's discussion and diff, and for the project's issues, use `gh`
## Landing a pull request for a person

```
npx github merge <number>
npx @openagt/skill-github@0.1 merge <number>
```

A draft is marked ready, then the merge is armed as `--merge` arms it: `outcome` says `auto-armed`, `merged` or `watching`; a request no longer open is refused as `not-open`. Only when whoever started you asked you to land it.
14 changes: 7 additions & 7 deletions .agents/skills/logs/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,21 @@ description: The record of every run agents made on this project — what was as

Every run an agent made on this project leaves a record on the branch `agent-data`, never on a code branch; your checkout does not contain it. A run is two files under `agents/<who>/`: the card, `<id>.json` — what was asked, the branch, the pull request, how it ended, what it cost — and the diary, `<id>.jsonl` — what the agent said along the way, its result.

Read them with the `logs` command, a dependency of this repository (`@openagt/skill-logs`), run as `npx logs`. When that fails for a missing `node_modules`, install with the lockfile's package manager (`npm install` for `package-lock.json`) and run it again. You only read: the program that ran an agent records its run, at its end. The command's `delete` and `patch`, and its `--local` and `--full` flags, are for the dashboard that shows the runs; never use them. A refusal exits 1 with a line on stderr; a wrong command line exits 2 with the usage.
Read them with the `logs` command, always run by its full name: `npx @openagt/skill-logs@0.1`. You only read: the program that ran an agent records its run, at its end. The command's `delete` and `patch`, and its `--local` and `--full` flags, are for the dashboard that shows the runs; never use them. A refusal exits 1 with a line on stderr; a wrong command line exits 2 with the usage.

## Read

```
npx logs [--branch <name>] [--limit N]
the runs, newest first, as one JSON array of cards — the newest 20
unless --limit says otherwise; --branch keeps the runs on one branch
npx logs show <id> one run: its card, plus `diary`, the lines of what the agent
said, its result, how it ended, and what it cost
npx @openagt/skill-logs@0.1 [--branch <name>] [--limit N]
the runs, newest first, as one JSON array of cards — the newest 20
unless --limit says otherwise; --branch keeps the runs on one branch
npx @openagt/skill-logs@0.1 show <id> one run: its card, plus `diary`, the lines of what the agent
said, its result, how it ended, and what it cost
```

## Before you plan or work a ticket, read its earlier runs

A ticket may have been worked before. Claiming it names who claimed it before you: a run's id, shaped like `2026-09-08T18-14-30-111Z`, read with `npx logs show <id>`, or else a branch, read with `npx logs --branch <name>`; no run on that branch means no record: read the branch itself. A `stopped` or `failed` run tells you what to avoid: read what its agent said before it ended. A `done` run with a `pr` means the work may already be there: read the pull request before doing it again.
A ticket may have been worked before. Claiming it names who claimed it before you: a run's id, shaped like `2026-09-08T18-14-30-111Z`, read with `npx @openagt/skill-logs@0.1 show <id>`, or else a branch, read with `npx @openagt/skill-logs@0.1 --branch <name>`; no run on that branch means no record: read the branch itself. A `stopped` or `failed` run tells you what to avoid: read what its agent said before it ended. A `done` run with a `pr` means the work may already be there: read the pull request before doing it again.

## The card

Expand Down
16 changes: 8 additions & 8 deletions .agents/skills/orchestration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@ description: "Split your task across subagents: plan it, get the person's yes, s

# Orchestration

A subagent is another coding agent you start on one part of your task: it works alone, in its own checkout. Use the `orchestration` command, a dependency of this repository (`@openagt/skill-orchestration`), run as `npx orchestration`. When that fails for a missing `node_modules`, install with the lockfile's package manager (`npm install` for `package-lock.json`) and run it again.
A subagent is another coding agent you start on one part of your task: it works alone, in its own checkout. Use the `orchestration` command, always run by its full name: `npx @openagt/skill-orchestration@0.1`.

```
npx orchestration plan <file> save the file as your plan; answers the `question` to ask the person
npx orchestration start --level <simple|hard> "<task>"
start a subagent on the task; answers its id at once, without waiting for it
npx orchestration list your subagents, newest first, as one JSON array
npx orchestration read <id> one subagent: its `status`, and once it ended its `branch` and `result`, its last reply
npx orchestration stop <id> stop a subagent that is running
npx orchestration land <id> merge an ended subagent's branch into yours, then delete that branch
npx @openagt/skill-orchestration@0.1 plan <file> save the file as your plan; answers the `question` to ask the person
npx @openagt/skill-orchestration@0.1 start --level <simple|hard> "<task>"
start a subagent on the task; answers its id at once, without waiting for it
npx @openagt/skill-orchestration@0.1 list your subagents, newest first, as one JSON array
npx @openagt/skill-orchestration@0.1 read <id> one subagent: its `status`, and once it ended its `branch` and `result`, its last reply
npx @openagt/skill-orchestration@0.1 stop <id> stop a subagent that is running
npx @openagt/skill-orchestration@0.1 land <id> merge an ended subagent's branch into yours, then delete that branch
```

A refusal exits 1 with a line on stderr saying why.
Expand Down
2 changes: 1 addition & 1 deletion .agents/skills/plan-tickets/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ schedule:
every: 6h
waits-for: when a ticket that is not waiting, claimed, in review or queued has no plan, or an outdated one
when: |-
npx tickets list | jq --argjson q "$(npx queue)" '[.[] | select(((.planned | not) or .outdated) and .pr == null and (.waiting | not) and (.locked | not) and ((.file | rtrimstr(".md")) as $s | $q | any(contains($s)) | not)) | .file]'
npx @openagt/skill-tickets@0.1 list | jq --argjson q "$(npx @openagt/skill-queue@0.1)" '[.[] | select(((.planned | not) or .outdated) and .pr == null and (.waiting | not) and (.locked | not) and ((.file | rtrimstr(".md")) as $s | $q | any(contains($s)) | not)) | .file]'
---

Queue plans for the tickets that need one. Nobody will answer you: never ask, decide yourself. You only queue work, you never do it: write no plan yourself, the only thing you change is the queue.
Expand Down
2 changes: 1 addition & 1 deletion .agents/skills/post-merge-cleanup/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ schedule:
every: 1h
waits-for: when a pull request merged since the last clean-up has no clean-up yet
when: |-
gh pr list --state merged --limit 50 --json number,body --search "merged:>=$(npx logs --limit 200 | jq -r '[.[] | select(.intent == "/post-merge-cleanup" and .status == "done")][0].startedAt // (now - 86400 | todate)')" | jq '[.[] | select(.body | contains("Post-merge cleanup done.") | not) | .number]'
gh pr list --state merged --limit 50 --json number,body --search "merged:>=$(npx @openagt/skill-logs@0.1 --limit 200 | jq -r '[.[] | select(.intent == "/post-merge-cleanup" and .status == "done")][0].startedAt // (now - 86400 | todate)')" | jq '[.[] | select(.body | contains("Post-merge cleanup done.") | not) | .number]'
---

Write what merged work decided and taught into the project's knowledge files. Nobody will answer you: never ask, decide yourself.
Expand Down
16 changes: 8 additions & 8 deletions .agents/skills/queue/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,22 @@ description: Where the project's agent queue lives, how to read it and change it

The agent queue (`TODO_AGENTS.md`) lives on the branch `agent-data`, never on a code branch; your checkout does not contain it. It lists every task agents will work on next, in the order they will be taken.

Read and change it with the `queue` command, a dependency of this repository (`@openagt/skill-queue`), run as `npx queue`. When that fails for a missing `node_modules`, install with the lockfile's package manager (`npm install` for `package-lock.json`) and run it again. Every change it makes is one commit on the `agent-data` branch, pushed straight to the remote when the project shares its records. The command's `--local` and `--full` flags are for the dashboard that shows the queue; never use them. A refusal exits 1 with a line on stderr; a wrong command line exits 2 with the usage.
Read and change it with the `queue` command, always run by its full name: `npx @openagt/skill-queue@0.1`. Every change it makes is one commit on the `agent-data` branch, pushed straight to the remote when the project shares its records. The command's `--local` and `--full` flags are for the dashboard that shows the queue; never use them. A refusal exits 1 with a line on stderr; a wrong command line exits 2 with the usage.

## Read

```
npx queue the open entries, in order of work, as one JSON array
npx @openagt/skill-queue@0.1 the open entries, in order of work, as one JSON array
```

## Change

```
npx queue add <text> [--priority N]
put an entry on the queue; --priority (0-10) places it at the end of
that section; without it, the entry goes at the end of the file
npx queue done <entry> remove an entry: one quoted argument, exactly as `npx queue`
printed it; done means deleted
npx @openagt/skill-queue@0.1 add <text> [--priority N]
put an entry on the queue; --priority (0-10) places it at the end of
that section; without it, the entry goes at the end of the file
npx @openagt/skill-queue@0.1 done <entry> remove an entry: one quoted argument, exactly as `npx @openagt/skill-queue@0.1`
printed it; done means deleted
```

## Format
Expand All @@ -44,4 +44,4 @@ npx queue done <entry> remove an entry: one quoted argument, exactly a
...
```

The queue lists *all* tasks AI will work on next, sorted by priority. Priority 10 is rarely used (e.g. critical production bugs) and is treated as the utmost priority. Within a priority, the first tasks have higher priority (they are the "next" tasks within that "priority queue"). A done entry is removed (`npx queue done`).
The queue lists *all* tasks AI will work on next, sorted by priority. Priority 10 is rarely used (e.g. critical production bugs) and is treated as the utmost priority. Within a priority, the first tasks have higher priority (they are the "next" tasks within that "priority queue"). A done entry is removed (`npx @openagt/skill-queue@0.1 done`).
Loading
Loading