fix(deploy): restore namespace and register menu commands at top-level #5

Merged
slaid098 merged 3 commits from fix/deploy/restore-namespace-and-menu into main 2026-08-08 16:10:20 +03:00
Owner

Что сделано

  1. vite.config.ts:10 — @namespace возвращён на https://github.com/slaid098/opencode-voice-dictation (старый, как идентификатор скрипта). @updateURL/@downloadURL/@icon остались на Forgejo (PR#3, рабочие).
  2. Version bump 1.0.6 → 1.0.7 синхронно в vite.config.ts:11 + package.json:3.
  3. src/index.ts — registerMenuCommands({...}) вынесен из init() (после gate) на top-level. Теперь 7 menu-команд (Set Groq API Key, Set STT Endpoint и др.) регистрируются на любой странице сразу при установке, не только на OpenCode. setupUI/setupKeyboardShortcut/checkFirstRun остались в init() после gate (зависят от DOM).
  4. AGENTS.md — добавлена секция ## @namespace с правилом: идентификатор, не URL, не менять при миграции хоста.

Почему

Дубликат скрипта: PR#3 сменил @namespace с github.com/... на git.slaid098.dev/.... Tampermonkey/Violentmonkey идентифицируют скрипт по паре @name + @namespace (Greasemonkey-стандарт). Смена = менеджер видит «новый» скрипт → создал дубликат вместо обновления. @namespace — это opaque string-ID, менеджеры НЕ резолвят его как URL. Возврат к старому = обновление существующего скрипта.

Пустое меню: 7 GM_registerMenuCommand вызывались внутри init() после isOpencodePage() gate (index.ts:207-211). На не-OpenCode странице gate → false → retry loop → команды не регистрировались → popup показывал только Edit/Delete. Вынос на top-level = меню доступно сразу после установки на любой странице. Callbacks используют GM_setValue (работает везде) + ui?.toast (optional chaining, no-op без UI) — безопасно.

