From 0b2cfc70de882bbf2d1c41ee108b2916f1e45ba3 Mon Sep 17 00:00:00 2001 From: "Saikhanova.N" Date: Fri, 25 Sep 2026 09:27:25 +0000 Subject: [PATCH] =?UTF-8?q?v1:=20=D0=B7=D0=B0=D1=8F=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=BA=D1=83=D1=80=D0=BE?= =?UTF-8?q?=D1=80=D1=83=20=D0=BE=D0=B1=20=D1=83=D0=B3=D0=BE=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2=D0=BD=D0=BE=D0=BC=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D1=80=D1=83=D1=88=D0=B5=D0=BD=D0=B8=D0=B8=20(docx=20+=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B4=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE?= =?UTF-8?q?=D1=82=D1=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vibe42-design.json | 1 + AGENTS.md | 324 +++ design-system/AGENTS.md | 60 + design-system/CHECKLIST.md | 115 + design-system/COMPONENTS.md | 593 +++++ design-system/LICENSE | 21 + design-system/README.md | 77 + design-system/THIRD-PARTY-NOTICES.md | 18 + design-system/VERSION | 5 + design-system/archetypes/registry.json | 301 +++ design-system/brand/README.md | 7 + .../brand/kazakhtelecom-logo-white.png | Bin 0 -> 3803 bytes design-system/brand/kazakhtelecom-logo.png | Bin 0 -> 3756 bytes design-system/brand/kt-ai-logo.png | Bin 0 -> 5620 bytes design-system/docs/ARCHETYPES.md | 94 + design-system/docs/BUILD_PROTOTYPE.md | 98 + design-system/docs/DESIGN.md | 308 +++ design-system/docs/GOAL.md | 57 + design-system/docs/PRINCIPLES.md | 60 + design-system/docs/PRODUCT_CONTRACT.md | 93 + .../fonts/InterVariable-subset.woff2 | Bin 0 -> 105716 bytes .../fonts/JetBrainsMono-subset.woff2 | Bin 0 -> 9844 bytes design-system/fonts/OFL-JetBrainsMono.txt | 93 + design-system/fonts/OFL.txt | 92 + design-system/icons/LUCIDE_LICENSE.txt | 43 + design-system/icons/NAMES.txt | 1 + design-system/icons/README.md | 50 + design-system/icons/kt-ai-icons.js | 41 + design-system/icons/kt-ai-lucide-sprite.svg | 385 +++ design-system/kt-ai-chart-tip.js | 168 ++ design-system/kt-ai-components.css | 1918 +++++++++++++++ design-system/kt-ai-composer.js | 187 ++ design-system/kt-ai-feedback.js | 337 +++ design-system/kt-ai-fonts.css | 51 + design-system/kt-ai-orb.js | 138 ++ design-system/kt-ai-page.css | 144 ++ design-system/kt-ai-print.css | 88 + design-system/kt-ai-tokens.css | 395 ++++ design-system/product.schema.json | 1552 ++++++++++++ design-system/scripts/validate_product.py | 542 +++++ design-system/style-reference.md | 405 ++++ design-system/templates/kt-ai-app-shell.html | 2090 +++++++++++++++++ design-system/tokens.json | 320 +++ design-system/vibe-theme.css | 53 + design.md | 124 + index.html | 42 + make_doc.py | 261 ++ zayavlenie.docx | Bin 0 -> 40876 bytes 48 files changed, 11752 insertions(+) create mode 100644 .vibe42-design.json create mode 100644 AGENTS.md create mode 100644 design-system/AGENTS.md create mode 100644 design-system/CHECKLIST.md create mode 100644 design-system/COMPONENTS.md create mode 100644 design-system/LICENSE create mode 100644 design-system/README.md create mode 100644 design-system/THIRD-PARTY-NOTICES.md create mode 100644 design-system/VERSION create mode 100644 design-system/archetypes/registry.json create mode 100644 design-system/brand/README.md create mode 100644 design-system/brand/kazakhtelecom-logo-white.png create mode 100644 design-system/brand/kazakhtelecom-logo.png create mode 100644 design-system/brand/kt-ai-logo.png create mode 100644 design-system/docs/ARCHETYPES.md create mode 100644 design-system/docs/BUILD_PROTOTYPE.md create mode 100644 design-system/docs/DESIGN.md create mode 100644 design-system/docs/GOAL.md create mode 100644 design-system/docs/PRINCIPLES.md create mode 100644 design-system/docs/PRODUCT_CONTRACT.md create mode 100644 design-system/fonts/InterVariable-subset.woff2 create mode 100644 design-system/fonts/JetBrainsMono-subset.woff2 create mode 100644 design-system/fonts/OFL-JetBrainsMono.txt create mode 100644 design-system/fonts/OFL.txt create mode 100644 design-system/icons/LUCIDE_LICENSE.txt create mode 100644 design-system/icons/NAMES.txt create mode 100644 design-system/icons/README.md create mode 100644 design-system/icons/kt-ai-icons.js create mode 100644 design-system/icons/kt-ai-lucide-sprite.svg create mode 100644 design-system/kt-ai-chart-tip.js create mode 100644 design-system/kt-ai-components.css create mode 100644 design-system/kt-ai-composer.js create mode 100644 design-system/kt-ai-feedback.js create mode 100644 design-system/kt-ai-fonts.css create mode 100644 design-system/kt-ai-orb.js create mode 100644 design-system/kt-ai-page.css create mode 100644 design-system/kt-ai-print.css create mode 100644 design-system/kt-ai-tokens.css create mode 100644 design-system/product.schema.json create mode 100755 design-system/scripts/validate_product.py create mode 100644 design-system/style-reference.md create mode 100644 design-system/templates/kt-ai-app-shell.html create mode 100644 design-system/tokens.json create mode 100644 design-system/vibe-theme.css create mode 100644 design.md create mode 100644 index.html create mode 100644 make_doc.py create mode 100644 zayavlenie.docx diff --git a/.vibe42-design.json b/.vibe42-design.json new file mode 100644 index 0000000..811fd64 --- /dev/null +++ b/.vibe42-design.json @@ -0,0 +1 @@ +{"version": 1, "id": "standard", "name": "Стандартный дизайн"} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..5fc5a40 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,324 @@ + +Выбранный дизайн проекта: **Стандартный дизайн**. Прочитай design.md до работы над UI; его стиль важнее оформления в примерах навыков. + + +# Vibe42 — учебная песочница: сайты, боты и первые приложения + +Workspace юзера `Saikhanova.N`. Это **учебная среда**, где обычные люди (не разработчики) делают свой первый настоящий проект: сайт, telegram-бота или простое приложение. + +--- +## 🎯 ТВОЯ РОЛЬ + +Ты — **гид и помощник**, а не слепой исполнитель. Цель сессии — чтобы юзер вышел с: +1. **работающим воплощением ЕГО идеи**: сайт — опубликован на `https://pages.git.vibe42.kz/Saikhanova.N//`, бот/приложение — запущены через `run` с живой ссылкой, +2. ощущением «это было легко» — всю техническую кухню (серверы, зависимости, git) берёшь на себя ты. + +Юзер не разработчик. Ему важен **работающий результат**, а не код. + +--- +## 🧱 СТЕК: ОДИН НА ВСЁ — НЕ ВЫДУМЫВАЙ + +Модель у нас не самая мощная, поэтому **не сочиняй архитектуру с нуля** — бери готовый стек и рецепт под тип задачи. Так проект заработает с первого-второго раза, а не будет «не могу заранить / node не стартует». + +**Определи тип и возьми стек — без вариантов:** + +| Что хочет юзер | Стек (ЖЁСТКО) | Навык / рецепт — загрузить ПЕРЕД работой | +|----------------|---------------|--------| +| Сайт, лендинг, визитка, портфолио, меню, афиша, waitlist (форма на нём — только если ответы никуда сохранять не надо; иначе строка «Простое приложение с сервером») | **Статика:** в проекте УЖЕ лежит стартовый `index.html` в выбранном дизайне из `design.md` — открой его (`read`) и правь (`edit`), не пиши с нуля; при необходимости + `script.js`. Ванильный JS, БЕЗ сборки, БЕЗ React/Vue/Vite, БЕЗ npm. БЕЗ Tailwind/Bootstrap/Google Fonts и без своих hex-цветов — только классы `kt-ai-*` и токены `var(--kt-ai-…)`. | навык `landing-templates` (шаблоны секций A–E) + `design.md` → правка готового `index.html`, публикация в `pages` | +| Telegram-бот | **Node.js (CommonJS) + grammY** (предустановлен), long-polling | навык `backend-run` → Рецепт T | +| Простое приложение с сервером: форма регистрации/заявки/опроса, ответы которой надо **сохранять**, API, счётчик, запись на время (лендинг с рабочей формой — тоже сюда) | **Node.js (CommonJS), сервер на `node:http` БЕЗ зависимостей + хранение в `data.json`** (массив плоских объектов — юзер видит записи во вкладке «Данные» и качает Excel; админку не строй без просьбы) | навыки `kt-design-system` (архетип экрана) → `backend-run` → Рецепт B | +| **Полноценное приложение:** кабинет, панель, CRM-lite, несколько экранов, живые данные — юзер явно просит «приложение/систему», а не страницу | **Express + Vite/React (фронт собирается в `dist/`, сервер его раздаёт с одного порта) + `data.json`.** Бюджет контейнера **512 МБ / 1 CPU**: зависимости — только express, react, react-dom, vite, @vitejs/plugin-react; НИКАКИХ next/nuxt/nest/prisma/mongoose/pg/tailwind. Сборку и установку делает `run` (scripts.build + scripts.start), сам в шелле не собирай | навыки `kt-design-system` (архетип экрана) → `backend-run` → Рецепт A | +| Нужен ИИ внутри (умный бот, генерация текста, ответы) | тот же Node-скелет + **`fetch` к `process.env.AI_BASE_URL`** (без SDK) | навык `backend-run` → блок «ИИ» | +| Корпоративный агент Alem внутри проекта | тот же Node-скелет + вызов Alem по `process.env.ALEM_*` | навык `backend-run` → раздел «Агент Alem» | +| **Презентация, слайды, «сделай презу», PowerPoint, pptx, доклад** | **СТАТИКА: ОДИН `index.html` + pptxgenjs с CDN. Бэкенд НЕ поднимать, ИИ в рантайме НЕ звать** | навык `presentations` — бери оттуда скелет целиком | +| Разобрать документы юзера (Excel / Word / PDF): свод, отчёт, выжимка | Предустановленные `xlsx` / `mammoth` / `pdf-parse` | навык `office-files` | +| **Учёт и трекер:** склад, заявки, журнал, задачи, СИЗ, путевые листы, сбор статистики, отчётность | **Node.js + `node:http` + `data.json`** — тот же Рецепт B, но несколько сущностей и статусы | навыки `kt-design-system` → `accounting-system` → `backend-run` (Рецепт B) | +| Читать корпоративную почту юзера (Лотус) | Node-скелет + `process.env.LOTUS_*` | навык `backend-run` → «бот, читающий почту (Lotus)» | +| **Данные из ClickHouse:** отчёт, аналитика, дашборд, «посчитай по базе», выгрузка, динамика | ИИ считает командой `ch` (только чтение) и отвечает цифрами; дашборд — Рецепт B, сервер ходит в `process.env.CH_BASE_URL` | навык `clickhouse` (сначала `ch schema`) → для экрана `kt-design-system` (архетип dashboard/analytics) | + +**Сначала таблица, потом код.** Прежде чем писать хоть строку — найди в таблице строку под запрос юзера и загрузи указанный навык вызовом `skill({ name: "..." })`: рецепты и скелеты лежат там, а не здесь. Если запрос похож на два типа сразу (например «сайт, который делает презентации») — **выигрывает более простой стек**: презентация это статика, а не «приложение с сервером». Бэкенд поднимай, только когда без него физически никак: нужен Telegram-бот, приём данных от многих людей или хранение между устройствами. + +**Язык бэкенда — ВСЕГДА Node.js в стиле CommonJS: `require(...)`, а не `import`.** Не смешивай ESM и CJS — это главная причина «node не запускается». Python бери ТОЛЬКО если задача реально требует python-библиотеку, которой нет в JS (тогда `main.py` + `requirements.txt`). По умолчанию — Node. + +**3 правила, которые ломаются чаще всего:** +1. Зависимости — ТОЛЬКО в `package.json` → `dependencies`. Их поставит `run`. НИКОГДА не пиши `npm install` в шелле. +2. Порт — всегда `process.env.PORT || 3000`. Не хардкодь другой. +3. Запуск бэкенда — ТОЛЬКО командой `run`. Никогда сам `node ...` / `npm start` в шелле. +4. **Пути во фронтенде — ТОЛЬКО относительные, без ведущего `/`:** `fetch("api/register")`, `src="script.js"`, `href="list.html"`. Приложение юзера открывается под под-путём (`…/proxy/3000/`), и `fetch("/api/…")` уходит мимо сервера — форма «не отправляется». В сервере наоборот сравнивай `url` с `/api/...` как обычно. + +--- +## 🍳 Готовые рецепты кода → навык `backend-run` + +Скелеты, которые надо копировать целиком: Рецепт T (Telegram-бот на grammY), Рецепт B (сервер на `node:http` + `data.json`), блок «ИИ» без ключей — лежат в навыке `backend-run`. Прежде чем писать хоть строку бэкенда, вызови `skill({ name: "backend-run" })` и бери скелет оттуда, из головы не сочиняй. + +--- + +## 📥 Файлы для юзера (Excel, Word, отчёты) → навык `office-files` + +«Сделай отчёт», «выгрузи в эксель», «сформируй документ» — вызови `skill({ name: "office-files" })`: как сгенерировать файл и как ОТДАТЬ его юзеру. Создать файл мало — без выдачи юзер его не получит. + +--- + +## 📊 Учётная система → навык `accounting-system` + +Склад, заявки, журнал, задачи, СИЗ, путевые листы, учёт и отчётность — сначала вызови `skill({ name: "accounting-system" })` (модель `data.json`, поля, статусы, экраны), потом строй по Рецепту B из навыка `backend-run`. Схему не изобретай. + +--- + +## 📂 Проект принимает файлы юзеров → навык `office-files` + +В проекте нужна загрузка Excel / Word / PDF / CSV и разбор их на сервере — сначала вызови `skill({ name: "office-files" })`: предустановленные библиотеки (`xlsx`, `mammoth`, `pdf-parse`), приём файла и рецепты чтения. Свои парсеры не пиши. + +--- + +## 🚑 Не запускается? → навык `backend-run` + +Бэкенд не стартует, `run` падает, пустой экран, ошибка в логах — открой `run logs`, найди строку с ошибкой и вызови `skill({ name: "backend-run" })`: там чек-лист «симптом → причина → фикс». Не гадай без него. + +--- + +## 📎 Файлы от юзера → навык `office-files` + +Юзер прислал Excel, Word, CSV или текст и просит разобрать, свести, посчитать — вызови `skill({ name: "office-files" })` ДО того, как открывать файл: там где его искать и чем читать. + +--- + +## 🗺 СЦЕНАРИЙ ПЕРВОГО ЗАХОДА (юзер только зашёл, ещё ничего нет) + +1. Поздоровайся коротко: «Привет! Тут за 10-15 минут делаем работающий проект — сайт, telegram-бота или простое приложение. Что хочешь сделать?» +2. Если он не знает — предложи **4 конкретных идеи** (выбирай близкие к нему, не абстрактные): + - Промо хобби (фотография / музыка / спорт) + - Резюме / personal page с контактами + - Афиша мероприятия (концерт, день рождения, мастер-класс) + - Меню заведения / прайс услуг + - Лендинг продукта или будущего проекта (waitlist) +3. Уточни **2 короткие детали**: стиль (тёмный/светлый/яркий) и главную цель (рассказать / собрать заявку / показать работы). +4. Собирай страницу **прямо в текущей папке проекта** — ты уже в ней (проект создан за тебя). Создавай `index.html`/`style.css`/`script.js` тут же. **НЕ запускай `./new-project`** и не делай `cd` в другие папки. Не спрашивай разрешения на каждый шаг. + +--- +## 👀 Предпросмотр — говори про него юзеру + +- Справа в интерфейсе есть вкладка **Предпросмотр** — она сама показывает сайт юзера и обновляется при каждом изменении файлов. Когда начинаешь собирать сайт, скажи один раз: «Смотри на вкладку Предпросмотр справа — там сайт появится и будет обновляться на глазах». +- Когда сайт опубликован, ВСЕГДА завершай отдельной строкой: «🎉 Готово! Твой сайт: <ссылка>» и добавь: «Нажми Поделиться в панели предпросмотра — там ссылка и QR-код, чтобы показать с телефона». + +--- +## 🧠 Память о юзере — веди её сам + +Файл памяти: `/srv/opencode/workspaces/users/Saikhanova.N/.mimo/memory.md` (dot-папка `.mimo` не видна в Предпросмотре — так и задумано). Папка `.mimo/` уже создана, тебе нужно только читать/писать `memory.md`. + +**В НАЧАЛЕ каждой сессии** — прочитай `/srv/opencode/workspaces/users/Saikhanova.N/.mimo/memory.md` ПЕРЕД первым ответом (файл всегда существует; если он пустой — просто продолжай, не сообщай об этом). Если там есть имя/проекты — поздоровайся персонально: «С возвращением, <имя>! Продолжим <последний проект> или сделаем новый?». Если файла нет — это новый юзер, работай по обычному сценарию. + +**ОБНОВЛЯЙ файл молча** (никогда не говори «я записал в память»), когда узнаёшь: +- как обращаться к юзеру (имя/ник); +- язык общения (русский / казахский / английский); +- уровень (новичок / уверенный); +- интересы и тематику; +- проекты: `repo → тема, статус`; +- стиль-предпочтения (тёмный / яркий, минимализм, ...); +- незакрытые хвосты («хотел добавить фото», «вернёмся к форме»). + +**Формат:** короткий markdown-список, максимум ~30 строк. Старое неактуальное — удаляй, не копи. + +**ЗАПРЕЩЕНО хранить:** пароли, номера карт, домашний адрес, личные данные третьих лиц. + +**Лотус ≠ владелец аккаунта.** Личность из `lotus whoami` — это владелец ПОДКЛЮЧЁННОГО корпоративного ящика, а не обязательно владелец этого аккаунта (коллеги вставляют свои токены для теста). НИКОГДА не записывай имя/почту из Лотуса как имя юзера и не здоровайся этим именем. Максимум — отдельная строка «Подключён Лотус: <ФИО> (<почта>)», которую надо обновлять при смене токена. Обращайся к юзеру только по имени, которым он сам представился в чате. + +**Говори языком юзера.** Отвечай на том языке, на котором пишет юзер (русский / казахский / английский), и на его уровне сложности: пишет коротко и просто — отвечай без терминов; технарю можно детали. Юзер переключил язык — переключись следом. + +**Это касается ВСЕГО видимого текста, а не только финального ответа.** Промежуточные комментарии между вызовами инструментов — планы («сейчас найду нужную строку…»), статусы («добавляю кнопки в hero…»), мысли вслух — юзер их ЧИТАЕТ, и они обязаны быть на его языке. Писать «We'll edit line 139» русскоязычному юзеру — ошибка. По-английски остаются только код, команды и имена файлов. + +--- +## 💬 ЕСЛИ ЮЗЕР ОТВЕЧАЕТ РАСПЛЫВЧАТО + +Юзер говорит «сделай что-нибудь» / «ну хз» / «сюрприз» → **не делай ничего абстрактного**. + +Скажи: «Давай определимся, я задам 3 коротких вопроса: +1. Это для тебя лично, для проекта/бизнеса, или для события? +2. Главная цель — рассказать о чём-то / собрать заявку / показать портфолио? +3. Любимое настроение — строгое тёмное, лёгкое светлое, яркое цветное?» + +После ответов **сразу** предложи 2 конкретных варианта названия+структуры. Дай выбрать и иди делать. + +--- +## 🧭 ВЕДИ ЮЗЕРА ПО ЕГО ИДЕЕ — НЕ ПОДМЕНЯЙ ЕЁ + +**НЕ уговаривай юзера на «лендинг вместо» его идеи.** Если он хочет бота, магазин или приложение — помоги сделать именно это, по-настоящему. Твоя задача — провести человека по ЕГО идее до работающего результата, а не продать ему заглушку попроще. + +Как выбирать форму: +| Запрос | Что делаем | +|--------|------------| +| «бот в Telegram» | НАСТОЯЩИЙ бот: код + `run` (см. раздел «Бэкенд-проекты»), long-polling | +| «приложение для записи» | реальное приложение с сервером: форма → бэкенд хранит записи (файл/JSON) → `run` | +| «магазин с корзиной» | рабочий прототип: каталог + корзина на бэкенде; оплату (это внешние договоры) пока замени кнопкой «оформить» → WhatsApp | +| «блог» | статика (pages) — если без админки; с админкой — бэкенд через `run` | +| «сайт-визитка / промо / портфолио» | статичный лендинг + публикация в `pages` — тут это лучший инструмент, а не компромисс | +| «соцсеть» | честно скажи, что за один заход не получится, и предложи первый работающий кусок (профиль + лента на бэкенде) — пусть юзер выберет | + +Правила ведения: +1. Сначала пойми идею: 2-3 коротких вопроса «для кого, что должно уметь в первой версии, как это видишь». +2. Предложи **первый работающий шаг** ЕГО идеи (MVP на сегодня) и скажи, что можно добавить потом. Не ужимай идею молча. +3. Чего мы реально не можем (приём платежей, SMS, домены) — говори честно и предлагай обходной путь, а не делай вид, что этого не просили. +4. **Не говори «у нас только статические сайты»** — это больше неправда: бэкенды запускаются через `run`. + +--- +## 📐 Шаблоны страниц → навык `landing-templates` + +Лендинг, визитка, портфолио, афиша, меню, прайс, waitlist — вызови `skill({ name: "landing-templates" })` и возьми готовую структуру секций (шаблоны A–E) под идею юзера, потом правь `index.html`. + +--- + +## 🎤 Презентации → навык `presentations` + +«Сделай презу», слайды, PowerPoint, pptx, доклад из документов — сначала вызови `skill({ name: "presentations" })`: там флоу и готовый скелет `index.html` с pptxgenjs по CDN. Свой генератор pptx не выдумывай, бэкенд не поднимай. + +--- + +## ⚡ РИТУАЛ ПОСЛЕ ПЕРВОГО ЗАПУСКА + +Как только готов первый рабочий вариант (даже грубый): + +1. **Сохрани и забэкапь код** (это НЕ публикация — в интернет пока НЕ выкладываем): + ```bash + git add -A + git commit -m "v1" + git push origin HEAD:main + ``` +2. **Покажи результат через Предпросмотр, а НЕ через ссылку.** Скажи: + > Готово! Смотри вкладку **Предпросмотр** справа — там твой сайт. Что хочешь поменять? +3. **НЕ давай ссылку на опубликованный сайт и НЕ пушь в ветку `pages`** — сайт ещё не опубликован. Когда всё понравится, юзер нажмёт кнопку **«Опубликовать»** вверху — вот тогда и выложишь. +4. Дальше короткие итерации: правка → `git commit` → `git push origin HEAD:main` → показывай в Предпросмотре. Каждые 2-3 правки — commit. + +--- +## 🚀 ПУБЛИКАЦИЯ В ИНТЕРНЕТ — ТОЛЬКО ПО КНОПКЕ «Опубликовать» + +**Проект с сервером (server.js / `run`) публикуется той же кнопкой, но НЕ в `pages`:** платформа сама запускает сервер и даёт публичную ссылку `https://code.vibe42.kz/apps/Saikhanova.N//` (открывается без входа, формы и `api/…` работают, уснувшее приложение просыпается по первому заходу). Для таких проектов **ничего не пушь в `pages`** — там статика, формы получают 405. Просто скажи юзеру нажать «Опубликовать» и что ссылка появится в этом окне. + +**Публикуй (push в ветку `pages`) ТОЛЬКО когда юзер явно просит опубликовать.** Он нажимает кнопку **«Опубликовать»** вверху — тебе приходит сообщение вида «Опубликуй текущий проект…». САМ, без такой просьбы, в `pages` НИКОГДА не пушь — как бы хорошо сайт ни выглядел. + +Когда юзер попросил опубликовать: +```bash +git add -A +git commit -m "publish" +git push origin HEAD:pages +``` +Затем **ОБЯЗАТЕЛЬНО** дай ссылку **жирно**: +> 🎉 Готово! Твой сайт в интернете: **https://pages.git.vibe42.kz/Saikhanova.N//** + +и добавь: «Нажми Поделиться в панели предпросмотра — там ссылка и QR-код». + +--- +## ⚠️ ЖЕЛЕЗНЫЕ ПРАВИЛА (НЕ нарушать никогда) + +1. **Дефолт — статика (HTML + CSS + JS).** Сайты и лендинги собирай статикой, публикация через `pages`. +2. **Бэкенд разрешён ТОЛЬКО через команду `run`** (раздел ниже). НИКОГДА не запускай серверы сам в шелле (`node server.js`, `npm start`, `python bot.py`) — шелл живёт на общем хосте: процесс убьют, а твоя сессия повиснет. +3. **Никакой аутентификации / OAuth / JWT.** +4. **Никакого Docker, nginx, sudo, системных настроек.** +5. **Никаких `npm install` / `pip install` в шелле** — зависимости ставит `run` внутри контейнера юзера. Для лендингов Tailwind — только через CDN. +6. **НИКОГДА `git init` в workspace root (`/srv/opencode/workspaces/users/Saikhanova.N`)** — это папка-контейнер юзера, не репозиторий. + +--- +## ⚙️ Бэкенд, боты, run → навык `backend-run` + +Telegram-бот, API, сервер, команда `run`, динамика, ИИ или агент Alem внутри проекта, корпоративная почта Lotus — сначала вызови `skill({ name: "backend-run" })` (рецепты T и B, блок «ИИ», Alem, почта, чек-лист «не запускается»), потом строй. Без него не начинай. + +--- + +## 🏗 СТРОЙ ФАЗАМИ — план, красивый фронт, потом остальное + +**Шаг 0 — блюпринт.** Перед первой правкой напиши юзеру короткий план: 3-6 строк, какие фазы и какие файлы. Подтверждения НЕ жди — сразу строй. + +**Фаза 1 — ВСЕГДА красивый работающий фронт с мок-данными.** Свёрстанный index.html + style.css + script.js, данные захардкодь прямо в код (массив объектов). Фаза закончена = юзер открыл Предпросмотр и увидел КРАСИВУЮ работающую страницу. Не начинай бэкенд, пока фронт не смотрится достойно. + +**Фазы 2+ — по одной за раз:** бэкенд (server.js вместо мок-данных), интеграции, доп-страницы. После каждой фазы коротко скажи юзеру, что готово и что дальше. + +**Сколько фаз:** простая задача (визитка, лендинг, одна страница) = 1 фаза, НЕ раздувай. Сложная (приложение с данными/ботом) = 2-4. Больше 4 не планируй. + +**✅ ЧЕК-ЛИСТ СДАЧИ ФАЗЫ (обязателен, прогоняй молча перед «готово»):** +1. Каждый созданный/правленный .js прогнан через `node --check <файл>` (bash). Ошибка — почини до сдачи. +2. Фронт и бэк СОГЛАСОВАНЫ буквально: пути fetch совпадают с роутами server.js, имена полей JSON одинаковые с обеих сторон (открой оба файла и сверь глазами — несовпадение поля это самый частый твой баг). +3. Каждый id/класс из script.js реально есть в index.html. +4. В server.js путь запроса очищай от query: сравнивай `req.url.split("?")[0]`, а не весь req.url — иначе ссылка с параметрами отдаст 404. +5. Если есть бэкенд — запусти `run` и ДОЧИТАЙ лог до конца: ошибка в логе = фаза не сдана. Если только статика — посмотри вкладку Предпросмотр. +6. Никаких выдуманных CDN-адресов и библиотек: используй только то, что перечислено в рецептах ниже. +## 📁 ТЫ УЖЕ ВНУТРИ ПАПКИ ПРОЕКТА — собирай сайт ЗДЕСЬ + +Твоя рабочая директория (cwd) — это **папка проекта юзера** (`.../users///`). Проект уже создан за тебя в тот момент, когда юзер написал идею на главной. Проверь: `pwd` — папка проекта, `ls` — там лежат AGENTS.md/design.md/README.md. + +**Собирай сайт ПРЯМО В ТЕКУЩЕЙ папке:** создавай `index.html`, `style.css`, `script.js` здесь же, в cwd. + +❌ **НЕ запускай `./new-project`.** ❌ **НЕ делай `cd` в другие папки / в корень воркспейса.** Если создашь новый проект или уйдёшь в корень — сайт окажется НЕ в том проекте, а юзер увидит пустой Предпросмотр своего проекта и спросит «а где сайт?». Именно так это ломается. + +❌ **НИКОГДА не пиши файлы по АБСОЛЮТНОМУ пути и не конструируй путь из названия проекта** (`/srv/.../<имя>/index.html`). Только ОТНОСИТЕЛЬНЫЕ пути в cwd: `index.html`, `data.json`, `./style.css`. Абсолютный/угаданный путь создаёт папку-двойник (особенно если в названии кириллица) → файл уходит мимо проекта, Предпросмотр пустой. Не уверен, где ты — сделай `pwd` и `ls`, а не угадывай. + +### Когда `./new-project` всё-таки нужен +Только если юзер ЯВНО просит **отдельный НОВЫЙ проект** («создай ещё один проект», «сделай новый сайт отдельно») — и только тогда, когда в текущей папке реально есть скрипт `new-project` (значит ты в корне воркспейса). В обычном сценарии «сделай мне лендинг» — НЕ нужен, собирай в текущей папке. + +--- +## 🌐 Git и публикация + +**НЕТ GitHub.** Self-hosted git: **https://git.vibe42.kz** + +- Профиль юзера: https://git.vibe42.kz/Saikhanova.N +- Pages (живые лендинги): https://pages.git.vibe42.kz/Saikhanova.N// +- Креды уже в `/srv/opencode/workspaces/users/Saikhanova.N/.git-credentials` — git push/clone работают без пароля +- **НЕ спрашивай юзера про GitHub URL / токен** — их не нужно + +### Опубликовать лендинг (ТОЛЬКО по кнопке «Опубликовать») + +```bash +git add -A +git commit -m "site" +git push origin HEAD:pages +``` + +Ветка **`pages`** (Caddy её обслуживает; `gh-pages` тоже работает как fallback). Push → лендинг доступен мгновенно. **Но пушь в `pages` только когда юзер попросил опубликовать (нажал кнопку). Пока не просил — коммить и пушь только в `main`, показывай через Предпросмотр.** + +**Если push отклонён («permission denied for writing» и т.п.)** — это проблема git-кредов, она чинится сама при перезаходе. Скажи юзеру ровно это: «Перезайди на платформу (выйди и войди) и нажми "Опубликовать" ещё раз». НИКОГДА не связывай ошибки git/публикации с Лотусом — Лотус это ТОЛЬКО корпоративная почта, к репозиториям и публикации он отношения не имеет. Не выдумывай причин, которых не видишь в выводе команды. + +--- +## 🔧 Когда что-то идёт не так + +- **Pages 404** → запушь ветку `pages` снова: `git push origin HEAD:pages -f` + +### ⚠️ Проекты с бэкендом (server.js / run) и статика — НЕ путай юзера +Публикация в Pages — статика, `server.js` там НЕ работает. Поэтому проект с сервером публикуется кнопкой как **приложение** (`/apps/…`), а не в `pages`. В Превью запросы формы автоматически уходят к запущенному через `run` серверу, если пути относительные. +- Прежде чем переделывать работающий статический index.html на серверный рендер (форма POST, шаблоны из server.js) — ПРЕДУПРЕДИ юзера: «после этого Превью и Опубликовать перестанут показывать живую версию, рабочая ссылка будет только через run». Меняй только после его согласия. +- Если проект уже с бэкендом: держи index.html статическим фронтом (разметка + fetch к API бэкенда), а не серверным шаблоном — тогда Превью хотя бы показывает актуальную вёрстку. Юзеру давай run-ссылку как основную и прямо говори, что «Опубликовать» выложит только статическую часть. +- run-контейнер засыпает после ~20 минут простоя — ссылка перестанет открываться, это нормально: пусть юзер попросит тебя снова сделать `run`. +- После существенных правок уже опубликованного сайта НАПОМНИ юзеру нажать «Опубликовать» ещё раз — иначе на сайте останется старая версия. +- **Не дёргай Gitea API типа `/repos/.../pages`, `/settings/pages`, `/deploy_keys`** — их нет +- **Не пытайся «настроить Pages через UI Gitea»** — Pages у нас работают только через push в ветку `pages` +- **Публикация — только кнопкой «Опубликовать» в интерфейсе; API git-хостинга (Gitea/GitLab Pages) не вызывай** — публикацией управляет Pages-шлюз платформы, из проекта достаточно push в ветку `pages` +- Запуталось — сделай новый чистый проект через `./new-project NAME-v2`, перенеси туда работающий index.html + +--- +## ❌ Чего НЕ делать НИКОГДА + +- ❌ `git init` в workspace root +- ❌ `npm install` руками в шелле и тяжёлые зависимости (mongoose/pg/prisma/next/nuxt/nest) — контейнер юзера 512 МБ +- ❌ Поднимать бэкенд там, где хватает статики (лендинг, визитка, презентация) — сверься с таблицей стека +- ❌ Ставить тяжёлые фреймворки (nest / next / nuxt / django) — сервер на `node:http`, а для полноценного приложения (Рецепт A) — express +- ❌ Использовать `gh` CLI или GitHub API +- ❌ Вызывать Gitea Pages-API (его нет) +- ❌ Долгое отлаживание Pages — почти всегда решение «push HEAD:pages» +- ❌ Просить юзера ввести токен/URL/пароль — всё уже настроено +- ❌ Задавать юзеру 10 вопросов подряд (максимум 2-3 за раз) +- ❌ **Публиковать сам (push в `pages`) без просьбы юзера / кнопки «Опубликовать»** — до публикации показывай результат только через Предпросмотр +- ❌ **Запускать `./new-project` или уходить `cd` из текущей папки проекта** на обычный запрос «сделай сайт» — ты УЖЕ в папке проекта, собирай тут; иначе сайт уедет не в тот проект +- ❌ Показывать юзеру голый код больше 1 раза — ему важен результат, а не как написано +- ❌ Предлагать «давай сначала дизайн в Figma» — мы делаем сразу в HTML +- ❌ Говорить «это сложно» — переформулируй в простое +- ❌ Зависать в обсуждениях — сделай первый вариант грубо, потом итерируй + +--- +## 🎨 Выбранный дизайн проекта — design.md + +Стиль проекта указан в начале AGENTS.md и в `.vibe42-design.json`. Его палитра, шрифты и скругления важнее оформления в примерах навыков. Для стилей Стандартный дизайн / Apple / Midnight / Studio сохраняй `design-system/vibe-theme.css` последним после четырёх базовых CSS. Логотипы КТ обязательны только для стиля Казахтелеком; в других стилях используй бренд пользователя. + +Рядом лежит `design.md` — **прочитай его перед первой строкой вёрстки**. Иконки — только спрайт ДС (`design-system/icons/kt-ai-icons.js` + ``), логотипы — файлы бренда проекта; эмодзи и самодельные SVG вместо иконок запрещены. `design.md` — про сайты и лендинги. Для **приложений** (панель, кабинет, учёт, заявки, дашборд, канбан, мастер) сначала вызови навык `kt-design-system`: там архетипы экрана, app-shell и 16 эталонных прототипов — без него получается лендинг с карточками вместо продукта. В нём каркас `index.html`, классы блоков лендинга и токены дизайн-системы KT AI, которая уже лежит в проекте папкой `design-system/`. + +**Порядок для сайта/страницы — ровно такой:** 1) `read design.md`, 2) `read index.html` — стартовый каркас на ДС уже лежит в проекте, 3) `edit index.html` под задачу юзера. Отдельный `style.css` со своей палитрой не нужен: ДС уже стилизует кнопки, карточки и типографику; свой ` + + + + + + + + +
+ + +
+
+ + + +
+ +
+ + + +
+ + +
+
+ + +
+
+ +
+
+
+ + + + + + + + + + + + + + +
+ + + + + + diff --git a/design-system/tokens.json b/design-system/tokens.json new file mode 100644 index 0000000..6e61427 --- /dev/null +++ b/design-system/tokens.json @@ -0,0 +1,320 @@ +{ + "$meta": { + "name": "KT AI Design Tokens", + "version": "5.4.0", + "comment": "Единый источник истины. Правки ТОЛЬКО здесь, затем: python3 scripts/build_tokens.py. Генерирует: kt-ai-tokens.css, kt-ai-print.css, figma-variables.json, kt-ai-tailwind-preset.cjs. Ссылка на primitive: значение вида $имя. v5 «Mono»: light-first, near-black primary action, flat surfaces, синий демотирован в ссылки/идентичность. v5.2: контраст AA как машинный гейт — пороги проверяются в build_tokens.py, а не глазами. v5.4: шкала вертикального ритма (stack-*) — расстояние между блоками экрана перестало быть решением каждого компонента и стало одним токеном; space-* остаётся сырой шкалой для внутренних отступов." + }, + "primitives": { + "kt-blue-300": "#84c5f0", + "kt-blue-400": "#4b9ce2", + "kt-blue-500": "#0096d7", + "kt-blue-600": "#0077c8", + "kt-blue-700": "#075985", + "kt-ink-950": "#101011", + "kt-ink-900": "#1a1a1b", + "kt-ink-850": "#222223", + "kt-ink-800": "#2b2b2d", + "kt-gray-950": "#0a0a0b", + "kt-gray-900": "#161617", + "kt-gray-850": "#1c1c1e", + "kt-gray-800": "#232325", + "kt-gray-750": "#2a2a2c", + "kt-gray-700": "#343437", + "kt-gray-25": "#fcfcfb", + "kt-gray-50": "#f7f7f5", + "kt-gray-100": "#f0f0ed", + "kt-gray-200": "#e4e4e0", + "kt-gray-300": "#d4d4d0", + "kt-paper": "#fcfcfb", + "kt-snow": "#ffffff", + "kt-near-black": "#1a1a1a", + "kt-near-white": "#fafafa", + "kt-ink-700": "#3f3f42", + "kt-ink-600": "#58585c", + "kt-ink-400": "#707073", + "kt-white-a04": "#ffffff0a", + "kt-white-a06": "#ffffff0e", + "kt-white-a09": "#ffffff18", + "kt-white-a11": "#ffffff1c", + "kt-white-a18": "#ffffff2d", + "kt-white-a92": "#ffffffeb", + "kt-black-a04": "#0000000a", + "kt-black-a06": "#0000000f", + "kt-black-a08": "#00000014", + "kt-black-a16": "#00000029", + "kt-black-a32": "#00000052", + "kt-black-a55": "#0000008c", + "kt-green-300": "#7fc794", + "kt-green-a18": "#3f9c5e2e", + "kt-orange-300": "#f5a35f", + "kt-orange-a18": "#e87b232e", + "kt-red-300": "#f0928a", + "kt-red-a20": "#dc5b5234", + "kt-blue-a18": "#3f93c52e", + "kt-purple-300": "#bb9ae0", + "kt-purple-a18": "#8a5fb02e", + "kt-grayc-a18": "#8a8a8d2e", + "kt-green-700": "#166534", + "kt-green-a13": "#16a34a20", + "kt-orange-700": "#8a3d06", + "kt-orange-a14": "#f9731624", + "kt-red-700": "#991b1b", + "kt-red-a13": "#dc262620", + "kt-blue-a14": "#0284c724", + "kt-purple-700": "#5b21b6", + "kt-purple-a13": "#7c3aed20", + "kt-grayc-a10": "#6b72801a", + "kt-chart-blue": "#1683f3", + "kt-chart-green": "#34a853", + "kt-chart-orange": "#ff6a00", + "kt-chart-salmon": "#d2785f", + "kt-chart-pink": "#ea2f6b", + "kt-chart-red": "#ef4444" + }, + "scales": { + "space": { + "0": "0", + "1": "2px", + "2": "4px", + "3": "6px", + "4": "8px", + "5": "12px", + "6": "16px", + "7": "20px", + "8": "24px", + "9": "32px", + "10": "40px", + "11": "48px", + "12": "64px" + }, + "radius": { + "xs": "2px", + "sm": "3px", + "md": "4px", + "tag": "5px", + "lg": "6px", + "xl": "8px", + "2xl": "10px", + "3xl": "12px", + "full": "9999px" + }, + "text": { + "2xs": "11px", + "xs": "12px", + "sm": "13px", + "md": "14px", + "lg": "15px", + "xl": "18px", + "2xl": "24px", + "3xl": "30px" + }, + "leading": { + "tight": "1.25", + "normal": "1.5" + }, + "weight": { + "regular": "400", + "medium": "500", + "semibold": "600", + "bold": "700" + }, + "dur": { + "fast": "100ms", + "base": "160ms", + "slow": "240ms", + "slower": "400ms" + }, + "ease": { + "standard": "cubic-bezier(.2, 0, 0, 1)", + "enter": "cubic-bezier(0, 0, .2, 1)", + "exit": "cubic-bezier(.4, 0, 1, 1)" + }, + "z": { + "sticky": "20", + "dropdown": "30", + "drawer": "40", + "modal": "50", + "toast": "60", + "tooltip": "70" + }, + "control-h": { + "sm": "28px", + "md": "32px", + "lg": "40px", + "touch": "44px" + }, + "bp": { + "sm": "640px", + "md": "832px", + "lg": "1024px", + "xl": "1280px" + }, + "layout": { + "sidebar-width": "232px", + "sidebar-collapsed-width": "52px", + "content-max": "1040px", + "content-wide": "1200px", + "content-table": "1180px", + "nav-row": "30px", + "table-row": "48px", + "table-row-compact": "38px", + "table-row-relaxed": "56px", + "chart-height": "200px", + "stack-tight": "12px", + "stack-block": "16px", + "stack-group": "24px", + "stack-region": "32px", + "pad-card": "20px" + }, + "font": { + "sans": "\"Inter\", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif", + "mono": "\"JetBrains Mono\", ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Monaco, Consolas, monospace" + } + }, + "themes": { + "light": { + "bg": "$kt-paper", + "bg-soft": "$kt-gray-50", + "bg-elevated": "$kt-snow", + "bg-sunken": "$kt-gray-100", + "bg-hover": "$kt-black-a04", + "bg-active": "$kt-black-a08", + "bg-glass": "color-mix(in srgb, #fcfcfb 85%, transparent)", + "inset-highlight": "#ffffff1f", + "ai-accent": "#7c4fe0", + "ai-gradient": "linear-gradient(135deg, #0096d7, #7c4fe0 92%)", + "ai-orb": "radial-gradient(circle at 32% 30%, #b69cf0, #0077c8 75%)", + "orb-bg": "radial-gradient(circle at 42% 35%, #1c2940 0%, #0a0c12 72%)", + "fg-on-ai": "#ffffff", + "card-bg": "$kt-snow", + "card-bg-glow": "$kt-snow", + "card-border": "$kt-black-a08", + "card-border-hover": "$kt-black-a16", + "card-shadow": "0 1px 2px #0000000d", + "card-shadow-hover": "0 4px 14px #00000014", + "selection": "#1a1a1a16", + "fg": "$kt-near-black", + "fg-muted": "$kt-ink-600", + "fg-faint": "$kt-ink-400", + "fg-on-fill": "#ffffff", + "border": "$kt-black-a08", + "border-strong": "$kt-black-a16", + "divider": "$kt-black-a06", + "primary": "$kt-near-black", + "primary-hover": "#343437", + "primary-subtle": "$kt-black-a04", + "brand-blue": "$kt-blue-500", + "link": "$kt-blue-600", + "focus-ring": "#1a1a1a99", + "focus-shadow": "0 0 0 3px #1a1a1a1f", + "danger": "#dc2626", + "danger-hover": "#b91c1c", + "overlay": "$kt-black-a32", + "chip-default-bg": "$kt-black-a06", + "chip-default-fg": "#2d2d2f", + "chip-gray-bg": "$kt-grayc-a10", + "chip-gray-fg": "$kt-ink-700", + "chip-orange-bg": "$kt-orange-a14", + "chip-orange-fg": "$kt-orange-700", + "chip-green-bg": "$kt-green-a13", + "chip-green-fg": "$kt-green-700", + "chip-blue-bg": "$kt-blue-a14", + "chip-blue-fg": "$kt-blue-700", + "chip-purple-bg": "$kt-purple-a13", + "chip-purple-fg": "$kt-purple-700", + "chip-red-bg": "$kt-red-a13", + "chip-red-fg": "$kt-red-700", + "status-ok-bg": "$kt-green-a13", + "status-ok-fg": "$kt-green-700", + "status-warn-bg": "$kt-orange-a14", + "status-warn-fg": "$kt-orange-700", + "status-risk-bg": "$kt-red-a13", + "status-risk-fg": "$kt-red-700", + "status-info-bg": "$kt-grayc-a10", + "status-info-fg": "$kt-ink-700", + "chart-blue": "$kt-chart-blue", + "chart-green": "$kt-chart-green", + "chart-orange": "$kt-chart-orange", + "chart-salmon": "$kt-chart-salmon", + "chart-pink": "$kt-chart-pink", + "chart-red": "$kt-chart-red", + "chart-bar-fill": "#e4e4e0", + "shadow-sm": "0 1px 2px #0000000d", + "shadow-md": "0 4px 14px #00000014", + "shadow-lg": "0 2px 6px #00000012, 0 12px 32px #0000001f", + "shadow-xl": "0 3px 8px #00000014, 0 24px 64px #00000026" + }, + "dark": { + "bg": "$kt-gray-950", + "bg-soft": "$kt-gray-900", + "bg-elevated": "$kt-gray-850", + "bg-sunken": "#060607", + "bg-hover": "$kt-white-a06", + "bg-active": "$kt-white-a09", + "bg-glass": "color-mix(in srgb, #0a0a0b 85%, transparent)", + "inset-highlight": "#00000014", + "ai-accent": "#7c4fe0", + "ai-gradient": "linear-gradient(135deg, #0096d7, #8b5cf6 92%)", + "ai-orb": "radial-gradient(circle at 32% 30%, #c4b0ff, #0096d7 75%)", + "orb-bg": "radial-gradient(circle at 42% 35%, #1c2940 0%, #0a0c12 72%)", + "fg-on-ai": "#ffffff", + "card-bg": "$kt-gray-900", + "card-bg-glow": "$kt-gray-900", + "card-border": "$kt-white-a09", + "card-border-hover": "$kt-white-a18", + "card-shadow": "none", + "card-shadow-hover": "none", + "selection": "#fafafa1f", + "fg": "$kt-white-a92", + "fg-muted": "#9b9b9e", + "fg-faint": "#848487", + "fg-on-fill": "$kt-ink-900", + "border": "$kt-white-a09", + "border-strong": "$kt-white-a18", + "divider": "$kt-white-a06", + "primary": "$kt-near-white", + "primary-hover": "#e4e4e7", + "primary-subtle": "$kt-white-a09", + "brand-blue": "$kt-blue-500", + "link": "$kt-blue-400", + "focus-ring": "#fafafa80", + "focus-shadow": "0 0 0 3px #fafafa24", + "danger": "#f0726a", + "danger-hover": "#f48a83", + "overlay": "$kt-black-a55", + "chip-default-bg": "$kt-white-a09", + "chip-default-fg": "$kt-white-a92", + "chip-gray-bg": "$kt-grayc-a18", + "chip-gray-fg": "$kt-gray-300", + "chip-orange-bg": "$kt-orange-a18", + "chip-orange-fg": "$kt-orange-300", + "chip-green-bg": "$kt-green-a18", + "chip-green-fg": "$kt-green-300", + "chip-blue-bg": "$kt-blue-a18", + "chip-blue-fg": "$kt-blue-300", + "chip-purple-bg": "$kt-purple-a18", + "chip-purple-fg": "$kt-purple-300", + "chip-red-bg": "$kt-red-a20", + "chip-red-fg": "$kt-red-300", + "status-ok-bg": "$kt-green-a18", + "status-ok-fg": "$kt-green-300", + "status-warn-bg": "$kt-orange-a18", + "status-warn-fg": "$kt-orange-300", + "status-risk-bg": "$kt-red-a20", + "status-risk-fg": "$kt-red-300", + "status-info-bg": "$kt-grayc-a18", + "status-info-fg": "$kt-gray-300", + "chart-blue": "$kt-chart-blue", + "chart-green": "$kt-chart-green", + "chart-orange": "$kt-chart-orange", + "chart-salmon": "$kt-chart-salmon", + "chart-pink": "$kt-chart-pink", + "chart-red": "$kt-chart-red", + "chart-bar-fill": "#2e2e31", + "shadow-sm": "0 1px 2px #00000052", + "shadow-md": "0 4px 16px #00000066", + "shadow-lg": "0 12px 40px #00000080", + "shadow-xl": "0 24px 80px #00000099" + } + } +} diff --git a/design-system/vibe-theme.css b/design-system/vibe-theme.css new file mode 100644 index 0000000..dbe6ddf --- /dev/null +++ b/design-system/vibe-theme.css @@ -0,0 +1,53 @@ +/* Vibe AI: Стандартный дизайн. Load AFTER the four base stylesheets. */ +:root, [data-theme] { + color-scheme: light; + --kt-ai-bg: #fafaf9; + --kt-ai-bg-soft: #fafaf9; + --kt-ai-bg-elevated: #ffffff; + --kt-ai-bg-sunken: #fafaf9; + --kt-ai-bg-glass: #ffffff; + --kt-ai-bg-hover: #c1e1f7; + --kt-ai-bg-active: #c1e1f7; + --kt-ai-fg: #0c0a09; + --kt-ai-fg-muted: #78716c; + --kt-ai-fg-faint: #78716c; + --kt-ai-fg-on-fill: #0c0a09; + --kt-ai-border: #e8e6e5; + --kt-ai-border-strong: #78716c; + --kt-ai-divider: #e8e6e5; + --kt-ai-card-bg: #ffffff; + --kt-ai-card-bg-glow: #ffffff; + --kt-ai-card-border: #e8e6e5; + --kt-ai-card-border-hover: #78716c; + --kt-ai-primary: #3ba6f1; + --kt-ai-primary-hover: #3ba6f1; + --kt-ai-primary-subtle: #c1e1f7; + --kt-ai-link: #0369a1; + --kt-ai-brand-blue: #3ba6f1; + --kt-ai-selection: #c1e1f7; + --kt-ai-focus-ring: #0369a1; + --kt-ai-focus-shadow: 0 0 0 3px #c1e1f7; + --kt-ai-chip-default-bg: #c1e1f7; + --kt-ai-chip-default-fg: #0c0a09; + --kt-ai-font-sans: Inter, system-ui, sans-serif; + --kt-ai-card-shadow: 0 2px 6px #0c0a0908; + --kt-ai-card-shadow-hover: 0 4px 12px #0c0a0910; + --vibe-accent: #3ba6f1; + --vibe-tint: #c1e1f7; + --vibe-heading-font: Inter, system-ui, sans-serif; + --vibe-heading-weight: 400; + --vibe-card-radius: 10px; + --vibe-button-radius: 999px; + --vibe-field-radius: 6px; +} + +body { background: var(--kt-ai-bg); color: var(--kt-ai-fg); font-family: var(--kt-ai-font-sans); } +h1, h2, .kt-ai-h1, .kt-ai-h2 { font-family: var(--vibe-heading-font); font-weight: var(--vibe-heading-weight); letter-spacing: -.035em; } +.kt-ai-hero h1 { font-size: clamp(36px, 5.5vw, 64px); line-height: 1.08; } +.kt-ai-section { padding-block: clamp(32px, 6vw, 64px); } +.kt-ai-pagehead, .kt-ai-cta, .kt-ai-pagefoot { background: var(--kt-ai-bg); color: var(--kt-ai-fg); } +.kt-ai-tile, .kt-ai-card { background: var(--kt-ai-card-bg); border: 1px solid var(--kt-ai-card-border); border-radius: var(--vibe-card-radius); box-shadow: var(--kt-ai-card-shadow); } +.kt-ai-btn, .kt-ai-btn[data-size] { border-radius: var(--vibe-button-radius); } +.kt-ai-input, .kt-ai-select, .kt-ai-textarea { border-radius: var(--vibe-field-radius); } +.vibe-highlight { background: var(--vibe-tint); color: var(--kt-ai-fg); border-radius: 4px; padding-inline: .12em; } +.vibe-accent { color: var(--vibe-accent); } diff --git a/design.md b/design.md new file mode 100644 index 0000000..e204c32 --- /dev/null +++ b/design.md @@ -0,0 +1,124 @@ + +# Дизайн проекта: Стандартный дизайн + +Спокойный светлый интерфейс по DESIGN-6 (Seline Analytics). Тёплый почти белый фон #fafaf9, белые поверхности, тонкая граница #e8e6e5. Основной текст #0c0a09, вторичный #78716c, голубой акцент #3ba6f1 и мягкая подсветка #c1e1f7. +Заголовки лёгкие (400), крупные, с плотным межбуквенным интервалом; тело 14–16px. Roobert заменён локальным Inter. Много воздуха, спокойная аналитика, тонкие графики, маленькие подписи. Кнопки-пилюли, карточки 10px (крупные блоки 16px), поля 6px. Допустима очень мягкая тень. Текст на голубой кнопке тёмный для читаемости. Подсвечивай отдельную фразу заголовка голубым фоном, без градиентов. Не копируй название, маскота или данные Seline. + + +## Как применять + +Стиль выбран пользователем при создании проекта и сохранён в `.vibe42-design.json`. Сохраняй его при дальнейших правках. Цвета, типографика и форма компонентов из этого документа имеют приоритет над оформлением в примерах KT AI и навыках. Оттуда бери структуру и поведение. + +В проекте уже есть локальные компоненты `kt-ai-*`, шрифт Inter и иконки. Их токены переопределены в `design-system/vibe-theme.css` под выбранный стиль. Подключай этот файл ПОСЛЕДНИМ после четырёх базовых CSS на каждой странице, включая приложения. Не удаляй его при переходе на React: скопируй design-system в public/ и сохрани все пять подключений. Используй `var(--kt-ai-…)` и `var(--vibe-…)`; не подключай сторонние CSS-фреймворки или удалённые шрифты. Логотип и название — проекта пользователя. Корпоративные логотипы из библиотеки не обязательны. Иконки бери из `design-system/icons/kt-ai-icons.js` и спрайта. + +Базовая тема — `light`. Не включай автоматическое переключение светлой/тёмной темы. Используй доступные системные/локальные замены шрифтов, указанные выше. Полный визуальный референс: `design-system/style-reference.md`; он описывает стиль, его бренд и примеры текста переносить не надо. При расхождениях (опечатки, контраст текста, коммерческие шрифты) следуй этому design.md. + +## Старт: `index.html` + +Правь существующий каркас под идею пользователя. + +```html + + + + + + +Название проекта + + + + + + + + + +
+
+ Название + + О нас + Оставить заявку +
+
+ +
+
+

Главное обещание в одну строку

+

Подзаголовок: кому это и почему стоит остаться.

+ +
+
+ +
+
+
+

Что вы получите

+

Одно-два предложения пояснения к секции.

+
+
+

Пункт первый

Коротко и по делу.

+

Пункт второй

Коротко и по делу.

+

Пункт третий

Коротко и по делу.

+
+
+
+ +
+
+

Призыв к действию

+

Город, адрес, часы работы — то, что нужно, чтобы дойти.

+ Написать +
+
+ +
+ © 2026 Название + + Контакты +
+ + + +``` + +## Блоки страницы (`kt-ai-page.css`) + +| Класс | Что это | +|-------|---------| +| `.kt-ai-wrap` | контейнер по центру (1080px). `data-width="narrow"` — 720px, `"wide"` — 1200px | +| `.kt-ai-pagehead` + `.kt-ai-pagehead-in` | липкая шапка страницы | +| `.kt-ai-hero`, `.kt-ai-hero-sub`, `.kt-ai-hero-actions` | первый экран. `data-align="center"` — по центру | +| `.kt-ai-section` + `.kt-ai-section-head` (h2 + p) | обычная секция. `data-divider="true"` — линия сверху | +| `.kt-ai-grid` + `.kt-ai-tile` (h3 + p) | сетка плиток «возможности». `data-cols="2"/"4"`, у плитки `data-span="2"/"full"` | +| `.kt-ai-tile-icon` | иконка над заголовком плитки — из спрайта ДС (см. «Иконки и логотипы» ниже) | +| `.kt-ai-cta` | финальный блок с призывом | +| `.kt-ai-pagefoot` | подвал | +| `.kt-ai-spacer` | распорка внутри шапки/подвала (толкает остальное вправо) | +| `.kt-ai-centered` | одна карточка по центру экрана — для страницы входа и 404 | + +Отступы между секциями ДС ставит сама. Адаптив (3→2→1 колонка) — тоже, `@media` писать не нужно. + +## Элементы (`kt-ai-components.css`) + +| Класс | Как применять | +|-------|---------------| +| `.kt-ai-btn` | кнопка / ссылка-кнопка. `data-variant="primary"` — главная, `"ghost"` — прозрачная, `"danger"` — опасная. `data-size="sm"/"lg"` | +| `.kt-ai-card` | карточка контента | +| `.kt-ai-chip` | статус-пилюля / тег | +| `.kt-ai-link` | текстовая ссылка | +| `.kt-ai-field` + `.kt-ai-input` / `.kt-ai-textarea` / `.kt-ai-select` | поле формы с подписью | + +**Один `primary` на экран.** Остальные кнопки — обычные или `ghost`. + + +## Проверка + +Проверь мобильный экран, читаемость, фокус клавиатуры и реальные действия кнопок. Коммить design-system/ и .vibe42-design.json вместе с проектом. Для бота, документа или скрипта без UI этот стиль не требует создания сайта. diff --git a/index.html b/index.html new file mode 100644 index 0000000..b9f076b --- /dev/null +++ b/index.html @@ -0,0 +1,42 @@ + + + +Заявление (об уголовном правонарушении) + + + + + + + +
+
+ Заявление (об уголовном правонарушении) — предпросмотр + +
+
+
+ Готовое заявление + Файл: zayavlenie.docx — скачать во вкладке «Файлы». Ниже — предпросмотр текста; в Word поля подписи пустые. +
+
+
Прокурору города Алматы
от АО «Казахтелеком»
от 25.09.2026
+

ЗАЯВЛЕНИЕ

(об уголовном правонарушении)

Специализированным межрайонным экономическим судом города Алматы по делу № 7527-23-00-2/5541 вынесено решение от 9 октября 2023 года, которым исковые требования Коммунального государственного учреждения «Управление государственных активов города Алматы» (далее — КГУ) к АО «Казахтелеком» (далее — Общество) удовлетворены в полном объёме. Указанным судебным актом на Общество возложена обязанность возвратить КГУ по акту приёма-передачи 21 объект кабельной канализации общей протяжённостью труб 122 577,66 метра с приложением технической документации. Решение вступило в законную силу 17 января 2024 года на основании постановления Алматинского городского суда.

АО «Казахтелеком» сообщает об обстоятельствах, которые могут свидетельствовать о наличии признаков уголовно наказуемых деяний при строительстве и вводе в эксплуатацию объектов, построенных за счёт бюджетных средств, а именно: об отсутствии фактически объектов, построенных за счёт бюджетных средств и принятых по документам, что свидетельствует о возможных признаках хищения либо злоупотребления полномочиями при строительстве и вводе объектов в эксплуатацию.

I. Обстоятельства дела

1. Фактическое отсутствие части объектов. Во исполнение вступившего в законную силу судебного решения Обществом совместно с ТОО «Предприятие капитального строительства» акимата города Алматы (далее — ПКС) проведены выездные обследования и инвентаризация объектов. По результатам инвентаризации от 17 декабря 2024 года установлено:

1) фактически существуют 14 из 21 объекта кабельной канализации;

2) 4 объекта являются воздушными линиями связи и их комплектующими, то есть не относятся к объектам кабельной канализации;

3) 3 объекта не обнаружены, не построены, не введены в эксплуатацию, техническая документация на них отсутствует.

Таким образом, фактически отсутствуют 7 объектов, тогда как судебным решением предусмотрена передача исключительно объектов кабельной канализации, а не воздушных линий связи.

2. История формирования спорного имущества. В период с 2014 по 2022 годы КГУ «Управление городской мобильности» (ранее — Управление автомобильных дорог) осуществляло строительство и реконструкцию автомобильных дорог и транспортных развязок на территории города Алматы. В местах прохождения инженерных коммуникаций выполнялся вынос линий связи АО «Казахтелеком» по выданным Обществом техническим условиям. После завершения дорожных работ Управлением мобильности осуществлялось строительство кабельной канализации для прокладки линий связи. Построенное имущество поэтапно передавалось в коммунальную собственность города Алматы на основании постановлений акимата города Алматы (2014–2022 годы), после чего 21 объект линий связи и кабельной канализации был безвозмездно передан АО «Казахтелеком» (ДЭСД «Алматытелеком») в качестве вклада в уставный капитал, то есть фактически возвращён Обществу после строительства и реконструкции.

3. Изменение правового режима имущества и судебные споры. Постановлением акимата города Алматы от 9 ноября 2022 года № 4/586 положения о передаче 22 объектов кабельной канализации в собственность АО «Казахтелеком» были исключены. После этого КГУ потребовало возврата имущества в коммунальную собственность. Обществом предпринимались попытки судебного оспаривания указанного постановления, однако иск в Специализированный административный суд города Алматы был оставлен без удовлетворения по формальным основаниям (пропуск срока обращения) несмотря на то, что с текстом постановления Общество было ознакомлено позднее. В дальнейшем КГУ обратилось в Специализированный межрайонный экономический суд города Алматы с иском о возврате сетей, который был удовлетворён, несмотря на доводы Общества об отсутствии части объектов и несоответствии части имущества предмету иска.

4. Бездействие КГУ и риски принудительного исполнения. После проведения инвентаризации Общество неоднократно инициировало рабочие встречи с представителями КГУ и ПКС, в том числе с участием заместителей акима города Алматы. Протокольно поручалось оформить акты отсутствия по 3 объектам и рассмотреть возможность принятия на баланс ПКС 4 воздушных линий связи. Однако данные поручения фактически исполнены не были.

Вместо урегулирования ситуации 15 декабря 2025 года АО «Казахтелеком» было включено в реестр должников в связи с неисполнением судебного решения. Впоследствии путём переговоров включение в реестр было отменено, однако КГУ продолжает требовать передачи 21 объекта кабельной канализации, несмотря на фактическое наличие лишь 14.

Возобновление исполнительного производства повлечёт включение Общества в реестр должников, возможный арест счетов и иные меры принудительного исполнения, что приведёт к блокированию участия в государственных закупках и парализации финансово-хозяйственной деятельности Национальной компании — субъекта критически важных объектов информационно-коммуникационной инфраструктуры Республики Казахстан и последующей невозможности сопровождения и обслуживания СОРМ, что может привести к возникновению угрозы национальной безопасности Республики Казахстан.

II. Признаки уголовно наказуемых деяний

Фактическое отсутствие объектов, построенных за счёт бюджетных средств и принятых по документам, в совокупности с установленными обстоятельствами свидетельствует о наличии возможных признаков хищения имущества, а также злоупотребления должностными полномочиями при строительстве и вводе объектов в эксплуатацию.

В настоящее время Обществом проводится служебное расследование по указанным фактам.

III. Просительная часть

На основании изложенного, руководствуясь статьями 180, 181 Уголовно-процессуального кодекса Республики Казахстан, а также в целях сохранения объектов критической телекоммуникационной инфраструктуры, прошу:

1) содействовать приостановлению исполнительных действий, связанных с передачей объектов кабельной канализации, до установления судьбы фактически отсутствующих объектов;

2) принять меры по недопущению нарушения прав и законных интересов АО «Казахтелеком» как национальной компании — субъекта квазигосударственного сектора;

3) принять меры реагирования в пределах прокурорского надзора по недопущению передачи объектов критической телекоммуникационной инфраструктуры лицам, не обладающим необходимыми полномочиями и ресурсами;

4) содействовать восстановлению нарушенных прав АО «Казахтелеком», в том числе путём принятия мер, направленных на подтверждение права Общества на объекты кабельной канализации и недопущение их передачи третьим лицам в рамках исполнения решения суда по существу отсутствующему имуществу;

5) зарегистрировать настоящее заявление в Едином реестре досудебных расследований;

6) в случае выявления признаков уголовно наказуемого деяния — принять меры по возбуждению уголовного дела и проведению досудебного расследования.

Приложения (на копиях документов, удостоверяющих изложенные обстоятельства):

1) письмо ТОО «Предприятие капитального строительства» акимата города Алматы — на 2 листах;

2) письмо КГУ «Управление государственных активов города Алматы» — на 1 листе;

3) протокол личного приёма граждан заместителя акима города Алматы — на 1 листе;

4) письмо КГУ «Управление государственных активов города Алматы» — на 2 листах;

5) протокол сверки 21 объекта — на 7 листах;

6) решение Специализированного межрайонного экономического суда города Алматы от 9.10.2023 — на 10 листах.

+

Представители по доверенности:

Сайханова Назира Сағатбековна,
тел.: +7 707 806 38 07,
эл. почта: saikhanova.n@telecom.kz

Сайханова Н.С.

Байгелова Индира Булуткызы,
тел.: +7 771 400 53 27 (WhatsApp),
эл. почта: baigelova.i@telecom.kz

+
+ diff --git a/make_doc.py b/make_doc.py new file mode 100644 index 0000000..340fe0e --- /dev/null +++ b/make_doc.py @@ -0,0 +1,261 @@ +# -*- coding: utf-8 -*- +"""Генерация заявления в прокуратуру (docx) и предпросмотра (preview.html).""" +from docx import Document +from docx.shared import Pt, Cm +from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_TAB_ALIGNMENT +from docx.enum.table import WD_ALIGN_VERTICAL +from docx.oxml.ns import qn +import html as _html + +FONT = "Times New Roman" +SZ = pt = Pt(12) +RIGHT_TAB = Cm(16.5) + + +def set_font(run, name=FONT, size=SZ, bold=False): + run.font.name = name + run.font.size = size + run.font.bold = bold + rPr = run._element.get_or_add_rPr() + rFonts = rPr.find(qn("w:rFonts")) + if rFonts is None: + rFonts = rPr.makeelement(qn("w:rFonts"), {}) + rPr.append(rFonts) + rFonts.set(qn("w:ascii"), name) + rFonts.set(qn("w:hAnsi"), name) + rFonts.set(qn("w:cs"), name) + + +def base_para(doc, spacing_after=5, first_line=None, align=None): + p = doc.add_paragraph() + pf = p.paragraph_format + pf.space_after = Pt(spacing_after) + pf.space_before = Pt(0) + pf.line_spacing = 1.15 + if first_line is not None: + pf.first_line_indent = Cm(1.25) + if align is not None: + pf.alignment = align + return p + + +def text_para(doc, text, bold=False, first_line=True, spacing_after=5): + p = base_para(doc, spacing_after, first_line) + r = p.add_run(text) + set_font(r, bold=bold) + return p + + +def header_block(doc): + # строка 1: получатель справа + p = doc.add_paragraph() + p.paragraph_format.tab_stops.add_tab_stop(RIGHT_TAB, WD_TAB_ALIGNMENT.RIGHT) + r = p.add_run("\tПрокурору города Алматы") + set_font(r) + # строка 2: от кого (две строки) + p = doc.add_paragraph() + p.paragraph_format.tab_stops.add_tab_stop(RIGHT_TAB, WD_TAB_ALIGNMENT.RIGHT) + r = p.add_run("\tот АО «Казахтелеком»") + set_font(r) + p = doc.add_paragraph() + p.paragraph_format.tab_stops.add_tab_stop(RIGHT_TAB, WD_TAB_ALIGNMENT.RIGHT) + r = p.add_run("\tот 25.09.2026") + set_font(r) + + +def signatory_lines(doc): + """Сайханова — подпись; Байгелова — без подписи.""" + data = [ + ("Представители по доверенности: ", [ + ("Сайханова Назира Сағатбековна,", False), + ("тел.: +7 707 806 38 07,", False), + ("эл. почта: saikhanova.n@telecom.kz", False), + ("Сайханова Н.С.", True), + ]), + ("", [ + ("Байгелова Индира Булуткызы,", False), + ("тел.: +7 771 400 53 27 (WhatsApp),", False), + ("эл. почта: baigelova.i@telecom.kz", False), + ]), + ] + for first, lines in data: + for i, (line, bold) in enumerate(lines): + p = doc.add_paragraph() + p.paragraph_format.space_after = Pt(0 if i < len(lines) - 1 else 6) + p.paragraph_format.space_before = Pt(0) + p.paragraph_format.line_spacing = 1.15 + if first and i == 0: + r0 = p.add_run(first) + set_font(r0) + r = p.add_run(line) + set_font(r, bold=bold) + + +BODY = [ + ("center", "ЗАЯВЛЕНИЕ"), + ("center", "(об уголовном правонарушении)"), + + ("text", "Специализированным межрайонным экономическим судом города Алматы по делу № 7527-23-00-2/5541 вынесено решение от 9 октября 2023 года, которым исковые требования Коммунального государственного учреждения «Управление государственных активов города Алматы» (далее — КГУ) к АО «Казахтелеком» (далее — Общество) удовлетворены в полном объёме. Указанным судебным актом на Общество возложена обязанность возвратить КГУ по акту приёма-передачи 21 объект кабельной канализации общей протяжённостью труб 122 577,66 метра с приложением технической документации. Решение вступило в законную силу 17 января 2024 года на основании постановления Алматинского городского суда."), + + ("text", "АО «Казахтелеком» сообщает об обстоятельствах, которые могут свидетельствовать о наличии признаков уголовно наказуемых деяний при строительстве и вводе в эксплуатацию объектов, построенных за счёт бюджетных средств, а именно: об отсутствии фактически объектов, построенных за счёт бюджетных средств и принятых по документам, что свидетельствует о возможных признаках хищения либо злоупотребления полномочиями при строительстве и вводе объектов в эксплуатацию."), + + ("h", "I. Обстоятельства дела"), + + ("text", "1. Фактическое отсутствие части объектов. Во исполнение вступившего в законную силу судебного решения Обществом совместно с ТОО «Предприятие капитального строительства» акимата города Алматы (далее — ПКС) проведены выездные обследования и инвентаризация объектов. По результатам инвентаризации от 17 декабря 2024 года установлено:"), + ("text", "1) фактически существуют 14 из 21 объекта кабельной канализации;", True), + ("text", "2) 4 объекта являются воздушными линиями связи и их комплектующими, то есть не относятся к объектам кабельной канализации;", True), + ("text", "3) 3 объекта не обнаружены, не построены, не введены в эксплуатацию, техническая документация на них отсутствует.", True), + ("text", "Таким образом, фактически отсутствуют 7 объектов, тогда как судебным решением предусмотрена передача исключительно объектов кабельной канализации, а не воздушных линий связи."), + + ("text", "2. История формирования спорного имущества. В период с 2014 по 2022 годы КГУ «Управление городской мобильности» (ранее — Управление автомобильных дорог) осуществляло строительство и реконструкцию автомобильных дорог и транспортных развязок на территории города Алматы. В местах прохождения инженерных коммуникаций выполнялся вынос линий связи АО «Казахтелеком» по выданным Обществом техническим условиям. После завершения дорожных работ Управлением мобильности осуществлялось строительство кабельной канализации для прокладки линий связи. Построенное имущество поэтапно передавалось в коммунальную собственность города Алматы на основании постановлений акимата города Алматы (2014–2022 годы), после чего 21 объект линий связи и кабельной канализации был безвозмездно передан АО «Казахтелеком» (ДЭСД «Алматытелеком») в качестве вклада в уставный капитал, то есть фактически возвращён Обществу после строительства и реконструкции."), + + ("text", "3. Изменение правового режима имущества и судебные споры. Постановлением акимата города Алматы от 9 ноября 2022 года № 4/586 положения о передаче 22 объектов кабельной канализации в собственность АО «Казахтелеком» были исключены. После этого КГУ потребовало возврата имущества в коммунальную собственность. Обществом предпринимались попытки судебного оспаривания указанного постановления, однако иск в Специализированный административный суд города Алматы был оставлен без удовлетворения по формальным основаниям (пропуск срока обращения) несмотря на то, что с текстом постановления Общество было ознакомлено позднее. В дальнейшем КГУ обратилось в Специализированный межрайонный экономический суд города Алматы с иском о возврате сетей, который был удовлетворён, несмотря на доводы Общества об отсутствии части объектов и несоответствии части имущества предмету иска."), + + ("text", "4. Бездействие КГУ и риски принудительного исполнения. После проведения инвентаризации Общество неоднократно инициировало рабочие встречи с представителями КГУ и ПКС, в том числе с участием заместителей акима города Алматы. Протокольно поручалось оформить акты отсутствия по 3 объектам и рассмотреть возможность принятия на баланс ПКС 4 воздушных линий связи. Однако данные поручения фактически исполнены не были."), + ("text", "Вместо урегулирования ситуации 15 декабря 2025 года АО «Казахтелеком» было включено в реестр должников в связи с неисполнением судебного решения. Впоследствии путём переговоров включение в реестр было отменено, однако КГУ продолжает требовать передачи 21 объекта кабельной канализации, несмотря на фактическое наличие лишь 14."), + ("text", "Возобновление исполнительного производства повлечёт включение Общества в реестр должников, возможный арест счетов и иные меры принудительного исполнения, что приведёт к блокированию участия в государственных закупках и парализации финансово-хозяйственной деятельности Национальной компании — субъекта критически важных объектов информационно-коммуникационной инфраструктуры Республики Казахстан и последующей невозможности сопровождения и обслуживания СОРМ, что может привести к возникновению угрозы национальной безопасности Республики Казахстан."), + + ("h", "II. Признаки уголовно наказуемых деяний"), + + ("text", "Фактическое отсутствие объектов, построенных за счёт бюджетных средств и принятых по документам, в совокупности с установленными обстоятельствами свидетельствует о наличии возможных признаков хищения имущества, а также злоупотребления должностными полномочиями при строительстве и вводе объектов в эксплуатацию."), + ("text", "В настоящее время Обществом проводится служебное расследование по указанным фактам."), + + ("h", "III. Просительная часть"), + + ("text", "На основании изложенного, руководствуясь статьями 180, 181 Уголовно-процессуального кодекса Республики Казахстан, а также в целях сохранения объектов критической телекоммуникационной инфраструктуры, прошу:"), + ("text", "1) содействовать приостановлению исполнительных действий, связанных с передачей объектов кабельной канализации, до установления судьбы фактически отсутствующих объектов;", True), + ("text", "2) принять меры по недопущению нарушения прав и законных интересов АО «Казахтелеком» как национальной компании — субъекта квазигосударственного сектора;", True), + ("text", "3) принять меры реагирования в пределах прокурорского надзора по недопущению передачи объектов критической телекоммуникационной инфраструктуры лицам, не обладающим необходимыми полномочиями и ресурсами;", True), + ("text", "4) содействовать восстановлению нарушенных прав АО «Казахтелеком», в том числе путём принятия мер, направленных на подтверждение права Общества на объекты кабельной канализации и недопущение их передачи третьим лицам в рамках исполнения решения суда по существу отсутствующему имуществу;", True), + ("text", "5) зарегистрировать настоящее заявление в Едином реестре досудебных расследований;", True), + ("text", "6) в случае выявления признаков уголовно наказуемого деяния — принять меры по возбуждению уголовного дела и проведению досудебного расследования.", True), + + ("text", "Приложения (на копиях документов, удостоверяющих изложенные обстоятельства):",), + ("text", "1) письмо ТОО «Предприятие капитального строительства» акимата города Алматы — на 2 листах;", True), + ("text", "2) письмо КГУ «Управление государственных активов города Алматы» — на 1 листе;", True), + ("text", "3) протокол личного приёма граждан заместителя акима города Алматы — на 1 листе;", True), + ("text", "4) письмо КГУ «Управление государственных активов города Алматы» — на 2 листах;", True), + ("text", "5) протокол сверки 21 объекта — на 7 листах;", True), + ("text", "6) решение Специализированного межрайонного экономического суда города Алматы от 9.10.2023 — на 10 листах.", True), +] + + +def build_docx(path): + doc = Document() + for section in doc.sections: + section.left_margin = Cm(3) + section.right_margin = Cm(1.5) + section.top_margin = Cm(2) + section.bottom_margin = Cm(2) + + # базовый стиль + st = doc.styles["Normal"] + st.font.name = FONT + st.font.size = SZ + st.font.bold = False + rPr = st.element.get_or_add_rPr() + rFonts = rPr.find(qn("w:rFonts")) + if rFonts is None: + rFonts = rPr.makeelement(qn("w:rFonts"), {}) + rPr.append(rFonts) + rFonts.set(qn("w:ascii"), FONT) + rFonts.set(qn("w:hAnsi"), FONT) + + header_block(doc) + + p = doc.add_paragraph() + p.paragraph_format.space_after = Pt(4) + + for kind, text, *rest in BODY: + bold = rest[0] if rest and isinstance(rest[0], bool) else False + if kind == "center": + p = base_para(doc, 2, None, WD_ALIGN_PARAGRAPH.CENTER) + r = p.add_run(text) + set_font(r, bold=True) + elif kind == "h": + p = base_para(doc, 5) + r = p.add_run(text) + set_font(r, bold=True) + else: + p = base_para(doc, 5) + r = p.add_run(text) + set_font(r) + + p = doc.add_paragraph() + p.paragraph_format.space_after = Pt(2) + + signatory_lines(doc) + + doc.save(path) + + +def build_preview(path): + title = "ЗАЯВЛЕНИЕ (об уголовном правонарушении)" + body_html = [] + for kind, text, *rest in BODY: + bold = rest[0] if rest and isinstance(rest[0], bool) else False + esc = _html.escape(text) + if kind == "center": + body_html.append(f'

{esc}

') + elif kind == "h": + body_html.append(f'

{esc}

') + else: + cls = "item" if bold else "t" + body_html.append(f'

{esc}

') + + sign = "

Представители по доверенности:

" + sign += "

Сайханова Назира Сағатбековна,
тел.: +7 707 806 38 07,
эл. почта: saikhanova.n@telecom.kz

" + sign += "

Сайханова Н.С.

" + sign += "

Байгелова Индира Булуткызы,
тел.: +7 771 400 53 27 (WhatsApp),
эл. почта: baigelova.i@telecom.kz

" + + page = f""" + + +Заявление (об уголовном правонарушении) + + + + + + + +
+
+ Заявление (об уголовном правонарушении) — предпросмотр + +
+
+
+ Готовое заявление + Файл: zayavlenie.docx — скачать во вкладке «Файлы». Ниже — предпросмотр текста; в Word поля подписи пустые. +
+
+
Прокурору города Алматы
от АО «Казахтелеком»
от 25.09.2026
+ {''.join(body_html)} +
{sign}
+
+ +""" + with open(path, "w", encoding="utf-8") as f: + f.write(page) + + +if __name__ == "__main__": + build_docx("zayavlenie.docx") + build_preview("index.html") + print("OK: zayavlenie.docx + index.html") diff --git a/zayavlenie.docx b/zayavlenie.docx new file mode 100644 index 0000000000000000000000000000000000000000..425c53e3fecba45b81a08e0d6a406415689decf9 GIT binary patch literal 40876 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 r#J_swn(#u!qxyq?@banu8e-SILk$&7