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

86 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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:
```bash
"$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.