code-ai-installer 4.0.1-a → 4.0.1-c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +5 -5
- package/dist/catalog.js +1 -1
- package/dist/contentTransformer.d.ts +1 -1
- package/dist/contentTransformer.js +39 -0
- package/dist/index.js +10 -5
- package/dist/mcp/cli.js +4 -4
- package/dist/mcp/config.js +8 -6
- package/dist/mcp/scorecard.d.ts +2 -2
- package/dist/mcp/task_state.d.ts +2 -2
- package/dist/mcp/tools/advance_gate.js +1 -1
- package/dist/mcp/tools/classify_gate.d.ts +2 -2
- package/dist/mcp/tools/classify_gate.js +2 -2
- package/dist/mcp/tools/load_role.d.ts +2 -2
- package/dist/mcp/tools/load_role.js +2 -2
- package/dist/mcp/tools/report_exception.d.ts +3 -3
- package/dist/mcp/tools/report_exception.js +4 -4
- package/dist/mcp/tools/request_decision.d.ts +3 -3
- package/dist/mcp/tools/request_decision.js +5 -5
- package/dist/mcp/tools/review_proposal.d.ts +1 -1
- package/dist/mcp/tools/review_proposal.js +6 -6
- package/dist/mcp/tools/sign_off.d.ts +2 -2
- package/dist/mcp/tools/sign_off.js +7 -7
- package/dist/mcp/tools/verify_claim.d.ts +1 -1
- package/dist/mcp/tools/verify_claim.js +1 -1
- package/dist/mcp_setup.d.ts +85 -29
- package/dist/mcp_setup.js +184 -62
- package/dist/platforms/adapters.js +54 -19
- package/dist/shared/frontmatter.js +1 -1
- package/dist/shared/persona.d.ts +1 -1
- package/dist/shared/persona.js +1 -1
- package/dist/shared/pipeline.d.ts +10 -10
- package/dist/shared/pipeline.js +7 -7
- package/dist/shared/tools.d.ts +15 -15
- package/dist/shared/tools.js +3 -3
- package/dist/shared/vocabulary.d.ts +4 -4
- package/dist/shared/vocabulary.js +4 -4
- package/dist/types.d.ts +1 -1
- package/domains/analytics/.agents/workflows/analytics-pipeline-rules.md +13 -3
- package/domains/analytics/.agents/workflows/analyze.md +1 -0
- package/domains/analytics/.agents/workflows/quick-insight.md +1 -0
- package/domains/analytics/locales/en/.agents/workflows/analytics-pipeline-rules.md +13 -3
- package/domains/analytics/locales/en/.agents/workflows/analyze.md +1 -0
- package/domains/analytics/locales/en/.agents/workflows/quick-insight.md +1 -0
- package/domains/analytics/locales/en/agents/interviewer.md +2 -1
- package/domains/analytics/locales/en/agents/layouter.md +2 -1
- package/domains/analytics/locales/en/agents/mediator.md +2 -1
- package/domains/analytics/locales/en/agents/researcher.md +2 -1
- package/domains/analytics/locales/en/agents/strategist.md +2 -1
- package/domains/analytics/pipeline.yaml +10 -10
- package/domains/content/.agents/skills/content-release-gate/SKILL.md +3 -5
- package/domains/content/.agents/workflows/content-pipeline-rules.md +14 -11
- package/domains/content/.agents/workflows/edit-content.md +0 -1
- package/domains/content/.agents/workflows/quick-post.md +0 -1
- package/domains/content/.agents/workflows/start-content.md +0 -1
- package/domains/content/agents/conductor.md +1 -2
- package/domains/content/locales/en/.agents/skills/content-release-gate/SKILL.md +3 -5
- package/domains/content/locales/en/.agents/workflows/content-pipeline-rules.md +14 -11
- package/domains/content/locales/en/.agents/workflows/edit-content.md +0 -1
- package/domains/content/locales/en/.agents/workflows/quick-post.md +0 -1
- package/domains/content/locales/en/.agents/workflows/start-content.md +0 -1
- package/domains/content/locales/en/agents/conductor.md +1 -2
- package/domains/content/pipeline.yaml +8 -8
- package/domains/development/.agents/skills/handoff/SKILL.md +276 -276
- package/domains/development/.agents/skills/lava-flow-legacy-detection/SKILL.md +197 -197
- package/domains/development/.agents/skills/mcp-integration/SKILL.md +211 -211
- package/domains/development/.agents/skills/qa-test-data-management/SKILL.md +250 -250
- package/domains/development/.agents/workflows/bugfix.md +16 -82
- package/domains/development/.agents/workflows/hotfix.md +16 -66
- package/domains/development/.agents/workflows/pipeline-rules.md +49 -132
- package/domains/development/.agents/workflows/start-task.md +17 -121
- package/domains/development/AGENTS.md +8 -3
- package/domains/development/agents/architect.md +247 -247
- package/domains/development/agents/conductor.md +363 -363
- package/domains/development/agents/devops.md +297 -297
- package/domains/development/agents/reviewer.md +293 -293
- package/domains/development/agents/senior_full_stack.md +295 -295
- package/domains/development/agents/tester.md +395 -395
- package/domains/development/locales/en/.agents/skills/handoff/SKILL.md +276 -276
- package/domains/development/locales/en/.agents/skills/lava-flow-legacy-detection/SKILL.md +197 -197
- package/domains/development/locales/en/.agents/skills/mcp-integration/SKILL.md +211 -211
- package/domains/development/locales/en/.agents/skills/qa-test-data-management/SKILL.md +250 -250
- package/domains/development/locales/en/.agents/workflows/bugfix.md +16 -82
- package/domains/development/locales/en/.agents/workflows/hotfix.md +15 -65
- package/domains/development/locales/en/.agents/workflows/pipeline-rules.md +48 -131
- package/domains/development/locales/en/.agents/workflows/start-task.md +17 -121
- package/domains/development/locales/en/AGENTS.md +15 -0
- package/domains/development/locales/en/agents/architect.md +247 -247
- package/domains/development/locales/en/agents/conductor.md +363 -363
- package/domains/development/locales/en/agents/devops.md +297 -297
- package/domains/development/locales/en/agents/reviewer.md +293 -293
- package/domains/development/locales/en/agents/senior_full_stack.md +295 -295
- package/domains/development/locales/en/agents/tester.md +395 -395
- package/domains/development/locales/en/prompt-examples.md +34 -120
- package/domains/development/pipeline.yaml +150 -135
- package/domains/development/prompt-examples.md +33 -119
- package/domains/product/.agents/workflows/product-pipeline-rules.md +13 -2
- package/domains/product/.agents/workflows/quick-pm.md +1 -1
- package/domains/product/.agents/workflows/shape-prioritize.md +1 -0
- package/domains/product/.agents/workflows/ship-right-thing.md +1 -0
- package/domains/product/.agents/workflows/spec.md +1 -0
- package/domains/product/agents/tech_lead.md +1 -1
- package/domains/product/locales/en/.agents/workflows/product-pipeline-rules.md +13 -2
- package/domains/product/locales/en/.agents/workflows/quick-pm.md +1 -1
- package/domains/product/locales/en/.agents/workflows/shape-prioritize.md +1 -0
- package/domains/product/locales/en/.agents/workflows/ship-right-thing.md +1 -0
- package/domains/product/locales/en/.agents/workflows/spec.md +1 -0
- package/domains/product/locales/en/agents/conductor.md +2 -2
- package/domains/product/locales/en/agents/data_analyst.md +2 -1
- package/domains/product/locales/en/agents/designer.md +2 -1
- package/domains/product/locales/en/agents/discovery.md +2 -1
- package/domains/product/locales/en/agents/layouter.md +2 -1
- package/domains/product/locales/en/agents/mediator.md +2 -1
- package/domains/product/locales/en/agents/pm.md +2 -1
- package/domains/product/locales/en/agents/product_strategist.md +2 -1
- package/domains/product/locales/en/agents/tech_lead.md +3 -2
- package/domains/product/locales/en/agents/ux_designer.md +2 -1
- package/domains/product/pipeline.yaml +12 -12
- package/package.json +5 -5
- package/domains/analytics/CONTEXT.md +0 -25
- package/domains/analytics/locales/en/CONTEXT.md +0 -25
- package/domains/content/CONTEXT.md +0 -19
- package/domains/content/locales/en/CONTEXT.md +0 -19
- package/domains/development/.agents/workflows/auto-restart-containers.md +0 -56
- package/domains/development/CONTEXT.md +0 -62
- package/domains/development/locales/en/.agents/workflows/auto-restart-containers.md +0 -24
- package/domains/development/locales/en/CONTEXT.md +0 -62
- package/domains/product/CONTEXT.md +0 -40
- package/domains/product/locales/en/CONTEXT.md +0 -40
|
@@ -1,197 +1,197 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: lava-flow-legacy-detection
|
|
3
|
-
description: Чек-лист признаков "лава-флоу" в legacy/brownfield коде — мёртвый код вокруг живого, не убранные feature flags, окаменевшие workarounds, дубликаты после миграций. Используй при анализе текущего состояния репозитория, перед рефакторингом и при ревью PR в зрелой кодовой базе. Активируй при упоминаниях "legacy", "технический долг", "brownfield", "почему этот код здесь".
|
|
4
|
-
type: reference
|
|
5
|
-
domain: development
|
|
6
|
-
owners:
|
|
7
|
-
- architect
|
|
8
|
-
- reviewer
|
|
9
|
-
- senior_full_stack
|
|
10
|
-
gates:
|
|
11
|
-
- ARCH
|
|
12
|
-
- DEV
|
|
13
|
-
- REV
|
|
14
|
-
tech: []
|
|
15
|
-
topic:
|
|
16
|
-
- architecture
|
|
17
|
-
- refactoring
|
|
18
|
-
- legacy
|
|
19
|
-
triggers:
|
|
20
|
-
- легаси код
|
|
21
|
-
- мёртвый код
|
|
22
|
-
- лава-флоу
|
|
23
|
-
- неубранный feature flag
|
|
24
|
-
- brownfield рефакторинг
|
|
25
|
-
- окаменевший workaround
|
|
26
|
-
- неиспользуемый код
|
|
27
|
-
related:
|
|
28
|
-
- current-state-analysis
|
|
29
|
-
- architecture-compliance-review
|
|
30
|
-
- architecture-doc-reference
|
|
31
|
-
- design-patterns-reference
|
|
32
|
-
- adr-log
|
|
33
|
-
- adr-log-reference
|
|
34
|
-
- threat-model-baseline
|
|
35
|
-
- security-baseline-dev
|
|
36
|
-
- code-review-checklist
|
|
37
|
-
- system-design-checklist
|
|
38
|
-
budget_lines: 250
|
|
39
|
-
schema_version: 1
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
# Skill: Lava Flow Legacy Detection
|
|
44
|
-
|
|
45
|
-
Анти-паттерн «лава-флоу» (Brown et al., *AntiPatterns*, 1998) — застывшая масса кода, попавшая в продакшен без должного контроля. Никто не помнит, зачем она тут, удалить страшно (нет тестов), переписать дорого. С каждым релизом слой утолщается.
|
|
46
|
-
|
|
47
|
-
> **Когда применять:** ARCH (current-state analysis), DEV (перед изменением старого модуля), REV (ревью PR в зрелой кодовой базе). Reference-скил — активация через триггеры фронтматтера; см. § MCP integration ниже для cross-gate потребления.
|
|
48
|
-
|
|
49
|
-
**Разделы:**
|
|
50
|
-
1. [Признаки лава-флоу](#1-признаки)
|
|
51
|
-
2. [Чек-лист проверки](#2-чеклист)
|
|
52
|
-
3. [Что делать с находкой](#3-что-делать)
|
|
53
|
-
4. [Что НЕ делать](#4-чего-избегать)
|
|
54
|
-
5. [Шаблон отчёта](#5-отчёт)
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## 1. Признаки
|
|
59
|
-
|
|
60
|
-
### 1.1 Структурные
|
|
61
|
-
|
|
62
|
-
| # | Признак | Как обнаружить |
|
|
63
|
-
|---|---------|----------------|
|
|
64
|
-
| LF-01 | Закомментированные блоки кода в продакшен-файлах | grep по `//` / `/*` блокам >5 строк |
|
|
65
|
-
| LF-02 | Ветки кода, которые никогда не выполняются | покрытие тестами / coverage report 0% на ветке |
|
|
66
|
-
| LF-03 | Функции/классы без входящих ссылок | static analysis (ts-prune, knip, unimport) |
|
|
67
|
-
| LF-04 | Параллельные «версии» одной логики (v1/v2/legacy/new) | grep по суффиксам имён |
|
|
68
|
-
| LF-05 | Дубликаты после неоконченных миграций | сравнить директории `old/`, `legacy/`, `deprecated/` |
|
|
69
|
-
| LF-06 | Файлы без изменений дольше половины возраста репозитория | `git log -1 --format=%cd -- <file>` или `find <dir> -name '*.ts' -mtime +<дней>` |
|
|
70
|
-
|
|
71
|
-
### 1.2 Конфигурационные
|
|
72
|
-
|
|
73
|
-
| # | Признак | Как обнаружить |
|
|
74
|
-
|---|---------|----------------|
|
|
75
|
-
| LF-07 | Feature flags, которые всегда `false` (или всегда `true`) | grep по `flag.*= false`, проверить usage в коде |
|
|
76
|
-
| LF-08 | Конфиг-ключи, которые никто не читает | grep значения ключа по кодовой базе |
|
|
77
|
-
| LF-09 | Env-переменные, которые не упомянуты в `.env.example` | diff между `process.env.X` и `.env.example` |
|
|
78
|
-
| LF-10 | Захардкоженные mock/stub данные на продакшен-пути | grep по `MOCK_`, `STUB_`, `fake_`, `dummy_` |
|
|
79
|
-
|
|
80
|
-
### 1.3 Поведенческие
|
|
81
|
-
|
|
82
|
-
| # | Признак | Как обнаружить |
|
|
83
|
-
|---|---------|----------------|
|
|
84
|
-
| LF-11 | Воркараунды, ставшие постоянными | grep по `TODO`, `FIXME`, `HACK`, `XXX` старше 6 мес |
|
|
85
|
-
| LF-12 | Захардкоженные version/environment checks на мёртвое окружение | grep по `if.*IE`, `if.*v1`, `if.*LEGACY` где правая сторона больше не существует |
|
|
86
|
-
| LF-13 | Неактивные cron jobs / scheduled tasks | `crontab -l` + grep логов за 3 мес; `systemctl list-timers --all`; `kubectl get cronjob -o wide` (lastScheduleTime) |
|
|
87
|
-
| LF-14 | Endpoints без вызовов из фронта/других сервисов | grep route paths по всему монорепо |
|
|
88
|
-
| LF-15 | Маршруты в роутере, ведущие на 404 или пустые компоненты | unit test обходом всех routes |
|
|
89
|
-
|
|
90
|
-
### 1.4 Примеры в коде
|
|
91
|
-
|
|
92
|
-
**Лава** — закомментированный fallback на удалённую систему:
|
|
93
|
-
|
|
94
|
-
```ts
|
|
95
|
-
// Старый auth flow до миграции на Auth0 (2024)
|
|
96
|
-
// if (legacyAuth.enabled) {
|
|
97
|
-
// const session = await legacyAuth.login(creds);
|
|
98
|
-
// return mapLegacySession(session);
|
|
99
|
-
// }
|
|
100
|
-
const session = await auth0.login(creds);
|
|
101
|
-
```
|
|
102
|
-
> `legacyAuth` модуль удалён 18 мес назад. Комментарий — окаменелость, история уже в git. **Решение:** удалить.
|
|
103
|
-
|
|
104
|
-
**Не лава** — комментарий объясняет неочевидное (Chesterton's fence):
|
|
105
|
-
|
|
106
|
-
```ts
|
|
107
|
-
// +1 потому что Date.getMonth() возвращает 0-11.
|
|
108
|
-
// Если кто-то «поправит» на getMonth() — поломает отчёты по январю.
|
|
109
|
-
const month = date.getMonth() + 1;
|
|
110
|
-
```
|
|
111
|
-
> Комментарий несёт смысл, защищает код от ложно-очевидной правки. **Решение:** оставить.
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## 2. Чеклист
|
|
116
|
-
|
|
117
|
-
Применять перед рефакторингом модуля или при первом погружении в legacy-репозиторий.
|
|
118
|
-
|
|
119
|
-
- [ ] Прогнать `ts-prune` / `knip` / эквивалент → собрать список unreachable
|
|
120
|
-
- [ ] Прогнать coverage на затрагиваемых файлах → отметить 0%-ветки
|
|
121
|
-
- [ ] `git log --since=24.months.ago -- <file>` → выявить «застывшие» файлы
|
|
122
|
-
- [ ] Найти все `TODO/FIXME/HACK` старше 6 месяцев → решить: fix или delete
|
|
123
|
-
- [ ] Перечислить feature flags в проекте → для каждого проверить, меняется ли значение
|
|
124
|
-
- [ ] Перечислить env-переменные → пометить unused
|
|
125
|
-
- [ ] Для каждой подозрительной функции — найти все usages → если 0, помечать к удалению
|
|
126
|
-
- [ ] Зафиксировать находки в отчёте (формат ниже) до начала рефакторинга
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
## 3. Что делать
|
|
131
|
-
|
|
132
|
-
**Принцип:** удаление лава-флоу — отдельная задача, не часть фичевого PR. **Перед удалением — `git blame` на блок.** Если автор активен в команде — спросить контекст (часто экономит часы и предотвращает удаление чего-то скрыто-полезного). Если автор ушёл или код старше ~24 мес — `git blame` только археология, ходить дальше по чеклисту.
|
|
133
|
-
|
|
134
|
-
1. **Отчёт ДО изменений.** Перечислить находки в отдельном документе (`docs/reports/architect/lava-flow-<module>.md`). Без согласования архитектора не удалять.
|
|
135
|
-
2. **Тестовое покрытие ПЕРЕД удалением.** Если ветка не покрыта тестами — сначала характеризационные тесты (Working Effectively with Legacy Code, M. Feathers), потом удаление.
|
|
136
|
-
3. **Малыми PR.** Один PR = одна находка. Не «удалить весь deprecated/». Атомарность даёт ясную точку отката.
|
|
137
|
-
4. **Feature flag → удалить «выключенную» сторону.** Если флаг 100% в одном положении дольше 1 релиза — удалять противоположную ветку. **НО:** если флаг переключался хотя бы раз за последний релиз — это live config, не лава; не трогать (Chesterton's fence — кто-то им активно пользуется).
|
|
138
|
-
5. **ADR при сомнениях.** Если непонятно, зачем код существует — `$adr-log` с вариантами «удалить / оставить / переписать», эскалация на Architect.
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## 4. Чего избегать
|
|
143
|
-
|
|
144
|
-
- ❌ **«Заодно почищу»** — лава-флоу не убирается ad-hoc внутри фичевого PR. Размывает diff, ломает ревью.
|
|
145
|
-
- ❌ **Массовое удаление без тестов** — характеризационные тесты обязательны для непокрытых веток.
|
|
146
|
-
- ❌ **Переименование вместо удаления** — `_old`, `_deprecated_v2` создают новый слой лавы.
|
|
147
|
-
- ❌ **Комментарий «потом разберёмся»** — это та же лава, только в зародыше. Решение сейчас: delete или ADR.
|
|
148
|
-
- ❌ **Сохранение «на всякий случай»** — git history — это уже архив.
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## 5. Отчёт
|
|
153
|
-
|
|
154
|
-
```markdown
|
|
155
|
-
# Lava Flow Report — <module-name>
|
|
156
|
-
|
|
157
|
-
**Дата:** <YYYY-MM-DD>
|
|
158
|
-
**Автор:** <agent>
|
|
159
|
-
**Контекст:** <зачем смотрели — refactor / current-state / review>
|
|
160
|
-
|
|
161
|
-
## Находки
|
|
162
|
-
|
|
163
|
-
| # | ID | Файл/строка | Признак | Решение |
|
|
164
|
-
|---|----|-------------|---------|---------|
|
|
165
|
-
| 1 | LF-01 | src/foo.ts:120-180 | Закомментированный блок 60 строк | DELETE (PR #N) |
|
|
166
|
-
| 2 | LF-07 | src/config/flags.ts:42 | Флаг `useNewAuth` = false уже 8 мес | DELETE old branch (PR #N+1) |
|
|
167
|
-
| 3 | LF-04 | src/api/users-v1.ts | Дубликат users-v2.ts, никем не используется | DELETE (ADR-DEV-XXX) |
|
|
168
|
-
|
|
169
|
-
## Эскалации
|
|
170
|
-
- <если есть случаи, где нужен
|
|
171
|
-
|
|
172
|
-
## План закрытия
|
|
173
|
-
- <разбивка на PR с порядком>
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
---
|
|
177
|
-
## Ссылки на смежные навыки
|
|
178
|
-
|
|
179
|
-
- `$current-state-analysis` — общий аудит репозитория, лава-флоу — один из его выходов
|
|
180
|
-
- `$architecture-compliance-review` — проверка соответствия архитектуре после удаления
|
|
181
|
-
- `$design-patterns-reference` — что использовать ВМЕСТО удалённой лавы
|
|
182
|
-
- `$code-review-checklist` — на этапе ревью PR с удалением
|
|
183
|
-
- `$system-design-checklist` — чтобы новый код не стал следующей лавой
|
|
184
|
-
|
|
185
|
-
---
|
|
186
|
-
|
|
187
|
-
## MCP integration (cross-gate activation)
|
|
188
|
-
|
|
189
|
-
Reference-скил с cross-gate потреблением:
|
|
190
|
-
|
|
191
|
-
- **ARCH (primary)** — `architect` использует в current-state analysis перед предложением рефакторинга
|
|
192
|
-
- **DEV (secondary)** — `senior_full_stack` сверяется перед изменением старого модуля
|
|
193
|
-
- **REV (secondary)** — `reviewer` применяет при ревью PR в зрелой кодовой базе
|
|
194
|
-
|
|
195
|
-
Активация через триггеры фронтматтера (`legacy код`, `мёртвый код`, `лава-флоу`, `неубранный feature flag`, `brownfield рефакторинг`, и т.д.). См. `$mcp-integration` для общего MCP-flow, gate ritual и recording discipline.
|
|
196
|
-
|
|
197
|
-
Section IDs (`LF-01..LF-25`) — стабильные якоря: цитируй их inline в ARCH/REV артефактах вместо копирования содержания. Сохраняет audit trail компактным и обеспечивает обратную ссылку на канонический источник.
|
|
1
|
+
---
|
|
2
|
+
name: lava-flow-legacy-detection
|
|
3
|
+
description: Чек-лист признаков "лава-флоу" в legacy/brownfield коде — мёртвый код вокруг живого, не убранные feature flags, окаменевшие workarounds, дубликаты после миграций. Используй при анализе текущего состояния репозитория, перед рефакторингом и при ревью PR в зрелой кодовой базе. Активируй при упоминаниях "legacy", "технический долг", "brownfield", "почему этот код здесь".
|
|
4
|
+
type: reference
|
|
5
|
+
domain: development
|
|
6
|
+
owners:
|
|
7
|
+
- architect
|
|
8
|
+
- reviewer
|
|
9
|
+
- senior_full_stack
|
|
10
|
+
gates:
|
|
11
|
+
- ARCH
|
|
12
|
+
- DEV
|
|
13
|
+
- REV
|
|
14
|
+
tech: []
|
|
15
|
+
topic:
|
|
16
|
+
- architecture
|
|
17
|
+
- refactoring
|
|
18
|
+
- legacy
|
|
19
|
+
triggers:
|
|
20
|
+
- легаси код
|
|
21
|
+
- мёртвый код
|
|
22
|
+
- лава-флоу
|
|
23
|
+
- неубранный feature flag
|
|
24
|
+
- brownfield рефакторинг
|
|
25
|
+
- окаменевший workaround
|
|
26
|
+
- неиспользуемый код
|
|
27
|
+
related:
|
|
28
|
+
- current-state-analysis
|
|
29
|
+
- architecture-compliance-review
|
|
30
|
+
- architecture-doc-reference
|
|
31
|
+
- design-patterns-reference
|
|
32
|
+
- adr-log
|
|
33
|
+
- adr-log-reference
|
|
34
|
+
- threat-model-baseline
|
|
35
|
+
- security-baseline-dev
|
|
36
|
+
- code-review-checklist
|
|
37
|
+
- system-design-checklist
|
|
38
|
+
budget_lines: 250
|
|
39
|
+
schema_version: 1
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# Skill: Lava Flow Legacy Detection
|
|
44
|
+
|
|
45
|
+
Анти-паттерн «лава-флоу» (Brown et al., *AntiPatterns*, 1998) — застывшая масса кода, попавшая в продакшен без должного контроля. Никто не помнит, зачем она тут, удалить страшно (нет тестов), переписать дорого. С каждым релизом слой утолщается.
|
|
46
|
+
|
|
47
|
+
> **Когда применять:** ARCH (current-state analysis), DEV (перед изменением старого модуля), REV (ревью PR в зрелой кодовой базе). Reference-скил — активация через триггеры фронтматтера; см. § MCP integration ниже для cross-gate потребления.
|
|
48
|
+
|
|
49
|
+
**Разделы:**
|
|
50
|
+
1. [Признаки лава-флоу](#1-признаки)
|
|
51
|
+
2. [Чек-лист проверки](#2-чеклист)
|
|
52
|
+
3. [Что делать с находкой](#3-что-делать)
|
|
53
|
+
4. [Что НЕ делать](#4-чего-избегать)
|
|
54
|
+
5. [Шаблон отчёта](#5-отчёт)
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 1. Признаки
|
|
59
|
+
|
|
60
|
+
### 1.1 Структурные
|
|
61
|
+
|
|
62
|
+
| # | Признак | Как обнаружить |
|
|
63
|
+
|---|---------|----------------|
|
|
64
|
+
| LF-01 | Закомментированные блоки кода в продакшен-файлах | grep по `//` / `/*` блокам >5 строк |
|
|
65
|
+
| LF-02 | Ветки кода, которые никогда не выполняются | покрытие тестами / coverage report 0% на ветке |
|
|
66
|
+
| LF-03 | Функции/классы без входящих ссылок | static analysis (ts-prune, knip, unimport) |
|
|
67
|
+
| LF-04 | Параллельные «версии» одной логики (v1/v2/legacy/new) | grep по суффиксам имён |
|
|
68
|
+
| LF-05 | Дубликаты после неоконченных миграций | сравнить директории `old/`, `legacy/`, `deprecated/` |
|
|
69
|
+
| LF-06 | Файлы без изменений дольше половины возраста репозитория | `git log -1 --format=%cd -- <file>` или `find <dir> -name '*.ts' -mtime +<дней>` |
|
|
70
|
+
|
|
71
|
+
### 1.2 Конфигурационные
|
|
72
|
+
|
|
73
|
+
| # | Признак | Как обнаружить |
|
|
74
|
+
|---|---------|----------------|
|
|
75
|
+
| LF-07 | Feature flags, которые всегда `false` (или всегда `true`) | grep по `flag.*= false`, проверить usage в коде |
|
|
76
|
+
| LF-08 | Конфиг-ключи, которые никто не читает | grep значения ключа по кодовой базе |
|
|
77
|
+
| LF-09 | Env-переменные, которые не упомянуты в `.env.example` | diff между `process.env.X` и `.env.example` |
|
|
78
|
+
| LF-10 | Захардкоженные mock/stub данные на продакшен-пути | grep по `MOCK_`, `STUB_`, `fake_`, `dummy_` |
|
|
79
|
+
|
|
80
|
+
### 1.3 Поведенческие
|
|
81
|
+
|
|
82
|
+
| # | Признак | Как обнаружить |
|
|
83
|
+
|---|---------|----------------|
|
|
84
|
+
| LF-11 | Воркараунды, ставшие постоянными | grep по `TODO`, `FIXME`, `HACK`, `XXX` старше 6 мес |
|
|
85
|
+
| LF-12 | Захардкоженные version/environment checks на мёртвое окружение | grep по `if.*IE`, `if.*v1`, `if.*LEGACY` где правая сторона больше не существует |
|
|
86
|
+
| LF-13 | Неактивные cron jobs / scheduled tasks | `crontab -l` + grep логов за 3 мес; `systemctl list-timers --all`; `kubectl get cronjob -o wide` (lastScheduleTime) |
|
|
87
|
+
| LF-14 | Endpoints без вызовов из фронта/других сервисов | grep route paths по всему монорепо |
|
|
88
|
+
| LF-15 | Маршруты в роутере, ведущие на 404 или пустые компоненты | unit test обходом всех routes |
|
|
89
|
+
|
|
90
|
+
### 1.4 Примеры в коде
|
|
91
|
+
|
|
92
|
+
**Лава** — закомментированный fallback на удалённую систему:
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
// Старый auth flow до миграции на Auth0 (2024)
|
|
96
|
+
// if (legacyAuth.enabled) {
|
|
97
|
+
// const session = await legacyAuth.login(creds);
|
|
98
|
+
// return mapLegacySession(session);
|
|
99
|
+
// }
|
|
100
|
+
const session = await auth0.login(creds);
|
|
101
|
+
```
|
|
102
|
+
> `legacyAuth` модуль удалён 18 мес назад. Комментарий — окаменелость, история уже в git. **Решение:** удалить.
|
|
103
|
+
|
|
104
|
+
**Не лава** — комментарий объясняет неочевидное (Chesterton's fence):
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
// +1 потому что Date.getMonth() возвращает 0-11.
|
|
108
|
+
// Если кто-то «поправит» на getMonth() — поломает отчёты по январю.
|
|
109
|
+
const month = date.getMonth() + 1;
|
|
110
|
+
```
|
|
111
|
+
> Комментарий несёт смысл, защищает код от ложно-очевидной правки. **Решение:** оставить.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 2. Чеклист
|
|
116
|
+
|
|
117
|
+
Применять перед рефакторингом модуля или при первом погружении в legacy-репозиторий.
|
|
118
|
+
|
|
119
|
+
- [ ] Прогнать `ts-prune` / `knip` / эквивалент → собрать список unreachable
|
|
120
|
+
- [ ] Прогнать coverage на затрагиваемых файлах → отметить 0%-ветки
|
|
121
|
+
- [ ] `git log --since=24.months.ago -- <file>` → выявить «застывшие» файлы
|
|
122
|
+
- [ ] Найти все `TODO/FIXME/HACK` старше 6 месяцев → решить: fix или delete
|
|
123
|
+
- [ ] Перечислить feature flags в проекте → для каждого проверить, меняется ли значение
|
|
124
|
+
- [ ] Перечислить env-переменные → пометить unused
|
|
125
|
+
- [ ] Для каждой подозрительной функции — найти все usages → если 0, помечать к удалению
|
|
126
|
+
- [ ] Зафиксировать находки в отчёте (формат ниже) до начала рефакторинга
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 3. Что делать
|
|
131
|
+
|
|
132
|
+
**Принцип:** удаление лава-флоу — отдельная задача, не часть фичевого PR. **Перед удалением — `git blame` на блок.** Если автор активен в команде — спросить контекст (часто экономит часы и предотвращает удаление чего-то скрыто-полезного). Если автор ушёл или код старше ~24 мес — `git blame` только археология, ходить дальше по чеклисту.
|
|
133
|
+
|
|
134
|
+
1. **Отчёт ДО изменений.** Перечислить находки в отдельном документе (`docs/reports/architect/lava-flow-<module>.md`). Без согласования архитектора не удалять.
|
|
135
|
+
2. **Тестовое покрытие ПЕРЕД удалением.** Если ветка не покрыта тестами — сначала характеризационные тесты (Working Effectively with Legacy Code, M. Feathers), потом удаление.
|
|
136
|
+
3. **Малыми PR.** Один PR = одна находка. Не «удалить весь deprecated/». Атомарность даёт ясную точку отката.
|
|
137
|
+
4. **Feature flag → удалить «выключенную» сторону.** Если флаг 100% в одном положении дольше 1 релиза — удалять противоположную ветку. **НО:** если флаг переключался хотя бы раз за последний релиз — это live config, не лава; не трогать (Chesterton's fence — кто-то им активно пользуется).
|
|
138
|
+
5. **ADR при сомнениях.** Если непонятно, зачем код существует — `$adr-log` с вариантами «удалить / оставить / переписать», эскалация на Architect.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 4. Чего избегать
|
|
143
|
+
|
|
144
|
+
- ❌ **«Заодно почищу»** — лава-флоу не убирается ad-hoc внутри фичевого PR. Размывает diff, ломает ревью.
|
|
145
|
+
- ❌ **Массовое удаление без тестов** — характеризационные тесты обязательны для непокрытых веток.
|
|
146
|
+
- ❌ **Переименование вместо удаления** — `_old`, `_deprecated_v2` создают новый слой лавы.
|
|
147
|
+
- ❌ **Комментарий «потом разберёмся»** — это та же лава, только в зародыше. Решение сейчас: delete или ADR.
|
|
148
|
+
- ❌ **Сохранение «на всякий случай»** — git history — это уже архив.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 5. Отчёт
|
|
153
|
+
|
|
154
|
+
```markdown
|
|
155
|
+
# Lava Flow Report — <module-name>
|
|
156
|
+
|
|
157
|
+
**Дата:** <YYYY-MM-DD>
|
|
158
|
+
**Автор:** <agent>
|
|
159
|
+
**Контекст:** <зачем смотрели — refactor / current-state / review>
|
|
160
|
+
|
|
161
|
+
## Находки
|
|
162
|
+
|
|
163
|
+
| # | ID | Файл/строка | Признак | Решение |
|
|
164
|
+
|---|----|-------------|---------|---------|
|
|
165
|
+
| 1 | LF-01 | src/foo.ts:120-180 | Закомментированный блок 60 строк | DELETE (PR #N) |
|
|
166
|
+
| 2 | LF-07 | src/config/flags.ts:42 | Флаг `useNewAuth` = false уже 8 мес | DELETE old branch (PR #N+1) |
|
|
167
|
+
| 3 | LF-04 | src/api/users-v1.ts | Дубликат users-v2.ts, никем не используется | DELETE (ADR-DEV-XXX) |
|
|
168
|
+
|
|
169
|
+
## Эскалации
|
|
170
|
+
- <если есть случаи, где нужен sign-off Architect'а/пользователя>
|
|
171
|
+
|
|
172
|
+
## План закрытия
|
|
173
|
+
- <разбивка на PR с порядком>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
## Ссылки на смежные навыки
|
|
178
|
+
|
|
179
|
+
- `$current-state-analysis` — общий аудит репозитория, лава-флоу — один из его выходов
|
|
180
|
+
- `$architecture-compliance-review` — проверка соответствия архитектуре после удаления
|
|
181
|
+
- `$design-patterns-reference` — что использовать ВМЕСТО удалённой лавы
|
|
182
|
+
- `$code-review-checklist` — на этапе ревью PR с удалением
|
|
183
|
+
- `$system-design-checklist` — чтобы новый код не стал следующей лавой
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## MCP integration (cross-gate activation)
|
|
188
|
+
|
|
189
|
+
Reference-скил с cross-gate потреблением:
|
|
190
|
+
|
|
191
|
+
- **ARCH (primary)** — `architect` использует в current-state analysis перед предложением рефакторинга
|
|
192
|
+
- **DEV (secondary)** — `senior_full_stack` сверяется перед изменением старого модуля
|
|
193
|
+
- **REV (secondary)** — `reviewer` применяет при ревью PR в зрелой кодовой базе
|
|
194
|
+
|
|
195
|
+
Активация через триггеры фронтматтера (`legacy код`, `мёртвый код`, `лава-флоу`, `неубранный feature flag`, `brownfield рефакторинг`, и т.д.). См. `$mcp-integration` для общего MCP-flow, gate ritual и recording discipline.
|
|
196
|
+
|
|
197
|
+
Section IDs (`LF-01..LF-25`) — стабильные якоря: цитируй их inline в ARCH/REV артефактах вместо копирования содержания. Сохраняет audit trail компактным и обеспечивает обратную ссылку на канонический источник.
|