OwlMeans можно получить уже сегодня — одна команда, любой агент

Опубликовано  · Igor Tkachenko

Основатель за ярко освещённым столом рядом с большой рогатой совой; единственная строка в терминале гласит create @owlmeans/app, а от неё вспыхивают три соединённые панели с подписями COMMON, API, WEB и мелкими тегами ENTRYPOINTS, SHADCN UI, RESOURCES, SKILLS

Люди всё время спрашивают меня, когда они смогут воспользоваться OwlMeans. Честный ответ до сих пор звучал так: когда запустится Платформа. Теперь есть получше — самой важной частью можно воспользоваться уже сегодня, на агенте, которому ты уже доверяешь.

OwlMeans — это пайплайн разработки на основе AI. Ты описываешь, чего хочешь, в форме пользовательских историй, а команда специализированных ролей AI превращает их в полноценные приложения на TypeScript, которые по-настоящему принадлежат тебе. Под каждым из этих приложений лежит одна библиотека — OwlMeans Common — то, из чего собраны все наши проекты. На этой неделе она получила пакет create-app. Одна команда разворачивает целостный фулстек-проект, который Claude Code или GitHub Copilot способен развивать от начала до конца, со всеми инструкциями для агента уже в комплекте.

Хочу провести тебя через то, что даёт эта команда, почему она построена именно так и как пройти путь от пустой папки до настоящей функции на базе данных, не написав собственноручно ни единой строки обвязки.

Одна команда

Выбери свой менеджер пакетов:

bun create @owlmeans/app my-app
# или
npm create @owlmeans/app@latest my-app
# или
npx @owlmeans/create-app my-app

А потом:

cd my-app
bun run dev          # API на :3000, web на :3001

Открой веб-приложение, перейди на экран Сессии, добавь и убери несколько элементов. Это рабочее фулстек-приложение: типизированный общий контракт, бэкенд и фронтенд на shadcn UI, которые разговаривают друг с другом. Никакой базы, которую нужно поднимать, никакой аутентификации, которую нужно настраивать, никакого boilerplate, который пришлось бы копировать из туториала.

Ты получаешь небольшое монорепо с тремя воркспейсами:

  • common — общий контракт: entrypoint’ы маршрутов, схемы валидации и типы, которые используют обе стороны.
  • api — бэкенд на @owlmeans/server-app, держащий демоданные в ресурсе в памяти.
  • web — фронтенд на @owlmeans/web-panel, с навигацией shadcn, макетом и экранами.

Эта структура — не игрушка. Это та же форма, что и у наших настоящих приложений, сведённая к самой сути. Когда ты перерастёшь хранилище в памяти, ты подменяешь один пакет — ниже покажу это в подробностях.

Почему это построено так, чтобы агенты не терялись

Вот неудобная правда о кодинг-агентах в 2026 году. У них нет стажа. Каждая сессия начинается с чистого листа, и каждый вызов платит полную цену за всё, что твой код не сделал явным. Цифры жёсткие: на среднем по размеру коде фаза разведки — когда агент читает файлы просто чтобы понять, где что лежит — способна съесть «60–70% всех входных токенов», а одна задача может прогнать через модель сотни тысяч, а то и миллионы суммарных токенов. Агент умён. Агент также «стартует с чистого листа, кроме того, что ты явно подаёшь в его окно контекста».

Так что вопрос, сформировавший OwlMeans Common, был простым: как выглядит код, спроектированный так, чтобы его читал тот, кто между сессиями забывает всё?

Ответ оказался тем же, чего опытные инженеры хотели всегда. Отрасль пришла к этому независимо в этом году — «код должен быть простым, явным и скучным… чтобы у AI не оставалось решений для принятия», а агенты «мучаются с неявным поведением и хитрыми абстракциями». Это ровно то ограничение, под которым мы строили:

  • Никаких сложных схем DI. Сервисы — это обычные фабричные функции на TypeScript, зарегистрированные по строковому алиасу и получаемые через context.service('alias'). Никаких декораторов, никаких метаданных, никакой магии контейнера, которую пришлось бы раскручивать обратно.
  • Никакого сгенерированного кода. Никакого шага OpenAPI-в-клиент, никакого codegen’а схем, никакого артефакта сборки, который нужно держать в согласии с реальностью. Что читаешь, то и работает.
  • Никакого YAML, никакого разлива конфигов. Конфигурация — это TypeScript. Маршруты и конфиг — это обычные объекты.
  • Всё явное и прослеживаемое. Каждый сервис, каждый маршрут, каждый ресурс можно найти, просто поискав его. Человек способен проследить это. Агент тоже — не сжигая тысячу токенов на догадки.

