izteamslots 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/CONTRIBUTING.md +20 -8
- package/README.md +46 -201
- package/backend/codex_switcher.py +571 -0
- package/backend/dto.py +27 -0
- package/backend/rpc_server.py +42 -3
- package/backend/slot_orchestrator.py +100 -0
- package/backend/ui_facade.py +48 -3
- package/docs/architecture.md +69 -0
- package/docs/providers.md +52 -0
- package/docs/troubleshooting.md +64 -0
- package/package.json +1 -1
- package/tests/test_account_store.py +86 -0
- package/tests/test_codex_switcher.py +409 -0
- package/tests/test_dto.py +43 -0
- package/tests/test_jobs.py +76 -0
- package/tests/test_rpc_protocol.py +33 -0
- package/tests/test_slot_orchestrator.py +115 -0
- package/ui/package.json +2 -1
- package/ui/src/menus/mainMenus.ts +80 -2
- package/ui/src/menus/types.ts +34 -0
- package/ui/src/screens/MainScreen.ts +228 -2
- package/ui/tests/mainMenus.test.ts +233 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
# [1.7.0](https://github.com/izzzzzi/izTeamSlots/compare/v1.6.1...v1.7.0) (2026-03-07)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* remove unused variable to satisfy ruff F841 ([e5cfb77](https://github.com/izzzzzi/izTeamSlots/commit/e5cfb773e4449037aa96f7f940c22cd7eb78ecdc))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* add Codex account switcher with auto-rotation ([70c8953](https://github.com/izzzzzi/izTeamSlots/commit/70c8953a6cde92127a17a5ea220bd8476bbc3447))
|
|
12
|
+
|
|
13
|
+
## [1.6.1](https://github.com/izzzzzi/izTeamSlots/compare/v1.6.0...v1.6.1) (2026-03-07)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Bug Fixes
|
|
17
|
+
|
|
18
|
+
* **ci:** install python deps before unit tests ([5c57d2a](https://github.com/izzzzzi/izTeamSlots/commit/5c57d2a5c9f22ed667d9cbdedacb69c465d136ba))
|
|
19
|
+
|
|
1
20
|
# [1.6.0](https://github.com/izzzzzi/izTeamSlots/compare/v1.5.5...v1.6.0) (2026-03-06)
|
|
2
21
|
|
|
3
22
|
|
package/CONTRIBUTING.md
CHANGED
|
@@ -42,19 +42,30 @@ izTeamSlots/
|
|
|
42
42
|
└── .github/workflows/ # CI/CD
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
##
|
|
45
|
+
## Проверки и тесты
|
|
46
46
|
|
|
47
47
|
Перед коммитом убедитесь что код проходит проверки:
|
|
48
48
|
|
|
49
49
|
```bash
|
|
50
|
-
# Python —
|
|
51
|
-
ruff check backend
|
|
50
|
+
# Python — lint + unit tests
|
|
51
|
+
ruff check backend tests
|
|
52
|
+
python -m unittest discover -s tests -p 'test_*.py'
|
|
52
53
|
|
|
53
|
-
# TypeScript —
|
|
54
|
-
npm run typecheck
|
|
54
|
+
# TypeScript — typecheck + unit tests
|
|
55
|
+
npm --prefix ui run typecheck
|
|
56
|
+
npm --prefix ui run test
|
|
55
57
|
```
|
|
56
58
|
|
|
57
|
-
CI автоматически запускает
|
|
59
|
+
CI автоматически запускает эти проверки на каждый PR.
|
|
60
|
+
|
|
61
|
+
## Требование по тестам
|
|
62
|
+
|
|
63
|
+
- Любая новая функциональность или заметное изменение логики должно сопровождаться тестами.
|
|
64
|
+
- Минимум: покрывайте тот слой, который можно проверить локально без браузерного e2e.
|
|
65
|
+
- Для Python-логики добавляйте `unittest`-тесты в `tests/`.
|
|
66
|
+
- Для чистой TypeScript-логики добавляйте тесты в `ui/tests/`.
|
|
67
|
+
- Если изменение нельзя адекватно покрыть unit-тестом, это нужно явно отметить в описании PR.
|
|
68
|
+
- PR без тестов для новой логики может быть отклонён.
|
|
58
69
|
|
|
59
70
|
## Conventional Commits
|
|
60
71
|
|
|
@@ -100,8 +111,9 @@ chore: update seleniumbase to 4.33
|
|
|
100
111
|
|
|
101
112
|
1. Один PR — одно логическое изменение.
|
|
102
113
|
2. Следуйте Conventional Commits.
|
|
103
|
-
3.
|
|
104
|
-
4.
|
|
114
|
+
3. Добавьте или обновите тесты, если меняется логика приложения.
|
|
115
|
+
4. Убедитесь что lint, unit tests и typecheck проходят локально.
|
|
116
|
+
5. Обновите документацию если изменение затрагивает пользовательское поведение.
|
|
105
117
|
|
|
106
118
|
### Новый почтовый провайдер
|
|
107
119
|
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# izTeamSlots
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Локальный менеджер ChatGPT Team слотов: админы, инвайты, регистрация, перелогин и Codex-сессии**
|
|
6
6
|
|
|
7
7
|
[](https://github.com/izzzzzi/izTeamSlots/actions/workflows/ci.yml)
|
|
8
8
|
[](https://github.com/izzzzzi/izTeamSlots/actions/workflows/release.yml)
|
|
@@ -18,111 +18,53 @@
|
|
|
18
18
|
|
|
19
19
|
</div>
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
## Обзор
|
|
24
|
-
|
|
25
|
-
**izTeamSlots** — локальное приложение с архитектурой:
|
|
26
|
-
|
|
27
|
-
- **Python backend** (бизнес-логика, браузерная автоматизация, storage);
|
|
28
|
-
- **TypeScript OpenTUI frontend** (терминальный интерфейс оператора).
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Возможности
|
|
33
|
-
|
|
34
|
-
- Управление админами: добавить, перелогинить, удалить, открыть браузерный профиль.
|
|
35
|
-
- Пайплайн слотов: `создать почту -> инвайт -> регистрация -> OAuth-логин`.
|
|
36
|
-
- Перелогин слотов: одного выбранного или всех по очереди.
|
|
37
|
-
- Codex-файлы: авто-сохранение `codex-<email>-Team.json` в аккаунт и в `./codex/`.
|
|
38
|
-
- Doctor-проверка: валидация/восстановление файловой структуры аккаунтов при старте.
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## Структура проекта
|
|
42
|
-
|
|
43
|
-
```text
|
|
44
|
-
izTeamSlots/
|
|
45
|
-
├── bin/ # CLI-бинарники
|
|
46
|
-
│ └── izteamslots.mjs # Кроссплатформенный entrypoint (Node.js)
|
|
47
|
-
├── scripts/ # Установочные скрипты
|
|
48
|
-
│ ├── setup.mjs # Диспетчер: выбирает .sh или .cmd
|
|
49
|
-
│ ├── setup.sh # Unix: uv + venv + Bun
|
|
50
|
-
│ └── setup.cmd # Windows: uv + venv + Bun
|
|
51
|
-
├── backend/ # Весь Python-бэкенд
|
|
52
|
-
│ ├── __init__.py # PROJECT_ROOT
|
|
53
|
-
│ ├── __main__.py # python -m backend
|
|
54
|
-
│ ├── account_store.py # CRUD аккаунтов (JSON storage)
|
|
55
|
-
│ ├── mail/ # Почтовые провайдеры (плагины)
|
|
56
|
-
│ │ ├── __init__.py # Фабрики: create_provider, create_slot_provider
|
|
57
|
-
│ │ ├── base.py # MailProvider ABC, Mailbox, Mail, Inbox
|
|
58
|
-
│ │ ├── boomlify.py # Boomlify Temp Mail API
|
|
59
|
-
│ │ ├── trickads.py # trickadsagencyltd.com temp mail
|
|
60
|
-
│ │ └── imap.py # Любой IMAP-сервер
|
|
61
|
-
│ ├── openai_web_auth.py # Браузерная автоматизация (SeleniumBase)
|
|
62
|
-
│ ├── chatgpt_workspace_api.py # ChatGPT Workspace API через браузер
|
|
63
|
-
│ ├── slot_orchestrator.py # Оркестратор пайплайна слотов
|
|
64
|
-
│ ├── dto.py # DTO для UI
|
|
65
|
-
│ ├── file_logger.py # Логирование в файл
|
|
66
|
-
│ ├── jobs.py # Задачи в потоках
|
|
67
|
-
│ ├── rpc_protocol.py # JSON-RPC протокол
|
|
68
|
-
│ ├── rpc_server.py # RPC-сервер (stdio)
|
|
69
|
-
│ └── ui_facade.py # Фасад между RPC и бизнес-логикой
|
|
70
|
-
├── ui/ # TypeScript TUI (OpenTUI)
|
|
71
|
-
│ ├── package.json
|
|
72
|
-
│ └── src/
|
|
73
|
-
│ ├── main.ts # Entrypoint UI
|
|
74
|
-
│ ├── screens/MainScreen.ts # Главный экран
|
|
75
|
-
│ ├── transport/stdioClient.ts # JSON-RPC клиент
|
|
76
|
-
│ └── menus/ # Меню, таблицы, форматирование
|
|
77
|
-
├── requirements.txt # Python-зависимости
|
|
78
|
-
├── ruff.toml # Конфиг линтера Python
|
|
79
|
-
├── LICENSE # MIT
|
|
80
|
-
└── README.md
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## Установка
|
|
86
|
-
|
|
87
|
-
### npm (рекомендуется)
|
|
21
|
+
## Quick Start
|
|
88
22
|
|
|
89
23
|
```bash
|
|
90
|
-
npm
|
|
24
|
+
npm install -g izteamslots@latest
|
|
25
|
+
izteamslots
|
|
91
26
|
```
|
|
92
27
|
|
|
93
|
-
|
|
28
|
+
Дальше:
|
|
29
|
+
1. Откройте `Настройки` и задайте почтовый провайдер / API-ключ.
|
|
30
|
+
2. Добавьте админа через ручной вход в браузере.
|
|
31
|
+
3. Запустите создание слотов.
|
|
94
32
|
|
|
95
|
-
|
|
33
|
+
## Что умеет
|
|
96
34
|
|
|
97
|
-
|
|
35
|
+
- Добавление и ручной перелогин админов.
|
|
36
|
+
- Создание слотов: `почта -> инвайт -> регистрация -> OAuth`.
|
|
37
|
+
- Перелогин одного слота или всех сразу.
|
|
38
|
+
- Сохранение `codex-<email>-Team.json`.
|
|
39
|
+
- Логи, локальные browser profiles и doctor-проверка.
|
|
40
|
+
- Синхронизация workspace с локальными слотами.
|
|
98
41
|
|
|
99
|
-
|
|
42
|
+
## Ограничения
|
|
100
43
|
|
|
101
|
-
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
-
|
|
105
|
-
|
|
106
|
-
- macOS / Linux: `~/.izteamslots/.env`
|
|
107
|
-
- аккаунты и профили браузера:
|
|
108
|
-
- Windows: `C:\Users\<USER>\.izteamslots\accounts`
|
|
109
|
-
- macOS / Linux: `~/.izteamslots/accounts`
|
|
44
|
+
- Вход админа сейчас поддерживается только в ручном режиме.
|
|
45
|
+
- Проект зависит от текущего web UI OpenAI / ChatGPT.
|
|
46
|
+
- Браузерная автоматизация может ломаться после изменений на стороне сайта.
|
|
47
|
+
- Токены, профили браузера и `codex` хранятся локально.
|
|
48
|
+
- Основные платформы: macOS и Windows.
|
|
110
49
|
|
|
111
|
-
|
|
50
|
+
## Где лежат данные
|
|
112
51
|
|
|
113
|
-
|
|
52
|
+
При глобальной установке данные сохраняются в `~/.izteamslots`.
|
|
114
53
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
```
|
|
54
|
+
- `accounts/` — аккаунты и browser profiles
|
|
55
|
+
- `codex/` — сохранённые codex-файлы
|
|
56
|
+
- `logs/` — app/job logs
|
|
57
|
+
- `.env` — локальные настройки
|
|
120
58
|
|
|
121
|
-
|
|
59
|
+
Примеры:
|
|
60
|
+
- Windows: `C:\Users\<USER>\.izteamslots`
|
|
61
|
+
- macOS / Linux: `~/.izteamslots`
|
|
122
62
|
|
|
123
|
-
|
|
63
|
+
Если вы обновляете старую версию, `codex`-файлы могут временно лежать ещё и внутри директории пакета. В актуальной версии основным путём считается именно `~/.izteamslots`.
|
|
124
64
|
|
|
125
|
-
|
|
65
|
+
## Настройка
|
|
66
|
+
|
|
67
|
+
Настройки можно задать через меню `Настройки` внутри приложения или вручную через `~/.izteamslots/.env`.
|
|
126
68
|
|
|
127
69
|
```bash
|
|
128
70
|
# Linux / macOS
|
|
@@ -134,122 +76,25 @@ mkdir "$env:USERPROFILE\.izteamslots" -Force
|
|
|
134
76
|
echo "BOOMLIFY_API_KEY=your_api_key" > "$env:USERPROFILE\.izteamslots\.env"
|
|
135
77
|
```
|
|
136
78
|
|
|
137
|
-
Конфиг загружается в порядке приоритета: `~/.izteamslots/.env` > `./.env` > встроенный.
|
|
138
|
-
|
|
139
79
|
| Переменная | По умолчанию | Описание |
|
|
140
80
|
|-----------|:------------:|----------|
|
|
141
|
-
| `BOOMLIFY_API_KEY` | — | API-ключ Boomlify
|
|
142
|
-
| `BOOMLIFY_DOMAIN` | авто | Домен
|
|
81
|
+
| `BOOMLIFY_API_KEY` | — | API-ключ Boomlify |
|
|
82
|
+
| `BOOMLIFY_DOMAIN` | авто | Домен временных почт |
|
|
143
83
|
| `BOOMLIFY_TIME` | `permanent` | Время жизни ящика |
|
|
144
84
|
| `SLOT_MAIL_PROVIDER` | `boomlify` | Провайдер почты для слотов |
|
|
145
85
|
| `MAIL_PROVIDER` | `trickads` | Провайдер почты для админов |
|
|
146
86
|
|
|
147
|
-
##
|
|
148
|
-
|
|
149
|
-
```bash
|
|
150
|
-
izteamslots
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
Из исходников: `npm start`
|
|
154
|
-
|
|
155
|
-
Это запустит OpenTUI frontend через **Bun**, который поднимет Python RPC backend (`python -m backend`) по `stdio`.
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## Архитектура
|
|
160
|
-
|
|
161
|
-
```mermaid
|
|
162
|
-
flowchart TD
|
|
163
|
-
A[izteamslots CLI] -->|bun| B[ui/src/main.ts]
|
|
164
|
-
B --> C[MainScreen.ts]
|
|
165
|
-
C --> D[StdioRpcClient]
|
|
166
|
-
D -->|spawns + stdio JSON-RPC| E[python -m backend]
|
|
167
|
-
E --> F[RPCServer]
|
|
168
|
-
F --> G[UIFacade]
|
|
169
|
-
G --> H[AccountStore]
|
|
170
|
-
G --> I[SlotManager]
|
|
171
|
-
I --> J[openai_web_auth]
|
|
172
|
-
I --> K[chatgpt_workspace_api]
|
|
173
|
-
I --> L[Mail Providers]
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
## Почтовые провайдеры (плагины)
|
|
177
|
-
|
|
178
|
-
Система почты построена на плагинах — абстрактный класс `MailProvider` и конкретные реализации.
|
|
179
|
-
|
|
180
|
-
```mermaid
|
|
181
|
-
flowchart TD
|
|
182
|
-
MP[MailProvider — абстрактный класс]
|
|
183
|
-
MP --> B[BoomlifyProvider]
|
|
184
|
-
MP --> T[TrickAdsProvider]
|
|
185
|
-
MP --> I[IMAPProvider]
|
|
186
|
-
|
|
187
|
-
CF[create_provider] -->|MAIL_PROVIDER env| MP
|
|
188
|
-
CSP[create_slot_provider] -->|SLOT_MAIL_PROVIDER env| MP
|
|
189
|
-
CPM[create_provider_for_mailbox] -->|по формату password| MP
|
|
190
|
-
|
|
191
|
-
style MP fill:#1e3a5f,color:#fff
|
|
192
|
-
style B fill:#1a4731,color:#fff
|
|
193
|
-
style T fill:#1a4731,color:#fff
|
|
194
|
-
style I fill:#1a4731,color:#fff
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
### Встроенные провайдеры
|
|
198
|
-
|
|
199
|
-
| Провайдер | Модуль | Описание | Env-переменные |
|
|
200
|
-
|-----------|--------|----------|----------------|
|
|
201
|
-
| `boomlify` | `mail/boomlify.py` | Boomlify Temp Mail API (по умолчанию для слотов) | `BOOMLIFY_API_KEY`, `BOOMLIFY_DOMAIN`, `BOOMLIFY_TIME` |
|
|
202
|
-
| `trickads` | `mail/trickads.py` | trickadsagencyltd.com temp mail (по умолчанию для админов) | — |
|
|
203
|
-
| `imap` | `mail/imap.py` | Любой IMAP-сервер | `IMAP_HOST`, `IMAP_PORT`, `IMAP_SSL`, `IMAP_FOLDER` |
|
|
204
|
-
|
|
205
|
-
### Фабричные функции
|
|
206
|
-
|
|
207
|
-
- `create_provider(name)` — создаёт провайдер по имени (или `MAIL_PROVIDER` env, по умолчанию `trickads`)
|
|
208
|
-
- `create_slot_provider(name)` — для слотов (`SLOT_MAIL_PROVIDER` env, по умолчанию `boomlify`)
|
|
209
|
-
- `create_provider_for_mailbox(mailbox)` — автоопределение по формату пароля (если `boomlify:<uuid>` → Boomlify)
|
|
210
|
-
|
|
211
|
-
### Свой провайдер
|
|
87
|
+
## Почтовые провайдеры
|
|
212
88
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
from backend.mail.base import MailProvider, Mailbox, Inbox
|
|
217
|
-
|
|
218
|
-
class MyProvider(MailProvider):
|
|
219
|
-
name = "my_provider"
|
|
220
|
-
|
|
221
|
-
def generate(self) -> Mailbox:
|
|
222
|
-
# создать временный ящик, вернуть Mailbox(email, password)
|
|
223
|
-
...
|
|
224
|
-
|
|
225
|
-
def inbox(self, mailbox: Mailbox) -> Inbox:
|
|
226
|
-
# получить письма, вернуть Inbox(email, messages=[Mail(...), ...])
|
|
227
|
-
...
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
---
|
|
231
|
-
|
|
232
|
-
## Пайплайн слотов
|
|
233
|
-
|
|
234
|
-
```mermaid
|
|
235
|
-
flowchart TD
|
|
236
|
-
S1[Создать временную почту] --> S2[Отправить инвайт через API]
|
|
237
|
-
S2 --> S3[Ожидать письмо с инвайт-ссылкой]
|
|
238
|
-
S3 --> S4[Регистрация по ссылке в браузере]
|
|
239
|
-
S4 --> S5[Ввод email / пароль / код подтверждения]
|
|
240
|
-
S5 --> S6[Заполнение имени и даты рождения]
|
|
241
|
-
S6 --> S7[Закрыть браузер регистрации]
|
|
242
|
-
S7 --> S8[OAuth PKCE логин]
|
|
243
|
-
S8 --> S9[Сохранить access_token и codex-файл]
|
|
244
|
-
|
|
245
|
-
style S1 fill:#1e3a5f,color:#fff
|
|
246
|
-
style S9 fill:#1a4731,color:#fff
|
|
247
|
-
```
|
|
89
|
+
- В проект уже встроены `boomlify`, `trickads` и `imap`.
|
|
90
|
+
- Можно добавлять собственные почтовые провайдеры.
|
|
91
|
+
- Для этого нужно реализовать `MailProvider` и зарегистрировать его в backend.
|
|
248
92
|
|
|
249
|
-
|
|
93
|
+
Подробности: [docs/providers.md](./docs/providers.md)
|
|
250
94
|
|
|
251
|
-
##
|
|
95
|
+
## Документация
|
|
252
96
|
|
|
253
|
-
-
|
|
254
|
-
-
|
|
255
|
-
-
|
|
97
|
+
- [docs/providers.md](./docs/providers.md) — встроенные и кастомные почтовые провайдеры
|
|
98
|
+
- [docs/architecture.md](./docs/architecture.md) — структура проекта, архитектура и пайплайн слотов
|
|
99
|
+
- [docs/troubleshooting.md](./docs/troubleshooting.md) — частые проблемы и способы диагностики
|
|
100
|
+
- [CONTRIBUTING.md](./CONTRIBUTING.md) — вклад в проект, проверки и тесты
|