---
name: winkod-overview
description: "Винкод (Winkod, бывш. CebersRun) — Swift macOS-app, запускает Windows-софт на bundled wine; расположение/состав/идентификаторы/миграция/USB"
metadata:
  node_type: memory
  type: project
  originSessionId: 65e171c9-623e-4e6d-9a55-82e9fdc0e8ee
---

**Винкод (Winkod)** — Swift macOS-приложение (Apple Silicon), запускает Windows-программы на bundled CrossOver wine 11 (wow64, PE-only), self-contained. **Переименован из CebersRun 2026-06-18 (v1.0.0)** по правилу нейтрального нейминга ([[cebers_dev_product_naming]], семья [[verstak_rename]]/Технокод). Винкод = вин/wine+код. Полные доки: Obsidian `Projects/Винкод/` (5 файлов).

## Идентификаторы
- Латиница (код/bundle/executable): **Winkod**; кириллица (UI + имя `.app`): **Винкод**.
- Bundle id `dev.cebers.winkod` (+ `.bottle.<uuid>`, `.api`, `.mlxserver`). URL scheme `winkod://`. UTI `dev.cebers.winkod.crx`.
- Swift targets: `WinkodApp` (SwiftUI), `WinkodCore` (lib), `WinkodAgent`. macOS 14+.

## Пути (макбук)
- Репо: `~/Разработки/Winkod` (переименован из CebersRun). remote `origin = cebers_mini@Cebers-mini.local:Services/cebers-run-dev/CebersRun.git` (mDNS-хост; `.107:22` отдавал Connection refused — IP залип). Push до v1.0.2 СДЕЛАН. Bare на mini оставлен с именем CebersRun.git (контент = Winkod; переименование пламбинга пропущено — рядом стоят stale-бэкапы + возможная автоматизация в cebers-run-dev). ssh `-i ~/.ssh/id_ed25519 cebers_mini@Cebers-mini.local`.
- Установленный app: `/Applications/Винкод.app` (v1.0.0, ~407M с bundled wine). Старый `/Applications/CebersRun.app` (root-owned) удалить: `sudo rm -rf`.
- Данные: `~/Library/Application Support/Winkod/` (bottles/runtime/wrappers). Старое имя `CebersRun` → **симлинк** на `Winkod` (миграция `AppSupportMigration`: move+symlink, не переписывает абсолютные пути в manifest).
- Кэш wine для сборки: `~/Library/Application Support/Winkod-build/wine` (make-app.sh берёт оттуда, CrossOver на сборке не нужен).

## Движок / запуск
- wine bundled в `Контент/Resources/wine`; loader = `bin/wineloader` (НЕ Perl-wrapper `bin/wine`). env: `WINEDLLPATH=lib/wine`, `DYLD_FALLBACK_LIBRARY_PATH=lib64:lib:/usr/lib` (lib64 обязателен). Графика DXMT/MoltenVK, не dxvk. Нет win32-prefix (wow64).
- Скилл диагностики падений: `winkod-wine-fix` (`~/.claude/skills/`), tools/winkod_wine_diag.sh.
- Брендинг: «wine» скрыт из UI («движок Винкод»), ловит `BrandingSweepTests`.
- **.NET/Wine Mono (D8, РЕШЕНО v1.0.2):** wine-mono msi (~82M) теперь в бандле `Resources/wine/share/wine/mono/` → wineboot авто-ставит .NET при создании бутыли, без докачки (.app 488M). LaunchDoctor.Fix.installMono ставит из бандла on-demand; рецепт dotnet48 переключён с winetricks на bundled msi. Детект сбоя `Wine Mono is not installed` чинен в v1.0.1 (раньше матчил только `mscoree.dll`). Проверено на симуляции чистой машины. Каждая бутыль +~231M (Mono в prefix).

## USB / донгл (жёсткое ограничение)
wine на macOS видит USB через IOHIDManager → только **HID**. Guardant Code USB (dongle PCMflash, idVendor 0x0a89, class 0xFF vendor-class) **невидим**; entitlement не помогает. Решение не в wine: Guardant Net по LAN или дамп+эмуляция grddrv.dll. HID (ELM327) пробрасывается ок.

## Бутыли
WinOLS `F2CA9F5E-BE38-4E7F-B7DB-6FFBC1460712`, PCMflash `925C301E-A62F-4122-9A1E-5E9E36A8EF87`, rufus, stduviewer. Перенос лицензии WinOLS — задача #46.

## v1.0.3 — приватность + диски
- **Экспорт .crx чистый по умолчанию** (`PortableExport.export(sanitize:true)`): режет личную историю — примонтированные диски (кроме c:/z:), Recent/Temp/INetCache, MRU из user.reg, env/COM/lastLaunched из манифеста. НЕ возвращать full-export по умолчанию (была утечка истории на чужой ПК). `sanitize:false` только для своего 2-го Mac.
- **#47 done:** UI маппинга папок Mac как дисков — `DriveMapper` (dosdevices/<letter>: симлинки, D–Y) + секция «Диски» в карточке программы. Заменяет ручной ln -s.
- Скилл [winkod-verify] проверяет запуск+serial; [winkod-wine-fix] чинит.
