惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Martin Fowler
Martin Fowler
The Cloudflare Blog
The Register - Security
The Register - Security
WordPress大学
WordPress大学
量子位
Vercel News
Vercel News
C
Check Point Blog
V
Visual Studio Blog
Microsoft Azure Blog
Microsoft Azure Blog
J
Java Code Geeks
B
Blog RSS Feed
Stack Overflow Blog
Stack Overflow Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
PCI Perspectives
PCI Perspectives
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
Schneier on Security
Schneier on Security
O
OpenAI News
M
MIT News - Artificial intelligence
S
Secure Thoughts
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Application and Cybersecurity Blog
Application and Cybersecurity Blog
S
Security Affairs
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
小众软件
小众软件
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
N
News and Events Feed by Topic
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
Recorded Future
Recorded Future
S
Security @ Cisco Blogs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Cyber Attacks, Cyber Crime and Cyber Security
GbyAI
GbyAI
L
LINUX DO - 最新话题
The Last Watchdog
The Last Watchdog
C
CERT Recently Published Vulnerability Notes
aimingoo的专栏
aimingoo的专栏
V
V2EX
博客园 - 【当耐特】
Last Week in AI
Last Week in AI
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Синхронизируем проекты Codex и Claude Code между несколькими устройствами через GitHub (для неинженерных проектов!)
Тимур Тукаев · 2026-05-31 · via Все публикации подряд на Хабре

Средний

9 мин

7.9K

У меня MacBook Air M4, ПК под Ubuntu 24.04, консальные Claude Code и Codex (каждый хорош немного под свои задачи, как по мне). Я люблю Ubuntu, но вот в поездках Mac прям незаменим — с ним удобно работать, батарея живет достаточно долго, даже в самолете можно комфортно что-то тыкать тачпадом. При этом яблочную экосистему я не люблю, Ubuntu мне ближе и приятнее в использовании. Важный момент: я не программист, так что большая часть моих проектов — это всякая маркетинговая, менеджерская и редакторская штукенция. Поэтому у меня нет под это всё каких-то IDE и т.п. Конечно, разработчики и другие инженеры обычно работают с кодом, а потому просто коммият всё напрямую в гитхаб.

Но к делу. У меня постоянно запущено по 6-10 окон Claude и Codex в терминале и я заколебался проекты синхронизировать через Избранное телеграма — зипами. Плюс хочется, чтобы проекты нормально работали и в той, и в другой нейронке. То есть мне понадобилась какая-то система синхнонизации проектов между разными устройствами и разными нейронками.

Сегодня наконец собрался с силами и доделал такую — выложил ее под Apache 2.0 на гитхабе, можно пользоваться, форкать, дорабатывать и выражать своё «фи» в ишшьюсах и комментариях. Наверянка уже кто-то что-то такое себе делал и я просто изобретаю велосипед. Но что ж теперь поделать, я его уже переизобрел.

В статье расскажу, как делал, что делал, где и что пришлось дотюнивать. Скажу честно, мне эту часть с инструкцией писать было лень и она написана уже GPT, так что простите. Немного пробегусь по стилистике, конечно, но в целом текст править почти не буду.

AI Workspace System: единое рабочее место для Codex и Claude Code

У меня постепенно накопилась типичная проблема человека, который много работает с AI-агентами локально. Есть проекты Codex, проекты Claude Code, обычные репозитории, черновики, пайплайны, инструкции, скиллы, локальные артефакты и несколько машин. В какой-то момент становится непонятно, где актуальная версия проекта, какие файлы можно пушить, где живут инструкции для агента, а где уже опасная смесь из исходников, логов и промежуточных результатов.

Так появился AI Workspace System: набор shell-скриптов, соглашений и Markdown-документации, который приводит локальную работу с AI-агентами к одному предсказуемому формату. Это не IDE и не оркестратор агентов, а тонкий слой инфраструктуры вокруг Git, GitHub, Codex и Claude Code.

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

