mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-28 19:01:34 +00:00
Волна 3 эпика #674. AGENTS.md 650 → 187 строк: карта пакета, маршрут чтения, правило №1, классы и треки одной строкой со ссылками, трейлеры, рабочие деревья, хендофф и ожидание вердикта; пересказы PROCESS.md — ссылками на разделы. Неверный список «Gate jobs» снят (списки jobs не копируются в прозу, шапка PROCESS.md). Правила, жившие только в AGENTS, получили дом: жёлтый вердикт при выполненных AC — PROCESS §2.7; свежесть бандла, съёмка только в Linux (#455, HP_ALLOW_FOREIGN_CAPTURE) и смоки из AC до S7 (#151) — TESTING.md; причуда демо-стенда и среда-зависимый smoke_opening_measure — DEVELOPMENT › Smoke tests; отказ публикации без `Release:` и при несвежем отпечатке бандла, отмена Validate новым пушем, кандидат беты не promotion-only, fail-closed реестра Labs — DEVELOPMENT; предупреждение и ошибка свежести скриншотов — CONTRIBUTING. PROCESS.md: §13 (внедрение с открытым ⏳), §14 (блок со ссылкой на несуществующий docs/PROCESS.md) и §7.3 (история) удалены. Ссылки «§7.2» на правило полного разбора после ребейза ведут в §2.10, на сверку SHA перед выводом — в §2.7; то же в сообщениях scripts/branch-state.mjs, merge-candidate.mjs, review-doc-guard.mjs, pre-push-gate.mjs, в промпте _process.yml и TESTING.md. Число `any` в прозе → `node scripts/no-new-any.mjs --total` (новый режим, юнит-тест; было «1034 в 49 файлах», сейчас 862 в 52), дата-число замороженного списка якорей монолита снято. Устаревшая команда пересъёмки скриншотов в §8 заменена ссылкой на действующий путь. STATUS.md 113 → 61 строка: сгенерированный снимок, текущий цикл и девять строк решений; Workflow, CI, Toolchain, Tests, Scope, open items и политика документации — ссылками (PROCESS §2.6, DEVELOPMENT › Release, TESTING); локали en/ru/de/fr; закрытые «coverage, mypy strict» сняты. DEVELOPMENT.md: file-sync и «Reproducible scripts» (прототип) удалены; раздел Release — единственный дом релизной механики: введение, правила тела стабильного релиза (#328, release:notes), шаг continuity:screencast, источники версии по release-contract. CONTRIBUTING: ссылка на Release вместо пересказа, замеры клона без чисел. TESTING: any-гейт — ссылкой на PROCESS §8. entry-cost: автор 11 125 → 5 407 слов, ревьюер 8 464 → 4 285. Issue: #680 User-Visible: no Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
51 lines
2.7 KiB
JavaScript
51 lines
2.7 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
|
|
import { conflictingPaths, devMovedNote, rebaseAdvice } from '../scripts/branch-state.mjs';
|
|
|
|
// #364. Конвейер приводит ветку к dev сам (#257) и при конфликте возвращает
|
|
// задачу, не тратя цикл ревью. Но конфликт всплывает в комментарии через сорок
|
|
// минут, а чинится на машине автора; и после любого ребейза разбор становится
|
|
// полным, а не по дельте (§2.10). Эти helpers переносят обнаружение туда, где
|
|
// есть руки, и делают возврат адресным.
|
|
|
|
test('приведённая ветка совета не требует (#364)', () => {
|
|
assert.equal(rebaseAdvice({ behind: 0 }), null);
|
|
assert.equal(rebaseAdvice({ behind: -1 }), null);
|
|
assert.equal(rebaseAdvice({ behind: NaN }), null);
|
|
});
|
|
|
|
test('отставшая ветка получает число и готовую команду (#364)', () => {
|
|
const one = rebaseAdvice({ behind: 1 });
|
|
assert.match(one, /отстала от origin\/dev на 1 коммит\./);
|
|
assert.match(one, /git rebase origin\/dev/);
|
|
// Причина названа: без неё совет читается как придирка, а он про цену.
|
|
assert.match(one, /разбор станет\s+полным, а не по дельте/);
|
|
assert.match(rebaseAdvice({ behind: 3 }), /на 3 коммита/);
|
|
assert.match(rebaseAdvice({ behind: 12 }), /на 12 коммитов/);
|
|
});
|
|
|
|
test('база может быть не только origin/dev (#364)', () => {
|
|
const advice = rebaseAdvice({ behind: 2, base: 'origin/main' });
|
|
assert.match(advice, /от origin\/main на 2 коммита/);
|
|
assert.match(advice, /git rebase origin\/main/);
|
|
});
|
|
|
|
test('конфликтующие пути читаются, чистятся и сортируются (#364)', () => {
|
|
assert.deepEqual(
|
|
conflictingPaths('src/b.ts\nsrc/a.ts\n\n src/b.ts \n'),
|
|
['src/a.ts', 'src/b.ts'],
|
|
);
|
|
assert.deepEqual(conflictingPaths(''), []);
|
|
assert.deepEqual(conflictingPaths(null), []);
|
|
});
|
|
|
|
test('уход dev во время ревью описывается только когда он был (#364)', () => {
|
|
assert.equal(devMovedNote({ moved: 0 }), null);
|
|
const note = devMovedNote({ moved: 2, sha: 'abc1234' });
|
|
assert.match(note, /продвинулся на 2 коммита/);
|
|
assert.match(note, /`abc1234`/);
|
|
// Вывод, ради которого строка и нужна: вердикт вынесен по другому дереву.
|
|
assert.match(note, /§2\.10/);
|
|
});
|