- 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: 准备工作(绝不跳过)
1. **读取项目配置**:
```bash
cat CLAUDE.md # 获取映射表和术语速查表
```
2. **确认原始文件存在**:
```bash
ls -la skills/$ORIGINAL_SKILL/SKILL.md.original
wc -l skills/$ORIGINAL_SKILL/SKILL.md.original
```
如果 `.original` 不存在,检查是否有不带后缀的 `SKILL.md`,若有则先复制为 `.original`。
3. **创建工作副本 + 备份**:
```bash
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
```
4. **记录原始行数**:
```bash
ORIGINAL_LINES=$(wc -l < skills/$NEW_SKILL/SKILL.md.bak)
echo "原始行数: $ORIGINAL_LINES"
```
5. **通读原始文件全文**:
用 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 确认哪些条目存在:
```bash
grep -n "research-lit\|idea-creator\|novelty-check\|research-review\|IDEA_REPORT\|EXPERIMENT_PLAN" skills/$NEW_SKILL/SKILL.md
```
#### 第三层:领域内容替换(prompt + 评审标准 + 术语)
这是最需要细心的部分。**逐段检查**每个 Phase 中的:
1. **MCP prompt 内容**(`mcp__codex__codex:` 块内的 `prompt:` 字段)
- 角色设定替换:`senior ML researcher` → `数模竞赛资深评委`
- 评审维度替换:`novelty, significance` → `数学严谨性, 方法创新性, 结果可靠性`
- 场景替换:`NeurIPS/ICML` → `数模竞赛`
- **保持 prompt 的行数和结构不变**,只替换领域相关的词和句
2. **Constants 部分**
- 时间单位:`GPU-hours` → `计算分钟`
- 资源描述:`8x RTX 3090` → `本地 Python/MATLAB`
- 保留 Constants 的条目数量,只改名字和默认值
3. **Checkpoint 提示语**
- 保持 🚦 格式和分支逻辑不变
- 替换提示文本内容
4. **Output 模板**
- 保持 markdown table 的列数和结构不变
- 替换列名和示例内容
5. **Key Rules 部分**
- 第一条(大文件处理规则)原封不动保留
- 其余规则替换领域内容,但保持条目数量不变
### Phase 3: 执行替换(分批,每批验证)
**不要一口气执行所有替换。** 分批进行:
#### 批次 1:结构性替换(第一层)
逐条用 str_replace 执行 YAML + 标题替换。
执行完毕后立即验证:
```bash
CURRENT_LINES=$(wc -l < skills/$NEW_SKILL/SKILL.md)
echo "批次1完成 — 当前行数: $CURRENT_LINES / 原始: $ORIGINAL_LINES"
```
行数此时应该基本不变(可能 ±5 行)。如果行数减少超过 10 行,说明 str_replace 匹配出了问题,检查并修正。
#### 批次 2:调用链替换(第二层)
用 sed 做全局替换(因为这些是简单的字符串替换,不涉及多行内容):
```bash
# 先预览会改多少处
grep -c "research-lit\|idea-creator\|novelty-check" skills/$NEW_SKILL/SKILL.md
# 逐条 sed
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:行数验证
```bash
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:结构完整性验证
```bash
echo "=== 结构检查 ==="
# 检查 YAML 头部
echo -n "YAML 头部: "
head -5 skills/$NEW_SKILL/SKILL.md | grep -q "^---" && echo "✅" || echo "❌ 缺失"
# 检查 Phase 数量
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 数量减少了!"
# 检查 MCP prompt 块是否存在(如果原文件有的话)
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 调用减少了!"
# 检查 Key Rules
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"
# 检查 Composing 部分
grep -q "## Composing\|## Composing with" skills/$NEW_SKILL/SKILL.md && echo "Composing 部分: ✅" || echo "Composing 部分: ❌ 缺失"
# 检查 output 模板中的 table
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 审查
```bash
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:旧术语残留扫描
```bash
echo "=== 残留术语检查 ==="
# 检查是否有忘记替换的 ARIS 术语
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: 提交
所有检查通过后:
```bash
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 时,逐行替换,不要整块替换。
- **改造不是翻译。** 不是把英文翻成中文——是把学术科研场景替换为数模竞赛场景。保持专业性。
Auf GitHub ansehen