From 8a7c438b16e322a5b9e38511ffcf76a391514ef4 Mon Sep 17 00:00:00 2001 From: vitaliytv Date: Tue, 14 Jul 2026 16:52:27 +0300 Subject: [PATCH 1/5] =?UTF-8?q?=F0=9F=93=9D=20docs(specs):=20=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D0=BD=20=D0=BA=D0=BE=D0=BD=D1=82=D1=83=D1=80=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B3=D0=BD=D1=96=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D1=97=20?= =?UTF-8?q?=D1=80=D0=BE=D0=B1=D0=BE=D1=82=D0=B8=20=D0=B9=20=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B3=D1=83=D0=B2=D0=B0=D0=BD=D0=BD=D1=8F=20?= =?UTF-8?q?=E2=80=94=20=D0=B2=D0=BB=D0=B0=D1=81=D0=BD=D0=B8=D0=BA=20=D0=B1?= =?UTF-8?q?=D1=83=D0=B4=D1=8C-=D1=8F=D0=BA=D0=BE=D0=B3=D0=BE=20=D1=80?= =?UTF-8?q?=D1=96=D0=B2=D0=BD=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Спека-дизайн (draft) multi-owner для owner-app: фрактальна власність за графом задач (owner.yml sidecar, успадкування як autonomy.yml), скоуп як деривація, запечатаний фасад делегованих гілок, ескалації immutable-файлами з обов'язковою запискою, симетрія делегування людям і ШІ у будь-якому оргнапрямі, per-scope критик і нагадування з deadline. Етапи M5–M7 продовжують M0–M4 спеки 260711; mt-core без змін. Co-Authored-By: Claude Fable 5 --- docs/specs/260714-cognitive-delegation.md | 163 ++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 docs/specs/260714-cognitive-delegation.md diff --git a/docs/specs/260714-cognitive-delegation.md b/docs/specs/260714-cognitive-delegation.md new file mode 100644 index 0000000..515473b --- /dev/null +++ b/docs/specs/260714-cognitive-delegation.md @@ -0,0 +1,163 @@ +--- +kind: nitra-spec +status: draft +plan: null +risk: med +date: 2026-07-14 +--- + +# Один контур когнітивної роботи й делегування — власник будь-якого рівня + +> Розширення спеки [`260711-owner-app.md`](./260711-owner-app.md): та сама конституція, той самий апарат (черга рішень, плановик, критик, штаб, матриця автономії), але власник — не обов'язково CEO. Код mt-core і спека 260711 не змінюються; все нижче — app-рівень owner-app плюс резервація імен файлів у документі-специфікації `@7n/mt`. + +## Ідея одним абзацом + +Робота будь-якого рівня — один контур: інтейк → судження «роблю сам чи делегую» → декомпозиція → контракти на підзадачі (людям `h.md`, машинам `a.md` — байдуже, підлеглий це, колега чи власний керівник) → моніторинг контрактної поверхні → акцепт/reject → ескалація замовникові того, що поза конвертом. CEO — власник кореня, middle-інженер — власник своєї гілки з парком ШІ-агентів; апарат той самий, різні лише ставки і класи дій. «Мій скоуп» — деривація з файлів у git, не налаштування. **Ієрархія тут — дерево задач, не оргструктура**: «вгору» означає «до власника батьківського вузла графа», ким би той не був в оргчарті. + +## Один контур: CEO і middle-інженер + +| Елемент контуру | CEO | Middle-інженер | +| --------------- | --- | -------------- | +| когнітивне ядро | стратегічні approve/reject | дизайн-рішення, code-review судження | +| делегати-люди | департаменти (`h.md`) | колеги, підрядники (`h.md`) | +| делегати-ШІ | автономні пайплайни (`a.md`) | Claude-агенти на фічах (`a.md`) | +| контракт | `task.md` + `## Done when` | той самий | +| гейт автономії | `spend/deploy: approve` | `worktree_edit: auto`, `push: approve` | +| ескалація вгору | борд/інвестори | tech lead — `escalation_NNN.md` із запискою | + +## Конституція (нормативні рішення) + +1. **Ідентичність = email.** «Хто я» — email, за замовчуванням із `git config user.email`, перевизначається в конфігурації застосунку (tools `whoami`/`set_identity`). Сумісно з `accounts(email)` relay-шару mt 0.3.0-draft; Ed25519 (v4) — ідентичність пристрою, не людини: ключ підписує дії, email називає власника. +2. **Власність = sidecar `owner.yml`** поряд із `task.md`, поза контрактом mt-core (прецедент `autonomy.yml`). Формат мінімальний: `owner: ` плюс опційні `name` (display) і `since`. mt-core ігнорує невідомі файли — зміна його коду не потрібна. +3. **Фрактальне успадкування за графом задач, не за оргструктурою.** `effective_owner(node)` = найближчий предок з `owner.yml` (включно з самим вузлом); ліс без жодного `owner.yml` — нерозмічений → сьогоднішня single-owner поведінка (back-compat без міграції). Оргчарт у моделі не існує: єдині відношення — «замовник» (власник батьківського вузла) і «власник» (виконавець-декомпозитор вузла). Делегування підзадачі власному керівникові чи колезі — той самий акт, що й підлеглому: декомпозитор лишається власником своєї задачі й acceptance-гейтом підзадачі, навіть якщо її власник — його бос. Одна пара людей на різних вузлах може бути у протилежних ролях одночасно; «ескалація вгору» завжди означає «до замовника вузла», не «до старшого за посадою». +4. **Кожен користувач — у двох ролях одночасно, пульт двонапрямний.** Виконавець контрактів згори (мої pending `h.md` — делеговане мені) і делегатор контрактів вниз (людям/ШІ). UI показує обидва напрями: «чого чекають від мене» (моя черга рішень + мої `h.md` з дедлайнами) і «чого чекаю я» (контрактні фасади моїх делегувань + дельта їх станів). Це узагальнення наявних режимів «Рішення»/«Бриф», не нова механіка. +5. **Симетрія людина/ШІ як делегат.** Делегування — один акт з одним контрактом і одним acceptance-гейтом; відрізняється лише виконавчий прапор: `a.md` — конверт задає матриця автономії; `h.md` — конверт задають ескалації з записками. Анти-паноптикум-дієта стосується лише людей: у ШІ-гілки власник дивиться без обмежень — run-журнали агентів не «кухня людини». +6. **Скоуп — деривація, не конфіг.** `scope(me)` = мої піддерева мінус делеговане далі; вузол з чужим `owner.yml` — межа контракту (чорна скринька). «Нічия земля» (розмічений ліс, власник не резолвиться) — fail-visible: показується всім із запрошенням призначити власника; загублена ескалація гірша за зайвий рядок. +7. **Межа контракту з людиною — запечатаний фасад.** Делегатору видно лише `task.md`-контракт межового вузла (`## Done when`), derived state, deadline, бюджет-агрегати, факти (`fact_NNN.md`) самого межового вузла, адресні ескалації — **не** внутрішні вузли/плани/особисті `h.md`/ретро. Вгору — read-only ланцюжок місій предків («навіщо існує ця ділянка»). Анти-паноптикум — продуктова межа, не ACL: git фізично читабельний усім; дієта — дисципліна деривацій і промптів (перевіряється на code review), явна обіцянка в онбордингу обома напрямками. Ніяких метрик «швидкості людини», ніякого «прогрес %» на чужій гілці. +8. **Матриця автономії лишається бінарною** (`auto|approve`): матриця відповідає «чи потрібен підпис», власність — «чий підпис». Approver = effective owner вузла дії (субсидіарність: `spend: approve` на корені не тягне кожен spend до CEO — підписує власник відповідної ділянки). Ratchet без змін: суб-власник успадкований конверт лише посилює. +9. **Делегування = атомарний акт, оргнапрям-агностичний.** Tool `delegate` пише виконавчий прапор (`h.md` людині / `a.md` машині — наявний механізм mt-core) + `owner.yml` (для людини) + `autonomy.yml` межового вузла. Адресат — будь-хто: підлеглий, колега, власний керівник, машина; механізм, фасад і акцепт ідентичні. Відкликання/передача — новий `owner.yml`, аудит — git history. +10. **Ескалація — immutable файли, не новий стан.** `escalation_NNN.md` (frontmatter `from`/`to`/`created_at` + `## Reason` — обов'язкова «записка вгору»: що сталося / що я спробував / що прошу / до якого терміну; може чернетити штаб, підписує людина; без записки ескалація не проходить — fail-closed) і `escalation-resolved_NNN.md` (прецедент `plan-rejected_NNN.md`). Derived state mt-core не змінюється — маршрутизація деривується на app-рівні (як `plan_review`). У черзі адресата — картка з запискою; адресат не може approve/reject, не розгорнувши її (анти-rubber-stamping на межі). +11. **Маршрутизація рішень — детермінована таблиця «тип → чия черга»** (нижче). +12. **Особисті задачі й нагадування — per-scope, без нової сутності.** Мої задачі = мої pending `h.md`; нагадування — три детерміновані правила з наявного `deadline`: `deadline_due` (нерозв'язаний вузол мого скоупу з deadline у горизонті 24 год або простроченим), `personal_today` (мій pending `h.md` із deadline сьогодні), `escalation_stale` (відкрита ескалація на мою адресу без реакції > N діб). Snooze/ack — локально per-identity, не в git: персональний ритм людини у спільному репо — паноптикум-витік і комітний шум; спільне (deadline) — у git, персональне (коли мені нагадати) — у мене. +13. **Когнітивне ядро — головна метрика пульта.** Черга рішень за ціною помилки і є когнітивна робота; все інше додаток стискає (брифи штабу) або автоматизує (матриця автономії). Успіх = частка часу користувача на судженнях, які може зробити лише він; friction пропорційний ціні помилки (анти-rubber-stamping); нотифікації — лише детерміновані події черги/дедлайнів, ніколи «LLM вирішив перервати». +14. **UI — еволюція, не редизайн.** Одна злита черга з бейджами ділянок (не перемикач скоупів); правило режимів Рішення → Бриф → Карта недоторканне — змінюється лише домен лічильників (мій скоуп); заголовок оголошує режим і скоуп («3 рішення у 2 ділянках чекають»); кошики дедлайнів у Брифі (прострочено / сьогодні / цього тижня / без дедлайну) + тонка стрічка нагадувань у Рішеннях; Бриф отримує другу вісь «чого чекаю я» (стани делегувань); карта від ділянок із запечатаними делегованими вузлами (людям) і розгортними ШІ-гілками; онбординг: «пульт твого контуру роботи — думай сам, делегуй людям і ШІ», новий крок «Хто ти» (вибір із owner-ідентифікаторів, знайдених у лісі), абзац анти-паноптикум-обіцянки. +15. **Критик і штаб — per-scope.** Дайджест = мій скоуп повністю + ШІ-гілки повністю + людські делегування до межі; добовий бюджет вердиктів per owner; вердикти по чужій кухні не генеруються взагалі (виконання п. 7 на рівні промптів, перевіряється на code review промптів — як велить конституція 260711). +16. **Tool-поверхня — headless-паритет.** Нові tools: `whoami`/`set_identity`, `my_scope`, `scan_owners` (app-local Rust, за зразком `read_autonomy`), `delegate`, `escalate`/`resolve_escalation`, `remind_upcoming`/`snooze_reminder`; опція обрізки скоупу в `scan` — правило обрізки одне для GUI і headless. + +## Механізми + +### `owner.yml` + +```yaml +# mt//owner.yml +owner: olena@nitralabs.com +# опційно: +name: Олена # display, для UI +since: 2026-07-13 # коли делеговано; аудит — git history +``` + +### Скоуп (алгоритм) + +``` +scanOwners(tasksDir) -> { nodePath -> ownerEmail } # один прохід ФС, app-local Rust +effectiveOwner(node) = стек успадкування при обході дерева # аналог mergeAutonomy +partitionForest(tree, me): + mine = вузли, де effective == me (включно з успадкованими) + boundary = вузли з owner.yml != me, чий батько ∈ mine # чорні скриньки + foreign = усе під boundary (не вантажиться у чергу/дельту/критика) + orphaned = розмічений ліс && effective == null # «нічия земля» +``` + +### Ескалація + +```yaml +# mt//escalation_001.md +--- +schema_version: 1 +from: olena@nitralabs.com +to: vitaliytv@nitralabs.com # деривується: effective_owner(батьківський вузол межі) +created_at: 2026-07-14T09:00:00Z +--- +## Reason +Бюджет гілки вичерпано двічі; рішення потребує зміни scope контракту, +що поза моїм конвертом автономії. +``` + +Вузол із відкритою ескалацією (`escalation_NNN.md` без парного `escalation-resolved_NNN.md`) з'являється у черзі адресата `to` і зникає з черги автора (у нього — рядок «ескальовано, чекає»). Закриття — tool `resolve_escalation` пише immutable `escalation-resolved_NNN.md` з вердиктом. + +### Маршрутизація рішень + +| Тип рішення | Черга | +| ----------- | ----- | +| `plan_review` | effective owner композитного вузла | +| `unresolvable` / `failed` / `stalled` внутрішнього вузла | effective owner вузла | +| tool-approval за матрицею автономії | effective owner вузла, чия політика вимагала `approve` | +| вердикт критика по внутрішньому вузлу | власник скоупу, де знахідка | +| вердикт критика по межовому вузлу (контрактна поверхня) | обидві черги — власника гілки (діяти) і замовника (контракт під загрозою) | +| прийняття роботи делегованої гілки | замовник контракту | +| відкрита ескалація | адресат `to` | + +### Інформаційна дієта (хто що бачить) + +| Артефакт | Власник гілки | Замовник (про делеговану гілку) | +| -------- | ------------- | ------------------------------- | +| `task.md` межового вузла | так | так (це і є контракт між ними) | +| derived state, deadline, бюджет-агрегати межі | так | так | +| `fact_NNN.md` межового вузла | так | так | +| адресні ескалації | так | так | +| внутрішні вузли, плани, черга рішень | так | **ні** | +| особисті `h.md` власника гілки | так | **ні** | +| ретро/ефективність | opt-in особисто | **ні** | +| ШІ-гілки (`a.md`) власника | так, без обмежень | до межі контракту, як усе інше | + +Чесне застереження: git фізично дає всім доступ до всіх файлів — дієта у MVP є продуктово-нормативною межею (default read-шлях застосунку зупиняється на чужій межі; промпти критика рев'юються), не криптографічною. Криптографічне розмежування — не мета: анти-паноптикум тут завжди був конституційним принципом, не ACL (спека 260711, ризик 3). Технічне посилення (relay-ролі, surfaces) — доріжка v4. + +## Що входить куди + +| Шар | Зміст | Ціна | +| --- | ----- | ---- | +| документ-спека `@7n/mt` | резервація імен `owner.yml`, `escalation_NNN.md`, `escalation-resolved_NNN.md` у теці вузла; семантика «email = канонічний id людини» | лише текст спеки — сканер mt-core невідомі файли ігнорує | +| mt-core (Rust) | нічого зараз; пізніше — опційне additive-поле `TaskNode.owner` (perf на великих лісах), write-хелпер `set_deadline` | відкладено; додавання поля — non-breaking | +| relay / protocol v4 | мапінг `owner.yml.owner (email)` ↔ `accounts.email`; `owner.yml` як bootstrap `task_members(role: owner)`; підписані transfer/approvals | уже спроєктовано в access.md — формат сумісний за побудовою | +| owner-app | усе інше: ідентичність, скоуп-деривація, маршрутизація, `delegate`, ескалації, нагадування, дієта UI | локально, за прецедентом autonomy (M3) | + +## Етапи (продовжують M0–M4 спеки 260711) + +| Етап | Обсяг | Критерій готовності | +| ---- | ----- | ------------------- | +| **M5 — скоуп** | ідентичність (`whoami`/`set_identity`); `owner.yml` + `scan_owners`; scope-фільтр черги/особистих/дельти; режими розмічений/нерозмічений; «нічия земля»; fail-closed write-tools поза скоупом; крок «Хто ти» в онбордингу | два власники над одним репо бачать різні черги; ліс без `owner.yml` працює як сьогодні | +| **M6 — межі й делегування** | запечатаний фасад (люди) + розгортні ШІ-гілки; двонапрямний Бриф («чого чекаю я»); `delegate` (у будь-якому оргнапрямі); `escalate`/`resolve_escalation` + маршрутизація; критик per-scope | інженер декомпозує задачу на підзадачі підлеглому, колезі й власному керівникові; кожна ескалація з'являється в черзі замовника вузла і закривається вердиктом з audit-trail у git | +| **M7 — нагадування** | три правила деривації; кошики дедлайнів у Брифі + стрічка в Рішеннях; `remind_upcoming`/`snooze_reminder`; локальний per-identity snooze; ОС-нотифікації + ранковий дайджест | прострочений deadline мого скоупу підіймається у бриф і глохне після snooze лише в мене | +| **з M4/v4** | email ↔ account_id; `owner.yml` → bootstrap `task_members`; підписані transfer/approvals; push адресату ескалації | approve/ескалація з телефона без git-доступу | + +## Відхилені альтернативи + +1. **Оргчарт як сутність моделі** (ролі «керівник/підлеглий», маршрутизація за посадою) — власність і акцепт ідуть за графом задач; оргвідносини лишаються поза системою. +2. **Два різні застосунки «для керівника» і «для виконавця»** — один контур — один пульт; роздвоєння множить код і ламає фрактал. +3. **`owner:` у frontmatter `task.md`** — зміна спільного контракту (schema_version, зовнішнє репо mt); власність ортогональна змісту задачі; прецедент `autonomy.yml` свідомо встановив: політики поверх вузла — sidecar. +4. **Ідентичність у `h.md`** — виконавець ≠ власник (власник може не виконувати жодного вузла руками); `h.md` перезаписується цілком при перемиканні виконавця — власність би губилась. +5. **Центральний реєстр `mt/.owners.yml`** — один файл = merge-конфлікт усіх делегувань; ламається при переносі піддерев; суперечить node-local фракталу. +6. **Деривація власника з git blame** — хто торкнувся файлу ≠ хто володіє ділянкою; неявна, нестабільна, недекларативна. +7. **Nickname як canonical id** — непереносний, потребує реєстру ніків, конфліктує з `accounts(email)` relay. +8. **Третє значення `escalate` у матриці автономії** — змішує вісь «чи потрібен підпис» з віссю «чий підпис»; ratchet стає трирівневим і перестає читатися поглядом угору; ескалація — явна людська дія з причиною, не статична політика. +9. **Новий TaskState `escalated` у mt-core** — дорога зміна зовнішнього enum заради стану, який повністю деривується з файлів на app-рівні. +10. **Перемикач скоупів як основна навігація** — фрагментує тріаж, повертає «проєктний дашборд», ламає сортування за ціною помилки; фільтр-чипи дають 90 % користі без зміни дефолту. +11. **Ручний конфіг списку ділянок** — два джерела правди (конфіг проти контрактів у git) розходяться; derived-скоуп самокоригується при делегуванні. +12. **«Напівпрозора скринька»** (замовнику видно перший рівень дітей делегованої гілки) — слизький схил до паноптикуму; контрактна поверхня — чиста, захищувана межа. +13. **Дієта на ШІ-гілки** — агент не суб'єкт приватності; приховування run-журналів від власника лише шкодить нагляду за машиною. +14. **Ескалація без записки** — замовник отримує голий факт без «що вже спробувано», що провокує rubber-stamping або мікроменеджмент-занурення. +15. **Окрема сутність «нагадування» / локальний todo** — конституція 260711 № 6: особисті задачі — звичайні `h.md`; нагадування — детерміноване групування за наявним deadline. +16. **Snooze у git** — персональний ритм у спільному репо = паноптикум-витік і комітний шум. +17. **LLM-нотифікації** («штаб вирішив, що це важливо») — порушує «LLM ніколи не обирає режим» у розширеному сенсі: LLM не обирає, що тебе перервати. +18. **Спільний критик на репу з розсилкою вердиктів** — мусив би читати всі гілки (суперечить дієті на рівні промпта) і множити вартість; per-scope критик дешевший і чистіший. +19. **Бейдж «прогрес %» на чужій гілці** — derived-відсоток з чужої кухні = метрика нагляду через задні двері. +20. **Ownership на рівні воркспейсів** (перелік директорій per людина) — не фрактально: не дає делегувати гілку всередині одного лісу. + +## Ризики + +1. **Роз'їхані розмітки** (двоє вважають ділянку своєю після поганого merge `owner.yml`) — файл однорядковий (конфлікт видно), git history — арбітр, «нічия земля» ловить протилежний випадок. +2. **Псевдо-безпека дієти** — хтось сприйме UI-межу як ACL; мітигація — чесна нормативна секція вище. +3. **Ескалаційний пінг-понг** — замовник резолвить назад, власник гілки ескалює знову; immutable нумерація робить цикл видимим, критик отримує детерміноване правило «> 2 ескалацій одного вузла». +4. **Осиротіння ділянки** (власник пішов) — «нічия земля» + практика succession з access.md (другий owner). +5. **Роздування tool-поверхні** — 7–8 нових tools; усі — тонкі композиції наявних примітивів, `delegate` — макро над write-операціями. +6. **«Делегую все ШІ без акцепту»** — делегування не скасовує судження: ratchet автономії і acceptance-гейт лишаються обов'язковими; кількість рішень у черзі — видимий сигнал перевантаження контуру. From 56f8e4ae00e52a3e621d8fc449d5ff85978d1436 Mon Sep 17 00:00:00 2001 From: vitaliytv Date: Tue, 14 Jul 2026 16:52:47 +0300 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=94=A7=20chore(lint):=20=D0=B0=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D1=84=D1=96=D0=BA=D1=81=D0=B8=20n-cursor=20lint=20?= =?UTF-8?q?+=20bump=20@nitra/cursor=20=D0=B4=D0=BE=20^14.33.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit T0-автофікси fix-режиму: каркас updater-плагінів owner (Cargo.toml, package.json, capabilities, updater.json), stryker-конфіг owner, node_executor у .mt.json. Незавершена частина (lib.rs, useUpdater, package.json-скрипти тощо) зафіксована лінтом як 5 fix-вузлів у mt/. Co-Authored-By: Claude Fable 5 --- .mt.json | 3 +- mt/lint-fix-bun-package-json-9529d0c2/a.md | 8 ++++ mt/lint-fix-bun-package-json-9529d0c2/task.md | 24 ++++++++++ mt/lint-fix-tauri-tooling-8f795b61/a.md | 8 ++++ mt/lint-fix-tauri-tooling-8f795b61/task.md | 24 ++++++++++ mt/lint-fix-tauri-updater-396a9644/a.md | 8 ++++ mt/lint-fix-tauri-updater-396a9644/task.md | 26 ++++++++++ mt/lint-fix-test-package-json-8917df84/a.md | 8 ++++ .../task.md | 24 ++++++++++ mt/lint-fix-vue-package-json-7bc34482/a.md | 8 ++++ mt/lint-fix-vue-package-json-7bc34482/task.md | 24 ++++++++++ owner/package.json | 4 +- owner/src-tauri/Cargo.toml | 2 + owner/src-tauri/capabilities/default.json | 19 ++++++-- owner/src-tauri/capabilities/updater.json | 14 ++++++ owner/stryker-vue-macros-ignorer.mjs | 48 +++++++++++++++++++ owner/stryker.config.mjs | 23 +++++++++ package.json | 2 +- 18 files changed, 271 insertions(+), 6 deletions(-) create mode 100644 mt/lint-fix-bun-package-json-9529d0c2/a.md create mode 100644 mt/lint-fix-bun-package-json-9529d0c2/task.md create mode 100644 mt/lint-fix-tauri-tooling-8f795b61/a.md create mode 100644 mt/lint-fix-tauri-tooling-8f795b61/task.md create mode 100644 mt/lint-fix-tauri-updater-396a9644/a.md create mode 100644 mt/lint-fix-tauri-updater-396a9644/task.md create mode 100644 mt/lint-fix-test-package-json-8917df84/a.md create mode 100644 mt/lint-fix-test-package-json-8917df84/task.md create mode 100644 mt/lint-fix-vue-package-json-7bc34482/a.md create mode 100644 mt/lint-fix-vue-package-json-7bc34482/task.md create mode 100644 owner/src-tauri/capabilities/updater.json create mode 100644 owner/stryker-vue-macros-ignorer.mjs create mode 100644 owner/stryker.config.mjs diff --git a/.mt.json b/.mt.json index 713ca7d..4dd6207 100644 --- a/.mt.json +++ b/.mt.json @@ -18,5 +18,6 @@ }, "stale_worktree_min": 30, "grace_period": 60, - "min_free_disk_gb": 10 + "min_free_disk_gb": 10, + "node_executor": "npx @nitra/cursor mt-run-node" } diff --git a/mt/lint-fix-bun-package-json-9529d0c2/a.md b/mt/lint-fix-bun-package-json-9529d0c2/a.md new file mode 100644 index 0000000..ab5ea4f --- /dev/null +++ b/mt/lint-fix-bun-package-json-9529d0c2/a.md @@ -0,0 +1,8 @@ +## Model tier + +AVG + +## Skills + +- bash +- write-files diff --git a/mt/lint-fix-bun-package-json-9529d0c2/task.md b/mt/lint-fix-bun-package-json-9529d0c2/task.md new file mode 100644 index 0000000..c2b11b4 --- /dev/null +++ b/mt/lint-fix-bun-package-json-9529d0c2/task.md @@ -0,0 +1,24 @@ +--- +schema_version: 1 +created_at: 2026-07-14T13:49:47.969Z +budget_sec: 1800 +audit: optional +hint: atomic +--- + +## Task + +Виправити порушення правила `bun` (concern `package_json`), які не закрила інлайн fix-драбина. + +## Done when + +- `bun` не повідомляє порушень у target-файлах (див. ## Check). + +## Check + +npx @nitra/cursor lint --no-fix --cwd ../.. bun + +## Inputs + +Target-файли: +- `package.json` diff --git a/mt/lint-fix-tauri-tooling-8f795b61/a.md b/mt/lint-fix-tauri-tooling-8f795b61/a.md new file mode 100644 index 0000000..ab5ea4f --- /dev/null +++ b/mt/lint-fix-tauri-tooling-8f795b61/a.md @@ -0,0 +1,8 @@ +## Model tier + +AVG + +## Skills + +- bash +- write-files diff --git a/mt/lint-fix-tauri-tooling-8f795b61/task.md b/mt/lint-fix-tauri-tooling-8f795b61/task.md new file mode 100644 index 0000000..f54e96e --- /dev/null +++ b/mt/lint-fix-tauri-tooling-8f795b61/task.md @@ -0,0 +1,24 @@ +--- +schema_version: 1 +created_at: 2026-07-14T13:49:47.969Z +budget_sec: 1800 +audit: required +hint: atomic +--- + +## Task + +Виправити порушення правила `tauri` (concern `tooling`), які не закрила інлайн fix-драбина. + +## Done when + +- `tauri` не повідомляє порушень у target-файлах (див. ## Check). + +## Check + +npx @nitra/cursor lint --no-fix --cwd ../.. tauri + +## Inputs + +Target-файли: +- (whole-repo concern) diff --git a/mt/lint-fix-tauri-updater-396a9644/a.md b/mt/lint-fix-tauri-updater-396a9644/a.md new file mode 100644 index 0000000..ab5ea4f --- /dev/null +++ b/mt/lint-fix-tauri-updater-396a9644/a.md @@ -0,0 +1,8 @@ +## Model tier + +AVG + +## Skills + +- bash +- write-files diff --git a/mt/lint-fix-tauri-updater-396a9644/task.md b/mt/lint-fix-tauri-updater-396a9644/task.md new file mode 100644 index 0000000..17a80ce --- /dev/null +++ b/mt/lint-fix-tauri-updater-396a9644/task.md @@ -0,0 +1,26 @@ +--- +schema_version: 1 +created_at: 2026-07-14T13:49:47.969Z +budget_sec: 1800 +audit: optional +hint: atomic +--- + +## Task + +Виправити порушення правила `tauri` (concern `updater`), які не закрила інлайн fix-драбина. + +## Done when + +- `tauri` не повідомляє порушень у target-файлах (див. ## Check). + +## Check + +npx @nitra/cursor lint --no-fix --cwd ../.. tauri + +## Inputs + +Target-файли: +- `app/src` +- `owner/src` +- `owner/src-tauri/src/lib.rs` diff --git a/mt/lint-fix-test-package-json-8917df84/a.md b/mt/lint-fix-test-package-json-8917df84/a.md new file mode 100644 index 0000000..ab5ea4f --- /dev/null +++ b/mt/lint-fix-test-package-json-8917df84/a.md @@ -0,0 +1,8 @@ +## Model tier + +AVG + +## Skills + +- bash +- write-files diff --git a/mt/lint-fix-test-package-json-8917df84/task.md b/mt/lint-fix-test-package-json-8917df84/task.md new file mode 100644 index 0000000..c4c6dcb --- /dev/null +++ b/mt/lint-fix-test-package-json-8917df84/task.md @@ -0,0 +1,24 @@ +--- +schema_version: 1 +created_at: 2026-07-14T13:49:47.969Z +budget_sec: 1800 +audit: optional +hint: atomic +--- + +## Task + +Виправити порушення правила `test` (concern `package_json`), які не закрила інлайн fix-драбина. + +## Done when + +- `test` не повідомляє порушень у target-файлах (див. ## Check). + +## Check + +npx @nitra/cursor lint --no-fix --cwd ../.. test + +## Inputs + +Target-файли: +- `package.json` diff --git a/mt/lint-fix-vue-package-json-7bc34482/a.md b/mt/lint-fix-vue-package-json-7bc34482/a.md new file mode 100644 index 0000000..ab5ea4f --- /dev/null +++ b/mt/lint-fix-vue-package-json-7bc34482/a.md @@ -0,0 +1,8 @@ +## Model tier + +AVG + +## Skills + +- bash +- write-files diff --git a/mt/lint-fix-vue-package-json-7bc34482/task.md b/mt/lint-fix-vue-package-json-7bc34482/task.md new file mode 100644 index 0000000..bc72428 --- /dev/null +++ b/mt/lint-fix-vue-package-json-7bc34482/task.md @@ -0,0 +1,24 @@ +--- +schema_version: 1 +created_at: 2026-07-14T13:49:47.969Z +budget_sec: 1800 +audit: optional +hint: atomic +--- + +## Task + +Виправити порушення правила `vue` (concern `package_json`), які не закрила інлайн fix-драбина. + +## Done when + +- `vue` не повідомляє порушень у target-файлах (див. ## Check). + +## Check + +npx @nitra/cursor lint --no-fix --cwd ../.. vue + +## Inputs + +Target-файли: +- `owner/package.json` diff --git a/owner/package.json b/owner/package.json index 91e5911..e791969 100644 --- a/owner/package.json +++ b/owner/package.json @@ -20,7 +20,9 @@ "@tauri-apps/plugin-http": "^2.5.9", "@tauri-apps/plugin-opener": "^2.5.4", "quasar": "^2.21.2", - "vue": "^3.5.39" + "vue": "^3.5.39", + "@tauri-apps/plugin-updater": "^2", + "@tauri-apps/plugin-process": "^2" }, "devDependencies": { "@quasar/vite-plugin": "^1.12.0", diff --git a/owner/src-tauri/Cargo.toml b/owner/src-tauri/Cargo.toml index 83f3d7e..511e89d 100644 --- a/owner/src-tauri/Cargo.toml +++ b/owner/src-tauri/Cargo.toml @@ -13,6 +13,7 @@ crate-type = ["staticlib", "cdylib", "rlib"] tauri-build = { version = "2", features = [] } [dependencies] +tauri-plugin-process = "2.3.1" tauri = { version = "2", features = [] } tauri-plugin-http = "2" tauri-plugin-opener = "2" @@ -23,6 +24,7 @@ notify = "8" chrono = "0.4" [target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] +tauri-plugin-updater = "2" tauri-plugin-window-state = "2" [profile.dev] diff --git a/owner/src-tauri/capabilities/default.json b/owner/src-tauri/capabilities/default.json index cbc7a96..da86134 100644 --- a/owner/src-tauri/capabilities/default.json +++ b/owner/src-tauri/capabilities/default.json @@ -2,13 +2,26 @@ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default", "description": "Capability for the main window", - "windows": ["main"], + "windows": [ + "main" + ], "permissions": [ "core:default", "opener:default", { "identifier": "http:default", - "allow": [{ "url": "http://localhost:*/*" }, { "url": "http://127.0.0.1:*/*" }, { "url": "https://**" }] - } + "allow": [ + { + "url": "http://localhost:*/*" + }, + { + "url": "http://127.0.0.1:*/*" + }, + { + "url": "https://**" + } + ] + }, + "process:allow-restart" ] } diff --git a/owner/src-tauri/capabilities/updater.json b/owner/src-tauri/capabilities/updater.json new file mode 100644 index 0000000..919c001 --- /dev/null +++ b/owner/src-tauri/capabilities/updater.json @@ -0,0 +1,14 @@ +{ + "identifier": "updater", + "windows": [ + "main" + ], + "platforms": [ + "macOS", + "windows", + "linux" + ], + "permissions": [ + "updater:default" + ] +} diff --git a/owner/stryker-vue-macros-ignorer.mjs b/owner/stryker-vue-macros-ignorer.mjs new file mode 100644 index 0000000..f9f7ab1 --- /dev/null +++ b/owner/stryker-vue-macros-ignorer.mjs @@ -0,0 +1,48 @@ +/** + * Stryker `Ignore`-plugin: пропускає мутації виклику Vue `