Что умеет проект

Проект решает несколько практических задач. Во-первых, он дает общий launcher для Codex и Claude Code. Команда ai-launch codex или ai-launch claude показывает интерактивный список проектов. Вверху всегда есть New project и No project: первый пункт создает новый репозиторий по шаблону, второй запускает агента без привязки к конкретному проекту.

Во-вторых, проект вводит единый формат инструкций. AGENTS.md считается каноническим файлом с общими правилами проекта. CLAUDE.md импортирует его через @AGENTS.md и содержит только то, что специфично для Claude Code.

В-третьих, есть консервативный workspace-sync. Он проходит по настроенным корням, делает fetch, подтягивает только чистые worktree, пушит только уже закоммиченные изменения и пропускает грязные репозитории. В scheduled-режиме он никогда сам не коммитит. Это важно: агент может оставить проект в промежуточном состоянии, а автоматическая синхронизация не должна превращать это в опубликованный мусор.

В-четвертых, проект различает свои репозитории и внешние upstream-репозитории. Если origin принадлежит вашей GitHub-организации или аккаунту, синк может пушить туда. Если origin внешний, например это сайт, vendor repo или upstream проекта, scheduled sync пушит только в отдельный remote backup. Пуш в настоящий upstream должен быть явным действием. Для чего это нужно? Например, я работаю с сайтом cozystack.io, который хранится в репозитории cozystack/website, но у меня написан ряд нейроинструкций для работы с контентом этого сайта: по каким правилам структурировать анонс новой версии платформы, по каким правилам делать какие-то врезки и фактоиды, как располагать картинки, какие блоки ссылок давать в конце и т.п. Для другого сайта я собрал пайплайн, который из видеоподкаста делает статью: скачивает, прогоняет через whisper, проводит 3 этапа редактуры, выдирает из видео скриншоты, обращается в сервис ahrefs для сбора SEO и GEO-семантики и анализа статей-конкурентов, добавляет изображения в нужные места материала, дробит его на разделы с заголовками, собирает фактоиды, врезки и цитаты, добавляет всю дополнительную метаинформацию, а также составляет внутритекстовые инструкции для агента, который уже непосредственно верстает статью. Всему этому в репозиториях сайтов пока не место (хотя со временем наверняка всё это туда попадет).

В-пятых, есть заготовка для разделения target repo и delivery workbench. Target repo содержит проверенный код, сайт, публичные документы и PR-ветки. Workbench содержит промпты, исследования, черновики, исходные материалы, пайплайны и локальное состояние. Связь между ними описывается в workspace.yaml.

Как использовать

Минимальная установка выглядит так:

mkdir -p ~/projects
git clone <ai-workspace-system-repo-url> ~/projects/ai-workspace-system
~/projects/ai-workspace-system/bin/install-local
workspace-configure

install-local кладет symlink-и в ~/.local/bin, а workspace-configure интерактивно создает локальный конфиг:

~/.config/ai-workspace/config

В этот конфиг попадает все, что зависит от конкретной машины:

PROJECTS_HOME="$HOME/projects"
PROJECT_ROOTS="$HOME/projects"
SYNC_ROOTS="$HOME/projects"
GITHUB_ORG=""
BACKUP_REMOTE="backup"
CODEX_BIN="$HOME/.local/bin/codex"
CLAUDE_BIN="$HOME/.local/bin/claude"
SECRET_SCAN_CMD=""

PROJECT_ROOTS отвечает за picker, SYNC_ROOTS - за автоматическую синхронизацию. Проект может быть виден агентам, но не участвовать в scheduled sync.

После настройки можно запускать:

ai-launch codex
ai-launch claude

При запуске в терминале агент не стартует сразу в случайной директории. Сначала появляется список: New project, No project, затем проекты из PROJECT_ROOTS. New project вызывает workspace-new-project: создается каталог в PROJECTS_HOME, базовые README.md, AGENTS.md, CLAUDE.md, workspace.yaml, .gitignore, .env.example, затем выполняются git init -b main и initial commit. No project нужен для разовых вопросов без проектного контекста.

