strictacode 0.0.1__tar.gz

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.
Files changed (43) hide show
  1. strictacode-0.0.1/.github/workflows/publish.yml +54 -0
  2. strictacode-0.0.1/.gitignore +210 -0
  3. strictacode-0.0.1/PKG-INFO +17 -0
  4. strictacode-0.0.1/README.md +133 -0
  5. strictacode-0.0.1/docs/examples.md +270 -0
  6. strictacode-0.0.1/docs/interpretation.md +451 -0
  7. strictacode-0.0.1/docs/metrics.md +472 -0
  8. strictacode-0.0.1/docs/report-fields.md +463 -0
  9. strictacode-0.0.1/pyproject.toml +32 -0
  10. strictacode-0.0.1/setup.cfg +4 -0
  11. strictacode-0.0.1/strictacode/__init__.py +0 -0
  12. strictacode-0.0.1/strictacode/__main__.py +84 -0
  13. strictacode-0.0.1/strictacode/analyzer.py +53 -0
  14. strictacode-0.0.1/strictacode/calc/__init__.py +10 -0
  15. strictacode-0.0.1/strictacode/calc/complexity.py +94 -0
  16. strictacode-0.0.1/strictacode/calc/pressure/__init__.py +6 -0
  17. strictacode-0.0.1/strictacode/calc/pressure/overengineering.py +213 -0
  18. strictacode-0.0.1/strictacode/calc/pressure/refactoring.py +190 -0
  19. strictacode-0.0.1/strictacode/calc/score.py +135 -0
  20. strictacode-0.0.1/strictacode/go/__init__.py +3 -0
  21. strictacode-0.0.1/strictacode/go/analyzer.py +374 -0
  22. strictacode-0.0.1/strictacode/go/collector.py +411 -0
  23. strictacode-0.0.1/strictacode/go/loader.py +64 -0
  24. strictacode-0.0.1/strictacode/graph.py +44 -0
  25. strictacode-0.0.1/strictacode/js/__init__.py +3 -0
  26. strictacode-0.0.1/strictacode/js/analyzer.py +203 -0
  27. strictacode-0.0.1/strictacode/js/collector.py +310 -0
  28. strictacode-0.0.1/strictacode/js/loader.py +62 -0
  29. strictacode-0.0.1/strictacode/loader.py +180 -0
  30. strictacode-0.0.1/strictacode/py/__init__.py +3 -0
  31. strictacode-0.0.1/strictacode/py/analyzer.py +52 -0
  32. strictacode-0.0.1/strictacode/py/collector.py +13 -0
  33. strictacode-0.0.1/strictacode/py/loader.py +70 -0
  34. strictacode-0.0.1/strictacode/reporters.py +677 -0
  35. strictacode-0.0.1/strictacode/skill.py +687 -0
  36. strictacode-0.0.1/strictacode/source.py +538 -0
  37. strictacode-0.0.1/strictacode/utils.py +160 -0
  38. strictacode-0.0.1/strictacode.egg-info/PKG-INFO +17 -0
  39. strictacode-0.0.1/strictacode.egg-info/SOURCES.txt +41 -0
  40. strictacode-0.0.1/strictacode.egg-info/dependency_links.txt +1 -0
  41. strictacode-0.0.1/strictacode.egg-info/entry_points.txt +2 -0
  42. strictacode-0.0.1/strictacode.egg-info/requires.txt +3 -0
  43. strictacode-0.0.1/strictacode.egg-info/top_level.txt +1 -0
