Auto-Workflow Builder
Auto-Workflow Builder analyzes provided URLs to generate a prioritized set of skill recommendations for aeon.yml automation. It fetches page metadata and social signals, verifies each recommendation against observed data on the target, tiers output into MUST, SHOULD, and NICE categories with reasoning, and outputs only the configuration delta needed rather than redundant full configs. Use this when onboarding a new GitHub repository, blog, X account, or project site to determine which aeon skills should monitor it.
git clone --depth 1 https://github.com/aaronjmars/aeon /tmp/auto-workflow-builder && cp -r /tmp/auto-workflow-builder/skills/auto-workflow ~/.claude/skills/auto-workflow-builderSKILL.md
<!-- autoresearch: variation B — sharper output (priority tiers + data-verification gates + delta-against-existing + exit taxonomy) -->
> **${var}** — URL to analyze (GitHub repo, X account, blog, project site, API docs, etc.). Multiple URLs comma-separated. Prefix with `force:` to re-analyze a URL already in the ledger.
## Overview
The operator runs this on-demand to decide *what to enable* for a new watch target. Original produces a wall of tables with no priority and recommends skills that may not actually have data to work with. This version:
1. Verifies every recommendation is backed by an *observed* signal on the URL.
2. Tiers output into **MUST** (2–3 max), **SHOULD**, **NICE** with a one-line concrete "why".
3. Emits a *delta* against current `aeon.yml` rather than a full config dump.
4. Stays silent (no notification, no article) when existing config already covers the URL.
5. Anchors skill names in `skills.json` (authoritative), not a stale mapping table.
---
## Steps
### 0. Parse input and load context
If `${var}` is empty → exit `AUTO_WORKFLOW_EMPTY`, notify `auto-workflow: set var= to one or more URLs (comma-separated)`.
Parse `${var}`:
- Split on `,`, trim each entry
- Detect `force:` prefix on any entry → sets `force=true` for that URL (skip ledger dedup)
- Normalize each URL:
- Add `https://` if scheme missing
- `twitter.com/` → `x.com/`
- `@handle` → `https://x.com/handle`
- Strip trailing `/`, fragment, and tracking params (`utm_*`, `ref`, `src`, `s`, `t`)
- Strip trailing `.git` on github URLs
- Reject `javascript:`, `data:`, local file URLs → exit `AUTO_WORKFLOW_ERROR` with the bad URL
Read context:
- `memory/MEMORY.md` — operator interests
- `aeon.yml` — CURRENT skill enablement, `var`, `schedule`, `model` per skill (this is the comparison baseline)
- `skills.json` — authoritative installed-skill list
- `memory/topics/auto-workflow-analyzed.md` (if exists) — for ledger dedup
**Ledger dedup:** If a URL is in the ledger with `analyzed_at` within the last 14 days and `force` is not set for it, skip it with `already_analyzed` reason. If ALL inputs are dedup-skipped → exit `AUTO_WORKFLOW_NO_CHANGE`, notify nothing, log a one-line skip entry.
---
### 1. Fetch and classify
For each remaining URL, `WebFetch` with prompt: "Return page title, meta description, all <link rel='alternate'>, og:* meta tags, social handle links (x.com, github.com, t.me, discord), detected RSS/Atom feed URLs, and any token contract addresses (0x… or Solana base58 near the words 'token'/'contract'/'mint'). Report the most recent date on the page. Report the tech stack (Jekyll/Hugo/Next.js/WordPress etc)."
If fetch fails or returns <300 chars of meaningful content, try fallbacks: `/robots.txt`, `/sitemap.xml`, `gh api` for github URLs. If all fail → mark this URL `FETCH_FAILED` with reason and continue to next URL.
Classify into ONE primary category: `github-repo` / `github-org` / `x-account` / `blog-or-news` / `crypto-project` / `api-or-docs` / `research` / `product` / `community` / `personal-site` / `other`.
Extract **concrete signals** (the "why" anchors for later recommendations):
- `feed_urls`: list of RSS/Atom URLs discovered
- `x_handles`: list of X handles linked from page
- `github_repos`: list of owner/repo from page links
- `token_contracts`: list of (chain, address, symbol) tuples
- `last_update`: most recent date found (ISO)
- `update_cadence`: estimate — `active` (<7d old), `steady` (<30d), `quiet` (<90d), `dormant` (≥90d)
- `tech`: stack hint if any
If classification confidence is low (sparse signals, no category clearly matches), mark `UNCLASSIFIED` for this URL and skip to next.
---
### 2. Match signals to installed skills
For each URL, generate candidate skills by intersecting:
- URL `category` and extracted signals
- Skills present in `skills.json`
Use this hint table — but **only emit skills whose slug exists in `skills.json`** (drop any slug not found):
| Category | Hint skills | Requires signal |
|----------|-------------|----------------|
| github-repo | github-monitor, github-issues, github-releases, pr-review, push-recap, repo-pulse, repo-article, code-health | `owner/repo` resolves via `gh api` |
| github-org | github-monitor, repo-pulse, repo-scanner | `owner` resolves as Organization or User with ≥5 repos |
| x-account | fetch-tweets, tweet-roundup, list-digest, refresh-x | `x_handle` extracted |
| blog-or-news | rss-digest, digest, article | ≥1 `feed_url` OR dated articles |
| crypto-project | token-alert, token-movers, onchain-monitor, defi-monitor, treasury-info | `token_contract` OR `token_symbol` |
| api-or-docs | deep-research | product is genuinely new + operator interest match |
| research | paper-pick, paper-digest, research-brief | arXiv-like URL or lab site |
| community | reddit-digest, telegram-digest, farcaster-digest, channel-recap | corresponding channel URL on page |
| product | deep-research, search-skill | operator interest match |
| personal-site | rss-digest, fetch-tweets | needs feed OR handle |
For each candidate, verify: **does this URL actually have the data the skill needs?**
| Skill need | Verification |
|------------|-------------|
| RSS feed URL | at least one valid `feed_url` in signals |
| X handle | `x_handle` extracted (not just a generic x.com link) |
| GitHub owner/repo | `gh api` returns 200 |
| Token contract | contract verified on DexScreener/CoinGecko (WebFetch fallback) |
| Topic string | operator's `MEMORY.md` mentions the topic or category |
**If verification fails, do not recommend the skill.** Record the skipped candidate as `unverified: <reason>` in the source-status footer — never carry to the output table.
---
### 3. Tier and justify
Rank each verified candidate into exactly one tier:
- **MUST** — skill produces the *primary* value for this URL type AND the URL is active or steady (`update_cadence` ≠ dormant). Cap at **3 per URL**, **5 total across batch**.
- **SHOULD** — skill meaningfullyMention/keyword sweep on social platforms for [REPLACE: KEYWORDS] — trends, sentiment, top posts
5 concrete real-life actions, leverage-scored against open loops with specificity and anti-fluff gates
Curated AI-agent tweets, clustered into narratives with insight summaries
Tracker of AI agent substitution signals — which roles, companies, and industries show real headcount displacement. Named roles + real deployments only.
Competitive-intelligence digest on the AI agent framework space — momentum, releases, breaking changes across a curated watchlist
Cross-domain market pulse from AIXBT's free grounding endpoint — crypto, macro, tradfi, geopolitics. Refreshes taxonomy references (clusters, chains) as a bonus.
Pre-batch API provider health check — detects credit exhaustion or auth failure for every configured provider key before the scheduled batch runs, giving the operator a window to act before skills degrade
List a wallet's live ERC-20 token approvals on Base and flag unlimited / risky spender grants. Keyless via Base RPC (eth_getLogs + eth_call) — no explorer key needed.