Для плановой синхронизации используется user-level systemd timer. В проекте он настроен на 13:00, 19:00 и 23:50:

systemctl --user daemon-reload
systemctl --user enable --now ai-workspace-sync.timer

Перед включением таймера полезно выполнить:

workspace-sync --dry-run

Так видно, какие репозитории будут обнаружены и какие действия будут выполнены.

Промпт для сбора локальных проектов

Отдельная часть системы - prompt prompts/discover-and-normalize-local-projects.md. Его можно дать Codex или Claude Code на машине, где проекты уже разбросаны по домашней директории. Он просит агента сначала провести инвентаризацию, классифицировать каталоги, создать ~/projects, предложить move plan, а затем после подтверждения перенести безопасные проекты, добавить README.md, AGENTS.md, CLAUDE.md, .gitignore, workspace.yaml и инициализировать Git там, где это настоящий проект, а не архив, cache или runtime state.

Короткая версия:

Find likely local projects, classify them, move approved ones into ~/projects,
add baseline AI/project docs, and initialize Git repos where appropriate.
Do not move secrets, agent sessions, logs, caches, auth files, or shell history.
Preserve existing remotes. Ask before committing dirty repos or changing upstream policy.

Глобальные инструкции агентов

Глобальные агентские файлы не затираются. ~/.codex/AGENTS.md, ~/.claude/CLAUDE.md и ~/.claude/rules/ считаются машинными предпочтениями. Если файла нет, агент может предложить его создать. Если файл уже есть, он должен сохранить содержимое и предложить маленькое дополнение. Runtime state, auth, sessions, logs, sqlite и история shell не попадают в Git.

Какие команды есть

workspace-configure интерактивно пишет локальный конфиг. Это ключевая команда для open-source-версии проекта: GitHub organization, пути до бинарников, project roots и secret scanner больше не хранятся в репозитории.

ai-launch codex запускает Codex через project picker. Для Codex используется --cd, поэтому агент стартует сразу в нужной директории.

ai-launch claude запускает Claude Code через project picker. Для Claude Code скрипт сначала делает cd, затем запускает бинарник.

workspace-new-project <name> создает проект в PROJECTS_HOME, инициализирует Git и делает initial commit. Если GITHUB_ORG задан и gh авторизован, создается приватный GitHub-репозиторий. Важный момент — если вы уже синканулись с моим проектом, то при запуске новой сессии Codex или Claude он предложит вам создать проект, отказаться от создания проекта либо выбрать проект из списка ваших проектов.

workspace-sync выполняет обычную безопасную синхронизацию: fetch, fast-forward pull для чистых репозиториев и push закоммиченных изменений.

workspace-sync --scheduled используется таймером. В этом режиме нет auto-commit, нет force push и нет пуша во внешний origin.

workspace-sync --commit включает интерактивный режим: для грязных репозиториев скрипт спрашивает, нужно ли закоммитить изменения. Если задан SECRET_SCAN_CMD, перед коммитом запускается secret scan.

workspace-ensure-backup --push добавляет backup remote для внешних upstream-репозиториев. Имя mirror-репозитория строится по исходному origin, например mirror-source-owner-source-repo.

Ограничения

Проект сознательно не пытается быть полноценным backup-решением. GitHub sync не заменяет restic, borg или нормальный файловый backup. Незакоммиченные документы, большие артефакты, базы, дампы и сессии агентов должны жить отдельно.

Синхронизация работает только с Git-репозиториями. Если важный проект не инициализирован как Git repo, launcher может его показать, но sync не сохранит его состояние.

Scheduled sync не коммитит грязные worktree. Это ограничение иногда неудобно, но оно принципиальное. Автоматический коммит без понимания контекста слишком легко публикует секреты, временные файлы или полусобранную работу.

