소스 정보
- 저장소
- aaronjmars/aeon
- 최근 소스 활동
- 2026년 7월 9일 18:30
- 감지된 SKILL.md 언어
- 영어
- 스타
- 574
- 포크
- 208
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/aaronjmars/aeon --skill deploy-prototype명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| type | Skill |
| name | Deploy Prototype |
| category | dev |
| description | Generate a small app or tool and deploy it live to Vercel via API |
| var | |
| tags | ["dev","build"] |
| requires | ["VERCEL_TOKEN?","GH_GLOBAL?"] |
${var} — What to build and deploy.
- Empty → auto-select from recent signals (articles, logs, memory topics).
- Plain text (e.g.
market heatmap) → interpret as a build brief.- Typed form
type:slug description(e.g.tool:market-heatmap volume heatmap of top-20 tokens,viz:tx-graph,api:summarize,landing:startup-idea) → usetypeto bias shape andslugas the deployment name.
Today is ${today}. Your task is to ship a small, self-contained prototype that someone could actually use in the browser today.
Read context. Read memory/MEMORY.md and the most recent entries in memory/logs/ for active topics.
If running as part of a chain, scan injected upstream outputs for a concrete artifact worth making interactive.
Pick what to build (if ${var} is empty or vague).
Scan these sources, in order, for prototype-worthy signals:
output/articles/ — last 7 entries by mtime: any claim, finding, or dataset that would be more useful as an interactive page?memory/topics/*.md — running narratives; pick one with a live data source (prices, feeds, markets)memory/logs/${today}.md and the two prior days — skill outputs flagged as interestingmemory/MEMORY.md → "Next Priorities" and "Recent Articles"Score each candidate 1-5 on:
output/articles/prototype-*.md by mtime and any memory/topics/prototypes.md)Pick the highest-total candidate. If no candidate reaches 9/15, skip building and exit as DEPLOY_PROTOTYPE_EMPTY (step 9).
Record the chosen signal — its source file(s) and one-line rationale — you'll use it in steps 6 and 7.
Commit to a shape before writing code. Before touching .pending-deploy/, write out (in your reasoning, not a file):
aeon-prototype-<descriptor>, all lowercase, [a-z0-9-], 3–50 chars after prefix (e.g. aeon-prototype-market-heatmap). If ${var} supplied a typed slug, use it; otherwise derive one.api/ function / Next.js. Default to static single-file HTML unless the idea genuinely needs a serverless function.VERCEL_TOKEN — the live Vercel deploy in step 8. Used in-run via ./secretcurl (the {VERCEL_TOKEN} placeholder). Without it, the build succeeds but the deploy is skipped (DEPLOY_PROTOTYPE_NO_TOKEN).GH_GLOBAL — the optional GitHub source mirror in step 8. Used ambiently by gh (it's the run's GH_TOKEN); a missing token just skips the mirror.Both are declared optional (?) so the skill degrades gracefully: no VERCEL_TOKEN → build-only; no GH_GLOBAL → deploy without the source mirror. Never read the token values directly and never embed them in any deployed file (step 6 greps for them).
index.html is almost always the right answer. Resist the urge to add tooling.aeon-prototype-market-heatmap, not aeon-prototype-1../secretcurl / gh — an irreversible side-effect run as the skill's final, fail-closed action. Build the files, metadata, and payload correctly in steps 4–6 so that final call goes clean.Steps 1–7 are local — file writes and notify only. Step 8's deploy is the one outbound side-effect and it runs in-run: the Vercel deployment via ./secretcurl with the {VERCEL_TOKEN} placeholder (a bare $VERCEL_TOKEN on the command line is refused by the Bash permission layer, so never use plain curl for it), and the optional GitHub mirror via gh (authenticated ambiently as GH_GLOBAL). There is no deferred/postprocess step — the deploy is the skill's final, fail-closed action: on any non-2xx it exits DEPLOY_PROTOTYPE_DEPLOY_FAILED and keeps .pending-deploy/ for a retry.
Write the files.
rm -rf .pending-deploy # clear stale state from prior runs
mkdir -p .pending-deploy/files
Write all project files into .pending-deploy/files/. This directory is the repo root — everything here is pushed to GitHub and deployed to Vercel.
Quality bar — every prototype must meet these:
index.html with inline <style> and <script>; fall back to a main.css / main.js only when size justifies it.<link rel="stylesheet"> to a CDN font unless it's one font.<title>, <meta name="description">, <meta property="og:title">, <meta property="og:description">, <meta property="og:type" content="website">. Skip OG image unless you generate one.[example data].prefers-color-scheme — 4 CSS vars is enough.README.md in .pending-deploy/files/ with: what it is (1 line), how to run locally (1 line), signal source (1 line link to the article/log/topic from step 2).For API endpoints: place handlers in api/ (e.g. api/index.js exporting export default function handler(req, res) { ... }).
For Next.js: keep it one page — package.json + pages/index.js. Only if the idea genuinely needs SSR.
Write deploy metadata. Create .pending-deploy/meta.json:
{
"name": "aeon-prototype-<slug-from-step-3>",
"description": "One-sentence description, matches the OG description on the page",
"framework": null,
"tagline": "≤90 chars — matches <title> on the page",
"signal_source": "path or URL of the article/log/topic that triggered this prototype",
"primary_action": "what the visitor does in the first 10 seconds"
}
framework: null for static; "nextjs", "svelte", etc. when used.tagline, signal_source, primary_action) are for the prototype record and downstream dashboards; the deploy step may ignore them.Build the Vercel deploy payload. Write .pending-deploy/payload.json:
{
"name": "aeon-prototype-<slug>",
"files": [
{ "file": "index.html", "data": "<!DOCTYPE html>...", "encoding": "utf-8" }
],
"projectSettings": {
"framework": null,
"buildCommand": null,
"outputDirectory": null
},
"target": "production"
}
Use "encoding": "base64" for any binary file.
Pre-flight checks (run before writing the notify):
^aeon-prototype-[a-z0-9][a-z0-9-]{2,49}$.VERCEL_TOKEN, GH_GLOBAL, ANTHROPIC_API_KEY, sk-ant-, sk-, ghp_, xoxb-, xai-. Any hit → abort and rewrite the offending file without the value.TODO, FIXME, lorem ipsum, placeholder. Any hit → fix in place before proceeding.VERCEL_TOKEN is unset, the build still completes but the live deploy in step 8 is skipped (you'll exit DEPLOY_PROTOTYPE_NO_TOKEN there) — the pre-flight itself doesn't fail on a missing token.Save the prototype record. Write to output/articles/prototype-${today}.md. If a file with that name already exists (second run in the same day), append -02, -03, etc.
# Prototype: <Name>
**Built:** ${today}
**Tagline:** <tagline from meta.json>
**Status:** Pending deploy
**Live URL:** _(filled in-run in step 8 once the Vercel deploy returns its URL)_
## Signal
What triggered this: one paragraph. Link the source article/log/topic (`signal_source` from meta.json).
## What it does
One paragraph, plain language. Include the primary action a visitor takes.
## How it works
Brief technical notes — stack, data source, anything non-obvious. No code dumps.
## Files
- `index.html` — brief description
- …
## Extend
Three bullets on what would make this a real product (not placeholder — concrete next steps).
Append a one-line row to memory/topics/prototypes.md (create the file with a header row if missing):
| date | slug | tagline | signal_source | live_url |
|------|------|---------|---------------|----------|
| 2026-04-20 | aeon-prototype-foo | ... | output/articles/... | _pending_ |
Deploy live (in-run). The deploy is the skill's irreversible action, so it runs in-run as the final step — behind the step-6 pre-flight — not deferred to any post-run script.
If VERCEL_TOKEN is unset → skip the deploy, leave .pending-deploy/ in place, and exit DEPLOY_PROTOTYPE_NO_TOKEN (step 10). The build still succeeded; the operator just needs to add the token and re-run.
Otherwise POST the inline deployment built in step 6. Write the key as the literal {VERCEL_TOKEN} placeholder so ./secretcurl substitutes it internally — a bare $VERCEL_TOKEN on the command line is refused by the Bash permission layer, and plain curl must not carry the token:
HTTP=$(./secretcurl -sS -o .pending-deploy/deploy-resp.json -w '%{http_code}' \
-X POST "https://api.vercel.com/v13/deployments" \
-H "Authorization: Bearer {VERCEL_TOKEN}" \
-H "Content-Type: application/json" \
--data @.pending-deploy/payload.json)
echo "http=$HTTP"
http 200/201: read the deployment host from the response (.url in deploy-resp.json) and form the live URL https://<url>. Backfill it into the step-7 record (**Status:** Live, **Live URL:** https://…) and the memory/topics/prototypes.md row (replace _pending_). Exit DEPLOY_PROTOTYPE_OK (step 10).--max-time timeout / 200 with empty body: print the real reason (http=<code> / timeout / empty), keep .pending-deploy/ for a retry, and exit DEPLOY_PROTOTYPE_DEPLOY_FAILED (step 10). Never mark the record Live on a failed deploy.Optional source mirror (best-effort, non-fatal). If GH_GLOBAL is set, also publish the source to GitHub. gh already authenticates as GH_GLOBAL in-run (it's the ambient GH_TOKEN), so no secret goes on the command line:
if [ -n "${GH_GLOBAL:-}" ]; then
( cd .pending-deploy/files && git init -q && git add -A \
&& git -c user.name=aeon -c user.email=aeon@users.noreply.github.com commit -qm "prototype: <slug>" \
&& gh repo create "<slug>" --public --source=. --push ) \
|| echo "::notice::source mirror skipped (non-fatal)"
fi
A mirror failure never fails the run — the live Vercel URL is the deliverable.
Notify. Send via ./notify (one of these, depending on outcome):
shipped: <slug> — <tagline>. live: <url>built: <slug> — <tagline>. ⚠ VERCEL_TOKEN unset — not deployed. add it and re-run.built: <slug> — <tagline>. ✗ vercel deploy failed (<reason>) — .pending-deploy kept for retry.Exit modes. End the run with one of these, logged in memory/logs/${today}.md under ### deploy-prototype:
DEPLOY_PROTOTYPE_OK — prototype built, validated, and deployed live.DEPLOY_PROTOTYPE_NO_TOKEN — built and valid, but VERCEL_TOKEN unset; deploy skipped, operator action needed.DEPLOY_PROTOTYPE_DEPLOY_FAILED — built and valid, but the Vercel API call failed; .pending-deploy/ kept for retry.DEPLOY_PROTOTYPE_EMPTY — no candidate cleared the quality threshold in step 2. Log the top candidate and its score so the next run can reconsider. ./notify "deploy-prototype: no candidate cleared threshold today — top was <slug> (<score>/15)".DEPLOY_PROTOTYPE_VALIDATION_FAILED — a pre-flight check in step 6 failed and couldn't be fixed automatically. Leave .pending-deploy/ in place, log the failure reason, notify the operator.Log. Append to memory/logs/${today}.md:
### deploy-prototype
- Exit: DEPLOY_PROTOTYPE_<MODE>
- Slug: aeon-prototype-<slug> (or — if empty)
- Live URL: <url or —>
- Signal: <signal_source>
- Notes: <anything the next run should know>