Watch out

  • Старый скрипт 1.0.4 с мёртвым @updateURL (raw.githubusercontent.com → 404) НЕ автоапдейтнится. Пользователь должен один раз перейти по install-ссылке из README → TM предложит «обновить» (namespace совпадёт) → 1.0.4 → 1.0.7, без дубликата. После этого новый @updateURL (Forgejo) заработает для будущих автоапдейтов.
  • Menu-команды на не-OpenCode странице: GM_setValue сработает (config сохранится), ui?.toast no-op (нет UI). Пользователь не увидит toast-подтверждения, но значение сохранится. При переходе на OpenCode страницу config подхватится.
  • @updateURL/@downloadURL/@icon НЕ откатаны на GitHub — они рабочие на Forgejo (PR#3). Меняется только @namespace (ID).

Pending

—

Closes #4

## Что сделано 1. `vite.config.ts:10` — `@namespace` возвращён на `https://github.com/slaid098/opencode-voice-dictation` (старый, как идентификатор скрипта). `@updateURL`/`@downloadURL`/`@icon` остались на Forgejo (PR#3, рабочие). 2. Version bump 1.0.6 → 1.0.7 синхронно в `vite.config.ts:11` + `package.json:3`. 3. `src/index.ts` — `registerMenuCommands({...})` вынесен из `init()` (после gate) на top-level. Теперь 7 menu-команд (`Set Groq API Key`, `Set STT Endpoint` и др.) регистрируются на любой странице сразу при установке, не только на OpenCode. `setupUI`/`setupKeyboardShortcut`/`checkFirstRun` остались в `init()` после gate (зависят от DOM). 4. `AGENTS.md` — добавлена секция `## @namespace` с правилом: идентификатор, не URL, не менять при миграции хоста. ## Почему **Дубликат скрипта:** PR#3 сменил `@namespace` с `github.com/...` на `git.slaid098.dev/...`. Tampermonkey/Violentmonkey идентифицируют скрипт по паре `@name` + `@namespace` (Greasemonkey-стандарт). Смена = менеджер видит «новый» скрипт → создал дубликат вместо обновления. `@namespace` — это opaque string-ID, менеджеры НЕ резолвят его как URL. Возврат к старому = обновление существующего скрипта. **Пустое меню:** 7 `GM_registerMenuCommand` вызывались внутри `init()` после `isOpencodePage()` gate (`index.ts:207-211`). На не-OpenCode странице gate → `false` → retry loop → команды не регистрировались → popup показывал только Edit/Delete. Вынос на top-level = меню доступно сразу после установки на любой странице. Callbacks используют `GM_setValue` (работает везде) + `ui?.toast` (optional chaining, no-op без UI) — безопасно. ## Watch out - Старый скрипт 1.0.4 с мёртвым `@updateURL` (raw.githubusercontent.com → 404) НЕ автоапдейтнится. Пользователь должен один раз перейти по install-ссылке из README → TM предложит «обновить» (namespace совпадёт) → 1.0.4 → 1.0.7, без дубликата. После этого новый `@updateURL` (Forgejo) заработает для будущих автоапдейтов. - Menu-команды на не-OpenCode странице: `GM_setValue` сработает (config сохранится), `ui?.toast` no-op (нет UI). Пользователь не увидит toast-подтверждения, но значение сохранится. При переходе на OpenCode страницу config подхватится. - `@updateURL`/`@downloadURL`/`@icon` НЕ откатаны на GitHub — они рабочие на Forgejo (PR#3). Меняется только `@namespace` (ID). ## Pending — Closes #4
Author
Owner

Code Review Summary

PR восстанавливает @namespace (ID скрипта для userscript-менеджеров) на старый GitHub-URL и выносит registerMenuCommands на top-level, чтобы 7 menu-команд регистрировались на любой странице сразу при установке, а не только после isOpencodePage() gate. Version bump 1.0.6 → 1.0.7 синхронно в обоих файлах. Изменения точечные (4 файла, +17/−13), соответствуют issue #4.

Positives

  • vite.config.ts:10 — @namespace корректно возвращён на https://github.com/slaid098/opencode-voice-dictation (opaque ID, не URL). @updateURL/@downloadURL/@icon остались на Forgejo (строки 19-23) — не откатаны. @connect * (строка 17) не сужен. Соответствует AGENTS.md правилам ## @connect и ## @namespace.
  • vite.config.ts:11 + package.json:3 — version 1.0.7 синхронно в обоих файлах (требование AGENTS.md ## Version bump). Без рассинхрона — auto-update сработает.
  • src/index.ts:230-238 — registerMenuCommands({...}) вынесен на top-level после init() (строка 240). 7 callbacks переданы с теми же аргументами. Все callbacks — function declarations (строки 122-196), hoisted → в scope на top-level, безопасно вызывать до init().
  • src/index.ts:214-227 — setupUI/setupKeyboardShortcut/checkFirstRun остались ВНУТРИ init() после isOpencodePage() gate (зависят от DOM). Корректное разделение: menu-команды (работают везде через GM_setValue) на top-level, UI (нужен DOM) — после gate.
  • AGENTS.md — добавлена секция ## @namespace с правилом: идентификатор, не URL, не менять при миграции хоста. Соответствует фактическому поведению кода.
  • ADR append-only — docs/decisions/** не отредактированы (не в changed files: AGENTS.md, package.json, src/index.ts, vite.config.ts).
  • PR hygiene — title fix(deploy): restore namespace and register menu commands at top-level (conventional, ≤72). Body содержит 4 heading'а (## Что сделано, ## Почему, ## Watch out, ## Pending), осмысленно заполнены. ## Pending = — (допустимо). Closes #4.
  • Cross-file impact — registerMenuCommands signature не изменилась (7 callbacks, те же ключи). tests/config.test.ts тестирует registerMenuCommands через mock callbacks — контракт сохранён, тесты не сломаются. src/config.ts (экспорт) не в diff.

Suggestions (info, not blocking)

  • src/index.ts:208 [style] console.log("[ocvd] OpenCode page not detected, retrying in 1.5s...") и строка 212 — debug-логи в production. Не в scope этого PR (pre-existing), но стоит вынести в отдельный issue для замены на GM_log или удаления.

Verdict: APPROVE

## Code Review Summary PR восстанавливает `@namespace` (ID скрипта для userscript-менеджеров) на старый GitHub-URL и выносит `registerMenuCommands` на top-level, чтобы 7 menu-команд регистрировались на любой странице сразу при установке, а не только после `isOpencodePage()` gate. Version bump 1.0.6 → 1.0.7 синхронно в обоих файлах. Изменения точечные (4 файла, +17/−13), соответствуют issue #4. ### Positives - **vite.config.ts:10** — `@namespace` корректно возвращён на `https://github.com/slaid098/opencode-voice-dictation` (opaque ID, не URL). `@updateURL`/`@downloadURL`/`@icon` остались на Forgejo (строки 19-23) — не откатаны. `@connect *` (строка 17) не сужен. Соответствует AGENTS.md правилам `## @connect` и `## @namespace`. - **vite.config.ts:11 + package.json:3** — version 1.0.7 синхронно в обоих файлах (требование AGENTS.md `## Version bump`). Без рассинхрона — auto-update сработает. - **src/index.ts:230-238** — `registerMenuCommands({...})` вынесен на top-level после `init()` (строка 240). 7 callbacks переданы с теми же аргументами. Все callbacks — `function` declarations (строки 122-196), hoisted → в scope на top-level, безопасно вызывать до `init()`. - **src/index.ts:214-227** — `setupUI`/`setupKeyboardShortcut`/`checkFirstRun` остались ВНУТРИ `init()` после `isOpencodePage()` gate (зависят от DOM). Корректное разделение: menu-команды (работают везде через `GM_setValue`) на top-level, UI (нужен DOM) — после gate. - **AGENTS.md** — добавлена секция `## @namespace` с правилом: идентификатор, не URL, не менять при миграции хоста. Соответствует фактическому поведению кода. - **ADR append-only** — `docs/decisions/**` не отредактированы (не в changed files: AGENTS.md, package.json, src/index.ts, vite.config.ts). - **PR hygiene** — title `fix(deploy): restore namespace and register menu commands at top-level` (conventional, ≤72). Body содержит 4 heading'а (`## Что сделано`, `## Почему`, `## Watch out`, `## Pending`), осмысленно заполнены. `## Pending` = `—` (допустимо). Closes #4. - **Cross-file impact** — `registerMenuCommands` signature не изменилась (7 callbacks, те же ключи). `tests/config.test.ts` тестирует `registerMenuCommands` через mock callbacks — контракт сохранён, тесты не сломаются. `src/config.ts` (экспорт) не в diff. ### Suggestions (info, not blocking) - **src/index.ts:208** [style] `console.log("[ocvd] OpenCode page not detected, retrying in 1.5s...")` и строка 212 — debug-логи в production. Не в scope этого PR (pre-existing), но стоит вынести в отдельный issue для замены на `GM_log` или удаления. ### Verdict: APPROVE
slaid098 deleted branch fix/deploy/restore-namespace-and-menu 2026-08-08 16:10:20 +03:00
Sign in to join this conversation.
No reviewers
No labels
bug
chore
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/opencode-voice-dictation!5
No description provided.