link-roles.sh больше не создаёт симлинки agent-memory (спека, раздел 11: симлинк делает память read-only), doctor не проверяет их; шаблоны workspace и role-repo описывают запасной вариант 6.5 (notes/agent-memory.md). В спеке разделы 2, 6.5, 8 получили указатель на раздел 11. Заодно --map без значения даёт русскую ошибку и exit 2. Refs #2 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MzkPQWjfA7RpqYWkjnqJwt
57 lines
3.8 KiB
Bash
57 lines
3.8 KiB
Bash
# link-roles.sh: симлинки ролей, агентов и памяти из workspace в репозитории направлений.
|
|
L="$ROOT/link-roles.sh"
|
|
assert_file "link-roles.sh существует" "$L"
|
|
W="$TMP/ws"; mkdir -p "$W/admin/.claude/roles" "$W/admin/.claude/agents" "$W/qa/.claude/roles" "$W/docs" "$W/arm-core"
|
|
echo '# Роль: admin — проектный слой' > "$W/admin/.claude/roles/admin.md"
|
|
printf -- '---\nname: jira-admin\nmodel: sonnet\n---\n' > "$W/admin/.claude/agents/jira-admin.md"
|
|
echo '# Роль: qa — проектный слой' > "$W/qa/.claude/roles/qa.md"
|
|
cat > "$W/CLAUDE.md" <<'EOT'
|
|
# Проект
|
|
|
|
| Каталог | Репозиторий | Роль |
|
|
|---|---|---|
|
|
| arm-core/ | RSHB/arm-core | dev |
|
|
| admin/ | RSHB/arm-ka-admin | admin |
|
|
| qa | RSHB/arm-ka-qa | qa |
|
|
| docs/ | RSHB/arm-ka-docs | — |
|
|
| source/ | — | |
|
|
EOT
|
|
out=$(bash "$L" "$W" 2>&1); rc=$?
|
|
assert_eq "первый запуск: exit 0" "$rc" "0"
|
|
assert_symlink "roles/admin.md → admin/" "$W/.claude/roles/admin.md"
|
|
assert_symlink "roles/qa.md → qa/ (без завершающего /)" "$W/.claude/roles/qa.md"
|
|
assert_eq "roles/admin.md относительный" "$(readlink "$W/.claude/roles/admin.md")" "../../admin/.claude/roles/admin.md"
|
|
assert_symlink "agents/jira-admin.md" "$W/.claude/agents/jira-admin.md"
|
|
assert_eq "agent-memory не создаётся (спека, раздел 11)" "$([ -e "$W/.claude/agent-memory" ] || [ -e "$W/admin/.claude/agent-memory" ] && echo есть || echo нет)" "нет"
|
|
assert_eq "dev не линкуется" "$(ls "$W/.claude/roles" | grep -c dev)" "0"
|
|
assert_eq "docs/source пропущены" "$(ls "$W/.claude/roles" | wc -l | tr -d ' ')" "2"
|
|
assert_grep "печатает 'создан'" 'создан' <(printf '%s' "$out")
|
|
out2=$(bash "$L" "$W" 2>&1); rc=$?
|
|
assert_eq "второй запуск: exit 0" "$rc" "0"
|
|
assert_eq "второй запуск: ничего не создано" "$(printf '%s' "$out2" | grep -c 'создан')" "0"
|
|
assert_grep "второй запуск: 'есть'" 'есть' <(printf '%s' "$out2")
|
|
assert_eq "второй запуск: ссылка прежняя" "$(readlink "$W/.claude/agents/jira-admin.md")" "../../admin/.claude/agents/jira-admin.md"
|
|
# чужой обычный файл на месте ссылки не затирается
|
|
rm "$W/.claude/roles/qa.md"; echo 'мой файл' > "$W/.claude/roles/qa.md"
|
|
out3=$(bash "$L" "$W" 2>&1)
|
|
assert_eq "обычный файл сохранён" "$(cat "$W/.claude/roles/qa.md")" "мой файл"
|
|
assert_grep "обычный файл → ПРОПУЩЕН" 'ПРОПУЩЕН' <(printf '%s' "$out3")
|
|
# --map без CLAUDE.md
|
|
W2="$TMP/ws2"; mkdir -p "$W2/an/.claude/roles"; echo x > "$W2/an/.claude/roles/analyst.md"
|
|
bash "$L" "$W2" --map an=analyst >/dev/null 2>&1
|
|
assert_symlink "--map an=analyst" "$W2/.claude/roles/analyst.md"
|
|
# источник роли отсутствует → предупреждение, не ошибка
|
|
W3="$TMP/ws3"; mkdir -p "$W3/qa"
|
|
printf '| Каталог | Репозиторий | Роль |\n|---|---|---|\n| qa/ | x | qa |\n' > "$W3/CLAUDE.md"
|
|
out4=$(bash "$L" "$W3" 2>&1); rc=$?
|
|
assert_eq "нет файла роли в репозитории: exit 0" "$rc" "0"
|
|
assert_grep "нет файла роли: WARN" 'WARN' <(printf '%s' "$out4")
|
|
# CLAUDE.md без таблицы и без --map: не падает
|
|
W4="$TMP/ws4"; mkdir -p "$W4"; echo '# пусто' > "$W4/CLAUDE.md"
|
|
bash "$L" "$W4" >/dev/null 2>&1; assert_eq "нет пар: exit 0" "$?" "0"
|
|
# --map без значения: русская ошибка и exit 2
|
|
W5="$TMP/ws5"; mkdir -p "$W5"
|
|
err=$(bash "$L" "$W5" --map 2>&1 >/dev/null); rc=$?
|
|
assert_eq "--map без значения: exit 2" "$rc" "2"
|
|
assert_grep "--map без значения: сообщение" 'link-roles: --map требует <dir>=<role>' <(printf '%s' "$err")
|