Aeon #27
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Aeon | |
| "on": | |
| workflow_dispatch: | |
| inputs: | |
| skill: | |
| description: Skill name | |
| required: false | |
| default: external-feature | |
| var: | |
| description: Skill var | |
| required: false | |
| default: "" | |
| model: | |
| description: Model override | |
| required: false | |
| default: "" | |
| charon_approval: | |
| description: Charon approval id | |
| required: false | |
| default: "" | |
| jobs: | |
| run: | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| actions: write | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - id: work | |
| run: echo "mode=skill" >> "$GITHUB_OUTPUT" | |
| - id: skill | |
| run: echo "name=${{ inputs.skill || 'external-feature' }}" >> "$GITHUB_OUTPUT" | |
| - name: Charon approval | |
| if: inputs.charon_approval != '' | |
| run: | | |
| { | |
| echo "### Charon approval" | |
| echo "" | |
| echo "- review: \`${{ inputs.charon_approval }}\`" | |
| echo "- preflight: \`approved by Telegram callback\`" | |
| } >> "$GITHUB_STEP_SUMMARY" | |
| # >>> charon aeon preflight | |
| - name: Charon preflight | |
| id: charon_preflight | |
| if: steps.work.outputs.mode != '' && inputs.charon_approval == '' | |
| env: | |
| SKILL: ${{ steps.skill.outputs.name }} | |
| SKILL_VAR: ${{ inputs.var }} | |
| AEON_ACTOR: ${{ github.actor }} | |
| AEON_TRIGGER: ${{ github.event_name == 'repository_dispatch' && github.event.action || github.event_name }} | |
| run: | | |
| set +e | |
| mkdir -p .charon/aeon | |
| npx -y github:CharonAI-code/charon aeon preflight \ | |
| --skill "$SKILL" \ | |
| --var "$SKILL_VAR" \ | |
| --trigger "$AEON_TRIGGER" \ | |
| --repo "$GITHUB_REPOSITORY" \ | |
| --run-id "$GITHUB_RUN_ID" \ | |
| --actor "$AEON_ACTOR" \ | |
| --policy charon.aeon.yml \ | |
| --review > .charon/aeon/preflight.json | |
| code=$? | |
| cat .charon/aeon/preflight.json | |
| if [ "$code" = "125" ]; then | |
| npx -y github:CharonAI-code/charon aeon telegram send latest || true | |
| elif [ "$code" = "126" ]; then | |
| npx -y github:CharonAI-code/charon aeon telegram send --preflight .charon/aeon/preflight.json || true | |
| fi | |
| exit "$code" | |
| - name: Charon review export | |
| if: always() | |
| id: charon_review | |
| run: | | |
| npx -y github:CharonAI-code/charon aeon review export latest --github-output "$GITHUB_OUTPUT" || true | |
| for file in .charon/aeon/exports/*.md; do | |
| if [ -f "$file" ]; then cat "$file" >> "$GITHUB_STEP_SUMMARY"; fi | |
| done | |
| # <<< charon aeon preflight | |
| - name: Run pre-fetch scripts | |
| run: echo "prefetch" | |
| - name: Run | |
| id: aeon_run | |
| env: | |
| BANKR_API_KEY: ${{ secrets.BANKR_API_KEY || secrets.BANKR_LLM_KEY }} | |
| BANKR_LLM_KEY: ${{ secrets.BANKR_LLM_KEY }} | |
| ANTHROPIC_BASE_URL: https://llm.bankr.bot | |
| ANTHROPIC_AUTH_TOKEN: ${{ secrets.BANKR_API_KEY || secrets.BANKR_LLM_KEY }} | |
| ANTHROPIC_MODEL: deepseek-v4-pro | |
| CLAUDE_CODE_MODEL: deepseek-v4-pro | |
| INPUT_MODEL: ${{ inputs.model }} | |
| SKILL_NAME: ${{ steps.skill.outputs.name }} | |
| SKILL_VAR: ${{ inputs.var }} | |
| run: | | |
| if ! command -v claude >/dev/null 2>&1; then | |
| npm install -g @anthropic-ai/claude-code >/dev/null | |
| fi | |
| CONFIG_MODEL="$(grep -E '^model:' aeon.yml | sed 's/^model: *//' | tr -d ' \"')" | |
| SKILL_MODEL="$(grep "^ ${SKILL_NAME}:" aeon.yml | sed -n 's/.*model: *\"\([^\"]*\)\".*/\1/p')" | |
| if [ -n "$INPUT_MODEL" ]; then | |
| MODEL="$INPUT_MODEL" | |
| elif [ -n "$SKILL_MODEL" ]; then | |
| MODEL="$SKILL_MODEL" | |
| else | |
| MODEL="${CONFIG_MODEL:-deepseek-v4-pro}" | |
| fi | |
| echo "Using model: $MODEL" | |
| ALLOWED="Bash(git:*),Write,Edit" | |
| prompt="$(printf 'Run AEON skill: %s\n\nTask:\n%s\n\nIf you complete the task, summarize the result clearly.' "$SKILL_NAME" "$SKILL_VAR")" | |
| claude -p "$prompt" --model "$MODEL" --allowedTools "$ALLOWED" | |
| - name: Notify AEON success | |
| if: success() | |
| env: | |
| TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} | |
| TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} | |
| run: | | |
| if [ -z "${TELEGRAM_BOT_TOKEN:-}" ] || [ -z "${TELEGRAM_CHAT_ID:-}" ]; then | |
| exit 0 | |
| fi | |
| text="$(printf '<code>AEON COMPLETE</code>\n<code>run</code> %s\n<code>url</code> %s' "$GITHUB_RUN_ID" "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID")" | |
| curl -fsS -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ | |
| -d "chat_id=${TELEGRAM_CHAT_ID}" \ | |
| --data-urlencode "text=${text}" \ | |
| -d "parse_mode=HTML" \ | |
| -d "disable_web_page_preview=true" >/dev/null || true | |
| - name: Notify AEON failure | |
| if: failure() | |
| env: | |
| TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} | |
| TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} | |
| run: | | |
| if [ -z "${TELEGRAM_BOT_TOKEN:-}" ] || [ -z "${TELEGRAM_CHAT_ID:-}" ]; then | |
| exit 0 | |
| fi | |
| text="$(printf '<code>AEON FAILED</code>\n<code>run</code> %s\n<code>url</code> %s' "$GITHUB_RUN_ID" "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID")" | |
| curl -fsS -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ | |
| -d "chat_id=${TELEGRAM_CHAT_ID}" \ | |
| --data-urlencode "text=${text}" \ | |
| -d "parse_mode=HTML" \ | |
| -d "disable_web_page_preview=true" >/dev/null || true |