ruoyi-plus-soybean: Skill for Claude Code

.claude/skills/athena-migrate/SKILL.md

athena-migrate is a skill for Claude Code from m-xlsea/ruoyi-plus-soybean. It costs 36 tokens per session (1,892 once invoked), scanned C, original, MIT.

A migration command for upgrading an Athena project's saved AI state from schema version 9.5.5 to 9.6. A schema is the structure used to organize stored project data.

In plain words
What is it for?
Use it to migrate .ai_state files, create the new details structure, and move project records to their new locations.
Why use it?
It updates the state files to the newer layout while keeping a backup of the older files.

Skill for Claude Code

Written for Claude Code: disable-model-invocation in frontmatter.

This is m-xlsea/ruoyi-plus-soybean's own configuration. It tells Claude Code how to work on ruoyi-plus-soybean itself, so it is not a mod to install elsewhere. Copy it as a starting point and replace the rules that are about this project. Everything ruoyi-plus-soybean configures →

Reuse

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.

Copy the file
curl -O https://raw.githubusercontent.com/m-xlsea/ruoyi-plus-soybean/master/.claude/skills/athena-migrate/SKILL.md
Clone the repo
git clone --depth 1 https://github.com/m-xlsea/ruoyi-plus-soybean

Made for: Claude Code.

Wrote 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.

agentmods badge for athena-migrate

