Пользовательский скрипт для Tampermonkey, который добавляет в ChatGPT локальную очередь запросов и последовательно отправляет их после завершения предыдущего ответа.
Important
Проект не связан с OpenAI и использует DOM-интерфейс сайта chatgpt.com.
Изменения интерфейса ChatGPT могут потребовать обновления адаптера.
- добавление нескольких запросов в очередь;
- inline-редактирование запросов до отправки;
- drag-and-drop, кнопки перестановки и удаление отдельных запросов;
- визуальные статусы и явный повтор элементов с ошибкой;
- приостановка и продолжение обработки;
- повторная попытка отправки при временной ошибке;
- безопасное ожидание после Stop и повторной генерации ответа;
- защита от одновременной обработки очереди несколькими вкладками;
- сохранение очереди, состояния паузы и положения панели в
localStorage; - работа без серверной части и runtime-зависимостей.
- Node.js 18 или новее;
- npm 9 или новее;
- браузер на базе Chromium;
- расширение Tampermonkey.
- Скачайте
dist/chatgpt-queue.user.jsиз репозитория. - Откройте панель Tampermonkey и создайте новый userscript.
- Замените содержимое редактора содержимым скачанного файла.
- Сохраните скрипт.
- Откройте или обновите chatgpt.com.
git clone <URL-РЕПОЗИТОРИЯ>
cd chatgpt-prompt-queue-userscript
npm ci
npm run buildПосле сборки установите dist/chatgpt-queue.user.js через Tampermonkey, как
описано выше. Собранный файл автономен: пакеты npm в браузере не требуются.
- Откройте диалог на
chatgpt.com. - Введите запрос в плавающей панели очереди.
- Добавьте запрос в очередь.
- Скрипт дождётся доступности основного поля ввода и отправит запрос.
- Следующий запрос будет отправлен после завершения текущего ответа.
В поле очереди обычный Enter добавляет сообщение. Ctrl+Enter и
Shift+Enter оставляют перенос строки для многострочного текста. Панель
запоминает свёрнутое состояние между обновлениями страницы.
Кнопки панели позволяют приостановить очередь, продолжить обработку, изменить порядок запросов и удалить отдельные элементы.
Установите зависимости строго по lock-файлу:
npm ciЗапустите автоматическую пересборку:
npm run devПосле каждого изменения обновляйте userscript в Tampermonkey и проверяйте его
на chatgpt.com. Для разовой сборки и базовой проверки JavaScript:
npm run validateДля браузерной regression-проверки очередей разных чатов запустите из корня
проекта python -m http.server 8765 и откройте
http://127.0.0.1:8765/test/e2e/per-chat-queues.html. Страница автоматически
проверяет общую очередь двух вкладок одного чата, изоляцию разных chat id и
миграцию временной очереди после создания чата.
http://127.0.0.1:8765/test/e2e/panel-actions.html проверяет клавиатурное
добавление, многострочный ввод, подтверждение очистки, доступные имена кнопок и
восстановление свёрнутости панели.
Доступные команды:
| Команда | Назначение |
|---|---|
npm run build |
Создать production-bundle в dist/ |
npm run dev |
Следить за src/ и пересобирать bundle |
npm run clean |
Удалить сгенерированный каталог dist/ |
npm run rebuild |
Очистить проект и собрать заново |
npm run check |
Проверить синтаксис исходников и build-скрипта |
npm test |
Однократно запустить модульные тесты |
npm run test:watch |
Перезапускать тесты при изменениях |
npm run validate |
Выполнить проверку, тесты и production-сборку |
Точка входа — src/main.js. Сборщик
esbuild объединяет ES-модули в один IIFE-файл,
совместимый с Tampermonkey, и добавляет userscript metadata block.
npm run buildРезультат:
dist/
└── chatgpt-queue.user.js
Каталог dist/ содержит производный артефакт. В этом репозитории собранный
userscript хранится в Git, чтобы его можно было установить без локальной
сборки. Перед коммитом изменений исходного кода выполните npm run validate и
убедитесь, что обновлённый bundle также включён в коммит.
Проект разделён на небольшие модули с явными зонами ответственности:
main.js— composition root, создающий и связывающий компоненты;chat-scope.js— единое преобразование маршрута ChatGPT в chat scope;queue-store.js— хранение, миграция и изменение очереди текущего чата;queue-processor.js— конечный автомат обработки, ожидание и повторы;chatgpt-adapter.js— единственная граница взаимодействия с DOM ChatGPT;panel-ui.js— создание панели и обработчики действий пользователя;styles.js— стили панели;utils.js— общие утилиты без состояния;tab-lock.js— scoped по chat id межвкладочный lease с TTL и автоматическим освобождением после закрытия или зависания вкладки.
flowchart TD
Build["build.mjs / esbuild"] --> Bundle["dist/chatgpt-queue.user.js"]
Main["src/main.js"] --> Store["queue-store.js"]
Main --> Processor["queue-processor.js"]
Main --> Adapter["chatgpt-adapter.js"]
Main --> TabLock["tab-lock.js"]
Main --> UI["panel-ui.js"]
Main --> Styles["styles.js"]
Processor --> Store
Processor --> Adapter
Processor --> Utils["utils.js"]
Adapter --> Utils
UI --> Store
UI --> Processor
Store --> LocalStorage["localStorage"]
UI --> LocalStorage
Adapter --> ChatGPT["DOM chatgpt.com"]
TabLock --> LocalStorage
Build -. bundles .-> Main
Процессор не обращается к DOM напрямую: он управляет очередью через store, а операции с ChatGPT делегирует adapter. Это локализует наиболее хрупкую часть проекта — DOM-селекторы сайта.
.
├── src/ # Исходные ES-модули
├── test/ # Модульные тесты Vitest
├── dist/ # Готовый userscript
├── build.mjs # Конфигурация esbuild и metadata block
├── package.json # Метаданные и npm-команды
├── package-lock.json # Зафиксированное дерево зависимостей
├── .editorconfig # Общие настройки редакторов
├── .gitattributes # Единые окончания строк и binary-маркеры
├── .gitignore # Исключения Git
├── LICENSE # Лицензия MIT
└── README.md
Issues и pull requests приветствуются. Перед отправкой изменений:
- создайте отдельную ветку;
- не смешивайте изменение поведения с инфраструктурным рефакторингом;
- выполните
npm ciиnpm run validate; - вручную проверьте установку собранного userscript в Tampermonkey;
- опишите сценарий проверки в pull request.
При изменениях DOM-адаптера укажите, на какой версии интерфейса ChatGPT и в каком браузере выполнена проверка.
- Работа зависит от текущей DOM-структуры ChatGPT.
- Данные сохраняются локально в профиле браузера.
- Межвкладочная блокировка пока не реализована: не запускайте одну очередь одновременно в нескольких вкладках.
- Автоматические тесты браузерной интеграции пока отсутствуют; модульная логика проверяется с помощью Vitest.
Скрипт выполняется локально в браузере, не имеет собственной серверной части и не отправляет содержимое очереди сторонним сервисам. Запросы передаются только через интерфейс ChatGPT. Перед установкой userscript рекомендуется проверить его исходный код и собранный файл.
Проект распространяется по лицензии MIT.