Система не угадывает политику для внешних репозиториев. Если origin указывает не на ваш GITHUB_ORG, проект считается внешним. По умолчанию его можно бэкапить в backup, но пушить в upstream нужно только после явной команды.

Еще одно ограничение: это shell-first система. Она прозрачная и легко чинится, но не дает красивого UI, истории операций и централизованной базы проектов.

Как мы (я, Claude и Codex) его тюнили и дорабатывали

Изначально система была личной. В документах и примерах была захардкожена конкретная GitHub-организация, в конфиге лежали конкретные root-и, а в workspace-sync был прямой вызов локального secret-audit-скрипта. Для open-source-проекта это плохо: новый пользователь должен передать свои значения при установке, а не вычищать чужие.

Первым шагом мы вынесли машинно-специфичное в workspace-configure. Теперь репозиторий содержит generic defaults, а реальная конфигурация живет в ~/.config/ai-workspace/config.

Вторым шагом мы изменили место хранения логов. Раньше sync-лог мог оказаться внутри самого репозитория. В логах есть локальные пути, имена репозиториев, ветки и remotes. Теперь дефолтный каталог логов находится в ~/.local/state/ai-workspace/logs, а logs/ добавлен в .gitignore.

Третьим шагом мы сделали workspace-new-project независимым от жесткого ~/projects. Он использует PROJECTS_HOME, а если тот не задан, берет первый root из PROJECT_ROOTS. ai-launch теперь берет фактический путь из вывода workspace-new-project.

Четвертым шагом была чистка документации. README, bootstrap prompts, templates и playbook-и переведены на placeholders: <ai-workspace-system-repo-url>, <github-org-or-user>, <projects-home>. Это делает проект пригодным для публикации: в репозитории остаются правила и механика, но не остается личной инфраструктуры автора.

Что не работало и как это исправляли

Первый сбой был концептуальный: система одновременно хотела быть рабочим инструментом и переносимым шаблоном. Hardcoded GitHub organization и локальные пути делали ее удобной на одной машине, но ломали переиспользование. Исправление: setup через workspace-configure и пустой GITHUB_ORG в config.example.

Второй сбой был с безопасностью публикации. Один из логов синхронизации попал в рабочее дерево проекта. Это не секрет в прямом смысле, но такие логи раскрывают структуру домашней директории. Исправление: логи вынесены в XDG state directory, а logs/ исключен из Git.

Третий сбой был в secret scanning. workspace-sync --commit вызывал локальный скрипт из приватной директории. На другой машине такого файла нет. Исправление: SECRET_SCAN_CMD стал опциональной настройкой.

Четвертый сбой был в Git hook. Глобальный prepare-commit-msg должен был автоматически добавлять Signed-off-by, но использовал echo -e под /bin/sh. На этой системе echo напечатал -e как обычный текст, и commit message получил лишнюю строку. Исправление простое и переносимое:

if [ -n "$SOB" ] && ! grep -qs "^$SOB" "$1"; then
  printf '\n%s\n' "$SOB" >> "$1"
fi

printf в shell-скриптах предсказуемее, чем echo -e.

Пятый сбой был UX-овый: создание проекта через launcher предполагало один фиксированный root. После появления PROJECTS_HOME это стало неверным. Исправление: workspace-new-project печатает фактический путь нового проекта, а launcher использует именно его.

В итоге проект стал менее “моим” и более системным. Он по-прежнему решает ту же бытовую задачу: открыть Codex или Claude Code, выбрать проект, безопасно синхронизировать состояние и не потерять инструкции. Но теперь личные решения вынесены на уровень локального конфига, а сам репозиторий можно публиковать и переносить между машинами.

Репозиторий с проектом

Всё хранится вот тут, под Apache 2.0: https://github.com/tym83-ai/ai-workspace-system. Комментируйте, набрасывайте, предлагайте доработки.