README.md
[![agentmods](https://agentmods.dev/badge/skills/m-xlsea/ruoyi-plus-soybean/athena-migrate/github.svg)](https://agentmods.dev/skills/m-xlsea/ruoyi-plus-soybean/athena-migrate)
Your own site
<a href="https://agentmods.dev/skills/m-xlsea/ruoyi-plus-soybean/athena-migrate"><img src="https://agentmods.dev/badge/skills/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.

agentmods 80×15 button for athena-migrate

Your own site · 80×15
<a href="https://agentmods.dev/skills/m-xlsea/ruoyi-plus-soybean/athena-migrate"><img src="https://agentmods.dev/badge/skills/m-xlsea/ruoyi-plus-soybean/athena-migrate.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 36 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 1,892 The whole file, excluding the scripts and references it only reads on demand.
Security scan C 1 finding. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

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.

ModelPer sessionOnce invoked
Fable 5.1 $0.00036 $0.01892
Opus 5 $0.00018 $0.00946
Sonnet 5 $0.00007 $0.00378
Haiku 4.5 $0.00004 $0.00189

Measured 11d ago against content hash 080027b064db, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-12, from the pricing page.

Security

Grade C, and why

athena-migrate scanned grade C with 1 finding 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 11d 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.

Recursive force deletehighDestructive command

rm -rf with a variable or a broad path is one typo away from removing the wrong tree.

rm -rf .ai_state/details .ai_state/_index.md
.claude/skills/athena-migrate/SKILL.md · 204 lines

How it starts

The opening of the file, as written. The whole thing — 204 lines — stays where its author put it; the contents beside it link to each section on GitHub.

/athena-migrate — v9.5.5 → v9.6 迁移

参考: https://code.claude.com/docs/en/skills

前置检查

test -d .ai_state || { echo "[migrate] 无 .ai_state, 请先 /athena-init"; exit 1; }
test -f .ai_state/_index.md && grep -q 'schema_version: "9.6"' .ai_state/_index.md && {
  echo "[migrate] 已是 v9.6 schema, 无需迁移"; exit 0;
}

迁移算法

Step 1: 备份

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,compact-snapshot.json} .ai_state/.legacy-v9.5/ 2>/dev/null || true
echo "[migrate] 旧文件已备份到 .ai_state/.legacy-v9.5/"

Step 2: 创建 details/ 目录

mkdir -p .ai_state/details/reviews
mkdir -p .ai_state/details/tasks-archive

Step 3: 迁移文件

v9.5.5 路径 v9.6 路径 备注
.ai_state/tasks.md .ai_state/details/tasks-current.md 改名
.ai_state/design.md .ai_state/details/design.md 平移
.ai_state/progress.md .ai_state/details/progress.md 平移
.ai_state/lessons.md .ai_state/details/lessons.md 平移
.ai_state/handoff.md .ai_state/details/handoff.md 平移
.ai_state/reviews/sprint-N.md .ai_state/details/reviews/sprint-N.md 平移
.ai_state/project.json (merge 到 _index.md frontmatter) 转 markdown frontmatter
.ai_state/hook-trace.jsonl .ai_state/hook-trace.jsonl 保持原位置
.ai_state/compact-snapshot.json (删, v9.6 改写到 _index.md.snapshots) 删除
# 平移
[ -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

Step 4: 生成 _index.md

.ai_state/project.json 读 path/stage/sprint/tech_stack/test_cmd/build_cmd/lint_cmd/dev_cmd/conventions/gotchas, 写入新 _index.md frontmatter。

# 用 node 脚本生成 _index.md (避免手写 yaml escape 出错)
node -e '
const fs = require("fs");
const path = require("path");

let proj = {};
try { proj = JSON.parse(fs.readFileSync(".ai_state/.legacy-v9.5/project.json","utf8")); } catch(e) {}

const sprint = proj.sprint || 0;

// 计算 counts
let tasks_pending = 0, tasks_done = 0, tasks_blocked = 0;
try {
  const t = fs.readFileSync(".ai_state/details/tasks-current.md","utf8");
  tasks_pending = (t.match(/^- \[ \]/gm) || []).length;
  tasks_done    = (t.match(/^- \[x\]/gm) || []).length;
} catch(e) {}

let progress_entries = 0, latest_progress = "";
try {
  const lines = fs.readFileSync(".ai_state/details/progress.md","utf8").split("\n").filter(l => l.trim().length > 0 && !l.startsWith("<!--") && !l.startsWith("#"));
  progress_entries = lines.length;
  if (lines.length > 0) latest_progress = `details/progress.md#L${lines.length}`;
} catch(e) {}

let lessons_lines = 0, latest_lesson = "";
try {
  const lines = fs.readFileSync(".ai_state/details/lessons.md","utf8").split("\n");
  lessons_lines = lines.filter(l => l.startsWith("##")).length;
  for (let i = lines.length - 1; i >= 0; i--) {
    if (lines[i].startsWith("## ")) { latest_lesson = `details/lessons.md#L${i+1}`; break; }
  }
} catch(e) {}

let reviews_count = 0, latest_review = "";
try {
  const files = fs.readdirSync(".ai_state/details/reviews").filter(f => f.startsWith("sprint-") && f.endsWith(".md"));
  reviews_count = files.length;
  if (files.length > 0) {
    const sorted = files.sort();
    latest_review = `details/reviews/${sorted[sorted.length-1]}`;
  }
} catch(e) {}

const idx = `---
schema_version: "9.6"
athena_version: "9.6.0"
project:
  path: "${proj.path || ""}"
  stage: "${proj.stage || ""}"
  sprint: ${sprint}
  active_goal: ""
counts:
  tasks_pending: ${tasks_pending}
  tasks_done: ${tasks_done}
  tasks_blocked: ${tasks_blocked}
  lessons_lines: ${lessons_lines}
  progress_entries: ${progress_entries}
  reviews_count: ${reviews_count}
pointers:
  latest_progress: "${latest_progress}"
  latest_review: "${latest_review}"
  latest_lesson: "${latest_lesson}"
  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.stringify(proj.gotchas || [])}
conventions: ${JSON.stringify(proj.conventions || [])}
tech_stack: "${proj.tech_stack || ""}"
test_cmd: "${proj.test_cmd || ""}"
build_cmd: "${proj.build_cmd || ""}"
lint_cmd: "${proj.lint_cmd || ""}"
dev_cmd: "${proj.dev_cmd || ""}"
---

# 项目状态索引 (v9.6 migrated from v9.5.5)

## 最近活动

## 当前阻塞

## 下一动作 (PACE 建议)

## 反思建议 (Hook 沉淀)
`;

fs.writeFileSync(".ai_state/_index.md", idx);
console.log("[migrate] _index.md generated");
'

Read the full file on GitHub · 204 lines

Changes

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.

  1. 11d ago First seen · 204 lines · 36 tokens per session scan C 080027b064db

Subscribe to this mod's changes

athena-migrate is a skill published in the GitHub repository m-xlsea/ruoyi-plus-soybean (325 stars, last pushed 2mo ago), licensed MIT. It adds 36 tokens to every session and 1,892 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it C with 1 finding (recursive force delete). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-01.