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: 4 additions & 2 deletions .claude/skills/aeon/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Pick the mode they're asking for:

## Preflight (every mode)

1. Find the repo: current dir → `gh repo set-default` → ask. Clone it if it isn't local.
1. Find the repo: current dir → `gh repo set-default` → ask. Clone it if it isn't local (an instance made with Aeon Connect lives at `github.com/<owner>/<repo>` like any other; no instance yet means Mode 1).
2. **Confirm `gh` points at THEIR instance, before any command that writes.**

```bash
Expand Down Expand Up @@ -50,14 +50,16 @@ Anything it prints is on disk but unconfigured. **Orientation — what's install

Goal: one real notification in their phone, fast. Do not configure a schedule first.

> **Fastest start, no terminal: Aeon Connect.** If the user has no terminal, no Node or `gh`, or just wants the quickest path, send them to https://www.aeon.fun/connect. In the browser they sign in with GitHub, create their aeon (a public fork or a private copy), install the Aeon Connect GitHub App on that one repo, connect a model, and pick skills. Nothing else to do: the agent then runs on their own GitHub Actions. Use the terminal path below only if they want a local clone.

1. **Run `./aeon init`.** Ask public or private first (public: Actions minutes are free; private: `--private`, minutes bill against the account quota, 2,000/mo on Free). Then, from a clone of the template:

```bash
git clone https://github.com/aeonfun/aeon && cd aeon
./aeon init # add --private, --name <repo>, --harness <h> as needed
```

It is idempotent and prints a check or a fix per step: signs in to GitHub with the `workflow` scope, creates `<owner>/<name>` from the **template** (not a fork: forks start with Actions disabled), points this folder at it (`aeonfun/aeon` stays as the `upstream` remote), runs `gh repo set-default`, enables Actions and lets them open PRs (the default token permission is left as is), offers to store the gh token as `GH_GLOBAL` (only if it has `repo` + `workflow`), connects a model from the credential manifest, and links Telegram with a `/start` deep link. Re-run it any time; `bin/onboard` is the read-only check. `--dry-run` shows every step without changing anything.
It is idempotent and prints a check or a fix per step: signs in to GitHub with the `workflow` scope, creates `<owner>/<name>` from the template (a template copy starts with Actions on; Aeon Connect forks public instances and turns Actions on itself), points this folder at it (`aeonfun/aeon` stays as the `upstream` remote), runs `gh repo set-default`, enables Actions and lets them open PRs (the default token permission is left as is), offers to store the gh token as `GH_GLOBAL` (only if it has `repo` + `workflow`), connects a model from the credential manifest, and links Telegram with a `/start` deep link. Re-run it any time; `bin/onboard` is the read-only check. `--dry-run` shows every step without changing anything.

**If they set things up by hand, pin the default repo before any other command.** With an `upstream` remote and no default pinned, **`gh` prefers `upstream` over `origin`**, so secrets and runs silently land on `aeonfun/aeon`. Fix and verify:

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 @@ -93,7 +93,7 @@ If calls cost money, set a hard budget in the body (`glim-mcp`: ≤10 tool calls
A connected server's credentials are stored as ordinary repo secrets named from its slug (`tokenVar`/`oauthVar` in `lib/mcp-catalog.ts`), so they appear in **two** places:

- **MCP panel** — inline per server, next to the `${VAR}` it satisfies. Where you set or re-connect them.
- **Settings → Access Keys → MCP** — the credential inventory. Rows are built dynamically from whatever `MCP_*_TOKEN` / `MCP_*_OAUTH` secrets exist, each carrying its server's catalog logo; the section is hidden entirely until a server is connected. Removing one here leaves the server wired in `.mcp.json` but unauthenticated.
- **Keys → Access Keys → MCP** - the credential inventory. Rows are built dynamically from whatever `MCP_*_TOKEN` / `MCP_*_OAUTH` secrets exist, each carrying its server's catalog logo; the section is hidden entirely until a server is connected. Removing one here leaves the server wired in `.mcp.json` but unauthenticated.

There is nothing to add to `BUILTIN_SECRETS` when you add a catalog server — the group is derived from `MCP_SECRET_RE` and `MCP_SECRET_OWNER`, so a new `MCP_CATALOG` entry brings its own group row, description, and logo.

Expand Down
4 changes: 2 additions & 2 deletions .claude/skills/aeon/references/secrets.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ The first two are the direct-to-Anthropic options; the rest are gateways. Settin

| Secret | Where to get it |
|---|---|
| `CLAUDE_CODE_OAUTH_TOKEN` | Run `claude setup-token` locally → paste the `sk-ant-oat01-…` (valid 1 year). Or click AUTH in the dashboard. Runs on your Pro/Max subscription, no per-token billing |
| `CLAUDE_CODE_OAUTH_TOKEN` | Run `claude setup-token` locally → paste the `sk-ant-oat01-…` (valid 1 year). Or press **Connect a model** in the dashboard (Aeon Connect at https://www.aeon.fun/connect, or the local `./aeon`). Runs on your Pro/Max subscription, no per-token billing |
| `ANTHROPIC_API_KEY` | console.anthropic.com — pay-as-you-go `sk-ant-…`. Also accepts any Anthropic-compatible key for a proxy |
| `OPENROUTER_API_KEY` | openrouter.ai/keys — `sk-or-…` |
| `BANKR_LLM_KEY` | bankr.bot/api-keys — `bk_…`, discounted Opus |
Expand All @@ -45,7 +45,7 @@ The first two are the direct-to-Anthropic options; the rest are gateways. Settin
| `SURPLUS_API_KEY` | surplusintelligence.ai — `inf_…`, settles USDC on Base. Fund the wallet and `approve()` once before first use |
| `HIVEMINDOS_CREDIT_TOKEN` | HivemindOS Models - a credit token billed to a balance, not a provider account. Routed through a local translator sidecar. Not in the dashboard modal yet; set it with `gh secret set` |
| `XAI_API_KEY` | console.x.ai — `xai-…`. Triple duty: X/tweet skills, the Grok gateway, and API-key auth for the grok harness |
| `GROK_CREDENTIALS` | Dashboard → AUTH → **Connect X account**. Base64 of your `~/.grok` session; runs the grok harness on a SuperGrok / X Premium+ entitlement. No CLI path for this one |
| `GROK_CREDENTIALS` | Dashboard → **Connect a model** → **Connect X account**. Base64 of your `~/.grok` session; runs the grok harness on a SuperGrok / X Premium+ entitlement. No CLI path for this one |

## 2. Notification channels — need at least one

Expand Down
7 changes: 4 additions & 3 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ Most contributions fall into one of three buckets, each with its own checklist b

## Before you start

- **Fork or use the template.** This repo is a public template — click **Use this
template** (or `gh repo fork aeonfun/aeon --clone`). Run your own instance as
a fork; open PRs back here for changes that benefit everyone.
- **Fork to contribute.** PRs come from a fork (`gh repo fork aeonfun/aeon --clone`).
Just want to run an agent? Use [Aeon Connect](https://www.aeon.fun/connect)
(browser) or `./aeon init` (terminal) instead; open PRs back here for changes
that benefit everyone.
- **Branch from `main`.** Never push to `main`. Use a descriptive branch name
(`feat/…`, `fix/…`, `docs/…`).
- **One change per PR.** A focused 20-line fix lands faster than a 500-line bundle.
Expand Down
1 change: 1 addition & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ body:
options:
- "GitHub Actions (scheduled / cron)"
- "Run now (dashboard)"
- "Hosted (Aeon Connect, www.aeon.fun/connect)"
- "Local (./aeon)"
- "Other / not sure"
validations:
Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ blank_issues_enabled: false
contact_links:
- name: 📖 Setup & usage help
url: https://github.com/aeonfun/aeon#quick-start
about: New to Aeon? Start with the Quick start, then run bin/onboard to verify your setup before filing an issue.
about: New to Aeon? The fastest start is Aeon Connect (https://www.aeon.fun/connect). Set up from a clone? Run bin/onboard to verify your setup before filing an issue.
- name: 🐦 Questions & updates
url: https://x.com/aeonframework
about: For general questions or to follow what's shipping, reach out on X.
24 changes: 18 additions & 6 deletions .github/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

<p align="center">
<strong>Star us&nbsp;❤️&nbsp;→</strong>&nbsp;&nbsp;
<a href="https://www.aeon.fun/connect"><img src="../docs/assets/btn-run.svg" alt="Run now: start your Aeon agent in the browser with Aeon Connect" height="34" align="absmiddle"></a>&nbsp;&nbsp;
<a href="https://github.com/aeonfun/aeon/stargazers"><img src="../docs/assets/btn-star.svg" alt="Star Aeon on GitHub" height="34" align="absmiddle"></a>&nbsp;&nbsp;
<a href="https://www.aeon.fun"><img src="../docs/assets/btn-site.svg" alt="aeon.fun" height="34" align="absmiddle"></a>&nbsp;&nbsp;
<a href="https://www.aeon.fun/docs"><img src="../docs/assets/btn-docs.svg" alt="Aeon docs" height="34" align="absmiddle"></a>&nbsp;&nbsp;
Expand All @@ -16,6 +17,8 @@
<strong>No approval loops. No babysitting. Configure once, forget forever.</strong>
</p>

> **▶ Start in your browser:** **[www.aeon.fun/connect](https://www.aeon.fun/connect)** - sign in with GitHub, connect a model, pick skills. No clone, no terminal.
>
> **🤖 Using a coding agent?** Point it here: **read https://www.aeon.fun/skills/aeon.md and follow the instructions to set up your Aeon agent.**

<div align="center">
Expand All @@ -36,22 +39,31 @@
## Quick start

<p align="center">
<img src="../docs/assets/quickstart-aeon.jpg" alt="Quick start in four steps: 1 Fork - Use this template to get your own repo copy. 2 Connect - add a Telegram, Discord, Slack, or email channel. 3 Pick skills - toggle skills on and set their cron schedule. 4 Runs itself - Aeon runs unattended on GitHub Actions." width="100%" />
<img src="../docs/assets/quickstart-aeon.jpg" alt="Quick start in four steps: Sign in, Connect, Pick, Run. 1 Sign in - log in with GitHub at www.aeon.fun/connect and get your own repo. 2 Connect - connect a model, such as your Claude subscription. 3 Pick skills - toggle skills on and set their schedule. 4 Runs itself - Aeon runs unattended on GitHub Actions." width="100%" />
</p>

**In your browser (recommended): [Aeon Connect](https://www.aeon.fun/connect).** Sign in with GitHub at **[www.aeon.fun/connect](https://www.aeon.fun/connect)** and click **Create your aeon**: it makes **your own repo** (public = a fork of `aeonfun/aeon`, free Actions minutes; private = a copy, on your own minutes) and turns GitHub Actions on. Install the [Aeon Connect GitHub App](https://github.com/apps/aeon-connect) on that one repo (GitHub's page opens with it pre-selected), then **connect a model** (a Claude subscription token from `claude setup-token`, an API key, a ChatGPT login, or OpenRouter in one click), **pick skills**, and press **Run**. Keys go straight into your repo's encrypted secrets; Aeon Connect only hosts the dashboard, and every run happens on your own GitHub Actions.

**Using a coding agent?** Paste this into Claude Code, Codex, Hermes or OpenClaw: `read https://www.aeon.fun/skills/aeon.md and follow the instructions to set up your aeon agent`.

