Borrowing it
Nothing to install: this file belongs to m-xlsea/ruoyi-plus-soybean. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/m-xlsea/ruoyi-plus-soybean/master/.codex/prompts/athena-migrate.mdgit clone --depth 1 https://github.com/m-xlsea/ruoyi-plus-soybeanWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/commands/m-xlsea/ruoyi-plus-soybean/athena-migrate)<a href="https://agentmods.dev/commands/m-xlsea/ruoyi-plus-soybean/athena-migrate"><img src="https://agentmods.dev/badge/commands/m-xlsea/ruoyi-plus-soybean/athena-migrate/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/commands/m-xlsea/ruoyi-plus-soybean/athena-migrate"><img src="https://agentmods.dev/badge/commands/m-xlsea/ruoyi-plus-soybean/athena-migrate.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00000 | $0.01309 |
| Opus 5 | $0.00000 | $0.00655 |
| Sonnet 5 | $0.00000 | $0.00262 |
| Haiku 4.5 | $0.00000 | $0.00131 |
Grade A, and why
athena-migrate scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 10d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 156 lines — stays where its author put it; the contents beside it link to each section on GitHub.
/athena-migrate (Codex) — v9.5 → v9.6 迁移
参考 CC 版 ~/.claude/skills/athena-migrate/SKILL.md. 算法一致 (因为 schema 跨平台相同, 这是铁律 6).
Codex 端差异:
- 用 python3 替代 node 生成
_index.md(Codex 默认有 python3) - 检测
cx_version写入platform_features.cx_version, 不写 cc_version
备份脚本
mkdir -p .ai_state/.legacy-v9.5
cp -r .ai_state/{tasks.md,design.md,progress.md,lessons.md,handoff.md,project.json,reviews,hook-trace.jsonl} .ai_state/.legacy-v9.5/ 2>/dev/null || true
创建 details/
mkdir -p .ai_state/details/reviews .ai_state/details/tasks-archive
平移
[ -f .ai_state/tasks.md ] && mv .ai_state/tasks.md .ai_state/details/tasks-current.md
for f in design.md progress.md lessons.md handoff.md; do
[ -f .ai_state/$f ] && mv .ai_state/$f .ai_state/details/$f
done
[ -d .ai_state/reviews ] && mv .ai_state/reviews .ai_state/details/reviews
[ -f .ai_state/compact-snapshot.json ] && rm .ai_state/compact-snapshot.json # Codex 无 compact 也能有的旧文件
生成 _index.md (python3)
python3 << 'PY'
import json, os, re, sys
proj = {}
try:
with open('.ai_state/.legacy-v9.5/project.json') as f:
proj = json.load(f)
except FileNotFoundError:
pass
def count_match(path, pattern):
try:
with open(path) as f:
return len(re.findall(pattern, f.read(), re.MULTILINE))
except FileNotFoundError:
return 0
def last_section_line(path, head_prefix='## '):
try:
lines = open(path).read().split('\n')
for i in range(len(lines) - 1, -1, -1):
if lines[i].startswith(head_prefix):
return i + 1
except FileNotFoundError:
pass
return 0
def last_nonempty_line(path):
try:
lines = open(path).read().split('\n')
for i in range(len(lines) - 1, -1, -1):
stripped = lines[i].strip()
if stripped and not stripped.startswith('<!--') and not stripped.startswith('#'):
return i + 1
except FileNotFoundError:
pass
return 0
tasks_pending = count_match('.ai_state/details/tasks-current.md', r'^- \[ \]')
tasks_done = count_match('.ai_state/details/tasks-current.md', r'^- \[x\]')
progress_n = last_nonempty_line('.ai_state/details/progress.md')
lessons_lines = count_match('.ai_state/details/lessons.md', r'^## ')
latest_lesson_line = last_section_line('.ai_state/details/lessons.md')
reviews = []
try:
reviews = [f for f in os.listdir('.ai_state/details/reviews') if re.match(r'^sprint-\d+\.md$', f)]
except FileNotFoundError:
pass
reviews_count = len(reviews)
latest_review = ''
if reviews:
latest_review = 'details/reviews/' + sorted(reviews, key=lambda f: int(re.search(r'\d+', f).group()))[-1]
content = f'''---
schema_version: "9.6"
athena_version: "9.6.0"
project:
path: "{proj.get('path','')}"
stage: "{proj.get('stage','')}"
sprint: {proj.get('sprint', 0)}
active_goal: ""
counts:
tasks_pending: {tasks_pending}
tasks_done: {tasks_done}
tasks_blocked: 0
lessons_lines: {lessons_lines}
progress_entries: {progress_n}
reviews_count: {reviews_count}
pointers:
latest_progress: "{('details/progress.md#L' + str(progress_n)) if progress_n else ''}"
latest_review: "{latest_review}"
latest_lesson: "{('details/lessons.md#L' + str(latest_lesson_line)) if latest_lesson_line else ''}"
latest_proposal: ""
fingerprints:
tasks_mtime: 0
design_mtime: 0
progress_mtime: 0
lessons_mtime: 0
platform_features:
cc_version: ""
cx_version: ""
goal_supported: false
batch_supported: false
background_supported: false
session_memory_active: false
cross_session_memory: "none"
gotchas: {json.dumps(proj.get('gotchas', []))}
conventions: {json.dumps(proj.get('conventions', []))}
tech_stack: "{proj.get('tech_stack','')}"
test_cmd: "{proj.get('test_cmd','')}"
build_cmd: "{proj.get('build_cmd','')}"
lint_cmd: "{proj.get('lint_cmd','')}"
dev_cmd: "{proj.get('dev_cmd','')}"
---
# 项目状态索引 (v9.6 migrated from v9.5.5)
## 最近活动
## 当前阻塞
## 下一动作 (PACE 建议)
## 反思建议 (Hook 沉淀)
'''
with open('.ai_state/_index.md', 'w') as f:
f.write(content)
print('[migrate] _index.md generated')
PY
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 10d ago First seen · 156 lines · 0 tokens per session scan A dc358fef0e45
athena-migrate is a command published in the GitHub repository m-xlsea/ruoyi-plus-soybean (325 stars, last pushed 2mo ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 1,309 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-01.
Other commands, from other repositories
template
Manage issue templates for streamlined issue creation.
add-note
Add an internal or external note to a ConnectWise PSA ticket.
fest-show
Show festival progression (in-progress tasks, roadmap, and dependency view).
dispatcher
Pick the next-best repo to work on across the portfolio — rank free repos, recommend one, claim its lease atomically, and route to the entry command.
workpm
A project-management workflow for coordinating multiple AI workers through five stages. It includes task assignment, shared activity logs, worker replacement, and final checks.
standup
Show a daily standup summary with completed, in-progress, and blocked tasks across all active epics.