PR Babysitter
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
Build, enhance, or revive GitHub repos - ship one feature PR per watched repo (watched), make the best single enhancement on one external repo (external), or revive the top dormant repo (dormant).
$ npx skills add aeonfun/aeon --skill feature -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install aeonfun/aeon feature --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/feature .claude/skills/feature && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "feature" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/feature into .claude/skills/feature/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "feature", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/aeonfun/aeon/tree/main/skills/featureType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add aeonfun/aeon --skill feature -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install aeonfun/aeon feature --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/feature .agents/skills/feature && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "feature" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/feature into .agents/skills/feature/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "feature", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add aeonfun/aeon --skill feature -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install aeonfun/aeon feature --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/feature .cursor/skills/feature && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "feature" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/feature into .cursor/skills/feature/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "feature", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/aeonfun/aeon.git --path skills/feature--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add aeonfun/aeon --skill feature -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install aeonfun/aeon feature --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/feature .gemini/skills/feature && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "feature" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/feature into .gemini/skills/feature/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "feature", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install aeonfun/aeon featureInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add aeonfun/aeon --skill feature -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/feature .github/skills/feature && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "feature" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/feature into .github/skills/feature/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "feature", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add aeonfun/aeon --skill feature -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install aeonfun/aeon feature --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aeonfun/aeon.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/feature .opencode/skills/feature && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "feature" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/feature into .opencode/skills/feature/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "feature", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
featureBuild, enhance, or revive GitHub repos - ship one feature PR per watched repo (watched), make the best single enhancement on one external repo (external), or revive the top dormant repo (dormant).
Feature is an agent skill from aeonfun/aeon. Build, enhance, or revive GitHub repos - ship one feature PR per watched repo (watched), make the best single enhancement on one external repo (external), or revive the top dormant repo (dormant).
Its SKILL.md is about 8.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It works with GitHub. The repository describes itself as: The most autonomous AI agent framework: runs unattended on GitHub Actions, self-healing skills, drives Claude Code, Grok, Codex & more. No approval loops. Configure once, forget… The licence is MIT.
Read from SKILL.md and the folder at commit f252074. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
ghgitcurlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comcontributor-covenant.orgFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GITHUB_TOKENGH_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Feature loads about 8.3k tokens when it runs. Until then it costs about 51 tokens; SKILL.md has 3,995 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from aeonfun/aeon at commit f252074, republished under its MIT licence (© aeonfun). 3,995 words, ~8,291 tokens.
.claude/skills/feature/SKILL.md (or your agent's skills folder).When the run prompt supplies a Workflow correlation ID, include the exact marker <!-- aeon-dispatch:<ID> --> in every PR body you create. This is a machine-checked chain receipt: do not alter, omit, or place it only in the final response.
${var} — Selector
target[:arg] [--fix-issues],target ∈ {watched, external, dormant}. Empty orwatched= build a feature on every watched repo (one PR each);external:<owner/repo>= one best enhancement on that external repo;dormant= revive the highest-scoring dormant repo.repair:<owner/repo#N>@<sha>is the dev-loop's bounded repair pass: update only that open PR at that exact reviewed SHA using the consumed review findings. A leadingbuild:<owner/repo | issue-url | free-text instruction>— the shape the Telegram "ship which opportunity?" force-reply sends viarepo-scanner's offer — is intercepted first and routed into the external branch on that target/instruction.--fix-issuesbiases the chosen branch toward fixing an open GitHub issue. Full grammar below.
This skill merges three repo-work modes behind one selector so no capability is lost:
| Branch | Selector | Per run | Repo source | Use it for |
|---|---|---|---|---|
| watched (§A) | empty / watched | Iterates every watched repo, ships one PR per repo | memory/watched-repos.md | Weekly broad sweep — keep every repo moving |
| external (§B) | external[:owner/repo[#N]] | Single repo per run | memory/topics/repos.md catalog (or ${var} override) | Targeted enhancement / issue fix on one repo |
| dormant (§C) | dormant[:owner/repo] | Single dormant repo per run | memory/watched-repos.md scored by dormancy | Reactivate a stale high-★ repo with one visible fix |
Today is ${today}. Read memory/MEMORY.md and the last 7 days of memory/logs/ before starting — and before notifying, drop anything already reported in the last ~3 days of logs.
Dev-loop repair interception — check before every normal selector. If ${var}
matches repair:<owner/repo#N>@<40-character-lowercase-sha>, this is the one
bounded repair pass authorized by a verified review receipt. Fetch that exact PR
and fail closed unless it is still open and its current head SHA exactly matches
the supplied SHA. Read the injected pr-review chain context, and require at least
one [CRITICAL] or [ISSUE] finding whose receipt matches the same target and SHA.
Checkout the PR's existing head branch; do not create a new branch or PR. Address
only those actionable findings, run the repository's relevant tests, commit and
push to the existing PR branch. If the target, SHA, receipt, branch permissions,
or requested fix is ambiguous, make no change and report the blocker. One repair
invocation is one pass: never recursively dispatch another agent or claim that a
subsequent review passed.
Telegram force-reply interception — check this immediately after the repair interception, before parsing normal selectors. If ${var} starts with build:, it is the "ship which opportunity?" force-reply that repo-scanner offers (routed here as feature with var="build:<the operator's reply>"). Strip the prefix with ${var#build:} and treat the remainder as an external build target/instruction — route it straight into the external branch (§B), reusing that branch's existing logic (do not run the watched or dormant branches for a build: value, and do not duplicate §B). Normalize the remainder into a §B target:
owner/repo → run §B as if external:owner/repo (B2 "clone that repo").https://github.com/owner/repo/issues/N) or owner/repo#N → run §B as if external:owner/repo#N (B2 "fetch that issue").owner/repo: add retry to the client → run §B on owner/repo, using the trailing text as the explicit enhancement to build (see §B4's "requested enhancement" note — skip the auto-pick).The remainder may itself contain colons — keep them. This is a complete run once §B ships its PR (or cleanly skips); do not then fall through to the normal selector.
Parse ${var} into a target and optional flags:
watched → watched branch (§A): sweep every watched repo, ship one feature PR each.watched:<feature-spec> → watched branch, but build <feature-spec> on the FIRST watched repo only.external → external branch (§B): auto-pick one catalog/watched repo and make the best single enhancement.external:<owner/repo> → external branch on that specific repo.external:<owner/repo>#N → external branch on that specific issue.dormant → dormant branch (§C): auto-select the highest-scoring dormant repo and revive it.dormant:<owner/repo> → dormant branch on that specific repo (skip selection).--fix-issues (with any target) → bias the branch toward fixing an OPEN GitHub issue rather than a proactive change (see each branch's "with --fix-issues" note).Example values: `` (empty → watched sweep), watched, watched:add a dark-mode toggle, external, external:acme/api, external:acme/api#42, dormant, dormant:acme/legacy-lib, external --fix-issues, dormant --fix-issues.
Dispatch to exactly one branch. Do not run branches you weren't selected into.
If soul/SOUL.md and soul/STYLE.md are populated, read both and match the operator's voice in every written output — per-repo notifications (§A), and the revival tweet draft (§C step 5). If they are empty templates or absent, use a clear, direct, neutral tone — short sentences, no hashtags, no emojis, no corporate launch-language.
All branches read operator-controlled files under memory/ (runtime config — reference the paths exactly, never edit them here):
memory/watched-repos.md — candidate repo pool. One owner/repo per line (markdown bullets like - owner/repo are fine; comment lines starting with # are ignored). Used by watched and dormant; also the OWNER fallback for external. If missing or empty on the watched branch, log FEATURE_NO_CONFIG and exit cleanly (no notification — empty config is not an error). On dormant, log REPO_REVIVE_NO_CONFIG and exit cleanly.
memory/topics/repos.md — full repo catalog with descriptions, stack, and opportunities. Preferred repo source for the external branch; if absent, fall back to memory/watched-repos.md.
memory/topics/stale-models.md — stale AI model names and their current replacements. Used only by the dormant branch's stale-model audit. Example shape:
# Stale Models
## Considered stale (flag if a watched repo's README/config still references these)
- gpt-3.5
- claude-2
- claude-instant
- gpt-4 (without version suffix)
- text-davinci
## Current models (suggest these as replacements)
- claude-sonnet-5-5
- claude-opus-5-5
- gpt-6-luna
- gpt-6.1-sol
- gemini-3
- grok-4.7If the file is missing, the dormant branch skips the "stale model" fix category entirely (other categories still apply) and logs REPO_REVIVE_NO_MODEL_CONFIG: skipping model audit.
A scheduled run can pick the same work it picked yesterday: an issue stays open until its PR merges, and yesterday's PR may still be in review. As soon as a work item is picked and its branch name is set (A3, B4, C4), and before any clone or build for it, ask GitHub, not memory:
./scripts/feature-open-pr.sh covered "$REPO" "$BRANCH" [<issue number, when building an issue>]0: an open PR from this account already covers it (same head branch, or it references that issue), or the branch already exists on the remote. Log FEATURE_SKIP: <repo> - already open: <printed URL or branch>, send no notification, drop that work item and pick the next candidate (A3, B4). Skip the repo only when no candidate is left.2: GitHub could not be read. Treat it as covered and skip the repo (the next candidate would hit the same error); never open a PR blind.1: nothing covers it. Build it, and create exactly $BRANCH later.Run it once per work item, at pick time. There is no second check at branch time: scheduled runs of this skill serialize on the workflow concurrency group, and a push to a branch that appeared in the meantime is rejected by git instead of opening a duplicate.
This only decides whether to open something new. It never pushes to an existing PR; the repair interception above is the only path that does.
When the PR body says Closes #N, check the claim before reporting it:
./scripts/feature-open-pr.sh issue-open "$REPO" NExit 0 means #N is a real, open issue. Exit 1 prints what it is instead (closed, pull-request, missing): remove the Closes #N line with gh pr edit, say in the PR body which issue the change relates to, log FEATURE_ISSUE_MISMATCH: <repo>#N <state>, and name the mismatch in the notification rather than claiming the issue is fixed. Exit 2: leave the PR as is and log FEATURE_ISSUE_UNCHECKED: <repo>#N.
Runs when ${var} is empty or watched[:<feature-spec>]. Ships one PR per watched repo in a single run.
Parse memory/watched-repos.md into a list of owner/repo entries. If the file is missing or empty, log FEATURE_NO_CONFIG and exit cleanly (no notification).
If ${var} is watched:<feature-spec>, restrict the list to the first repo only and use <feature-spec> as the feature spec for it.
A failure on one repo must NOT stop the others — catch the failure, log it, continue. Use a fresh working directory per repo (e.g. /tmp/feature-build-${repo-name}).
Set REPO to the repo being processed (REPO="owner/repo"); the steps below and the shared checks above use it.
In this priority order:
a. If ${var} is watched:<feature-spec> AND this is the first repo, build that.
b. Check yesterday's repo-actions output in output/articles/repo-actions-*.md (most recent file) for ideas scoped to THIS repo. Pick the highest-impact idea that's autonomously implementable.
c. Check open GitHub issues labelled ai-build on this repo:
gh issue list -R "$REPO" --label ai-build --state opend. Check memory/MEMORY.md for planned features or next priorities tied to this repo.
e. If none of the above yields anything for this repo, log FEATURE_SKIP: <repo> — no suitable feature found and skip to the next repo. Do NOT send a notification for skipped repos.
With --fix-issues: promote step (c) — open ai-build issues — to the top priority ahead of (a)/(b), and only build from an open issue. If this repo has no open ai-build issue, log FEATURE_SKIP: <repo> — no open ai-build issue and skip it.
Then, before cloning, set BRANCH="feat/<short-feature-name>" for the picked item and run the open-PR check (see "Before building"), with the issue number when the item is an issue. On exit 0, drop that item and take the next candidate from this list (the next ai-build issue, the next idea), checking each the same way; when none is left, skip the repo as in (e). On exit 2, skip the repo.
Into a per-repo temp directory:
gh repo clone "$REPO" /tmp/feature-build-${repo-name}
cd /tmp/feature-build-${repo-name}Understand the project structure, README, package.json/config files, recent commits, and the area you'll modify:
git log --oneline -20Read the area you'll modify in full before changing anything.
Write clean, complete code. No TODOs or placeholders. Match the existing code style exactly — indentation, naming, patterns. Don't introduce new dependencies unless absolutely necessary. Don't refactor unrelated code — stay focused on one improvement.
Content-filter-sensitive documents. A few standard governance files are built almost entirely from sensitive-term-heavy boilerplate — CODE_OF_CONDUCT.md, abuse/moderation policies, harassment-reporting docs (terms like harassment, sexualized language, violence, abuse). Free-generating that body can trip the model's output content-filter, which aborts the entire run with API Error: Output blocked by content filtering policy (exit 1) even when the work is otherwise done. For these files do NOT free-generate the body:
curl so the body never passes through model output — curl -fsSL https://www.contributor-covenant.org/version/2/1/code_of_conduct/code_of_conduct.md -o CODE_OF_CONDUCT.md. Don't route it through WebFetch: that pulls the text into context, and you would still have to re-emit the whole body in a Write call — the filter scores generated tokens, so transcribing it can trip the abort just like free-generating it. curl -o writes the file without the model ever emitting the body.Edit (that one line is not sensitive); pull the contact convention from the repo's existing SECURITY.md/CONTRIBUTING.md.## Summary and every ./notify message descriptive — name the file, say it's the Contributor Covenant, and link the PR. Never paste the document body into the result text; the verbose final output is the most likely filter trigger.Use the $BRANCH that passed the open-PR check in A3.
git checkout -b "$BRANCH"
git add -A
git commit -m "feat: <description of what was built>"
git push -u origin "$BRANCH"gh pr create -R "$REPO" \
--title "feat: <short description>" \
--body "## What
<Description of the feature>
## Why
<What triggered this — repo-actions idea, issue, or gap identified>
## Changes
- file1: what changed
- file2: what changed
${AEON_DISPATCH_ID:+<!-- aeon-dispatch:$AEON_DISPATCH_ID -->}"When step A3 picked an issue, put Closes #N in the body, then run the issue check (see "After opening a PR that closes an issue").
Log what was built (per repo) to memory/logs/${today}.md under the consolidated ### feature heading (see Log below). Include the repo name in every log line so per-repo history stays distinct.
For each repo with a shipped PR, send a separate ./notify so the operator gets a detailed per-repo message. The notification should be rich enough that a reader understands exactly what was built, why it matters, and how it works WITHOUT clicking the PR link. Skipped/failed repos send no notification.
Do NOT compress into 1–2 lines. Every section below is REQUIRED.
*Feature Built — ${today} — owner/repo*
<Feature name>
<2–3 sentence description of what the feature does in plain language. Explain it like you're telling a non-technical reader in the community what just got added to the project.>
Why this matters:
<2–3 sentences on why this is relevant to the project RIGHT NOW. What problem did users/developers have before? What triggered this — a repo-actions idea, a GitHub issue, a gap in the codebase? How does it move the project forward?>
What was built:
- <file/component>: <what was added/modified — be specific about the functionality, not just "added endpoint">
- <file/component>: <same level of detail>
- <file/component (if applicable)>: ...
How it works:
<3–4 sentences on the technical implementation. Approach taken and why. Libraries/APIs used. How it integrates with existing code. Any interesting design decisions.>
What's next:
<1–2 sentences on follow-up work or how this connects to the broader roadmap.>
PR: <url>BAD (too short — do NOT do this):
"Feature Built: Data Export. Users can download results as JSON/CSV. PR: url"
GOOD level of detail:
Per-section answers like the template above. A reader who never clicks the PR should still come away knowing what changed and why.
After iterating every repo, end with a ## Summary listing each watched repo and its outcome: PR url, skipped, or failed. If every repo was skipped, do NOT send a notification at all — just log the per-repo skip lines.
Runs when ${var} starts with external. Ships one enhancement PR to one repo per run. Needs cross-repo access — GH_GLOBAL must be present.
Read memory/MEMORY.md for current priorities.
If ${var} is external:<owner/repo>#N — fetch that issue and work on it.
If ${var} is external:<owner/repo> — clone that repo, skip to step B3.
If ${var} is external (no arg) — find a repo to improve:
memory/topics/repos.md for the full repo catalog with descriptions, stack, and opportunities.memory/watched-repos.md for the OWNER, then:gh repo list ${OWNER} --limit 30 --json name,pushedAt,description,primaryLanguage \
--jq 'sort_by(.pushedAt) | reverse | .[:15]'memory/watched-repos.md if it exists.Pick a repo that:
REPO="owner/repo"
WORK_DIR="/tmp/external-work"
rm -rf "$WORK_DIR"
gh repo clone "$REPO" "$WORK_DIR" -- --depth 50
cd "$WORK_DIR"Before doing anything, deeply understand the codebase:
package.json / Cargo.toml / pyproject.toml / go.mod etc.git log --oneline -20gh issue list --repo "$REPO" --state open --limit 10gh pr list --repo "$REPO" --state open --limit 5Requested enhancement (force-reply build: path). If this run was reached via the Selector's build: interception carrying a trailing free-text instruction (e.g. owner/repo: add retry to the client), that instruction is the change — implement it directly and skip the priority list below (still honor --fix-issues if it was passed). Only fall through to the priority list when the build: value was a bare repo/issue with no explicit instruction, or when this run wasn't reached via build: at all.
Pick ONE thing from this priority list:
Priority 1 — Open issues (if any exist):
ai-build, bug, enhancement, good-first-issuePriority 2 — Code improvements (if no good issues):
Priority 3 — New features (if codebase is clean):
Pick the highest-impact, lowest-risk change. One change per run.
With --fix-issues: restrict the decision to Priority 1 only — work an open issue (prefer ai-build/bug/enhancement/good-first-issue) and add Closes #N. If the repo (or the specified #N) has no workable open issue, log EXTERNAL_SKIP: <repo> — no workable open issue and exit without a PR.
If generating a governance/policy file (CODE_OF_CONDUCT.md, abuse/harassment docs), follow the content-filter-sensitive documents procedure in §A6 — curl -o the canonical body straight to disk, never free-generate it.
Before writing any code, set the branch for it (BRANCH="ai/SHORT-DESCRIPTION") and run the open-PR check (see "Before building"), with the issue number when you picked an issue. On exit 0, drop that item and pick the next one from the list above, checking it the same way; if the run named a specific #N (B2) or nothing workable is left, log the skip and exit without a PR. On exit 2, exit without a PR.
Write clean, production-ready code:
Use the $BRANCH that passed the open-PR check in B4.
git checkout -b "$BRANCH"
git add -A
git commit -m "TYPE: [description]
[optional body explaining why]"Use conventional commit types: fix:, feat:, test:, docs:, chore:. If fixing an issue, add Closes #N to the commit body and the PR body, and run the issue check after B7 opens the PR.
$AEON_DISPATCH_ID is only set when chain-runner dispatched this run. Today that
means the dev-loop chain, i.e. an Aeon Engineer test/dogfood PR, not a normal
production run. The "Built by Aeon" footer rides on the same condition as the
dispatch marker for that reason: production external-branch PRs ship with no
Aeon/AI attribution in the body, only test-chain PRs do.
git push -u origin "$BRANCH"
gh pr create --repo "$REPO" \
--title "TYPE: [short description]" \
--body "## Summary
[What and why — 1-2 sentences]
## Changes
- [file-level description]
## Context
[What prompted this — issue, TODO, code review finding, etc.]
${AEON_DISPATCH_ID:+<!-- aeon-dispatch:$AEON_DISPATCH_ID -->}${AEON_DISPATCH_ID:+
---
Built by [Aeon](https://github.com/aeon)}"Send via ./notify:
external-feature: [repo] — [what was done]
PR: [url]Append to memory/logs/${today}.md under the consolidated ### feature heading (see Log below).
Runs when ${var} starts with dormant. Reactivates one dormant repo per run with a single high-visibility, low-effort fix — not a feature.
If ${var} is dormant:<owner/repo>, use that repo. Otherwise auto-select:
memory/watched-repos.md into a list of owner/repo candidates. If missing/empty, log REPO_REVIVE_NO_CONFIG and exit cleanly (no notification).gh api:gh api "repos/$REPO" --jq '{stars: .stargazers_count, pushed_at, archived, default_branch}'pushed_at > 60 days ago (excluding pushes from this skill or other Aeon-bot accounts — check the most recent non-bot human commit via gh api "repos/$REPO/commits?per_page=10" and skip bot authors)memory/logs/ for REPO_REVIVE_OK lines mentioning this repo)score = stars × log10(days_dormant + 1)Selected: owner/repo (score: X, Yd dormant, N★)If zero repos pass the filters: log REPO_REVIVE_SKIP: no eligible repos and exit (no notification).
Inspect the selected repo via gh api:
gh api "repos/$REPO/git/trees/HEAD?recursive=1" --jq '.tree[].path' \
| grep -E '\.(md|json|js|ts|py|toml|yaml|yml)$' | head -50Look for these stale signals — check at most 3 files per category:
A. Stale AI model references (only if memory/topics/stale-models.md is populated):
stale-models.mdB. Missing README elements:
C. Open community issues (fetch up to 10):
gh api "repos/$REPO/issues?state=open&per_page=10" \
--jq '.[] | {number, title, comments, created_at, labels: [.labels[].name]}'Look for issues that are simple to close with a README clarification or a small code fix.
D. Stale metadata:
Rank the stale signals by effort-to-impact. Pick the single highest-impact, lowest-effort fix:
| Fix type | Effort | Impact |
|---|---|---|
| Update model list in README | very low | high (signals active maintenance) |
| Add Quick Start section | low | high (reduces friction) |
| Close simple issue with README clarification | low | high (community signal) |
| Update repo description + topics | very low | medium |
| Add install badge | very low | low |
With --fix-issues: force category C — pick a simple open community issue and close it with a README clarification or a small code fix. If no simple issue exists, log REPO_REVIVE_SKIP: no simple issue to fix and exit.
Do NOT attempt:
vuln-scanner for that)Clone, branch, change, commit, push, PR. Run the open-PR check first (see "Before building"), passing 'chore/revive-*' as the branch, which matches a revival PR from any earlier day, so a dormant repo picked again does not get a second one.
gh repo clone "$REPO" "/tmp/repo-revive-${REPO##*/}"
cd "/tmp/repo-revive-${REPO##*/}"
git checkout -b "chore/revive-${today}"
# ... apply the targeted change ...
git add -A
git commit -m "chore: <what you changed>
Periodic maintenance pass — repo is at ${STARS}★ and worth keeping fresh."
git push -u origin "chore/revive-${today}"
gh pr create --title "chore: <what you changed>" --body "<concise body>
${AEON_DISPATCH_ID:+<!-- aeon-dispatch:$AEON_DISPATCH_ID -->}"If the repo doesn't accept outside PRs or the clone fails, fall back to updating description + topics via API (requires you to be the owner — skip if not):
gh api -X PATCH "repos/$REPO" -f description="..." -f homepage="..."Write one tweet draft (≤ 280 chars) announcing the update. Voice rules:
Save to /tmp/revival-tweet.md.
Write notification to /tmp/repo-revive-notify.md:
*Repo Revive — ${today}*
**${owner/repo}** (${N}★, ${N}d dormant)
fix: <one-line description>
pr: <PR URL or "no PR — updated via API">
tweet draft:
"<exact tweet text>"Then: ./notify -f /tmp/repo-revive-notify.md.
Append to memory/logs/${today}.md under the consolidated ### feature heading (see Log below).
Append one consolidated block under a single ### feature heading in memory/logs/${today}.md (the health loop parses this shape). Start with a discriminator line naming the branch that ran, then the branch-specific bullets. Preserve every status code so per-branch history stays greppable.
Watched branch:
### feature
- Branch: watched
- **Built:** <feature name> — owner/repo
- **Why:** <trigger>
- **PR:** <url>
- **Files:** <list>
- FEATURE_OKPer-repo skips/failures each get their own line: - FEATURE_SKIP: <repo> — <reason>. If config is missing: - FEATURE_NO_CONFIG.
External branch:
### feature
- Branch: external
- **Repo:** owner/repo
- **What:** <description of enhancement>
- **PR:** <url>
- **Why:** <what prompted it — issue, TODO, proactive improvement>No workable issue under --fix-issues: - EXTERNAL_SKIP: <repo> — no workable open issue.
Dormant branch:
### feature
- Branch: dormant
- **Target:** owner/repo (N★, Nd dormant)
- **Fix:** <one-line description>
- **PR:** <URL or "API update">
- **Tweet draft:** yes/no
- REPO_REVIVE_OKNo eligible repos: - REPO_REVIVE_SKIP: no eligible repos — all recently revived or below threshold. Missing config: - REPO_REVIVE_NO_CONFIG. Missing model config: - REPO_REVIVE_NO_MODEL_CONFIG: skipping model audit.
Notify only on signal. The watched branch sends one rich per-repo message per shipped PR (skipped/failed repos send nothing; an all-skipped run sends nothing). The external branch sends one message per run. The dormant branch sends one message per revival via ./notify -f. A clean/no-change run sends nothing.
All GitHub operations go through the gh CLI — it handles auth internally via GITHUB_TOKEN/GH_GLOBAL, so no env-var-authenticated curl from bash is needed. ./notify / ./notify -f deliver reliably. For the one public-network exception — curl -o of a governance-file body (§A6/§B4) — if curl fails intermittently, that specific fetch is the only case where you may retry; do NOT route governance-file bodies through WebFetch (see §A6 for why).
No compound bash — one operation per call. Branches work inside per-repo temp dirs, so the natural reflex is cd /tmp/feature-build-x && git grep .... The non-interactive sandbox auto-denies any call chaining &&, ||, ;, or pipes (|) — it's rejected before it runs, burning a turn each. The working directory persists across Bash calls, so:
cd /tmp/feature-build-${repo-name} (or /tmp/external-work, /tmp/repo-revive-${name}) as its own call, then run each subsequent command separately.cd entirely and pass the path directly: git -C /tmp/feature-build-${repo-name} grep ..., gh repo clone owner/repo /tmp/feature-build-${repo-name} followed by gh ... -R owner/repo.$(...) subshells and $VAR expansion are also rejected in skill bash — compute literal values in the prompt instead.GH_TOKEN / GITHUB_TOKEN — required (available by default in Actions). Powers gh for all branches.GH_GLOBAL — required for the external branch and for any watched/dormant target you don't own: the token needs permission to fork/push/PR across every targeted repo. Optional when only working repos the default token already covers.© aeonfun, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/feature of aeonfun/aeon.
Open the folder on GitHubat commit f252074
Feature next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Feature this skillaeonfun/aeon | 767 | — | ~8.3k | Automated safety check: Pass | MIT | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Diagnosing Superpowers Sessionsobra/superpowers | 296k | 3 repos | ~1.7k | Automated safety check: Pass | MIT | |
| GitHub Deep Researchbytedance/deer-flow | 83k | 5 repos | ~1.3k | Automated safety check: Pass | MIT | |
| Greplooponyx-dot-app/onyx | 32k | 4 repos | ~3.3k | Automated safety check: Pass | MIT | |
| Update V8 Versionopeninterpreter/openinterpreter | 69k | 2 repos | ~845 | Automated safety check: Pass | Apache-2.0 |
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
obra/superpowers
Investigates a session where Superpowers went wrong, reads the transcripts on disk and produces an evidence-cited report, optionally prepared as a bug report for the maintainers.
bytedance/deer-flow
Researches a GitHub repository over four rounds using the GitHub API and web search, then writes a structured markdown report with timeline, metrics and Mermaid diagrams.
onyx-dot-app/onyx
Iteratively improves a PR (GitHub), MR (GitLab), or shelved changelist (Perforce) until Greptile gives it a 5/5 confidence score with zero unresolved comments.
openinterpreter/openinterpreter
Bumps the pinned v8 and rusty_v8 versions in Codex, validates the release-candidate path with the v8-canary check, and traces failures to upstream build changes.
onyx-dot-app/onyx
Checks a GitHub, GitLab, or Perforce (p4) pull request (or merge request, or shelved changelist) for unresolved review comments, failing status checks, and incomplete PR descriptions.
aeonfun/aeon
Browses open tasks on the TaskMarket agent-worker market and, with explicit operator approval, creates tasks, tracks submissions and submits finished work.
aeonfun/aeon
Sets up and manages an Aeon agent instance that runs skills on a schedule through GitHub Actions: starting, rescheduling, debugging, editing skills and mining chat history.
aeonfun/aeon
Reads a Base Account's address, portfolio and transaction history through the Base MCP server, and stays strictly read-only in unattended Aeon runs, reporting only changes.
aeonfun/aeon
Audits every page of a site each day from its sitemap, scores on-page and technical SEO, checks duplicates across pages and reports what changed since the last run.
aeonfun/aeon
5 concrete real-life actions, leverage-scored against open loops with specificity and anti-fluff gates
aeonfun/aeon
Static linter for an Aeon instance's configuration that catches silent failures such as unquoted schedules, duplicate keys, unconfigured skills and broken MCP references.
Works with
Build, enhance, or revive GitHub repos - ship one feature PR per watched repo (watched), make the best single enhancement on one external repo (external), or revive the top dormant repo (dormant). Feature is an agent skill from aeonfun/aeon. Build, enhance, or revive GitHub repos - ship one feature PR per watched repo (watched), make the best single enhancement on one external repo (external), or revive the top dormant repo (dormant).
Run `npx skills add aeonfun/aeon --skill feature -a claude-code`. Or copy the skill folder (skills/feature in aeonfun/aeon) into .claude/skills/feature in your project. Claude Code loads it when a task matches its description.
Run `npx skills add aeonfun/aeon --skill feature -a codex`. Or copy the skill folder (skills/feature in aeonfun/aeon) into .agents/skills/feature in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add aeonfun/aeon --skill feature -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/feature, .gemini/skills/feature, .github/skills/feature and .opencode/skills/feature in your project.
Going by SKILL.md and its folder, Feature needs the command-line tools its instructions call (gh, git and curl) and credentials named GITHUB_TOKEN and GH_TOKEN.
SKILL.md names 2 domains. In commands or code: github.com and contributor-covenant.org; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Feature is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 8.3k tokens (SKILL.md is roughly 33k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Feature: PR Babysitter (openinterpreter/openinterpreter, 69k stars), Diagnosing Superpowers Sessions (obra/superpowers, 296k stars), GitHub Deep Research (bytedance/deer-flow, 83k stars) and Greploop (onyx-dot-app/onyx, 32k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
aeonfun (a GitHub organization) maintains it in aeonfun/aeon, which has 767 GitHub stars. The repository holds 82 skills in this directory. The repository was last updated on October 6, 2026.
Source: aeonfun/aeon on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.