@dzhechkov/keysarium 1.3.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 +70 -10
- package/bin/cli.js +0 -0
- package/package.json +5 -3
- package/src/utils.js +1 -1
- package/templates/.claude/commands/analyst-manual.md +38 -0
- package/templates/.claude/commands/brain-export.md +2 -0
- package/templates/.claude/commands/bto-benchmark.md +302 -0
- package/templates/.claude/commands/casarium.md +55 -4
- package/templates/.claude/commands/feature-adr.md +8 -0
- package/templates/.claude/commands/harvest.md +28 -46
- package/templates/.claude/rules/trust-tiers.md +6 -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/knowledge-extractor/SKILL.md +254 -0
- package/templates/.claude/skills/knowledge-extractor/modules/01-extract.md +188 -0
- package/templates/.claude/skills/knowledge-extractor/modules/02-classify.md +99 -0
- package/templates/.claude/skills/knowledge-extractor/modules/03-gate.md +150 -0
- package/templates/.claude/skills/knowledge-extractor/modules/04-integrate.md +159 -0
- package/templates/.claude/skills/knowledge-extractor/references/artifact-categories.md +100 -0
- package/templates/.claude/skills/knowledge-extractor/references/maturity-model.md +94 -0
- package/templates/.claude/skills/knowledge-extractor/references/quality-gates.md +98 -0
- package/templates/.claude/skills/knowledge-extractor/templates/artifact-card.md +63 -0
- package/templates/.claude/skills/knowledge-extractor/templates/harvest-report.md +102 -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 +30 -9
- package/templates/docs/continuous-learning-guide.md +622 -0
- 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/improvement-directions.md +8 -4
- package/templates/docs/keysarium-core/02-functionality.md +3 -1
- package/templates/docs/skills-bto/01-deployment-guide.md +1 -1
- package/templates/docs/skills-bto/02-admin-guide.md +4 -1
- package/templates/docs/skills-bto/03-user-guide.md +4 -3
- package/templates/docs/skills-bto/04-infrastructure-requirements.md +2 -1
- package/templates/docs/skills-bto/05-architecture.md +11 -11
- package/templates/docs/skills-bto/06-user-flows.md +2 -1
- 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
- package/templates/lib/dream-engine.md +1 -1
- package/templates/lib/memory-protocol.md +6 -2
- package/templates/lib/reward-tracker.md +6 -3
|
@@ -0,0 +1,759 @@
|
|
|
1
|
+
# Пользовательские потоки @dzhechkov/skills-edu-site
|
|
2
|
+
|
|
3
|
+
## Содержание
|
|
4
|
+
|
|
5
|
+
1. [Flow: Полный пайплайн (8 шагов)](#flow-полный-пайплайн-8-шагов)
|
|
6
|
+
2. [Flow: Анализ контента](#flow-анализ-контента)
|
|
7
|
+
3. [Flow: Выбор типа упражнения](#flow-выбор-типа-упражнения)
|
|
8
|
+
4. [Flow: Упражнение Quiz](#flow-упражнение-quiz)
|
|
9
|
+
5. [Flow: Упражнение Flashcards](#flow-упражнение-flashcards)
|
|
10
|
+
6. [Flow: Упражнение Matching](#flow-упражнение-matching)
|
|
11
|
+
7. [Flow: Упражнение Drag-to-Order](#flow-упражнение-drag-to-order)
|
|
12
|
+
8. [Flow: Упражнение Command Builder](#flow-упражнение-command-builder)
|
|
13
|
+
9. [Flow: Упражнение Scenario Game](#flow-упражнение-scenario-game)
|
|
14
|
+
10. [Flow: Разблокировка достижения](#flow-разблокировка-достижения)
|
|
15
|
+
11. [Flow: Отслеживание прогресса](#flow-отслеживание-прогресса)
|
|
16
|
+
12. [Flow: Финальный тест](#flow-финальный-тест)
|
|
17
|
+
13. [Flow: Сборка и деплой](#flow-сборка-и-деплой)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Flow: Полный пайплайн (8 шагов)
|
|
22
|
+
|
|
23
|
+
### Sequence Diagram
|
|
24
|
+
|
|
25
|
+
```mermaid
|
|
26
|
+
sequenceDiagram
|
|
27
|
+
actor U as User
|
|
28
|
+
participant C as Claude (/edu-site)
|
|
29
|
+
participant FS as File System
|
|
30
|
+
|
|
31
|
+
U->>C: /edu-site "Learn Git basics"
|
|
32
|
+
|
|
33
|
+
Note over C: === Step 1: Content Analysis ===
|
|
34
|
+
C->>C: Определить тип входа (topic description)
|
|
35
|
+
C->>C: Generative mode: создать контент
|
|
36
|
+
C->>C: Определить язык: en
|
|
37
|
+
C->>C: Извлечь темы, концепции, термины
|
|
38
|
+
C-->>U: Step 1/8: 12 topics, 34 concepts, lang=en
|
|
39
|
+
|
|
40
|
+
Note over C: === Step 2: Course Structure ===
|
|
41
|
+
C->>C: Кластеризация тем -> секции
|
|
42
|
+
C->>C: Определить порядок изучения
|
|
43
|
+
C->>C: Назначить типы упражнений
|
|
44
|
+
C-->>U: Step 2/8: 5 sections, 19 exercises planned
|
|
45
|
+
|
|
46
|
+
Note over C: === Step 3: Data Generation ===
|
|
47
|
+
C->>FS: Write src/data/sections.js
|
|
48
|
+
C->>FS: Write src/data/exercises.js
|
|
49
|
+
C->>FS: Write src/data/quizQuestions.js
|
|
50
|
+
C->>FS: Write src/data/achievements.js
|
|
51
|
+
C-->>U: Step 3/8: 4 data files generated
|
|
52
|
+
|
|
53
|
+
Note over C: === Step 4: Scaffold ===
|
|
54
|
+
C->>FS: Write package.json
|
|
55
|
+
C->>FS: Write vite.config.js (base: /git-basics/)
|
|
56
|
+
C->>FS: Write index.html (OG tags, JSON-LD)
|
|
57
|
+
C->>FS: Write src/app.css (@theme)
|
|
58
|
+
C->>FS: Write src/main.jsx
|
|
59
|
+
C->>FS: Write .github/workflows/deploy.yml
|
|
60
|
+
C-->>U: Step 4/8: Project scaffold created
|
|
61
|
+
|
|
62
|
+
Note over C: === Step 5: Components ===
|
|
63
|
+
C->>FS: Write layout/ (Header, Footer, Sidebar, Navigation)
|
|
64
|
+
C->>FS: Write interactive/ (Quiz, Flashcards, Matching, DragToOrder, CommandBuilder, ScenarioGame)
|
|
65
|
+
C->>FS: Write common/ (Toast, ProgressBar, Badge, AchievementPopup, Button, Card)
|
|
66
|
+
C->>FS: Write pages/ (HomePage, SectionPage, FinalTestPage, ResultsPage)
|
|
67
|
+
C->>FS: Write sections/ (SectionList, ExerciseRenderer)
|
|
68
|
+
C->>FS: Write App.jsx (HashRouter + Routes)
|
|
69
|
+
C-->>U: Step 5/8: 22 components generated
|
|
70
|
+
|
|
71
|
+
Note over C: === Step 6: Gamification ===
|
|
72
|
+
C->>FS: Write src/store/useStore.js (Zustand + persist)
|
|
73
|
+
C->>FS: Write src/hooks/useAchievements.js
|
|
74
|
+
C-->>U: Step 6/8: Gamification configured
|
|
75
|
+
|
|
76
|
+
Note over C: === Step 7: Deploy ===
|
|
77
|
+
C->>C: Verify .github/workflows/deploy.yml exists
|
|
78
|
+
C->>C: Verify vite.config.js base path
|
|
79
|
+
C-->>U: Step 7/8: Deploy configuration ready
|
|
80
|
+
|
|
81
|
+
Note over C: === Step 8: Verification ===
|
|
82
|
+
C->>C: Check all imports resolve
|
|
83
|
+
C->>C: Validate data file structures
|
|
84
|
+
C->>C: Verify component hierarchy
|
|
85
|
+
C->>C: Check router configuration
|
|
86
|
+
C->>C: Simulate build (syntax check)
|
|
87
|
+
C-->>U: Step 8/8: All 5 checks passed!
|
|
88
|
+
|
|
89
|
+
C-->>U: Generation complete!
|
|
90
|
+
C-->>U: Next: cd git-basics && npm install && npm run dev
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Пошаговый разбор
|
|
94
|
+
|
|
95
|
+
**Шаг 1. Запуск пайплайна**
|
|
96
|
+
```
|
|
97
|
+
User: /edu-site "Learn Git basics: init, add, commit, branch, merge, remote"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Шаг 2. Content Analysis**
|
|
101
|
+
- Определяется тип входа: topic description (нет URL, нет пути к файлу)
|
|
102
|
+
- Активируется generative mode
|
|
103
|
+
- Язык: en (латинские термины)
|
|
104
|
+
- Извлекаются темы: init, add, commit, branch, merge, remote
|
|
105
|
+
|
|
106
|
+
**Шаг 3. Course Structure**
|
|
107
|
+
- Темы кластеризуются в 5 секций
|
|
108
|
+
- Порядок: Setup -> Basics -> Branching -> Merging -> Remote
|
|
109
|
+
- Каждой теме назначается тип упражнения
|
|
110
|
+
|
|
111
|
+
**Шаг 4-8. Генерация**
|
|
112
|
+
- Последовательная генерация всех артефактов
|
|
113
|
+
- Финальная верификация
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Flow: Анализ контента
|
|
118
|
+
|
|
119
|
+
### Flowchart
|
|
120
|
+
|
|
121
|
+
```mermaid
|
|
122
|
+
flowchart TD
|
|
123
|
+
START(["/edu-site [input]"]) --> DETECT{"Тип входа?"}
|
|
124
|
+
|
|
125
|
+
DETECT -->|"http:// или https://"| URL_FLOW
|
|
126
|
+
DETECT -->|"Путь к файлу (.md, .txt)"| FILE_FLOW
|
|
127
|
+
DETECT -->|"Длинный текст (> 500 символов)"| TEXT_FLOW
|
|
128
|
+
DETECT -->|"Короткое описание"| TOPIC_FLOW
|
|
129
|
+
|
|
130
|
+
subgraph URL_FLOW ["URL Flow"]
|
|
131
|
+
FETCH["Fetch HTML страницы"]
|
|
132
|
+
PARSE_HTML["Парсинг HTML:<br/>извлечь body content"]
|
|
133
|
+
FOLLOW["Найти внутренние ссылки<br/>(depth <= 3)"]
|
|
134
|
+
FETCH_MORE["Fetch дополнительных страниц"]
|
|
135
|
+
MERGE_URL["Объединить весь контент"]
|
|
136
|
+
|
|
137
|
+
FETCH --> PARSE_HTML --> FOLLOW --> FETCH_MORE --> MERGE_URL
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
subgraph FILE_FLOW ["File Flow"]
|
|
141
|
+
READ_FILE["Прочитать файл(ы)"]
|
|
142
|
+
DETECT_FORMAT{"Формат?"}
|
|
143
|
+
PARSE_MD["Парсинг Markdown:<br/>заголовки, списки, код"]
|
|
144
|
+
PARSE_TXT["Парсинг plain text:<br/>абзацы, пустые строки"]
|
|
145
|
+
PARSE_FILE_HTML["Парсинг HTML:<br/>извлечь текст"]
|
|
146
|
+
|
|
147
|
+
READ_FILE --> DETECT_FORMAT
|
|
148
|
+
DETECT_FORMAT -->|".md"| PARSE_MD
|
|
149
|
+
DETECT_FORMAT -->|".txt"| PARSE_TXT
|
|
150
|
+
DETECT_FORMAT -->|".html"| PARSE_FILE_HTML
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
subgraph TEXT_FLOW ["Text Flow"]
|
|
154
|
+
PARSE_TEXT["Парсинг текста:<br/>абзацы, заголовки, код"]
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
subgraph TOPIC_FLOW ["Topic Flow"]
|
|
158
|
+
GENERATE["Generative mode:<br/>создать контент из знаний модели"]
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
MERGE_URL --> CLEAN
|
|
162
|
+
PARSE_MD --> CLEAN
|
|
163
|
+
PARSE_TXT --> CLEAN
|
|
164
|
+
PARSE_FILE_HTML --> CLEAN
|
|
165
|
+
PARSE_TEXT --> CLEAN
|
|
166
|
+
GENERATE --> LANG
|
|
167
|
+
|
|
168
|
+
CLEAN["Очистка контента:<br/>убрать навигацию, футеры,<br/>повторяющиеся блоки"] --> LANG
|
|
169
|
+
|
|
170
|
+
LANG["Определение языка<br/>(auto / --lang)"] --> EXTRACT
|
|
171
|
+
|
|
172
|
+
EXTRACT["Извлечение:<br/>- Темы (topics)<br/>- Концепции (concepts)<br/>- Термины (terms)<br/>- Примеры кода (code)"] --> OUTPUT
|
|
173
|
+
|
|
174
|
+
OUTPUT["Structured Analysis Result:<br/>{language, topics, concepts,<br/>codeExamples, estimatedSections}"]
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Flow: Выбор типа упражнения
|
|
180
|
+
|
|
181
|
+
### Flowchart
|
|
182
|
+
|
|
183
|
+
```mermaid
|
|
184
|
+
flowchart TD
|
|
185
|
+
CONTENT["Тема / подсекция"] --> ANALYZE{"Характеристика контента?"}
|
|
186
|
+
|
|
187
|
+
ANALYZE -->|"Определения, глоссарий,<br/>термины с пояснениями"| FLASH["Flashcards<br/>(запоминание)"]
|
|
188
|
+
|
|
189
|
+
ANALYZE -->|"CLI-команды, SQL,<br/>API-вызовы"| CMD["CommandBuilder<br/>(конструирование)"]
|
|
190
|
+
|
|
191
|
+
ANALYZE -->|"Пошаговый процесс,<br/>последовательность действий"| DRAG["DragToOrder<br/>(упорядочивание)"]
|
|
192
|
+
|
|
193
|
+
ANALYZE -->|"Парные связи:<br/>команда-описание,<br/>термин-значение"| MATCH["Matching<br/>(соотнесение)"]
|
|
194
|
+
|
|
195
|
+
ANALYZE -->|"Ситуации, решения,<br/>best practices,<br/>troubleshooting"| SCEN["ScenarioGame<br/>(принятие решений)"]
|
|
196
|
+
|
|
197
|
+
ANALYZE -->|"Теоретические факты,<br/>правила, синтаксис"| QUIZ["Quiz<br/>(проверка знаний)"]
|
|
198
|
+
|
|
199
|
+
FLASH --> VALIDATE{"В секции уже есть<br/>этот тип?"}
|
|
200
|
+
CMD --> VALIDATE
|
|
201
|
+
DRAG --> VALIDATE
|
|
202
|
+
MATCH --> VALIDATE
|
|
203
|
+
SCEN --> VALIDATE
|
|
204
|
+
QUIZ --> VALIDATE
|
|
205
|
+
|
|
206
|
+
VALIDATE -->|"< max per type"| ACCEPT["Принять выбор"]
|
|
207
|
+
VALIDATE -->|">= max per type"| FALLBACK["Выбрать<br/>альтернативный тип"]
|
|
208
|
+
FALLBACK --> ACCEPT
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Flow: Упражнение Quiz
|
|
214
|
+
|
|
215
|
+
### Sequence Diagram
|
|
216
|
+
|
|
217
|
+
```mermaid
|
|
218
|
+
sequenceDiagram
|
|
219
|
+
actor S as Студент
|
|
220
|
+
participant Q as Quiz Component
|
|
221
|
+
participant STORE as Zustand Store
|
|
222
|
+
|
|
223
|
+
S->>Q: Открыть упражнение
|
|
224
|
+
Q->>Q: Отрисовать вопрос + 4 варианта
|
|
225
|
+
Q->>Q: Все кнопки активны, ни одна не выбрана
|
|
226
|
+
|
|
227
|
+
S->>Q: Нажать на вариант ответа
|
|
228
|
+
|
|
229
|
+
alt Правильный ответ
|
|
230
|
+
Q->>Q: Подсветить выбранный зелёным
|
|
231
|
+
Q->>Q: Показать explanation
|
|
232
|
+
Q->>STORE: completeExercise(sectionId, exerciseId, 10)
|
|
233
|
+
STORE->>STORE: totalPoints += 10, streak += 1
|
|
234
|
+
else Неправильный ответ
|
|
235
|
+
Q->>Q: Подсветить выбранный красным
|
|
236
|
+
Q->>Q: Подсветить правильный зелёным
|
|
237
|
+
Q->>Q: Показать explanation
|
|
238
|
+
Q->>STORE: completeExercise(sectionId, exerciseId, 0)
|
|
239
|
+
STORE->>STORE: streak = 0
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
Q->>S: Показать кнопку "Далее"
|
|
243
|
+
S->>Q: Нажать "Далее"
|
|
244
|
+
Q->>Q: Перейти к следующему упражнению
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Flow: Упражнение Flashcards
|
|
250
|
+
|
|
251
|
+
### Sequence Diagram
|
|
252
|
+
|
|
253
|
+
```mermaid
|
|
254
|
+
sequenceDiagram
|
|
255
|
+
actor S as Студент
|
|
256
|
+
participant F as Flashcards Component
|
|
257
|
+
participant STORE as Zustand Store
|
|
258
|
+
|
|
259
|
+
S->>F: Открыть упражнение
|
|
260
|
+
F->>F: Показать первую карточку (front)
|
|
261
|
+
F->>F: Отобразить "1 / N карточек"
|
|
262
|
+
|
|
263
|
+
loop Для каждой карточки
|
|
264
|
+
S->>F: Нажать на карточку / пробел
|
|
265
|
+
F->>F: Анимация flip
|
|
266
|
+
F->>F: Показать back (ответ)
|
|
267
|
+
|
|
268
|
+
alt Студент знает ответ
|
|
269
|
+
S->>F: Нажать "Знаю"
|
|
270
|
+
F->>STORE: completeExercise(sectionId, cardId, 10)
|
|
271
|
+
STORE->>STORE: totalPoints += 10
|
|
272
|
+
F->>F: Убрать карточку из стопки
|
|
273
|
+
else Студент не знает
|
|
274
|
+
S->>F: Нажать "Повторить"
|
|
275
|
+
F->>F: Вернуть карточку в конец стопки
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
F->>F: Показать следующую карточку
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
F->>F: Все карточки отмечены как "Знаю"
|
|
282
|
+
F->>S: Показать "Все карточки изучены!"
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## Flow: Упражнение Matching
|
|
288
|
+
|
|
289
|
+
### Sequence Diagram
|
|
290
|
+
|
|
291
|
+
```mermaid
|
|
292
|
+
sequenceDiagram
|
|
293
|
+
actor S as Студент
|
|
294
|
+
participant M as Matching Component
|
|
295
|
+
participant STORE as Zustand Store
|
|
296
|
+
|
|
297
|
+
S->>M: Открыть упражнение
|
|
298
|
+
M->>M: Отрисовать 2 колонки<br/>(левая перемешана, правая перемешана)
|
|
299
|
+
|
|
300
|
+
loop Для каждой пары
|
|
301
|
+
S->>M: Перетащить элемент из левой колонки
|
|
302
|
+
M->>M: Визуальная обратная связь (drag indicator)
|
|
303
|
+
S->>M: Бросить на элемент правой колонки
|
|
304
|
+
M->>M: Соединить пару (визуальная линия)
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
S->>M: Нажать "Проверить"
|
|
308
|
+
M->>M: Сравнить с correctPairs
|
|
309
|
+
|
|
310
|
+
alt Все пары верны
|
|
311
|
+
M->>M: Подсветить все зелёным
|
|
312
|
+
M->>STORE: completeExercise(sectionId, exerciseId, 10)
|
|
313
|
+
STORE->>STORE: totalPoints += 10, streak += 1
|
|
314
|
+
else 75%+ верны
|
|
315
|
+
M->>M: Верные зелёным, неверные красным
|
|
316
|
+
M->>STORE: completeExercise(sectionId, exerciseId, 5)
|
|
317
|
+
STORE->>STORE: totalPoints += 5
|
|
318
|
+
else Менее 75% верны
|
|
319
|
+
M->>M: Показать правильные соответствия
|
|
320
|
+
M->>STORE: completeExercise(sectionId, exerciseId, 0)
|
|
321
|
+
STORE->>STORE: streak = 0
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
M->>S: Показать результат + кнопку "Далее"
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## Flow: Упражнение Drag-to-Order
|
|
330
|
+
|
|
331
|
+
### Sequence Diagram
|
|
332
|
+
|
|
333
|
+
```mermaid
|
|
334
|
+
sequenceDiagram
|
|
335
|
+
actor S as Студент
|
|
336
|
+
participant D as DragToOrder Component
|
|
337
|
+
participant STORE as Zustand Store
|
|
338
|
+
|
|
339
|
+
S->>D: Открыть упражнение
|
|
340
|
+
D->>D: Отрисовать перемешанный список элементов
|
|
341
|
+
|
|
342
|
+
loop Перестановка элементов
|
|
343
|
+
S->>D: Захватить элемент (drag start)
|
|
344
|
+
D->>D: Визуальное выделение + placeholder
|
|
345
|
+
S->>D: Переместить на новую позицию (drag over)
|
|
346
|
+
D->>D: Показать индикатор позиции вставки
|
|
347
|
+
S->>D: Отпустить (drop)
|
|
348
|
+
D->>D: Переставить элемент в новую позицию
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
S->>D: Нажать "Проверить порядок"
|
|
352
|
+
D->>D: Сравнить currentOrder с correctOrder
|
|
353
|
+
|
|
354
|
+
alt Полностью верный порядок
|
|
355
|
+
D->>D: Анимация успеха
|
|
356
|
+
D->>STORE: completeExercise(sectionId, exerciseId, 10)
|
|
357
|
+
STORE->>STORE: totalPoints += 10, streak += 1
|
|
358
|
+
else 1 перестановка от верного
|
|
359
|
+
D->>D: Показать "Почти! Один элемент не на месте"
|
|
360
|
+
D->>D: Подсветить неверный элемент
|
|
361
|
+
D->>STORE: completeExercise(sectionId, exerciseId, 5)
|
|
362
|
+
else Более 1 ошибки
|
|
363
|
+
D->>D: Показать правильный порядок
|
|
364
|
+
D->>STORE: completeExercise(sectionId, exerciseId, 0)
|
|
365
|
+
STORE->>STORE: streak = 0
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
D->>S: Показать результат + кнопку "Далее"
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## Flow: Упражнение Command Builder
|
|
374
|
+
|
|
375
|
+
### Sequence Diagram
|
|
376
|
+
|
|
377
|
+
```mermaid
|
|
378
|
+
sequenceDiagram
|
|
379
|
+
actor S as Студент
|
|
380
|
+
participant CB as CommandBuilder Component
|
|
381
|
+
participant STORE as Zustand Store
|
|
382
|
+
|
|
383
|
+
S->>CB: Открыть упражнение
|
|
384
|
+
CB->>CB: Показать инструкцию: "Собери команду для..."
|
|
385
|
+
CB->>CB: Отрисовать доступные части (кнопки/чипы)
|
|
386
|
+
CB->>CB: Показать пустую строку сборки
|
|
387
|
+
|
|
388
|
+
loop Сборка команды
|
|
389
|
+
S->>CB: Нажать на часть команды
|
|
390
|
+
CB->>CB: Добавить часть в строку сборки
|
|
391
|
+
CB->>CB: Визуально отключить использованную часть
|
|
392
|
+
|
|
393
|
+
opt Удаление части
|
|
394
|
+
S->>CB: Нажать на часть в строке сборки
|
|
395
|
+
CB->>CB: Удалить часть из строки
|
|
396
|
+
CB->>CB: Вернуть часть в доступные
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
S->>CB: Нажать "Проверить команду"
|
|
401
|
+
CB->>CB: Сравнить с correctCommand
|
|
402
|
+
|
|
403
|
+
alt Точное совпадение с correctCommand
|
|
404
|
+
CB->>CB: Подсветить строку зелёным
|
|
405
|
+
CB->>CB: Показать "Верно!"
|
|
406
|
+
CB->>STORE: completeExercise(sectionId, exerciseId, 10)
|
|
407
|
+
STORE->>STORE: totalPoints += 10, streak += 1
|
|
408
|
+
else Совпадение с acceptableAlternatives
|
|
409
|
+
CB->>CB: Подсветить строку жёлтым
|
|
410
|
+
CB->>CB: Показать "Допустимо, но есть лучший вариант"
|
|
411
|
+
CB->>STORE: completeExercise(sectionId, exerciseId, 5)
|
|
412
|
+
else Не совпадает
|
|
413
|
+
CB->>CB: Подсветить строку красным
|
|
414
|
+
CB->>CB: Показать правильную команду
|
|
415
|
+
CB->>STORE: completeExercise(sectionId, exerciseId, 0)
|
|
416
|
+
STORE->>STORE: streak = 0
|
|
417
|
+
end
|
|
418
|
+
|
|
419
|
+
CB->>S: Показать результат + кнопку "Далее"
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
## Flow: Упражнение Scenario Game
|
|
425
|
+
|
|
426
|
+
### Sequence Diagram
|
|
427
|
+
|
|
428
|
+
```mermaid
|
|
429
|
+
sequenceDiagram
|
|
430
|
+
actor S as Студент
|
|
431
|
+
participant SG as ScenarioGame Component
|
|
432
|
+
participant STORE as Zustand Store
|
|
433
|
+
|
|
434
|
+
S->>SG: Открыть упражнение
|
|
435
|
+
SG->>SG: Показать текст ситуации (situation)
|
|
436
|
+
SG->>SG: Отрисовать варианты действий (choices)
|
|
437
|
+
|
|
438
|
+
S->>SG: Выбрать вариант действия
|
|
439
|
+
|
|
440
|
+
SG->>SG: Показать outcome для выбранного варианта
|
|
441
|
+
SG->>SG: Выделить оптимальный вариант
|
|
442
|
+
|
|
443
|
+
alt Выбран оптимальный вариант (isOptimal: true)
|
|
444
|
+
SG->>SG: Подсветить зелёным
|
|
445
|
+
SG->>SG: Показать outcome: "Отличный выбор! ..."
|
|
446
|
+
SG->>STORE: completeExercise(sectionId, exerciseId, 10)
|
|
447
|
+
STORE->>STORE: totalPoints += 10, streak += 1
|
|
448
|
+
else Выбран допустимый вариант (points: 5)
|
|
449
|
+
SG->>SG: Подсветить жёлтым
|
|
450
|
+
SG->>SG: Показать outcome: "Сработает, но..."
|
|
451
|
+
SG->>SG: Показать оптимальный вариант для сравнения
|
|
452
|
+
SG->>STORE: completeExercise(sectionId, exerciseId, 5)
|
|
453
|
+
else Выбран плохой вариант (points: 0)
|
|
454
|
+
SG->>SG: Подсветить красным
|
|
455
|
+
SG->>SG: Показать outcome: "Это приведёт к..."
|
|
456
|
+
SG->>SG: Показать оптимальный вариант
|
|
457
|
+
SG->>STORE: completeExercise(sectionId, exerciseId, 0)
|
|
458
|
+
STORE->>STORE: streak = 0
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
SG->>S: Показать кнопку "Далее"
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
---
|
|
465
|
+
|
|
466
|
+
## Flow: Разблокировка достижения
|
|
467
|
+
|
|
468
|
+
### Flowchart
|
|
469
|
+
|
|
470
|
+
```mermaid
|
|
471
|
+
flowchart TD
|
|
472
|
+
EVENT["Событие:<br/>упражнение выполнено /<br/>секция завершена /<br/>тест сдан"] --> CHECK_ALL
|
|
473
|
+
|
|
474
|
+
CHECK_ALL["Проверить ВСЕ<br/>незаблокированные достижения"] --> LOOP
|
|
475
|
+
|
|
476
|
+
LOOP{"Для каждого<br/>незаблокированного<br/>достижения"}
|
|
477
|
+
|
|
478
|
+
LOOP --> CHECK_TYPE{"Тип критерия?"}
|
|
479
|
+
|
|
480
|
+
CHECK_TYPE -->|"exercise_count"| C1["totalCompleted >= count?"]
|
|
481
|
+
CHECK_TYPE -->|"section_complete"| C2["sectionProgress[id] == 100?"]
|
|
482
|
+
CHECK_TYPE -->|"section_perfect"| C3["Все упражнения секции<br/>выполнены с max points?"]
|
|
483
|
+
CHECK_TYPE -->|"streak"| C4["currentStreak >= count?"]
|
|
484
|
+
CHECK_TYPE -->|"points_total"| C5["totalPoints >= count?"]
|
|
485
|
+
CHECK_TYPE -->|"all_sections"| C6["Все секции завершены?"]
|
|
486
|
+
CHECK_TYPE -->|"final_test_pass"| C7["finalTestScore >= minScore?"]
|
|
487
|
+
CHECK_TYPE -->|"final_test_perfect"| C8["finalTestScore == 100?"]
|
|
488
|
+
|
|
489
|
+
C1 --> MET{"Критерий<br/>выполнен?"}
|
|
490
|
+
C2 --> MET
|
|
491
|
+
C3 --> MET
|
|
492
|
+
C4 --> MET
|
|
493
|
+
C5 --> MET
|
|
494
|
+
C6 --> MET
|
|
495
|
+
C7 --> MET
|
|
496
|
+
C8 --> MET
|
|
497
|
+
|
|
498
|
+
MET -->|"Нет"| LOOP
|
|
499
|
+
MET -->|"Да"| UNLOCK["unlockAchievement(id)"]
|
|
500
|
+
|
|
501
|
+
UNLOCK --> ADD_POINTS["totalPoints += achievement.points"]
|
|
502
|
+
ADD_POINTS --> TOAST["showToast:<br/>'Achievement Unlocked:<br/>[title]!'"]
|
|
503
|
+
TOAST --> ANIMATE["Toast notification:<br/>иконка + название + очки<br/>автозакрытие через 4 сек"]
|
|
504
|
+
ANIMATE --> PERSIST["persist -> localStorage"]
|
|
505
|
+
PERSIST --> LOOP
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### Пример потока
|
|
509
|
+
|
|
510
|
+
```
|
|
511
|
+
Событие: студент выполнил 10-е упражнение подряд (streak = 10)
|
|
512
|
+
|
|
513
|
+
Проверка достижений:
|
|
514
|
+
- "first-exercise" (exercise_count: 1) -> уже разблокировано -> SKIP
|
|
515
|
+
- "fast-learner" (exercise_count: 5) -> уже разблокировано -> SKIP
|
|
516
|
+
- "streak-5" (streak: 5) -> уже разблокировано -> SKIP
|
|
517
|
+
- "streak-10" (streak: 10) -> streak=10 >= 10 -> UNLOCK!
|
|
518
|
+
|
|
519
|
+
Результат:
|
|
520
|
+
-> unlockAchievement("streak-10")
|
|
521
|
+
-> totalPoints += 100 (rarity: rare)
|
|
522
|
+
-> Toast: "Achievement Unlocked: On Fire! +100 pts"
|
|
523
|
+
-> persist to localStorage
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
---
|
|
527
|
+
|
|
528
|
+
## Flow: Отслеживание прогресса
|
|
529
|
+
|
|
530
|
+
### Sequence Diagram
|
|
531
|
+
|
|
532
|
+
```mermaid
|
|
533
|
+
sequenceDiagram
|
|
534
|
+
actor S as Студент
|
|
535
|
+
participant EX as Exercise Component
|
|
536
|
+
participant STORE as Zustand Store
|
|
537
|
+
participant UI as UI Components
|
|
538
|
+
participant LS as localStorage
|
|
539
|
+
|
|
540
|
+
S->>EX: Завершить упражнение
|
|
541
|
+
EX->>STORE: completeExercise(sectionId, exerciseId, points)
|
|
542
|
+
|
|
543
|
+
STORE->>STORE: Добавить exerciseId в completedExercises[sectionId]
|
|
544
|
+
STORE->>STORE: Пересчитать sectionProgress[sectionId]
|
|
545
|
+
|
|
546
|
+
Note over STORE: sectionProgress = <br/>completedCount / totalExercisesInSection * 100
|
|
547
|
+
|
|
548
|
+
STORE->>LS: persist({ completedExercises, sectionProgress, ... })
|
|
549
|
+
|
|
550
|
+
alt Секция завершена (progress = 100%)
|
|
551
|
+
STORE->>STORE: Проверить достижение section_complete
|
|
552
|
+
STORE->>UI: showToast("Section Complete! +25 pts")
|
|
553
|
+
end
|
|
554
|
+
|
|
555
|
+
STORE->>UI: Re-render (через подписку)
|
|
556
|
+
|
|
557
|
+
UI->>UI: Обновить ProgressBar в Sidebar
|
|
558
|
+
UI->>UI: Обновить секционный прогресс на HomePage
|
|
559
|
+
UI->>UI: Обновить общий прогресс в Header
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
### Формула прогресса
|
|
563
|
+
|
|
564
|
+
```
|
|
565
|
+
Прогресс секции:
|
|
566
|
+
sectionProgress[id] = (completedExercises[id].size / totalExercises[id]) * 100
|
|
567
|
+
|
|
568
|
+
Общий прогресс:
|
|
569
|
+
overallProgress = sum(completedExercises[*].size) / totalExercises * 100
|
|
570
|
+
|
|
571
|
+
Где totalExercises для секции = exercises.filter(e => e.sectionId === id).length
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
---
|
|
575
|
+
|
|
576
|
+
## Flow: Финальный тест
|
|
577
|
+
|
|
578
|
+
### Sequence Diagram
|
|
579
|
+
|
|
580
|
+
```mermaid
|
|
581
|
+
sequenceDiagram
|
|
582
|
+
actor S as Студент
|
|
583
|
+
participant FT as FinalTestPage
|
|
584
|
+
participant STORE as Zustand Store
|
|
585
|
+
|
|
586
|
+
S->>FT: Перейти на "Финальный тест"
|
|
587
|
+
FT->>FT: Загрузить quizQuestions.js
|
|
588
|
+
FT->>FT: Перемешать порядок вопросов
|
|
589
|
+
FT->>FT: Показать "Вопрос 1 из N"
|
|
590
|
+
|
|
591
|
+
loop Для каждого вопроса
|
|
592
|
+
FT->>S: Показать вопрос + 4 варианта
|
|
593
|
+
S->>FT: Выбрать ответ
|
|
594
|
+
FT->>FT: Сохранить ответ в локальный state
|
|
595
|
+
FT->>FT: Перейти к следующему вопросу
|
|
596
|
+
|
|
597
|
+
opt Навигация назад
|
|
598
|
+
S->>FT: Нажать "Предыдущий"
|
|
599
|
+
FT->>FT: Вернуться к предыдущему вопросу
|
|
600
|
+
FT->>FT: Показать ранее выбранный ответ
|
|
601
|
+
end
|
|
602
|
+
end
|
|
603
|
+
|
|
604
|
+
S->>FT: Нажать "Завершить тест"
|
|
605
|
+
|
|
606
|
+
FT->>FT: Подсчитать результат:<br/>correctCount / totalQuestions * 100
|
|
607
|
+
|
|
608
|
+
FT->>STORE: submitFinalTest(answers)
|
|
609
|
+
STORE->>STORE: finalTestScore = score
|
|
610
|
+
STORE->>STORE: finalTestAnswers = { q1: 2, q2: 0, ... }
|
|
611
|
+
|
|
612
|
+
alt Score >= passingThreshold (70%)
|
|
613
|
+
STORE->>STORE: Проверить достижение final_test_pass
|
|
614
|
+
alt Score == 100%
|
|
615
|
+
STORE->>STORE: Проверить достижение final_test_perfect
|
|
616
|
+
end
|
|
617
|
+
end
|
|
618
|
+
|
|
619
|
+
FT->>S: Redirect -> ResultsPage
|
|
620
|
+
|
|
621
|
+
Note over S: ResultsPage показывает:
|
|
622
|
+
Note over S: - Общий балл (%)
|
|
623
|
+
Note over S: - Буквенная оценка (A/B/C/D/F)
|
|
624
|
+
Note over S: - Breakdown по секциям
|
|
625
|
+
Note over S: - Неверные ответы с пояснениями
|
|
626
|
+
Note over S: - Кнопка "Пройти заново"
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
### Flowchart результатов
|
|
630
|
+
|
|
631
|
+
```mermaid
|
|
632
|
+
flowchart TD
|
|
633
|
+
SCORE["Финальный балл"] --> GRADE{"Оценка"}
|
|
634
|
+
|
|
635
|
+
GRADE -->|">= 90%"| A["Grade A: Excellent"]
|
|
636
|
+
GRADE -->|"80-89%"| B["Grade B: Good"]
|
|
637
|
+
GRADE -->|"70-79%"| C["Grade C: Satisfactory<br/>(passing)"]
|
|
638
|
+
GRADE -->|"60-69%"| D["Grade D: Needs Improvement"]
|
|
639
|
+
GRADE -->|"< 60%"| F["Grade F: Failing"]
|
|
640
|
+
|
|
641
|
+
A --> DISPLAY
|
|
642
|
+
B --> DISPLAY
|
|
643
|
+
C --> DISPLAY
|
|
644
|
+
D --> DISPLAY
|
|
645
|
+
F --> DISPLAY
|
|
646
|
+
|
|
647
|
+
DISPLAY["Страница результатов:<br/>- Балл: X%<br/>- Оценка: [A-F]<br/>- Секции: breakdown<br/>- Ошибки: пояснения"]
|
|
648
|
+
|
|
649
|
+
DISPLAY --> ACTIONS{"Действия"}
|
|
650
|
+
ACTIONS -->|"Пройти заново"| RETRY["Сбросить ответы,<br/>перемешать вопросы"]
|
|
651
|
+
ACTIONS -->|"Вернуться к разделам"| REVIEW["Перейти на HomePage,<br/>изучить слабые секции"]
|
|
652
|
+
```
|
|
653
|
+
|
|
654
|
+
---
|
|
655
|
+
|
|
656
|
+
## Flow: Сборка и деплой
|
|
657
|
+
|
|
658
|
+
### Flowchart
|
|
659
|
+
|
|
660
|
+
```mermaid
|
|
661
|
+
flowchart TD
|
|
662
|
+
START(["Проект сгенерирован"]) --> INSTALL
|
|
663
|
+
|
|
664
|
+
subgraph LOCAL ["Локальная разработка"]
|
|
665
|
+
INSTALL["npm install<br/>(установка зависимостей)"]
|
|
666
|
+
DEV["npm run dev<br/>(Vite dev server)"]
|
|
667
|
+
EDIT["Редактирование файлов<br/>(опционально)"]
|
|
668
|
+
BUILD["npm run build<br/>(production сборка)"]
|
|
669
|
+
PREVIEW["npm run preview<br/>(проверка локально)"]
|
|
670
|
+
|
|
671
|
+
INSTALL --> DEV
|
|
672
|
+
DEV --> EDIT
|
|
673
|
+
EDIT --> DEV
|
|
674
|
+
DEV --> BUILD
|
|
675
|
+
BUILD --> PREVIEW
|
|
676
|
+
end
|
|
677
|
+
|
|
678
|
+
PREVIEW --> PUSH
|
|
679
|
+
|
|
680
|
+
subgraph DEPLOY ["GitHub Pages Deploy"]
|
|
681
|
+
PUSH["git push origin main"]
|
|
682
|
+
TRIGGER["GitHub Actions:<br/>workflow triggered"]
|
|
683
|
+
GH_INSTALL["npm install"]
|
|
684
|
+
GH_BUILD["npm run build"]
|
|
685
|
+
UPLOAD["Upload dist/ artifact"]
|
|
686
|
+
PAGES["Deploy to GitHub Pages"]
|
|
687
|
+
LIVE["Сайт доступен:<br/>https://user.github.io/repo/"]
|
|
688
|
+
|
|
689
|
+
PUSH --> TRIGGER
|
|
690
|
+
TRIGGER --> GH_INSTALL
|
|
691
|
+
GH_INSTALL --> GH_BUILD
|
|
692
|
+
GH_BUILD --> UPLOAD
|
|
693
|
+
UPLOAD --> PAGES
|
|
694
|
+
PAGES --> LIVE
|
|
695
|
+
end
|
|
696
|
+
|
|
697
|
+
subgraph ALT ["Альтернативный деплой"]
|
|
698
|
+
VERCEL["vercel --prod<br/>(Vercel)"]
|
|
699
|
+
NETLIFY["netlify deploy --prod<br/>(Netlify)"]
|
|
700
|
+
NGINX["Копировать dist/ на сервер<br/>(Nginx / Apache)"]
|
|
701
|
+
LOCAL_OPEN["Открыть dist/index.html<br/>(локально, offline)"]
|
|
702
|
+
end
|
|
703
|
+
|
|
704
|
+
BUILD --> VERCEL
|
|
705
|
+
BUILD --> NETLIFY
|
|
706
|
+
BUILD --> NGINX
|
|
707
|
+
BUILD --> LOCAL_OPEN
|
|
708
|
+
```
|
|
709
|
+
|
|
710
|
+
### GitHub Actions workflow шаг за шагом
|
|
711
|
+
|
|
712
|
+
```
|
|
713
|
+
1. Push в ветку main
|
|
714
|
+
-> GitHub Actions detect push event
|
|
715
|
+
|
|
716
|
+
2. Job: build
|
|
717
|
+
-> Checkout репозитория
|
|
718
|
+
-> Setup Node.js 20
|
|
719
|
+
-> npm install (cached)
|
|
720
|
+
-> npm run build
|
|
721
|
+
-> Upload dist/ as artifact
|
|
722
|
+
|
|
723
|
+
3. Job: deploy (depends on build)
|
|
724
|
+
-> Download artifact
|
|
725
|
+
-> Deploy to GitHub Pages
|
|
726
|
+
-> Output: page URL
|
|
727
|
+
|
|
728
|
+
4. Результат:
|
|
729
|
+
-> https://user.github.io/repo/ доступен
|
|
730
|
+
-> SPA загружается с хешированным JS/CSS
|
|
731
|
+
-> HashRouter обрабатывает маршруты клиентски
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
---
|
|
735
|
+
|
|
736
|
+
## Быстрый справочник
|
|
737
|
+
|
|
738
|
+
### Потоки генерации (администратор)
|
|
739
|
+
|
|
740
|
+
| Шаг | Модуль | Вход | Выход |
|
|
741
|
+
|-----|--------|------|-------|
|
|
742
|
+
| 1 | Content Analysis | URL / файл / текст / тема | Structured analysis |
|
|
743
|
+
| 2 | Course Structure | Structured analysis | Секции + маппинг упражнений |
|
|
744
|
+
| 3 | Data Generation | Структура курса | 4 файла .js |
|
|
745
|
+
| 4 | Scaffold | Метаданные проекта | Каркас Vite + React |
|
|
746
|
+
| 5 | Components | Список компонентов | 22 JSX-файла |
|
|
747
|
+
| 6 | Gamification | Данные достижений | Zustand store + hooks |
|
|
748
|
+
| 7 | Deploy | Имя репозитория | GitHub Actions workflow |
|
|
749
|
+
| 8 | Verification | Весь проект | 5 проверок: PASS/FAIL |
|
|
750
|
+
|
|
751
|
+
### Потоки обучения (студент)
|
|
752
|
+
|
|
753
|
+
| Действие | Компоненты | Результат |
|
|
754
|
+
|---------|-----------|----------|
|
|
755
|
+
| Выполнение упражнения | Exercise -> Store -> Toast | +10 pts, streak update |
|
|
756
|
+
| Завершение секции | SectionPage -> Store -> Toast | +25 pts, progress 100% |
|
|
757
|
+
| Разблокировка достижения | Store -> AchievementPopup -> Toast | +50-200 pts |
|
|
758
|
+
| Прохождение финального теста | FinalTestPage -> Store -> ResultsPage | Оценка A-F |
|
|
759
|
+
| Просмотр прогресса | Sidebar, Header, HomePage | % по секциям и общий |
|