codex-bot 0.1.0__tar.gz → 0.1.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.
- codex_bot-0.1.1/.github/workflows/publish.yml +34 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/.pre-commit-config.yaml +38 -38
- {codex_bot-0.1.0 → codex_bot-0.1.1}/CHANGELOG.md +38 -29
- {codex_bot-0.1.0 → codex_bot-0.1.1}/CLAUDE.md +48 -48
- {codex_bot-0.1.0 → codex_bot-0.1.1}/PKG-INFO +8 -3
- {codex_bot-0.1.0 → codex_bot-0.1.1}/README.md +2 -2
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/DOCUMENTATION_STANDARD.md +142 -142
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/en_EN/README.md +36 -36
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/en_EN/architecture/animation/README.md +39 -39
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/en_EN/architecture/base/README.md +38 -38
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/en_EN/architecture/cli/README.md +38 -38
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/en_EN/architecture/director/README.md +39 -39
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/en_EN/architecture/engine/README.md +41 -41
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/en_EN/architecture/fsm/README.md +38 -38
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/en_EN/architecture/helper/README.md +37 -37
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/en_EN/architecture/redis/README.md +40 -40
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/en_EN/architecture/sender/README.md +41 -41
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/en_EN/architecture/url_signer/README.md +38 -38
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/ru_RU/README.md +36 -36
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/ru_RU/architecture/animation/README.md +39 -39
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/ru_RU/architecture/base/README.md +38 -38
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/ru_RU/architecture/cli/README.md +38 -38
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/ru_RU/architecture/director/README.md +39 -39
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/ru_RU/architecture/engine/README.md +41 -41
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/ru_RU/architecture/fsm/README.md +38 -38
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/ru_RU/architecture/helper/README.md +37 -37
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/ru_RU/architecture/redis/README.md +40 -40
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/ru_RU/architecture/sender/README.md +41 -41
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/ru_RU/architecture/url_signer/README.md +38 -38
- {codex_bot-0.1.0 → codex_bot-0.1.1}/project_structure.txt +207 -207
- {codex_bot-0.1.0 → codex_bot-0.1.1}/pyproject.toml +7 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/__init__.py +1 -1
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/fsm/state_helper.py +72 -72
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/animation/test_animation_service.py +55 -55
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/base/test_base_orchestrator.py +54 -54
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/base/test_view_dto.py +48 -48
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/conftest.py +42 -42
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/director/test_director.py +54 -54
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/engine/factory/test_bot_builder.py +37 -37
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/engine/http/test_api_client.py +60 -60
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/engine/middlewares/test_throttling.py +62 -62
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/fsm/test_garbage_collector.py +50 -50
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/fsm/test_state_manager.py +48 -48
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/helper/test_context_helper.py +47 -47
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/sender/test_sender_keys.py +16 -16
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tests/url_signer/test_url_signer.py +49 -49
- {codex_bot-0.1.0 → codex_bot-0.1.1}/.claude/project.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/.claude/settings.local.json +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/.github/workflows/docs.yml +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/.gitignore +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/LICENSE +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/README.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/README.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/animation.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/base.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/cli.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/director.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/discovery.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/factory.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/fsm.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/helper.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/http.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/middlewares.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/redis.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/router_builder.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/sender.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/api/url_signer.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/docs/guide/getting_started.md +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/mkdocs.yml +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/animation/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/animation/animation_service.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/base/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/base/base_orchestrator.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/base/context_dto.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/base/view_dto.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/cli/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/cli/commands.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/director/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/director/director.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/director/protocols.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/discovery/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/discovery/service.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/factory/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/factory/bot_builder.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/http/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/http/api_client.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/i18n/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/i18n/locales_compiler.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/middlewares/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/middlewares/container.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/middlewares/i18n.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/middlewares/throttling.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/middlewares/user_validation.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/router_builder/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/engine/router_builder/router_builder.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/fsm/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/fsm/common_fsm_handlers.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/fsm/garbage_collector.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/fsm/state_manager.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/helper/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/helper/context_helper.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/redis/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/redis/dispatcher.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/redis/router.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/redis/stream_processor.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/sender/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/sender/protocols.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/sender/sender_keys.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/sender/sender_manager.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/sender/view_sender.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/callbacks.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/contract.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/dto.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/feature.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/feature_redis.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/formatters.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/handlers.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/handlers_redis.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/keyboards.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/orchestrator.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/orchestrator_redis.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/texts.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/templates/feature/ui.py.tpl +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/url_signer/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/src/codex_bot/url_signer/service.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tools/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tools/dev/__init__.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tools/dev/check.py +0 -0
- {codex_bot-0.1.0 → codex_bot-0.1.1}/tools/dev/generate_project_tree.py +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
build-n-publish:
|
|
10
|
+
name: Build and publish to PyPI
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
environment:
|
|
13
|
+
name: pypi
|
|
14
|
+
url: https://pypi.org/project/codex-bot
|
|
15
|
+
permissions:
|
|
16
|
+
id-token: write
|
|
17
|
+
contents: read
|
|
18
|
+
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- name: Set up Python
|
|
23
|
+
uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: "3.11"
|
|
26
|
+
|
|
27
|
+
- name: Install build dependencies
|
|
28
|
+
run: python -m pip install build
|
|
29
|
+
|
|
30
|
+
- name: Build package
|
|
31
|
+
run: python -m build
|
|
32
|
+
|
|
33
|
+
- name: Publish to PyPI
|
|
34
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
repos:
|
|
2
|
-
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
-
rev: v5.0.0
|
|
4
|
-
hooks:
|
|
5
|
-
- id: trailing-whitespace
|
|
6
|
-
- id: end-of-file-fixer
|
|
7
|
-
- id: check-yaml
|
|
8
|
-
- id: check-json
|
|
9
|
-
- id: check-added-large-files
|
|
10
|
-
args: ['--maxkb=2000']
|
|
11
|
-
- id: check-merge-conflict
|
|
12
|
-
|
|
13
|
-
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
14
|
-
rev: v0.9.6
|
|
15
|
-
hooks:
|
|
16
|
-
- id: ruff
|
|
17
|
-
args: [--fix]
|
|
18
|
-
- id: ruff-format
|
|
19
|
-
|
|
20
|
-
- repo: https://github.com/igorshubovych/markdownlint-cli
|
|
21
|
-
rev: v0.44.0
|
|
22
|
-
hooks:
|
|
23
|
-
- id: markdownlint
|
|
24
|
-
args: ["--fix", "--disable", "MD013"]
|
|
25
|
-
|
|
26
|
-
- repo: https://github.com/PyCQA/bandit
|
|
27
|
-
rev: 1.8.2
|
|
28
|
-
hooks:
|
|
29
|
-
- id: bandit
|
|
30
|
-
args: ["-c", "pyproject.toml"]
|
|
31
|
-
additional_dependencies: ["bandit[toml]"]
|
|
32
|
-
|
|
33
|
-
# 2. Поиск "забытых" секретов и паролей (усиленный)
|
|
34
|
-
- repo: https://github.com/Yelp/detect-secrets
|
|
35
|
-
rev: v1.5.0
|
|
36
|
-
hooks:
|
|
37
|
-
- id: detect-secrets
|
|
38
|
-
# Baseline will be added after manual creation
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
+
rev: v5.0.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: trailing-whitespace
|
|
6
|
+
- id: end-of-file-fixer
|
|
7
|
+
- id: check-yaml
|
|
8
|
+
- id: check-json
|
|
9
|
+
- id: check-added-large-files
|
|
10
|
+
args: ['--maxkb=2000']
|
|
11
|
+
- id: check-merge-conflict
|
|
12
|
+
|
|
13
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
14
|
+
rev: v0.9.6
|
|
15
|
+
hooks:
|
|
16
|
+
- id: ruff
|
|
17
|
+
args: [--fix]
|
|
18
|
+
- id: ruff-format
|
|
19
|
+
|
|
20
|
+
- repo: https://github.com/igorshubovych/markdownlint-cli
|
|
21
|
+
rev: v0.44.0
|
|
22
|
+
hooks:
|
|
23
|
+
- id: markdownlint
|
|
24
|
+
args: ["--fix", "--disable", "MD013"]
|
|
25
|
+
|
|
26
|
+
- repo: https://github.com/PyCQA/bandit
|
|
27
|
+
rev: 1.8.2
|
|
28
|
+
hooks:
|
|
29
|
+
- id: bandit
|
|
30
|
+
args: ["-c", "pyproject.toml"]
|
|
31
|
+
additional_dependencies: ["bandit[toml]"]
|
|
32
|
+
|
|
33
|
+
# 2. Поиск "забытых" секретов и паролей (усиленный)
|
|
34
|
+
- repo: https://github.com/Yelp/detect-secrets
|
|
35
|
+
rev: v1.5.0
|
|
36
|
+
hooks:
|
|
37
|
+
- id: detect-secrets
|
|
38
|
+
# Baseline will be added after manual creation
|
|
@@ -1,29 +1,38 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
## [0.1.
|
|
9
|
-
|
|
10
|
-
### Added
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
- **
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
- **
|
|
21
|
-
- **
|
|
22
|
-
- **Redis
|
|
23
|
-
- **
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.1.1] - 2025-03-09
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **CI/CD Automation**: Integrated GitHub Actions for automated publishing to PyPI using Trusted Publishers (OIDC).
|
|
12
|
+
- **Project Metadata**: Added comprehensive project URLs (Documentation, Repository, Issues, Changelog) to `pyproject.toml` for better PyPI presentation.
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
- **Documentation Links**: Corrected broken documentation links in `README.md` to point to the actual GitHub Pages site.
|
|
16
|
+
|
|
17
|
+
## [0.1.0] - 2025-03-09
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
- **Initial Library Release**: Migration and adaptation of core infrastructure from production projects into a reusable feature-based framework.
|
|
21
|
+
- **Feature-based Architecture**: Implementation of `BaseBotOrchestrator` and `Director` for stateless UI management.
|
|
22
|
+
- **Redis Integration**: Stream processing, consumer groups support, and Redis-based dispatching.
|
|
23
|
+
- **FSM Enhancements**: `GarbageStateRegistry` for automatic UI cleanup and advanced state management.
|
|
24
|
+
- **Unified View System**: `ViewSender` and `UnifiedViewDTO` for consistent message rendering across different platforms.
|
|
25
|
+
- **I18n Engine**: Custom Fluent-based locales compiler with isolation support.
|
|
26
|
+
- **CLI Tools**: Scaffolding templates for rapid feature development.
|
|
27
|
+
- **Multi-language Documentation**: Comprehensive guides and API references in English and Russian.
|
|
28
|
+
- **DevOps Infrastructure**: Pre-commit hooks, Ruff/Mypy configurations, and GitHub Actions for docs.
|
|
29
|
+
- **Final Polish**: Refined `Director` logic, `BotBuilder` factory, and `RouterBuilder` for better stability.
|
|
30
|
+
- **Enhanced State Management**: Improved `StateManager` and `FSM` handlers for more robust session control.
|
|
31
|
+
- **Redis Dispatcher Optimization**: Fine-tuned stream processing and error handling in `RedisDispatcher`.
|
|
32
|
+
- **Test Coverage**: Added comprehensive unit tests for all core modules.
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
- Refactored production code into a modular library structure.
|
|
36
|
+
- Standardized DTOs and protocols for better extensibility.
|
|
37
|
+
- Optimized Redis Stream processing for high-load scenarios.
|
|
38
|
+
- Improved type safety across the entire codebase (Mypy strict mode).
|
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
# codex-bot — AI Context
|
|
2
|
-
|
|
3
|
-
Feature-based Aiogram framework library. MIT license, public GitHub.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Agent Memory
|
|
8
|
-
|
|
9
|
-
> **Memory directory:** `C:\Users\prime\.claude\projects\C--install-progect-codex-bot\memory\`
|
|
10
|
-
>
|
|
11
|
-
> Агент из любого проекта: читай `MEMORY.md` там — это индекс.
|
|
12
|
-
> Детали в: `architecture.md`, `modules.md`, `fixes.md`
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Структура пакета
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
src/codex_bot/
|
|
20
|
-
├── base/ ← BaseBotOrchestrator[T] (ABC), UnifiedViewDTO, ViewResultDTO
|
|
21
|
-
├── director/ ← Director, OrchestratorProtocol, ContainerProtocol, SceneConfig
|
|
22
|
-
├── fsm/ ← BaseStateManager, GarbageStateRegistry, common_fsm_router
|
|
23
|
-
├── sender/ ← ViewSender (stateless), SenderManager, SenderKeys
|
|
24
|
-
├── redis/ ← RedisRouter, BotRedisDispatcher, RedisStreamProcessor
|
|
25
|
-
├── animation/ ← UIAnimationService, AnimationType
|
|
26
|
-
├── helper/ ← ContextHelper
|
|
27
|
-
├── url_signer/ ← UrlSignerService
|
|
28
|
-
└── engine/ ← инфраструктура "под капотом"
|
|
29
|
-
├── middlewares/ ← ThrottlingMiddleware, ContainerMiddleware, UserValidationMiddleware
|
|
30
|
-
├── discovery/ ← FeatureDiscoveryService (service.py)
|
|
31
|
-
├── factory/ ← BotBuilder (bot_builder.py)
|
|
32
|
-
├── router_builder/ ← collect_feature_routers, build_main_router (router_builder.py)
|
|
33
|
-
├── http/ ← BaseApiClient, ApiClientError (api_client.py)
|
|
34
|
-
└── i18n/ ← compile_locales (locales_compiler.py)
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Стандарты (обязательно)
|
|
40
|
-
|
|
41
|
-
- **Packaging**: Hatchling, PEP 621
|
|
42
|
-
- **Docstrings**: Google style — Args / Returns / Example
|
|
43
|
-
- **Docs**: MkDocs Material + mkdocstrings
|
|
44
|
-
- **DTO**: `frozen=True, arbitrary_types_allowed=True`, мутации через `model_copy(update=...)`
|
|
45
|
-
- **Оркестраторы**: stateless `Generic[PayloadT]`, `director` явный аргумент
|
|
46
|
-
- **Fail Fast**: умный `except ImportError` (проверяем `e.name == module_path`)
|
|
47
|
-
- **Redis**: SET NX вместо EXISTS + SET (атомарно, нет race condition)
|
|
48
|
-
- **SecurityMiddleware**: удалён навсегда (иллюзорная защита + лишний HGETALL)
|
|
1
|
+
# codex-bot — AI Context
|
|
2
|
+
|
|
3
|
+
Feature-based Aiogram framework library. MIT license, public GitHub.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Agent Memory
|
|
8
|
+
|
|
9
|
+
> **Memory directory:** `C:\Users\prime\.claude\projects\C--install-progect-codex-bot\memory\`
|
|
10
|
+
>
|
|
11
|
+
> Агент из любого проекта: читай `MEMORY.md` там — это индекс.
|
|
12
|
+
> Детали в: `architecture.md`, `modules.md`, `fixes.md`
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Структура пакета
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
src/codex_bot/
|
|
20
|
+
├── base/ ← BaseBotOrchestrator[T] (ABC), UnifiedViewDTO, ViewResultDTO
|
|
21
|
+
├── director/ ← Director, OrchestratorProtocol, ContainerProtocol, SceneConfig
|
|
22
|
+
├── fsm/ ← BaseStateManager, GarbageStateRegistry, common_fsm_router
|
|
23
|
+
├── sender/ ← ViewSender (stateless), SenderManager, SenderKeys
|
|
24
|
+
├── redis/ ← RedisRouter, BotRedisDispatcher, RedisStreamProcessor
|
|
25
|
+
├── animation/ ← UIAnimationService, AnimationType
|
|
26
|
+
├── helper/ ← ContextHelper
|
|
27
|
+
├── url_signer/ ← UrlSignerService
|
|
28
|
+
└── engine/ ← инфраструктура "под капотом"
|
|
29
|
+
├── middlewares/ ← ThrottlingMiddleware, ContainerMiddleware, UserValidationMiddleware
|
|
30
|
+
├── discovery/ ← FeatureDiscoveryService (service.py)
|
|
31
|
+
├── factory/ ← BotBuilder (bot_builder.py)
|
|
32
|
+
├── router_builder/ ← collect_feature_routers, build_main_router (router_builder.py)
|
|
33
|
+
├── http/ ← BaseApiClient, ApiClientError (api_client.py)
|
|
34
|
+
└── i18n/ ← compile_locales (locales_compiler.py)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Стандарты (обязательно)
|
|
40
|
+
|
|
41
|
+
- **Packaging**: Hatchling, PEP 621
|
|
42
|
+
- **Docstrings**: Google style — Args / Returns / Example
|
|
43
|
+
- **Docs**: MkDocs Material + mkdocstrings
|
|
44
|
+
- **DTO**: `frozen=True, arbitrary_types_allowed=True`, мутации через `model_copy(update=...)`
|
|
45
|
+
- **Оркестраторы**: stateless `Generic[PayloadT]`, `director` явный аргумент
|
|
46
|
+
- **Fail Fast**: умный `except ImportError` (проверяем `e.name == module_path`)
|
|
47
|
+
- **Redis**: SET NX вместо EXISTS + SET (атомарно, нет race condition)
|
|
48
|
+
- **SecurityMiddleware**: удалён навсегда (иллюзорная защита + лишний HGETALL)
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codex-bot
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: Feature-based Aiogram framework library — reusable infrastructure for Telegram bots
|
|
5
|
+
Project-URL: Homepage, https://github.com/codexdlc/codex-bot
|
|
6
|
+
Project-URL: Documentation, https://codexdlc.github.io/codex-bot/
|
|
7
|
+
Project-URL: Repository, https://github.com/codexdlc/codex-bot
|
|
8
|
+
Project-URL: Changelog, https://github.com/codexdlc/codex-bot/blob/main/CHANGELOG.md
|
|
9
|
+
Project-URL: Issues, https://github.com/codexdlc/codex-bot/issues
|
|
5
10
|
Author: Codex Team
|
|
6
11
|
License: MIT
|
|
7
12
|
License-File: LICENSE
|
|
@@ -100,8 +105,8 @@ builder.run_polling()
|
|
|
100
105
|
|
|
101
106
|
## 📚 Documentation
|
|
102
107
|
|
|
103
|
-
- [English Documentation](https://
|
|
104
|
-
- [Русская документация](https://
|
|
108
|
+
- [English Documentation](https://codexdlc.github.io/codex-bot/en_EN/)
|
|
109
|
+
- [Русская документация](https://codexdlc.github.io/codex-bot/ru_RU/)
|
|
105
110
|
- [**Changelog**](CHANGELOG.md) — see what's new in the latest versions.
|
|
106
111
|
|
|
107
112
|
---
|
|
@@ -55,8 +55,8 @@ builder.run_polling()
|
|
|
55
55
|
|
|
56
56
|
## 📚 Documentation
|
|
57
57
|
|
|
58
|
-
- [English Documentation](https://
|
|
59
|
-
- [Русская документация](https://
|
|
58
|
+
- [English Documentation](https://codexdlc.github.io/codex-bot/en_EN/)
|
|
59
|
+
- [Русская документация](https://codexdlc.github.io/codex-bot/ru_RU/)
|
|
60
60
|
- [**Changelog**](CHANGELOG.md) — see what's new in the latest versions.
|
|
61
61
|
|
|
62
62
|
---
|
|
@@ -1,142 +1,142 @@
|
|
|
1
|
-
# 🧭 Documentation Standard for codex-bot
|
|
2
|
-
|
|
3
|
-
> **AUTHORITY:** This document defines how documentation is written, structured, and maintained in the `codex-bot` library.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 1. 📜 Core Philosophy
|
|
8
|
-
|
|
9
|
-
We maintain documentation in **two languages** to ensure international accessibility while keeping the local community engaged.
|
|
10
|
-
|
|
11
|
-
### 🇬🇧 English (Primary / Technical Truth)
|
|
12
|
-
|
|
13
|
-
- **Mandatory for:** All Pull Requests and technical specifications.
|
|
14
|
-
- **Location:**
|
|
15
|
-
- `docs/api/` — Technical API reference (auto-generated from docstrings).
|
|
16
|
-
- `docs/en_EN/` — Conceptual guides and architectural mirroring.
|
|
17
|
-
- **Content:**
|
|
18
|
-
- Full technical specifications.
|
|
19
|
-
- API documentation (via `docs/api/`).
|
|
20
|
-
- Code examples and integration guides.
|
|
21
|
-
- **Goal:** Single source of truth. If code contradicts EN docs, it is a bug.
|
|
22
|
-
|
|
23
|
-
### 🇷🇺 Russian (Secondary / Conceptual Hub)
|
|
24
|
-
|
|
25
|
-
- **Optional for Contributors:** If you don't speak Russian, write EN docs. Maintainers will add RU translation.
|
|
26
|
-
- **Location:** `docs/ru_RU/` (mirrors folder structure).
|
|
27
|
-
- **Content:**
|
|
28
|
-
- Conceptual translation (the "why" and "how").
|
|
29
|
-
- Links to `docs/api/` for technical details instead of duplication.
|
|
30
|
-
- Architect's mental model and design decision explanations.
|
|
31
|
-
- **Goal:** Help Russian-speaking developers understand the "why" behind the framework's architecture.
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## 2. ☯️ Twin Realms Principle
|
|
36
|
-
|
|
37
|
-
Documentation languages serve different purposes:
|
|
38
|
-
|
|
39
|
-
### 🇬🇧 EN = Technical Truth
|
|
40
|
-
|
|
41
|
-
- **For:** AI generators, external libraries, standards compliance.
|
|
42
|
-
- **Format:** Granular (mirrors `src/codex_bot/` structure).
|
|
43
|
-
- **Contains:**
|
|
44
|
-
- API Reference (in `docs/api/`).
|
|
45
|
-
- Mermaid Diagrams (Sequence, Class, ER).
|
|
46
|
-
- Integration patterns.
|
|
47
|
-
|
|
48
|
-
### 🇷🇺 RU = Architect's Mind
|
|
49
|
-
|
|
50
|
-
- **For:** Human developers, system understanding.
|
|
51
|
-
- **Format:** Aggregated (1 folder = 1 README).
|
|
52
|
-
- **Contains:**
|
|
53
|
-
- **The Why:** Why this solution (e.g., why Stateless Orchestrators) was chosen.
|
|
54
|
-
- **The Flow:** How data flows through the system (simplified).
|
|
55
|
-
- **Links:** References to `docs/api/` files for technical details.
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## 3. 🗂️ Structure Mirroring Rule
|
|
60
|
-
|
|
61
|
-
Documentation structure **MUST** mirror the code structure in `src/codex_bot/`.
|
|
62
|
-
|
|
63
|
-
### Mapping Example
|
|
64
|
-
|
|
65
|
-
| Code Location | Documentation Location (EN/RU) |
|
|
66
|
-
|:---|:---|
|
|
67
|
-
| `src/codex_bot/base/` | `docs/[lang]/architecture/base/` |
|
|
68
|
-
| `src/codex_bot/engine/router_builder/` | `docs/[lang]/architecture/engine/router_builder/` |
|
|
69
|
-
| `src/codex_bot/redis/` | `docs/[lang]/architecture/redis/` |
|
|
70
|
-
|
|
71
|
-
### Why?
|
|
72
|
-
|
|
73
|
-
- **1:1 Mapping:** Easy to find docs for any code module.
|
|
74
|
-
- **No Orphans:** Prevents documentation from getting lost.
|
|
75
|
-
- **Refactoring Safety:** When code moves, docs move with it.
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## 4. 🧭 Navigation Standard
|
|
80
|
-
|
|
81
|
-
Every documentation file must be easily navigable.
|
|
82
|
-
|
|
83
|
-
### Breadcrumbs (Mandatory)
|
|
84
|
-
|
|
85
|
-
Every file **MUST** start with a navigation header:
|
|
86
|
-
|
|
87
|
-
```markdown
|
|
88
|
-
[⬅️ Back](../README.md) | [🏠 Docs Root](../../README.md)
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
- **Back:** Links to the current directory's `README.md`.
|
|
92
|
-
- **Docs Root:** Links to the documentation root (`docs/README.md`).
|
|
93
|
-
|
|
94
|
-
### Index Files (README.md)
|
|
95
|
-
|
|
96
|
-
Every directory **MUST** have a `README.md` acting as a navigation hub.
|
|
97
|
-
|
|
98
|
-
**Required Structure:**
|
|
99
|
-
|
|
100
|
-
1. **Header:** Emoji 📂 + Section Name.
|
|
101
|
-
2. **Navigation:** Breadcrumbs.
|
|
102
|
-
3. **Description:** Short summary (2-3 sentences).
|
|
103
|
-
4. **Map:** Table or list of files in **logical reading order** (not alphabetical).
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## 5. 📝 File Naming & Organization
|
|
108
|
-
|
|
109
|
-
### Naming Conventions
|
|
110
|
-
|
|
111
|
-
- **Format:** `snake_case.md` (e.g., `orchestrator_logic.md`).
|
|
112
|
-
- **No Prefixes:** Do NOT use `01_`, `02_` prefixes in filenames.
|
|
113
|
-
- **Reading Order:** Defined in `README.md` map.
|
|
114
|
-
|
|
115
|
-
### Language Folders
|
|
116
|
-
|
|
117
|
-
All documents **MUST** reside in:
|
|
118
|
-
|
|
119
|
-
- `docs/api/` (Technical EN)
|
|
120
|
-
- `docs/en_EN/` (Conceptual EN)
|
|
121
|
-
- `docs/ru_RU/` (Conceptual RU)
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## 6. ✅ Markdown Linting Rules (Strict)
|
|
126
|
-
|
|
127
|
-
1. **MD047 (End with Newline):** Every file must end with exactly **one newline** (`\n`).
|
|
128
|
-
2. **MD032 (List Spacing):** Blank line before and after any list.
|
|
129
|
-
3. **MD007 (Indentation):** Use **2 spaces** for nested lists.
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## 7. 🚫 Common Mistakes
|
|
134
|
-
|
|
135
|
-
- **❌ Duplicating Code in RU Docs:** Link to `docs/api/` instead.
|
|
136
|
-
- **❌ Numbered Prefixes:** Use `README.md` map for order.
|
|
137
|
-
- **❌ Missing Breadcrumbs:** Always add the navigation header.
|
|
138
|
-
- **❌ Language-neutral folders:** Use `en_EN` or `ru_RU`.
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
**Last Updated:** 2025-02-07
|
|
1
|
+
# 🧭 Documentation Standard for codex-bot
|
|
2
|
+
|
|
3
|
+
> **AUTHORITY:** This document defines how documentation is written, structured, and maintained in the `codex-bot` library.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. 📜 Core Philosophy
|
|
8
|
+
|
|
9
|
+
We maintain documentation in **two languages** to ensure international accessibility while keeping the local community engaged.
|
|
10
|
+
|
|
11
|
+
### 🇬🇧 English (Primary / Technical Truth)
|
|
12
|
+
|
|
13
|
+
- **Mandatory for:** All Pull Requests and technical specifications.
|
|
14
|
+
- **Location:**
|
|
15
|
+
- `docs/api/` — Technical API reference (auto-generated from docstrings).
|
|
16
|
+
- `docs/en_EN/` — Conceptual guides and architectural mirroring.
|
|
17
|
+
- **Content:**
|
|
18
|
+
- Full technical specifications.
|
|
19
|
+
- API documentation (via `docs/api/`).
|
|
20
|
+
- Code examples and integration guides.
|
|
21
|
+
- **Goal:** Single source of truth. If code contradicts EN docs, it is a bug.
|
|
22
|
+
|
|
23
|
+
### 🇷🇺 Russian (Secondary / Conceptual Hub)
|
|
24
|
+
|
|
25
|
+
- **Optional for Contributors:** If you don't speak Russian, write EN docs. Maintainers will add RU translation.
|
|
26
|
+
- **Location:** `docs/ru_RU/` (mirrors folder structure).
|
|
27
|
+
- **Content:**
|
|
28
|
+
- Conceptual translation (the "why" and "how").
|
|
29
|
+
- Links to `docs/api/` for technical details instead of duplication.
|
|
30
|
+
- Architect's mental model and design decision explanations.
|
|
31
|
+
- **Goal:** Help Russian-speaking developers understand the "why" behind the framework's architecture.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 2. ☯️ Twin Realms Principle
|
|
36
|
+
|
|
37
|
+
Documentation languages serve different purposes:
|
|
38
|
+
|
|
39
|
+
### 🇬🇧 EN = Technical Truth
|
|
40
|
+
|
|
41
|
+
- **For:** AI generators, external libraries, standards compliance.
|
|
42
|
+
- **Format:** Granular (mirrors `src/codex_bot/` structure).
|
|
43
|
+
- **Contains:**
|
|
44
|
+
- API Reference (in `docs/api/`).
|
|
45
|
+
- Mermaid Diagrams (Sequence, Class, ER).
|
|
46
|
+
- Integration patterns.
|
|
47
|
+
|
|
48
|
+
### 🇷🇺 RU = Architect's Mind
|
|
49
|
+
|
|
50
|
+
- **For:** Human developers, system understanding.
|
|
51
|
+
- **Format:** Aggregated (1 folder = 1 README).
|
|
52
|
+
- **Contains:**
|
|
53
|
+
- **The Why:** Why this solution (e.g., why Stateless Orchestrators) was chosen.
|
|
54
|
+
- **The Flow:** How data flows through the system (simplified).
|
|
55
|
+
- **Links:** References to `docs/api/` files for technical details.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 3. 🗂️ Structure Mirroring Rule
|
|
60
|
+
|
|
61
|
+
Documentation structure **MUST** mirror the code structure in `src/codex_bot/`.
|
|
62
|
+
|
|
63
|
+
### Mapping Example
|
|
64
|
+
|
|
65
|
+
| Code Location | Documentation Location (EN/RU) |
|
|
66
|
+
|:---|:---|
|
|
67
|
+
| `src/codex_bot/base/` | `docs/[lang]/architecture/base/` |
|
|
68
|
+
| `src/codex_bot/engine/router_builder/` | `docs/[lang]/architecture/engine/router_builder/` |
|
|
69
|
+
| `src/codex_bot/redis/` | `docs/[lang]/architecture/redis/` |
|
|
70
|
+
|
|
71
|
+
### Why?
|
|
72
|
+
|
|
73
|
+
- **1:1 Mapping:** Easy to find docs for any code module.
|
|
74
|
+
- **No Orphans:** Prevents documentation from getting lost.
|
|
75
|
+
- **Refactoring Safety:** When code moves, docs move with it.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 4. 🧭 Navigation Standard
|
|
80
|
+
|
|
81
|
+
Every documentation file must be easily navigable.
|
|
82
|
+
|
|
83
|
+
### Breadcrumbs (Mandatory)
|
|
84
|
+
|
|
85
|
+
Every file **MUST** start with a navigation header:
|
|
86
|
+
|
|
87
|
+
```markdown
|
|
88
|
+
[⬅️ Back](../README.md) | [🏠 Docs Root](../../README.md)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
- **Back:** Links to the current directory's `README.md`.
|
|
92
|
+
- **Docs Root:** Links to the documentation root (`docs/README.md`).
|
|
93
|
+
|
|
94
|
+
### Index Files (README.md)
|
|
95
|
+
|
|
96
|
+
Every directory **MUST** have a `README.md` acting as a navigation hub.
|
|
97
|
+
|
|
98
|
+
**Required Structure:**
|
|
99
|
+
|
|
100
|
+
1. **Header:** Emoji 📂 + Section Name.
|
|
101
|
+
2. **Navigation:** Breadcrumbs.
|
|
102
|
+
3. **Description:** Short summary (2-3 sentences).
|
|
103
|
+
4. **Map:** Table or list of files in **logical reading order** (not alphabetical).
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 5. 📝 File Naming & Organization
|
|
108
|
+
|
|
109
|
+
### Naming Conventions
|
|
110
|
+
|
|
111
|
+
- **Format:** `snake_case.md` (e.g., `orchestrator_logic.md`).
|
|
112
|
+
- **No Prefixes:** Do NOT use `01_`, `02_` prefixes in filenames.
|
|
113
|
+
- **Reading Order:** Defined in `README.md` map.
|
|
114
|
+
|
|
115
|
+
### Language Folders
|
|
116
|
+
|
|
117
|
+
All documents **MUST** reside in:
|
|
118
|
+
|
|
119
|
+
- `docs/api/` (Technical EN)
|
|
120
|
+
- `docs/en_EN/` (Conceptual EN)
|
|
121
|
+
- `docs/ru_RU/` (Conceptual RU)
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 6. ✅ Markdown Linting Rules (Strict)
|
|
126
|
+
|
|
127
|
+
1. **MD047 (End with Newline):** Every file must end with exactly **one newline** (`\n`).
|
|
128
|
+
2. **MD032 (List Spacing):** Blank line before and after any list.
|
|
129
|
+
3. **MD007 (Indentation):** Use **2 spaces** for nested lists.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## 7. 🚫 Common Mistakes
|
|
134
|
+
|
|
135
|
+
- **❌ Duplicating Code in RU Docs:** Link to `docs/api/` instead.
|
|
136
|
+
- **❌ Numbered Prefixes:** Use `README.md` map for order.
|
|
137
|
+
- **❌ Missing Breadcrumbs:** Always add the navigation header.
|
|
138
|
+
- **❌ Language-neutral folders:** Use `en_EN` or `ru_RU`.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
**Last Updated:** 2025-02-07
|