Последний пункт — это вся игра. Явный, скучный код дешевле для работы агента, и именно это разница между ассистентом, который уверенно правит нужный файл, и тем, что мечется по сорока.

Иллюстрация, разделённая пополам: слева — тёмный запутанный лабиринт декораторов, файлов YAML и сгенерированного кода с маленькой растерянной совой; справа — чистая индиговая сетка подписанных блоков обычного TypeScript, через которую сова проходит напрямик

Четыре идеи, что облегчают агенту работу

Четыре проектных решения делают бо́льшую часть работы. Запоминать их необязательно — но стоит увидеть один раз, потому что именно благодаря им запрос к Claude Code ложится чисто, а не расползается.

Инъекция контекста. Контекст приложения держит твои сервисы и ресурсы и передаётся сверху вниз. Сервис ты регистрируешь как фабричное замыкание и достаёшь по алиасу. Ничего не спрятано: вся обвязка — это обычный код, который агент прочитывает за один проход.

Entrypoint’ы как универсальный фулстек-протокол. Это краеугольный камень. Entrypoint — это единица URL: алиас, путь, метод и встроенная схема валидации — объявленная один раз в common:

entrypoint(
  route(session.add, '/:sid/items', { parent: session.base, method: RouteMethod.POST }),
  filter(params(SessionParamsSchema), body(AddItemSchema)),
)

Бэкенд elevate’ит тот же entrypoint обработчиком. Фронтенд elevate’ит его экраном и вызывает через ctx.entrypoint(session.add).call({ params, body }). Одно объявление является единственным источником правды для маршрута, валидации и типов с обеих сторон. Меняешь его раз — и весь стек остаётся синхронным. Нет отдельной спецификации API, нет сгенерированного клиента, который мог бы разойтись с реальностью. Для агента это означает, что новая функция имеет очевидную, повторяемую форму: объяви, реализуй, вызови.

Унифицированные ресурсы. Каждое хранилище данных — в памяти, MongoDB, Redis, объектное хранилище — реализует один и тот же интерфейс Resource<T>: get, list, create, update, delete и несколько родственных. Код твоего обработчика не меняется, когда меняется хранилище. Подмена демонстрационного хранилища в памяти на настоящую базу — это, почти буквально, замена одного пакета.

shadcn UI, который принадлежит тебе. Веб-слой стоит на shadcn и Tailwind v4, а компоненты живут в твоём дереве исходников — не за зависимостью. Это намеренно. shadcn «не библиотека, которую ты устанавливаешь, — это генератор кода… он твой», и он стал библиотекой компонентов, к которой тянется каждый AI-инструмент для кодинга. Агент читает твой UI как настоящий, редактируемый React — тот же код, который он уже знает, — вместо того чтобы ковыряться в непрозрачном пакете.

Полностью оснащён навыками с первого дня

Вот часть, которой я горжусь больше всего. Проект приходит, уже зная, как его развивать.

