| name | adapt-skill |
| description | 安全地将一个 ARIS SKILL.md 改造为 AMIS 版本。通过定点替换保证不截断内容。当用户说'改造 skill'、'adapt skill'、'执行 Task X.Y'时使用。 |
| argument-hint | ["原skill名 → 新skill名"] |
| allowed-tools | Bash(*), Read, Write, Edit, Grep, Glob, WebSearch, WebFetch, Agent, mcp__codex__codex, mcp__codex__codex-reply |
AMIS Skill 安全改造器
将 ARIS skill 安全改造为 AMIS 版本: $ARGUMENTS
Overview
本 skill 是 AMIS 项目的开发工具,不是最终产品的一部分。它的职责是:读取一个 ARIS 原始 SKILL.md,按照 CLAUDE.md 中的映射表和术语表,通过定点替换生成 AMIS 版本,并严格验证不丢失内容。
Constants
- MIN_LINE_RATIO = 0.85 — 改造后文件行数必须 >= 原文件的 85%。低于此比例则判定为截断,必须回退重做。
- CRITICAL_LINE_RATIO = 0.70 — 低于 70% 为严重截断,立即终止并报错。
- MAX_REPLACEMENTS_PER_BATCH = 15 — 每批最多 15 条 str_replace。超过则分多批执行,每批之间 re-read 文件确认状态。
- REVIEWER_MODEL =
gpt-5.4 — 改造完成后可选调用 GPT-5.4 对比审查新旧文件。
Workflow
Phase 1: 准备工作(绝不跳过)
-
读取项目配置:
cat CLAUDE.md
-
确认原始文件存在:
ls -la skills/$ORIGINAL_SKILL/SKILL.md.original
wc -l skills/$ORIGINAL_SKILL/SKILL.md.original
如果 .original 不存在,检查是否有不带后缀的 SKILL.md,若有则先复制为 .original。
-
创建工作副本 + 备份:
mkdir -p skills/$NEW_SKILL
cp skills/$ORIGINAL_SKILL/SKILL.md.original skills/$NEW_SKILL/SKILL.md
cp skills/$NEW_SKILL/SKILL.md skills/$NEW_SKILL/SKILL.md.bak
-
记录原始行数:
ORIGINAL_LINES=$(wc -l < skills/$NEW_SKILL/SKILL.md.bak)
echo "原始行数: $ORIGINAL_LINES"
-
通读原始文件全文:
用 Read 工具完整阅读 skills/$NEW_SKILL/SKILL.md,理解每个 Phase 的结构和内容。
特别注意:记住文件中有多少个 Phase、每个 Phase 有几个步骤、MCP prompt 有多少行、output 模板有几个 table。这些数字是后续验证的基准。
Phase 2: 生成替换清单
基于 CLAUDE.md 中的映射表和术语速查表,为当前 skill 生成一份完整的替换清单。
替换分三层,按顺序执行:
第一层:结构性替换(YAML + 标题 + 文件名)
这些是必改的骨架级替换:
| 位置 | 查找内容 | 替换为 |
|---|
| YAML name | name: $ORIGINAL_SKILL | name: $NEW_SKILL |
| YAML description | 原英文/中文描述 | 新的数模场景描述 |
| YAML argument-hint | 原 hint | 新 hint |
主标题 # | 原标题 | 新标题 |
$ARGUMENTS 说明行 | 原说明 | 新说明 |
第二层:调用链替换(skill 名和文件名)
查找文件中所有出现的其他 skill 名称和输出文件名,按 CLAUDE.md 映射表替换:
/research-lit → /problem-analysis
/idea-creator → /model-creator
/novelty-check → /feasibility-check
/research-review → /model-review
/research-refine → /model-refine
/experiment-plan → /solve-plan
/run-experiment → /run-solver
/monitor-experiment → /monitor-solver
/auto-review-loop → /auto-optimize-loop
/idea-discovery → /modeling-discovery
/research-pipeline → /mathmodel-pipeline
/experiment-bridge → /solve-bridge
/research-refine-pipeline → /model-refine-pipeline
IDEA_REPORT.md → MODEL_REPORT.md
LIT_SURVEY.md → PROBLEM_ANALYSIS.md
NARRATIVE_REPORT.md → MODELING_NARRATIVE.md
RESEARCH_BRIEF.md → PROBLEM_BRIEF.md
IDEA_CANDIDATES.md → MODEL_CANDIDATES.md
EXPERIMENT_PLAN.md → SOLVE_PLAN.md
EXPERIMENT_TRACKER.md → SOLVE_TRACKER.md
REVIEW_STATE.json → OPTIMIZE_STATE.json
注意:只替换文件中实际出现的条目。不要盲目替换——先用 grep 确认哪些条目存在:
grep -n "research-lit\|idea-creator\|novelty-check\|research-review\|IDEA_REPORT\|EXPERIMENT_PLAN" skills/$NEW_SKILL/SKILL.md
第三层:领域内容替换(prompt + 评审标准 + 术语)
这是最需要细心的部分。逐段检查每个 Phase 中的:
-
MCP prompt 内容(mcp__codex__codex: 块内的 prompt: 字段)
- 角色设定替换:
senior ML researcher → 数模竞赛资深评委
- 评审维度替换:
novelty, significance → 数学严谨性, 方法创新性, 结果可靠性
- 场景替换:
NeurIPS/ICML → 数模竞赛
- 保持 prompt 的行数和结构不变,只替换领域相关的词和句
-
Constants 部分
- 时间单位:
GPU-hours → 计算分钟
- 资源描述:
8x RTX 3090 → 本地 Python/MATLAB
- 保留 Constants 的条目数量,只改名字和默认值
-
Checkpoint 提示语
-
Output 模板
- 保持 markdown table 的列数和结构不变
- 替换列名和示例内容
-
Key Rules 部分
- 第一条(大文件处理规则)原封不动保留
- 其余规则替换领域内容,但保持条目数量不变
Phase 3: 执行替换(分批,每批验证)
不要一口气执行所有替换。 分批进行:
批次 1:结构性替换(第一层)
逐条用 str_replace 执行 YAML + 标题替换。
执行完毕后立即验证:
CURRENT_LINES=$(wc -l < skills/$NEW_SKILL/SKILL.md)
echo "批次1完成 — 当前行数: $CURRENT_LINES / 原始: $ORIGINAL_LINES"
行数此时应该基本不变(可能 ±5 行)。如果行数减少超过 10 行,说明 str_replace 匹配出了问题,检查并修正。
批次 2:调用链替换(第二层)
用 sed 做全局替换(因为这些是简单的字符串替换,不涉及多行内容):
grep -c "research-lit\|idea-creator\|novelty-check" skills/$NEW_SKILL/SKILL.md
sed -i 's|/research-lit|/problem-analysis|g' skills/$NEW_SKILL/SKILL.md
sed -i 's|/idea-creator|/model-creator|g' skills/$NEW_SKILL/SKILL.md
sed -i 's|IDEA_REPORT\.md|MODEL_REPORT.md|g' skills/$NEW_SKILL/SKILL.md
执行完验证行数(应该完全不变,sed 替换不改行数)。
批次 3:领域内容替换(第三层)
这是最复杂的部分。逐个 Phase 处理:
对每个 Phase,按以下流程操作:
1. Read 该 Phase 的内容(记录起止行号)
2. 识别需要替换的领域术语和句子
3. 每条用 str_replace 替换,old_str 取足够长以确保唯一性
4. 替换完该 Phase 后,验证行数
5. 进入下一个 Phase
⚠️ 关键规则:
- str_replace 的
old_str 必须足够长(至少包含完整的一行),确保在文件中唯一匹配
- 如果
old_str 匹配到多处,加长上下文直到唯一
- 绝不要用 str_replace 替换整个 Phase 的内容。只替换 Phase 内需要改的行/段
- MCP prompt 块:逐行或逐段替换,不要整块替换
批次 4:删除不适用内容(如有)
某些 skill 包含 ARIS 特有的内容(Zotero、Obsidian、arXiv download 等),数模不需要:
1. 用 grep -n 定位相关段落的起止行号
2. 用 sed 删除指定行范围:sed -i 'START,ENDd' file
3. 记录删除了多少行(用于行数验证时的基准调整)
Phase 4: 质量验证(绝不跳过)
检查 1:行数验证
FINAL_LINES=$(wc -l < skills/$NEW_SKILL/SKILL.md)
ORIGINAL_LINES=$(wc -l < skills/$NEW_SKILL/SKILL.md.bak)
RATIO=$(echo "scale=2; $FINAL_LINES / $ORIGINAL_LINES" | bc)
echo "================================"
echo "行数验证"
echo "原始: $ORIGINAL_LINES 行"
echo "现在: $FINAL_LINES 行"
echo "比例: $RATIO"
echo "================================"
if (( $(echo "$RATIO < 0.70" | bc -l) )); then
echo "❌ 严重截断!比例低于 70%。必须回退重做。"
cp skills/$NEW_SKILL/SKILL.md.bak skills/$NEW_SKILL/SKILL.md
exit 1
elif (( $(echo "$RATIO < 0.85" | bc -l) )); then
echo "⚠️ 轻微截断。比例低于 85%。检查是否有意删除(Zotero等不适用内容)。"
echo "如果删除是有意的,继续。否则回退重做。"
else
echo "✅ 行数正常。"
fi
检查 2:结构完整性验证
echo "=== 结构检查 ==="
echo -n "YAML 头部: "
head -5 skills/$NEW_SKILL/SKILL.md | grep -q "^---" && echo "✅" || echo "❌ 缺失"
PHASE_COUNT=$(grep -c "^### Phase" skills/$NEW_SKILL/SKILL.md)
ORIGINAL_PHASE_COUNT=$(grep -c "^### Phase" skills/$NEW_SKILL/SKILL.md.bak)
echo "Phase 数量: 原始 $ORIGINAL_PHASE_COUNT → 现在 $PHASE_COUNT"
[ "$PHASE_COUNT" -ge "$ORIGINAL_PHASE_COUNT" ] && echo "✅" || echo "⚠️ Phase 数量减少了!"
ORIGINAL_MCP=$(grep -c "mcp__codex__codex" skills/$NEW_SKILL/SKILL.md.bak)
CURRENT_MCP=$(grep -c "mcp__codex__codex" skills/$NEW_SKILL/SKILL.md)
echo "MCP 调用: 原始 $ORIGINAL_MCP → 现在 $CURRENT_MCP"
[ "$CURRENT_MCP" -ge "$ORIGINAL_MCP" ] && echo "✅" || echo "⚠️ MCP 调用减少了!"
ORIGINAL_RULES=$(grep -c "^- \*\*" skills/$NEW_SKILL/SKILL.md.bak | tail -20)
CURRENT_RULES=$(grep -c "^- \*\*" skills/$NEW_SKILL/SKILL.md | tail -20)
echo "Key Rules 条目: 原始 $ORIGINAL_RULES → 现在 $CURRENT_RULES"
grep -q "## Composing\|## Composing with" skills/$NEW_SKILL/SKILL.md && echo "Composing 部分: ✅" || echo "Composing 部分: ❌ 缺失"
ORIGINAL_TABLES=$(grep -c "^|" skills/$NEW_SKILL/SKILL.md.bak)
CURRENT_TABLES=$(grep -c "^|" skills/$NEW_SKILL/SKILL.md)
echo "表格行数: 原始 $ORIGINAL_TABLES → 现在 $CURRENT_TABLES"
检查 3:Diff 审查
echo "=== Diff 摘要 ==="
diff skills/$NEW_SKILL/SKILL.md.bak skills/$NEW_SKILL/SKILL.md | head -100
echo ""
echo "=== 修改统计 ==="
diff skills/$NEW_SKILL/SKILL.md.bak skills/$NEW_SKILL/SKILL.md | grep -c "^[<>]"
echo "行被修改"
检查 4:旧术语残留扫描
echo "=== 残留术语检查 ==="
for term in "research-lit" "idea-creator" "novelty-check" "research-review" \
"run-experiment" "monitor-experiment" "experiment-bridge" \
"auto-review-loop" "research-pipeline" "idea-discovery" \
"IDEA_REPORT" "EXPERIMENT_PLAN" "NARRATIVE_REPORT" \
"NeurIPS" "ICML" "ICLR" "GPU server" "GPU-hours" \
"arXiv" "Zotero" "Obsidian"; do
COUNT=$(grep -ci "$term" skills/$NEW_SKILL/SKILL.md 2>/dev/null || echo 0)
if [ "$COUNT" -gt 0 ]; then
echo "⚠️ 残留: '$term' 出现 $COUNT 次"
fi
done
echo "(如果某些残留是有意保留的,如引用 ARIS 原始文档,则忽略)"
Phase 5: 提交
所有检查通过后:
git add skills/$NEW_SKILL/
git commit -m "adapt $ORIGINAL_SKILL → $NEW_SKILL for math modeling
Lines: $ORIGINAL_LINES → $FINAL_LINES (ratio: $RATIO)
Phases: $ORIGINAL_PHASE_COUNT → $PHASE_COUNT
MCP calls: $ORIGINAL_MCP → $CURRENT_MCP
Replacements: [总替换次数]"
Phase 6: 输出报告
向用户报告改造结果:
✅ Skill 改造完成: $ORIGINAL_SKILL → $NEW_SKILL
📊 质量报告:
- 行数: $ORIGINAL_LINES → $FINAL_LINES (比例: $RATIO)
- Phase 数量: $ORIGINAL_PHASE_COUNT → $PHASE_COUNT
- MCP 调用: $ORIGINAL_MCP → $CURRENT_MCP
- 表格行数: $ORIGINAL_TABLES → $CURRENT_TABLES
- 残留术语: [有/无]
📝 主要改动:
- [列出关键改动点]
🔜 下一个 Task: [根据 AMIS_DEVELOPMENT_PLAN.md 提示下一个 Task]
Key Rules
- 大文件处理:如果 Write 工具因文件过大失败,立即用 Bash (
cat << 'EOF' > file) 分段写入。不要询问用户——直接执行。
- 永远不要跳过 Phase 4 的验证。 哪怕你"确信"改对了,也必须跑验证脚本。
- str_replace 的 old_str 必须在文件中唯一出现。 如果不唯一,加长上下文。
- 一次只改一个 skill。 不要并行修改多个文件。
- 如果验证失败,立即回退。
cp SKILL.md.bak SKILL.md,然后重新分析哪里出了问题。
- MCP prompt 是最容易被截断的部分。 特别注意保持 prompt 的完整性。替换 prompt 时,逐行替换,不要整块替换。
- 改造不是翻译。 不是把英文翻成中文——是把学术科研场景替换为数模竞赛场景。保持专业性。