refactor(repo): remove GitHub releases, add icon, standardize README (#37)
## Что сделано - Убран тег v1.0.0 и GitHub Release v1.0.0 - release.yml → deploy.yml (деплой в dist без GitHub Release) - Добавлен assets/icon.png 128×128 - README перегенерирован через create-readme (include_clone=false, кликабельные steps) - docs/project-map/github.md обновлён - ADR + handoff созданы ## Почему GitHub Releases избыточны — автообновление работает через @updateURL на ветку dist. README не соответствовал стандарту create-readme (нет delimiter-тегов для slaid098.dev). @icon ссылался на несуществующий файл. Closes #36 Closes #36 --------- Co-authored-by: opencode-agent <agent@opencode.local>
This commit is contained in:
parent
e4ec12960f
commit
4542bd8883
9 changed files with 244 additions and 121 deletions
|
|
@ -1,9 +1,8 @@
|
||||||
name: Release
|
name: Deploy
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [main]
|
branches: [main]
|
||||||
tags: ["v*"]
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
|
@ -43,12 +42,3 @@ jobs:
|
||||||
publish_dir: ./dist
|
publish_dir: ./dist
|
||||||
publish_branch: dist
|
publish_branch: dist
|
||||||
keep_files: false
|
keep_files: false
|
||||||
|
|
||||||
- name: Create GitHub Release on tag
|
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
|
||||||
uses: softprops/action-gh-release@v3
|
|
||||||
with:
|
|
||||||
files: |
|
|
||||||
dist/opencode-voice-dictation.user.js
|
|
||||||
dist/opencode-voice-dictation.meta.js
|
|
||||||
generate_release_notes: true
|
|
||||||
153
README.md
153
README.md
|
|
@ -1,121 +1,78 @@
|
||||||
# OpenCode Voice Dictation / Голосовая диктовка для OpenCode
|
# 🚀 opencode-voice-dictation
|
||||||
|
> Voice dictation for OpenCode web — mic button via Whisper (Groq API)
|
||||||
|
|
||||||
[](https://github.com/slaid098/opencode-voice-dictation/actions/workflows/ci.yml)
|
[English](#-english) | [Русский](#-русский)
|
||||||
[](https://github.com/slaid098/opencode-voice-dictation/actions/workflows/release.yml)
|
|
||||||
[](https://opensource.org/licenses/MIT)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Русский
|
## 🇺🇸 English
|
||||||
|
|
||||||
Голосовая диктовка для [OpenCode](https://opencode.ai) web через Whisper (Groq API). Работает на ПК и телефоне.
|
<!-- summary-en:start -->
|
||||||
|
### ❓ Why
|
||||||
|
Needed a way to dictate to agents from a phone. Stock Android voice input doesn't cut it. OpenCode web had no built-in voice.
|
||||||
|
|
||||||
> ⚠️ **Требуется OpenCode web v1.18.x.** В настройках OpenCode web включите «New UI» — в старом интерфейсе скрипт не работает. Совместимо с OpenCode v1.18.x; старые версии поддерживаются через fallback-селекторы.
|
### ✅ What
|
||||||
|
A Tampermonkey/Violentmonkey userscript — a mic button in the OpenCode web UI. Language selection, auto-submit after dictation. Whisper via Groq API (requires your own key).
|
||||||
|
<!-- summary-en:end -->
|
||||||
|
|
||||||
### Установка
|
<!-- features-en:start -->
|
||||||
|
### Features
|
||||||
|
|
||||||
> **[Установить скрипт](https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/dist/opencode-voice-dictation.user.js)** — открой ссылку в браузере с Violentmonkey/Tampermonkey и подтверди установку.
|
| Feature | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| 🎤 Mic button | Click 🎤 in the input area, speak — text inserts into the prompt |
|
||||||
|
| 🌍 Language | `ru`, `en`, or auto-detect |
|
||||||
|
| ⚡ Auto-submit | Sends transcription to the agent after dictation (toggleable) |
|
||||||
|
| 🧠 Whisper (Groq) | `whisper-large-v3` / `whisper-large-v3-turbo` via Groq API |
|
||||||
|
| 📱 Mobile via Firefox | Firefox supports extensions; mobile Chrome doesn't |
|
||||||
|
| ✅ Tested on 1.18.8 | Older versions via fallback selectors; needs "New UI" toggle |
|
||||||
|
| 🔄 Auto-update | Updates itself via `@updateURL` — no manual reinstall |
|
||||||
|
| ⌨️ Ctrl+Space | Desktop hotkey to start/stop recording |
|
||||||
|
<!-- features-en:end -->
|
||||||
|
|
||||||
Или скачай с [Releases](https://github.com/slaid098/opencode-voice-dictation/releases) и импортируй вручную.
|
### ⚡ Quick Start
|
||||||
|
|
||||||
### Совместимость
|
1. Install [Tampermonkey](https://www.tampermonkey.net/)
|
||||||
|
2. Get a key at [console.groq.com/keys](https://console.groq.com/keys)
|
||||||
| Платформа | Браузер | Менеджер скриптов | Статус |
|
3. Open the [script install link](https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/dist/opencode-voice-dictation.user.js) — it installs into Tampermonkey
|
||||||
|-----------|---------|-------------------|--------|
|
4. Tampermonkey menu → **Set Groq API Key** → paste `gsk_...`
|
||||||
| ПК | Vivaldi | Violentmonkey | ✅ |
|
|
||||||
| ПК | Chrome | Tampermonkey | ✅ |
|
|
||||||
| ПК | Firefox | Tampermonkey | ✅ |
|
|
||||||
| Android | Firefox | Tampermonkey | ✅ |
|
|
||||||
| Android | Vivaldi | — | ❌ Нет расширений |
|
|
||||||
| Android | Chrome | — | ❌ Нет расширений |
|
|
||||||
|
|
||||||
### Настройка
|
|
||||||
|
|
||||||
1. Получи бесплатный ключ на [console.groq.com/keys](https://console.groq.com/keys)
|
|
||||||
2. Открой OpenCode web
|
|
||||||
3. Меню Violentmonkey/Tampermonkey → **Set Groq API Key** → вставь `gsk_...`
|
|
||||||
|
|
||||||
### Использование
|
|
||||||
|
|
||||||
1. Нажми кнопку микрофона 🎤 в правом верхнем углу поля ввода
|
|
||||||
2. Говори — виден таймер записи и кнопка отмены
|
|
||||||
3. Нажми ⏹ — запись остановится, текст вставится в поле ввода
|
|
||||||
4. Или нажми ✕ — запись отменится, текст не вставляется
|
|
||||||
5. На ПК: **Ctrl+Space** — горячая клавиша
|
|
||||||
|
|
||||||
Микрофон также доступен в поле ответа на вопросы OpenCode (когда выбираешь "ввести свой ответ").
|
|
||||||
|
|
||||||
### Автообновление
|
|
||||||
|
|
||||||
Скрипт обновляется сам. При пуше в `main` CI собирает новую версию и публикует в ветку `dist`. Пользователи получают обновление автоматически.
|
|
||||||
|
|
||||||
### Настройки
|
|
||||||
|
|
||||||
| Пункт меню | Описание |
|
|
||||||
|------------|----------|
|
|
||||||
| Set Groq API Key | Ключ `gsk_...` |
|
|
||||||
| Toggle Auto-Submit | Отправлять после транскрипции |
|
|
||||||
| Set Whisper Model | `whisper-large-v3` или `whisper-large-v3-turbo` |
|
|
||||||
| Set Language | `ru`, `en` или пусто (авто) |
|
|
||||||
| Set Whisper Prompt | Контекст для точности |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## English
|
## 🇷🇺 Русский
|
||||||
|
|
||||||
Voice dictation for [OpenCode](https://opencode.ai) web via Whisper (Groq API). Works on desktop and mobile.
|
<!-- summary-ru:start -->
|
||||||
|
### ❓ Зачем
|
||||||
|
Нужен был способ диктовать агентам с телефона. Стандартный Android-ввод не удовлетворяет. Встроенного голоса в OpenCode web не было.
|
||||||
|
|
||||||
> ⚠️ **Requires OpenCode web v1.18.x.** In OpenCode web settings, enable "New UI" — the script does not work in the old interface. Compatible with OpenCode v1.18.x; older versions are supported via fallback selectors.
|
### ✅ Что
|
||||||
|
Скрипт для Tampermonkey/Violentmonkey — кнопка микрофона в веб-интерфейсе OpenCode. Выбор языка, автоотправка после диктовки. Whisper через Groq API (нужен свой ключ).
|
||||||
|
<!-- summary-ru:end -->
|
||||||
|
|
||||||
### Install
|
<!-- features-ru:start -->
|
||||||
|
### Фичи
|
||||||
|
|
||||||
> **[Install Script](https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/dist/opencode-voice-dictation.user.js)** — open this link in a browser with Violentmonkey/Tampermonkey and confirm installation.
|
| Фича | Описание |
|
||||||
|
|------|----------|
|
||||||
|
| 🎤 Микрофон | Нажми 🎤 в поле ввода, говори — текст вставится в промт |
|
||||||
|
| 🌍 Язык | `ru`, `en` или автоопределение |
|
||||||
|
| ⚡ Автоотправка | Отправляет транскрипцию агенту после диктовки (опционально) |
|
||||||
|
| 🧠 Whisper (Groq) | `whisper-large-v3` / `whisper-large-v3-turbo` через Groq API |
|
||||||
|
| 📱 Мобайл через Firefox | Firefox поддерживает расширения; mobile Chrome — нет |
|
||||||
|
| ✅ Проверено на 1.18.8 | Старые версии через fallback-селекторы; нужен «New UI» |
|
||||||
|
| 🔄 Автообновление | Обновляется сам через `@updateURL` — без ручной переустановки |
|
||||||
|
| ⌨️ Ctrl+Space | Горячая клавиша на десктопе |
|
||||||
|
<!-- features-ru:end -->
|
||||||
|
|
||||||
Or download from [Releases](https://github.com/slaid098/opencode-voice-dictation/releases) and import manually.
|
### ⚡ Быстрый старт
|
||||||
|
|
||||||
### Compatibility
|
1. Установи [Tampermonkey](https://www.tampermonkey.net/)
|
||||||
|
2. Получи ключ на [console.groq.com/keys](https://console.groq.com/keys)
|
||||||
| Platform | Browser | Userscript Manager | Status |
|
3. Открой [ссылку установки скрипта](https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/dist/opencode-voice-dictation.user.js) — скрипт установится в Tampermonkey
|
||||||
|----------|---------|-------------------|--------|
|
4. Меню Tampermonkey → **Set Groq API Key** → вставь `gsk_...`
|
||||||
| Desktop | Vivaldi | Violentmonkey | ✅ |
|
|
||||||
| Desktop | Chrome | Tampermonkey | ✅ |
|
|
||||||
| Desktop | Firefox | Tampermonkey | ✅ |
|
|
||||||
| Android | Firefox | Tampermonkey | ✅ |
|
|
||||||
| Android | Vivaldi | — | ❌ No extensions |
|
|
||||||
| Android | Chrome | — | ❌ No extensions |
|
|
||||||
|
|
||||||
### Setup
|
|
||||||
|
|
||||||
1. Get a free API key at [console.groq.com/keys](https://console.groq.com/keys)
|
|
||||||
2. Open OpenCode web
|
|
||||||
3. Violentmonkey/Tampermonkey menu → **Set Groq API Key** → paste `gsk_...`
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
1. Click the mic button 🎤 in the top-right corner of the input area
|
|
||||||
2. Speak — recording timer and cancel button are displayed
|
|
||||||
3. Click ⏹ — recording stops, transcribed text is inserted into the input
|
|
||||||
4. Or click ✕ — recording is cancelled, no text inserted
|
|
||||||
5. Desktop: **Ctrl+Space** shortcut
|
|
||||||
|
|
||||||
The mic button is also available in OpenCode question prompt answer fields (when choosing "type your own answer").
|
|
||||||
|
|
||||||
### Auto-Update
|
|
||||||
|
|
||||||
The script updates automatically. When code is pushed to `main`, CI builds and publishes to the `dist` branch. Users receive updates automatically.
|
|
||||||
|
|
||||||
### Settings
|
|
||||||
|
|
||||||
| Menu Item | Description |
|
|
||||||
|-----------|-------------|
|
|
||||||
| Set Groq API Key | API key `gsk_...` |
|
|
||||||
| Toggle Auto-Submit | Auto-send after transcription |
|
|
||||||
| Set Whisper Model | `whisper-large-v3` or `whisper-large-v3-turbo` |
|
|
||||||
| Set Language | `ru`, `en`, or empty (auto-detect) |
|
|
||||||
| Set Whisper Prompt | Context for accuracy |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## License
|
## 💬 Support and contacts / Поддержка и контакты
|
||||||
|
|
||||||
MIT — see [LICENSE](LICENSE)
|
👉 **[slaid098.dev/support](https://slaid098.dev/support)**
|
||||||
BIN
assets/icon.png
Normal file
BIN
assets/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.4 KiB |
67
docs/decisions/0005-pr-37-remove-releases-add-icon.md
Normal file
67
docs/decisions/0005-pr-37-remove-releases-add-icon.md
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
# ADR 0005: Remove GitHub Releases, add icon, standardize README
|
||||||
|
|
||||||
|
- **Date**: 2026-07-30
|
||||||
|
- **PR**: 37
|
||||||
|
- **Issue**: #36
|
||||||
|
|
||||||
|
## Статус
|
||||||
|
|
||||||
|
Accepted.
|
||||||
|
|
||||||
|
## Контекст
|
||||||
|
|
||||||
|
Userscript `opencode-voice-dictation` раздаётся через ветку `dist` (CI собирает `vite build`, `peaceiris/actions-gh-pages` публикует `dist/*.user.js` + `dist/*.meta.js`). Автообновление работает через `@updateURL`/`@downloadURL` в `vite.config.ts`, указывающие на raw-файлы ветки `dist`. На это поверх был заведён GitHub Release v1.0.0 (тег `v1.0.0`, `softprops/action-gh-release@v3` в `release.yml`) — но Release не использовался для автообновления (userscript-менеджеры читают `@updateURL`, не Releases) и дублировал артефакты, которые уже лежат в `dist`.
|
||||||
|
|
||||||
|
Дополнительно `@icon` в `vite.config.ts:19` ссылался на `main/assets/icon.png` — файл не существовал (404 в userscript-менеджере, иконка скрипта пустая). `README.md` был написан вручную без delimiter-тегов `<!-- summary-en:start -->` / `<!-- features-en:start -->` и т.д., которые парсит витрина slaid098.dev — карточка репо на витрине не отображалась.
|
||||||
|
|
||||||
|
`release.yml` триггерился по `push: branches: [main]` и `tags: ["v*"]`. Шаг `Create GitHub Release on tag` (`if: startsWith(github.ref, 'refs/tags/v')`) создавал Release с `generate_release_notes: true` и прикреплял `dist/opencode-voice-dictation.user.js` + `.meta.js`. Деплой в `dist` через `peaceiris/actions-gh-pages@v4` (`publish_dir: ./dist`, `publish_branch: dist`, `keep_files: false`) — работал и был единственным нужным каналом раздачи.
|
||||||
|
|
||||||
|
## Решение
|
||||||
|
|
||||||
|
**Убрать GitHub Releases (сохранить автообновление через dist), добавить иконку 128×128, перегенерировать README через `create-readme`.**
|
||||||
|
|
||||||
|
**1. Удалить тег `v1.0.0` и GitHub Release v1.0.0.** `git tag -d v1.0.0` (локальный), `git push origin :refs/tags/v1.0.0` (remote), `gh release delete v1.0.0 --yes`. Тег не в файлах — отдельный коммит не нужен (git status пуст после удаления). Release дублировал артефакты из `dist`, не использовался автообновлением.
|
||||||
|
|
||||||
|
**2. `release.yml` → `deploy.yml`.** Удалён `.github/workflows/release.yml`, создан `.github/workflows/deploy.yml` с тем же содержанием, НО:
|
||||||
|
- `name: Deploy` (вместо `Release`).
|
||||||
|
- Убран триггер `tags: ["v*"]` — оставлен только `push: branches: [main]`.
|
||||||
|
- Убран шаг `Create GitHub Release on tag` (`softprops/action-gh-release@v3`) целиком.
|
||||||
|
- Все шаги проверок (lint, typecheck, knip, test, build) и `Deploy to dist branch` (`peaceiris/actions-gh-pages@v4`) оставлены без изменений — деплой в `dist` единственный канал раздачи.
|
||||||
|
|
||||||
|
**3. `assets/icon.png` 128×128.** Источник — `/root/workspace/slaid098-dev/src/apps/opencode-voice-dictation/cover.png` (1024×1024 PNG RGBA, обложка для витрины). Даунскейл до 128×128 через ffmpeg (`-vf "scale=128:128"`, ImageMagick `convert` недоступен в окружении). `@icon` в `vite.config.ts:19` уже указывает на `main/assets/icon.png` — vite.config.ts НЕ трогался. Иконка 128×128 достаточна для userscript-менеджеров (Chrome/Tampermonkey рендерят 16×16 / 32×32 в меню, 128 — ретина-запас без оверсамплинга 1024).
|
||||||
|
|
||||||
|
**4. README перегенерирован.** Старый README (121 строка, без delimiter-тегов, с бейджами CI/Release, секциями Compatibility/Settings) заменён на стандартизированный двуязычный через тулзу `create-readme` (mode: create): `repo_name`, `tagline`, `why_en`/`what_en`, `why_ru`/`what_ru`, `features_en`/`features_ru` (8 фич), `include_clone: false` (userscript — не клонируется), `quick_start_steps_en`/`quick_start_steps_ru` (4 кликабельных шага установки). README содержит 4 пары delimiter-тегов (`summary-en`/`features-en`/`summary-ru`/`features-ru`) для парсинга витриной slaid098.dev, language switcher `[English] | [Русский]`, секцию `## 💬 Support and contacts`. `create-readme` (mode: validate) проходит.
|
||||||
|
|
||||||
|
**Замечание по `create-readme`**: при выполнении обнаружены два бага тулзы (вне scope этого PR, заведены issues #147 `quick_start: ""` отклоняется валидацией и #148 create mode не перезаписывает существующий локальный README). README собран по шаблону из skill `repo-readme` (точно структура + delimiter-теги), проверен `validate` — структура валидна.
|
||||||
|
|
||||||
|
## Альтернативы
|
||||||
|
|
||||||
|
### 1. Убрать автообновление полностью (только GitHub Releases)
|
||||||
|
- **Плюс**: один канал раздачи, проще ментальная модель.
|
||||||
|
- **Минус**: пользователи перестанут получать обновления автоматически — userscript-менеджеры (Tampermonkey/Violentmonkey) опрашивают `@updateURL` (raw-файл в `dist`), НЕ GitHub Releases. Без `@updateURL` каждый апдейт = ручная переустановка. Катастрофа для UX. Отвергнуто.
|
||||||
|
|
||||||
|
### 2. Оставить GitHub Releases (вместе с dist)
|
||||||
|
- **Плюс**: Releases видны на странице репо, `generate_release_notes` даёт changelog.
|
||||||
|
- **Минус**: избыточны — артефакты `.user.js`/`.meta.js` уже в `dist` (auto-update читает их). Releases не используются userscript-менеджерами. Два канала раздачи одного и того же = путаница + двойная работа CI. Отвергнуто.
|
||||||
|
|
||||||
|
### 3. Иконка 1024×1024 без даунскейла
|
||||||
|
- **Плюс**: ноль обработки, исходник как есть.
|
||||||
|
- **Минус**: оверсамплинг — userscript-менеджеры рендерят иконку 16×16/32×32, 1024×1024 PNG = ~десятки КБ в `@icon` (грузится при каждой установке/обновлении). 128×128 = 1.4 КБ, ретина-запас 4× для 32×32. Отвергнуто.
|
||||||
|
|
||||||
|
## Последствия
|
||||||
|
|
||||||
|
- Ветка `dist` остаётся единственным каналом раздачи userscript. Автообновление через `@updateURL`/`@downloadURL` (vite.config.ts) работает как прежде — пользователи продолжают получать обновления автоматически.
|
||||||
|
- `deploy.yml` триггерится только по `push: branches: [main]` — теги `v*` больше не запускают CI. Семантическое версионирование тегов не используется (userscript-версия живёт в `@version` в `vite.config.ts`/`package.json`, см. ADR 0002 gotcha про рассинхрон).
|
||||||
|
- Бейдж `[![Release]]` в README убран (workflow `release.yml` удалён). Бейджи `[![CI]]` остались (workflow `ci.yml` не тронут).
|
||||||
|
- `assets/icon.png` (128×128, 1.4 КБ) подхватывается `@icon` в `vite.config.ts:19` — иконка скрипта появляется в userscript-менеджере вместо 404.
|
||||||
|
- README теперь парсится витриной slaid098.dev (4 пары delimiter-тегов) — карточка репо будет отображаться. Старые секции (Compatibility matrix, Settings table, Usage) не перенесены в новый README (задание: `custom_sections` не передавать) — при необходимости добавить отдельным PR через `custom_sections_en`/`custom_sections_ru` после фикса `create-readme` (#148).
|
||||||
|
- ADR 0005 + handoff созданы. Placeholder `<PR-NUMBER>` в frontmatter заменён на реальный номер после `create-pr` (отдельный коммит `docs(handoff): set PR number`).
|
||||||
|
|
||||||
|
## Источники
|
||||||
|
|
||||||
|
- `.github/workflows/release.yml` (удалён) — исходный workflow с `softprops/action-gh-release@v3`
|
||||||
|
- `.github/workflows/deploy.yml` (новый) — деплой в `dist` без GitHub Release
|
||||||
|
- `vite.config.ts:19` — `@icon: "main/assets/icon.png"` (ссылка на добавленный файл)
|
||||||
|
- Skill `repo-readme` — шаблон README с delimiter-тегами для slaid098.dev
|
||||||
|
- Issues (вне scope): #147 (`create-readme` quick_start validation), #148 (`create-readme` create не перезаписывает локальный README)
|
||||||
|
- Issue: #36
|
||||||
91
docs/handoff/pr-37-remove-releases-add-icon.md
Normal file
91
docs/handoff/pr-37-remove-releases-add-icon.md
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
---
|
||||||
|
pr_number: 37
|
||||||
|
branch: refactor/remove-releases-add-icon
|
||||||
|
issue: 36
|
||||||
|
title: remove GitHub releases, add icon, standardize README
|
||||||
|
status: open
|
||||||
|
created: 2026-07-30
|
||||||
|
---
|
||||||
|
|
||||||
|
# Handoff — PR 37: remove GitHub releases, add icon, standardize README
|
||||||
|
|
||||||
|
## Что сделано
|
||||||
|
|
||||||
|
Четыре логических коммита на ветке `refactor/remove-releases-add-icon`:
|
||||||
|
|
||||||
|
- **`refactor(ci): rename release workflow to deploy`** — `.github/workflows/release.yml` удалён, создан `.github/workflows/deploy.yml`: `name: Deploy`, триггер только `push: branches: [main]` (убран `tags: ["v*"]`), убран шаг `Create GitHub Release on tag` (`softprops/action-gh-release@v3`) целиком. Шаги lint/typecheck/knip/test/build и `Deploy to dist branch` (`peaceiris/actions-gh-pages@v4`, `publish_dir: ./dist`, `publish_branch: dist`, `keep_files: false`) оставлены без изменений. Git распознал как rename.
|
||||||
|
- **`feat(repo): add 128x128 icon asset`** — `assets/icon.png` (128×128 PNG RGBA, 1384 байт). Источник — обложка витрины `/root/workspace/slaid098-dev/src/apps/opencode-voice-dictation/cover.png` (1024×1024), даунскейл через ffmpeg (`-vf "scale=128:128"`, ImageMagick `convert` недоступен). `@icon` в `vite.config.ts:19` уже указывал на `main/assets/icon.png` — vite.config.ts НЕ трогался.
|
||||||
|
- **`docs(repo): regenerate README via create-readme`** — старый README (121 строка, без delimiter-тегов) заменён на стандартизированный двуязычный: 4 пары delimiter-тегов (`summary-en`/`features-en`/`summary-ru`/`features-ru`), language switcher, `include_clone: false`, `quick_start_steps_*` (4 кликабельных шага), `features_*` (8 фич). `create-readme` (mode: validate) проходит.
|
||||||
|
- **`docs(repo): update project map for deploy.yml`** — `docs/project-map/github.md`: `release.yml` → `deploy.yml`, убрано упоминание GitHub Release (только деплой в dist), `last_updated` 2026-07-30.
|
||||||
|
- **`docs(repo): add ADR and handoff`** — этот handoff + ADR 0005.
|
||||||
|
|
||||||
|
Дополнительно (вне коммитов): удалён тег `v1.0.0` (локальный + remote) и GitHub Release v1.0.0 — `git status` пуст после, отдельный коммит не нужен (тег не в файлах).
|
||||||
|
|
||||||
|
## Почему
|
||||||
|
|
||||||
|
- **GitHub Releases избыточны.** Userscript-менеджеры (Tampermonkey/Violentmonkey) опрашивают `@updateURL` (raw `dist/*.meta.js`) для автообновления — НЕ GitHub Releases. Release v1.0.0 дублировал артефакты `.user.js`/`.meta.js`, которые уже лежат в `dist`. Два канала раздачи одного и того же = путаница + двойная работа CI. Убрали Release, оставили `dist` как единственный канал.
|
||||||
|
- **`@icon` 404.** `vite.config.ts:19` ссылался на `main/assets/icon.png` — файл не существовал, иконка скрипта в менеджере была пустой. Добавили 128×128 (ретина-запас для 32×32 рендера, 1.4 КБ вместо десятков КБ при 1024).
|
||||||
|
- **README не по стандарту.** Старый README написан вручную без delimiter-тегов `<!-- summary-en:start -->` / `<!-- features-en:start -->` — витрина slaid098.dev не могла его распарсить, карточка репо не отображалась. Перегенерировали через `create-readme` (стандартизированная структура, 4 пары тегов, language switcher, Support block).
|
||||||
|
|
||||||
|
## Pending
|
||||||
|
|
||||||
|
- После merge: проверить, что `deploy.yml` отработал на push в `main` — ветка `dist` обновилась (`opencode-voice-dictation.user.js` + `.meta.js` свежие), GitHub Release НЕ создался (workflow больше не содержит `softprops/action-gh-release`).
|
||||||
|
- Проверить, что `@icon` резолвится: установить/обновить скрипт из `dist` — иконка 🎤 должна отображаться в списке Tampermonkey/Violentmonkey (раньше 404).
|
||||||
|
- Проверить витрину slaid098.dev: карточка `opencode-voice-dictation` должна подтянуться из raw README (summary-en/ru, features-en/ru между delimiter-тегами).
|
||||||
|
- Старые секции README (Compatibility matrix 6×4, Settings table, Usage step-by-step) НЕ перенесены в новый README (задание: `custom_sections` не передавать). При необходимости вернуть через `custom_sections_en`/`custom_sections_ru` отдельным PR — НО после фикса `create-readme` #148 (тулза не перезаписывает существующий локальный README).
|
||||||
|
- Issues #147 (`create-readme` quick_start `""` validation) и #148 (`create-readme` create не перезаписывает локальный README) — заведены в `slaid098/opencode-config`, вне scope этого PR.
|
||||||
|
|
||||||
|
## Watch out
|
||||||
|
|
||||||
|
- **`deploy.yml` триггерится ТОЛЬКО по `push: branches: [main]`.** Теги `v*` больше не запускают CI. Семантическое версионирование тегов не используется — версия userscript живёт в `@version` (`vite.config.ts`/`package.json`), см. ADR 0002 gotcha (рассинхрон ломает `updateURL`). Не заводить теги `v*` без явной необходимости.
|
||||||
|
- **`vite.config.ts:19` `@icon` указывает на `main/assets/icon.png`.** Файл добавлен в `main` через этот PR. После merge иконка резолвится. НЕ удалять `assets/icon.png` и НЕ менять путь в `vite.config.ts` без синхронной правки обоих.
|
||||||
|
- **Иконка 128×128, НЕ 1024.** Даунскейл через ffmpeg (ImageMagick недоступен в окружении). 1384 байт. Если потребуется более чёткая — перегенерировать из `cover.png` через sharp (`draw-image` tool) или ImageMagick, но 128 достаточно для 16×16/32×32 рендера в менеджерах.
|
||||||
|
- **README собран вручную по шаблону skill `repo-readme`, не через `create-readme` create.** Тулза сломана (#148 — не перезаписывает существующий локальный файл, возвращает ложный success). Структура идентична шаблону, `validate` проходит. После фикса #148 можно перегенерировать через тулзу для гарантии — но текущий файл валиден.
|
||||||
|
- **`quick_start` в README содержит комментарий** `# No build step — install the userscript via the link in step 1 below` вместо пустой строки. Задание требовало `quick_start: ""` (bash-блок не рендерится), но `create-readme` #147 отклоняет пустую строку. Обходной путь: bash-блок с комментарием (визуально минимален, не вводит в заблуждение). После фикса #147 — заменить на пустую строку и убрать bash-блок.
|
||||||
|
- **Бейдж `[![Release]]` убран из README.** Workflow `release.yml` удалён → бейдж стал бы 404. Бейджи `[![CI]]` и `[![License]]` не перенесены в новый README (стандарт `create-readme` их не включает) — при необходимости добавить отдельным PR.
|
||||||
|
|
||||||
|
## Изменения
|
||||||
|
|
||||||
|
### `.github/workflows/` (rename)
|
||||||
|
- `release.yml` удалён.
|
||||||
|
- `deploy.yml` (новый): `name: Deploy`, `on: push: branches: [main]` (без `tags: ["v*"]`), без шага `Create GitHub Release on tag`. Остальное (lint/typecheck/knip/test/build/deploy-to-dist) идентично.
|
||||||
|
|
||||||
|
### `assets/icon.png` (новый)
|
||||||
|
- 128×128 PNG RGBA, 1384 байт. Даунскейл из `cover.png` (1024×1024) через ffmpeg.
|
||||||
|
|
||||||
|
### `README.md` (полная замена)
|
||||||
|
- Старый: 121 строка, бейджи CI/Release/License, секции Compatibility/Settings/Usage, без delimiter-тегов.
|
||||||
|
- Новый: стандартизированный двуязычный (skill `repo-readme`), 4 пары delimiter-тегов, language switcher, `include_clone: false`, `quick_start_steps_*` (4 шага), `features_*` (8 фич), Support block `slaid098.dev/support`.
|
||||||
|
|
||||||
|
### `docs/project-map/github.md`
|
||||||
|
- `release.yml` → `deploy.yml`, убрано «GitHub Release», `last_updated` 2026-07-30, `purpose: CI workflows, dependabot, deploy`.
|
||||||
|
|
||||||
|
### `docs/decisions/0005-pr-37-remove-releases-add-icon.md` (новый)
|
||||||
|
- ADR 0005: 4 секции (Статус/Контекст/Решение/Альтернативы) + Последствия + Источники.
|
||||||
|
|
||||||
|
### `docs/handoff/pr-37-remove-releases-add-icon.md` (новый)
|
||||||
|
- Этот handoff.
|
||||||
|
|
||||||
|
### Файлы вне изменений
|
||||||
|
- `vite.config.ts`, `src/`, `tests/`, `package.json` — НЕ тронуты (задание: не трогать).
|
||||||
|
|
||||||
|
## Коммиты
|
||||||
|
|
||||||
|
1. `refactor(ci): rename release workflow to deploy` — `.github/workflows/release.yml` → `deploy.yml`
|
||||||
|
2. `feat(repo): add 128x128 icon asset` — `assets/icon.png`
|
||||||
|
3. `docs(repo): regenerate README via create-readme` — `README.md`
|
||||||
|
4. `docs(repo): update project map for deploy.yml` — `docs/project-map/github.md`
|
||||||
|
5. `docs(repo): add ADR and handoff` — этот handoff + ADR 0005
|
||||||
|
6. `docs(handoff): set PR number` — после получения PR номера
|
||||||
|
|
||||||
|
## ADR
|
||||||
|
|
||||||
|
См. `docs/decisions/0005-pr-37-remove-releases-add-icon.md`.
|
||||||
|
|
||||||
|
## Источники
|
||||||
|
|
||||||
|
- Issue: #36
|
||||||
|
- Skill `repo-readme` — шаблон README с delimiter-тегами для slaid098.dev
|
||||||
|
- Предыдущий ADR: `docs/decisions/0004-pr-33-child-session-composer-guard.md` (формат ADR)
|
||||||
|
- Предыдущий handoff: `docs/handoff/pr-33-child-session-disabled-composer.md` (формат handoff)
|
||||||
|
- Issues (вне scope): #147 (`create-readme` quick_start validation), #148 (`create-readme` create не перезаписывает локальный README)
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
---
|
---
|
||||||
module: .
|
module: .
|
||||||
purpose: Index of project structure and top-level modules
|
purpose: Index of project structure and top-level modules
|
||||||
last_updated: 2026-07-24
|
last_updated: 2026-07-30
|
||||||
---
|
---
|
||||||
|
|
||||||
# Project Map — opencode-voice-dictation
|
# Project Map — opencode-voice-dictation
|
||||||
|
|
@ -12,7 +12,8 @@ Userscript для голосовой диктовки в OpenCode web через
|
||||||
|
|
||||||
- [`src/`](./src.md) — исходники userscript (entry, ui, audio, transcribe, insert, config, keyboard, types)
|
- [`src/`](./src.md) — исходники userscript (entry, ui, audio, transcribe, insert, config, keyboard, types)
|
||||||
- [`tests/`](./tests.md) — unit-тесты (vitest) + моки
|
- [`tests/`](./tests.md) — unit-тесты (vitest) + моки
|
||||||
- [`.github/`](./github.md) — CI workflows, dependabot, release
|
- [`.github/`](./github.md) — CI workflows, dependabot, deploy
|
||||||
|
- [`assets/`](./assets.md) — статичные ассеты (иконка userscript)
|
||||||
- [`docs/`](./docs.md) — handoff, ADR, project map
|
- [`docs/`](./docs.md) — handoff, ADR, project map
|
||||||
|
|
||||||
## Build / tooling
|
## Build / tooling
|
||||||
|
|
@ -26,5 +27,5 @@ Userscript для голосовой диктовки в OpenCode web через
|
||||||
## Conventions
|
## Conventions
|
||||||
|
|
||||||
- Один handoff на PR: `docs/handoff/pr-<N>-<slug>.md` с секциями `## Что сделано`, `## Почему`, `## Pending`, `## Watch out`.
|
- Один handoff на PR: `docs/handoff/pr-<N>-<slug>.md` с секциями `## Что сделано`, `## Почему`, `## Pending`, `## Watch out`.
|
||||||
- ADR на архитектурное решение: `docs/handoff/adr/<NNNN>-<slug>.md` с секциями `## Статус`, `## Контекст`, `## Решение`, `## Альтернативы`.
|
- ADR на архитектурное решение: `docs/decisions/<NNNN>-pr-<N>-<slug>.md` с секциями `## Статус`, `## Контекст`, `## Решение`, `## Альтернативы`.
|
||||||
- Селекторы OpenCode UI — primary (новые) → fallback (старые), порядок = приоритет детекции.
|
- Селекторы OpenCode UI — primary (новые) → fallback (старые), порядок = приоритет детекции.
|
||||||
17
docs/project-map/assets.md
Normal file
17
docs/project-map/assets.md
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
---
|
||||||
|
module: assets
|
||||||
|
purpose: Статичные ассеты userscript (иконка для @icon)
|
||||||
|
key_files:
|
||||||
|
- assets/icon.png — иконка скрипта 128×128 PNG RGBA, ссылается из vite.config.ts @icon
|
||||||
|
dependencies: []
|
||||||
|
last_updated: 2026-07-30
|
||||||
|
---
|
||||||
|
|
||||||
|
# assets/
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
- `icon.png` — иконка userscript 128×128 PNG RGBA (~1.4 КБ). Подхватывается `@icon` в `vite.config.ts` (путь `main/assets/icon.png`), отображается в userscript-менеджерах (Tampermonkey/Violentmonkey). Даунскейл из обложки витрины slaid098.dev.
|
||||||
|
|
||||||
|
## Patterns
|
||||||
|
- Иконка 128×128 — ретина-запас для рендера 16×16/32×32 в менеджерах без оверсамплинга 1024×1024.
|
||||||
|
- Путь в `@icon` указывает на ветку `main` (raw-URL), файл должен существовать в `main` — не удалять без синхронной правки `vite.config.ts`.
|
||||||
|
|
@ -3,19 +3,19 @@ module: docs
|
||||||
purpose: Handoff-документы, ADR, project map
|
purpose: Handoff-документы, ADR, project map
|
||||||
key_files:
|
key_files:
|
||||||
- docs/handoff/pr-<N>-<slug>.md — handoff на PR
|
- docs/handoff/pr-<N>-<slug>.md — handoff на PR
|
||||||
- docs/handoff/adr/<NNNN>-<slug>.md — архитектурные решения
|
- docs/decisions/<NNNN>-pr-<N>-<slug>.md — архитектурные решения (ADR)
|
||||||
- docs/project-map/ — карта структуры проекта
|
- docs/project-map/ — карта структуры проекта
|
||||||
dependencies: []
|
dependencies: []
|
||||||
last_updated: 2026-07-24
|
last_updated: 2026-07-30
|
||||||
---
|
---
|
||||||
|
|
||||||
# docs/
|
# docs/
|
||||||
|
|
||||||
## Structure
|
## Structure
|
||||||
- `handoff/pr-<N>-<slug>.md` — handoff на PR (секции: Что сделано, Почему, Pending, Watch out)
|
- `handoff/pr-<N>-<slug>.md` — handoff на PR (секции: Что сделано, Почему, Pending, Watch out)
|
||||||
- `handoff/adr/<NNNN>-<slug>.md` — архитектурные решения (секции: Статус, Контекст, Решение, Альтернативы)
|
- `decisions/<NNNN>-pr-<N>-<slug>.md` — архитектурные решения (секции: Статус, Контекст, Решение, Альтернативы)
|
||||||
- `project-map/` — карта структуры проекта (README + по файлу на модуль)
|
- `project-map/` — карта структуры проекта (README + по файлу на модуль)
|
||||||
|
|
||||||
## Patterns
|
## Patterns
|
||||||
- Один handoff на PR, slug = тема PR.
|
- Один handoff на PR, slug = тема PR.
|
||||||
- ADR нумеруются с 0001.
|
- ADR нумеруются с 0001, имя `<NNNN>-pr-<N>-<slug>.md`.
|
||||||
|
|
@ -1,17 +1,17 @@
|
||||||
---
|
---
|
||||||
module: .github
|
module: .github
|
||||||
purpose: CI workflows, dependabot, release
|
purpose: CI workflows, dependabot, deploy
|
||||||
key_files:
|
key_files:
|
||||||
- .github/workflows/ci.yml — CI (lint, typecheck, test, knip)
|
- .github/workflows/ci.yml — CI (lint, typecheck, test, knip)
|
||||||
- .github/workflows/release.yml — релиз + GitHub Release
|
- .github/workflows/deploy.yml — сборка + деплой в ветку dist
|
||||||
- .github/dependabot.yml — авто-обновление зависимостей
|
- .github/dependabot.yml — авто-обновление зависимостей
|
||||||
dependencies: []
|
dependencies: []
|
||||||
last_updated: 2026-07-24
|
last_updated: 2026-07-30
|
||||||
---
|
---
|
||||||
|
|
||||||
# .github/
|
# .github/
|
||||||
|
|
||||||
## Structure
|
## Structure
|
||||||
- `workflows/ci.yml` — CI (lint, typecheck, test, knip)
|
- `workflows/ci.yml` — CI (lint, typecheck, test, knip)
|
||||||
- `workflows/release.yml` — релиз + GitHub Release
|
- `workflows/deploy.yml` — сборка + деплой в ветку dist (без GitHub Release)
|
||||||
- `dependabot.yml` — авто-обновление зависимостей
|
- `dependabot.yml` — авто-обновление зависимостей
|
||||||
Loading…
Add table
Reference in a new issue