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
3.0 KiB
JavaScript
51 lines
3.0 KiB
JavaScript
/**
|
|
* Состояние ветки задачи относительно `dev` (#364).
|
|
*
|
|
* Конвейер приводит ветку к `dev` сам (#257) и при конфликте возвращает задачу,
|
|
* не тратя цикл ревью. Но конфликт при этом обнаруживается в комментарии через
|
|
* сорок минут, а чинится всё равно на машине автора. Дешевле сказать ему это до
|
|
* пуша — тогда конвейеру нечего ребейзить, а конфликт виден там, где есть руки.
|
|
*
|
|
* Отставание — предупреждение, а не запрет: гейтом остаётся конвейер, который
|
|
* забыть не может. Локальная проверка лишь убирает лишний круг.
|
|
*/
|
|
|
|
/**
|
|
* Совет по ребейзу. `null` означает «ветка содержит весь dev, делать нечего».
|
|
*
|
|
* @param {{ behind: number, base?: string }} state
|
|
*/
|
|
export function rebaseAdvice({ behind, base = 'origin/dev' }) {
|
|
const count = Number(behind);
|
|
if (!Number.isFinite(count) || count <= 0) return null;
|
|
const commits = count === 1 ? 'коммит' : count < 5 ? 'коммита' : 'коммитов';
|
|
return `ветка отстала от ${base} на ${count} ${commits}.`
|
|
+ ` Конвейер приведёт её сам перед ревью, но после ребейза разбор станет`
|
|
+ ` полным, а не по дельте (§2.10). Дешевле сделать это здесь:`
|
|
+ ` git fetch origin && git rebase ${base}`;
|
|
}
|
|
|
|
/**
|
|
* Пути, на которых встал ребейз, из вывода `git diff --name-only --diff-filter=U`.
|
|
*
|
|
* Читается ДО `git rebase --abort`: abort снимает состояние конфликта вместе с
|
|
* этим списком, и тогда автору остаётся только «не ребейзится», без единого
|
|
* имени файла.
|
|
*/
|
|
export function conflictingPaths(output) {
|
|
return [...new Set(String(output ?? '').split('\n')
|
|
.map((line) => line.trim())
|
|
.filter(Boolean))].sort();
|
|
}
|
|
|
|
/** Строка о том, что `dev` ушёл вперёд, пока шло ревью. `null`, если не ушёл. */
|
|
export function devMovedNote({ moved, sha }) {
|
|
const count = Number(moved);
|
|
if (!Number.isFinite(count) || count <= 0) return null;
|
|
const commits = count === 1 ? 'коммит' : count < 5 ? 'коммита' : 'коммитов';
|
|
const at = sha ? ` Материал ревью — \`${sha}\`.` : '';
|
|
return `Пока шло ревью, \`dev\` продвинулся на ${count} ${commits}.${at}`
|
|
+ ' Вердикт вынесен по дереву, которое уже не совпадает с вершиной линии:'
|
|
+ ' слияние приведёт ветку к dev, и это другой код (§2.10).';
|
|
}
|