Some checks failed
Published content check / validate (push) Failing after 17s
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>
86 lines
13 KiB
Markdown
86 lines
13 KiB
Markdown
---
|
||
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.
|