todo/AGENTS.md
loop-uh baf0091fa3
Some checks failed
Published content check / validate (push) Failing after 17s
git.zapret.moe → git2.zapret.moe во всём хранилище, защита от возврата старых имён
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>
2026-10-24 15:51:32 -04:00

13 KiB
Raw Permalink Blame History

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 и вики берутся из реестров (transformer SiteLinks);
  • 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.