git.zapret.moe в России заблокирован по имени, как и wiki.zapret.moe. Ссылки на Forgejo во всех заметках, футерах, wizard.html и главной заменены на git2.zapret.moe (включая закодированные адреса значков shields.io). Какое имя рабочее, теперь решают реестры хоста /etc/zapret-*-domains.conf через zapret-site-names: pre-commit хук vault отклоняет добавленные строки с заблокированным именем, сборка Quartz сама переводит ссылки и baseUrl на рабочие имена. Правило в AGENTS.md переписано под этот механизм. scripts/wiki-stats.py: переходы с любых имён вики и git (wikiN, gitN) больше не считаются внешними сайтами. content-check: проверка зеркал сторонних проектов узнаёт любое имя git. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 KiB
| publish |
|---|
| false |
AGENTS.md — правила работы с этим репозиторием
Это Obsidian-хранилище проекта ZapretKVN (приватность, обход DPI и цензуры). Его Git-репозиторий хранится в Forgejo: zapretdiscordyoutube/todo на git2.zapret.moe (старое имя git.zapret.moe в России заблокировано); материалы публикуются на сайт https://wiki2.zapret.moe (self-hosted Quartz 4, живёт на этом же хосте в /srv/wiki-quartz). Публикация привязана к Git: каждый локальный коммит в vault автоматически пересобирает сайт (systemd-юнит wiki-rebuild.path следит за .git/logs/HEAD и запускает wiki-rebuild.service). Отдельного шага «опубликовать» больше нет.
Git-процесс: коммитим прямо в main
Ветки и pull request'ы не используются. Готовые правки коммитятся напрямую в main и пушатся — это решение владельца репозитория (25 июля 2026), принятое взамен прежней схемы «ветка → PR → merge».
Почему так: репозиторий ведёт один человек, ревьюить PR некому, а Forgejo Actions здесь запускают проверку на push в main (см. ниже). PR не давал дополнительного ревью, а только добавлял лишний шаг.
Порядок работы:
git fetch originперед началом, чтобы не разойтись с remote;- добавлять в staging только подтверждённые файлы, не
git add -Aвслепую; git diff --checkперед коммитом;- осмысленное сообщение коммита на русском: первая строка — суть, дальше абзац с деталями;
git pushвmain.
Не коммитить: .obsidian/, .agents/, .claude/ и прочие служебные каталоги (часть из них уже в .gitignore).
Новую статью публикуй сам, не спрашивая (решение владельца от 7 октября 2026). Когда статья дописана и проверки пройдены, сразу коммить её с вложениями в main, пушь и заливай на зеркало Obsidian Publish — отдельного подтверждения «публиковать?» не нужно. В рабочем дереве часто лежат чужие незакоммиченные правки: в коммит бери только файлы своей статьи, а на зеркало заливай их по одному через obsidian publish:add path=<путь>, потому что publish:add changed выгрузит с диска и чужие черновики.
Forgejo Actions
На каждый push в main срабатывает workflow .forgejo/workflows/content-check.yml. Он получает текущий commit и его непосредственного родителя, чтобы проверять именно новая правка, а не всю историю хранилища. Workflow проверяет:
- что в последнем опубликованном commit нет проблем с пробелами и концами строк через
git diff --check HEAD^ HEAD; - что корневой
index.htmlсуществует и не пуст.
Публикацию на сайт этот workflow не выполняет — сайт собирается локальным systemd-юнитом, см. ниже.
Публикация на сайт (wiki2.zapret.moe)
Адреса вики и git — wiki2.zapret.moe и git2.zapret.moe (решение владельца от 24 октября 2026). Старые wiki.zapret.moe и git.zapret.moe в России заблокированы по имени; nginx уводит с них на рабочие имена, но читатель за блокировкой до редиректа не доходит. Поэтому во всех ссылках — в плашках [!mirror], внутри статей, в постах для Telegram, на картинках и в Forgejo-футере — пиши только рабочие имена.
Какое имя рабочее, решают не правила в тексте, а реестры хоста /etc/zapret-wiki-domains.conf и /etc/zapret-git-domains.conf (их ведут zapret-*-domains и zapret-mirror-manager, флаг blocked). Единая точка — zapret-site-names: zapret-site-names link wiki / link git печатает имя для ссылок, zapret-site-names rewrite ФАЙЛ… заменяет в файлах все заблокированные имена на рабочие, zapret-site-names check ФАЙЛ… их находит. На него опираются:
- pre-commit хук vault (
.git/hooks/pre-commit): коммит с заблокированным именем в добавленных строках отклоняется; - сборка Quartz:
baseUrlи ссылки статей на заблокированные имена git и вики берутся из реестров (transformerSiteLinks); render.pyскиллаvault-chartиmd2tghtml.pyскиллаvault-note: заблокированное имя в HTML диаграммы или в посте заменяется на рабочее;wiki-rebuild(robots.txt) иwiki-indexnow.
Если заблокируют и wiki2/git2, контроллер сам пометит имя blocked, сборка вики и рендер переключатся сами; в тексте vault останется прогнать zapret-site-names rewrite по всем .md одним коммитом и перерендерить картинки, где имя впечатано в пиксели, — после этого обнови эту строку.
Сайт — статический, собирается Quartz 4 прямо из этого vault (npx quartz build -d /home/codex-pve/Privacy в /srv/wiki-quartz). Запускать руками ничего не нужно: любой коммит в vault триггерит пересборку через wiki-rebuild.path. Принудительная пересборка без коммита: sudo systemctl start wiki-rebuild.service или /usr/local/bin/wiki-rebuild.
URL заметки = путь в vault со слагами Quartz (пробелы → -, кириллица сохраняется): Zapret/home.md → https://wiki2.zapret.moe/Zapret/home. Главная / — это alias index в frontmatter Zapret/home.md.
Как исключить файл из публикации: добавить в его frontmatter publish: false — фильтр RemoveNoPublish в Quartz не пропустит такую заметку на сайт, при этом она остаётся в Git. Так исключён сам AGENTS.md.
Закрытые разделы. Папки VPS/, scripts/, .obsidian/, .claude/, .agents/, .forgejo/ и корневые index.html, AGENTS.md вырезаются на уровне ignorePatterns в /srv/wiki-quartz/quartz.config.ts — в сборку не попадают ни заметки, ни вложения из них. В VPS/ лежат IP, пароли и детали инфраструктуры — новые закрытые папки добавлять именно в ignorePatterns, а не полагаться только на publish: false (frontmatter не защищает вложения).
При переименовании заметки старый путь исчезает с сайта сам при следующей пересборке; чтобы старые внешние ссылки не ломались, можно добавить старый слаг в aliases: frontmatter — Quartz сделает редирект.
Зеркало на Obsidian Publish. До 20 августа 2026 основной сайт жил на Obsidian Publish (publish.obsidian.md/zapret); теперь основная вики — wiki2.zapret.moe, а Obsidian Publish остаётся резервным зеркалом и должен быть в актуальном состоянии. После коммита и пуша заливай изменения командами obsidian publish:* (порядок, исключения и настройки сайта — в разделе «Публикация в Obsidian Publish (зеркало)» скилла .claude/skills/vault-note/SKILL.md). Скрипт scripts/publish-safe.sh устарел и оставлен только как история. В ссылках на вики используй основной адрес wiki2.zapret.moe, а не зеркало.
Проверка перед публикацией
Вместо ручных grep-скриптов используйте встроенные проверки CLI:
"$HOME/.local/bin/obsidian" vault="Privacy" unresolved counts # битые [[wikilinks]] по всему хранилищу
"$HOME/.local/bin/obsidian" vault="Privacy" orphans # заметки без входящих ссылок (сироты)
"$HOME/.local/bin/obsidian" vault="Privacy" links path=… # исходящие ссылки конкретной заметки
"$HOME/.local/bin/obsidian" vault="Privacy" backlinks path=… # кто ссылается на заметку
После добавления новой заметки unresolved не должен приобретать новых записей из-за неё, а сама заметка не должна оставаться в orphans — если осталась, не хватает ссылки из соседней заметки или из обзора раздела.
Заметки
Правила написания заметок вынесены в скилл vault-note (.claude/skills/vault-note/SKILL.md) — он обязателен при создании, правке и публикации любой .md в этом хранилище: самодостаточность, атомарность, frontmatter, callout-ы, [[wikilinks]], Forgejo-футер, запрет ручных переносов прозы.
Источники в заметке — кликабельные ссылки внутри текста плюс список внизу (решение владельца от 7 октября 2026). Каждое утверждение, взятое из источника, несёт ссылку прямо на словах фразы — [«Ведомости» сообщили](https://…), без голых URL и без упоминаний издания без ссылки. Дополнительно перед «См. также» идёт раздел «Источники» с теми же ссылками одним кликабельным списком. Подробности и исключение для репозитория Flowseal — в скилле vault-note.
Пост для Telegram отдавай отрендеренной HTML-страницей через Artifact (решение владельца от 7 октября 2026): текст в блоке кода плюс ссылка claude.ai/artifact/… на страницу с кнопкой «Скопировать», собранную скриптом .claude/skills/vault-note/scripts/md2tghtml.py. Блок кода без страницы или путь к файлу на диске выдачей не считаются; порядок — в разделе «Выдача поста» скилла vault-note.
Отдельное правило: Zapret/home.md не трогать — навигацию на главной ведёт владелец вручную.
Response format
The response format rules are common to all projects: the "Response format" section in /home/codex-pve/AGENTS.md. Read it and follow it in every session; change the rules only there.