@@ -0,0 +1,54 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ jobs:
9
+ build:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+
14
+ - name: Set up Python
15
+ uses: actions/setup-python@v5
16
+ with:
17
+ python-version: '3.12'
18
+
19
+ - name: Install build tools
20
+ run: pip install build
21
+
22
+ - name: Build package
23
+ run: python -m build
24
+
25
+ - name: Upload build artifacts
26
+ uses: actions/upload-artifact@v4
27
+ with:
28
+ name: dist
29
+ path: dist/
30
+ retention-days: 1
31
+
32
+ publish:
33
+ needs: build
34
+ runs-on: ubuntu-latest
35
+ permissions:
36
+ id-token: write
37
+ steps:
38
+ - uses: actions/checkout@v4
39
+
40
+ - name: Set up Python
41
+ uses: actions/setup-python@v5
42
+ with:
43
+ python-version: '3.12'
44
+
45
+ - name: Download build artifacts
46
+ uses: actions/download-artifact@v4
47
+ with:
48
+ name: dist
49
+ path: dist/
50
+
51
+ - name: Publish to PyPI
52
+ uses: pypa/gh-action-pypi-publish@release/v1
53
+ with:
54
+ password: ${{ secrets.PYPI_API_TOKEN }}
@@ -0,0 +1,210 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py.cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # UV
98
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ #uv.lock
102
+
103
+ # poetry
104
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
105
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
106
+ # commonly ignored for libraries.
107
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
108
+ #poetry.lock
109
+ #poetry.toml
110
+
111
+ # pdm
112
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
113
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
114
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
115
+ #pdm.lock
116
+ #pdm.toml
117
+ .pdm-python
118
+ .pdm-build/
119
+
120
+ # pixi
121
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
122
+ #pixi.lock
123
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
124
+ # in the .venv directory. It is recommended not to include this directory in version control.
125
+ .pixi
126
+
127
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
128
+ __pypackages__/
129
+
130
+ # Celery stuff
131
+ celerybeat-schedule
132
+ celerybeat.pid
133
+
134
+ # SageMath parsed files
135
+ *.sage.py
136
+
137
+ # Environments
138
+ .env
139
+ .envrc
140
+ .venv
141
+ env/
142
+ venv/
143
+ ENV/
144
+ env.bak/
145
+ venv.bak/
146
+
147
+ # Spyder project settings
148
+ .spyderproject
149
+ .spyproject
150
+
151
+ # Rope project settings
152
+ .ropeproject
153
+
154
+ # mkdocs documentation
155
+ /site
156
+
157
+ # mypy
158
+ .mypy_cache/
159
+ .dmypy.json
160
+ dmypy.json
161
+
162
+ # Pyre type checker
163
+ .pyre/
164
+
165
+ # pytype static type analyzer
166
+ .pytype/
167
+
168
+ # Cython debug symbols
169
+ cython_debug/
170
+
171
+ # PyCharm
172
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
173
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
174
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
175
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
176
+ .idea/
177
+
178
+ # Abstra
179
+ # Abstra is an AI-powered process automation framework.
180
+ # Ignore directories containing user credentials, local state, and settings.
181
+ # Learn more at https://abstra.io/docs
182
+ .abstra/
183
+
184
+ # Visual Studio Code
185
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
186
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
187
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
188
+ # you could uncomment the following to ignore the entire vscode folder
189
+ # .vscode/
190
+
191
+ # Ruff stuff:
192
+ .ruff_cache/
193
+
194
+ # PyPI configuration file
195
+ .pypirc
196
+
197
+ # Cursor
198
+ # Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to
199
+ # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
200
+ # refer to https://docs.cursor.com/context/ignore-files
201
+ .cursorignore
202
+ .cursorindexingignore
203
+
204
+ # Marimo
205
+ marimo/_static/
206
+ marimo/_lsp/
207
+ __marimo__/
208
+
209
+ # tmp docs
210
+ docs/plans
@@ -0,0 +1,17 @@
1
+ Metadata-Version: 2.4
2
+ Name: strictacode
3
+ Version: 0.0.1
4
+ Summary: Codebase health diagnostics
5
+ License: BSD 3-Clause
6
+ Project-URL: Homepage, https://github.com/qarium/strictacode
7
+ Classifier: Development Status :: 4 - Beta
8
+ Classifier: Intended Audience :: Developers
9
+ Classifier: License :: OSI Approved :: MIT License
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Requires-Python: >=3.10
15
+ Requires-Dist: numpy
16
+ Requires-Dist: radon
17
+ Requires-Dist: click
@@ -0,0 +1,133 @@
1
+ # Strictacode
2
+
3
+ **Диагностика здоровья кодовой базы.**
4
+
5
+ Strictacode находит болевые точки проекта: спагетти-код, overengineering и сложность, которая блокирует разработку.
6
+
7
+ > Работает с AI-агентами для автоматического анализа качества кода.
8
+
9
+ > Легко интегрируется в CI/CD пайплайны и локальный REPL-цикл разработки.
10
+
11
+ ---
12
+
13
+ ## Поддерживаемые языки
14
+
15
+ Golang · Python · Javascript
16
+
17
+ ---
18
+
19
+ ## Быстрый старт
20
+
21
+ ```bash
22
+ pip install strictacode
23
+ strictacode analyze . --short
24
+ ```
25
+
26
+ Результат не очевиден? См. [Интерпретация метрик](docs/interpretation.md) — там сценарии и рекомендации.
27
+
28
+ ---
29
+
30
+ ## Зачем это нужно
31
+
32
+ Вы когда-нибудь заходили в "наследственный" проект и думали: *с чего начать?*
33
+ Или смотрели на отчёт о покрытии тестами и понимали: *это не показывает реальную проблему*.
34
+
35
+ Strictacode отвечает на вопрос: **насколько больно работать с этим кодом?**
36
+
37
+ Он не считает строки. Он ищет:
38
+ - Функции, которые сложно изменить без багов
39
+ - Архитектуру, которая слишком сложная для задачи
40
+ - Места, где техдолг уже блокирует разработку
41
+
42
+ ---
43
+
44
+ ## Как это работает
45
+
46
+ ```
47
+ $ strictacode analyze ./src --short
48
+
49
+ Project:
50
+ * status:
51
+ - name: warning
52
+ - score: 58 ← здоровье проекта (0-100, меньше = лучше)
53
+ * refactoring_pressure:
54
+ - score: 72 ← насколько код "давит" на разработчика
55
+ * overengineering_pressure:
56
+ - score: 18 ← насколько архитектура избыточна
57
+ * complexity:
58
+ - density: 42.5 ← концентрация сложности
59
+ ```
60
+
61
+ Вы узнаете:
62
+ - **Spaghetti** (RP высокий, OP низкий) → чистите функции
63
+ - **Overengineering** (OP высокий, RP низкий) → упрощайте архитектуру
64
+ - **Кризис** (оба высокие) → изолируйте и переписывайте
65
+ - **Здоровый** (оба низкие) → мониторьте
66
+
67
+ ---
68
+
69
+ ## Метрики
70
+
71
+ | Метрика | Что измеряет | Хорошо | Плохо |
72
+ |------------------------------|-------------------------|--------|--------|
73
+ | **Project Score** | Общее здоровье | 0-20 | 60+ |
74
+ | **Refactoring Pressure** | Давление на рефакторинг | 0-40 | 60+ |
75
+ | **Overengineering Pressure** | Избыточная сложность | 0-40 | 60+ |
76
+ | **Complexity Density** | Плотность сложности | < 20 | > 50 |
77
+
78
+ ---
79
+
80
+ ## Когда использовать
81
+
82
+ | Ситуация | Что даст strictacode |
83
+ |---------------------------|-----------------------------------------------------------|
84
+ | Оценка техдолга | Оцифрует "код плохой" в метрики для менеджмента |
85
+ | Планирование тестирования | Укажет, какие проекты/компоненты требуют больше внимания |
86
+ | Планирование рефакторинга | Укажет, где "80% боли от 20% кода" |
87
+ | Ретроспектива спринта | Объективные данные вместо субъективных оценок |
88
+ | Onboarding в проект | Покажет, какие модули самые сложные |
89
+ | CI/CD pipeline | Заблокирует деградацию качества |
90
+
91
+ ---
92
+
93
+ ## Команды
94
+
95
+ ```bash
96
+ # Полный отчёт
97
+ strictacode analyze <path>
98
+
99
+ # Короткий отчёт
100
+ strictacode analyze <path> --short
101
+
102
+ # Детализация по модулям, классам, функциям
103
+ strictacode analyze <path> --details
104
+
105
+ # JSON формат для CI/CD
106
+ strictacode analyze <path> --format json
107
+ ```
108
+
109
+ ---
110
+
111
+ ## Интеграция с AI-агентами
112
+
113
+ Strictacode может быть установлен как навык (skill) в AI-агенты для автоматического анализа качества кода:
114
+
115
+ ```bash
116
+ strictacode install agent-skill --agent <agent_name>
117
+ ```
118
+
119
+ Поддерживаемые агенты:
120
+ - `claude`
121
+ - `cursor`
122
+ - `codex`
123
+ - `gemini`
124
+ - `antigravity`
125
+
126
+ ---
127
+
128
+ ## Документация
129
+
130
+ - [Поля отчёта](docs/report-fields.md) — описание всех полей в отчёте с типами и примерами
131
+ - [Как рассчитываются метрики](docs/metrics.md) — формулы и математика
132
+ - [Интерпретация метрик](docs/interpretation.md) — сценарии анализа и рекомендации
133
+ - [Примеры использования](docs/examples.md) — реальные сценарии и алгоритмы действий
@@ -0,0 +1,270 @@
1
+ # Примеры использования
2
+
3
+ Эта документация содержит реальные сценарии использования strictacode с пошаговыми алгоритмами действий.
4
+
5
+ ---
6
+
7
+ ## Содержание
8
+
9
+ - [Знакомство с проектом](#знакомство-с-проектом)
10
+ - [Повседневная разработка](#повседневная-разработка)
11
+ - [Принятие решений](#принятие-решений)
12
+ - [Процессы команды](#процессы-команды)
13
+
14
+ ---
15
+
16
+ ## Знакомство с проектом
17
+
18
+ ### Onboarding новичка
19
+
20
+ **Контекст:** Новый разработчик приходит в проект. Первая задача — понять, где сложный код, а где можно работать спокойно. Без strictacode это недели чтения кода и случайные открытия.
21
+
22
+ **Команда:**
23
+ ```bash
24
+ strictacode analyze . --details
25
+ ```
26
+
27
+ **Результат:** Метрики по модулям/пакетам — где высокий RP (грязный код), где высокий OP (сложные связи), где density зашкаливает.
28
+
29
+ **Алгоритм:**
30
+ 1. Запустить анализ с `--details`
31
+ 2. Найти модули с `status: healthy` — начинать работу лучше с них
32
+ 3. Посмотреть модули с `RP > 60` — там сложнее всего вносить изменения
33
+ 4. Изучить `density` — высокая плотность означает "спагетти в одном файле"
34
+ 5. Составить мысленную карту: "зелёные зоны" vs "красные зоны"
35
+
36
+ ---
37
+
38
+ ### Оценка наследственного проекта
39
+
40
+ **Контекст:** Tech lead заходит в унаследованный проект. Нужно быстро понять состояние кодовой базы и ответить на вопрос: "с чего начать?"
41
+
42
+ **Команда:**
43
+ ```bash
44
+ strictacode analyze . --short
45
+ ```
46
+
47
+ **Результат:** Project Score, RP, OP, density — общая картина здоровья.
48
+
49
+ **Алгоритм:**
50
+ 1. Запустить короткий анализ — получить Project Score
51
+ 2. Интерпретировать score по шкале (healthy/normal/warning/critical/emergency)
52
+ 3. Сравнить RP и OP:
53
+ - RP >> OP → spaghetti-код, чистить функции
54
+ - OP >> RP → overengineering, упрощать архитектуру
55
+ - Оба высокие → кризис, изолировать и переписывать
56
+ 4. Сформировать отчёт для стейкхолдеров с конкретными метриками
57
+
58
+ ---
59
+
60
+ ## Повседневная разработка
61
+
62
+ ### Планирование юнит-тестов
63
+
64
+ **Контекст:** Разработчик планирует, какие функции покрыть unit-тестами в первую очередь. Ограниченное время — нужно найти максимальный выхлоп.
65
+
66
+ **Команда:**
67
+ ```bash
68
+ strictacode analyze . --details
69
+ ```
70
+
71
+ **Результат:** Детализация по модулям/классам/функциям с метриками сложности.
72
+
73
+ **Алгоритм:**
74
+ 1. Запустить анализ с `--details`
75
+ 2. Отсортировать функции по `complexity` — функции с complexity > 15 труднее тестировать и быстрее ломаются
76
+ 3. Смотреть на `density` в модуле — высокая плотность означает запутанный код, тесты будут сложными
77
+ 4. Приоритет: сначала функции с высокой complexity в модулях с низким OP (меньше моков)
78
+ 5. Функции в модулях с высоким OP отложить — там нужны интеграционные тесты
79
+
80
+ ---
81
+
82
+ ### Планирование интеграционных тестов на сервисы
83
+
84
+ **Контекст:** QA планирует тестирование микросервисной архитектуры. Нужно понять, какие сервисы изменяются с большими рисками, какие — с меньшими.
85
+
86
+ **Команда:**
87
+ ```bash
88
+ # Для каждого сервиса
89
+ strictacode analyze ./service-a --short
90
+ strictacode analyze ./service-b --short
91
+ strictacode analyze ./service-c --short
92
+ ```
93
+
94
+ **Результат:** Project Score, RP, OP, density по каждому сервису.
95
+
96
+ **Алгоритм:**
97
+ 1. Запустить анализ для каждого сервиса отдельно
98
+ 2. Сравнить метрики между сервисами:
99
+ - Высокий RP — сервис с "грязным" кодом, изменения рискованны
100
+ - Высокий OP — сложная архитектура, выше шанс сломать интеграции
101
+ - Высокий density — много логики в одном месте, сложнее покрыть тестами
102
+ 3. Приоритет тестирования:
103
+ - `status: critical/emergency` — максимальное внимание, regression-тесты обязательны
104
+ - `status: warning` — стандартное покрытие + smoke-тесты интеграций
105
+ - `status: healthy/normal` — минимальный набор smoke-тестов
106
+ 4. Заложить буфер времени на баги в сервисах с высоким RP
107
+
108
+ ---
109
+
110
+ ### Приоритизация API-ручек для тестирования
111
+
112
+ **Контекст:** В сервисе много API-эндпоинтов, все протестировать невозможно. Нужно понять, какие ручки покрывать тестами в первую очередь.
113
+
114
+ **Команда:**
115
+ ```bash
116
+ strictacode analyze . --details
117
+ ```
118
+
119
+ **Результат:** Детализация по пакетам/модулям с метриками.
120
+
121
+ **Алгоритм:**
122
+ 1. Запустить анализ с `--details`
123
+ 2. Найти пакеты с `status: warning` и выше — это проблемные зоны
124
+ 3. Сопоставить пакеты с API-ручками:
125
+ - Какой пакет обрабатывает какую ручку
126
+ - Какие ручки зависят от модулей с высоким RP
127
+ 4. Приоритет тестирования ручек:
128
+ - Ручки на базе пакетов с `status: critical` — тестировать первыми, максимальное покрытие
129
+ - Ручки на базе пакетов с `status: warning` — стандартное покрытие
130
+ - Ручки на базе пакетов с `status: healthy` — минимальные smoke-тесты
131
+ 5. Ручки, которые затрагивают несколько проблемных модулей — кандидаты на end-to-end тесты
132
+
133
+ ---
134
+
135
+ ## Принятие решений
136
+
137
+ ### Выбор: переписывать или рефакторить пакет/сервис
138
+
139
+ **Контекст:** Целый пакет или сервис проблемный. Нужно решить на уровне архитектурной единицы.
140
+
141
+ **Команда:**
142
+ ```bash
143
+ strictacode analyze .
144
+ ```
145
+
146
+ **Результат:** Метрики проекта с разбивкой по пакетам/модулям.
147
+
148
+ **Алгоритм:**
149
+ 1. Запустить анализ всего проекта
150
+ 2. Найти нужный пакет/сервис в результатах
151
+ 3. Оценить общее состояние через его Project Score:
152
+ - Score < 40 — можно рефакторить постепенно
153
+ - Score 40-60 — серьёзные проблемы, нужен план
154
+ - Score > 60 — критическое состояние
155
+ 4. Посмотреть распределение проблем внутри:
156
+ - Проблемы в 1-2 подмодулях → изолировать и рефакторить/переписать только их
157
+ - Проблемы распределены равномерно → системная проблема архитектуры
158
+ 5. Оценить связи (OP): высокий OP означает, что модуль сильно связан с другими. Переписывание сломает интеграции.
159
+ 6. Решение:
160
+ - Локальные проблемы → точечный рефакторинг/переписывание
161
+ - Системные проблемы + низкий OP → кандидат на переписывание
162
+ - Системные проблемы + высокий OP → постепенный рефакторинг с сохранением интерфейсов
163
+
164
+ ---
165
+
166
+ ### Обоснование рефакторинга менеджменту
167
+
168
+ **Контекст:** Нужно выделить время на рефакторинг в спринте. Менеджмент хочет понять: "зачем?" и "сколько?". Субъективное "код плохой" не работает.
169
+
170
+ **Команда:**
171
+ ```bash
172
+ strictacode analyze . --short
173
+ strictacode analyze . --format json > quality-baseline.json
174
+ ```
175
+
176
+ **Результат:** Метрики в читаемом виде + JSON для отслеживания прогресса.
177
+
178
+ **Алгоритм:**
179
+ 1. Запустить анализ, сохранить baseline
180
+ 2. Сформулировать проблему через метрики:
181
+ - "RP = 72 — это значит, что каждое изменение кода несёт высокий риск багов"
182
+ - "Density = 58 — код спагетти-подобный, время на задачу увеличивается в 2 раза"
183
+ 3. Показать тенденцию: запустить анализ на коде 3-месячной давности (git checkout), сравнить
184
+ 4. Перевести в бизнес-язык:
185
+ - Высокий RP → медленнее фичи, больше багов в проде
186
+ - Высокий OP → сложнее onboardить новичков, дольше code review
187
+ 5. Предложить план: "Снизим RP с 72 до 40 за 2 спринта, это ускорит разработку на X%"
188
+ 6. После рефакторинга: запустить анализ снова, показать динамику
189
+
190
+ ---
191
+
192
+ ## Процессы команды
193
+
194
+ ### Ретроспектива спринта
195
+
196
+ **Контекст:** Команда проводит ретро. Обсуждаем качество кода. Мнения расходятся: "нормальный код" vs "всё разваливается". Нужны объективные данные.
197
+
198
+ **Команда:**
199
+ ```bash
200
+ # До спринта
201
+ strictacode analyze . --format json > sprint-start.json
202
+
203
+ # После спринта
204
+ strictacode analyze . --format json > sprint-end.json
205
+ ```
206
+
207
+ **Результат:** Два снапшота состояния кодовой базы.
208
+
209
+ **Алгоритм:**
210
+ 1. Запустить анализ в начале спринта, сохранить baseline
211
+ 2. В течение спринта — не трогать, просто работать
212
+ 3. В конце спринта — запустить анализ снова
213
+ 4. Сравнить метрики:
214
+ - RP вырос → накопили техдолг, следующий спринт нужно заложить время на чистку
215
+ - OP вырос → добавили абстракций, проверить — они нужны или преждевременны?
216
+ - Density вырос → начали писать "грязный" код, нужен code review строже
217
+ 5. Обсудить на ретро:
218
+ - Какие модули ухудшились и почему?
219
+ - Это нормальный рост или проблема?
220
+ - Что сделать в следующем спринте?
221
+ 6. Сохранить sprint-end.json как baseline для следующего спринта
222
+
223
+ ---
224
+
225
+ ### CI/CD гейты
226
+
227
+ **Контекст:** Нужно заблокировать деградацию качества кода в пайплайне. Pull request с плохим кодом не должен попадать в main.
228
+
229
+ **Команда (в CI):**
230
+ ```bash
231
+ strictacode analyze . --format json > current.json
232
+ ```
233
+
234
+ **Результат:** JSON-отчёт для автоматической проверки.
235
+
236
+ **Алгоритм:**
237
+ 1. Определить baseline: запустить анализ на текущем main, сохранить `baseline.json` в репозиторий
238
+ 2. В CI-пайплайне добавить шаг после тестов:
239
+ - Запустить `strictacode analyze . --format json > current.json`
240
+ - Сравнить `current.json` с `baseline.json` по ключевым метрикам
241
+ 3. Блокировать PR если:
242
+ - Project Score вырос выше порога (например, > 60)
243
+ - RP вырос больше чем на N пунктов относительно baseline
244
+ 4. После мерджа в main — обновить `baseline.json`
245
+
246
+ **Пример проверки (Python скрипт):**
247
+ ```python
248
+ import json
249
+
250
+ THRESHOLD_SCORE = 60
251
+ THRESHOLD_RP_DIFF = 10
252
+
253
+ with open("baseline.json") as f:
254
+ baseline = json.load(f)
255
+ with open("current.json") as f:
256
+ current = json.load(f)
257
+
258
+ score = current["project"]["status"]["score"]
259
+ rp_diff = current["project"]["refactoring_pressure"]["score"] - baseline["project"]["refactoring_pressure"]["score"]
260
+
261
+ if score > THRESHOLD_SCORE:
262
+ print(f"FAIL: Project Score {score} > {THRESHOLD_SCORE}")
263
+ exit(1)
264
+
265
+ if rp_diff > THRESHOLD_RP_DIFF:
266
+ print(f"FAIL: RP вырос на {rp_diff} пунктов (порог: {THRESHOLD_RP_DIFF})")
267
+ exit(1)
268
+
269
+ print("OK: Метрики в пределах нормы")
270
+ ```