@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,84 @@
|
|
|
1
|
+
# Step 0: Content Analysis
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
Parse source documentation and extract distinct teachable topics.
|
|
5
|
+
|
|
6
|
+
## Protocol
|
|
7
|
+
|
|
8
|
+
1. **Identify input type:**
|
|
9
|
+
- URL(s) → use WebFetch to retrieve content
|
|
10
|
+
- Local path(s) → use Read tool
|
|
11
|
+
- Pasted text → use directly
|
|
12
|
+
- Topic description → generate content from knowledge
|
|
13
|
+
|
|
14
|
+
2. **Extract topics:**
|
|
15
|
+
- Read through all source material
|
|
16
|
+
- Identify distinct concepts/practices/techniques
|
|
17
|
+
- Group related content into logical units
|
|
18
|
+
- Each unit = one potential section
|
|
19
|
+
|
|
20
|
+
3. **For each topic, capture:**
|
|
21
|
+
- Title (concise, 3-8 words)
|
|
22
|
+
- Description (1 sentence)
|
|
23
|
+
- Key concepts (3-5 bullet points)
|
|
24
|
+
- Practical value (why learn this?)
|
|
25
|
+
- Content depth estimate (shallow/medium/deep)
|
|
26
|
+
|
|
27
|
+
4. **Determine language:**
|
|
28
|
+
- Auto-detect from source content
|
|
29
|
+
- If mixed, ask user preference
|
|
30
|
+
- All UI text must match chosen language
|
|
31
|
+
|
|
32
|
+
5. **Estimate scope:**
|
|
33
|
+
- Count topics → section count
|
|
34
|
+
- If < 3: warn user, suggest adding more content
|
|
35
|
+
- If > 20: suggest grouping or splitting into multiple courses
|
|
36
|
+
- Sweet spot: 5-15 sections
|
|
37
|
+
|
|
38
|
+
## Output Format
|
|
39
|
+
|
|
40
|
+
```javascript
|
|
41
|
+
// Topic analysis result
|
|
42
|
+
{
|
|
43
|
+
language: 'ru' | 'en',
|
|
44
|
+
courseTitle: 'string',
|
|
45
|
+
courseDescription: 'string',
|
|
46
|
+
topics: [
|
|
47
|
+
{
|
|
48
|
+
title: 'string',
|
|
49
|
+
description: 'string',
|
|
50
|
+
keyConcepts: ['string'],
|
|
51
|
+
depth: 'shallow' | 'medium' | 'deep',
|
|
52
|
+
suggestedExercise: 'quiz' | 'flashcards' | 'matching' | 'drag-order' | 'builder' | 'scenario'
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Exercise Type Heuristics
|
|
59
|
+
|
|
60
|
+
| Content Nature | Best Exercise Type | `interactiveType` value |
|
|
61
|
+
|---------------|-------------------|------------------------|
|
|
62
|
+
| Definitions, terms, concepts | Flashcards | `'flashcards'` |
|
|
63
|
+
| Comparisons, mappings, associations | Matching | `'matching'` |
|
|
64
|
+
| Factual knowledge, best practices | Quiz | `'quiz'` |
|
|
65
|
+
| Sequential processes, ordered steps | Drag-to-Order | `'drag-and-drop'` |
|
|
66
|
+
| Command syntax, API calls | Command Builder | `'builder'` |
|
|
67
|
+
| Decision-making, workflows | Scenario Game | `'scenario'` |
|
|
68
|
+
|
|
69
|
+
**IMPORTANT:** Use ONLY these exact `interactiveType` values. Do NOT use `'drag-order'`, `'ordering'`, or `'simulation'` — they are legacy aliases.
|
|
70
|
+
|
|
71
|
+
## Checkpoint
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
Step 0/7: Content Analysis Complete
|
|
75
|
+
Topics: N identified
|
|
76
|
+
Language: {language}
|
|
77
|
+
Course: "{courseTitle}"
|
|
78
|
+
|
|
79
|
+
Topic list:
|
|
80
|
+
1. {title} — {suggestedExercise}
|
|
81
|
+
...
|
|
82
|
+
|
|
83
|
+
"ok" to continue | "[feedback]" to adjust
|
|
84
|
+
```
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Step 1: Course Structure
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
Transform analyzed topics into a structured course with section definitions and exercise assignments.
|
|
5
|
+
|
|
6
|
+
## Protocol
|
|
7
|
+
|
|
8
|
+
1. **Order sections** from foundational to advanced:
|
|
9
|
+
- Basic concepts first
|
|
10
|
+
- Build on prior knowledge
|
|
11
|
+
- End with synthesis/integration topics
|
|
12
|
+
|
|
13
|
+
2. **Assign exercise types** per section:
|
|
14
|
+
- Read `references/exercise-catalog.md` for guidance
|
|
15
|
+
- Vary types to avoid monotony (no 3+ consecutive same type)
|
|
16
|
+
- Match exercise to content nature (see heuristics in Step 0)
|
|
17
|
+
- Each of the 6 types should appear at least once if section count >= 6
|
|
18
|
+
|
|
19
|
+
3. **Write theory text** per section:
|
|
20
|
+
- 150-400 words per section
|
|
21
|
+
- Structure: context -> core concept -> practical application
|
|
22
|
+
- Use newlines for paragraph separation
|
|
23
|
+
- Include **bold** for key terms
|
|
24
|
+
- Keep language consistent with source material
|
|
25
|
+
|
|
26
|
+
4. **Assign icons** (emoji) per section:
|
|
27
|
+
- Relevant to the topic
|
|
28
|
+
- Distinct across sections (no duplicates)
|
|
29
|
+
|
|
30
|
+
5. **Define section metadata:**
|
|
31
|
+
```javascript
|
|
32
|
+
{
|
|
33
|
+
id: 'kebab-case-unique', // 2-4 words, descriptive
|
|
34
|
+
order: 1, // Sequential from 1
|
|
35
|
+
title: 'N. Full Title', // With order number prefix
|
|
36
|
+
shortTitle: 'Short Name', // For sidebar (2-3 words)
|
|
37
|
+
description: 'One-line summary of this section',
|
|
38
|
+
icon: 'emoji',
|
|
39
|
+
interactiveType: 'quiz' | 'flashcards' | 'matching' | 'drag-and-drop' | 'builder' | 'simulation' | 'scenario',
|
|
40
|
+
theory: 'Multi-paragraph theory text...'
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
6. **Define final test questions:**
|
|
45
|
+
- One question per section (for final assessment)
|
|
46
|
+
- 4 options each, one correct
|
|
47
|
+
- Test understanding, not memorization
|
|
48
|
+
|
|
49
|
+
## Constraints
|
|
50
|
+
|
|
51
|
+
- Minimum 3 sections, maximum 20
|
|
52
|
+
- Each section must have exactly 1 exercise type
|
|
53
|
+
- `interactiveType` must be one of the 6 supported types:
|
|
54
|
+
- `'quiz'` -> Quiz component
|
|
55
|
+
- `'flashcards'` -> Flashcard component
|
|
56
|
+
- `'matching'` -> MatchingExercise component
|
|
57
|
+
- `'drag-and-drop'` or `'ordering'` -> DragOrder component
|
|
58
|
+
- `'builder'` -> CommandBuilder component
|
|
59
|
+
- `'simulation'` or `'scenario'` -> ScenarioGame component
|
|
60
|
+
|
|
61
|
+
## Output
|
|
62
|
+
|
|
63
|
+
Section definitions ready for `sections.js` generation in Step 2.
|
|
64
|
+
|
|
65
|
+
## Checkpoint
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
Step 1/7: Course Structure Complete
|
|
69
|
+
Sections: N defined
|
|
70
|
+
|
|
71
|
+
1. {icon} {title} — {interactiveType}
|
|
72
|
+
2. ...
|
|
73
|
+
|
|
74
|
+
"ok" to continue | "[feedback]" to adjust
|
|
75
|
+
```
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# Step 2: Data Generation
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
Generate all data files (`sections.js`, `exercises.js`, `quizQuestions.js`, `achievements.js`) from the course structure.
|
|
5
|
+
|
|
6
|
+
## Protocol
|
|
7
|
+
|
|
8
|
+
Read `references/data-schemas.md` for exact data formats.
|
|
9
|
+
|
|
10
|
+
### 1. Generate `src/data/sections.js`
|
|
11
|
+
|
|
12
|
+
```javascript
|
|
13
|
+
export const SECTIONS = [
|
|
14
|
+
{
|
|
15
|
+
id: 'section-id',
|
|
16
|
+
order: 1,
|
|
17
|
+
title: '1. Section Title',
|
|
18
|
+
shortTitle: 'Short Title',
|
|
19
|
+
description: 'Description',
|
|
20
|
+
icon: 'emoji',
|
|
21
|
+
interactiveType: 'type',
|
|
22
|
+
theory: `Theory text with **bold** and paragraphs separated by \\n\\n`
|
|
23
|
+
},
|
|
24
|
+
// ... one per section
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
export const TOTAL_SECTIONS = SECTIONS.length
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. Generate `src/data/exercises.js`
|
|
31
|
+
|
|
32
|
+
For each section, generate exercise data matching its type:
|
|
33
|
+
|
|
34
|
+
**Flashcards:**
|
|
35
|
+
```javascript
|
|
36
|
+
export const flashcardData = {
|
|
37
|
+
'section-id': [
|
|
38
|
+
{ front: 'Term or question', back: 'Definition or answer' },
|
|
39
|
+
// 4-8 cards per section
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**Matching:**
|
|
45
|
+
```javascript
|
|
46
|
+
export const matchingData = {
|
|
47
|
+
'section-id': [
|
|
48
|
+
{ left: 'Item A', right: 'Match A' },
|
|
49
|
+
// 4-6 pairs per section
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Drag Order:**
|
|
55
|
+
```javascript
|
|
56
|
+
export const dragOrderData = {
|
|
57
|
+
'section-id': {
|
|
58
|
+
instruction: 'Arrange these in correct order:',
|
|
59
|
+
items: [{ id: '1', label: 'Step 1' }, ...],
|
|
60
|
+
correctOrder: ['1', '2', '3', ...]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Also export as orderingData if section uses 'ordering' type
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Command Builder:**
|
|
67
|
+
```javascript
|
|
68
|
+
export const commandBuilderData = {
|
|
69
|
+
'section-id': {
|
|
70
|
+
instruction: 'Build the correct command:',
|
|
71
|
+
parts: ['part1', ' ', 'part2', ...],
|
|
72
|
+
correctCommand: 'part1 part2...',
|
|
73
|
+
hints: ['Hint for first part', 'Hint for second part']
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Scenario/Simulation:**
|
|
79
|
+
```javascript
|
|
80
|
+
export const simulationData = {
|
|
81
|
+
'section-id': {
|
|
82
|
+
title: 'Scenario Title',
|
|
83
|
+
scenario: 'Context description',
|
|
84
|
+
steps: [
|
|
85
|
+
{
|
|
86
|
+
id: 'step1',
|
|
87
|
+
description: 'What do you do?',
|
|
88
|
+
options: [
|
|
89
|
+
{ id: 'a', text: 'Good choice', result: 'positive', feedback: 'Why this is good' },
|
|
90
|
+
{ id: 'b', text: 'OK choice', result: 'neutral', feedback: 'Why this is OK' },
|
|
91
|
+
{ id: 'c', text: 'Bad choice', result: 'negative', feedback: 'Why this is bad' }
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
// 3-5 steps per scenario
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Also export as scenarioData for 'scenario' type sections
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**FAQ:**
|
|
102
|
+
```javascript
|
|
103
|
+
export const faqData = [
|
|
104
|
+
{ question: 'Frequently asked question?', answer: 'Detailed answer.' },
|
|
105
|
+
// 5-8 FAQ items about the course topic
|
|
106
|
+
]
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 3. Generate `src/data/quizQuestions.js`
|
|
110
|
+
|
|
111
|
+
**Per-section quizzes** (for sections with `interactiveType: 'quiz'`):
|
|
112
|
+
```javascript
|
|
113
|
+
export const quizQuestions = {
|
|
114
|
+
'section-id': [
|
|
115
|
+
{
|
|
116
|
+
id: 'section-id-q1',
|
|
117
|
+
question: 'Question text?',
|
|
118
|
+
options: ['Option A', 'Option B', 'Option C', 'Option D'],
|
|
119
|
+
correctAnswer: 0, // index
|
|
120
|
+
explanation: 'Why this is correct'
|
|
121
|
+
},
|
|
122
|
+
// 2-4 questions per section
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Final test** (one question per section):
|
|
128
|
+
```javascript
|
|
129
|
+
export const finalTestQuestions = [
|
|
130
|
+
{
|
|
131
|
+
id: 'final-section-id',
|
|
132
|
+
sectionId: 'section-id',
|
|
133
|
+
question: 'Comprehensive question about this section?',
|
|
134
|
+
options: ['A', 'B', 'C', 'D'],
|
|
135
|
+
correctAnswer: 1
|
|
136
|
+
},
|
|
137
|
+
// one per section
|
|
138
|
+
]
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### 4. Generate `src/data/achievements.js`
|
|
142
|
+
|
|
143
|
+
Standard achievement set (adapted to section count N):
|
|
144
|
+
|
|
145
|
+
```javascript
|
|
146
|
+
export const ACHIEVEMENTS = [
|
|
147
|
+
{
|
|
148
|
+
id: 'first-step',
|
|
149
|
+
title: 'First Step', // Localized
|
|
150
|
+
description: 'Complete your first section',
|
|
151
|
+
icon: 'emoji',
|
|
152
|
+
condition: (state) => Object.keys(state.completedSections).length >= 1
|
|
153
|
+
},
|
|
154
|
+
// Halfway achievement (N/2 sections)
|
|
155
|
+
// Perfectionist (any section 100%)
|
|
156
|
+
// Full course (all N sections)
|
|
157
|
+
// Test passed (final test >= 70%)
|
|
158
|
+
// 3-5 topic-specific achievements
|
|
159
|
+
]
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Achievement guidelines:**
|
|
163
|
+
- Always include: first-step, halfway, perfectionist, full-course, test-passed
|
|
164
|
+
- Add 3-5 topic-specific achievements based on related section groups
|
|
165
|
+
- Total: 8-12 achievements
|
|
166
|
+
- Icons should be distinct and relevant
|
|
167
|
+
|
|
168
|
+
## Quality Checks
|
|
169
|
+
|
|
170
|
+
- [ ] Every section in SECTIONS has matching exercise data
|
|
171
|
+
- [ ] Every quiz section has questions in quizQuestions
|
|
172
|
+
- [ ] finalTestQuestions has exactly one entry per section
|
|
173
|
+
- [ ] All IDs are unique and kebab-case
|
|
174
|
+
- [ ] correctAnswer indices are within options array bounds
|
|
175
|
+
- [ ] No duplicate FAQ questions
|
|
176
|
+
- [ ] Achievement conditions reference valid state properties
|
|
177
|
+
|
|
178
|
+
## Checkpoint
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
Step 2/7: Data Generation Complete
|
|
182
|
+
Files: sections.js, exercises.js, quizQuestions.js, achievements.js
|
|
183
|
+
Sections: N | Quiz questions: M | Final test: N questions | Achievements: K
|
|
184
|
+
|
|
185
|
+
"ok" to continue | "[feedback]" to adjust
|
|
186
|
+
```
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# Step 3: Project Scaffold
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
Create the project skeleton: package.json, vite config, index.html, CSS theme, ESLint.
|
|
5
|
+
|
|
6
|
+
## Protocol
|
|
7
|
+
|
|
8
|
+
Read `references/tech-stack.md` for versions and configuration.
|
|
9
|
+
|
|
10
|
+
### 1. Determine `base` path
|
|
11
|
+
|
|
12
|
+
```javascript
|
|
13
|
+
// Derive from git remote URL
|
|
14
|
+
// git remote get-url origin → https://github.com/{user}/{repo}.git
|
|
15
|
+
// base = '/{repo}/'
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
If no git remote, ask user for the GitHub repo name.
|
|
19
|
+
|
|
20
|
+
### 2. Create `package.json`
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"name": "{repo-name}",
|
|
25
|
+
"private": true,
|
|
26
|
+
"version": "0.0.0",
|
|
27
|
+
"type": "module",
|
|
28
|
+
"scripts": {
|
|
29
|
+
"dev": "vite",
|
|
30
|
+
"build": "vite build",
|
|
31
|
+
"lint": "eslint .",
|
|
32
|
+
"preview": "vite preview"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"react": "^19.2.0",
|
|
36
|
+
"react-dom": "^19.2.0",
|
|
37
|
+
"react-router-dom": "^7.13.1",
|
|
38
|
+
"zustand": "^5.0.11",
|
|
39
|
+
"@dnd-kit/core": "^6.3.1",
|
|
40
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
41
|
+
"@dnd-kit/utilities": "^3.2.2"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"vite": "^7.3.1",
|
|
45
|
+
"@vitejs/plugin-react": "^5.1.1",
|
|
46
|
+
"tailwindcss": "^4.2.1",
|
|
47
|
+
"@tailwindcss/vite": "^4.2.1",
|
|
48
|
+
"eslint": "^9.39.1",
|
|
49
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
50
|
+
"eslint-plugin-react-refresh": "^0.4.24",
|
|
51
|
+
"globals": "^16.1.0"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### 3. Create `vite.config.js`
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
import { defineConfig } from 'vite'
|
|
60
|
+
import react from '@vitejs/plugin-react'
|
|
61
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
62
|
+
|
|
63
|
+
export default defineConfig({
|
|
64
|
+
plugins: [react(), tailwindcss()],
|
|
65
|
+
base: '/{repo-name}/',
|
|
66
|
+
build: {
|
|
67
|
+
outDir: 'dist',
|
|
68
|
+
},
|
|
69
|
+
})
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 4. Create `index.html`
|
|
73
|
+
|
|
74
|
+
- `lang` attribute matches course language
|
|
75
|
+
- Title = course title
|
|
76
|
+
- SEO meta tags: description, keywords, author
|
|
77
|
+
- Open Graph tags: title, description, type, url, image
|
|
78
|
+
- Twitter Card meta
|
|
79
|
+
- JSON-LD structured data (Course type)
|
|
80
|
+
- Favicon (optional)
|
|
81
|
+
- `<div id="root"></div>`
|
|
82
|
+
- `<script type="module" src="/src/main.jsx"></script>`
|
|
83
|
+
|
|
84
|
+
### 5. Create `public/robots.txt`
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
User-agent: *
|
|
88
|
+
Allow: /
|
|
89
|
+
Sitemap: https://{user}.github.io/{repo-name}/sitemap.xml
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Replace `{user}` and `{repo-name}` with actual GitHub username and repository name.
|
|
93
|
+
|
|
94
|
+
### 6. Create `public/sitemap.xml`
|
|
95
|
+
|
|
96
|
+
Generate a sitemap listing all course sections:
|
|
97
|
+
|
|
98
|
+
```xml
|
|
99
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
100
|
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
101
|
+
<url>
|
|
102
|
+
<loc>https://{user}.github.io/{repo-name}/</loc>
|
|
103
|
+
<lastmod>{build-date}</lastmod>
|
|
104
|
+
<priority>1.0</priority>
|
|
105
|
+
</url>
|
|
106
|
+
<!-- One <url> entry per section -->
|
|
107
|
+
<url>
|
|
108
|
+
<loc>https://{user}.github.io/{repo-name}/#section-{id}</loc>
|
|
109
|
+
<lastmod>{build-date}</lastmod>
|
|
110
|
+
<priority>0.8</priority>
|
|
111
|
+
</url>
|
|
112
|
+
</urlset>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Use ISO 8601 date format for `{build-date}`. Generate one `<url>` entry for each section in the SECTIONS array.
|
|
116
|
+
|
|
117
|
+
### 7. Create `src/index.css`
|
|
118
|
+
|
|
119
|
+
TailwindCSS v4 configuration with semantic color tokens:
|
|
120
|
+
|
|
121
|
+
```css
|
|
122
|
+
@import "tailwindcss";
|
|
123
|
+
|
|
124
|
+
@theme {
|
|
125
|
+
--color-primary-50: #eff6ff;
|
|
126
|
+
--color-primary-100: #dbeafe;
|
|
127
|
+
--color-primary-200: #bfdbfe;
|
|
128
|
+
--color-primary-300: #93c5fd;
|
|
129
|
+
--color-primary-400: #60a5fa;
|
|
130
|
+
--color-primary-500: #3b82f6;
|
|
131
|
+
--color-primary-600: #2563eb;
|
|
132
|
+
--color-primary-700: #1d4ed8;
|
|
133
|
+
--color-primary-800: #1e40af;
|
|
134
|
+
--color-primary-900: #1e3a8a;
|
|
135
|
+
|
|
136
|
+
--color-accent-400: #c084fc;
|
|
137
|
+
--color-accent-500: #a855f7;
|
|
138
|
+
--color-accent-600: #9333ea;
|
|
139
|
+
|
|
140
|
+
--color-success-400: #4ade80;
|
|
141
|
+
--color-success-500: #22c55e;
|
|
142
|
+
--color-success-600: #16a34a;
|
|
143
|
+
--color-success-700: #15803d;
|
|
144
|
+
|
|
145
|
+
--color-danger-400: #f87171;
|
|
146
|
+
--color-danger-500: #ef4444;
|
|
147
|
+
--color-danger-600: #dc2626;
|
|
148
|
+
--color-danger-700: #b91c1c;
|
|
149
|
+
|
|
150
|
+
--color-surface: var(--surface);
|
|
151
|
+
--color-card: var(--card);
|
|
152
|
+
--color-text: var(--text);
|
|
153
|
+
--color-text-secondary: var(--text-secondary);
|
|
154
|
+
--color-text-muted: var(--text-muted);
|
|
155
|
+
--color-border: var(--border);
|
|
156
|
+
--color-border-light: var(--border-light);
|
|
157
|
+
--color-bg-secondary: var(--bg-secondary);
|
|
158
|
+
--color-bg-hover: var(--bg-hover);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
:root {
|
|
162
|
+
--surface: #f8fafc;
|
|
163
|
+
--card: #ffffff;
|
|
164
|
+
--text: #1e293b;
|
|
165
|
+
--text-secondary: #475569;
|
|
166
|
+
--text-muted: #94a3b8;
|
|
167
|
+
--border: #e2e8f0;
|
|
168
|
+
--border-light: #f1f5f9;
|
|
169
|
+
--bg-secondary: #f1f5f9;
|
|
170
|
+
--bg-hover: #f8fafc;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.dark {
|
|
174
|
+
--surface: #0f172a;
|
|
175
|
+
--card: #1e293b;
|
|
176
|
+
--text: #e2e8f0;
|
|
177
|
+
--text-secondary: #94a3b8;
|
|
178
|
+
--text-muted: #64748b;
|
|
179
|
+
--border: #334155;
|
|
180
|
+
--border-light: #1e293b;
|
|
181
|
+
--bg-secondary: #1e293b;
|
|
182
|
+
--bg-hover: #334155;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
body {
|
|
186
|
+
@apply bg-surface text-text min-h-screen;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* Custom animations */
|
|
190
|
+
@keyframes shake {
|
|
191
|
+
0%, 100% { transform: translateX(0); }
|
|
192
|
+
20%, 60% { transform: translateX(-5px); }
|
|
193
|
+
40%, 80% { transform: translateX(5px); }
|
|
194
|
+
}
|
|
195
|
+
@keyframes bounce-in {
|
|
196
|
+
0% { transform: scale(0.3); opacity: 0; }
|
|
197
|
+
50% { transform: scale(1.05); }
|
|
198
|
+
70% { transform: scale(0.9); }
|
|
199
|
+
100% { transform: scale(1); opacity: 1; }
|
|
200
|
+
}
|
|
201
|
+
@keyframes fade-in-up {
|
|
202
|
+
from { opacity: 0; transform: translateY(10px); }
|
|
203
|
+
to { opacity: 1; transform: translateY(0); }
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
@utility animate-shake { animation: shake 0.5s ease-in-out; }
|
|
207
|
+
@utility animate-bounce-in { animation: bounce-in 0.5s ease-out; }
|
|
208
|
+
@utility animate-fade-in-up { animation: fade-in-up 0.3s ease-out; }
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### 6. Create `eslint.config.js`
|
|
212
|
+
|
|
213
|
+
Standard React + hooks ESLint config.
|
|
214
|
+
|
|
215
|
+
### 7. Create `src/main.jsx`
|
|
216
|
+
|
|
217
|
+
```jsx
|
|
218
|
+
import { StrictMode } from 'react'
|
|
219
|
+
import { createRoot } from 'react-dom/client'
|
|
220
|
+
import './index.css'
|
|
221
|
+
import App from './App.jsx'
|
|
222
|
+
|
|
223
|
+
createRoot(document.getElementById('root')).render(
|
|
224
|
+
<StrictMode>
|
|
225
|
+
<App />
|
|
226
|
+
</StrictMode>,
|
|
227
|
+
)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### 8. Run `npm install`
|
|
231
|
+
|
|
232
|
+
Install all dependencies.
|
|
233
|
+
|
|
234
|
+
### 9. Create directory structure
|
|
235
|
+
|
|
236
|
+
```
|
|
237
|
+
mkdir -p src/{components/{layout,interactive,common,sections,final-test},data,store,hooks,pages}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Checkpoint
|
|
241
|
+
|
|
242
|
+
```
|
|
243
|
+
Step 3/7: Project Scaffold Complete
|
|
244
|
+
Base path: /{repo-name}/
|
|
245
|
+
Dependencies installed: yes
|
|
246
|
+
Files: package.json, vite.config.js, index.html, index.css, main.jsx, eslint.config.js
|
|
247
|
+
|
|
248
|
+
"ok" to continue | "[feedback]" to adjust
|
|
249
|
+
```
|