Thesis Creator
Stars-OC/thesis-creator
Walks Chinese undergraduates through writing a graduation thesis from topic to Word export, with text-similarity reduction and AI-text rate rewriting and checks.
Write a publication-ready article in one of three angles - a trending long-form piece, a watched-repo thesis, or a project-through-a-lens essay.
$ npx skills add aeonfun/aeon --skill article -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install aeonfun/aeon article --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/article .claude/skills/article && 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 "article" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/article into .claude/skills/article/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "article", 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/articleType 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 article -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install aeonfun/aeon article --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/article .agents/skills/article && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "article" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/article into .agents/skills/article/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "article", 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 article -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install aeonfun/aeon article --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/article .cursor/skills/article && 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 "article" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/article into .cursor/skills/article/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "article", 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/article--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 article -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install aeonfun/aeon article --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/article .gemini/skills/article && 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 "article" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/article into .gemini/skills/article/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "article", 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 articleInstalls 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 article -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/article .github/skills/article && 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 "article" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/article into .github/skills/article/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "article", 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 article -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 article --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/article .opencode/skills/article && 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 "article" agent skill from https://github.com/aeonfun/aeon/tree/main/skills/article into .opencode/skills/article/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "article", 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.
articleWrite a publication-ready article in one of three angles - a trending long-form piece, a watched-repo thesis, or a project-through-a-lens essay.
Article is an agent skill from aeonfun/aeon. Write a publication-ready article in one of three angles - a trending long-form piece, a watched-repo thesis, or a project-through-a-lens essay. Optional Replicate hero image with --visual.
Its SKILL.md is about 8.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Education, covering Essays and academic help. 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.
12 steps, taken from the step headings in SKILL.md.
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:
ghcurlFrom 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:
api.semanticscholar.orgsemanticscholar.orggithub.comapi.replicate.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
REPLICATE_API_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Article loads about 8.2k tokens when it runs. Until then it costs about 49 tokens; SKILL.md has 3,338 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,338 words, ~8,186 tokens.
.claude/skills/article/SKILL.md (or your agent's skills folder).${var} — Selector:
[angle:arg] [--visual]. The angle prefix picks the article type; append--visual(orvisual) anywhere to also generate a Replicate hero image.
- empty →
standardgeneral long-form article on an auto-selected trending topic. If the resolved topic is a single explainable mechanism, it becomes a technical explainer instead.<topic>(no recognized prefix) →standardarticle on that topic.repo:<owner/repo>→repothesis-driven article about that repo.repo:<angle>(e.g.repo:architecture) or barerepo:uses the repo frommemory/watched-repos.mdwith that angle / an auto-selected angle — this preserves repo-article's original input.lens:<topic>→lensproject-through-a-lens essay framed by that lens (e.g.lens:unix philosophy). Barelens:auto-selects the lens.--visualappended to any of the above → after the body is written, generate a Replicate hero image (optionalREPLICATE_API_TOKEN; ships text-only if absent).Examples:
"","entropy trajectory reasoning --visual","repo:aeonfun/aeon","repo:roadmap","lens:regulation wave --visual".
Today is ${today}. Write a high-quality, publication-ready article. No placeholders.
memory/MEMORY.md for context on what topics/articles have been covered recently.memory/logs/ for recent activity — and don't re-report something already covered.${var} into angle + visual:--visual or visual token anywhere in ${var}; if present set visual = true and strip that token. Otherwise visual = false.repo: → angle = repo, arg = the rest. If it starts with lens: → angle = lens, arg = the rest. Otherwise → angle = standard, arg = the whole remaining string (empty ⇒ auto-select).visual = true, run the Visual add-on after the article body is written, regardless of angle.A single long-form article. It takes one of two structures depending on the topic:
arg (the topic) is set, use it verbatim. If it clearly names a single mechanism/technique/system → technical explainer structure; otherwise → general article structure.arg is empty, pick deterministically — first hit wins:output/articles/ from the last 3 days; else the newest "Paper Pick" in memory/logs/ from the last 7 days (its headline mechanism); else a specific technique/algorithm/system surfaced in the last 7 days of logs. If a strong single-mechanism candidate exists → technical explainer on it. Reject any candidate broader than a single mechanism (e.g. "AI agents" — too vague; "MCP tool-routing via vector search" — usable).If a soul/ directory exists, read the soul files for voice calibration: soul/SOUL.md (identity, worldview, opinions), then soul/STYLE.md (writing style, sentence structure, anti-patterns). This is you explaining a mechanism to a smart friend — more precision than a general article, same voice. No textbook tone, no "let's explore." If soul/ is empty, default to clear, direct, neutral.
General article: read 2–3 source articles with WebFetch to gather facts and quotes.
Technical explainer: run three distinct WebSearch queries so you triangulate rather than echo one source:
"<topic>" how it works — mechanism explanations"<topic>" benchmark OR results OR latency OR cost — concrete numbers"<topic>" limits OR criticism OR fails OR doesn't work — failure modes and pushbackIf the topic is from a paper, also fetch the paper metadata and abstract:
curl -s "https://api.semanticscholar.org/graph/v1/paper/search?query=TOPIC&limit=5&fields=title,authors,abstract,url,publicationDate,openAccessPdf" \
|| echo "curl failed — use WebFetch on https://www.semanticscholar.org/search?q=TOPIC instead"Use WebFetch to read the 2–3 best sources in depth. At least one source must be primary: a paper (arXiv / OpenReview / Semantic Scholar), official documentation, the project's own README, or a code repo. Blog summaries alone are not enough — they often mangle the mechanism.
Extract:
General article — 600–800 words in Markdown. Include:
Technical explainer — 600–1000 words. Structure (every section required):
# <Title>
**Key idea in one sentence:** <one-sentence claim about the mechanism>
## The Setup
2-3 sentences. What problem does this solve? Why now?
## The Intuition Pump
A vivid analogy that builds the reader's mental model in 3-4 sentences. Then one sentence on **where the analogy breaks down** — that's where the real mechanism lives.
## How It Actually Works
A numbered walkthrough of the mechanism in **3-7 steps**. Each step is one or two sentences. Use concrete examples — name the specific function, layer, message, opcode, contract. No "the system processes the input" — say what the system actually does.
## Numbers That Anchor It
3-5 bullet points. Each bullet is a specific number with a source link, e.g.:
- 8.4× faster end-to-end than baseline at 4K context ([source](url))
## What Would Break This
1-2 sentences naming a result that, if observed, would falsify the claim. This forces honesty.
## Why It Matters
2-3 sentences. What does this unlock? Who should care?
## Sources
- [Title 1](url) — primary
- [Title 2](url)
- [Title 3](url)Voice rules (technical explainer): First person where it fits. Explanatory > opinionated, but not bloodless. Technical precision > hedging — if you don't know, say so, don't fudge. Short paragraphs. Em dashes. Concrete > abstract. Reference specific systems, papers, people — no "researchers have shown," name them. Cite inline: every number, every claim that could be wrong, gets a link.
output/articles/${today}.md.output/articles/explainer-${today}.md. If a hero image was generated (see Visual add-on), put it at the very top:  — relative path, skip the line if no image — and add an HTML comment with the image prompt used (for future audits).Update memory/MEMORY.md to record the article and its topic (add to the Recent Articles list/table). Append the consolidated log entry (see Log), then notify via ./notify:
General article:
New article written: [title]
https://github.com/${GITHUB_REPOSITORY}/blob/main/output/articles/${today}.mdUse the $GITHUB_REPOSITORY env var (GitHub Actions sets it to owner/repo of the running instance).
Technical explainer:
technical explainer: [title]
[the one-sentence "key idea" line, verbatim]
[hero image URL if generated — original Replicate URL still works for ~24h]
read it: output/articles/explainer-${today}.md<!-- autoresearch: variation B — editorial discipline: research → thesis → draft → self-edit, with a falsifiable claim and a quality gate -->
Reads repos from memory/watched-repos.md. Resolve the target repo:
arg looks like owner/repo (contains a /) → that's the repo to cover; the angle is auto-selected in Phase 2.arg is a non-empty keyword (e.g. architecture, recent progress, roadmap) → it's the angle; pick the repo from memory/watched-repos.md (if multiple are listed, the one with the most activity in the last 7 days).arg empty) → repo from memory/watched-repos.md (most active of the last 7 days), angle auto-selected.An article without a thesis is filler. This angle runs five phases and only advances when the current phase's gate passes.
Run these in parallel where possible (substitute the resolved owner/repo):
# Repo metadata
gh api repos/owner/repo --jq '{name, description, language, stargazers_count, forks_count, open_issues_count, topics, created_at, updated_at, pushed_at, default_branch}'
# Commits in last 7 days (paginated)
gh api repos/owner/repo/commits -X GET \
-f since="$(date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -v-7d +%Y-%m-%dT%H:%M:%SZ)" \
--jq '.[] | {sha: .sha[0:7], msg: .commit.message | split("\n")[0], author: .commit.author.name, date: .commit.author.date, url: .html_url}' --paginate
# Merged PRs in last 7 days
gh api 'repos/owner/repo/pulls?state=closed&sort=updated&direction=desc&per_page=50' \
--jq '[.[] | select(.merged_at and (.merged_at > (now - 86400*7 | todate))) | {number, title, user: .user.login, merged_at, additions, deletions, url: .html_url}]'
# Open PRs
gh api repos/owner/repo/pulls --jq '[.[] | {number, title, user: .user.login, created_at, draft, labels: [.labels[].name], url: .html_url}]'
# Issues opened/closed in last 7 days (exclude PRs)
gh api 'repos/owner/repo/issues?state=all&since='$(date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZ)'&per_page=100' --paginate \
--jq '[.[] | select(.pull_request | not) | {number, title, state, created_at, closed_at, labels: [.labels[].name]}]'
# Last 3 releases
gh api repos/owner/repo/releases --jq '.[0:3] | .[] | {tag_name, name, published_at, body}'
# README (fallback: WebFetch raw URL if base64 decode fails)
gh api repos/owner/repo/readme --jq '.content' | base64 -dFrom the commit list, find the most-frequently-touched files. Read the top 2–3 of those with gh api repos/owner/repo/contents/<path> plus any CHANGELOG.md, ROADMAP.md, or architecture docs.
External context — three distinct WebSearch queries:
"owner/repo" site:news.ycombinator.com OR site:lobste.rs OR site:reddit.com"owner/repo" twitter OR x.com (or the project name if distinctive)Gate 1 — enough story? If all of the following hold, abort and notify REPO_ARTICLE_SKIPPED: insufficient activity (log reason, write no article):
Quiet-repo exception: if the repo has historical importance but is currently slow (e.g. only 1–2 commits this week, no release), do not skip — instead narrow the article's focus to the single most substantive recent change (a specific commit, a contested issue thread, a roadmap update) and write a shorter piece around that. Prefer publishing a tight 600-word piece on one real change over skipping.
Write one falsifiable claim in ≤25 words. The claim must be disprovable by specific evidence — not a vibe.
output/.chains/*.md contracts."If an angle is forced (from arg), the thesis must relate to it (e.g. angle architecture → an architectural claim). If no angle is forced, pick the one with the strongest evidence from: shipping velocity shift, architectural pivot, community growth inflection, roadmap commitment, deprecation/scope cut, performance or scale milestone.
Gate 2 — falsifiability. Finish the sentence: "This claim would be wrong if ____." If you can't complete it with something concrete and checkable, rewrite the thesis.
# [Title that asserts the thesis or a consequence of it — not "A look at X"]
[1-paragraph hook, ≤80 words: lead with the thesis or a surprising number that sets it up.]
## The claim
> [The falsifiable thesis, verbatim, as a blockquote.]
## Evidence
[Two to four sub-paragraphs. Each MUST cite at least one specific commit SHA, PR#, file path, release tag, or external mention. Link the source inline.]
## Counter-evidence / what would change my mind
[One paragraph. What recent signals argue against the thesis? Be honest. If genuinely nothing does, say so — but only after looking.]
## Why it matters
[One paragraph. Who benefits or loses if the thesis is true? Connect to an ecosystem trend, user need, or competing project.]
---
*Sources*
- [Label](url)
- [Label](url)
[≥4 total, ≥1 in-repo (commit/PR link) and ≥1 external (news/social/doc).]Run this checklist. Rewrite any line that fails. Target: 8/8 passing.
If any item still fails after one rewrite pass, publish with status REPO_ARTICLE_DEGRADED and note which items failed in the log — don't hide it.
output/articles/repo-article-${today}.md. (If a hero image was generated via the Visual add-on, put  at the top.)Recent Articles table in memory/MEMORY.md (Date | Title | Topic)../notify:*[Article title]*
Thesis: [one sentence]
Read: [link to output/articles/repo-article-${today}.md in THIS repo — get the repo name from `git remote get-url origin`, not the watched repo]Reject a draft that contains any of these. Match case-insensitively, whole phrase or obvious variant:
If a banned phrase is the most accurate word in a technical context (e.g. actually describing leverage in a derivatives article), keep it and note the exemption in the log.
<!-- autoresearch: variation B — editorial discipline (research → falsifiable thesis → draft → self-edit with hard gates) -->
Writes articles that explain the project through a different lens each time — framed so a reader who's never heard of the project understands why it matters, via something they already care about. NOT a repo progress update (that's the repo angle above). arg is the lens (e.g. "unix philosophy", "regulation wave", "open source funding"); if empty, auto-select from trending topics + angle rotation.
Read before deciding anything: memory/MEMORY.md, the last 7 days of memory/logs/, memory/watched-repos.md, and memory/project-lens-angles.md (may not exist on first run — treat absence as empty history).
Why models fail at this by default: they slide into feature-listing wrapped in philosophical language, forced parallels with no mechanism, and marketing tone. This angle prevents that with a research → thesis → draft → self-edit pipeline where each phase has hard gates. If the gates can't pass, abort — don't publish a weak article.
Read before deciding anything:
output/articles/project-lens-*.md and memory/project-lens-angles.md — know which angle categories and theses are exhausted.output/articles/repo-article-*.md and output/articles/push-recap-*.md — know what shipped lately.gh api repos/{owner}/{repo} --jq '{name, description, stargazers_count, forks_count, open_issues_count, updated_at}'. If unreachable, continue with memory only and log the gap.If memory/watched-repos.md is empty or missing, abort and notify: "project-lens: no watched repo configured."
If arg is set, use it verbatim. Classify into one of the 8 categories below for logging.
If arg is empty:
"AI agents" autonomy debate last 7 days, crypto regulation April 2026, open source funding model 2026).Angle categories (no repeat within 14 days):
External side — required minimums:
Project side — required minimums:
output/articles/ read end-to-endgh api repos/{owner}/{repo}/commits --jq '.[0:10] | .[] | {sha: .sha[0:7], msg: (.commit.message|split("\n")[0])}' — last 10 commitsIf you cannot hit these minimums, abandon the angle and re-run Phase 2 with a different category. Log the abandoned angle and why.
Before drafting, write ONE falsifiable claim in ≤30 words that links the lens to the project. Example:
"Running agents as scheduled GitHub Actions — rather than as persistent servers — trades a few seconds of latency for a property the AI industry barely has: versioned, audit-trailed, publicly forkable autonomy."
Rules:
If you can't state the thesis in one sentence, the angle isn't working — return to Phase 2. Do not proceed with a fuzzy thesis.
Save to output/articles/project-lens-${today}.md with this structure:
# [Title: leads with the lens, works for a reader who doesn't know the project]
[¶1-2: external hook. Start with the trend/idea/event/question the reader already cares about. Do NOT name the project yet.]
## [Section: establishes the external frame]
[Build the lens with one or more of your concrete facts — a quote, a number, a specific event.]
## [Section: introduces the project through the frame]
[Project enters here — but through the lens, not as a feature list. Describe how it embodies, challenges, or extends the idea with specific code/design references.]
## [Section: one non-obvious technical or strategic detail]
[Where the article earns its existence. Point to something in the code, architecture, or approach a reader wouldn't get from the README.]
## [Section: zoom back out]
[A concrete forward claim — specific enough to be wrong. Not "this is exciting." Something like "this suggests X won't happen for 2-3 years because Y" or "this is the same mistake [named case] made, and it took [duration] to recover."]
---
*Sources:*
- [source title](url) — what it was used for
- ...Draft requirements:
Go through this checklist after the first draft. If any gate fails, rewrite the affected section once. If the second pass still fails, abort and log — do not publish a weak article.
output/articles/project-lens-${today}.md. (If a hero image was generated via the Visual add-on, put  at the top.)memory/project-lens-angles.md (create if missing):## ${today}
- Angle: [category]
- Thesis: [one-line falsifiable claim]
- Title: [article title]
- Sources: [3-5 URLs]./notify:*New Article: [title]*
[3-4 sentence summary: the external thing the article connects to, the thesis claim, one specific project detail.]
Read: [URL to output/articles/project-lens-${today}.md — use `git remote get-url origin` for this repo]memory/project-lens-angles.md).--visual) — Replicate hero imageRuns only when visual = true, after the article body is written and saved, for any angle. Use Replicate's Nano Banana Pro (Gemini 3 Pro Image). It renders text labels well — exploit that by writing prompts that ask for labeled diagrams or schematics, not stock-photo metaphors. Set IMG_BASENAME to match the article file for the angle: explainer-${today} (standard/explainer), article-${today} (standard/general), repo-article-${today} (repo), or project-lens-${today} (lens).
Preflight: check presence with the ${VAR:+x} form — [ -n "${REPLICATE_API_TOKEN:+x}" ] (a bare $REPLICATE_API_TOKEN trips the secret-expansion analyzer and falsely reads as unset). If it's unset, log IMAGE_SKIPPED reason=no-token and skip to step 5 (no-image path). Do not attempt any Replicate call. The article must ship without an image in this case.
Craft the prompt. Aim for technical illustration energy, not marketing. Strong prompt templates:
<mechanism>, dark navy background, thin cyan and amber lines, labeled boxes reading '<label1>', '<label2>', '<label3>', arrows showing data flow from <A> to <B> to <C>, blueprint aesthetic, 16:9"<core concept>: <visual metaphor with concrete objects>, flat geometric style, restrained palette of two accent colors on near-black background, no human figures, 16:9"<mechanism>: nodes labeled '<A>', '<B>', '<C>' connected by directional arrows, weights shown as line thickness, monospace labels, technical-paper figure style, 16:9"
Avoid: photorealistic faces, stock-business imagery, "AI brain" tropes, gradient slop.Generate with fallback enabled from the start (Nano Banana Pro can rate-limit; Seedream 5.0 lite is the fallback). The Replicate call is auth'd, so route it through ./secretcurl with the {REPLICATE_API_TOKEN} placeholder — never a bare $REPLICATE_API_TOKEN on the line (the Bash permission layer refuses it):
./secretcurl -s -X POST \
-H "Authorization: Bearer {REPLICATE_API_TOKEN}" \
-H "Content-Type: application/json" \
-H "Prefer: wait" \
-d '{
"input": {
"prompt": "YOUR_DETAILED_PROMPT_HERE",
"aspect_ratio": "16:9",
"number_of_images": 1,
"safety_tolerance": 5,
"allow_fallback_model": true
}
}' \
"https://api.replicate.com/v1/models/google/nano-banana-pro/predictions"Prefer: wait usually returns the image inline in .output. If .output is empty, the prediction is still running — poll .urls.get for up to ~60s (./secretcurl -s -H "Authorization: Bearer {REPLICATE_API_TOKEN}" "$PRED_URL"), stopping when .status is succeeded (read .output) or failed/canceled (no-image path, step 5).
Persist locally — Replicate CDN URLs expire. Download and commit (the CDN URL carries no secret, so plain curl is fine):
mkdir -p output/images
IMAGE_URL=<extracted from response.output>
EXT=$(echo "$IMAGE_URL" | grep -oE '\.(jpg|jpeg|png|webp)' | tail -1)
EXT="${EXT:-.jpg}"
LOCAL_PATH="output/images/${IMG_BASENAME}${EXT}"
curl -sL "$IMAGE_URL" -o "$LOCAL_PATH" \
|| (echo "curl failed — retry via WebFetch or skip"; exit 0)No-image path (token missing, API down, rate-limited, or download failed): log IMAGE_SKIPPED reason=<concrete reason> and proceed with the article. Add a one-line note at the top of the article: <!-- hero image skipped: <reason> -->. The text must stand on its own. Never fail the whole skill because of an image problem.
Once the image is saved, add the hero-image line to the top of the article file () and include the original Replicate URL in that angle's notification if the angle's notify format has an image slot.
Append one entry under a single ### article heading in memory/logs/${today}.md, as bullet points. Start with a discriminator line naming the branch/mode that ran, then the branch-specific fields:
### article
- Branch: standard | repo | lens (+visual if --visual ran)Standard branch fields:
- Mode: general-article | technical-explainer
- Topic: [topic]
- Title: [title]
- Key idea: [one-sentence claim] (technical-explainer only)
- Image: generated | fallback-model | skipped (<reason>) | n/a
- Image prompt: [prompt used, or "n/a"]
- Primary source: [URL] (technical-explainer only)
- File: output/articles/${today}.md | output/articles/explainer-${today}.md
- Notification sent: yes | noRepo branch fields:
- Repo: owner/repo
- Thesis: [verbatim]
- Angle: [arg or auto-selected]
- Word count: N
- Self-edit checklist: X/8 passing
- Image: generated | fallback-model | skipped (<reason>) | n/a
- Status: REPO_ARTICLE_OK | REPO_ARTICLE_DEGRADED | REPO_ARTICLE_SKIPPEDLens branch fields:
- Angle: [category]
- Thesis: [one-line]
- External sources: [count] across [N] distinct domains
- Project references: [count]
- Self-edit gates: all passed | failed at [gate name] → rewrite → [passed | aborted]
- Image: generated | fallback-model | skipped (<reason>) | n/a
- Status: published | aborted
- Notification: sent | skippedLog always — even on partial failure (e.g. IMAGE_SKIPPED, REPO_ARTICLE_SKIPPED, aborted lens).
There is no network sandbox — curl works. For a flaky public GET, fall back to WebFetch on the same URL. For an auth'd API, call ./secretcurl with a {ENV_NAME} placeholder (the key is injected via requires:) — never a bare $SECRET on the line. gh api handles GitHub auth internally — prefer it over raw curl for repo metadata.
The Replicate call runs in-run via ./secretcurl (see the Visual add-on). If it fails, times out, or the download fails, go straight to the no-image path (step 5) — the article ships text-only. There is no deferred fallback; the image is best-effort and never blocks the article.
REPLICATE_API_TOKEN — Replicate API key, used only by the --visual add-on. Optional: article text ships without it via the no-image path.Write complete, publication-ready content. No placeholders.
© 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/article of aeonfun/aeon.
Open the folder on GitHubat commit f252074
Article 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 |
|---|---|---|---|---|---|---|
| Article this skillaeonfun/aeon | 767 | — | ~8.2k | Automated safety check: Pass | MIT | |
| Thesis CreatorStars-OC/thesis-creator | 227 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Aigc Detectorfree-revalution/AIGC-Detector-Pro | 141 | — | ~2.8k | Automated safety check: Pass | MIT | |
| Weekly Performance Digesttradermonty/claude-trading-skills | 3k | 1 repos | ~1.4k | Automated safety check: Pass | MIT | |
| Ssc Evidencefranklee16/academic-research-skills | 223 | 1 repos | ~317 | Automated safety check: Pass | None | |
| Ylj Preemption Checkbrycewang-stanford/Awesome-Journal-Skills | 1.2k | — | ~1.4k | Automated safety check: Pass | MIT |
Stars-OC/thesis-creator
Walks Chinese undergraduates through writing a graduation thesis from topic to Word export, with text-similarity reduction and AI-text rate rewriting and checks.
free-revalution/AIGC-Detector-Pro
Academic paper AI content detection, rewriting, and thesis writing assistant.
tradermonty/claude-trading-skills
Generate a weekly performance summary from closed trader-memory-core theses — win rate, expectancy, profit factor, R-multiple, MAE/MFE, and win/loss pattern analysis by source skill, exit reason…
franklee16/academic-research-skills
A skill your agent uses when handling empirical evidence in a 《中国社会科学》 (Social Sciences in China) manuscript — choosing among quantitative, qualitative, and historical-comparative methods so the…
brycewang-stanford/Awesome-Journal-Skills
A skill your agent uses when verifying that a The Yale Law Journal (YLJ) claim is genuinely novel and not preempted by prior scholarship.
X-isdoingreat/canvas-pilot
Direct-commit syntactically-marked rewrite humanizer. An agent skill from X-isdoingreat/canvas-pilot.
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.
Categories
Write a publication-ready article in one of three angles - a trending long-form piece, a watched-repo thesis, or a project-through-a-lens essay. Article is an agent skill from aeonfun/aeon. Write a publication-ready article in one of three angles - a trending long-form piece, a watched-repo thesis, or a project-through-a-lens essay.
Article fits situations like: tasks that involve Essays and academic help.
Run `npx skills add aeonfun/aeon --skill article -a claude-code`. Or copy the skill folder (skills/article in aeonfun/aeon) into .claude/skills/article in your project. Claude Code loads it when a task matches its description.
Run `npx skills add aeonfun/aeon --skill article -a codex`. Or copy the skill folder (skills/article in aeonfun/aeon) into .agents/skills/article 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 article -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/article, .gemini/skills/article, .github/skills/article and .opencode/skills/article in your project.
Going by SKILL.md and its folder, Article needs the command-line tools its instructions call (gh and curl) and credentials named REPLICATE_API_TOKEN. Our summary lists: A credential in REPLICATE_API_TOKEN.
SKILL.md names 4 domains. In commands or code: api.semanticscholar.org, semanticscholar.org, github.com and api.replicate.com; 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.
Article 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.2k 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 Article: Thesis Creator (Stars-OC/thesis-creator, 227 stars), Aigc Detector (free-revalution/AIGC-Detector-Pro, 141 stars), Weekly Performance Digest (tradermonty/claude-trading-skills, 3k stars) and Ssc Evidence (franklee16/academic-research-skills, 223 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.