dev:dry-run — скилл для Claude Code: проверка пайплайна evolve
Прогоняет пайплайн evolve вхолостую: проверяет синтаксис инструментов и связи между скиллами, а с ключом LangSmith запускает полный цикл на мок-агенте.
npx skills add raphaelchristi/harness-evolver --skill dev-dry-run -a claude-codeЧто делает dev:dry-run
Скилл dev:dry-run нужен, когда хочется убедиться, что плагин harness-evolver вообще работает, до того как тратить на него реальные эксперименты. Он сам определяет режим: если в окружении есть LANGSMITH_API_KEY, идёт онлайн-прогон, если нет — офлайн-проверка.
В офлайн-режиме скрипт проходит по всем *.py в каталоге инструментов, парсит их через ast и отдельно вызывает каждый файл с --help, чтобы поймать расхождения в argparse. Потом сверяет, что инструменты, упомянутые в skills/evolve/SKILL.md, действительно лежат на диске. Пути берутся из переменных EVOLVER_TOOLS и EVOLVER_PY, иначе подставляются tools или $HOME/.evolver/tools и python3.
Онлайн-режим создаёт временный каталог с мок-агентом на Python и тремя тестовыми вопросами, прогоняет setup.py, run_eval.py, read_results.py и trace_insights.py, а затем удаляет за собой временные файлы. Без LANGSMITH_API_KEY полный цикл не запустится — останется только проверка синтаксиса.
Какие задачи решает
- проверить, что инструменты evolve не падают на импорте и разборе аргументов
- найти инструменты, на которые ссылается скилл evolve, но которых нет в каталоге
- прогнать полный цикл setup → eval → read → trace на мок-агенте
- убедиться, что плагин работает, до запуска настоящих экспериментов
- почистить временные файлы после тестового прогона
Примеры запросов агенту
- Сделай dry run пайплайна evolve
- Прогони smoke test инструментов evolve
- Проверь пайплайн evolve целиком, с ключом LangSmith
Как установить dev:dry-run
1Через Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-dry-run -a claude-code2Вручную: положить файлы
~/.claude/skills/dev-dry-run/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/dev-dry-run/
1Через Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-dry-run -a codex2Вручную: положить файлы
.agents/skills/dev-dry-run/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-dry-run -a cursor2Вручную: положить файлы
.cursor/skills/dev-dry-run/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install raphaelchristi/harness-evolver dev-dry-run2Вручную: положить файлы
.github/skills/dev-dry-run/SKILL.md1Через Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-dry-run -a gemini-cli2Командой платформы
gemini skills install https://github.com/raphaelchristi/harness-evolver --path .claude/skills/dev-dry-runВручную: положить файлы
.devin/skills/dev-dry-run/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-dry-run -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о dev:dry-run
Как установить dev:dry-run в Claude Code?
Выполните npx skills add raphaelchristi/harness-evolver --skill dev-dry-run -a claude-code. Скилл появится по пути ~/.claude/skills/dev-dry-run/SKILL.md.
Что делает dev:dry-run?
Проверяет пайплайн evolve в двух режимах: офлайн — синтаксис инструментов, флаги argparse и перекрёстные ссылки в скилле evolve, онлайн — полный цикл на мок-агенте с временными файлами.
Что нужно для онлайн-режима?
Переменная окружения LANGSMITH_API_KEY. Без неё скилл переключается на офлайн-проверку и полный цикл не запускает.
Исходный текст
SKILL.md · MIT
---
name: dev:dry-run
description: "Use when the user wants to smoke-test the evolve pipeline, test tools, or verify the plugin works end-to-end. Also use when the user says 'dry run', 'smoke test', or 'test pipeline'."
allowed-tools: [Read, Bash, Glob, Grep]
---
# /dev:dry-run
Smoke-test the evolve pipeline. Two modes depending on whether LANGSMITH_API_KEY is available.
## Resolve Paths
```bash
TOOLS="${EVOLVER_TOOLS:-$([ -d "tools" ] && echo "tools" || echo "$HOME/.evolver/tools")}"
EVOLVER_PY="${EVOLVER_PY:-$([ -f "$HOME/.evolver/venv/bin/python" ] && echo "$HOME/.evolver/venv/bin/python" || echo "python3")}"
```
## Check: Online or Offline?
```bash
if [ -n "$LANGSMITH_API_KEY" ]; then
echo "MODE: Online (LANGSMITH_API_KEY found)"
MODE="online"
else
echo "MODE: Offline (no LANGSMITH_API_KEY)"
MODE="offline"
fi
```
## Offline Mode (no API key)
Validate tool syntax and argparse consistency:
```bash
echo "=== Tool Syntax Check ==="
for f in $TOOLS/*.py; do
python3 -c "import ast; ast.parse(open('$f').read())" 2>&1
if [ $? -eq 0 ]; then echo "OK: $(basename $f)"; else echo "FAIL: $(basename $f)"; fi
done
echo ""
echo "=== Argparse Flags Check ==="
for f in $TOOLS/*.py; do
$EVOLVER_PY "$f" --help > /dev/null 2>&1
if [ $? -eq 0 ]; then echo "OK: $(basename $f) --help"; else echo "FAIL: $(basename $f) --help"; fi
done
echo ""
echo "=== Skill Cross-Reference Check ==="
# Check every tool referenced in evolve skill exists
for TOOL in $(grep -oh '\$TOOLS/[a-z_]*.py' skills/evolve/SKILL.md | sed 's/\$TOOLS\///' | sort -u); do
if [ -f "$TOOLS/$TOOL" ]; then
echo "OK: $TOOL referenced and exists"
else
echo "FAIL: $TOOL referenced in evolve skill but not found"
fi
done
```
## Online Mode (with API key)
Run the full pipeline with a mock agent:
### 1. Create temp directory with mock agent
```bash
TMPDIR=$(mktemp -d)
cat > "$TMPDIR/agent.py" << 'PYEOF'
import json, sys
input_path = sys.argv[1] if len(sys.argv) > 1 else None
if input_path:
with open(input_path) as f:
data = json.load(f)
question = data.get("input", data.get("question", ""))
print(json.dumps({"output": f"Mock answer to: {question}"}))
else:
print(json.dumps({"output": "No input provided"}))
PYEOF
cat > "$TMPDIR/test_inputs.json" << 'JSONEOF'
[
{"input": "What is 2+2?"},
{"input": "Name a color"},
{"input": "What is Python?"}
]
JSONEOF
echo "Mock agent created at $TMPDIR"
```
### 2. Run setup
```bash
$EVOLVER_PY $TOOLS/setup.py \
--project-name "dry-run-test" \
--entry-point "python3 $TMPDIR/agent.py {input}" \
--framework "unknown" \
--goals "accuracy" \
--dataset-from-file "$TMPDIR/test_inputs.json" \
--output "$TMPDIR/.evolver.json"
```
### 3. Run eval
```bash
$EVOLVER_PY $TOOLS/run_eval.py \
--config "$TMPDIR/.evolver.json" \
--worktree-path "$TMPDIR" \
--experiment-prefix "dry-run-v001a"
```
### 4. Read results
```bash
$EVOLVER_PY $TOOLS/read_results.py \
--experiment "dry-run-v001a" \
--config "$TMPDIR/.evolver.json" \
--format markdown
```
### 5. Trace insights
```bash
$EVOLVER_PY $TOOLS/trace_insights.py \
--from-experiment "dry-run-v001a" \
--output "$TMPDIR/trace_insights.json"
```
### 6. Cleanup
```bash
rm -rf "$TMPDIR"
echo "Dry run complete. Temp files cleaned up."
```
## Report
```
Dry Run Results ({MODE} mode):
Tool syntax: {N}/{N} passed
Argparse: {N}/{N} passed
Cross-refs: {N}/{N} passed
{If online: setup/eval/read/trace pipeline: PASS/FAIL}
```
© raphaelchristi · MIT · raphaelchristi/harness-evolver