Skip to content
Merged

Cli #11

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
337aa24
cli styleguide
p141592 May 9, 2026
b5771ca
cli styleguide
p141592 May 9, 2026
8b3fd56
Работаю над todo
p141592 May 10, 2026
91d8016
Работаю над todo
p141592 May 10, 2026
c2fb67d
Работаю над todo
p141592 May 10, 2026
928a93f
Работаю над todo
p141592 May 10, 2026
08f40a0
Работаю над todo
p141592 May 10, 2026
66f39e7
Работаю над todo
p141592 May 10, 2026
3c142a7
Работаю над todo
p141592 May 10, 2026
abae6a3
Работаю над todo
p141592 May 10, 2026
070869d
Работаю над todo
p141592 May 10, 2026
365c9c6
Работаю над todo
p141592 May 10, 2026
4455e62
Работаю над todo
p141592 May 10, 2026
25475a0
Работаю над todo
p141592 May 10, 2026
e6c5d89
Работаю над todo
p141592 May 10, 2026
f0dd860
Работаю над todo
p141592 May 10, 2026
5f36f02
Stage 1: CLI Dependency and Shell
p141592 May 10, 2026
69cbeff
Stage 2: Errors, UI, and Safe Output
p141592 May 10, 2026
f5876b6
Stage 3A: Account Store Primitives
p141592 May 10, 2026
cded6e1
Stage 3B: Account Commands and Secret Input
p141592 May 10, 2026
c453fe0
Stage 4A: Typed Registry and Discovery Report
p141592 May 10, 2026
3357ee3
4B: Registry Help, Aliases, and Collisions
p141592 May 10, 2026
64eb15f
Stage 4C: CLI Coverage and Architecture Lint
p141592 May 10, 2026
b8c7dfe
Stage 5: Generic Input Coercion
p141592 May 10, 2026
eb1c035
Stage 6: Generic Invocation Engine
p141592 May 10, 2026
7fb52f5
Stage 6B: Command Adapter Extension Point
p141592 May 10, 2026
dffb68d
Stage 7: Result Serialization and Pagination
p141592 May 10, 2026
4bd4f4f
Stage 8: First Vertical API Slice
p141592 May 10, 2026
0a9b79c
Stage 9: Read-Only All-Domain API Coverage
p141592 May 10, 2026
e30b402
Stage 10A: Write Safety Primitives
p141592 May 10, 2026
5c9869a
Stage 10B: Write Command Coverage by Domain Waves
p141592 May 10, 2026
8cb9771
Stage 10C: Strict CLI Coverage Gate
p141592 May 10, 2026
0299d1a
Stage 11: Public Helper Workflows
p141592 May 10, 2026
edbd64c
Stage 12: Config, Status, Doctor, and Completion
p141592 May 10, 2026
ec8aa69
Stage 13: Documentation
p141592 May 10, 2026
664e9a9
Stage 13: Documentation
p141592 May 10, 2026
4008e68
complite
p141592 May 10, 2026
199d52e
complite
p141592 May 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
506 changes: 506 additions & 0 deletions .ai/cli-guidelines.md

Large diffs are not rendered by default.

53 changes: 52 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,58 @@ and this project adheres to Semantic Versioning.
## [Unreleased]

