# GS Tool - инструмент для разработки телеметрических скриптов
GS Tool - это утилита командной строки для создания, сборки и публикации телеметрических скриптов, написанных на языке Pawn. Инструмент автоматизирует процесс разработки от создания проекта до публикации готовых скриптов на сервере.
## Оглавление
- [Возможности](#возможности)
- [Требования](#требования)
- [Установка](#установка)
- [Быстрый старт](#быстрый-старт)
- [Использование во время разработки](#использование-во-время-разработки)
- [Команды](#команды)
- [Конфигурация](#конфигурация)
- [Структура проекта](#структура-проекта)
- [Рабочий процесс](#рабочий-процесс)
- [Сборка пакета](#сборка-пакета)
- [Решение проблем](#решение-проблем)
## Возможности
- ✨ Создание проектов по шаблону
- 🔧 Валидация конфигурации и препроцессинг
- 📦 Компиляция Pawn скриптов встроенным компилятором
- 🚀 Создание релизов с версионированием
- 📤 Публикация скриптов на сервере
- 🛠️ Автоматическая генерация кода из JSON конфигурации
## Требования
- Python 3.7+
- pip (менеджер пакетов Python)
- Jinja2 (устанавливается автоматически)
- Click (устанавливается автоматически)
- Requests (устанавливается автоматически)
## Установка
### Установка из исходников
1. Клонируйте репозиторий:
```bash
git clone git@gl.7gis.ru:ng/gs_tools.git
cd gs_tools
```
2. Установите пакет в режиме разработки:
```bash
pip install -e .
```
Или для обычной установки:
```bash
pip install .
```
### Установка из PyPI (если опубликован)
```bash
pip install gs-tool
```
## Быстрый старт
1. **Создайте новый проект:**
```bash
gs create my_telemetry_script
cd my_telemetry_script
```
2. **Отредактируйте конфигурацию** в файле `gs_project.json`
3. **Напишите логику скрипта** в файле `main.p`
4. **Соберите проект:**
```bash
gs build
```
5. **Создайте релиз:**
```bash
gs release
```
6. **Опубликуйте на сервере:**
```bash
gs push
```
## Использование во время разработки
Если вы работаете с исходным кодом пакета и хотите тестировать изменения без переустановки:
1. Установите пакет в режиме разработки:
```bash
pip install -e .
```
2. Теперь любые изменения в исходном коде будут сразу доступны при вызове команды `gs`
3. Для отладки можно запускать напрямую через Python:
```bash
python -m gs_tool.cli create test_project
```
## Команды
### `gs create <name>`
Создает новый проект с указанным именем. Создается папка проекта со всеми необходимыми файлами:
- `gs_project.json` - конфигурация проекта
- `main.p` - основной файл скрипта
- `gs_natives.inc` - файл с нативными функциями
- `.gs_history/` - папка для хранения релизов
**Пример:**
```bash
gs create speed_monitor
```
### `gs preprocess`
Выполняет только препроцессинг: валидацию конфигурации и генерацию файла `project.inc`.
**Пример:**
```bash
gs preprocess
```
### `gs build`
Выполняет полную сборку проекта:
1. Препроцессинг (валидация + генерация кода)
2. Компиляция Pawn кода
3. Создание бинарного файла с заголовком
**Пример:**
```bash
gs build
```
Результаты:
- `main.amx` — результат компиляции Pawn
- локальный артефакт `<script_id>` (заголовок + AMX) для проверки
- при `gs release` формируется `<script_id>.bin` и попадает в архив
### `gs release`
Создает zip-архив текущей версии проекта для последующей публикации. Архив сохраняется в папке `.gs_history/`.
**Пример:**
```bash
gs release
```
### `gs push`
Публикует все созданные релизы на сервере. Использует настройки из конфигурационного файла.
**Пример:**
```bash
gs push
```
### `gs token`
Управление персональными токенами доступа (PAT):
- `gs token create` — выпуск токена (интерактивный вход по email/паролю, выбор компании, сохранение в `~/.gs_tool/config.json`).
Примеры:
```bash
gs token create --email you@example.com
gs token create --name ci-bot --scope scripts:write --scope descriptors:write --never-expires --email you@example.com
```
- `gs token list` — список токенов текущего пользователя.
```bash
gs token list
```
- `gs token revoke <token_id>` — отзыв токена.
```bash
gs token revoke abcdef0123456789
```
## Конфигурация
### Глобальная конфигурация
Файл конфигурации находится в `~/.gs_tool/config.json`:
```json
{
"server_url": "http://127.0.0.1:8000",
"company_id": "your_company_id",
"api_key": "your_api_key_here"
}
```
- `server_url` - адрес сервера для публикации скриптов
- `company_id` - идентификатор компании по умолчанию для заголовка `X-Company-ID`
- `api_key` - персональный токен (PAT) для авторизации (можно выпустить через `gs token create`)
### Конфигурация проекта
Файл `gs_project.json` содержит всю информацию о проекте:
```json
{
"script_id": "uuid-проекта",
"project_name": "имя_проекта",
"version": "0.0.1",
"description": "Описание скрипта",
"config": {
"uuid": "uuid-конфигурации",
"fields": [
{
"name": "speed_limit",
"type": "INT32",
"default": 60,
"min": "0",
"max": "200",
"ui": {
"category": "limits",
"widget": "spinbox",
"name": {"ru": "Ограничение скорости", "en": "Speed limit"},
"hint": {"ru": "Максимальная скорость", "en": "Maximum speed"},
"dimension": {"ru": "км/ч", "en": "km/h"}
}
}
]
},
"datasources": [
{
"name": "telemetry",
"uuid": "uuid-датасорса",
"fields": [
{"name": "speed", "type": "UINT32"},
{"name": "voltage", "type": "FLOAT"}
]
}
],
"subscriptions": [
{
"path": "/system/start",
"function": "start"
}
],
"api": {
"uuid": "uuid-api",
"endpoints": [
{
"name": "start",
"signature": [{"type": "FST_CELL"}]
}
]
}
}
```
### Поддерживаемые типы данных
- `INT8`, `INT16`, `INT32` - знаковые целые
- `UINT8`, `UINT16`, `UINT32` - беззнаковые целые
- `FLOAT` - число с плавающей точкой
- `STRING` - строка
- `ENUM` - перечисление
- `ARRAY` - массив
- `BOOL` - логическое значение
## Структура проекта
После создания проект имеет следующую структуру:
```
my_telemetry_script/
├── gs_project.json # Конфигурация проекта
├── main.p # Основной файл скрипта
├── gs_natives.inc # Нативные функции
├── project.inc # Сгенерированный файл (после препроцессинга)
├── main.amx # Скомпилированный байткод (после сборки)
└── .gs_history/ # История релизов
└── release_v0.0.1.zip
```
## Рабочий процесс
```mermaid
graph TD
A["gs create"] --> B["Создание проекта<br/>с шаблонами"]
B --> C["Редактирование<br/>gs_project.json"]
C --> D["Написание<br/>кода в main.p"]
D --> E["gs build"]
E --> F["Препроцессинг<br/>project.inc"]
F --> G["Компиляция<br/>pawncc"]
G --> H["Бинарный файл<br/>.bin"]
H --> I["gs release"]
I --> J["Архив релиза<br/>.zip"]
J --> K["gs push"]
K --> L["Публикация<br/>на сервере"]
```
## Сборка пакета
Для создания дистрибутива пакета:
1. Убедитесь, что у вас установлены необходимые инструменты:
```bash
pip install build twine
```
2. Создайте дистрибутивы:
```bash
python -m build
```
3. Для публикации на PyPI:
```bash
python -m twine upload dist/*
```
### Структура пакета
```
gs_tool/
├── __init__.py
├── cli.py # Основной CLI модуль
├── config.py # Работа с конфигурацией
├── project_template.json # Шаблон проекта
├── bin/ # Встроенный компилятор
│ ├── pawncc.exe
│ └── include/ # Include файлы компилятора
├── templates/ # Шаблоны для генерации кода
│ ├── gs_natives.inc
│ ├── main.p.j2
│ └── project.inc.j2
├── setup.py # Конфигурация установки
├── README.md # Этот файл
└── requirements.txt # Зависимости
```
## Решение проблем
### Ошибка "pawncc не найден"
Убедитесь, что:
1. Пакет установлен правильно и содержит `bin/pawncc.exe`
2. Или установите pawncc отдельно и добавьте его в PATH
### Ошибка компиляции
1. Проверьте синтаксис в `main.p`
2. Убедитесь, что все используемые функции объявлены в `gs_natives.inc`
3. Проверьте вывод компилятора на наличие конкретных ошибок
### Ошибка публикации
1. Проверьте настройки сервера в `~/.gs_tool/config.json`
2. Убедитесь, что API ключ актуален
3. Проверьте доступность сервера
### Отладка
Для отладки можно использовать функцию `Diagnostics()` в Pawn коде:
```pawn
Diagnostics("Debug message: %d", value);
```
## Лицензия
[Укажите вашу лицензию]
## Вклад в проект
[Инструкции для контрибьюторов]
## Контакты
[Контактная информация]
Raw data
{
"_id": null,
"home_page": "https://github.com/your-repo/gs_tool",
"name": "gs-tool",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": null,
"author": "Your Name",
"author_email": "your.email@example.com",
"download_url": "https://files.pythonhosted.org/packages/09/e0/72103f076233fe91d705be9be8f78f73d33519cf508dd446b7f8b3da2b7f/gs_tool-0.2.3.tar.gz",
"platform": null,
"description": "# GS Tool - \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\n\nGS Tool - \u044d\u0442\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f, \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Pawn. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.\n\n## \u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435\n\n- [\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438](#\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438)\n- [\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f](#\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f)\n- [\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430](#\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430)\n- [\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442](#\u0431\u044b\u0441\u0442\u0440\u044b\u0439-\u0441\u0442\u0430\u0440\u0442)\n- [\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438](#\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435-\u0432\u043e-\u0432\u0440\u0435\u043c\u044f-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438)\n- [\u041a\u043e\u043c\u0430\u043d\u0434\u044b](#\u043a\u043e\u043c\u0430\u043d\u0434\u044b)\n- [\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f](#\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f)\n- [\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430](#\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430-\u043f\u0440\u043e\u0435\u043a\u0442\u0430)\n- [\u0420\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441](#\u0440\u0430\u0431\u043e\u0447\u0438\u0439-\u043f\u0440\u043e\u0446\u0435\u0441\u0441)\n- [\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430](#\u0441\u0431\u043e\u0440\u043a\u0430-\u043f\u0430\u043a\u0435\u0442\u0430)\n- [\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c](#\u0440\u0435\u0448\u0435\u043d\u0438\u0435-\u043f\u0440\u043e\u0431\u043b\u0435\u043c)\n\n## \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438\n\n- \u2728 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443\n- \ud83d\udd27 \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433\n- \ud83d\udce6 \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f Pawn \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c\n- \ud83d\ude80 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u043e\u0432 \u0441 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c\n- \ud83d\udce4 \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435\n- \ud83d\udee0\ufe0f \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430 \u0438\u0437 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n\n## \u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\n\n- Python 3.7+\n- pip (\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 Python)\n- Jinja2 (\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438)\n- Click (\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438)\n- Requests (\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438)\n\n## \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n### \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432\n\n1. \u041a\u043b\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:\n```bash\ngit clone git@gl.7gis.ru:ng/gs_tools.git\ncd gs_tools\n```\n\n2. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043f\u0430\u043a\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438:\n```bash\npip install -e .\n```\n\n\u0418\u043b\u0438 \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:\n```bash\npip install .\n```\n\n### \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u0437 PyPI (\u0435\u0441\u043b\u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d)\n\n```bash\npip install gs-tool\n```\n\n## \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\n\n1. **\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442:**\n```bash\ngs create my_telemetry_script\ncd my_telemetry_script\n```\n\n2. **\u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e** \u0432 \u0444\u0430\u0439\u043b\u0435 `gs_project.json`\n\n3. **\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043b\u043e\u0433\u0438\u043a\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u0430** \u0432 \u0444\u0430\u0439\u043b\u0435 `main.p`\n\n4. **\u0421\u043e\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442:**\n```bash\ngs build\n```\n\n5. **\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0440\u0435\u043b\u0438\u0437:**\n```bash\ngs release\n```\n\n6. **\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0439\u0442\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435:**\n```bash\ngs push\n```\n\n## \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438\n\n\u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438:\n\n1. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043f\u0430\u043a\u0435\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438:\n```bash\npip install -e .\n```\n\n2. \u0422\u0435\u043f\u0435\u0440\u044c \u043b\u044e\u0431\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b `gs`\n\n3. \u0414\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0447\u0435\u0440\u0435\u0437 Python:\n```bash\npython -m gs_tool.cli create test_project\n```\n\n## \u041a\u043e\u043c\u0430\u043d\u0434\u044b\n\n### `gs create <name>`\n\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u043f\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438:\n- `gs_project.json` - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430\n- `main.p` - \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u0441\u043a\u0440\u0438\u043f\u0442\u0430\n- `gs_natives.inc` - \u0444\u0430\u0439\u043b \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438\n- `.gs_history/` - \u043f\u0430\u043f\u043a\u0430 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u043e\u0432\n\n**\u041f\u0440\u0438\u043c\u0435\u0440:**\n```bash\ngs create speed_monitor\n```\n\n### `gs preprocess`\n\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433: \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0444\u0430\u0439\u043b\u0430 `project.inc`.\n\n**\u041f\u0440\u0438\u043c\u0435\u0440:**\n```bash\ngs preprocess\n```\n\n### `gs build`\n\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:\n1. \u041f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 (\u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f + \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430)\n2. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f Pawn \u043a\u043e\u0434\u0430\n3. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c\n\n**\u041f\u0440\u0438\u043c\u0435\u0440:**\n```bash\ngs build\n```\n\n\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:\n- `main.amx` \u2014 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 Pawn\n- \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 `<script_id>` (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a + AMX) \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n- \u043f\u0440\u0438 `gs release` \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f `<script_id>.bin` \u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0430\u0440\u0445\u0438\u0432\n\n### `gs release`\n\u0421\u043e\u0437\u0434\u0430\u0435\u0442 zip-\u0430\u0440\u0445\u0438\u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0410\u0440\u0445\u0438\u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435 `.gs_history/`.\n\n**\u041f\u0440\u0438\u043c\u0435\u0440:**\n```bash\ngs release\n```\n\n### `gs push`\n\u041f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442 \u0432\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u043b\u0438\u0437\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.\n\n**\u041f\u0440\u0438\u043c\u0435\u0440:**\n```bash\ngs push\n```\n\n### `gs token`\n\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (PAT):\n\n- `gs token create` \u2014 \u0432\u044b\u043f\u0443\u0441\u043a \u0442\u043e\u043a\u0435\u043d\u0430 (\u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u043f\u043e email/\u043f\u0430\u0440\u043e\u043b\u044e, \u0432\u044b\u0431\u043e\u0440 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 `~/.gs_tool/config.json`).\n\n \u041f\u0440\u0438\u043c\u0435\u0440\u044b:\n ```bash\n gs token create --email you@example.com\n gs token create --name ci-bot --scope scripts:write --scope descriptors:write --never-expires --email you@example.com\n ```\n\n- `gs token list` \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n ```bash\n gs token list\n ```\n\n- `gs token revoke <token_id>` \u2014 \u043e\u0442\u0437\u044b\u0432 \u0442\u043e\u043a\u0435\u043d\u0430.\n\n ```bash\n gs token revoke abcdef0123456789\n ```\n\n## \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\n\n### \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\n\n\u0424\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 `~/.gs_tool/config.json`:\n\n```json\n{\n \"server_url\": \"http://127.0.0.1:8000\",\n \"company_id\": \"your_company_id\",\n \"api_key\": \"your_api_key_here\"\n}\n```\n\n- `server_url` - \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\n- `company_id` - \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 `X-Company-ID`\n- `api_key` - \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d (PAT) \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 (\u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 `gs token create`)\n\n### \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430\n\n\u0424\u0430\u0439\u043b `gs_project.json` \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0435:\n\n```json\n{\n \"script_id\": \"uuid-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\",\n \"project_name\": \"\u0438\u043c\u044f_\u043f\u0440\u043e\u0435\u043a\u0442\u0430\",\n \"version\": \"0.0.1\",\n \"description\": \"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\",\n \"config\": {\n \"uuid\": \"uuid-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\",\n \"fields\": [\n {\n \"name\": \"speed_limit\",\n \"type\": \"INT32\",\n \"default\": 60,\n \"min\": \"0\",\n \"max\": \"200\",\n \"ui\": {\n \"category\": \"limits\",\n \"widget\": \"spinbox\",\n \"name\": {\"ru\": \"\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438\", \"en\": \"Speed limit\"},\n \"hint\": {\"ru\": \"\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\", \"en\": \"Maximum speed\"},\n \"dimension\": {\"ru\": \"\u043a\u043c/\u0447\", \"en\": \"km/h\"}\n }\n }\n ]\n },\n \"datasources\": [\n {\n \"name\": \"telemetry\",\n \"uuid\": \"uuid-\u0434\u0430\u0442\u0430\u0441\u043e\u0440\u0441\u0430\",\n \"fields\": [\n {\"name\": \"speed\", \"type\": \"UINT32\"},\n {\"name\": \"voltage\", \"type\": \"FLOAT\"}\n ]\n }\n ],\n \"subscriptions\": [\n {\n \"path\": \"/system/start\",\n \"function\": \"start\"\n }\n ],\n \"api\": {\n \"uuid\": \"uuid-api\",\n \"endpoints\": [\n {\n \"name\": \"start\",\n \"signature\": [{\"type\": \"FST_CELL\"}]\n }\n ]\n }\n}\n```\n\n### \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445\n\n- `INT8`, `INT16`, `INT32` - \u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0446\u0435\u043b\u044b\u0435\n- `UINT8`, `UINT16`, `UINT32` - \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0446\u0435\u043b\u044b\u0435\n- `FLOAT` - \u0447\u0438\u0441\u043b\u043e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439\n- `STRING` - \u0441\u0442\u0440\u043e\u043a\u0430\n- `ENUM` - \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\n- `ARRAY` - \u043c\u0430\u0441\u0441\u0438\u0432\n- `BOOL` - \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n\n## \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\n\n\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442 \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:\n\n```\nmy_telemetry_script/\n\u251c\u2500\u2500 gs_project.json # \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430\n\u251c\u2500\u2500 main.p # \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u0441\u043a\u0440\u0438\u043f\u0442\u0430\n\u251c\u2500\u2500 gs_natives.inc # \u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\n\u251c\u2500\u2500 project.inc # \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b (\u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433\u0430)\n\u251c\u2500\u2500 main.amx # \u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u0430\u0439\u0442\u043a\u043e\u0434 (\u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438)\n\u2514\u2500\u2500 .gs_history/ # \u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0440\u0435\u043b\u0438\u0437\u043e\u0432\n \u2514\u2500\u2500 release_v0.0.1.zip\n```\n\n## \u0420\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\n\n```mermaid\ngraph TD\n A[\"gs create\"] --> B[\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<br/>\u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438\"]\n B --> C[\"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<br/>gs_project.json\"]\n C --> D[\"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435<br/>\u043a\u043e\u0434\u0430 \u0432 main.p\"]\n D --> E[\"gs build\"]\n E --> F[\"\u041f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433<br/>project.inc\"]\n F --> G[\"\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f<br/>pawncc\"]\n G --> H[\"\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b<br/>.bin\"]\n H --> I[\"gs release\"]\n I --> J[\"\u0410\u0440\u0445\u0438\u0432 \u0440\u0435\u043b\u0438\u0437\u0430<br/>.zip\"]\n J --> K[\"gs push\"]\n K --> L[\"\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f<br/>\u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435\"]\n```\n\n## \u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430\n\n\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430 \u043f\u0430\u043a\u0435\u0442\u0430:\n\n1. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b:\n```bash\npip install build twine\n```\n\n2. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u044b:\n```bash\npython -m build\n```\n\n3. \u0414\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430 PyPI:\n```bash\npython -m twine upload dist/*\n```\n\n### \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u043a\u0435\u0442\u0430\n\n```\ngs_tool/\n\u251c\u2500\u2500 __init__.py\n\u251c\u2500\u2500 cli.py # \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 CLI \u043c\u043e\u0434\u0443\u043b\u044c\n\u251c\u2500\u2500 config.py # \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439\n\u251c\u2500\u2500 project_template.json # \u0428\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0430\n\u251c\u2500\u2500 bin/ # \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\n\u2502 \u251c\u2500\u2500 pawncc.exe\n\u2502 \u2514\u2500\u2500 include/ # Include \u0444\u0430\u0439\u043b\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\n\u251c\u2500\u2500 templates/ # \u0428\u0430\u0431\u043b\u043e\u043d\u044b \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430\n\u2502 \u251c\u2500\u2500 gs_natives.inc\n\u2502 \u251c\u2500\u2500 main.p.j2\n\u2502 \u2514\u2500\u2500 project.inc.j2\n\u251c\u2500\u2500 setup.py # \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438\n\u251c\u2500\u2500 README.md # \u042d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b\n\u2514\u2500\u2500 requirements.txt # \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\n```\n\n## \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\n\n### \u041e\u0448\u0438\u0431\u043a\u0430 \"pawncc \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\"\n\n\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e:\n1. \u041f\u0430\u043a\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 `bin/pawncc.exe`\n2. \u0418\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 pawncc \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0438 \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0435\u0433\u043e \u0432 PATH\n\n### \u041e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438\n\n1. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0432 `main.p`\n2. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b \u0432 `gs_natives.inc`\n3. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0432\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a\n\n### \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438\n\n1. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 `~/.gs_tool/config.json`\n2. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e API \u043a\u043b\u044e\u0447 \u0430\u043a\u0442\u0443\u0430\u043b\u0435\u043d\n3. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\n\n### \u041e\u0442\u043b\u0430\u0434\u043a\u0430\n\n\u0414\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e `Diagnostics()` \u0432 Pawn \u043a\u043e\u0434\u0435:\n```pawn\nDiagnostics(\"Debug message: %d\", value);\n```\n\n## \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\n\n[\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0432\u0430\u0448\u0443 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e]\n\n## \u0412\u043a\u043b\u0430\u0434 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\n\n[\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u043e\u0440\u043e\u0432]\n\n## \u041a\u043e\u043d\u0442\u0430\u043a\u0442\u044b\n\n[\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f] \n",
"bugtrack_url": null,
"license": null,
"summary": "A tool for managing telemetry scripts",
"version": "0.2.3",
"project_urls": {
"Homepage": "https://github.com/your-repo/gs_tool"
},
"split_keywords": [],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "8570946d879d84fafedbb9ce5c4c57c00ecfcf64a2bab099764b9a48f13dc41c",
"md5": "48ddd92444f98ddd202e897a001fa7a9",
"sha256": "c10e37a8187e3bd2034ca9c68048e506507ab29ee2952b700e30261008b24311"
},
"downloads": -1,
"filename": "gs_tool-0.2.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "48ddd92444f98ddd202e897a001fa7a9",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 213883,
"upload_time": "2025-09-16T14:35:52",
"upload_time_iso_8601": "2025-09-16T14:35:52.471853Z",
"url": "https://files.pythonhosted.org/packages/85/70/946d879d84fafedbb9ce5c4c57c00ecfcf64a2bab099764b9a48f13dc41c/gs_tool-0.2.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "09e072103f076233fe91d705be9be8f78f73d33519cf508dd446b7f8b3da2b7f",
"md5": "8c6754238ed133cf2a26edf29abd15d9",
"sha256": "a12d6372455d9c0579e572559701574b8b6a45c5f8f734d1526ed63224e78cfe"
},
"downloads": -1,
"filename": "gs_tool-0.2.3.tar.gz",
"has_sig": false,
"md5_digest": "8c6754238ed133cf2a26edf29abd15d9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 213351,
"upload_time": "2025-09-16T14:35:54",
"upload_time_iso_8601": "2025-09-16T14:35:54.217923Z",
"url": "https://files.pythonhosted.org/packages/09/e0/72103f076233fe91d705be9be8f78f73d33519cf508dd446b7f8b3da2b7f/gs_tool-0.2.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-16 14:35:54",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "your-repo",
"github_project": "gs_tool",
"github_not_found": true,
"lcname": "gs-tool"
}