Каждый пакет @owlmeans/* поставляет собственные инструкции для агента — навыки Claude Code и инструкции GitHub Copilot, согласованные по версии с пакетом. Когда create-app заканчивает ставить каркас, он разворачивает эти инструкции в проекте: навыки ложатся в .claude/skills/, инструкции — в .github/instructions/. Он также пишет CLAUDE.md и .github/copilot-instructions.md с директивами памяти, а вдобавок — стартовые индексы памяти, которые оба агента читают в начале каждой сессии.

Так что когда ты открываешь проект и просишь Claude Code тронуть слой ресурсов, ему не нужно сперва выяснять, как работают ресурсы OwlMeans — навык mongo-resource уже на месте. Когда он добавляет маршрут, навык entrypoint уже на месте. В CLAUDE.md даже встроено правило reuse-code, которое велит агенту сперва поискать существующий пакет @owlmeans/*, прежде чем выдумывать собственное решение. Впервые открыв проект, агент спросит тебя, для чего он, и запишет твой ответ в оба файла контекста, чтобы больше никогда не спрашивать.

Ничего из этого ты не писал. Ты не сшивал никакой обвязки. Навыки, память и конвенции пришли вместе с командой. Вот что на самом деле означает на практике «самодостаточный, полностью оснащённый навыками» — и это та же машинерия, на которую опирается наша Платформа, поданная тебе напрямую.

Открытая папка проекта, показанная как светящиеся подписанные карточки — CLAUDE.md, .claude/skills, .github/instructions, MEMORY.md — соединённые тонкими световыми нитями со знаком Claude Code и Copilot, а сова одобрительно наблюдает

Пошагово: от каркаса до настоящей функции

Сделаем это предметно. Скажем, ты хочешь превратить демонстрационное хранилище в памяти в настоящую, устойчивую функцию на базе MongoDB. Ты не открываешь документацию и не берёшься сшивать драйверы. Ты ставишь каркас, а потом просишь.

Сперва поставь каркас и запусти его (подойдёт любой менеджер):

bun create @owlmeans/app my-app     # или: npm create @owlmeans/app@latest my-app
cd my-app
bun run dev

Потом в Claude Code (или Copilot) начни с запроса в таком духе:

Добавь устойчивую функцию заметок на базе MongoDB. Используй @owlmeans/mongo и @owlmeans/mongo-resource вместо статического ресурса в памяти. Объяви entrypoint’ы и схему в sources/common, зарегистрируй ресурс и реализуй обработчики в sources/api, а в sources/web добавь экран. Переиспользуй существующие пакеты @owlmeans/* — держись навыка reuse-code.

Этот запрос работает без вождения за руку, и стоит понимать почему. Проект уже несёт навыки ровно для этого. Агент знает, что подмена ресурса — один к одному, потому что каждый ресурс реализует один и тот же интерфейс: обработчик, который делал context.getStaticResource(...), становится context.resource(...) над коллекцией Mongo, а вызовы create/list/delete идентичны:

const notes = context.resource<NotesResource>(RES_NOTES)
await notes.create({ id, text, createdAt })
const { items } = await notes.list({ criteria: { ... } })

Он знает, что паттерн entrypoint остаётся тем же — объяви в common, elevate’ни обработчиком в api, elevate’ни экраном в web. И знает, что твой UI — это shadcn, который он может править напрямую. Поскольку структура явная, а инструкции едут вместе с репозиторием, агент тратит токены на постройку твоей функции, а не на переучивание фреймворка каждую сессию. Когда позже ты обновляешь пакеты @owlmeans/*, ты заново запускаешь npx @owlmeans/agent-skills, и инструкции обновляются вместе с ними.

Почему это начало, а не вся история

Скажу прямо, чем это является, а чем нет.

create-app — это библиотека и инструкции для агента, поданные тебе, чтобы ты сам рулил этим с Claude Code или Copilot. Это по-настоящему мощно, и для многих проектов этого вполне достаточно. Платформа OwlMeans — полный пайплайн специализированных ролей AI, который превращает пользовательские истории в готовое, твоё программное обеспечение — это слой сверху, построенный вокруг этой самой библиотеки. Именно поэтому она способна делать то, что делает, за долю стоимости: она не исследует каждую сессию чужой код и не платит налог на разведку, а оперирует фреймворком, спроектированным с самых основ так, чтобы быть явным, повторяемым и дешёвым для осмысления. Наша цель — чтобы Платформа строила эти проекты примерно вдесятеро меньшим числом токенов, чем неукротимый кодинг-агент, продирающийся через незнакомое репо.

Но ждать этого необязательно. Фундамент, на котором стоит Платформа, можно доставлять уже сегодня — одной командой, на агенте, за которого ты и так уже платишь. Запусти create-app, наведи на него Claude Code — и ты получишь настоящий вкус того, как строят по-owlmeans’овски: типизированно, явно, полностью оснащённо навыками и навсегда твоё.

Это и есть идея команды-вокруг-агента, уменьшенная настолько, чтобы поместиться в твоём терминале прямо сейчас.