Initial commit
This commit is contained in:
commit
c534d5ce80
163 files changed
+11500
No files matched your search
@@ -0,0 +1,42 @@
|
||||
# Модуль: Сборка документа
|
||||
|
||||
**Ответственность**: выполняет use case «собрать документ» в фиксированном порядке от пользовательских параметров до вызова renderer.
|
||||
**Расположение**: `.template/lib/application/render-document.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `render-document()` | функция | Оркестрирует resolve company → normalize → validate → create context → render |
|
||||
| `resolve-profile()` | функция | Проверяет и нормализует встроенный или пользовательский `DocumentProfile` |
|
||||
| `build-context()` | функция | Создаёт итоговый `DocumentContext` из валидированных частей |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `.template/lib/domain/document.typ` | Контракт профиля, context и render options |
|
||||
| `.template/lib/domain/company.typ` | Валидацию CompanyProfile |
|
||||
| `.template/lib/domain/parties.typ` | Валидацию сторон и подписантов |
|
||||
| `.template/lib/domain/attachments.typ` | Валидацию приложений |
|
||||
| `.template/lib/infrastructure/company-assets.typ` | Загрузку компании только если передан строковый id |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- Renderer никогда не вызывается до завершения всех validators.
|
||||
- Строковый `company` разрешается infrastructure-адаптером; готовый `CompanyProfile` повторно не загружается.
|
||||
- Порядок normalize и validate одинаков для всех профилей.
|
||||
- Application не содержит `if profile.id == "report"` или другой profile-specific логики.
|
||||
- `body` передаётся renderer без изменения пользовательского content.
|
||||
- Ошибка содержит stage: `resolve-company`, `normalize-profile`, `validate-domain` или `render`.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Page layout и show rules.
|
||||
- Чтение пользовательского `assets/`.
|
||||
- Юридическую проверку содержимого.
|
||||
- Запуск Typst compiler или запись PDF на диск.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Этот модуль должен оставаться коротким и скучным: его ценность — стабильный pipeline. Если новая возможность требует ветвления по профилю, добавьте её в profile contract или domain service. Infrastructure подключается как адаптер только для удобного строкового company id.
|
||||
@@ -0,0 +1,42 @@
|
||||
# Модуль: Рабочее пространство автора
|
||||
|
||||
**Ответственность**: предоставляет один понятный входной файл и отделяет пользовательский текст от реализации.
|
||||
**Расположение**: `main.typ`, `chapters/`, `assets/`, `docs/`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Элемент | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `main.typ` | entrypoint | Компания, режим, metadata, ресурсы и порядок `#include` |
|
||||
| `document-mode` | строка | `final`, `draft` или `clean-copy` |
|
||||
| `chapters/` | каталог | Текстовые разделы документа |
|
||||
| `assets/` | каталог | Рисунки, CSV/TSV, bibliography и другие материалы |
|
||||
| `docs/` | каталог | Публичная справка и компилируемые примеры |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `.template/lib/index.typ` | Единственный Typst facade import |
|
||||
| `chapters/*.typ` | Явно перечисленное содержимое |
|
||||
| `assets/*` | Пользовательские paths |
|
||||
| `.private/settings.typ` | Только при явном `use-private-assets = true` |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- В корне существует только один Typst entrypoint `main.typ`.
|
||||
- Все ежедневные параметры и порядок глав видны в одном файле.
|
||||
- Режимы не представлены отдельными файлами.
|
||||
- `docs/` не скрыт настройками VS Code.
|
||||
- Автор не обязан открывать `.template/` для первого PDF.
|
||||
- Generated PDF и `.private/` не попадают в Git.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Layout renderer и profile validation.
|
||||
- Разработку нового вида документа.
|
||||
- Хранение настоящих подписей.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Корень является пользовательским интерфейсом. Новый обязательный параметр добавляйте в `main.typ` и public examples с вариантом в комментарии. Не создавайте дополнительный entrypoint ради режима сборки.
|
||||
@@ -0,0 +1,55 @@
|
||||
# Модуль: Компоненты
|
||||
|
||||
**Ответственность**: содержит проверенные переиспользуемые визуальные примитивы, которые не принадлежат одному профилю документа.
|
||||
**Расположение**: `.template/lib/presentation/components.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `corp-table()` | функция | Корпоративная таблица со сложной шапкой, spans и продолжениями |
|
||||
| `formula()` | функция | Блочная формула, совместимая с профильной нумерацией |
|
||||
| `info-block()` | функция | Цветная информационная плашка для замечаний и пояснений |
|
||||
| `signature-block()` | функция | Один подписант с media policy |
|
||||
| `multi-party-signing()` | функция | Подписание несколькими сторонами |
|
||||
| `approval-block()` | функция | Блок утверждения отчёта |
|
||||
| `company-footer()` | функция | Контакты и реквизиты организации в footer |
|
||||
| `letter-header()` | функция | Общая геометрия исходящего письма и ТКП |
|
||||
| `attachment-list()` | функция | Перечень приложений к письму или ТКП |
|
||||
| `requisites-table()` | функция | Реквизиты одной или нескольких сторон |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `.template/lib/domain/company.typ` | Нормализованные реквизиты и brand |
|
||||
| `.template/lib/domain/parties.typ` | Signer, Approval и Party |
|
||||
| `.template/lib/domain/attachments.typ` | AttachmentSet для перечней |
|
||||
| `.template/lib/presentation/foundation.typ` | Design tokens и `render-media-slot()` |
|
||||
| `.template/lib/shared/numbering.typ` | Общие numbering functions |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- Компонент не читает JSON и не конструирует пользовательский path.
|
||||
- Компонент не определяет global page settings.
|
||||
- `corp-table` сохраняет поддержку auto/multirow headers, rowspan/colspan, repeat header и continuation label.
|
||||
- `corp-table.list-layout` локально задаёт геометрию списков в ячейках; `auto` сохраняет оформление документа, а параметры конкретного списка имеют приоритет.
|
||||
- `row_breakable: true` действительно передаётся в `table.cell(breakable:)`; режим проверяется fixture с одной строкой, которая продолжается на трёх страницах.
|
||||
- Центрирование блока `corp-table` не наследуется текстом ячеек: шапка по умолчанию центрирована, тело выровнено влево; явный `align` имеет приоритет.
|
||||
- Блок подписи сохраняет эталонную геометрию для обычных реквизитов и переключается на ограниченные равные боковые колонки при длинных наименованиях.
|
||||
- Письмо и ТКП используют один эталонный footer; на страницах приложений footer скрывается.
|
||||
- Обязательный positional `body` идёт первым в функциях, используемых через `.with`, если это требуется Typst.
|
||||
- Компонент принимает domain-значение и layout options отдельно.
|
||||
- Любая работа с изображением проходит через media slot или проверку `resource != none`.
|
||||
- Компоненты не импортируют profile renderers.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Полный жизненный цикл документа.
|
||||
- Profile-specific обязательность полей.
|
||||
- Выбор компании по id.
|
||||
- Сброс глобальных counters между главами.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> `corp_table` считается особо хрупким: не переписывайте рекурсивное определение header rows без unit и visual fixtures на rowspan/colspan. Общность компонента доказывается использованием хотя бы в двух профилях; иначе оставьте его внутри конкретного renderer. Layout offsets изображений должны быть параметрами компонента или design tokens, но не данными Signer.
|
||||
@@ -0,0 +1,41 @@
|
||||
# Модуль: Приложения
|
||||
|
||||
**Ответственность**: задаёт идентичность, порядок, заголовки и нумерацию приложений независимо от профиля и конкретной вёрстки.
|
||||
**Расположение**: `.template/lib/domain/attachments.typ`
|
||||
|
||||
Модель используется письмами, ТКП и договорами. Отчётные приложения подключаются отдельными файлами через параметр `report.appendices`, потому что их заголовок и label должны находиться внутри авторского файла.
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `attachment()` | конструктор dictionary | Создаёт приложение с `id`, `title`, `subtitle`, `body`, `numbering` |
|
||||
| `attachment-set()` | конструктор dictionary | Нормализует массив приложений и общую политику нумерации |
|
||||
| `validate-attachments()` | функция | Проверяет уникальность ids, номеров и допустимость body |
|
||||
| `attachment-label()` | чистая функция | Формирует семантическое обозначение без layout |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `.template/lib/shared/numbering.typ` | Стратегии арабской и кириллической нумерации как чистые функции |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- `id` приложения уникален и пригоден для label.
|
||||
- Порядок массива является порядком документа, если пользователь явно не задал sort key.
|
||||
- Номер не хранится одновременно как вычисляемый и вручную заданный без явной override-policy.
|
||||
- `body` является content или функцией, которую renderer вызывает в локальном контексте.
|
||||
- Заголовок обязателен; subtitle необязателен.
|
||||
- Приложение не меняет global counter вне вызова своего renderer.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Размещение pagebreak и заголовка приложения.
|
||||
- Физическое объединение внешних PDF.
|
||||
- Подсчёт страниц вложения до компиляции.
|
||||
- Profile-specific текст «Приложение к договору».
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Старые `make_appendices` и `appendix-header` решают presentation-задачи и не переносятся в domain. Domain должен одинаково поддерживать кириллические приложения отчёта, цифровые приложения ТКП и именованные приложения договора. Renderer выбирает display policy на основе profile metadata.
|
||||
@@ -0,0 +1,39 @@
|
||||
# Модуль: Организация
|
||||
|
||||
**Ответственность**: описывает единый нормализованный профиль юридического лица и его фирменных ресурсов.
|
||||
**Расположение**: `.template/lib/domain/company.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `company-profile()` | конструктор dictionary | Создаёт профиль из секций `legal`, `contacts`, `banking`, `brand`, `director`, `resources` |
|
||||
| `validate-company()` | функция | Проверяет обязательные реквизиты и типы необязательных полей |
|
||||
| `company-display-name()` | чистая функция | Возвращает полное или краткое наименование по политике профиля |
|
||||
| `company-resource()` | чистая функция | Возвращает нормализованное значение ресурса из уже построенного profile |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| Нет | Domain не читает JSON и не строит пути |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- `id`, полное наименование и юрисдикция заданы.
|
||||
- ИНН/КПП/ОГРН и БИН/КБЕ хранятся как строки, чтобы не терять ведущие нули и формат.
|
||||
- Контактные и банковские поля имеют единые ключи для всех компаний; неприменимое поле равно `none`.
|
||||
- Brand color нормализован до color до передачи renderer.
|
||||
- Логотип, подпись и печать имеют значение `none`, `path` или готовый content; произвольная строка после infrastructure-нормализации не допускается.
|
||||
- Director содержит должность и ФИО; ресурсы подписи и печати хранятся отдельно и не задают координаты на странице.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Поиск компании по содержимому документа.
|
||||
- Чтение `.template/companies/` и `.private/`.
|
||||
- Отрисовку логотипа, подписи, печати и реквизитов.
|
||||
- Валидацию законодательства конкретной юрисдикции.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Существующие JSON-файлы отличаются по набору полей. Нормализуйте их через infrastructure, не добавляйте условные ключи в renderer. Для РФ и Казахстана используйте общую структуру с `none` для неприменимых идентификаторов. Не переносите пользовательские изображения в CompanyProfile.
|
||||
@@ -0,0 +1,40 @@
|
||||
# Модуль: Документ
|
||||
|
||||
**Ответственность**: владеет общей моделью документа, контрактом расширяемого профиля и режимами выпуска независимо от Typst-вёрстки.
|
||||
**Расположение**: `.template/lib/domain/document.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `document-context()` | конструктор dictionary | Создаёт полный неизменяемый контекст после нормализации и валидации |
|
||||
| `document-profile()` | конструктор dictionary | Создаёт контракт профиля с `id`, `metadata`, `normalize`, `validate`, `render` |
|
||||
| `render-options()` | конструктор dictionary | Нормализует режим выпуска, watermark и media policy |
|
||||
| `validate-profile-contract()` | функция | Проверяет, что расширение содержит все обязательные функции и поля |
|
||||
| `merge-known()` | чистая функция | Объединяет defaults с пользовательскими значениями по явным правилам |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| Нет | Модуль не импортирует infrastructure или presentation |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- `DocumentProfile.id` — непустая стабильная строка.
|
||||
- `normalize`, `validate` и `render` являются functions.
|
||||
- Режим выпуска принадлежит конечному набору `final`, `draft`, `clean-copy`.
|
||||
- `DocumentContext` создаётся только после успешной валидации company, profile metadata, parties и attachments.
|
||||
- Domain-значения не содержат вызовов `page`, `image`, `place`, `context`, `query` или глобального `state`.
|
||||
- Merge не принимает неизвестные ключи молча: профиль либо объявляет extension bucket, либо возвращает ошибку.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Загрузку компании из JSON.
|
||||
- Пагинацию и выбор шрифта.
|
||||
- Физическое наличие файлов.
|
||||
- Состав обязательных полей конкретного отчёта или договора.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> `DocumentProfile` — основной extension contract. Не превращайте его в строковый enum со switch в application. Renderer-function является портом presentation, переданным профилем. Для простого пользователя profile constructors скрывают этот контракт; вручную он нужен только разработчику нового вида документа.
|
||||
@@ -0,0 +1,40 @@
|
||||
# Модуль: Стороны
|
||||
|
||||
**Ответственность**: моделирует адресатов, стороны договора, представителей, подписантов и блоки утверждения независимо от их размещения.
|
||||
**Расположение**: `.template/lib/domain/parties.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `party()` | конструктор dictionary | Создаёт организацию или физическое лицо в роли стороны документа |
|
||||
| `recipient()` | конструктор dictionary | Создаёт адресата делового письма или ТКП |
|
||||
| `signer()` | конструктор dictionary | Создаёт подписанта с должностью, ФИО, основанием и ресурсом подписи |
|
||||
| `approval()` | конструктор dictionary | Создаёт данные блока утверждения отчёта |
|
||||
| `validate-parties()` | функция | Проверяет уникальность ролей и профильные обязательные поля |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `.template/lib/domain/company.typ` | Может принять нормализованный `CompanyProfile` как сторону, не загружая его |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- Каждая сторона имеет уникальный `id` внутри документа и непустую `role`.
|
||||
- Recipient допускает отдельно организацию, должность и имя; пустые строки нормализуются в `none`.
|
||||
- Signer хранит семантические данные и ресурс, но не layout offsets.
|
||||
- Contract-party содержит реквизиты либо ссылку на `CompanyProfile`, но не оба источника с конфликтующими значениями.
|
||||
- Approval date и document date являются разными полями и не подменяют друг друга.
|
||||
- Обязательность подписи определяется профилем и режимом выпуска, а не самим `Signer`.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Координаты и размеры изображений подписи.
|
||||
- Текст преамбулы договора.
|
||||
- Склонение ФИО и должностей.
|
||||
- Загрузку реквизитов из файлов.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Письмо, ТКП и договор должны использовать одинаковые базовые Party/Signer, но разные validators. Не добавляйте коммерческие поля в recipient и report-specific approval в party. Если понадобится склонение, создайте отдельный domain service, а не набор условий внутри renderer.
|
||||
@@ -0,0 +1,48 @@
|
||||
# Модуль: Публичный фасад
|
||||
|
||||
**Ответственность**: предоставляет `main.typ` и публичным примерам стабильный API, скрывая внутренние DDD-слои и файловую структуру.
|
||||
**Расположение**: `.template/lib/index.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `document()` | show-функция | Собирает документ из явно переданных `company`, `profile`, `options` и `body` |
|
||||
| `profiles` | module namespace | Конструкторы `report`, `letter`, `commercial_offer`, `contract` |
|
||||
| `components` | module namespace | Поддерживаемые визуальные компоненты для пользовательского content |
|
||||
| `references` | module namespace | `vref`, `vrefs`, `eqref` и bibliography helpers |
|
||||
| `load-company()` | функция | Загружает публичный профиль и применяет явные resource overrides |
|
||||
| `report-executor()` | функция | Разрешает сотрудника, роль, private PNG и offset |
|
||||
| `private-company-media()` | функция | Разрешает private подпись и печать организации |
|
||||
| `document-profile()` | конструктор dictionary | Extension contract для нового вида документа |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `.template/lib/application/render-document.typ` | Единственный application use case |
|
||||
| `.template/lib/presentation/profiles/*.typ` | Публичные profile constructors |
|
||||
| `.template/lib/presentation/components.typ` | Разрешённый пользовательский набор компонентов |
|
||||
| `.template/lib/presentation/references.typ` | Публичные helpers ссылок |
|
||||
| `.template/lib/infrastructure/company-assets.typ` | Загрузка профилей компаний |
|
||||
| `.template/lib/infrastructure/employees.typ` | Справочник сотрудников и private settings adapter |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- `main.typ` и public examples используют один import фасада и не знают внутренних путей.
|
||||
- В фасаде нет чтения пользовательских глав, page layout и profile-specific ветвлений.
|
||||
- Добавление нового профиля не меняет сигнатуру `document()`.
|
||||
- Resource override принимает явные `none`, `path` или content и не сканирует `.private/`.
|
||||
- В namespaces экспортируются только документированные символы.
|
||||
- В diagnostics используется бренд Scientia.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Включение пользовательских файлов из `chapters/`.
|
||||
- Создание пользовательских paths к `assets/`.
|
||||
- Выбор типа документа и режима выпуска.
|
||||
- Юридическую или смысловую проверку текста.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Фасад является границей между пользовательским `main.typ` и библиотекой. Если public example импортирует domain, infrastructure или конкретный renderer напрямую, фасад недостаточен. Обратная совместимость со старым корневым `template.typ` не требуется; не создавайте alias в корне.
|
||||
@@ -0,0 +1,41 @@
|
||||
# Модуль: Ресурсы компаний
|
||||
|
||||
**Ответственность**: читает публичные данные `.template/companies/`, нормализует JSON, создаёт устойчивые Typst paths и применяет явные overrides подписи и печати.
|
||||
**Расположение**: `.template/lib/infrastructure/company-assets.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `load-company()` | функция | Загружает профиль по разрешённому id и принимает `logo`, `signature`, `stamp` overrides |
|
||||
| `available-companies()` | функция | Возвращает детерминированный список встроенных ids |
|
||||
| `merge-resources()` | чистая функция | Применяет только явно переданные resource overrides |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `.template/lib/domain/company.typ` | `company-profile()` и `validate-company()` |
|
||||
| `.template/companies/*/data.json` | Публичные реквизиты организаций |
|
||||
| `.template/companies/*/logo.*` | Публичные логотипы |
|
||||
| `.template/lib/assets/placeholders/` | Безопасные круг и крест |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- Адаптер не сканирует `assets/` или `.private/`.
|
||||
- Относительные внутренние paths создаются в infrastructure-файле.
|
||||
- Private paths организаций создаются адаптером сотрудников из явной настройки и передаются как готовые `path`.
|
||||
- Идентификатор компании выбирается из явного registry.
|
||||
- Публичные JSON не содержат путей к реальным подписям и печатям.
|
||||
- `none` сохраняется как отсутствие ресурса и обрабатывается media policy.
|
||||
- Указанный override не подменяется placeholder при ошибке загрузки.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Layout логотипа, подписи или печати.
|
||||
- Поиск файлов по имени.
|
||||
- Сетевую загрузку реквизитов.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Typst `path` сохраняет контекст файла, в котором создан. Public company paths создавайте здесь, а absolute `.private/` paths — только в private/employee adapter. Значения `auto` и `none` должны различаться: `auto` означает взять публичное значение профиля, `none` — осознанно применить media policy.
|
||||
@@ -0,0 +1,44 @@
|
||||
# Модуль: Настраиваемые списки
|
||||
|
||||
**Ответственность**: формирует многоуровневые номера и маркеры, сохраняя нативную вёрстку `enum`.
|
||||
**Расположение**: `.template/lib/presentation/lists.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `bullet-list()` | function | Локально применяет геометрию к стандартному маркированному списку |
|
||||
| `numbered-list()` | function | Локально применяет схему и геометрию к стандартному нумерованному списку |
|
||||
| `list-scheme()` | constructor | Создаёт проверенную конфигурацию уровней, разделителей и окончаний |
|
||||
| `list-level()` | constructor | Описывает нестандартный уровень, включая prefix, suffix и width |
|
||||
| `list-numbering()` | function factory | Возвращает функцию нумерации для прямого использования в `enum` |
|
||||
| `list-schemes` | dictionary | Хранит публичные готовые схемы |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- Модуль не заменяет `enum`: переносы страниц, вложенность и многоабзацные элементы остаются ответственностью Typst.
|
||||
- Внутренне `enum.full` всегда включён, чтобы форматтер знал глубину; показ родительских уровней определяет `scheme.full`.
|
||||
- Если массив levels, separators или suffixes короче глубины, повторяется его последнее значение.
|
||||
- Неизвестная именованная схема вызывает понятную ошибку и не подменяется схемой по умолчанию.
|
||||
- Режимы `normal`, `compact` и `flush` меняют только геометрию; `auto` наследует окружающий стиль.
|
||||
- Локальные параметры `bullet-list` и `numbered-list` не должны менять списки за пределами переданного body.
|
||||
|
||||
## Поддерживаемые обозначения
|
||||
|
||||
- арабские числа: `1`;
|
||||
- арабские числа с ведущим нулём: `01` или `list-level("1", width: N)`;
|
||||
- римские числа: `I`, `i`;
|
||||
- латинские буквы: `A`, `a`;
|
||||
- кириллица по ГОСТ: `А`, `а`;
|
||||
- любой строковый или content-маркер;
|
||||
- пользовательская функция `value => content`.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- собственную раскладку строк и переносы страниц;
|
||||
- скрытое глобальное продолжение счётчика между несвязанными списками;
|
||||
- автоматический выбор схемы по содержимому текста.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Не заменяйте нативный `enum` ручной сеткой или таблицей. Это ухудшит переносы, семантику документа и поддержку многоабзацных пунктов. Новые возможности добавляйте через форматирование массива родительских номеров и локальные set/show rules.
|
||||
@@ -0,0 +1,40 @@
|
||||
# Модуль: Нумерация
|
||||
|
||||
**Ответственность**: предоставляет чистые стратегии арабской, многоуровневой и кириллической нумерации без управления counters конкретного профиля.
|
||||
**Расположение**: `.template/lib/shared/numbering.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `cyrillic-numbering()` | чистая функция | Преобразует положительный номер в допустимую заглавную кириллическую букву |
|
||||
| `cyrillic-lower-numbering()` | чистая функция | Формирует строчную кириллическую часть списка |
|
||||
| `num-11()` | чистая функция | Формирует многоуровневый формат `1.1.` |
|
||||
| `num-1a()` | чистая функция | Чередует цифровые и кириллические уровни с наследованием |
|
||||
| `num-1-a()` | чистая функция | Чередует уровни без полного наследования родителей |
|
||||
| `attachment-numbering()` | чистая функция | Выбирает арабское или кириллическое обозначение из policy |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| Нет | Модуль состоит из чистых функций и неизменяемых массивов символов |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- Исключённые ГОСТ-буквы не используются в кириллической последовательности.
|
||||
- Ноль и отрицательные значения не маскируются неявным fallback, несовместимым с будущими версиями Typst.
|
||||
- Функции не читают counters самостоятельно и форматируют только переданные числа.
|
||||
- Один и тот же вход всегда возвращает одинаковую строку.
|
||||
- Profile renderer управляет reset и scope counters, а не shared-модуль.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Сброс counters при новой главе.
|
||||
- Выбор numbering policy конкретного документа.
|
||||
- Формат заголовка приложения и supplement.
|
||||
- Локализацию на другие языки.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Typst 0.15 предупреждает о fallback для numbering systems, которые не умеют отображать ноль. Добавьте явные негативные unit tests. Сохраните существующие варианты `num_11`, `num_1a`, `num_1_a` семантически, но публичные имена можно унифицировать, поскольку обратная совместимость не требуется.
|
||||
@@ -0,0 +1,43 @@
|
||||
# Модуль: Технико-коммерческое предложение
|
||||
|
||||
**Ответственность**: формирует ТКП как самостоятельный профиль с предметом, ценой, сроками, коммерческими условиями и приложениями.
|
||||
**Расположение**: `.template/lib/presentation/profiles/commercial-offer.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `commercial-offer-profile()` | конструктор `DocumentProfile` | Принимает адресата, предмет, стоимость, валюту, сроки и validity |
|
||||
| `render-commercial-offer()` | renderer-функция | Собирает шапку, резюме предложения, body, условия, подпись и приложения |
|
||||
| `commercial-terms()` | domain-normalizer | Нормализует цену, НДС, валюту, срок и порядок оплаты |
|
||||
| `commercial-offer-validators()` | массив functions | Проверяет предмет и обязательные коммерческие поля |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `.template/lib/domain/document.typ` | `DocumentProfile` и context |
|
||||
| `.template/lib/domain/parties.typ` | Recipient и Signer |
|
||||
| `.template/lib/domain/attachments.typ` | Календарный план, ТЗ и другие приложения |
|
||||
| `.template/lib/presentation/foundation.typ` | Typography, page и media policy |
|
||||
| `.template/lib/presentation/components.typ` | Letter shell, money/date blocks, company footer, signature block |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- ТКП имеет собственный `profile.id` и renderer, а не boolean-режим письма.
|
||||
- Стоимость хранится структурированно: amount, currency, tax note; renderer не разбирает свободную строку.
|
||||
- Срок выполнения и срок действия предложения являются разными полями.
|
||||
- Приложения используют общий AttachmentSet и могут иметь цифровую нумерацию.
|
||||
- Коммерческие defaults принадлежат constructor, но пользователь может заменить текстовые формулировки через content slots.
|
||||
- Renderer не импортирует внешний `G:/TYPST/TKP` и не читает его config.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Расчёт стоимости из сметы.
|
||||
- Юридическую проверку налоговой формулировки.
|
||||
- Автоматическое превращение ТКП в договор.
|
||||
- Специфические главы научного отчёта.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Используйте TKP только как контекст сценариев и визуальную подсказку. Не копируйте монолитный facade. Если уникальная иконка действительно нужна, перенесите её в `.template/lib/assets/icons/` и дайте ей семантическое имя. Таблицы календарного плана должны использовать общий `corp-table`, а не локальную реализацию.
|
||||
@@ -0,0 +1,44 @@
|
||||
# Модуль: Договор
|
||||
|
||||
**Ответственность**: предоставляет расширяемый каркас договора с преамбулой, произвольными разделами, сторонами, реквизитами, подписанием и приложениями.
|
||||
**Расположение**: `.template/lib/presentation/profiles/contract.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `contract-profile()` | конструктор `DocumentProfile` | Принимает номер, дату, место, название, стороны и section options |
|
||||
| `render-contract()` | renderer-функция | Собирает header, preamble slot, body sections, requisites, signing и attachments |
|
||||
| `contract-section()` | конструктор dictionary | Описывает нумерованный или именованный раздел с body |
|
||||
| `contract-validators()` | массив functions | Проверяет стороны, номера, даты и уникальность sections |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `.template/lib/domain/document.typ` | `DocumentProfile` и context |
|
||||
| `.template/lib/domain/parties.typ` | Contract parties, representatives и signers |
|
||||
| `.template/lib/domain/attachments.typ` | Приложения и спецификации |
|
||||
| `.template/lib/presentation/foundation.typ` | Base typography и signing-copy mode |
|
||||
| `.template/lib/presentation/components.typ` | Requisites table, multi-party signing, tables и numbering primitives |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- В v1 поддерживается не менее двух сторон; модель не зашита строго на роли «Заказчик/Исполнитель».
|
||||
- Section id и display number уникальны.
|
||||
- Юридический текст sections остаётся пользовательским content.
|
||||
- Preamble можно передать content или собрать из сторон через явный helper; автоматический текст не является юридической гарантией.
|
||||
- Requisites берутся из Party/CompanyProfile, а не дублируются внутри renderer.
|
||||
- Signing-copy может резервировать место без реальных изображений подписи и печати.
|
||||
- Приложения используют тот же AttachmentSet, что отчёт и ТКП.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Юридическую достаточность и актуальность условий.
|
||||
- Электронную подпись и криптографию.
|
||||
- Согласование версий договора и tracked changes.
|
||||
- Автоматическую генерацию актов, счетов или УПД.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Не превращайте contract-profile в библиотеку юридических формулировок. Профиль отвечает за типографику и композицию. Чтобы будущие лицензионные, сервисные или смешанные договоры не требовали изменения renderer, sections должны быть открытым массивом с устойчивой numbering policy.
|
||||
@@ -0,0 +1,41 @@
|
||||
# Модуль: Основа вёрстки
|
||||
|
||||
**Ответственность**: предоставляет общие design tokens, режимы выпуска и безопасные presentation-примитивы без правил конкретного вида документа.
|
||||
**Расположение**: `.template/lib/presentation/foundation.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `design-tokens()` | конструктор dictionary | Шрифты, размеры, цвета, интервалы и стандартные поля страницы |
|
||||
| `apply-foundation()` | show-функция | Применяет локальные общие text/par/page defaults к body renderer |
|
||||
| `render-media-slot()` | функция | Отображает ресурс по policy `hide`, `placeholder`, `reserve-space` |
|
||||
| `render-mode()` | чистая функция | Нормализует `final`, `draft`, `clean-copy` |
|
||||
| `watermark-layer()` | функция | Создаёт слой watermark без изменения domain данных |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `.template/lib/domain/document.typ` | `RenderOptions` и режим выпуска |
|
||||
| `.template/lib/domain/company.typ` | Brand color и нормализованные ресурсы |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- Foundation не знает, является документ отчётом, письмом, ТКП или договором.
|
||||
- Общие defaults локальны body, не протекают в следующий независимый renderer.
|
||||
- `render-media-slot()` никогда не вызывает `image(none)`.
|
||||
- Размер placeholder и reserve-space задаётся вызывающим компонентом, чтобы не ломать профильную геометрию.
|
||||
- Watermark не влияет на layout flow и счётчики.
|
||||
- Внутри module scope не создаётся state, общий для нескольких документов.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Титульный лист отчёта.
|
||||
- Шапку письма и реквизиты договора.
|
||||
- Нумерацию приложений конкретного профиля.
|
||||
- Загрузку файлов и JSON.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Typst 0.15 изменил baseline у `box` и `block`; любые правки foundation требуют visual regression всех профилей. Не переносите сюда profile-specific отступ только потому, что он встречается в двух документах: сначала проверьте, является ли это действительно общим design token.
|
||||
@@ -0,0 +1,43 @@
|
||||
# Модуль: Деловое письмо
|
||||
|
||||
**Ответственность**: формирует исходящее деловое письмо с адресатом, регистрационными данными, темой, основным текстом и подписанием.
|
||||
**Расположение**: `.template/lib/presentation/profiles/letter.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `letter-profile()` | конструктор `DocumentProfile` | Принимает дату, исходящий номер, адресата, тему и signing options |
|
||||
| `render-letter()` | renderer-функция | Собирает фирменную шапку, body, подпись и footer |
|
||||
| `letter-metadata()` | чистая функция | Нормализует регистрационные поля и тему |
|
||||
| `letter-validators()` | массив functions | Проверяет адресата, дату и подписанта |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `.template/lib/domain/document.typ` | `DocumentProfile` и render options |
|
||||
| `.template/lib/domain/parties.typ` | Recipient и Signer |
|
||||
| `.template/lib/domain/attachments.typ` | Перечень приложений к письму |
|
||||
| `.template/lib/presentation/foundation.typ` | Общие tokens и media policy |
|
||||
| `.template/lib/presentation/components.typ` | Letter header, company footer, attachment list, signature block |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- Letter profile не содержит коммерческой стоимости, графика работ или offer validity.
|
||||
- Recipient может быть частично заполнен, но validator требует хотя бы организацию или ФИО.
|
||||
- Исходящий номер и дата отображаются единым регистрационным блоком.
|
||||
- Footer включается profile option и не исчезает из-за состояния приложения другого документа.
|
||||
- Подпись, печать и место для ручного подписания obey media policy.
|
||||
- Renderer не импортирует report или commercial-offer profile.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Коммерческие условия ТКП.
|
||||
- Титул и содержание отчёта.
|
||||
- Разделы договора.
|
||||
- Регистрацию письма во внешней системе.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Внешний проект TKP содержит полезный визуальный референс шапки и footer, но его global `comp-data` и `in-appendix` не переносятся. Состояние footer, если оно понадобится, должно принадлежать только текущему renderer и сбрасываться внутри него. Общая геометрия письма выносится в components, чтобы ТКП переиспользовал её без импорта `render-letter()`.
|
||||
@@ -0,0 +1,48 @@
|
||||
# Модуль: Отчёт
|
||||
|
||||
**Ответственность**: реализует профиль научно-технического отчёта как стартовую заготовку, не влияя на деловые документы.
|
||||
**Расположение**: `.template/lib/presentation/profiles/report.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `report-profile()` | конструктор `DocumentProfile` | Принимает метаданные отчёта и безопасные defaults |
|
||||
| `render-report()` | renderer-функция | Собирает титул, служебные страницы, body, библиографии и приложения |
|
||||
| `report-metadata()` | чистая функция | Нормализует название, тему, договор, этап, том, год и режим исследования |
|
||||
| `report-validators()` | массив functions | Проверяет обязательные поля и совместимость опций |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `.template/lib/domain/document.typ` | `DocumentProfile`, `DocumentContext` |
|
||||
| `.template/lib/domain/parties.typ` | Approval и список исполнителей |
|
||||
| `.template/lib/appendices.typ` | Локальный контекст заголовков, страниц и нумерации файлов приложений |
|
||||
| `.template/lib/presentation/foundation.typ` | Общую страницу, typography и render mode |
|
||||
| `.template/lib/presentation/components.typ` | Title primitives, signature rows, tables, formula |
|
||||
| `.template/lib/presentation/references.typ` | Cross-references и bibliography sections |
|
||||
| `.template/lib/shared/numbering.typ` | Нумерацию глав, фигур, формул и приложений |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- Все report-specific `set/show/state` локальны `render-report()`.
|
||||
- Титульный лист, список исполнителей и содержание независимо включаются параметрами `show_title_page`, `show_executors` и `show_outline`.
|
||||
- `draft/clean-copy` не загружает изображения подписей и печатей при соответствующей media policy.
|
||||
- Отключённая служебная страница не оставляет пустого листа или лишнего разрыва; первая отображаемая страница получает номер 1.
|
||||
- Counters фигур, таблиц и формул сбрасываются только в границах отчётной главы.
|
||||
- `appendices` содержит только уникальные `path`; название и label принадлежат первому заголовку подключённого файла.
|
||||
- Приложения используют собственную стратегию numbering без изменения других profiles; `attachment()` остаётся моделью писем и договоров.
|
||||
- Bibliographies представлены массивом секций; renderer не ограничивает их количество одним `refs.bib`.
|
||||
- Пользовательский body не изменяется и размещается после служебных страниц.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Адресата исходящего письма.
|
||||
- Стоимость и срок действия ТКП.
|
||||
- Стороны и реквизиты договора.
|
||||
- Загрузку компании и пользовательских файлов.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Legacy renderer в `.template/lib/report.typ` является функциональной спецификацией, но его API можно менять. Переносите секции по одной и после каждой сравнивайте snapshots. Сохраните проверенные решения вокруг heading gaps, paragraph indent, continuation tables и executor signatures, пока тест не докажет, что упрощение безопасно.
|
||||
@@ -0,0 +1,33 @@
|
||||
# Модуль: Приватные ресурсы и сотрудники
|
||||
|
||||
**Ответственность**: подключает игнорируемые Git подписи и печати через один переключатель, хранит публичный справочник сотрудников и оставляет пустое место при недоступной подписи.
|
||||
**Расположение**: `.template/lib/infrastructure/employees.typ`, `.template/lib/assets/placeholders/`, `.private/`, `docs/examples/private/settings.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Элемент | Назначение |
|
||||
|---------|------------|
|
||||
| `employee-directory` | ФИО, обычные должности и имена PNG |
|
||||
| `empty-private-settings` | Безопасная конфигурация без private paths |
|
||||
| `private-company-media()` | Возвращает подпись и печать выбранной организации либо `none` |
|
||||
| `report-executor()` | Строит legacy-compatible tuple исполнителя с необязательной подписью |
|
||||
| `.private/settings.typ` | Локальная доступность изображений и индивидуальные offsets |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- При `use-private-assets = false` условный import не читает `.private/settings.typ`.
|
||||
- Включённая запись ссылается только на фиксированное имя из публичного справочника.
|
||||
- Отсутствующая или отключённая запись возвращает `none`, поэтому строка подписи остаётся пустой.
|
||||
- Реальные файлы не заменяют tracked placeholders.
|
||||
- Каталог `.private/` целиком игнорируется Git.
|
||||
- Обычная сборка и private-сборка используют одну VS Code task.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Доставку и шифрование папки `.private`.
|
||||
- Проверку подлинности подписи.
|
||||
- Автоматическую проверку наличия файла внутри Typst 0.15.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Typst не предоставляет безопасный file-exists. Поэтому при ещё не полученной подписи запись должна отсутствовать или иметь `enabled: false`. При добавлении сотрудника синхронно обновите directory, безопасный пример и публичную таблицу.
|
||||
@@ -0,0 +1,49 @@
|
||||
# Модуль: Ссылки и библиографии
|
||||
|
||||
**Ответственность**: предоставляет русскоязычные перекрёстные ссылки и модель одной или нескольких библиографических секций Typst 0.15.
|
||||
**Расположение**: `.template/lib/domain/references.typ`, `.template/lib/presentation/references.typ`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ | Тип | Описание |
|
||||
|--------|-----|----------|
|
||||
| `vref()` | contextual function | Форматирует одну ссылку с падежом для рисунка, таблицы, формулы, раздела или приложения |
|
||||
| `vrefs()` | contextual function | Форматирует массив однородных labels с корректным соединением |
|
||||
| `eqref()` | contextual function | Создаёт ссылку на формулу без лишнего supplement |
|
||||
| `bibliography-section()` | domain constructor | Описывает sources, title, style, target, group и политику переноса |
|
||||
| `render-bibliographies()` | function | Размещает произвольное число секций через нативный `bibliography()` |
|
||||
| `validate-bibliographies()` | function | Проверяет ids, sources, target/group и наличие default coverage policy |
|
||||
|
||||
`vref()` и `vrefs()` по умолчанию используют предложный падеж и прописную первую букву названия объекта. Короткие коды — `"и"`, `"р"`, `"д"`, `"в"`, `"т"`, `"п"`; прежние сокращения и полные русские названия нормализуются во внутренние ключи `"имен"`, `"род"`, `"дат"`, `"вин"`, `"тв"`, `"предл"`. Строчная форма включается явно через `capitalized: false`.
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| Typst `query`, `selector`, `ref`, `cite` | Разрешение labels и citations |
|
||||
| Typst 0.15 `bibliography(target:, group:)` | Несколько списков источников и управление нумерацией |
|
||||
| `.template/lib/domain/document.typ` | Profile metadata и render options |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- Cross-reference label и bibliography citation являются разными типами использования и не смешиваются в одной функции.
|
||||
- `vref` всегда обрабатывает состояние `element == none`, потому что Typst может ещё не обнаружить элемент.
|
||||
- `vref` поддерживает `имен`, `род`, `дат`, `вин`, `тв`, `предл`; неизвестный падеж является ошибкой, а не тихим fallback.
|
||||
- `vrefs` объединяет однородные labels под одной формой множественного числа (`рисунках 1 и 2`, `приложениях А и Б`), смешанные типы форматирует поэлементно.
|
||||
- Заголовок с supplement `Приложение` классифицируется отдельно от обычного раздела и поддерживает все шесть падежей.
|
||||
- Каждая bibliography section имеет стабильный id и хотя бы один source.
|
||||
- Последующие секции по умолчанию начинаются с новой страницы (`page_break: true`), поэтому их заголовки и записи не могут наложиться; компактный режим включается явно.
|
||||
- `target` передаётся как `auto`, label, selector, location или function без преобразования в строку.
|
||||
- `group: none` сбрасывает нумерацию секции; одинаковая строковая группа продолжает нумерацию.
|
||||
- Если используется несколько sections, fixture обязан доказать, что каждая citation попала ровно в одну bibliography.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Редактирование `.bib` и Hayagriva-файлов.
|
||||
- Поиск научных источников.
|
||||
- Ссылки на внешние URL без label.
|
||||
- Автоматическое определение падежа по окружающему тексту.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Typst 0.15 нативно распределяет citations между несколькими bibliographies. Не воспроизводите этот алгоритм вручную. Domain хранит настройки, presentation вызывает built-in и смещает уровень заголовка библиографии по официальной схеме. Добавьте fixtures для поглавных, тематических, общей и раздельной нумерации.
|
||||
@@ -0,0 +1,42 @@
|
||||
# Модуль: Публичные примеры документов
|
||||
|
||||
**Ответственность**: хранит исполняемую документацию четырёх профилей и источник безопасной установки выбранного типа.
|
||||
**Расположение**: `docs/examples/`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Каталог | Назначение |
|
||||
|---------|------------|
|
||||
| `documents/report/` | Полный отчёт с главами, bibliography и appendix |
|
||||
| `documents/letter/` | Деловое письмо |
|
||||
| `documents/commercial-offer/` | Технико-коммерческое предложение |
|
||||
| `documents/contract/` | Договор |
|
||||
| `formatting/` | Каталог рисунков, таблиц, формул, ссылок и списков |
|
||||
| `private/settings.typ` | Безопасный полный пример private settings без PNG |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Модуль | Что использует |
|
||||
|--------|----------------|
|
||||
| `/.template/lib/index.typ` | Только публичный фасад |
|
||||
| `use-starter.ps1` | Backup и копирование примера в корень |
|
||||
| Presentation profiles | Реальный layout каждого вида документа |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- Каждый `main.typ` компилируется непосредственно из своего каталога.
|
||||
- Тот же каталог компилируется после копирования в корень.
|
||||
- Каждый пример явно показывает `company-id`, `document-mode`, `use-private-assets`, profile metadata и media policy.
|
||||
- Public example не зависит от `.template/development/`.
|
||||
- Formatting guide содержит пояснения рядом с копируемыми блоками.
|
||||
- Выбор типа создаёт backup до замены пользовательских файлов.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Обратную совместимость со старыми starters.
|
||||
- Синхронизацию уже изменённого примера с пользовательским fork.
|
||||
- Юридическую корректность демонстрационного договора.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Не создавайте отдельную showcase-копию: публичный пример должен одновременно быть тестовым fixture и источником установки. Изменение API считается завершённым только после обновления всех четырёх `main.typ` и formatting guide.
|
||||
@@ -0,0 +1,44 @@
|
||||
# Модуль: Тестирование
|
||||
|
||||
**Ответственность**: защищает слои библиотеки, единственный root entrypoint, public examples, PDF semantics и визуальную стабильность.
|
||||
**Расположение**: `.template/development/tests/`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Символ или файл | Тип | Описание |
|
||||
|-----------------|-----|----------|
|
||||
| `run-tests.py` | CLI | Полный release gate |
|
||||
| `manifest.json` | fixture manifest | Compile, semantic, negative и visual expectations |
|
||||
| `check_architecture()` | static check | Направление Typst imports |
|
||||
| `check_workspace()` | static check | Root surface, docs, VS Code, private settings и public examples |
|
||||
| `snapshots/` | visual baseline | Утверждённые страницы стабильных renderer fixtures |
|
||||
|
||||
## Зависимости
|
||||
|
||||
| Компонент | Что использует |
|
||||
|-----------|----------------|
|
||||
| Typst 0.15.1+ | Компиляция и PDF generation |
|
||||
| Poppler | Text extraction, links и PNG rendering |
|
||||
| Pillow | Pixel diff snapshots |
|
||||
| `docs/examples/` | Public executable documentation |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- Корень не содержит `document.typ`, `draft.typ` и `clean-copy.typ`.
|
||||
- `docs/` видим и содержит обязательную public navigation.
|
||||
- Все четыре документа и formatting guide компилируются.
|
||||
- Generic profile fixtures проверяют `final`, `draft` и `clean-copy` без root entrypoint duplication.
|
||||
- Безопасный private settings example содержит всех сотрудников с отключёнными PNG.
|
||||
- Unit tests проверяют public directory, private offsets и отсутствие подписи.
|
||||
- Public company profiles не содержат настоящих sign/stamp.
|
||||
- Snapshot изменяется только после ручного visual review.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Юридическую корректность договоров.
|
||||
- Инженерную достоверность example values.
|
||||
- Установку сторонних extensions.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Public example является production-facing documentation: его compile failure блокирует выпуск так же, как regression renderer. Для layout changes сначала просмотрите rendered pages, затем осознанно обновите snapshots.
|
||||
@@ -0,0 +1,38 @@
|
||||
# Модуль: Публичная документация
|
||||
|
||||
**Ответственность**: проводит автора без опыта программирования от открытия fork до проверенного PDF.
|
||||
**Расположение**: `README.md`, `docs/`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Документ | Назначение |
|
||||
|----------|------------|
|
||||
| `README.md` | Краткий обязательный маршрут и все важные ссылки |
|
||||
| `docs/README.md` | Полная пользовательская навигация |
|
||||
| `docs/documents.md` | Один main, режимы, профили, главы и assets |
|
||||
| `docs/formatting.md` | Таблицы, рисунки, формулы и ссылки |
|
||||
| `docs/examples/` | Компилируемые исходники |
|
||||
| `docs/vscode.md` | Расширения, preview и tasks |
|
||||
| `docs/git.md` | Совместная работа простыми словами |
|
||||
| `docs/private-assets.md` | Копирование `.private`, один переключатель, роли и offsets |
|
||||
| `docs/writing-style.md` | Заготовка для редактирования технического текста |
|
||||
| `docs/troubleshooting.md` | Диагностика типовых проблем |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- `docs/` виден в Explorer и находится в корне.
|
||||
- Все обязательные сценарии доступны из root README.
|
||||
- Каждый Typst-фрагмент с нетривиальным API имеет компилируемую версию.
|
||||
- Термины Git объясняются бытовыми аналогиями.
|
||||
- Developer details остаются в `.template/development/`.
|
||||
- Документация не обещает автоматическую установку внутренних VSIX.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- DDD architecture и migration internals.
|
||||
- Обучение программированию.
|
||||
- Администрирование Git-сервера.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Любое новое пользовательское действие сначала появляется в root README, затем раскрывается в `docs/`. Проверяйте относительные Markdown links и компиляцию public examples автоматически.
|
||||
@@ -0,0 +1,34 @@
|
||||
# Модуль: Рабочая область VS Code
|
||||
|
||||
**Ответственность**: синхронизирует воспроизводимую среду автора и предоставляет три понятные задачи.
|
||||
**Расположение**: `.vscode/`, `.template/development/tools/`
|
||||
|
||||
## Публичный интерфейс
|
||||
|
||||
| Файл или задача | Назначение |
|
||||
|-----------------|------------|
|
||||
| `extensions.json` | Десять согласованных recommendations |
|
||||
| `settings.json` | Auto Save, spellcheck, TODO, скрытие служебных каталогов |
|
||||
| `Scientia: собрать PDF` | Компиляция текущего `main.typ` |
|
||||
| `Scientia: выбрать тип документа` | Backup и установка public example |
|
||||
| `Scientia: собрать учебный пример` | Компиляция выбранного исходника из `docs/examples/` |
|
||||
|
||||
## Инварианты
|
||||
|
||||
- `.vscode/` включён в Git, но скрыт в Explorer.
|
||||
- `docs/` никогда не скрыт.
|
||||
- Typewriter navigator содержит только `main.typ`.
|
||||
- Автосохранение не создаёт commit и не выполняет push.
|
||||
- Tasks не хранят приватные значения в tracked settings.
|
||||
- Одна build task собирает и public-, и private-режим согласно `main.typ`.
|
||||
- Внутренние VSIX не входят в репозиторий.
|
||||
|
||||
## Намеренно НЕ обрабатывает
|
||||
|
||||
- Установку VS Code, Git и Typst.
|
||||
- Авторизацию на Git-сервере.
|
||||
- Публикацию внутренних VSIX.
|
||||
|
||||
## Заметки для агента
|
||||
|
||||
> Не добавляйте отдельную build task для каждого режима: пользователь меняет `document-mode` в `main.typ`. Новая задача должна либо быть частой, либо существенно снижать риск потери данных.
|
||||
Reference in new issue
Block a user