<details>
<summary><strong>Prefer the terminal?</strong></summary>

You need **Node.js 20+** and the **[GitHub CLI](https://cli.github.com/) (`gh`)**. Then:

```bash
git clone https://github.com/aeonfun/aeon && cd aeon
./aeon init
```

`./aeon init` does the rest and tells you what it did at each step: signs you in to GitHub, creates **your own repo** from the template (public by default - Actions minutes are free; `--private` if you prefer), points this folder and `gh` at it, turns on GitHub Actions, stores your GitHub token for runs, connects a model (any of nine [harnesses](../docs/harnesses.md): a Claude subscription, an API key, or one OpenRouter key) and, if you want, links Telegram. It is safe to re-run: every step checks first and skips what is already done. Then `./aeon` opens the dashboard at [localhost:5555](http://localhost:5555) to **pick skills** and **Run**. `bin/onboard` re-checks the whole setup any time (read-only).
`./aeon init` does the rest and tells you what it did at each step: signs you in to GitHub, creates **your own repo** from the template (public by default - Actions minutes are free; `--private` if you prefer), points this folder and `gh` at it, turns on GitHub Actions, stores your GitHub token for runs, connects a model (any of nine [harnesses](../docs/harnesses.md): a Claude subscription, an API key, or one OpenRouter key) and, if you want, links Telegram. It is safe to re-run: every step checks first and skips what is already done. Then `./aeon` opens the same dashboard locally at [localhost:5555](http://localhost:5555) to **pick skills** and **Run**. `bin/onboard` re-checks the whole setup any time (read-only).

</details>

<details>
<summary><strong>Prefer to do it by hand?</strong></summary>

1. Click **Use this template** on [the repo page](https://github.com/aeonfun/aeon) (keep it public; Actions minutes are free). Use the template rather than **Fork**: a fork starts with **GitHub Actions disabled** and its schedules never fire until you enable workflows in its Actions tab.
1. Click **Use this template** on [the repo page](https://github.com/aeonfun/aeon) (keep it public; Actions minutes are free). A template copy starts with GitHub Actions on. If you fork by hand instead, open the fork's **Actions** tab and enable workflows first: a fork starts with Actions off and its schedules never fire until you do. ([Aeon Connect](https://www.aeon.fun/connect) forks public instances and turns Actions on for you.)
2. Clone it and point `gh` at it - without this, secrets you set land on `aeonfun/aeon` instead of your repo:

```bash
Expand All @@ -61,7 +73,7 @@ git clone https://github.com/aeonfun/aeon && cd aeon
./aeon
```

3. In the dashboard: **Authenticate** -> **add a channel** -> **pick skills** -> **Run**.
3. In the dashboard: **Connect a model** -> **add a channel** -> **pick skills** -> **Run**.

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)). For skills that reach other repos, add a classic PAT with `repo` + `workflow` as `GH_GLOBAL` ([details](../docs/CONFIGURATION.md#cross-repo-access)).

Expand All @@ -70,7 +82,7 @@ Everything is also an `./aeon` command ([CLI](../apps/cli/README.md)) or a `/aeo
<details>
<summary><strong>No admin rights / can't install <code>gh</code>?</strong></summary>

Grab the `gh_*_macOS_arm64.zip` (or your platform's binary) from [github.com/cli/cli/releases](https://github.com/cli/cli/releases) and drop it on your `PATH` (e.g. `~/.local/bin`). Then `gh auth login`.
You don't need either: [Aeon Connect](https://www.aeon.fun/connect) sets everything up from the browser. For the terminal path, grab the `gh_*_macOS_arm64.zip` (or your platform's binary) from [github.com/cli/cli/releases](https://github.com/cli/cli/releases) and drop it on your `PATH` (e.g. `~/.local/bin`). Then `gh auth login`.

</details>

Expand Down Expand Up @@ -185,7 +197,7 @@ skills:

Full reference - scheduling, `var`, models, [authentication](../docs/CONFIGURATION.md#authentication), [notification channels](../docs/CONFIGURATION.md#notifications), API keys, guardrails: **[Configuration](../docs/CONFIGURATION.md)**.

**GitHub permissions:** the built-in `GITHUB_TOKEN` covers same-repo work; add **one classic PAT** as `GH_GLOBAL` with **`repo`** + **`workflow`** scopes to drive every cross-repo, private, disclosure, and workflow-editing skill. No `read:org` / `admin:org`. See [Cross-repo access](../docs/CONFIGURATION.md#cross-repo-access).
**GitHub permissions:** the built-in `GITHUB_TOKEN` covers same-repo work; add **one classic PAT** as `GH_GLOBAL` with **`repo`** + **`workflow`** scopes to drive every cross-repo, private, disclosure, and workflow-editing skill. No `read:org` / `admin:org`. See [Cross-repo access](../docs/CONFIGURATION.md#cross-repo-access). Set up with [Aeon Connect](https://www.aeon.fun/connect)? The dashboard reaches your repo through the Aeon Connect GitHub App, so no PAT is needed to get going; `GH_GLOBAL` is only for the cross-repo skills above.

---

Expand Down
22 changes: 15 additions & 7 deletions .github/SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,16 +40,18 @@ rather stay anonymous.

## Supported versions

Aeon ships as a public template that you fork. Security fixes land on the `main`
Aeon ships as a public template: your instance is a fork or a copy of it. Security fixes land on the `main`
branch of [`aeonfun/aeon`](https://github.com/aeonfun/aeon) only.

| Version | Supported |
|---------|-----------|
| `main` (latest) | ✅ Yes |
| Your fork, behind `main` | ⚠️ Pull `upstream/main` to receive fixes |
| Your instance, behind `main` | ⚠️ Pull `upstream/main` to receive fixes |
| Older tags / releases | ❌ No |

Forks are self-maintained. To stay current:
Instances are self-maintained. To stay current, run the `aeon-update` skill (it
opens a PR that merges `aeonfun/aeon` into your instance, fork or copy), or merge
by hand:

```bash
git remote add upstream https://github.com/aeonfun/aeon.git
Expand Down Expand Up @@ -83,10 +85,16 @@ injection — see the `## Security` section of [`CLAUDE.md`](../CLAUDE.md).
- Skills are instructed to **never exfiltrate** environment variables, secrets,
or file contents to an external URL.
- The default `GITHUB_TOKEN` is scoped to the running repo only. Cross-repo
skills use an optional fine-grained `GH_GLOBAL` token whose scope **you**
choose — grant it the least access those skills need.
- Run your live instance as a **private fork** so `memory/`, `output/`, and any
operator data stay private.
skills use an optional `GH_GLOBAL` token (a classic PAT with `repo` +
`workflow`, see [Cross-repo access](../docs/CONFIGURATION.md#cross-repo-access));
leave it unset if you don't run those skills.
- Instances set up with [Aeon Connect](https://www.aeon.fun/connect) are driven
through the Aeon Connect GitHub App, installed on that one repo only. Keys you
connect are encrypted straight into the repo's Actions secrets; Aeon Connect
does not store them.
- A public instance's `memory/`, `output/`, and run logs are public. To keep
them private, make the instance a **private repo** (a copy of the template:
GitHub does not allow private forks of a public repo).

### Sandbox

Expand Down
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,18 @@ from or pin to; the template keeps serving the latest `main` to new forks.

### Added

- **Aeon Connect: start an agent from the browser.** [www.aeon.fun/connect](https://www.aeon.fun/connect)
is the hosted, multi-tenant version of the dashboard (aaronjmars/aeon-connect). Sign in with GitHub,
**Create your aeon**: the repo is created first (public = a real fork of aeonfun/aeon that can pull
upstream; private = a copy generated from it, since GitHub forbids private forks; an account that
already has a fork can reuse it or make a copy), then GitHub's install page opens with only that
repo pre-selected for the Aeon Connect GitHub App. Actions setup is enable-only (Actions, PR
creation, a fork's disabled workflows and Issues), never widening permissions. Then connect a model
(paste, or OpenRouter in one click), pick skills, and run; failed runs get the same **Why?**
diagnosis as the local dashboard. Keys go straight into the repo's encrypted secrets, installation
tokens are scoped to the one repo, and nothing to clone or install. The README quick start, docs,
setup skill, CLI help and `bin/onboard` hints now lead with it, with `./aeon init` as the terminal
path. (aeon-connect #58, #59, #60, #61, #62)
- **`./aeon init` sets up an instance in one command.** From a clone of the template it checks gh
and its `repo` + `workflow` scopes, creates the instance from the template (never a fork, never
aeonfun/aeon or a redirect), switches the folder over with aeonfun/aeon kept as `upstream`, runs
Expand Down
Loading
Loading