gs-tool


Namegs-tool JSON
Version 0.2.3 PyPI version JSON
download
home_pagehttps://github.com/your-repo/gs_tool
SummaryA tool for managing telemetry scripts
upload_time2025-09-16 14:35:54
maintainerNone
docs_urlNone
authorYour Name
requires_pythonNone
licenseNone
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 2.65292s