{"id":35171001,"url":"https://github.com/romankurnovskii/rustore","last_synced_at":"2026-01-13T22:54:24.581Z","repository":{"id":330863578,"uuid":"1124147520","full_name":"romankurnovskii/rustore","owner":"romankurnovskii","description":null,"archived":false,"fork":false,"pushed_at":"2025-12-29T13:24:57.000Z","size":445,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-31T05:43:25.305Z","etag":null,"topics":["aab","apk","cli","rustore"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/rustore","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/romankurnovskii.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-28T12:45:22.000Z","updated_at":"2025-12-29T13:24:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/romankurnovskii/rustore","commit_stats":null,"previous_names":["romankurnovskii/rustore"],"tags_count":3,"template":false,"template_full_name":"romankurnovskii/npm-typescript-package-template","purl":"pkg:github/romankurnovskii/rustore","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romankurnovskii%2Frustore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romankurnovskii%2Frustore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romankurnovskii%2Frustore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romankurnovskii%2Frustore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/romankurnovskii","download_url":"https://codeload.github.com/romankurnovskii/rustore/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/romankurnovskii%2Frustore/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28400851,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T14:36:09.778Z","status":"ssl_error","status_checked_at":"2026-01-13T14:35:19.697Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aab","apk","cli","rustore"],"created_at":"2025-12-28T20:48:03.691Z","updated_at":"2026-01-13T22:54:24.574Z","avatar_url":"https://github.com/romankurnovskii.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"assets/icon.png\" alt=\"rustore CLI\" width=\"128\" height=\"128\"\u003e\n  \u003ch1\u003erustore\u003cbr\u003eCLI для работы с RuStore API\u003c/h1\u003e\n  \u003cp\u003eКомандная строка для взаимодействия с RuStore API\u003c/p\u003e\n  \u003cp\u003e\n    \u003ca href=\"docs/about/README.en.md\"\u003eEnglish\u003c/a\u003e | \u003ca href=\"README.md\"\u003eРусский\u003c/a\u003e | \u003ca href=\"docs/about/README.hi.md\"\u003eहिंदी\u003c/a\u003e | \u003ca href=\"docs/about/README.zh.md\"\u003e中文\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n[![NPM version][npm-image]][npm-url]\n![npm-typescript]\n[![License][github-license]][github-license-url]\n\n## 🌟 Возможности\n\n- 🔐 Авторизация через приватный ключ из RuStore Консоль\n- 🔑 Автоматическое управление токенами доступа\n- 📦 Работа с API RuStore (платежи, подписки, приложения)\n- 📄 Вывод результатов в формате JSON (`--json`) для удобной интеграции и обработки\n- ⚙️ Сохранение конфигурации в `~/.rustore/config.json`\n- 🧪 Полное покрытие тестами\n\n## 🛠️ Установка\n\n### Глобальная установка\n\n```sh\nnpm install -g rustore\n```\n\nПосле установки используйте команду:\n\n```sh\nrustore --help\n```\n\n### Использование через npx (без установки)\n\nВы можете использовать CLI без установки через `npx`:\n\n```sh\nnpx rustore --help\nnpx rustore login --key-id \u003ckeyId\u003e --key \u003cprivateKey\u003e\nnpx rustore apps list\n```\n\n### Локальная установка\n\n```sh\nnpm install rustore\n```\n\n## 📖 Использование\n\n### Первоначальная настройка\n\nПеред использованием CLI необходимо получить приватный ключ в [RuStore Консоль](https://console.rustore.ru/sign-in).\n\n### Авторизация\n\n```sh\n# Авторизация с указанием keyId и приватного ключа\nrustore login --key-id \u003ckeyId\u003e --key \u003cbase64-ключ\u003e\n\n# Или короткая форма\nrustore login -i \u003ckeyId\u003e -k \u003cbase64-ключ\u003e\n```\n\n**Пример:**\n\n```sh\nrustore login --key-id 123456 --key MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC...\n```\n\n### Проверка статуса\n\n```sh\n# Показать информацию о текущей авторизации\nrustore whoami\n```\n\n### Выход из системы\n\n```sh\n# Удалить токен (ключи остаются в конфиге)\nrustore logout\n```\n\n### Работа с приложениями\n\n```sh\n# Получить список приложений\nrustore apps list\n\n# Получить все приложения (с пагинацией)\nrustore apps list --all\n\n# Вывести результат в формате JSON (удобно для скриптов и интеграций)\nrustore apps list --json\n\n# Комбинирование опций: получить все приложения в JSON формате\nrustore apps list --all --json\n\n# Фильтрация с JSON выводом\nrustore apps list --app-name \"MyApp\" --json\nrustore apps list --app-status PUBLISHED --json\n\n# Создать черновую версию приложения\nrustore apps create-draft --app-id 123456 --version-name \"1.0.0\" --version-code 1\n\n# Создать черновую версию с JSON выводом\nrustore apps create-draft --app-id 123456 --version-name \"2.0.0\" --version-code 2 --json\n\n# Загрузить APK файл для версии (обязательно указать is-main-apk)\nrustore apps upload-apk --package-name com.example.app --version-id 789 --file ./app-release.apk --is-main-apk true\n\n# Загрузить APK файл с Huawei Mobile Services\nrustore apps upload-apk --package-name com.example.app --version-id 789 --file ./app-release.apk --is-main-apk false --services-type HMS\n\n# Загрузить APK файл с JSON выводом\nrustore apps upload-apk --package-name com.example.app --version-id 789 --file ./app-release.apk --is-main-apk true --json\n```\n\n### Работа с отзывами\n\n```sh\n# Получить отзывы приложения\nrustore feedback list --package-name com.example.app\n\n# Получить все отзывы (с пагинацией)\nrustore feedback list --package-name com.example.app --all\n\n# Получить отзывы в JSON формате\nrustore feedback list --package-name com.example.app --json\n\n# Оставить ответ на отзыв\nrustore feedback answer --package-name com.example.app --comment-id 123456 --text \"Спасибо за отзыв!\"\n\n# Получить статус ответа на отзыв\nrustore feedback status --package-name com.example.app --feedback-id 789\n\n# Получить все ответы на отзывы\nrustore feedback status --package-name com.example.app\n\n# Изменить ответ на отзыв\nrustore feedback update --package-name com.example.app --feedback-id 789 --text \"Обновлённый ответ\"\n\n# Удалить ответ на отзыв\nrustore feedback delete --package-name com.example.app --feedback-id 789\n```\n\n**💡 Совет:** Флаг `--json` полезен для:\n\n- Автоматизации и скриптов\n- Интеграции с другими инструментами\n- Обработки данных через `jq` или другие JSON-парсеры\n- Сохранения результатов в файл: `rustore apps list --json \u003e apps.json`\n\n## 📁 Конфигурация\n\nCLI сохраняет конфигурацию в `~/.rustore/config.json`:\n\n```json\n{\n  \"keyId\": \"ваш-key-id\",\n  \"privateKey\": \"ваш-приватный-ключ-base64\",\n  \"token\": \"jwe-токен\",\n  \"tokenExpiresAt\": 1234567890\n}\n```\n\n## 🔧 Разработка\n\n### Установка зависимостей\n\n```sh\nnpm install\n```\n\n### Сборка\n\n```sh\nnpm run build\n```\n\n### Запуск в режиме разработки\n\n```sh\nnpm start\n```\n\n### Тестирование\n\n```sh\n# Запустить все тесты\nnpm test\n\n# Тесты в watch режиме\nnpm run test:watch\n\n# С покрытием\nnpm run test:coverage\n```\n\n#### Как протестировать текущие изменения\n\n1. **Сборка проекта:**\n\n   ```sh\n   npm run build\n   ```\n\n2. **Проверка типов:**\n\n   ```sh\n   npm run type-check\n   # или\n   ./node_modules/.bin/tsc --noEmit\n   ```\n\n3. **Запуск тестов:**\n\n   ```sh\n   npm test\n   ```\n\n4. **Тестирование CLI локально:**\n\n   ```sh\n   # Запуск без установки (через tsx)\n   npm start -- login \u003ckeyId\u003e --key \u003ckey\u003e\n\n   # Или после сборки\n   node dist/bin.js whoami\n   ```\n\n5. **Линтинг:**\n   ```sh\n   npm run lint\n   npm run lint:fix\n   ```\n\n### Проверка типов\n\n```sh\nnpm run type-check\n```\n\n### Линтинг\n\n```sh\nnpm run lint\nnpm run lint:fix\n```\n\n## 📚 API\n\n### Структура API\n\nAPI организовано по категориям, как в документации RuStore:\n\n- **Apps API** (`appsApi`) - Загрузка и публикация приложений (общие методы)\n- **Payments API** (`paymentsApi`) - Работа с платежами и подписками (общие методы)\n- **Payments App API** (`paymentsAppApi`) - Работа с платежами и подписками (методы приложений)\n- **Catalog API** (`catalogApi`) - API для работы с продуктовым каталогом\n\n### Программный доступ\n\n```typescript\nimport {login, appsApi, paymentsApi, catalogApi, feedbackApi} from 'rustore';\n\n// Авторизация\nawait login('keyId', 'privateKey');\n\n// Получить список приложений\nconst appsResponse = await appsApi.getAppList();\nconsole.log(appsResponse.body.content);\n\n// Получить все приложения (с автоматической пагинацией)\nconst allApps = await appsApi.getAllApps();\n\n// Создать черновую версию приложения\nconst draftVersion = await appsApi.createDraftVersion(123456, {\n  versionName: '1.0.0',\n  versionCode: 1,\n});\n\n// Загрузить APK файл для версии\nconst uploadResult = await appsApi.uploadApkFile(\n  'com.example.app', // packageName вместо appId\n  draftVersion.body?.versionId || 789,\n  './app-release.apk',\n  {\n    isMainApk: true, // обязательный параметр\n    servicesType: 'Unknown', // опциональный: 'HMS' или 'Unknown'\n  },\n);\n\n// Получить отзывы приложения\nconst feedbackResponse = await feedbackApi.getFeedback('com.example.app');\n\n// Оставить ответ на отзыв\nconst answerResponse = await feedbackApi.createFeedbackAnswer('com.example.app', 123456, {\n  text: 'Спасибо за отзыв!',\n});\n\n// Получить статус ответа на отзыв\nconst statusResponse = await feedbackApi.getFeedbackAnswerStatus('com.example.app', 789);\n\n// Использование других API категорий\n// await paymentsApi.refund(...);\n// await catalogApi.getProducts(...);\n```\n\n## 🔗 Полезные ссылки\n\n- [Документация RuStore API](https://www.rustore.ru/help/en/work-with-rustore-api)\n- [Процесс авторизации](https://www.rustore.ru/help/work-with-rustore-api/api-authorization-token)\n- [RuStore Консоль](https://console.rustore.ru/sign-in)\n- [Как отправить APK в продакшн](docs/how-to-submit-apk-for-production.md)\n- [Документация на других языках](docs/about/)\n\n## 📋 TODO: API Endpoints Implementation Status\n\nСтатус реализации всех endpoints RuStore API. См. [TODO_API_ENDPOINTS.md](./docs/TODO_API_ENDPOINTS.md) для подробной информации.\n\n### ✅ Реализовано (Implemented \u0026 Tested)\n\n#### Authorization (Авторизация)\n\n- ✅ 🧪 Get Authorization Token - `POST /public/auth/`\n\n#### Upload \u0026 Publication App (Загрузка и публикация приложений)\n\n- ✅ 🧪 Get App List - `GET /public/v1/application`\n- ✅ 🧪 Create Draft Version - `POST /public/v1/application/{packageName}/version`\n- ✅ 🧪 Upload APK File - `POST /public/v1/application/{packageName}/version/{versionId}/apk`\n- ✅ 🧪 Send Draft for Moderation - `POST /public/v1/application/{packageName}/version/{versionId}/commit`\n- ✅ 🧪 Get Version Info - `GET /public/v1/application/{packageName}/version/{versionId}`\n- ✅ 🧪 Get Version List - `GET /public/v1/application/{packageName}/version`\n- ✅ 🧪 Get App Tag List - `GET /public/v1/application/tag`\n- ✅ 🧪 Upload AAB File - `POST /public/v1/application/{packageName}/version/{versionId}/aab`\n- ✅ 🧪 Update Draft Version - `PUT /public/v1/application/{packageName}/version/{versionId}`\n- ✅ 🧪 Delete Draft Version - `DELETE /public/v1/application/{packageName}/version/{versionId}`\n- ✅ 🧪 Upload Screens - `POST /public/v1/application/{packageName}/version/{versionId}/screens`\n- ✅ 🧪 Get Version Status - `GET /public/v1/application/{packageName}/version/{versionId}/status`\n\n#### Feedback Process (Работа с отзывами)\n\n- ✅ 🧪 Get Feedback - `GET /public/v1/application/{packageName}/feedback`\n- ✅ 🧪 Create Feedback Answer - `POST /public/v1/application/{packageName}/feedback/{commentId}/answer`\n- ✅ 🧪 Get Feedback Answer Status - `GET /public/v1/application/{packageName}/feedback/{feedbackId}`\n- ✅ 🧪 Update Feedback Answer - `PUT /public/v1/application/{packageName}/feedback/{feedbackId}`\n- ✅ 🧪 Delete Feedback Answer - `DELETE /public/v1/application/{packageName}/feedback/{feedbackId}`\n\n### ❌ Не реализовано (Not Implemented)\n\n#### Upload \u0026 Publication App\n\n- Все основные endpoints реализованы ✅\n\n#### Payments \u0026 Subscriptions (Общие методы)\n\n**Base URL**: `https://www.rustore.ru/help/work-with-rustore-api/api-payments-subscriptions`\n\n- ✅ 🧪 Get Payment - `GET /public/v1/payment/{paymentId}`\n- ✅ 🧪 Get Subscription - `GET /public/v1/subscription/{subscriptionId}`\n- ✅ 🧪 Get Subscription List - `GET /public/v1/subscription`\n- ❌ Refund - `POST /public/v1/payment/refund`\n- ❌ Cancel Subscription - `POST /public/v1/subscription/{subscriptionId}/cancel`\n\n#### Payments \u0026 Subscriptions App (Методы приложений)\n\n**Base URL**: `https://www.rustore.ru/help/work-with-rustore-api/api-payments-subscriptions-app`\n\n- ✅ 🧪 Get Invoices - `GET /public/v1/application/{packageName}/invoice`\n- ✅ 🧪 Get Purchase - `GET /public/v1/application/{packageName}/purchase/{purchaseId}`\n- ✅ 🧪 Get Purchase List - `GET /public/v1/application/{packageName}/purchase`\n- ❌ Confirm Purchase - `POST /public/v1/application/{packageName}/purchase/confirm`\n- ❌ Cancel Purchase - `POST /public/v1/application/{packageName}/purchase/cancel`\n\n#### Catalog (Продуктовый каталог)\n\n**Base URL**: `https://www.rustore.ru/help/work-with-rustore-api/api-catalog`\n\n- ✅ 🧪 Get Products - `GET /public/v1/catalog/product`\n- ✅ 🧪 Get Product - `GET /public/v1/catalog/product/{productId}`\n- ❌ Create Product - `POST /public/v1/catalog/product`\n- ❌ Update Product - `PUT /public/v1/catalog/product/{productId}`\n- ❌ Delete Product - `DELETE /public/v1/catalog/product/{productId}`\n\n**Легенда статусов:**\n\n- ✅ **Implemented** - Полностью реализовано, протестировано и задокументировано\n- 🧪 **Tested** - Реализовано и имеет тесты\n- ⚠️ **Issues** - Реализовано, но есть известные проблемы\n- 🚧 **Beta** - Реализовано, но требует дополнительного тестирования/верификации\n- ❌ **Not Implemented** - Еще не реализовано\n\n**Приоритеты реализации:**\n\n1. ✅ **High Priority**: Upload AAB File, Update Draft Version, Delete Draft Version - **Реализовано**\n2. **Medium Priority**: POST/PUT/DELETE Payment/Subscription endpoints\n3. **Low Priority**: POST/PUT/DELETE Catalog endpoints, advanced payment operations\n\n## 📝 Лицензия\n\nMIT\n\n[package-name]: rustore\n[npm-url]: https://www.npmjs.com/package/rustore\n[npm-image]: https://img.shields.io/npm/v/rustore\n[github-license]: https://img.shields.io/github/license/romankurnovskii/rustore\n[github-license-url]: https://github.com/romankurnovskii/rustore/blob/main/LICENSE\n[npm-typescript]: https://img.shields.io/npm/types/rustore\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromankurnovskii%2Frustore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fromankurnovskii%2Frustore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fromankurnovskii%2Frustore/lists"}