### Added
- Нет изменений.
- Добавлена базовая CLI-оболочка: `avito --help`, `avito --version`, `avito version`,
`avito help` и единый вход через `python -m avito`.
- Задокументирован первый CLI-контракт: глобальные флаги, режимы вывода,
разделение stdout/stderr, безопасный JSON/human-рендеринг ошибок и стабильные
exit codes.
- Добавлены локальные CLI-команды учетных записей: `avito account add`,
`avito account list`, `avito account use`, `avito account current`,
`avito account delete` и alias `avito account remove`.
- CLI хранит учетные записи в локальных JSON-файлах с правами доступа к файлам и
маскирует секреты во всех режимах вывода; первая версия использует plaintext
storage без OS keychain.
- Для безопасного ввода `client_secret` добавлены скрытый интерактивный prompt и
`--client-secret-stdin`; `--client-secret` и совместимый `--api-key` оставлены
для явной автоматизации с учетом риска попадания значения в историю shell.
- Добавлена registry-backed справка `avito help <resource>` и
`avito help <resource> <action>` для локальных команд, helper workflows,
aliases и API command candidates без создания `AvitoClient`.
- Добавлена основа сериализации результатов CLI: SDK-модели выводятся через
публичный `model_dump()` / `to_dict()`, секреты маскируются после
сериализации, а `PaginatedList` по умолчанию выгружает только ограниченный
набор страниц.
- Подключен первый registry-backed API slice CLI: `avito account get-self` и
`avito account get-balance --user-id ...` вызывают публичный `AvitoClient`,
проходят через общий слой приведения аргументов, сериализации и безопасного
JSON/human-вывода.
- Расширено read-only CLI-покрытие API: все поддержанные sync Swagger-bound
GET/HEAD-команды регистрируются через CLI registry, проходят fake-transport
smoke coverage и проверяются фазой `scripts/lint_cli_coverage.py --phase read`;
read-bindings без достаточных factory/method аргументов оформлены как
временные исключения до Stage 10C.
- Добавлены CLI safety primitives для будущих write/destructive API-команд:
registry хранит проверенную safety policy, destructive/expensive команды
требуют prompt, `--yes` или точный `--confirm`, а `--dry-run` публикуется
только для SDK-методов с публичным `dry_run`.
- Расширено write CLI-покрытие API: generic-safe sync Swagger-bound write-команды
регистрируются через CLI registry, проходят fake-transport smoke coverage и
проверяются фазой `scripts/lint_cli_coverage.py --phase write`; write-bindings,
которым нужен CLI adapter или уточнение binding metadata, оформлены как
временные исключения до Stage 10C.
- Добавлены публичные CLI helper workflows: `account-health show`,
`listing-health show`, `chat-summary show`, `order-summary show`,
`review-summary show`, `promotion-summary show` и `capabilities show`;
команды вызывают только публичные методы `AvitoClient`, поддерживают JSON/human
вывод и не входят в Swagger one-to-one coverage.
- Добавлены локальные CLI-команды конфигурации и диагностики: `avito config get`,
`avito config set`, `avito config unset`, `avito config list --show-source`,
`avito status`, `avito doctor` и `avito completion bash|zsh|fish`; команды
работают без сетевых вызовов и не раскрывают секреты.
- Добавлена публичная CLI-документация: quickstart в README, how-to для
профилей и ежедневных workflows, стабильный reference контракт, объяснение
архитектуры registry/coverage и ссылки из разделов security, auth/config и
API coverage.

## [2.1.0] - 2026-05-08

Expand Down
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ MKDOCS_ENV=DISABLE_MKDOCS_2_WARNING=true NO_MKDOCS_2_WARNING=1

check: test quality

quality: typecheck lint python-guidelines-lint swagger-lint architecture-lint async-parity-lint docstring-lint build
quality: typecheck lint python-guidelines-lint swagger-lint cli-lint architecture-lint async-parity-lint docstring-lint build

build: clean
poetry build
Expand Down Expand Up @@ -41,6 +41,9 @@ swagger-update:
swagger-lint:
poetry run python scripts/lint_swagger_bindings.py --strict

cli-lint:
poetry run python scripts/lint_cli_coverage.py --strict

architecture-lint:
poetry run python scripts/lint_architecture.py

Expand Down
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,20 @@ print(ad.title)

По умолчанию настройки читаются из переменных окружения с префиксом `AVITO_`.

CLI использует тот же публичный SDK и удобен для smoke-проверок, скриптов и
операционных задач:

```bash
avito account add main --client-id client-id --user-id 123
avito --profile main account get-self
avito --json --no-input --profile main account get-balance --user-id 123
```

`account add` спросит `Client Secret` скрытым prompt. Для CI используйте
`--client-secret-stdin`, чтобы не передавать секрет в аргументах shell.
Подробно: [CLI how-to](https://18studio.github.io/avito_python_api/how-to/cli/)
и [CLI reference](https://18studio.github.io/avito_python_api/reference/cli/).

`avito-py` — Python SDK для работы с Avito API через единые sync/async фасады
`AvitoClient` и `AsyncAvitoClient`.

Expand Down
11 changes: 2 additions & 9 deletions avito/__main__.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
"""Точка входа модуля для локальной smoke-проверки."""

from avito.client import AvitoClient


def main() -> None:
"""Создает фасад, чтобы `python -m avito` работал как smoke-проверка."""

AvitoClient()
"""Точка входа `python -m avito`."""

from avito.cli.app import main

if __name__ == "__main__":
main()
5 changes: 5 additions & 0 deletions avito/cli/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
"""CLI package for avito-py."""

from avito.cli.app import app, main

__all__ = ("app", "main")
Loading
Loading