openspec: архив changes series-taxonomy-and-header, archive-by-year-month, deploy-sftp-incremental (2026-09-25)
deploy-dedinit / Build & SFTP Deploy (push) Successful in 7m13s

This commit is contained in:
2026-09-25 08:31:28 +00:00
parent 92b7094fc7
commit 800f93a22f
16 changed files with 97 additions and 4 deletions
@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-09-22
@@ -0,0 +1,53 @@
# Design: Archive by Year/Month
## Goal
Страница `/posts/` (меню «Архив») показывает посты, сгруппированные по
годам и месяцам (как штатный архив Hugo/PaperMod), вместо плоского списка.
## Approach
Используем готовый layout темы rDedInit: `themes/rDedInit/layouts/_default/archives.html`.
Что он делает (из исходника theme):
- `where site.RegularPages "Type" "in" site.Params.mainSections` — берёт
обычные страницы основных секций (не список, без пагинации).
- `GroupByPublishDate "2006"` — группировка по годам.
- Внутри каждого года `GroupByDate "January"` — группировка по месяцам.
- Заголовки `.archive-year` / `.archive-month`, счётчики, якоря `#2026`,
`#2026-January`.
- Каждая запись — `.archive-entry` с title, post_meta и ссылкой.
Стили `.archive-*` уже есть в `assets/css/common/archive.css`.
## Change: content/posts/_index.md
Создать файл `content/posts/_index.md`:
```yaml
---
title: "Архив"
description: "Все посты блога по годам и месяцам"
layout: archives
---
```
Frontmatter `layout: archives` заставляет Hugo выбрать
`_default/archives.html` для листинга секции (Hugo ищет layout по
порядку: `<type>/<layout>.html`, `_default/<layout>.html` — найдёт
`_default/archives.html`).
Никаких других файлов менять не нужно:
- Меню `[menu.main]` Архив → `/posts/` уже настроено (hugo.toml).
- RSS секции `/posts/` рендерится через `rss.xml` независимо.
- `baseof.html` уже поддерживает `eq .Layout "archives"` для
breadcrumbs/навигации.
- `index.json` (поиск) и `rss.xml` исключают layout `archives` из листинга.
## Verification
1. `make build` (hugo --minify)
2. `grep -c 'archive-year' public/posts/index.html` > 0
3. `grep -c 'archive-month' public/posts/index.html` > 0
4. Убедиться, что title на странице — «Архив», посты сгруппированы по годам
5. `make deploy-dry-run` — SFTP-симуляция (деплой: Gitea Actions)
@@ -0,0 +1,36 @@
# Archive by Year/Month
## Problem Statement
Страница «Архив» (меню → `/posts/`) сейчас показывает плоский список всех
постов с пагинацией по 10 (layout `list.html`). При ~100+ постах это
неудобно: нет обзора по годам и месяцам, нельзя быстро найти пост по
периоду.
## Why
Hugo умеет группировать посты по годам/месяцам из коробки (GroupByDate /
GroupByPublishDate). Тема rDedInit уже содержит готовый layout
`_default/archives.html` и стили `archive.css` — нужно лишь переключить
секцию `/posts/` на этот layout. Расширять тему не требуется.
## Proposed Solution
Добавить `content/posts/_index.md` с frontmatter `layout: archives` (и
title/description). Hugo автоматически применит `archives.html` к листингу
секции `/posts/`, который сгруппирует посты по годам и месяцам с
счётчиками и якорями.
## Alternative Solutions
- Написать свой layout `layouts/posts/list.html` — избыточно, тема уже
имеет готовый архив.
- Использовать отдельную страницу `/archive/` — меняет URL и меню; текущий
пункт меню «Архив» ведёт на `/posts/`, менять не нужно.
## Impact
- Изменяется только рендер `/posts/` (list → archives).
- URL постов и permalinks не меняются.
- RSS секции `/posts/` сохраняется (archives.html не влияет на rss.xml).
- Деплой — автоматический через Gitea Actions (push в main).
@@ -0,0 +1,47 @@
## Purpose
Страница «Архив» (/posts/) блога dedinit.ru отображает все посты,
сгруппированные по годам и месяцам (как штатный архив Hugo), вместо
плоского списка с пагинацией.
## ADDED Requirements
### Requirement: Группировка постов по годам и месяцам
Система SHALL отображать на странице /posts/ список всех постов,
сгруппированный по годам публикации, и внутри каждого года — по месяцам
публикации. Заголовки содержат год/месяц и количество постов в группе.
#### Scenario: Страница /posts/ показывает годы
- **WHEN** пользователь открывает страницу /posts/
- **THEN** страница содержит заголовки годов (например «2026», «2023»), под каждым — посты этого года
- **AND** возле каждого года отображается количество постов
#### Scenario: Внутри года посты сгруппированы по месяцам
- **WHEN** пользователь открывает страницу /posts/
- **THEN** внутри каждого года посты сгруппированы по месяцам публикации (например «January», «September»)
- **AND** возле каждого месяца отображается количество постов
#### Scenario: Каждый пост — ссылка на свою страницу
- **WHEN** пользователь видит запись в архиве
- **THEN** заголовок поста является ссылкой на его страницу (permalink)
- **AND** под заголовком отображаются метаданные поста (дата и пр.)
### Requirement: Заголовок и описание страницы
Система SHALL отображать на странице /posts/ заголовок «Архив» и описание
страницы (из frontmatter секции).
#### Scenario: Заголовок страницы
- **WHEN** пользователь открывает страницу /posts/
- **THEN** заголовок страницы — «Архив»
### Requirement: Сохранение остальной функциональности секции
Система SHALL сохранять работоспособность RSS-ленты секции /posts/ и URL
постов (permalinks не меняются) при переключении layout на архив.
#### Scenario: RSS секции не сломан
- **WHEN** пользователь запрашивает RSS-ленту секции /posts/ (index.xml)
- **THEN** лента валидна и содержит посты секции
#### Scenario: Permalinks постов не меняются
- **WHEN** пользователь открывает пост из архива
- **THEN** URL поста соответствует permalink /:year/:slug/ (как и раньше)
@@ -0,0 +1,10 @@
# Tasks: Archive by Year/Month
- [x] Создать `content/posts/_index.md` с frontmatter: title "Архив", description, layout: archives
- [x] `make build` (hugo --minify) — без ошибок
- [x] Проверить `public/posts/index.html`: есть `.archive-year` и `.archive-month`, посты сгруппированы по годам/месяцам, title "Архив"
- [x] Убедиться, что пагинация/плоский список (post-entry) на /posts/ исчезла
- [x] Проверить RSS секции /posts/ (index.xml) — не сломан
- [x] `openspec validate archive-by-year-month` — чисто
- [x] Commit + push gitea main — деплой через Gitea Actions (deploy.yml); замер №1: run создан 16:54:19Z, прод виден 17:30:20Z (~36 мин)
- [x] Прогнать openspec-archive-change (архивировать change после деплоя) — архив 2026-09-25