Описание
1c-agent-kit — общая инфраструктура для работы ИИ-агентов с 1С: подключается к проекту как git submodule, раскладывает скиллы и инструменты по нужным каталогам, единый каркас для доработки конфигураций — правки модулей, форм и запросов, агент получает структурированный контур вместо разрозненных инструкций. Для 1С-разработчиков, встраивающих ИИ в свой процесс.
Что умеет:
— подключаться как git submodule;
— раскладывать скиллы по каталогам;
— давать единый каркас агента;
— покрывать типовые доработки.
Полная документация ниже — автоматически из репозитория pzayash/1c-agent-kit (ветка master). Оригинальные материалы проекта распространяются на условиях его лицензии.
1c-agent-kit
Общая инфраструктура агентов для доработки конфигураций 1С.
Потребители подключают этот репозиторий как git submodule в harness/.
Канон решений — отдельный пилот-репозиторий (не этот kit). Срез общих
docs/ai — docs/ai/README.md. Раскладка docs/ у
потребителя — docs/ai/docs-layout.md. Навыки cc-1c —
skills/cc-1c/ + sync tools/cc-1c-skills-sync/.
Bootstrap (рекомендуемый вход)
После git submodule update --init:
# Linux / Docker slot
bash harness/scripts/bootstrap-kit.sh .
# Windows (PowerShell)
powershell -NoProfile -ExecutionPolicy Bypass -File harness/scripts/bootstrap-kit.ps1 -ConsumerRoot .
# Host PATH (node, openspec CLI, rtk) — NEVER openspec init
powershell -NoProfile -File harness/scripts/init-kit-deps.ps1 -ConsumerRoot . -Install
# Linux: INSTALL=1 bash harness/scripts/init-kit-deps.sh .
# Проверка links (копия ≠ kit link)
bash harness/scripts/verify-kit-links.sh .
# Сводная диагностика (read-only): gitlink, gitdir, links,
# stale-ссылки (WOULD PRUNE), host deps, ps1-ASCII
bash harness/scripts/kit-doctor.sh .
Движок раскладки kit-layout (opt-in)
Альтернатива link-скриптам — декларативная таблица
tools/kit-layout/layout.json + движок kit_layout.py (idea: teamai
ResourceHandler): один кроссплатформенный код вместо пар sh/ps1,
встроенные tombstones и идемпотентность (OK без перелинковки).
# посмотреть план, ничего не меняя
python harness/tools/kit-layout/kit_layout.py plan .
# раскладка через движок в bootstrap
LAYOUT_ENGINE=1 bash harness/scripts/bootstrap-kit.sh .
# проверка (все ресурсы; verify-kit-links.sh — только spot-check)
python harness/tools/kit-layout/kit_layout.py verify .
# kit-пути, всё ещё трекнутые в индексе потребителя (Windows/junction)
python harness/tools/kit-layout/kit_layout.py tracked .
Паритет с link-скриптами проверен синтетикой (440 путей идентично) и на
живом потребителе (нулевой plan). Движок — дефолт bootstrap; откат на
legacy-скрипты: LEGACY_LINKS=1 / -LegacyLinks.
apply ведёт fallback-манифест tools/cc-1c-skills-sync/kit-fallback.txt
(hardlink/copy + sha256) и регенерирует managed-блок .gitignore, чтобы
ссылки и фолбэки не попадали в git status потребителя. Если symlink-права
появились позже (Developer Mode) — apply апгрейдит in-sync hardlink/copy
до symlink, apply --upgrade-fallbacks (KIT_UPGRADE_FALLBACKS=1) догоняет
и записи старого манифеста, а kit-doctor показывает фактический режим
(N link(s), M hardlink(s), K copy(ies)) и подсказывает апгрейд.
Windows (junction). Без symlink-привилегии каталоги линкуются через
mklink /J. Git при core.symlinks=false идёт внутрь junction и трекает
содержимое kit как обычные blob’ы потребителя — на свежем git clone вышли
бы устаревшие копии вместо ссылок. Поэтому apply делает UNTRACK
(index-only git rm --cached; рабочее дерево/junction не трогаются), а
verify предупреждает, tracked — exit 1 и список. Отключить:
--no-untrack.
FOREIGN-NS — ловушка, а не «безопасность». Если ссылки созданы в другом
OS/namespace (Windows-checkout, открытый из Linux-sandbox/WSL), их target
читается как /mnt/host/... и лежит вне consumer root. Раньше plan/apply
молча печатали SKIP FOREIGN-NS (0 pending), а verify был зелёным — агент
получал no-op и «всё ок». Теперь:
plan/applyс foreign-ссылками завершаются exit 2 до первой операции
(ERROR: ... foreign/sandbox namespace),plan --strict— ещё и exit 1;verifyпечатаетWARN FOREIGN-NSпо каждой ссылке и, если все ссылки
вне root,FAIL+ подсказку «запускайте в namespace хоста»;bootstrap-kitловит то же до link-шагов (exit 2);kit-doctor—[FAIL];
verify-kit-linksпечатаетSKIP FOREIGN-NSвместо ложногоFAIL missing;kit-agent check-commandдаёт WARN наsandbox/run.sh … kit_layout.py|bootstrap-kit.
Запускать раскладку/verify только на хосте, который её создал (Git Bash /
PowerShell), не через tools/sandbox/run.sh. Обхода нет намеренно: тихий
no-op и зелёный verify опаснее явной ошибки.
plan --strict — exit 1 при pending-действиях или foreign-ns (гейт паритета
для CI/валидации).
Symlink-корень — не FOREIGN-NS. Agent-slot отдаёт worktree как
/work -> /srv/agent-worktrees/agent-N: ссылки хранят написание /work/...,
а bootstrap/engine резолвят корень в /srv/.... Guard сравнивает realpath
цели с realpath корня (_link-common.sh: kit_canonical_path,
kit_layout.py: is_within_resolved), поэтому та же раскладка под другим
написанием корня не отвергается. Регресс-тесты: tools/kit-layout/test_kit_layout.py
(engine + scan/compare), tools/kit-agent/test_kit_agent.py (namespace-хинт
без git).
kit-agent: хуки и guard-правила для агентов
Ядро tools/kit-agent/kit_agent.py (idea: teamai hooks, harness-агностично):
python harness/tools/kit-agent/kit_agent.py session-start # подсказки (пусто = ок)
python harness/tools/kit-agent/kit_agent.py check-command "git add harness/x" # guards
Адаптеры (тонкие, логика — только в ядре; правила — guards.json):
- pi (TUI и RPC/ACP — bb, Zed):
pi/extensions/kit-hooks.ts→
.pi/extensions; session-start подсказки (notify + разовый инжект),
block/warn на bash-команды по guards, команда/kit. - Kilo Code / OpenCode:
kilo/plugin/kit-hooks.ts→.kilo/plugin
и.opencode/plugin(тот же файл; Kilo — OpenCode-семейство,
engines.opencode); guard-block черезtool.execute.before,
session-start →experimental.chat.system.transform. - Универсальный: managed-секция
kit-agent-loopв AGENTS.md
(инструкция прогнать session-start и сверяться с check-command) —
для Zed direct, любых читателей AGENTS.md и headless-режимов.
Все срабатывания guards (block/warn) автоматически фиксируются
friction-сигналом в memory/rule-friction/ (канон memory-format.md
§ Разлад; разбор — skill evolve), session-start напоминает про
неразобранные. Ручная запись:
kit_agent.py record-friction --rule-id … --kind block --command ….
Parent git: fatal: not a git repository: harness/../.git/modules/harness —
сначала fix-harness-gitdir (worktree file-gitdir):
bash harness/scripts/fix-harness-gitdir.sh .
# gitdir ещё нет в этом worktree — скопировать с живого wt
powershell -NoProfile -File harness/scripts/fix-harness-gitdir.ps1 `
-ConsumerRoot . `
-CopyFrom D:\dev\proj\main\.git\worktrees\wt-a\modules\harness
bootstrap-kit вызывает link cc-1c → overlay → tools → editor roots
(.agents/skills, .claude/skills|commands) → pi roots (.pi/*), при
необходимости пишет thin load-changed-files.sh, затем verify-kit-links.
Link-скрипты заодно делают prune (tombstones): kit-ссылка, чей
skill/tool/rule удалён или переименован upstream, снимается (PRUNE:).
Локальные копии и чужие ссылки не трогаются; имена из local-*.txt
пропускаются. Dry-run: DRY_RUN=1 / -DryRun → WOULD PRUNE:.
bootstrap-kit также патчит managed-секции AGENTS.md (idea: teamai
section-patcher): тела из templates/sections/*.md живут между якорями
<!-- kit-section: <slug>, hash: ... --> и обновляются при bootstrap.
Правки пользователя внутри секции не затираются — SKIP (drift); аудит:
python harness/tools/section-patch/section-patch.py check AGENTS.md
(exit 1 при drift). Отключить шаг: SKIP_SECTIONS=1 / -SkipSections.
Frontmatter skills (name/description в SKILL.md) —
tools/skill-frontmatter/skill-frontmatter.py lint|fix (idea: teamai
ensureSkillFrontmatter): fix инжектирует блок или дописывает поля перед
закрывающим ---, не переформатируя YAML; name ≠ каталога — только
ручной fix. Входит WARN-чеком в kit-doctor и шагом в harness-promote.
- Linux: нативные
link-*.sh(ln -sfn). - Windows:
link-*.ps1(mklink /J; filemklink, при отсутствии прав —
hardlink, в крайнем случае copy). File-fallback’и пишутся в
tools/cc-1c-skills-sync/kit-fallback.txt, поэтому prune иkit-doctor
их видят (см. § Pitfalls «File symlink без прав»). - Git Bash на Windows:
link-*.shделегируют в.ps1.
Pitfalls
- Skill «есть», но не из kit — Win:
ReparsePoint/dir /AL;
Linux:readlink/verify-kit-links. - Сотни
Dв git после link — сначала merge ветки, где skills
untrack; потом bootstrap (иначе REPLACE COPY).- Linux: kit-ссылка — symlink (mode
120000), старые трекнутые копии
даютDв.cursor/skills/*иtools/*. - Windows без symlink-привилегии: junction git не считает symlink’ом,
поэтому kit-файлы не удаляются, а перезаписываются (M), аD
приходят в основном от потребительских файлов внутри kit-каталогов
(vendored BSLLS, примерыmcp-call). ДоUNTRACK(см. kit-layout)
git add -Aзатянет содержимое kit как blob’ы потребителя.
- Linux: kit-ссылка — symlink (mode
verify-kit-links— spot-check, а не полный обход: несколько
репрезентативных ссылок + алиасы. Полная проверка —kit_layout.py verifyиkit-doctor(в т.ч. пункт «kit links tracked in index»).Remove-Item/ NullRef на junction — канонcmd /c rmdir(уже в.ps1).git statusломается на harness в worktree —harness/.git→
<main>/.git/worktrees/<name>/modules/harness(не относительный
../.git/modules/harnessпри file-gitdir).
Скрипт:fix-harness-gitdir.sh/.ps1. На Windows весь parent
git statusпадает; в Linux Docker parent git часто ещё жив.
Emergency:rename harness harness.bak— git снова работает.
worktrees/<name>/modules/может не существовать, пока в этом
worktree ни разу не делалиsubmodule update.-CopyFromс другого
wt (пример:wt-a) или shared<main>/.git/modules/harness(WARN:
общий HEAD).- Копия
harness/vs gitlink — untracked каталог блокирует merge
(would be overwritten by merge). Снести копию до merge ветки
с160000 harness.git clean -fdне удалит каталог с файлом
.git(nested repo) — нуженrm -rf harness. - Нет GitHub creds / GCM — на 42
git fetch originпо SSH без TTY
падает (wincredman,/dev/tty). Канон offline:git bundleс
машины, где ветка уже есть, +git fetch <bundle>. - Слот Docker: remote
org, неorigin—origin/devunknown;
mergeupstream/dev. Hostgit worktree listпомечает
/srv/wt/agent-Nкак prunable — неprune. - CRLF в
.shна Linux —sed -i 's/\r$//'илиtr -d '\r'.
Корень: у потребителяcore.autocrlf=trueбез.gitattributes.
Kit шлёт.gitattributes(*.sh text eol=lf), ноgit checkout -f <sha>
не перезаписывает уже существующие файлы. Один раз материализовать LF:git -C harness config core.autocrlf false git -C harness checkout -f <sha> git -C harness checkout-index -a -f # переписать рабочее дерево по атрибутам - WSL-bash + Windows-проект (
/mnt/<drive>/...) — Linux-ветка
создаёт symlink’и на/mnt/..., невидимые из Windows.bootstrap-kit
иkit-layoutотказываются работать (WSL_ALLOW=1 — осознанный обход).
Правильно: Git Bash (bash.exe) или PowerShell (.ps1). - Новые alias-каталоги в
git status—.kilo/plugin,
.opencode/plugin(и ранее.pi/*) — junction’ы kit. Если у
потребителя они не в.gitignore— добавить:/.kilo/plugin,
/.opencode/plugin(аналогично.pi). - Ручной список kit-путей в
.gitignoreдублирует managed-блок — после
появления managed-блока (# >>> kit-managed: begin) ручные строки
.cursor/skills/...,/.pi/*и т.п. лишние:verify/kit-doctor
предупреждают о пересечении. Удали свои строки (блок перегенерируется
bootstrap), оставшийся untracked-мусор добирает managed-блок. На Linux
ссылки kit — именно symlink’и: ручные шаблоны с завершающим/
(xlsx/,prompt-enhancer/) матчат только каталоги и дают??в
git status; managed-блок корня пишет/.cursor/skills/xlsx(без слэша)
и покрывает их. bootstrap-kit/kit_layout.pyчерезtools/sandbox/run.shнад
Windows-деревом — target ссылок читается как/mnt/host/...
(FOREIGN-NS): engine теперьERRORexit 2, а не тихий no-op/зелёный
verify. См. § kit-layout и docs/ai/sandbox.md..ps1только ASCII — PS 5.1 читает BOM-less файл как ANSI
(CP1251): байты—/кириллицы дают”, парсер рвёт строку →
ParserError TerminatorExpectedAtEndOfString. Guard:
bash harness/scripts/check-ps1-ascii.sh(в kit CI/pre-push).- Кириллица в выводе
.ps1→ cp866. PS 5.1 пишет stdout в
OEM-кодировке хоста, поэтому при перенаправлении (> file) лог приходит
нечитаемым (агент видит кракозябры). Лечение в скрипте:
[Console]::OutputEncoding = New-Object System.Text.UTF8Encoding $false
(или читать лог черезiconv -f cp866). Invoke-WebRequestв PS 5.1 виснет на неотвечающем SSE-эндпоинте —
-TimeoutSecне срабатывает, вызов блокируется. Готовность HTTP-сервиса
проверять TCP-чеком или через tools/mcp-call,
а неInvoke-WebRequest.- Downgrade сабмодуля + bootstrap = PRUNE более новых ссылок —
tombstones честно снимет ссылки на skills/tools, которых нет в старом
SHA harness. После возврата на актуальный SHA — повторный
bootstrap-kit(или link-скрипты) перелинкует (LINK:/JUNCTION:). - File symlink без прав — Developer Mode /
SeCreateSymbolicLinkPrivilege
нужны только для symlink. Порядок fallback: symlink → hardlink
(mklink /H, без прав, на том же томе) → copy (cross-volume). Каждый
fallback фиксируется вtools/cc-1c-skills-sync/kit-fallback.txt
(rel path, source, sha256), поэтому:- prune (tombstones) снимает и fallback-копии по манифесту, а не только
reparse (старый «prune blind» для copy закрыт); kit-doctorразличает «in sync» и «stale / content differs»
(раньше умел только сказать «есть копии»);- правка потребителя в fallback не затирается молча —
KEEP LOCAL EDITS(перенеси файл вlocal-overlay.txt/local-tools.txt, если он
должен быть своим); - managed-блок
.gitignoreперегенерируется bootstrap, поэтому ссылки и
fallback не висят??вgit status
(KIT_NO_GITIGNORE=1/--no-gitignore— выключить).
Hardlink делает правку потребителя видимой как грязь вharness
(git -C harness status);kit-doctorпредупреждает «harness working
tree dirty». Лечение прежнее: Developer Mode / SeCreateSymbolicLinkPrivilege.
- prune (tombstones) снимает и fallback-копии по манифесту, а не только
- Старый worktree — merge → hydrate harness →
bootstrap-kit→ verify. - Агент/UI не видит skill (Zed, Cursor slash) — читается
.agents/skills
(у Zed это корень скиллов проекта), а не.cursor/skills.bootstrap-kit
делает junction/symlink.agents/skills→.cursor/skills
(и.claude/skills). Не копировать потребительский
setup-project-symlinks.shцеликом (src/cf— layout потребителя). - Нет node / openspec / rtk на голом Windows-worktree — слот Docker
уже содержит их в образе; 42/features— нет. Скрипт
init-kit-deps(-Install). Неopenspec init(свои
openspec/+ kit skills). Неrtk init(CLAUDE.md). Канон:
docs/ai/kit-host-deps.md. - Пути в разном регистре (Win/macOS) — NTFS не видит
Foo/foo, индекс Git видит два пути. Merge:
untracked would be overwritten. Канон:
docs/ai/git-workflow.md § «Регистр путей».
git mvпо регистру — два шага через_case.tmp.
cc-1c-skills (vendor + junction)
Upstream cc-1c-skills vendored
в skills/cc-1c/. Promote = sync в этом репо → commit → bump gitlink у
потребителей.
Потребитель после bump (или весь стек через bootstrap-kit):
DRY_RUN=1 bash harness/scripts/link-cc-1c-skills.sh . tools/cc-1c-skills-sync/local-skills.txt
bash harness/scripts/link-cc-1c-skills.sh . tools/cc-1c-skills-sync/local-skills.txt
- LOCAL manifest:
tools/cc-1c-skills-sync/local-skills.txt(шаблон
templates/local-skills.txt). - Windows: только
mklink /J, не Git Bashln -s. - Срез 1: без
web-testв kit (форк потребителя остаётся LOCAL). - meta-* XML-патчи:
tools/cc-1c-skills-sync/overlays/+apply-meta-xml-patches.py.
Cursor overlay (срез A + B)
Универсальные rules/commands/skills (не cc-1c) — cursor/.
Канон harness-promote: cursor/skills/harness-promote/.
Срез A: caveman, openspec-*, explore, …
Срез B (workflow): handoff, close-chat, load-changed-files, bsl-check,
architect-apply, review, review-request, retro.
Потребитель после cc-1c link:
DRY_RUN=1 bash harness/scripts/link-cursor-overlay.sh . tools/cc-1c-skills-sync/local-overlay.txt
bash harness/scripts/link-cursor-overlay.sh . tools/cc-1c-skills-sync/local-overlay.txt
- Skills:
mklink /J. Rules/commands: filemklink(Windows Developer
Mode); без прав — hardlink, затем copy (см.kit-fallback.txt). sandboxskill,web-test— LOCAL у потребителя.
Pi harness (опционально)
pi читает навыки из .agents/skills (линк kit) и контекст
из AGENTS.md. bootstrap-kit дополнительно линкует:
.pi/skills→.cursor/skills(относительные ссылки из команд),.pi/prompts→.cursor/commands(prompt templates/имя),.pi/extensions→harness/pi/extensions(расширения kit).
Вручную: bash harness/scripts/link-pi-roots.sh . (Win — .ps1).
Расширение auto-session-title — pi/extensions/;
Zed/ACP — node harness/pi/scripts/patch-pi-acp-session-title.mjs.
Канон: docs/ai/pi-harness.md.
Workflow tools (срез B)
tools/bsl-check, tools/sandbox, tools/load-changed-files,
tools/mcp-call (JSON-RPC к MCP-серверам 1С, в т.ч. streamable HTTP),
tools/answer42 (UI 1С через клиент тестирования: README,
канон), tools/git-partial-stage.py — в tools/.
Load engine:
tools/load-changed-files/load-changed-files.sh; корень потребителя — wrapper.
Потребитель после overlay link:
DRY_RUN=1 bash harness/scripts/link-kit-tools.sh . tools/cc-1c-skills-sync/local-tools.txt
bash harness/scripts/link-kit-tools.sh . tools/cc-1c-skills-sync/local-tools.txt
- BSLLS binary не в git: один раз на хост
bash harness/tools/bsl-check/update-bsl-language-server.sh(без
--latest= пинBSLLS_VERSION) пишет в кэш, не в worktree. Канон:
tools/bsl-check/README.md.bootstrap-kitне
качает. На 42: User envKIT_BSLLS_ROOT=D:\tools\bslls. - Env-шаблон: templates/env.example.
-U, если/UpdateDBCfgупал на HTTP-клиентах второй публикации ИБ: авто-retry
-Dynamic- -SessionTerminate force— гейтUPDATE_DB_FORCE_SESSIONS(default
true) /--force-sessions/--no-force-sessions. На prod выключайте гейт
(false), если нельзя рвать сеансы пользователей.- Доки: docs/ai/agent-task-bus.md,
docs/ai/load-config-to-dev.md.
Порядок bootstrap второго ПК: git submodule update --init →
bootstrap-kit (или три link-скрипта) → BSLLS в кэш хоста (не worktree) →
Reload Window.
Подключение в проект
git submodule add <url-этого-репо> harness
git submodule update --init
bash harness/scripts/bootstrap-kit.sh .
Черновик .gitmodules — templates/gitmodules.
Layout исходников 1С в потребителе
- Канон: Vanessa Bootstrap —
src/cf/,src/cfe/ - Compat:
conf/+cfe.xml/+ symlinksrc/cf→conf
См. manifest.yaml.
Защита
hooks/pre-commit-harness — в проекте reject, если
под harness/ в индекс попали обычные файлы (не gitlink 160000).
Promote
Правка общего → commit в этом репо → в потребителе только bump SHA.
Skill: skills/harness-promote/SKILL.md.