From 4542bd888379e39b1efef1648309788d7d6cbc43 Mon Sep 17 00:00:00 2001 From: Sergey <93754860+slaid098@users.noreply.github.com> Date: Thu, 30 Jul 2026 03:39:20 +0300 Subject: [PATCH] refactor(repo): remove GitHub releases, add icon, standardize README (#37) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Что сделано - Убран тег 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 --- .github/workflows/{release.yml => deploy.yml} | 14 +- README.md | 153 +++++++----------- assets/icon.png | Bin 0 -> 1384 bytes .../0005-pr-37-remove-releases-add-icon.md | 67 ++++++++ .../handoff/pr-37-remove-releases-add-icon.md | 91 +++++++++++ docs/project-map/README.md | 7 +- docs/project-map/assets.md | 17 ++ docs/project-map/docs.md | 8 +- docs/project-map/github.md | 8 +- 9 files changed, 244 insertions(+), 121 deletions(-) rename .github/workflows/{release.yml => deploy.yml} (66%) create mode 100644 assets/icon.png create mode 100644 docs/decisions/0005-pr-37-remove-releases-add-icon.md create mode 100644 docs/handoff/pr-37-remove-releases-add-icon.md create mode 100644 docs/project-map/assets.md diff --git a/.github/workflows/release.yml b/.github/workflows/deploy.yml similarity index 66% rename from .github/workflows/release.yml rename to .github/workflows/deploy.yml index d8276ae..3d321e8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/deploy.yml @@ -1,9 +1,8 @@ -name: Release +name: Deploy on: push: branches: [main] - tags: ["v*"] permissions: contents: write @@ -42,13 +41,4 @@ jobs: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./dist publish_branch: dist - 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 + keep_files: false \ No newline at end of file diff --git a/README.md b/README.md index a9060fa..3988c1d 100644 --- a/README.md +++ b/README.md @@ -1,121 +1,78 @@ -# OpenCode Voice Dictation / Голосовая диктовка для OpenCode +# 🚀 opencode-voice-dictation +> Voice dictation for OpenCode web — mic button via Whisper (Groq API) -[![CI](https://github.com/slaid098/opencode-voice-dictation/actions/workflows/ci.yml/badge.svg)](https://github.com/slaid098/opencode-voice-dictation/actions/workflows/ci.yml) -[![Release](https://github.com/slaid098/opencode-voice-dictation/actions/workflows/release.yml/badge.svg)](https://github.com/slaid098/opencode-voice-dictation/actions/workflows/release.yml) -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[English](#-english) | [Русский](#-русский) --- -## Русский +## 🇺🇸 English -Голосовая диктовка для [OpenCode](https://opencode.ai) web через Whisper (Groq API). Работает на ПК и телефоне. + +### ❓ 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). + -### Установка + +### 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 | + -Или скачай с [Releases](https://github.com/slaid098/opencode-voice-dictation/releases) и импортируй вручную. +### ⚡ Quick Start -### Совместимость - -| Платформа | Браузер | Менеджер скриптов | Статус | -|-----------|---------|-------------------|--------| -| ПК | 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 | Контекст для точности | +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_...` --- -## English +## 🇷🇺 Русский -Voice dictation for [OpenCode](https://opencode.ai) web via Whisper (Groq API). Works on desktop and mobile. + +### ❓ Зачем +Нужен был способ диктовать агентам с телефона. Стандартный 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 (нужен свой ключ). + -### Install + +### Фичи -> **[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 | Горячая клавиша на десктопе | + -Or download from [Releases](https://github.com/slaid098/opencode-voice-dictation/releases) and import manually. +### ⚡ Быстрый старт -### Compatibility - -| Platform | Browser | Userscript Manager | Status | -|----------|---------|-------------------|--------| -| 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 | +1. Установи [Tampermonkey](https://www.tampermonkey.net/) +2. Получи ключ на [console.groq.com/keys](https://console.groq.com/keys) +3. Открой [ссылку установки скрипта](https://raw.githubusercontent.com/slaid098/opencode-voice-dictation/dist/opencode-voice-dictation.user.js) — скрипт установится в Tampermonkey +4. Меню Tampermonkey → **Set Groq API Key** → вставь `gsk_...` --- -## License +## 💬 Support and contacts / Поддержка и контакты -MIT — see [LICENSE](LICENSE) +👉 **[slaid098.dev/support](https://slaid098.dev/support)** \ No newline at end of file diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f8abaa50419f1cb5919f053ce4cfd812408e6c39 GIT binary patch literal 1384 zcmY*Z3pCVe6u&bbGs2FJT1=A>o9Q)8vC3(~X4RuIq8sjyaC1a#^*wfj%=iK`{_kQQx-|xHMJzvTW?``^v@QVOI zpXToBr$%JnvD)f*hkEdV8gwGu1CFZ^wctK0?>+<2!qZ%T+;uX0tZ%y)fnnVGuD6dr zcS-9+er(1T-r^0ujz_$3SIkfA-u?;e=0d0A%x$WTJ(f_is!#82I`X8@rkiK#$SE># zxpg14#pOGj1AiWwvwxmsWW>p4eyc~D+cRvXuu|l{AzE511d5Iihht3e&)&rc-R~!e z4b8v+u%HQOKq24^pVLY`XR3ftEsMtGb@i+wpE*^%g!gV;&*r{u;x^%W)KH?3V(Z>U z&lwN-VMWn0h>gBPwe!6?8>%`fSqky-VZ}*?h9*c}EXPNE&r7+Q>ZnGijq{L-N8Snw zzMnZ9%GN}DfqYvO&LX=@E|fV=oHoozUPV%F-WmD9b*C)`jL`#eZg#VNdlS-R(i1c1 zxIydP9*<2hX51_pp;StGnPLdQCaABy0Et-64DH38@l5`L}+SY-e{*uuP2w8Y* zp7paK^;+c>6)Si=US(tBet%C-&&t|bO9uxBNY+5c$JxgSGUu9_8k%swwle`HCnpKU z&T(-L5T@PL-97(mUt2i_rcrdwyt=y0j>Rdi1tn2oOeP6lql4LOZ*`Pj7|_+#wX(7@9~>O?x3RZhQ&m+3$-2nQ49CROG_#_jqQq~VwYBxvH2-A- zSoEqtJYFqt&d<*;!4n7>#l@@Pu2$>Yw}R5r()+{1q5krosj29X`%dl$!Xu+Ed+4Fv z+iST;p_R;K1yZd%Xow6doCHK$wXG0=FNE7Q>uFJdV06t>1bz zC$uZ2y5E|{QFaUBRQnR=Pj47!BWJy;em|!_y@?4=3|f8l7RWk?F$-9fM1$5yz!R4- z?SN|gI1=Kp%Aq|x)TsXmj#YNiizuM1s8H@vytP`KI{(}STQ4zX@MSrp{EJM{PSTc7FiAQ$}%xaAj2Sc`VW#QGT9F^ zmbUVsF~Ng+?>c@C5zNsM$B9T5l#`$bYo_pgemz5J1of=&Z0bE_BWg$1s7s8+HqEc`rO9O%bKkdz0$6h3U6NgoKS`MSsMn`jP3F81z&_YIg+` / `` и т.д., которые парсит витрина 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 `` в 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 \ No newline at end of file diff --git a/docs/handoff/pr-37-remove-releases-add-icon.md b/docs/handoff/pr-37-remove-releases-add-icon.md new file mode 100644 index 0000000..f33c5d2 --- /dev/null +++ b/docs/handoff/pr-37-remove-releases-add-icon.md @@ -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-тегов `` / `` — витрина 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) \ No newline at end of file diff --git a/docs/project-map/README.md b/docs/project-map/README.md index 4e00ef4..355f320 100644 --- a/docs/project-map/README.md +++ b/docs/project-map/README.md @@ -1,7 +1,7 @@ --- module: . purpose: Index of project structure and top-level modules -last_updated: 2026-07-24 +last_updated: 2026-07-30 --- # Project Map — opencode-voice-dictation @@ -12,7 +12,8 @@ Userscript для голосовой диктовки в OpenCode web через - [`src/`](./src.md) — исходники userscript (entry, ui, audio, transcribe, insert, config, keyboard, types) - [`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 ## Build / tooling @@ -26,5 +27,5 @@ Userscript для голосовой диктовки в OpenCode web через ## Conventions - Один handoff на PR: `docs/handoff/pr--.md` с секциями `## Что сделано`, `## Почему`, `## Pending`, `## Watch out`. -- ADR на архитектурное решение: `docs/handoff/adr/-.md` с секциями `## Статус`, `## Контекст`, `## Решение`, `## Альтернативы`. +- ADR на архитектурное решение: `docs/decisions/-pr--.md` с секциями `## Статус`, `## Контекст`, `## Решение`, `## Альтернативы`. - Селекторы OpenCode UI — primary (новые) → fallback (старые), порядок = приоритет детекции. \ No newline at end of file diff --git a/docs/project-map/assets.md b/docs/project-map/assets.md new file mode 100644 index 0000000..dbaf5eb --- /dev/null +++ b/docs/project-map/assets.md @@ -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`. \ No newline at end of file diff --git a/docs/project-map/docs.md b/docs/project-map/docs.md index bb09c64..36c990c 100644 --- a/docs/project-map/docs.md +++ b/docs/project-map/docs.md @@ -3,19 +3,19 @@ module: docs purpose: Handoff-документы, ADR, project map key_files: - docs/handoff/pr--.md — handoff на PR - - docs/handoff/adr/-.md — архитектурные решения + - docs/decisions/-pr--.md — архитектурные решения (ADR) - docs/project-map/ — карта структуры проекта dependencies: [] -last_updated: 2026-07-24 +last_updated: 2026-07-30 --- # docs/ ## Structure - `handoff/pr--.md` — handoff на PR (секции: Что сделано, Почему, Pending, Watch out) -- `handoff/adr/-.md` — архитектурные решения (секции: Статус, Контекст, Решение, Альтернативы) +- `decisions/-pr--.md` — архитектурные решения (секции: Статус, Контекст, Решение, Альтернативы) - `project-map/` — карта структуры проекта (README + по файлу на модуль) ## Patterns - Один handoff на PR, slug = тема PR. -- ADR нумеруются с 0001. \ No newline at end of file +- ADR нумеруются с 0001, имя `-pr--.md`. \ No newline at end of file diff --git a/docs/project-map/github.md b/docs/project-map/github.md index 3229cfe..cda96a4 100644 --- a/docs/project-map/github.md +++ b/docs/project-map/github.md @@ -1,17 +1,17 @@ --- module: .github -purpose: CI workflows, dependabot, release +purpose: CI workflows, dependabot, deploy key_files: - .github/workflows/ci.yml — CI (lint, typecheck, test, knip) - - .github/workflows/release.yml — релиз + GitHub Release + - .github/workflows/deploy.yml — сборка + деплой в ветку dist - .github/dependabot.yml — авто-обновление зависимостей dependencies: [] -last_updated: 2026-07-24 +last_updated: 2026-07-30 --- # .github/ ## Structure - `workflows/ci.yml` — CI (lint, typecheck, test, knip) -- `workflows/release.yml` — релиз + GitHub Release +- `workflows/deploy.yml` — сборка + деплой в ветку dist (без GitHub Release) - `dependabot.yml` — авто-обновление зависимостей \ No newline at end of file