@dzhechkov/keysarium 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -3
- package/bin/cli.js +0 -0
- package/package.json +5 -3
- package/templates/.claude/commands/analyst-manual.md +38 -0
- package/templates/.claude/commands/casarium.md +55 -4
- package/templates/.claude/commands/feature-adr.md +8 -0
- package/templates/.claude/rules/trust-tiers.md +5 -0
- package/templates/.claude/shards/feature-adr.shard.md +64 -10
- package/templates/.claude/shards/phase-ai-factory.shard.md +109 -0
- package/templates/.claude/skills/ai-factory-mapper/README.md +90 -0
- package/templates/.claude/skills/ai-factory-mapper/SKILL.md +309 -0
- package/templates/.claude/skills/ai-factory-mapper/assets/report-template.md +123 -0
- package/templates/.claude/skills/ai-factory-mapper/references/catalog.md +230 -0
- package/templates/.claude/skills/ai-factory-mapper/references/coverage-formula.md +219 -0
- package/templates/.claude/skills/ai-factory-mapper/references/decomposition-checklist.md +183 -0
- package/templates/.claude/skills/ai-factory-mapper/references/pattern-library.md +312 -0
- package/templates/.claude/skills/ai-factory-mapper/scripts/build_docx_report.js +423 -0
- package/templates/.claude/skills/analyst-manual-full/SKILL.md +286 -0
- package/templates/.claude/skills/edu-site-generator/SKILL.md +254 -0
- package/templates/.claude/skills/edu-site-generator/examples/sample-course-structure.md +116 -0
- package/templates/.claude/skills/edu-site-generator/modules/00-content-analysis.md +84 -0
- package/templates/.claude/skills/edu-site-generator/modules/01-course-structure.md +75 -0
- package/templates/.claude/skills/edu-site-generator/modules/02-data-generation.md +186 -0
- package/templates/.claude/skills/edu-site-generator/modules/03-scaffold.md +249 -0
- package/templates/.claude/skills/edu-site-generator/modules/04-components.md +130 -0
- package/templates/.claude/skills/edu-site-generator/modules/05-gamification.md +163 -0
- package/templates/.claude/skills/edu-site-generator/modules/06-deploy.md +88 -0
- package/templates/.claude/skills/edu-site-generator/modules/07-verification.md +97 -0
- package/templates/.claude/skills/edu-site-generator/references/component-templates.md +436 -0
- package/templates/.claude/skills/edu-site-generator/references/data-schemas.md +164 -0
- package/templates/.claude/skills/edu-site-generator/references/exercise-catalog.md +110 -0
- package/templates/.claude/skills/edu-site-generator/references/tech-stack.md +69 -0
- package/templates/.claude/skills/feature-adr/SKILL.md +245 -59
- package/templates/.claude/skills/feature-adr/modules/03-adr.md +43 -0
- package/templates/.claude/skills/feature-adr/modules/03.5-ideation-swarm.md +180 -0
- package/templates/.claude/skills/feature-adr/modules/06-implementation-plan.md +56 -7
- package/templates/.claude/skills/feature-adr/modules/08-qe.md +87 -23
- package/templates/.claude/skills/feature-adr/modules/09-fleet-qe.md +305 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/README.md +143 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/brutal-honesty-review.md +240 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/chaos-engineering-resilience.md +163 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/code-goal-planner.md +446 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/enterprise-integration-testing.md +111 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/mutation-testing.md +236 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/performance-testing.md +315 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/qcsd-ideation-swarm.md +126 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/qcsd-production-swarm.md +108 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-coverage-analysis.md +193 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-requirements-validation.md +254 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/regression-testing.md +233 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/risk-based-testing.md +212 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/security-testing.md +311 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/shift-left-testing.md +231 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/tdd-london-chicago.md +249 -0
- package/templates/.claude/skills/transcript-site-generator/SKILL.md +287 -0
- package/templates/.claude/skills/transcript-site-generator/examples/sample-text-only-site.md +123 -0
- package/templates/.claude/skills/transcript-site-generator/examples/sample-transcript-site.md +134 -0
- package/templates/.claude/skills/transcript-site-generator/modules/00-input-analysis.md +132 -0
- package/templates/.claude/skills/transcript-site-generator/modules/01-content-parsing.md +117 -0
- package/templates/.claude/skills/transcript-site-generator/modules/02-site-generation.md +293 -0
- package/templates/.claude/skills/transcript-site-generator/modules/03-interactivity.md +406 -0
- package/templates/.claude/skills/transcript-site-generator/modules/04-deploy.md +130 -0
- package/templates/.claude/skills/transcript-site-generator/modules/05-verification.md +155 -0
- package/templates/.claude/skills/transcript-site-generator/references/component-catalog.md +86 -0
- package/templates/.claude/skills/transcript-site-generator/references/data-schemas.md +123 -0
- package/templates/.claude/skills/transcript-site-generator/references/tech-stack.md +132 -0
- package/templates/CLAUDE.md +9 -2
- package/templates/docs/edu-site-generator/01-deployment-guide.md +911 -0
- package/templates/docs/edu-site-generator/02-admin-guide.md +901 -0
- package/templates/docs/edu-site-generator/03-user-guide.md +1008 -0
- package/templates/docs/edu-site-generator/04-infrastructure-requirements.md +489 -0
- package/templates/docs/edu-site-generator/05-architecture.md +902 -0
- package/templates/docs/edu-site-generator/06-user-flows.md +759 -0
- package/templates/docs/transcript-site-generator/01-deployment-guide.md +1042 -0
- package/templates/docs/transcript-site-generator/02-admin-guide.md +918 -0
- package/templates/docs/transcript-site-generator/03-user-guide.md +925 -0
- package/templates/docs/transcript-site-generator/04-infrastructure-requirements.md +482 -0
- package/templates/docs/transcript-site-generator/05-architecture.md +1068 -0
- package/templates/docs/transcript-site-generator/06-user-flows.md +855 -0
|
@@ -0,0 +1,901 @@
|
|
|
1
|
+
# Руководство администратора @dzhechkov/skills-edu-site
|
|
2
|
+
|
|
3
|
+
Это руководство описывает управление, настройку и обслуживание edu-site skill pack. Предназначено для администраторов, которые управляют компонентами скилла, настраивают пайплайн генерации, конфигурируют типы упражнений, тему оформления, систему достижений и параметры деплоя.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Содержание
|
|
8
|
+
|
|
9
|
+
1. [Управление компонентами](#1-управление-компонентами)
|
|
10
|
+
2. [Конфигурация пайплайна (8 шагов)](#2-конфигурация-пайплайна-8-шагов)
|
|
11
|
+
3. [Конфигурация типов упражнений](#3-конфигурация-типов-упражнений)
|
|
12
|
+
4. [Конфигурация языка (ru/en)](#4-конфигурация-языка-ruen)
|
|
13
|
+
5. [Конфигурация Vite](#5-конфигурация-vite)
|
|
14
|
+
6. [Кастомизация TailwindCSS v4 темы](#6-кастомизация-tailwindcss-v4-темы)
|
|
15
|
+
7. [Конфигурация Zustand store](#7-конфигурация-zustand-store)
|
|
16
|
+
8. [Конфигурация системы достижений](#8-конфигурация-системы-достижений)
|
|
17
|
+
9. [Конфигурация финального теста](#9-конфигурация-финального-теста)
|
|
18
|
+
10. [SEO-конфигурация](#10-seo-конфигурация)
|
|
19
|
+
11. [Оптимизация производительности](#11-оптимизация-производительности)
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 1. Управление компонентами
|
|
24
|
+
|
|
25
|
+
### 1.1. Текущие компоненты
|
|
26
|
+
|
|
27
|
+
После установки edu-site включает следующие компоненты:
|
|
28
|
+
|
|
29
|
+
| Компонент | Путь | Назначение |
|
|
30
|
+
|-----------|------|------------|
|
|
31
|
+
| Edu-Site Skill | `.claude/skills/edu-site-generator/` | Основной оркестратор: загружается командой |
|
|
32
|
+
| SKILL.md | `.claude/skills/edu-site-generator/SKILL.md` | Точка входа, документирует все 8 модулей |
|
|
33
|
+
| Модуль Content Analysis | `.claude/skills/edu-site-generator/modules/01-content-analysis.md` | Анализ входных данных |
|
|
34
|
+
| Модуль Course Structure | `.claude/skills/edu-site-generator/modules/02-course-structure.md` | Планирование структуры курса |
|
|
35
|
+
| Модуль Data Generation | `.claude/skills/edu-site-generator/modules/03-data-generation.md` | Генерация файлов данных |
|
|
36
|
+
| Модуль Scaffold | `.claude/skills/edu-site-generator/modules/04-scaffold.md` | Создание каркаса проекта |
|
|
37
|
+
| Модуль Components | `.claude/skills/edu-site-generator/modules/05-components.md` | Генерация React-компонентов |
|
|
38
|
+
| Модуль Gamification | `.claude/skills/edu-site-generator/modules/06-gamification.md` | Настройка геймификации |
|
|
39
|
+
| Модуль Deploy | `.claude/skills/edu-site-generator/modules/07-deploy.md` | Конфигурация деплоя |
|
|
40
|
+
| Модуль Verification | `.claude/skills/edu-site-generator/modules/08-verification.md` | Верификация проекта |
|
|
41
|
+
| Справочник упражнений | `.claude/skills/edu-site-generator/references/exercise-types.md` | 6 типов упражнений |
|
|
42
|
+
| Паттерны компонентов | `.claude/skills/edu-site-generator/references/component-patterns.md` | React-паттерны |
|
|
43
|
+
| Справочник TailwindCSS v4 | `.claude/skills/edu-site-generator/references/tailwind-v4-guide.md` | TailwindCSS v4 API |
|
|
44
|
+
| Паттерны Zustand | `.claude/skills/edu-site-generator/references/zustand-patterns.md` | State management |
|
|
45
|
+
| Шаблоны достижений | `.claude/skills/edu-site-generator/references/achievement-templates.md` | Шаблоны ачивок |
|
|
46
|
+
| Команда /edu-site | `.claude/commands/edu-site.md` | Полный пайплайн |
|
|
47
|
+
| Правила генерации | `.claude/rules/edu-site-conventions.md` | Автоматически применяемые правила |
|
|
48
|
+
|
|
49
|
+
### 1.2. Проверка компонентов
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Полная диагностика установки
|
|
53
|
+
npx @dzhechkov/skills-edu-site doctor
|
|
54
|
+
|
|
55
|
+
# Листинг установленных файлов
|
|
56
|
+
npx @dzhechkov/skills-edu-site list
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 1.3. Обновление отдельных компонентов
|
|
60
|
+
|
|
61
|
+
Команда `update` обновляет все компоненты из последней версии пакета. Для обновления отдельного файла:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# Шаг 1: просмотрите diff без применения
|
|
65
|
+
npx @dzhechkov/skills-edu-site update --dry-run
|
|
66
|
+
|
|
67
|
+
# Шаг 2: при необходимости скопируйте нужный файл из шаблона пакета
|
|
68
|
+
node -e "console.log(require.resolve('@dzhechkov/skills-edu-site/package.json').replace('package.json', 'templates/'))"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 1.4. Добавление пользовательских расширений
|
|
72
|
+
|
|
73
|
+
Для добавления собственных ссылочных материалов без изменения базовых файлов пакета создайте файлы с уникальными именами:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
.claude/skills/edu-site-generator/references/
|
|
77
|
+
+-- exercise-types.md <- базовый (не изменять)
|
|
78
|
+
+-- component-patterns.md <- базовый
|
|
79
|
+
+-- tailwind-v4-guide.md <- базовый
|
|
80
|
+
+-- zustand-patterns.md <- базовый
|
|
81
|
+
+-- achievement-templates.md <- базовый
|
|
82
|
+
+-- custom-exercise-type.md <- ваш пользовательский файл
|
|
83
|
+
+-- custom-theme-palette.md <- ваш пользовательский файл
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 1.5. Структура скилл-директории
|
|
87
|
+
|
|
88
|
+
Полная структура скилла edu-site-generator:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
.claude/skills/edu-site-generator/
|
|
92
|
+
+-- SKILL.md <- Оркестратор: 8 шагов, зависимости, quick start
|
|
93
|
+
+-- modules/
|
|
94
|
+
| +-- 01-content-analysis.md <- Анализ контента: URL, файлы, текст
|
|
95
|
+
| +-- 02-course-structure.md <- Иерархия секций, порядок изучения
|
|
96
|
+
| +-- 03-data-generation.md <- sections.js, exercises.js, quizQuestions.js, achievements.js
|
|
97
|
+
| +-- 04-scaffold.md <- Vite + React + TailwindCSS v4 + Zustand каркас
|
|
98
|
+
| +-- 05-components.md <- Layout, interactive, common, pages
|
|
99
|
+
| +-- 06-gamification.md <- Zustand store, points, achievements, progress
|
|
100
|
+
| +-- 07-deploy.md <- GitHub Actions, base path, Pages
|
|
101
|
+
| +-- 08-verification.md <- Import check, data validation, build test
|
|
102
|
+
+-- references/
|
|
103
|
+
| +-- exercise-types.md <- 6 типов: Quiz, Flashcards, Matching, DragToOrder, CommandBuilder, ScenarioGame
|
|
104
|
+
| +-- component-patterns.md <- React 19 паттерны, hooks, composition
|
|
105
|
+
| +-- tailwind-v4-guide.md <- v4 syntax, @theme, CSS-first config
|
|
106
|
+
| +-- zustand-patterns.md <- persist, slices, selectors
|
|
107
|
+
| +-- achievement-templates.md <- Шаблоны достижений по категориям
|
|
108
|
+
+-- examples/
|
|
109
|
+
+-- sample-sections.js <- Пример структуры секций
|
|
110
|
+
+-- sample-exercises.js <- Пример упражнений всех 6 типов
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 2. Конфигурация пайплайна (8 шагов)
|
|
116
|
+
|
|
117
|
+
### 2.1. Архитектура пайплайна
|
|
118
|
+
|
|
119
|
+
Edu-site использует линейный 8-шаговый пайплайн. Каждый шаг зависит от результата предыдущего:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
Step 1 Step 2 Step 3 Step 4
|
|
123
|
+
CONTENT -> COURSE -> DATA -> SCAFFOLD
|
|
124
|
+
ANALYSIS STRUCTURE GENERATION (Vite project)
|
|
125
|
+
|
|
126
|
+
Step 5 Step 6 Step 7 Step 8
|
|
127
|
+
COMPONENTS -> GAMIFICATION -> DEPLOY -> VERIFICATION
|
|
128
|
+
(React) (Zustand) (GitHub Pages) (checks)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 2.2. Шаг 1: Content Analysis
|
|
132
|
+
|
|
133
|
+
**Модуль:** `modules/01-content-analysis.md`
|
|
134
|
+
|
|
135
|
+
**Настраиваемые параметры:**
|
|
136
|
+
|
|
137
|
+
| Параметр | Значение по умолчанию | Описание |
|
|
138
|
+
|----------|----------------------|----------|
|
|
139
|
+
| `max_url_depth` | 3 | Глубина обхода ссылок при парсинге URL |
|
|
140
|
+
| `language_detection` | `auto` | Автоопределение языка (`auto`, `ru`, `en`) |
|
|
141
|
+
| `min_content_length` | 500 символов | Минимальная длина контента для анализа |
|
|
142
|
+
| `max_topics` | 20 | Максимальное число тем для извлечения |
|
|
143
|
+
|
|
144
|
+
Для изменения параметров отредактируйте секцию `## Configuration` в `01-content-analysis.md`.
|
|
145
|
+
|
|
146
|
+
### 2.3. Шаг 2: Course Structure
|
|
147
|
+
|
|
148
|
+
**Модуль:** `modules/02-course-structure.md`
|
|
149
|
+
|
|
150
|
+
**Настраиваемые параметры:**
|
|
151
|
+
|
|
152
|
+
| Параметр | Значение по умолчанию | Описание |
|
|
153
|
+
|----------|----------------------|----------|
|
|
154
|
+
| `max_sections` | 8 | Максимальное число секций |
|
|
155
|
+
| `min_exercises_per_section` | 2 | Минимум упражнений в секции |
|
|
156
|
+
| `max_exercises_per_section` | 6 | Максимум упражнений в секции |
|
|
157
|
+
| `difficulty_progression` | `linear` | Нарастание сложности (`linear`, `stepped`) |
|
|
158
|
+
|
|
159
|
+
### 2.4. Шаг 3: Data Generation
|
|
160
|
+
|
|
161
|
+
**Модуль:** `modules/03-data-generation.md`
|
|
162
|
+
|
|
163
|
+
Генерирует 4 JavaScript-файла с данными:
|
|
164
|
+
|
|
165
|
+
| Файл | Содержимое | Формат |
|
|
166
|
+
|------|-----------|--------|
|
|
167
|
+
| `sections.js` | Секции курса с описаниями, иконками | `export const sections = [...]` |
|
|
168
|
+
| `exercises.js` | Упражнения всех 6 типов | `export const exercises = [...]` |
|
|
169
|
+
| `quizQuestions.js` | Вопросы финального теста | `export const quizQuestions = [...]` |
|
|
170
|
+
| `achievements.js` | Достижения с критериями | `export const achievements = [...]` |
|
|
171
|
+
|
|
172
|
+
**Настройка формата данных:**
|
|
173
|
+
|
|
174
|
+
По умолчанию данные экспортируются как ES-модули (`.js` файлы с `export`). Если вам нужен другой формат, отредактируйте секцию `## Output Format` в `03-data-generation.md`.
|
|
175
|
+
|
|
176
|
+
### 2.5. Шаг 4: Scaffold
|
|
177
|
+
|
|
178
|
+
**Модуль:** `modules/04-scaffold.md`
|
|
179
|
+
|
|
180
|
+
Создаёт каркас проекта Vite + React + TailwindCSS v4. Параметры:
|
|
181
|
+
|
|
182
|
+
| Параметр | Значение по умолчанию | Описание |
|
|
183
|
+
|----------|----------------------|----------|
|
|
184
|
+
| `react_version` | `19` | Версия React |
|
|
185
|
+
| `vite_version` | `6` | Версия Vite |
|
|
186
|
+
| `tailwind_version` | `4` | Версия TailwindCSS |
|
|
187
|
+
| `zustand_version` | `5` | Версия Zustand |
|
|
188
|
+
| `router` | `HashRouter` | Тип роутера (HashRouter для GitHub Pages) |
|
|
189
|
+
|
|
190
|
+
### 2.6. Шаг 5: Components
|
|
191
|
+
|
|
192
|
+
**Модуль:** `modules/05-components.md`
|
|
193
|
+
|
|
194
|
+
Генерирует React-компоненты по 4 категориям:
|
|
195
|
+
|
|
196
|
+
| Категория | Компоненты | Назначение |
|
|
197
|
+
|-----------|-----------|------------|
|
|
198
|
+
| `layout/` | Header, Footer, Sidebar, Navigation | Макет приложения |
|
|
199
|
+
| `interactive/` | Quiz, Flashcards, Matching, DragToOrder, CommandBuilder, ScenarioGame | 6 типов упражнений |
|
|
200
|
+
| `common/` | Toast, ProgressBar, Badge, AchievementPopup, Button, Card | Общие UI-элементы |
|
|
201
|
+
| `pages/` | HomePage, SectionPage, FinalTestPage, ResultsPage | Страницы приложения |
|
|
202
|
+
|
|
203
|
+
### 2.7. Шаг 6: Gamification
|
|
204
|
+
|
|
205
|
+
**Модуль:** `modules/06-gamification.md`
|
|
206
|
+
|
|
207
|
+
Настройка системы геймификации. Подробнее в разделе [8. Конфигурация системы достижений](#8-конфигурация-системы-достижений).
|
|
208
|
+
|
|
209
|
+
### 2.8. Шаг 7: Deploy
|
|
210
|
+
|
|
211
|
+
**Модуль:** `modules/07-deploy.md`
|
|
212
|
+
|
|
213
|
+
Генерация GitHub Actions workflow. Подробнее в разделе [5. Конфигурация Vite](#5-конфигурация-vite).
|
|
214
|
+
|
|
215
|
+
### 2.9. Шаг 8: Verification
|
|
216
|
+
|
|
217
|
+
**Модуль:** `modules/08-verification.md`
|
|
218
|
+
|
|
219
|
+
5 проверок финальной верификации:
|
|
220
|
+
|
|
221
|
+
| Проверка | Что проверяется |
|
|
222
|
+
|---------|----------------|
|
|
223
|
+
| Import resolution | Все `import` в JSX-файлах указывают на существующие файлы |
|
|
224
|
+
| Data file structure | Файлы данных экспортируют массивы с корректной структурой |
|
|
225
|
+
| Component hierarchy | App -> Router -> Pages -> Layout + Sections -> Components |
|
|
226
|
+
| Router configuration | Все маршруты ведут на существующие компоненты-страницы |
|
|
227
|
+
| Build simulation | Проект собирается без ошибок (`npm run build` эмуляция) |
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## 3. Конфигурация типов упражнений
|
|
232
|
+
|
|
233
|
+
### 3.1. 6 типов упражнений
|
|
234
|
+
|
|
235
|
+
Edu-site поддерживает 6 типов интерактивных упражнений. Каждый тип определён в `references/exercise-types.md`.
|
|
236
|
+
|
|
237
|
+
| Тип | Компонент | Описание | Когда использовать |
|
|
238
|
+
|-----|-----------|---------|-------------------|
|
|
239
|
+
| **Quiz** | `Quiz.jsx` | Вопрос с вариантами ответа (single/multiple choice) | Проверка знания фактов и определений |
|
|
240
|
+
| **Flashcards** | `Flashcards.jsx` | Карточки с вопросом на лицевой стороне и ответом на обратной | Запоминание терминов, команд, определений |
|
|
241
|
+
| **Matching** | `Matching.jsx` | Перетащить элементы из левой колонки к соответствующим в правой | Связывание концепций: команда-описание, термин-определение |
|
|
242
|
+
| **Drag-to-Order** | `DragToOrder.jsx` | Расположить элементы в правильном порядке перетаскиванием | Последовательности действий, приоритеты, этапы процессов |
|
|
243
|
+
| **Command Builder** | `CommandBuilder.jsx` | Собрать команду из отдельных частей (флаги, аргументы) | CLI-инструменты, SQL-запросы, API-вызовы |
|
|
244
|
+
| **Scenario Game** | `ScenarioGame.jsx` | Прочитать ситуацию и выбрать действие из нескольких вариантов | Принятие решений, troubleshooting, best practices |
|
|
245
|
+
|
|
246
|
+
### 3.2. Конфигурация маппинга контент-тип -> упражнение
|
|
247
|
+
|
|
248
|
+
В модуле `02-course-structure.md` определена логика выбора типа упражнения в зависимости от типа контента:
|
|
249
|
+
|
|
250
|
+
```
|
|
251
|
+
Тип контента Рекомендуемый тип упражнения
|
|
252
|
+
---------------------------------------------------------
|
|
253
|
+
Определения, термины -> Flashcards, Quiz
|
|
254
|
+
CLI-команды -> CommandBuilder, DragToOrder
|
|
255
|
+
Процессы, workflows -> DragToOrder, ScenarioGame
|
|
256
|
+
Концепции и связи -> Matching, Quiz
|
|
257
|
+
API-справочники -> CommandBuilder, Matching
|
|
258
|
+
Best practices -> ScenarioGame, Quiz
|
|
259
|
+
Troubleshooting -> ScenarioGame
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Для изменения маппинга отредактируйте таблицу `## Content-to-Exercise Mapping` в `02-course-structure.md`.
|
|
263
|
+
|
|
264
|
+
### 3.3. Добавление нового типа упражнения
|
|
265
|
+
|
|
266
|
+
Для добавления кастомного типа упражнения:
|
|
267
|
+
|
|
268
|
+
1. Создайте файл `references/custom-exercise-type.md` с описанием:
|
|
269
|
+
|
|
270
|
+
```markdown
|
|
271
|
+
# Custom Exercise Type: CodeEditor
|
|
272
|
+
|
|
273
|
+
## Description
|
|
274
|
+
Интерактивный редактор кода с проверкой вывода.
|
|
275
|
+
|
|
276
|
+
## Component Interface
|
|
277
|
+
Props:
|
|
278
|
+
- code: string (начальный код)
|
|
279
|
+
- expectedOutput: string (ожидаемый вывод)
|
|
280
|
+
- language: string (подсветка синтаксиса)
|
|
281
|
+
|
|
282
|
+
## Data Format
|
|
283
|
+
{
|
|
284
|
+
"type": "code-editor",
|
|
285
|
+
"code": "function hello() {\n // ...\n}",
|
|
286
|
+
"expectedOutput": "Hello, World!",
|
|
287
|
+
"language": "javascript"
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
## Scoring
|
|
291
|
+
- Correct output: +10 points
|
|
292
|
+
- Partial match: +5 points
|
|
293
|
+
- No match: 0 points
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
2. Добавьте тип в маппинг `02-course-structure.md`
|
|
297
|
+
3. Обновите шаблон компонента в `05-components.md`
|
|
298
|
+
|
|
299
|
+
### 3.4. Настройка количества упражнений по типу на секцию
|
|
300
|
+
|
|
301
|
+
По умолчанию генератор выбирает типы упражнений автоматически на основе контента. Для принудительного задания пропорций добавьте в вызов `/edu-site` указание:
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
/edu-site "Git basics" --exercise-mix "quiz:3,flashcards:2,commandbuilder:4,matching:2"
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
Или отредактируйте параметр `exercise_mix` в `02-course-structure.md`:
|
|
308
|
+
|
|
309
|
+
```markdown
|
|
310
|
+
## Exercise Mix (per section)
|
|
311
|
+
- quiz: 30%
|
|
312
|
+
- flashcards: 20%
|
|
313
|
+
- matching: 15%
|
|
314
|
+
- drag-to-order: 10%
|
|
315
|
+
- command-builder: 15%
|
|
316
|
+
- scenario-game: 10%
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
## 4. Конфигурация языка (ru/en)
|
|
322
|
+
|
|
323
|
+
### 4.1. Автоопределение языка
|
|
324
|
+
|
|
325
|
+
По умолчанию генератор определяет язык контента автоматически на шаге Content Analysis:
|
|
326
|
+
|
|
327
|
+
- Если входные данные на русском — сайт генерируется на русском
|
|
328
|
+
- Если на английском — на английском
|
|
329
|
+
- Если смешанный — используется преобладающий язык
|
|
330
|
+
|
|
331
|
+
### 4.2. Принудительная установка языка
|
|
332
|
+
|
|
333
|
+
Для явного указания языка:
|
|
334
|
+
|
|
335
|
+
```
|
|
336
|
+
/edu-site "Docker basics" --lang ru
|
|
337
|
+
/edu-site "Основы Docker" --lang en
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
Или в модуле `01-content-analysis.md`:
|
|
341
|
+
|
|
342
|
+
```markdown
|
|
343
|
+
## Language Configuration
|
|
344
|
+
- Detection: auto | ru | en
|
|
345
|
+
- Default: auto
|
|
346
|
+
- Fallback: en (if auto-detection fails)
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### 4.3. Локализованные элементы UI
|
|
350
|
+
|
|
351
|
+
В зависимости от выбранного языка меняются:
|
|
352
|
+
|
|
353
|
+
| Элемент | ru | en |
|
|
354
|
+
|---------|----|----|
|
|
355
|
+
| Кнопка "Далее" | "Далее" | "Next" |
|
|
356
|
+
| Прогресс | "Прогресс: 45%" | "Progress: 45%" |
|
|
357
|
+
| Достижения | "Достижения" | "Achievements" |
|
|
358
|
+
| Финальный тест | "Финальный тест" | "Final Test" |
|
|
359
|
+
| Тост уведомление | "Достижение разблокировано!" | "Achievement Unlocked!" |
|
|
360
|
+
| Результаты | "Результаты" | "Results" |
|
|
361
|
+
| Секция завершена | "Секция завершена!" | "Section Complete!" |
|
|
362
|
+
| Очки | "10 очков" | "10 points" |
|
|
363
|
+
|
|
364
|
+
Строки локализации генерируются в `src/data/strings.js` (если используется i18n) или хардкодятся в компонентах (для простых проектов).
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## 5. Конфигурация Vite
|
|
369
|
+
|
|
370
|
+
### 5.1. Base path для GitHub Pages
|
|
371
|
+
|
|
372
|
+
Ключевой параметр — `base` в `vite.config.js`. Он определяет префикс URL для всех ресурсов.
|
|
373
|
+
|
|
374
|
+
**Для GitHub Pages (проектный сайт):**
|
|
375
|
+
```javascript
|
|
376
|
+
// vite.config.js
|
|
377
|
+
import { defineConfig } from 'vite'
|
|
378
|
+
import react from '@vitejs/plugin-react'
|
|
379
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
380
|
+
|
|
381
|
+
export default defineConfig({
|
|
382
|
+
base: '/repository-name/', // <-- имя репозитория
|
|
383
|
+
plugins: [
|
|
384
|
+
react(),
|
|
385
|
+
tailwindcss(),
|
|
386
|
+
],
|
|
387
|
+
})
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
**Для GitHub Pages (user site, username.github.io):**
|
|
391
|
+
```javascript
|
|
392
|
+
export default defineConfig({
|
|
393
|
+
base: '/',
|
|
394
|
+
plugins: [react(), tailwindcss()],
|
|
395
|
+
})
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
**Для self-hosted (Nginx, Vercel, Netlify):**
|
|
399
|
+
```javascript
|
|
400
|
+
export default defineConfig({
|
|
401
|
+
base: '/',
|
|
402
|
+
plugins: [react(), tailwindcss()],
|
|
403
|
+
})
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
### 5.2. Настройка base path при генерации
|
|
407
|
+
|
|
408
|
+
Генератор спрашивает имя репозитория на шаге Scaffold (Step 4) и автоматически подставляет его в `base`. Если имя не указано, используется `/edu-site/` по умолчанию.
|
|
409
|
+
|
|
410
|
+
Для принудительного задания:
|
|
411
|
+
|
|
412
|
+
```
|
|
413
|
+
/edu-site "Git basics" --base /my-git-course/
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### 5.3. Дополнительные параметры Vite
|
|
417
|
+
|
|
418
|
+
Для расширенной конфигурации отредактируйте `modules/04-scaffold.md`, секция `## Vite Configuration`:
|
|
419
|
+
|
|
420
|
+
```javascript
|
|
421
|
+
export default defineConfig({
|
|
422
|
+
base: '/repo-name/',
|
|
423
|
+
plugins: [react(), tailwindcss()],
|
|
424
|
+
build: {
|
|
425
|
+
outDir: 'dist',
|
|
426
|
+
sourcemap: false, // отключить source maps для production
|
|
427
|
+
minify: 'terser', // или 'esbuild' (быстрее)
|
|
428
|
+
chunkSizeWarningLimit: 500, // KB
|
|
429
|
+
},
|
|
430
|
+
server: {
|
|
431
|
+
port: 5173,
|
|
432
|
+
open: true, // автоматически открыть в браузере
|
|
433
|
+
},
|
|
434
|
+
})
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## 6. Кастомизация TailwindCSS v4 темы
|
|
440
|
+
|
|
441
|
+
### 6.1. Основы TailwindCSS v4
|
|
442
|
+
|
|
443
|
+
TailwindCSS v4 использует CSS-first конфигурацию вместо `tailwind.config.js`. Основная конфигурация темы находится в `src/app.css`:
|
|
444
|
+
|
|
445
|
+
```css
|
|
446
|
+
@import "tailwindcss";
|
|
447
|
+
|
|
448
|
+
@theme {
|
|
449
|
+
--color-primary: #3b82f6;
|
|
450
|
+
--color-primary-dark: #2563eb;
|
|
451
|
+
--color-secondary: #10b981;
|
|
452
|
+
--color-accent: #f59e0b;
|
|
453
|
+
--color-background: #f8fafc;
|
|
454
|
+
--color-surface: #ffffff;
|
|
455
|
+
--color-text: #1e293b;
|
|
456
|
+
--color-text-muted: #64748b;
|
|
457
|
+
|
|
458
|
+
--font-sans: 'Inter', system-ui, sans-serif;
|
|
459
|
+
--font-mono: 'JetBrains Mono', monospace;
|
|
460
|
+
|
|
461
|
+
--radius-card: 0.75rem;
|
|
462
|
+
--radius-button: 0.5rem;
|
|
463
|
+
--radius-badge: 9999px;
|
|
464
|
+
|
|
465
|
+
--shadow-card: 0 1px 3px rgb(0 0 0 / 0.1);
|
|
466
|
+
--shadow-hover: 0 4px 12px rgb(0 0 0 / 0.15);
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### 6.2. Предустановленные палитры
|
|
471
|
+
|
|
472
|
+
Генератор поддерживает несколько предустановленных палитр. Палитра выбирается автоматически на основе контента или указывается явно:
|
|
473
|
+
|
|
474
|
+
| Палитра | Цвета | Когда используется |
|
|
475
|
+
|---------|-------|-------------------|
|
|
476
|
+
| **Tech Blue** | Blue / Slate / Cyan | CLI-инструменты, DevOps, инфраструктура |
|
|
477
|
+
| **Green Learn** | Emerald / Lime / Teal | Общеобразовательные курсы |
|
|
478
|
+
| **Purple Code** | Violet / Indigo / Fuchsia | Программирование, алгоритмы |
|
|
479
|
+
| **Warm Orange** | Amber / Orange / Rose | Бизнес, маркетинг, soft skills |
|
|
480
|
+
| **Dark Mode** | Slate / Zinc + яркие акценты | Любой контент (альтернативная тема) |
|
|
481
|
+
|
|
482
|
+
Для принудительного выбора палитры:
|
|
483
|
+
|
|
484
|
+
```
|
|
485
|
+
/edu-site "Git basics" --palette tech-blue
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
### 6.3. Кастомная палитра
|
|
489
|
+
|
|
490
|
+
Для создания полностью кастомной палитры отредактируйте `@theme` блок в `src/app.css` после генерации или создайте файл `references/custom-theme-palette.md`:
|
|
491
|
+
|
|
492
|
+
```markdown
|
|
493
|
+
# Custom Theme: Corporate Brand
|
|
494
|
+
|
|
495
|
+
## Colors
|
|
496
|
+
- primary: #1a365d (brand blue)
|
|
497
|
+
- primary-dark: #0d1b2a
|
|
498
|
+
- secondary: #48bb78 (success green)
|
|
499
|
+
- accent: #ed8936 (orange)
|
|
500
|
+
- background: #f7fafc
|
|
501
|
+
- surface: #ffffff
|
|
502
|
+
- text: #2d3748
|
|
503
|
+
- text-muted: #718096
|
|
504
|
+
|
|
505
|
+
## Typography
|
|
506
|
+
- sans: 'Roboto', system-ui, sans-serif
|
|
507
|
+
- mono: 'Source Code Pro', monospace
|
|
508
|
+
|
|
509
|
+
## Radii
|
|
510
|
+
- card: 8px
|
|
511
|
+
- button: 4px
|
|
512
|
+
- badge: 9999px
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
### 6.4. Dark mode
|
|
516
|
+
|
|
517
|
+
TailwindCSS v4 поддерживает dark mode через `@variant dark`. Сгенерированный проект включает toggle кнопку в Header, которая переключает `class="dark"` на элементе `<html>`.
|
|
518
|
+
|
|
519
|
+
Для настройки dark mode цветов добавьте в `src/app.css`:
|
|
520
|
+
|
|
521
|
+
```css
|
|
522
|
+
@variant dark (&:where(.dark, .dark *)) {
|
|
523
|
+
--color-background: #0f172a;
|
|
524
|
+
--color-surface: #1e293b;
|
|
525
|
+
--color-text: #f1f5f9;
|
|
526
|
+
--color-text-muted: #94a3b8;
|
|
527
|
+
}
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
---
|
|
531
|
+
|
|
532
|
+
## 7. Конфигурация Zustand store
|
|
533
|
+
|
|
534
|
+
### 7.1. Структура store
|
|
535
|
+
|
|
536
|
+
Zustand store сгенерированного проекта управляет следующими состояниями:
|
|
537
|
+
|
|
538
|
+
```javascript
|
|
539
|
+
// src/store/useStore.js
|
|
540
|
+
import { create } from 'zustand'
|
|
541
|
+
import { persist } from 'zustand/middleware'
|
|
542
|
+
|
|
543
|
+
const useStore = create(
|
|
544
|
+
persist(
|
|
545
|
+
(set, get) => ({
|
|
546
|
+
// Прогресс по секциям
|
|
547
|
+
completedExercises: {}, // { sectionId: Set<exerciseId> }
|
|
548
|
+
sectionProgress: {}, // { sectionId: number (0-100) }
|
|
549
|
+
|
|
550
|
+
// Очки и статистика
|
|
551
|
+
totalPoints: 0,
|
|
552
|
+
streak: 0,
|
|
553
|
+
longestStreak: 0,
|
|
554
|
+
|
|
555
|
+
// Достижения
|
|
556
|
+
unlockedAchievements: [], // [achievementId, ...]
|
|
557
|
+
|
|
558
|
+
// Финальный тест
|
|
559
|
+
finalTestScore: null,
|
|
560
|
+
finalTestAnswers: {},
|
|
561
|
+
|
|
562
|
+
// UI state
|
|
563
|
+
currentSection: null,
|
|
564
|
+
toastQueue: [],
|
|
565
|
+
|
|
566
|
+
// Actions
|
|
567
|
+
completeExercise: (sectionId, exerciseId, points) => { ... },
|
|
568
|
+
unlockAchievement: (achievementId) => { ... },
|
|
569
|
+
submitFinalTest: (answers) => { ... },
|
|
570
|
+
showToast: (message, type) => { ... },
|
|
571
|
+
resetProgress: () => { ... },
|
|
572
|
+
}),
|
|
573
|
+
{
|
|
574
|
+
name: 'edu-site-storage', // ключ localStorage
|
|
575
|
+
version: 1, // версия для миграций
|
|
576
|
+
partialize: (state) => ({
|
|
577
|
+
// Сохраняем только нужное (не UI state)
|
|
578
|
+
completedExercises: state.completedExercises,
|
|
579
|
+
sectionProgress: state.sectionProgress,
|
|
580
|
+
totalPoints: state.totalPoints,
|
|
581
|
+
streak: state.streak,
|
|
582
|
+
longestStreak: state.longestStreak,
|
|
583
|
+
unlockedAchievements: state.unlockedAchievements,
|
|
584
|
+
finalTestScore: state.finalTestScore,
|
|
585
|
+
finalTestAnswers: state.finalTestAnswers,
|
|
586
|
+
}),
|
|
587
|
+
}
|
|
588
|
+
)
|
|
589
|
+
)
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
### 7.2. Persist middleware
|
|
593
|
+
|
|
594
|
+
По умолчанию store сохраняется в `localStorage` через Zustand persist middleware. Ключевые настройки:
|
|
595
|
+
|
|
596
|
+
| Параметр | Значение | Описание |
|
|
597
|
+
|----------|---------|----------|
|
|
598
|
+
| `name` | `'edu-site-storage'` | Ключ в localStorage |
|
|
599
|
+
| `version` | `1` | Версия хранилища (для миграций) |
|
|
600
|
+
| `partialize` | Функция фильтрации | Исключает временные UI-данные |
|
|
601
|
+
|
|
602
|
+
### 7.3. Миграции при обновлении версии store
|
|
603
|
+
|
|
604
|
+
Если вы изменяете структуру store, увеличьте `version` и добавьте миграцию:
|
|
605
|
+
|
|
606
|
+
```javascript
|
|
607
|
+
persist(
|
|
608
|
+
(set) => ({ /* ... */ }),
|
|
609
|
+
{
|
|
610
|
+
name: 'edu-site-storage',
|
|
611
|
+
version: 2, // увеличено с 1
|
|
612
|
+
migrate: (persistedState, version) => {
|
|
613
|
+
if (version === 1) {
|
|
614
|
+
// Миграция с v1 на v2: добавить новое поле
|
|
615
|
+
persistedState.favoriteExercises = []
|
|
616
|
+
}
|
|
617
|
+
return persistedState
|
|
618
|
+
},
|
|
619
|
+
}
|
|
620
|
+
)
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
### 7.4. Отключение persist (для тестирования)
|
|
624
|
+
|
|
625
|
+
Для отключения сохранения прогресса (например, при разработке):
|
|
626
|
+
|
|
627
|
+
```javascript
|
|
628
|
+
// Замените persist на простой create
|
|
629
|
+
const useStore = create((set) => ({
|
|
630
|
+
// ... без обёртки persist
|
|
631
|
+
}))
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
---
|
|
635
|
+
|
|
636
|
+
## 8. Конфигурация системы достижений
|
|
637
|
+
|
|
638
|
+
### 8.1. Структура достижения
|
|
639
|
+
|
|
640
|
+
Каждое достижение определяется в `src/data/achievements.js`:
|
|
641
|
+
|
|
642
|
+
```javascript
|
|
643
|
+
export const achievements = [
|
|
644
|
+
{
|
|
645
|
+
id: 'first-exercise',
|
|
646
|
+
title: 'First Step',
|
|
647
|
+
description: 'Complete your first exercise',
|
|
648
|
+
icon: 'rocket', // имя иконки (emoji или SVG)
|
|
649
|
+
criteria: {
|
|
650
|
+
type: 'exercise_count', // тип критерия
|
|
651
|
+
count: 1, // порог
|
|
652
|
+
},
|
|
653
|
+
points: 50, // бонусные очки за разблокировку
|
|
654
|
+
rarity: 'common', // common | uncommon | rare | epic | legendary
|
|
655
|
+
},
|
|
656
|
+
{
|
|
657
|
+
id: 'perfect-section',
|
|
658
|
+
title: 'Perfectionist',
|
|
659
|
+
description: 'Complete all exercises in a section with 100% accuracy',
|
|
660
|
+
icon: 'star',
|
|
661
|
+
criteria: {
|
|
662
|
+
type: 'section_perfect',
|
|
663
|
+
sectionId: null, // null = любая секция
|
|
664
|
+
},
|
|
665
|
+
points: 100,
|
|
666
|
+
rarity: 'rare',
|
|
667
|
+
},
|
|
668
|
+
// ...
|
|
669
|
+
]
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
### 8.2. Типы критериев достижений
|
|
673
|
+
|
|
674
|
+
| Тип критерия | Описание | Параметры |
|
|
675
|
+
|-------------|---------|-----------|
|
|
676
|
+
| `exercise_count` | Выполнить N упражнений | `count: number` |
|
|
677
|
+
| `section_complete` | Завершить секцию | `sectionId: string | null` |
|
|
678
|
+
| `section_perfect` | 100% точность в секции | `sectionId: string | null` |
|
|
679
|
+
| `streak` | Серия правильных ответов | `count: number` |
|
|
680
|
+
| `points_total` | Набрать N очков | `count: number` |
|
|
681
|
+
| `all_sections` | Завершить все секции | (нет параметров) |
|
|
682
|
+
| `final_test_pass` | Сдать финальный тест | `minScore: number (0-100)` |
|
|
683
|
+
| `final_test_perfect` | 100% на финальном тесте | (нет параметров) |
|
|
684
|
+
| `exercise_type_master` | Выполнить N упражнений одного типа | `type: string, count: number` |
|
|
685
|
+
| `speed_run` | Завершить секцию за N минут | `sectionId: string, minutes: number` |
|
|
686
|
+
|
|
687
|
+
### 8.3. Настройка количества достижений
|
|
688
|
+
|
|
689
|
+
По умолчанию генератор создаёт 10-15 достижений. Для изменения:
|
|
690
|
+
|
|
691
|
+
```
|
|
692
|
+
/edu-site "Git basics" --achievements 20
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
Или в `modules/06-gamification.md`:
|
|
696
|
+
|
|
697
|
+
```markdown
|
|
698
|
+
## Achievement Count
|
|
699
|
+
- Minimum: 8
|
|
700
|
+
- Default: 12
|
|
701
|
+
- Maximum: 25
|
|
702
|
+
|
|
703
|
+
## Distribution by Rarity
|
|
704
|
+
- common: 40%
|
|
705
|
+
- uncommon: 25%
|
|
706
|
+
- rare: 20%
|
|
707
|
+
- epic: 10%
|
|
708
|
+
- legendary: 5%
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
### 8.4. Toast-уведомления при разблокировке
|
|
712
|
+
|
|
713
|
+
При разблокировке достижения показывается toast-уведомление через компонент `AchievementPopup`:
|
|
714
|
+
|
|
715
|
+
```javascript
|
|
716
|
+
// Zustand action
|
|
717
|
+
unlockAchievement: (achievementId) => {
|
|
718
|
+
const state = get()
|
|
719
|
+
if (state.unlockedAchievements.includes(achievementId)) return
|
|
720
|
+
const achievement = achievements.find(a => a.id === achievementId)
|
|
721
|
+
set({
|
|
722
|
+
unlockedAchievements: [...state.unlockedAchievements, achievementId],
|
|
723
|
+
totalPoints: state.totalPoints + achievement.points,
|
|
724
|
+
})
|
|
725
|
+
get().showToast(`Achievement Unlocked: ${achievement.title}!`, 'achievement')
|
|
726
|
+
}
|
|
727
|
+
```
|
|
728
|
+
|
|
729
|
+
---
|
|
730
|
+
|
|
731
|
+
## 9. Конфигурация финального теста
|
|
732
|
+
|
|
733
|
+
### 9.1. Структура финального теста
|
|
734
|
+
|
|
735
|
+
Финальный тест состоит из вопросов, сгенерированных из всех секций курса. Данные хранятся в `src/data/quizQuestions.js`:
|
|
736
|
+
|
|
737
|
+
```javascript
|
|
738
|
+
export const quizQuestions = [
|
|
739
|
+
{
|
|
740
|
+
id: 'q1',
|
|
741
|
+
sectionId: 'getting-started', // из какой секции
|
|
742
|
+
question: 'What command initializes a new Git repository?',
|
|
743
|
+
options: ['git init', 'git start', 'git new', 'git create'],
|
|
744
|
+
correctAnswer: 0, // индекс правильного ответа
|
|
745
|
+
explanation: 'git init creates a new .git directory...',
|
|
746
|
+
},
|
|
747
|
+
// ...
|
|
748
|
+
]
|
|
749
|
+
```
|
|
750
|
+
|
|
751
|
+
### 9.2. Количество вопросов
|
|
752
|
+
|
|
753
|
+
По умолчанию из каждой секции берётся 3-5 вопросов. Настройка:
|
|
754
|
+
|
|
755
|
+
| Параметр | Значение | Описание |
|
|
756
|
+
|----------|---------|----------|
|
|
757
|
+
| `questions_per_section` | 3-5 | Количество вопросов на секцию |
|
|
758
|
+
| `total_questions` | 15-30 | Общее число вопросов (зависит от секций) |
|
|
759
|
+
| `randomize` | `true` | Перемешивать порядок вопросов |
|
|
760
|
+
|
|
761
|
+
### 9.3. Порог прохождения
|
|
762
|
+
|
|
763
|
+
```markdown
|
|
764
|
+
## Passing Threshold
|
|
765
|
+
- Default: 70%
|
|
766
|
+
- Configurable: 50% - 100%
|
|
767
|
+
- Display: percentage + letter grade (A/B/C/D/F)
|
|
768
|
+
```
|
|
769
|
+
|
|
770
|
+
Для изменения порога отредактируйте `modules/06-gamification.md`:
|
|
771
|
+
|
|
772
|
+
```markdown
|
|
773
|
+
## Final Test
|
|
774
|
+
- Passing score: 70%
|
|
775
|
+
- Grade thresholds:
|
|
776
|
+
- A: >= 90%
|
|
777
|
+
- B: >= 80%
|
|
778
|
+
- C: >= 70%
|
|
779
|
+
- D: >= 60%
|
|
780
|
+
- F: < 60%
|
|
781
|
+
```
|
|
782
|
+
|
|
783
|
+
### 9.4. Повторное прохождение
|
|
784
|
+
|
|
785
|
+
По умолчанию финальный тест можно пересдать неограниченное количество раз. Каждая попытка перезаписывает предыдущий результат в Zustand store.
|
|
786
|
+
|
|
787
|
+
---
|
|
788
|
+
|
|
789
|
+
## 10. SEO-конфигурация
|
|
790
|
+
|
|
791
|
+
### 10.1. Open Graph теги
|
|
792
|
+
|
|
793
|
+
Сгенерированный `index.html` включает OG-теги для корректного отображения в соцсетях:
|
|
794
|
+
|
|
795
|
+
```html
|
|
796
|
+
<meta property="og:title" content="Learn Git Basics - Interactive Course" />
|
|
797
|
+
<meta property="og:description" content="Master Git fundamentals with interactive exercises..." />
|
|
798
|
+
<meta property="og:type" content="website" />
|
|
799
|
+
<meta property="og:url" content="https://username.github.io/repo/" />
|
|
800
|
+
<meta property="og:image" content="https://username.github.io/repo/og-image.png" />
|
|
801
|
+
```
|
|
802
|
+
|
|
803
|
+
### 10.2. JSON-LD структурированные данные
|
|
804
|
+
|
|
805
|
+
Для поисковых систем генерируется JSON-LD разметка:
|
|
806
|
+
|
|
807
|
+
```html
|
|
808
|
+
<script type="application/ld+json">
|
|
809
|
+
{
|
|
810
|
+
"@context": "https://schema.org",
|
|
811
|
+
"@type": "Course",
|
|
812
|
+
"name": "Learn Git Basics",
|
|
813
|
+
"description": "Interactive course on Git fundamentals",
|
|
814
|
+
"provider": {
|
|
815
|
+
"@type": "Organization",
|
|
816
|
+
"name": "Edu-Site Generator"
|
|
817
|
+
},
|
|
818
|
+
"hasCourseInstance": {
|
|
819
|
+
"@type": "CourseInstance",
|
|
820
|
+
"courseMode": "online",
|
|
821
|
+
"courseWorkload": "PT2H"
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
</script>
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
### 10.3. Настройка SEO-параметров
|
|
828
|
+
|
|
829
|
+
В модуле `04-scaffold.md` секция `## SEO Configuration`:
|
|
830
|
+
|
|
831
|
+
```markdown
|
|
832
|
+
## SEO Configuration
|
|
833
|
+
- og:title: auto-generated from course title
|
|
834
|
+
- og:description: auto-generated from course description (first 160 chars)
|
|
835
|
+
- og:image: placeholder or custom URL
|
|
836
|
+
- JSON-LD: Course schema
|
|
837
|
+
- lang attribute: auto-detected (ru/en)
|
|
838
|
+
- viewport: responsive
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
---
|
|
842
|
+
|
|
843
|
+
## 11. Оптимизация производительности
|
|
844
|
+
|
|
845
|
+
### 11.1. Code splitting (React.lazy)
|
|
846
|
+
|
|
847
|
+
Сгенерированный проект использует `React.lazy` для ленивой загрузки страниц:
|
|
848
|
+
|
|
849
|
+
```javascript
|
|
850
|
+
// src/App.jsx
|
|
851
|
+
import { lazy, Suspense } from 'react'
|
|
852
|
+
|
|
853
|
+
const HomePage = lazy(() => import('./pages/HomePage'))
|
|
854
|
+
const SectionPage = lazy(() => import('./pages/SectionPage'))
|
|
855
|
+
const FinalTestPage = lazy(() => import('./pages/FinalTestPage'))
|
|
856
|
+
const ResultsPage = lazy(() => import('./pages/ResultsPage'))
|
|
857
|
+
|
|
858
|
+
function App() {
|
|
859
|
+
return (
|
|
860
|
+
<Suspense fallback={<div>Loading...</div>}>
|
|
861
|
+
{/* routes */}
|
|
862
|
+
</Suspense>
|
|
863
|
+
)
|
|
864
|
+
}
|
|
865
|
+
```
|
|
866
|
+
|
|
867
|
+
### 11.2. Lazy loading компонентов упражнений
|
|
868
|
+
|
|
869
|
+
Интерактивные компоненты упражнений загружаются лениво при первом использовании:
|
|
870
|
+
|
|
871
|
+
```javascript
|
|
872
|
+
// src/components/interactive/index.js
|
|
873
|
+
export const Quiz = lazy(() => import('./Quiz'))
|
|
874
|
+
export const Flashcards = lazy(() => import('./Flashcards'))
|
|
875
|
+
export const Matching = lazy(() => import('./Matching'))
|
|
876
|
+
export const DragToOrder = lazy(() => import('./DragToOrder'))
|
|
877
|
+
export const CommandBuilder = lazy(() => import('./CommandBuilder'))
|
|
878
|
+
export const ScenarioGame = lazy(() => import('./ScenarioGame'))
|
|
879
|
+
```
|
|
880
|
+
|
|
881
|
+
### 11.3. Размер бандла
|
|
882
|
+
|
|
883
|
+
Ожидаемый размер production бандла:
|
|
884
|
+
|
|
885
|
+
| Компонент | Размер (gzip) |
|
|
886
|
+
|-----------|--------------|
|
|
887
|
+
| React + React DOM | ~45 KB |
|
|
888
|
+
| Zustand | ~1 KB |
|
|
889
|
+
| TailwindCSS (only used classes) | ~10-30 KB |
|
|
890
|
+
| Код приложения | ~20-50 KB |
|
|
891
|
+
| Данные (sections, exercises, etc.) | ~5-30 KB |
|
|
892
|
+
| **Итого** | **~80-160 KB** |
|
|
893
|
+
|
|
894
|
+
### 11.4. Рекомендации по контенту
|
|
895
|
+
|
|
896
|
+
| Параметр | Рекомендация | Обоснование |
|
|
897
|
+
|----------|-------------|-------------|
|
|
898
|
+
| Максимум секций | 8-10 | Больше секций замедляют загрузку данных |
|
|
899
|
+
| Упражнений на секцию | 3-5 | Баланс между полнотой и размером данных |
|
|
900
|
+
| Изображения | Избегать больших изображений | SPA без сервера — всё в бандле |
|
|
901
|
+
| Длина описаний | До 200 символов | Компактные тексты быстрее рендерятся |
|