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
6 changes: 3 additions & 3 deletions .claude/skills/aeon/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ metadata:
Today is ${today}. <the prompt — plain instructions, including judgment calls>

## Steps
1. <the procedure — 43 of 76 skills lead with this>
1. <the procedure — 43 of 77 skills lead with this>

## Network note
<curl / WebFetch / `./secretcurl` / `gh api` — how this skill fetches>
Expand Down Expand Up @@ -311,9 +311,9 @@ Three at a time, not twelve. Every enabled skill is a recurring notification, an
./aeon packs ls # the six first-party packs
```

`ls` footers with `76 skills · 1 enabled` — read it to them before proposing anything. First run installs the CLI runtime (tsx + yaml, ~12MB); the npm noise is one-time and expected. Grep-only equivalents: `references/layout.md`.
`ls` footers with `77 skills · 1 enabled` — read it to them before proposing anything. First run installs the CLI runtime (tsx + yaml, ~12MB); the npm noise is one-time and expected. Grep-only equivalents: `references/layout.md`.

Packs are a visibility filter, not a runtime switch — revealing one runs nothing. Core (12), Evolution (9) and Basics (18) show by default; Dev (11), Crypto (15) and Productivity (11) are on demand.
Packs are a visibility filter, not a runtime switch — revealing one runs nothing. Core (12), Evolution (9) and Basics (18) show by default; Dev (12), Crypto (15) and Productivity (11) are on demand.

Reasonable starting sets:

Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/aeon/references/layout.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Where everything lives in an Aeon repo, and the fastest way to see what's on.
./aeon skills ls --enabled --json # for building the Mode 2 timeline
```

`ls` prints `SKILL / ON / SCHEDULE / PACK / DESCRIPTION` and a footer — `76 skills · 1 enabled`. First run installs the CLI runtime (tsx + yaml, ~12MB, one-time); the noise is expected.
`ls` prints `SKILL / ON / SCHEDULE / PACK / DESCRIPTION` and a footer — `77 skills · 1 enabled`. First run installs the CLI runtime (tsx + yaml, ~12MB, one-time); the noise is expected.

**The `SCHEDULE` column is populated for disabled skills too** — it's their `aeon.yml` entry, not proof anything fires. Only the `●` in `ON` means it runs.

Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/aeon/references/mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Two unrelated things share the name. Get this wrong and nothing works.
| | |
|---|---|
| **`.mcp.json`** — *external MCP servers, called BY Aeon skills* | Wired via the dashboard MCP panel or `./aeon mcp add`. This is what you want when a skill needs a tool. |
| **`bin/add-mcp`** — *Aeon itself AS an MCP server* | Builds `apps/mcp-server` and registers it with Claude Code / Desktop, so all 76 skills appear as `aeon-*` tools **in your local Claude**. Nothing to do with a skill calling out. |
| **`bin/add-mcp`** — *Aeon itself AS an MCP server* | Builds `apps/mcp-server` and registers it with Claude Code / Desktop, so all 77 skills appear as `aeon-*` tools **in your local Claude**. Nothing to do with a skill calling out. |

The rest of this doc is the first one. For the second: `bin/add-mcp`, `--desktop` for a Claude Desktop snippet, `--uninstall` to remove, `claude mcp list` to verify.

Expand Down
6 changes: 3 additions & 3 deletions .claude/skills/aeon/references/skill-anatomy.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# How Aeon skills are actually written

Surveyed across all 76 skills in `aeonfun/aeon`. Frequencies are real counts — match the dominant convention unless there's a reason not to. Bodies run 133–757 lines (~306 median); a skill is a prompt, not a config file, and reads as prose.
Surveyed across all 77 skills in `aeonfun/aeon`. Frequencies are real counts — match the dominant convention unless there's a reason not to. Bodies run 133–757 lines (~306 median); a skill is a prompt, not a config file, and reads as prose.

## Frontmatter

Universal — **all 76 skills** carry these five:
Universal — **all 77 skills** carry these five:

