# Adapt Skill

> 安全地将一个 ARIS SKILL.md 改造为 AMIS 版本。通过定点替换保证不截断内容。当用户说'改造 skill'、'adapt skill'、'执行 Task X.Y'时使用。

- Skill: `best6668/adapt-skill` (Agent Skill)
- Install (CLI): `npx skillmds@latest add best6668/adapt-skill`
- Raw SKILL.md: https://api.skillmd.com/api/skills/best6668/adapt-skill/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Productivity
- Author: best6668 (https://skillmd.com/u/best6668)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/best6668/adapt-skill

---


# 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 时，逐行替换，不要整块替换。
- **改造不是翻译。** 不是把英文翻成中文——是把学术科研场景替换为数模竞赛场景。保持专业性。