```yaml
name: my-skill # the slug (matches the skills/<slug>/ directory)
Expand Down Expand Up @@ -113,7 +113,7 @@ There is **no network sandbox** — plain `curl` works for unauthenticated GETs.

`memory/` is the durable state that survives between runs. Four conventions, in order of how often skills touch them:

### `memory/logs/${today}.md` — the run log (63 of 76 skills)
### `memory/logs/${today}.md` — the run log (63 of 77 skills)

Every skill appends what it did, under **one** heading that is exactly its slug:

Expand Down
12 changes: 6 additions & 6 deletions .github/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<p align="center">
<img src="../docs/assets/hero-animated.svg" alt="AEON — the most autonomous agent framework. 60+ skills across 7 harnesses (Claude Code, Grok, Codex, Pi, Vibe, Kimi, fx), running unattended on GitHub Actions: it ships features to your repos, privately discloses real vulnerabilities, deploys live apps, runs deep research, and writes new skills for itself. Keywords: autonomous AI agent, agent framework, GitHub Actions automation, self-improving agent, multi-agent orchestration, LLM skills, cron agent." width="100%" />
<img src="../docs/assets/hero-animated.svg" alt="AEON — the most autonomous agent framework. 60+ skills across 10 harnesses (Claude Code, Grok, Codex, Pi, Vibe, Kimi, fx, Cursor, Hermes, GLM), running unattended on GitHub Actions: it ships features to your repos, privately discloses real vulnerabilities, deploys live apps, runs deep research, and writes new skills for itself. Keywords: autonomous AI agent, agent framework, GitHub Actions automation, self-improving agent, multi-agent orchestration, LLM skills, cron agent." width="100%" />
</p>

<p align="center">
Expand Down Expand Up @@ -46,7 +46,7 @@ git clone https://github.com/<you>/aeon # skip if you used `gh repo fork --clo
cd aeon && ./aeon
```

Open [localhost:5555](http://localhost:5555) and follow the dashboard: **Authenticate** (any of seven [harnesses](../docs/harnesses.md)) → **add a channel** → **pick skills** → **Run**. That's it - Aeon runs unattended. Everything is also an `./aeon` command ([CLI](../apps/cli/README.md)) or a `/aeon` chat command ([setup skill](../docs/aeon-setup.md), installable as a [Claude Code or Codex plugin](../docs/aeon-setup.md#install)).
Open [localhost:5555](http://localhost:5555) and follow the dashboard: **Authenticate** (any of ten [harnesses](../docs/harnesses.md)) → **add a channel** → **pick skills** → **Run**. That's it - Aeon runs unattended. Everything is also an `./aeon` command ([CLI](../apps/cli/README.md)) or a `/aeon` chat command ([setup skill](../docs/aeon-setup.md), installable as a [Claude Code or Codex plugin](../docs/aeon-setup.md#install)).

<details>
<summary><strong>No admin rights / can't install <code>gh</code>?</strong></summary>
Expand Down Expand Up @@ -87,13 +87,13 @@ The prompt *is* the skill. You schedule it, hand it a `var`, chain it into other

<p align="center"><a href="../docs/community-skill-packs.md#listed-packs"><b>Community skill packs →</b></a></p>

## Support seven harnesses: Claude, Grok, Codex, Pi, Vibe, Kimi, fx
## Support ten harnesses: Claude, Grok, Codex, Pi, Vibe, Kimi, fx, Cursor, Hermes, GLM

<p align="center">
<img src="../docs/assets/harnesses-aeon.jpg" alt="Seven engines, one socket - a SKILL.md flows through run-harness into any of seven agent CLIs: Claude, Grok, Codex, Pi, Vibe, Kimi, and fx. Every harness honors the same contract: result, usage, session." width="100%" />
<img src="../docs/assets/harnesses-aeon.jpg" alt="Ten engines, one socket - a SKILL.md flows through run-harness into any of ten agent CLIs: Claude, Grok, Codex, Pi, Vibe, Kimi, fx, Cursor, Hermes, and GLM. Every harness honors the same contract: result, usage, session." width="100%" />
</p>

The same `SKILL.md` runs on any of seven agent CLIs - **Claude**, **Grok**, **Codex**, **Pi**, **Vibe**, **Kimi**, **fx** - behind one `run-harness` contract (same result, usage, and session shape). Swap the harness; nothing else changes. How the contract works: [`docs/harnesses.md`](../docs/harnesses.md).
The same `SKILL.md` runs on any of ten agent CLIs - **Claude**, **Grok**, **Codex**, **Pi**, **Vibe**, **Kimi**, **fx**, **Cursor**, **Hermes**, **GLM** - behind one `run-harness` contract (same result, usage, and session shape). Swap the harness; nothing else changes. How the contract works: [`docs/harnesses.md`](../docs/harnesses.md).

## Why "the most autonomous"

Expand Down Expand Up @@ -185,7 +185,7 @@ The deep reference lives in [`docs/`](../docs) - jump in:

<p align="center">
<a href="../docs/CONFIGURATION.md"><img src="../docs/assets/doc-config.svg" alt="Configuration - chaining, triggers, scheduler, capability modes, gateways, Fleet Watcher" height="30" align="absmiddle"></a>&nbsp;
<a href="../docs/harnesses.md"><img src="../docs/assets/doc-harnesses.svg" alt="Harnesses - run skills on any of seven agent CLIs behind one contract" height="30" align="absmiddle"></a>&nbsp;
<a href="../docs/harnesses.md"><img src="../docs/assets/doc-harnesses.svg" alt="Harnesses - run skills on any of ten agent CLIs behind one contract" height="30" align="absmiddle"></a>&nbsp;
<a href="../docs/skill-packs.md"><img src="../docs/assets/doc-packs.svg" alt="Skill Packs - how packs work and how to build your own" height="30" align="absmiddle"></a>&nbsp;
<a href="../docs/CORE.md"><img src="../docs/assets/doc-core.svg" alt="Core - the self-healing health and repair loop" height="30" align="absmiddle"></a>
</p>
Expand Down
62 changes: 62 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,37 @@ from or pin to; the template keeps serving the latest `main` to new forks.

### Added

- **Three more run-harnesses: Cursor, Hermes, and GLM.** Cursor CLI (`agent -p`,
`CURSOR_API_KEY`), Hermes via the Nous Portal (`hermes -z`, `HERMES_AUTH`), and
the GLM Coding Plan on Z.AI's Anthropic endpoint (`GLM_API_KEY` / `ZAI_API_KEY`)
join the `run-harness` contract, wired through the resolver, installer, both
workflows, the local MCP dispatch path, the capability manifest, and regression
tests. Aeon now dispatches to ten coding-agent CLIs. Their credentials are
permanent first-class rows in the dashboard Access Keys panel, with Hermes on the
captured-login Connect/Reconnect flow. (#967, #975)
- **New `rightstack` skill (Dev & Code).** A read-only Web3 stack advisor
(recommend / workflow / compare / explain / migrate) that maps a build goal to a
coherent stack before implementation; disabled and manual-only, it cannot install
packages, edit an app, or touch a wallet or contract. Catalog is now 77 skills.
(#961)
- **Read-only harness comparison (`scripts/skill-health-routing.mjs`).** Phase 2 of
measured harness routing: it groups harness-tagged skill-health scores (five
required per harness) and joins per-run token / cache usage, so an operator can
weigh quality against cost before changing `aeon.yml`. It never writes repo
state. (#969)
- **Machine-readable vuln-scanner execution evidence.** Staged scanner binaries
(Semgrep, TruffleHog, OSV-Scanner, Slither, cargo-fuzz) are wrapped with an
invocation logger, and a post-run step prints the staged manifest plus the actual
invocation log, so a report can no longer claim a scan that never ran. An absent
optional scanner still does not fail the run. (#968)
- **Three community skill packs listed:** CultOS exact-commit PR review (#974), the
Farcaster pack with a Neynar-backed `cast` publish skill (#977), and the Spoolis
Outcome Gate acceptance-criteria gate (#978).
- **Operator-console plugin prepped for more marketplaces.** The `plugin/` operator
skill gained manifests and privacy / support metadata for OpenAI's plugin
directory (host-neutral wording, a Codex-runnable history-mining script), the
Kiro Powers registry, and MiniMax. (#959, #964, #965)

- **`./notify` moves behind a post-run delivery dispatcher (#912 Phase 2).** A
skill call now writes one structured JSON payload to the notify queue instead of
ever touching the wire; a new post-run `scripts/notify-deliver.sh` is the only
Expand Down Expand Up @@ -257,6 +288,13 @@ from or pin to; the template keeps serving the latest `main` to new forks.

### Changed

- **Stale harness and MCP catalog counts corrected.** `llms.txt` moved from six to
seven coding-agent CLIs (the harness work above then takes the count to ten), and
the MCP OAuth catalog in `docs/mcp-oauth.md` gained the missing Higgsfield row
(`mcp.higgsfield.ai/mcp`), so "every catalog provider rotates" replaces "all
four". (#960)
- **Ecosystem list churn:** added Eyebrow (#976) and removed Amper (#979).

- **Harness inventory counts normalized to seven.** With fx as the 7th adapter,
`docs/harnesses.md`, `harness-adapter/README.md`, and the workflow comments now
say seven (not six / five / four) and present the harnesses evenly, and the
Expand Down Expand Up @@ -363,6 +401,25 @@ from or pin to; the template keeps serving the latest `main` to new forks.

### Fixed

- **Local MCP server runs skills without blocking.** `apps/mcp-server` replaced the
event-loop-freezing `spawnSync` with an async `spawn`, so a long `tools/call` no
longer stalls `tools/list`, ping, or a second call; a new in-process single-flight
queue serializes runs to protect the shared working tree from `.git/index.lock`
and interleaved `memory/` writes. Same 600s timeout and 10MB output cap. (#973)
- **Telegram notification chunks stay under the size limit.** Markdown is now
rendered to HTML before the final size split, and active tags are closed and
reopened at chunk boundaries, so a skill with many links can no longer produce an
unsendable oversized payload. (#970)
- **`bin/add-skill` records the real source commit in `skills.lock`.** The
provenance lookup passed a `gh api` field that forced a `POST` to the GET-only
commits collection, 404ed, and fell back to `commit_sha: "unknown"`; it now reads
the commit correctly. (#972)
- **macOS portability:** the cron scheduler test detects GNU vs BSD `date` and uses
native syntax (#957), and the issue-backed cron-state / health helpers no longer
abort under Bash 3.2 `set -u` on an empty `REPO_ARGS` in their default
current-repo mode (#971). Both were local-dev-only; Linux Actions scheduling was
never affected.

- **Post-run scorer grades the sent notify card, not the harness `.result`
recap.** For a notify-first skill the scorer now reads the captured chain
artifact (`output/.chains/<skill>.md`) - the card that was actually sent - and
Expand Down Expand Up @@ -727,6 +784,11 @@ from or pin to; the template keeps serving the latest `main` to new forks.

### Maintenance

- First repo lint gates: eslint (per app) and shellcheck (whole shell surface),
both green on the current tree, with two shellcheck false positives suppressed
with rationale (#962, #963); plus a 400x400 MCP logo for the Cline marketplace
(#966).

- CI/test/asset noise: HOL AI Plugin Scanner workflow added then dropped same-day
(#928, #929); unused `docs/assets` images removed and provider/free-aeon docs
images refreshed (#939, #940); state-store/health-issue test hardening (#942);
Expand Down
1 change: 1 addition & 0 deletions apps/dashboard/lib/skill-icons.data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ export const SKILL_ICONS: Record<string, string> = {
"price-alert": "<path d='M10.3 21a2 2 0 0 0 3.4 0'/><path d='M22 8c0-2.3-.8-4.3-2-6'/><path d='M3.3 15.3A1 1 0 0 0 4 17h16a1 1 0 0 0 .7-1.7C19.4 14 18 12.5 18 8A6 6 0 0 0 6 8c0 4.5-1.4 6-2.7 7.3'/><path d='M4 2C2.8 3.7 2 5.7 2 8'/>",
"remotion": "<rect x='2' y='3' width='20' height='18' rx='2'/><path d='M7 3v18M17 3v18'/><path d='M2 9h5M2 15h5M17 9h5M17 15h5'/><path d='M11 9.5l3 2.5-3 2.5z' fill='currentColor' stroke='none'/>",
"reply-maker": "<path d='M9 17l-5-5 5-5'/><path d='M20 18v-2a4 4 0 0 0-4-4H4'/>",
"rightstack": "<path d='M12 3l8 4.5-8 4.5-8-4.5z'/><path d='M4 12l8 4.5 8-4.5'/><path d='M4 16.5l8 4.5 8-4.5'/>",
"robinhood-mcp": "<path d='M12.7 19a2 2 0 0 0 1.4-.6l6.2-6.2a6 6 0 0 0-8.5-8.5L5.6 9.9A2 2 0 0 0 5 11.3V18a1 1 0 0 0 1 1z'/><path d='M16 8 2 22'/><path d='M17.5 15H9'/>",
"schedule-ads": "<path d='M3 11l18-5v12L3 14z'/><path d='M11.6 16.8a3 3 0 1 1-5.8-1.6'/>",
"search-skill": "<circle cx='11' cy='11' r='8'/><path d='M21 21l-4.3-4.3'/>",
Expand Down
1 change: 1 addition & 0 deletions catalog/skill-icons.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@
"schedule-ads": "<path d='M3 11l18-5v12L3 14z'/><path d='M11.6 16.8a3 3 0 1 1-5.8-1.6'/>",
"send-email": "<rect x='2' y='4' width='20' height='16' rx='2'/><path d='M22 7l-9 5.7a1.9 1.9 0 0 1-2 0L2 7'/>",
"spend-watch": "<path d='M4 4v16h16'/><path d='M20 8l-6 7-4-3-5 5'/><path d='M20 12V8h-4'/>",
"rightstack": "<path d='M12 3l8 4.5-8 4.5-8-4.5z'/><path d='M4 12l8 4.5 8-4.5'/><path d='M4 16.5l8 4.5 8-4.5'/>",
"competitor-monitor": "<path d='M5 3v3M9 3v3'/><rect x='3' y='6' width='6' height='13' rx='3'/><rect x='15' y='6' width='6' height='13' rx='3'/><path d='M9 12h6'/>",
"higgsfield": "<rect x='3' y='4' width='18' height='16' rx='2'/><circle cx='8.5' cy='9.5' r='1.5'/><path d='M3 16l5-4 4 3 3-2 6 4'/><path d='M18 3v3M16.5 4.5h3'/>",
"hunter-22": "<circle cx='12' cy='12' r='10'/><circle cx='12' cy='12' r='6'/><circle cx='12' cy='12' r='2'/>",
Expand Down
2 changes: 1 addition & 1 deletion docs/CAPABILITIES.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ mode: write # default — full Write / Edit / git / gh / python3
| 2. **OS sandbox** | Write-locks the workspace for the whole run — the repo is mounted read-only, network stays open | `run-harness --mode read-only` → [`harness-adapter/lib/sandbox.sh`](../harness-adapter/lib/sandbox.sh) |
| 3. Post-run guard | Reverts and cleans anything that still landed under `CODE_PATHS`, preserving the skill's real output (memory, `output/`) and writing its run-log on its behalf | `.github/workflows/aeon.yml` |

**Layer 2 is the guarantee.** Layer 1 is a real narrowing but not a boundary: a shell redirection routes around it, and only the claude and pi adapters consume the allowlist at all. Layer 3 is after-the-fact repair. So the sentence "a read-only skill physically cannot mutate the repo" is true because of the sandbox — `bwrap --ro-bind` on Linux, `sandbox-exec` with a `deny file-write*` profile on macOS — which applies uniformly on **all seven harnesses**, claude included.
**Layer 2 is the guarantee.** Layer 1 is a real narrowing but not a boundary: a shell redirection routes around it, and only the claude and pi adapters consume the allowlist at all. Layer 3 is after-the-fact repair. So the sentence "a read-only skill physically cannot mutate the repo" is true because of the sandbox — `bwrap --ro-bind` on Linux, `sandbox-exec` with a `deny file-write*` profile on macOS — which applies uniformly on **all ten harnesses**, claude included.

### Why the sandbox is the dispatcher's, not each harness's

Expand Down
2 changes: 1 addition & 1 deletion docs/assets/hero-animated.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions docs/assets/skill-icons/rightstack.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading