antigravity-devkit 1.0.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/LICENSE +21 -0
- package/README.md +421 -0
- package/bin/cli.js +179 -0
- package/package.json +38 -0
- package/template/ARCHITECTURE.md +148 -0
- package/template/README.md +421 -0
- package/template/agents/backend-specialist.md +137 -0
- package/template/agents/database-architect.md +114 -0
- package/template/agents/debugger.md +108 -0
- package/template/agents/devops-engineer.md +125 -0
- package/template/agents/documentation-writer.md +109 -0
- package/template/agents/explorer-agent.md +107 -0
- package/template/agents/frontend-specialist.md +231 -0
- package/template/agents/orchestrator.md +100 -0
- package/template/agents/performance-optimizer.md +109 -0
- package/template/agents/project-planner.md +123 -0
- package/template/agents/security-auditor.md +107 -0
- package/template/agents/test-engineer.md +133 -0
- package/template/rules/GEMINI.md +180 -0
- package/template/scripts/checklist.py +170 -0
- package/template/scripts/verify_all.py +243 -0
- package/template/skills/api-patterns/SKILL.md +116 -0
- package/template/skills/architecture/SKILL.md +98 -0
- package/template/skills/aspnet-patterns/SKILL.md +120 -0
- package/template/skills/azure-aks/SKILL.md +136 -0
- package/template/skills/azure-devops/SKILL.md +123 -0
- package/template/skills/azure-keyvault/SKILL.md +100 -0
- package/template/skills/brainstorming/SKILL.md +96 -0
- package/template/skills/clean-code/SKILL.md +84 -0
- package/template/skills/csharp-patterns/SKILL.md +115 -0
- package/template/skills/documentation-templates/SKILL.md +127 -0
- package/template/skills/english-education/SKILL.md +116 -0
- package/template/skills/english-education/references/lesson-templates.md +151 -0
- package/template/skills/english-education/references/quiz-templates.md +177 -0
- package/template/skills/english-education/scripts/curriculum_validator.py +175 -0
- package/template/skills/frontend-design/SKILL.md +199 -0
- package/template/skills/frontend-design/animation-guide.md +217 -0
- package/template/skills/frontend-design/design-systems.md +230 -0
- package/template/skills/frontend-design/ux-psychology.md +128 -0
- package/template/skills/gitops-patterns/SKILL.md +105 -0
- package/template/skills/grafana-logging/SKILL.md +107 -0
- package/template/skills/intelligent-routing/SKILL.md +75 -0
- package/template/skills/plan-writing/SKILL.md +96 -0
- package/template/skills/sqlserver-design/SKILL.md +97 -0
- package/template/skills/systematic-debugging/SKILL.md +98 -0
- package/template/skills/testing-patterns/SKILL.md +102 -0
- package/template/skills/vitest-testing/SKILL.md +116 -0
- package/template/skills/vue3-patterns/SKILL.md +195 -0
- package/template/skills/vulnerability-scanner/SKILL.md +104 -0
- package/template/skills/xunit-testing/SKILL.md +127 -0
- package/template/workflows/brainstorm.md +69 -0
- package/template/workflows/code.md +82 -0
- package/template/workflows/create.md +79 -0
- package/template/workflows/debug.md +83 -0
- package/template/workflows/deploy.md +101 -0
- package/template/workflows/orchestrate.md +86 -0
- package/template/workflows/plan.md +79 -0
- package/template/workflows/review.md +85 -0
- package/template/workflows/status.md +90 -0
- package/template/workflows/test.md +89 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: english-education
|
|
3
|
+
description: English education content generation - lessons, quizzes, curriculum
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# English Education Skill
|
|
7
|
+
|
|
8
|
+
> Generate educational content for English language learning.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Content Types
|
|
13
|
+
|
|
14
|
+
| Type | Description | Template |
|
|
15
|
+
|------|-------------|----------|
|
|
16
|
+
| Lesson Plan | Structured lesson | lesson-templates.md |
|
|
17
|
+
| Quiz | Assessment questions | quiz-templates.md |
|
|
18
|
+
| Vocabulary | Word lists with context | inline |
|
|
19
|
+
| Grammar | Rule explanations | inline |
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Lesson Plan Structure
|
|
24
|
+
|
|
25
|
+
```markdown
|
|
26
|
+
# Lesson: [Title]
|
|
27
|
+
|
|
28
|
+
## Overview
|
|
29
|
+
- **Level:** [A1-C2 / Beginner-Advanced]
|
|
30
|
+
- **Duration:** [minutes]
|
|
31
|
+
- **Topic:** [theme]
|
|
32
|
+
- **Objectives:** [what students will learn]
|
|
33
|
+
|
|
34
|
+
## Warm-up (5 min)
|
|
35
|
+
[Engaging activity]
|
|
36
|
+
|
|
37
|
+
## Presentation (15 min)
|
|
38
|
+
[New content introduction]
|
|
39
|
+
|
|
40
|
+
## Practice (20 min)
|
|
41
|
+
[Guided exercises]
|
|
42
|
+
|
|
43
|
+
## Production (15 min)
|
|
44
|
+
[Free practice / application]
|
|
45
|
+
|
|
46
|
+
## Wrap-up (5 min)
|
|
47
|
+
[Summary and homework]
|
|
48
|
+
|
|
49
|
+
## Materials
|
|
50
|
+
- [List of needed materials]
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Quiz Structure
|
|
56
|
+
|
|
57
|
+
```markdown
|
|
58
|
+
# Quiz: [Title]
|
|
59
|
+
|
|
60
|
+
## Metadata
|
|
61
|
+
- **Level:** [A1-C2]
|
|
62
|
+
- **Topics:** [covered topics]
|
|
63
|
+
- **Time:** [minutes]
|
|
64
|
+
|
|
65
|
+
## Questions
|
|
66
|
+
|
|
67
|
+
### Multiple Choice
|
|
68
|
+
1. [Question]
|
|
69
|
+
- a) [option]
|
|
70
|
+
- b) [option]
|
|
71
|
+
- c) [option] ✓
|
|
72
|
+
- d) [option]
|
|
73
|
+
|
|
74
|
+
### Fill in the Blank
|
|
75
|
+
2. She ___ (go) to school every day.
|
|
76
|
+
**Answer:** goes
|
|
77
|
+
|
|
78
|
+
### Matching
|
|
79
|
+
3. Match the words with definitions:
|
|
80
|
+
| Word | Definition |
|
|
81
|
+
|------|------------|
|
|
82
|
+
| 1. happy | a. feeling joy |
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## CEFR Levels
|
|
88
|
+
|
|
89
|
+
| Level | Description |
|
|
90
|
+
|-------|-------------|
|
|
91
|
+
| A1 | Beginner |
|
|
92
|
+
| A2 | Elementary |
|
|
93
|
+
| B1 | Intermediate |
|
|
94
|
+
| B2 | Upper Intermediate |
|
|
95
|
+
| C1 | Advanced |
|
|
96
|
+
| C2 | Proficient |
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Content Guidelines
|
|
101
|
+
|
|
102
|
+
| ✅ Do | ❌ Don't |
|
|
103
|
+
|-------|---------|
|
|
104
|
+
| Age-appropriate language | Complex jargon |
|
|
105
|
+
| Clear instructions | Ambiguous tasks |
|
|
106
|
+
| Varied question types | Single format only |
|
|
107
|
+
| Progressive difficulty | Random difficulty |
|
|
108
|
+
| Cultural sensitivity | Offensive content |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## References
|
|
113
|
+
|
|
114
|
+
- `references/lesson-templates.md` - Lesson plan templates
|
|
115
|
+
- `references/quiz-templates.md` - Quiz templates
|
|
116
|
+
- `scripts/curriculum_validator.py` - Content validation
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Lesson Plan Templates
|
|
2
|
+
|
|
3
|
+
## Template 1: Grammar Lesson
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# Grammar Lesson: [Tense/Structure]
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
- **Level:** [CEFR Level]
|
|
10
|
+
- **Duration:** 45 minutes
|
|
11
|
+
- **Grammar Point:** [specific structure]
|
|
12
|
+
- **Objectives:** Students will be able to [use X in Y context]
|
|
13
|
+
|
|
14
|
+
## Warm-up (5 min)
|
|
15
|
+
- Quick review of previous lesson
|
|
16
|
+
- Elicit examples from students
|
|
17
|
+
|
|
18
|
+
## Presentation (15 min)
|
|
19
|
+
### Form
|
|
20
|
+
[Structure explanation with examples]
|
|
21
|
+
|
|
22
|
+
### Meaning
|
|
23
|
+
[When/why we use this structure]
|
|
24
|
+
|
|
25
|
+
### Pronunciation
|
|
26
|
+
[Any pronunciation notes]
|
|
27
|
+
|
|
28
|
+
## Practice (15 min)
|
|
29
|
+
### Controlled Practice
|
|
30
|
+
1. [Gap-fill exercise]
|
|
31
|
+
2. [Transformation exercise]
|
|
32
|
+
|
|
33
|
+
### Freer Practice
|
|
34
|
+
1. [Communication activity]
|
|
35
|
+
|
|
36
|
+
## Production (8 min)
|
|
37
|
+
[Real-life application task]
|
|
38
|
+
|
|
39
|
+
## Wrap-up (2 min)
|
|
40
|
+
- Review key points
|
|
41
|
+
- Assign homework
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Template 2: Vocabulary Lesson
|
|
47
|
+
|
|
48
|
+
```markdown
|
|
49
|
+
# Vocabulary Lesson: [Topic]
|
|
50
|
+
|
|
51
|
+
## Overview
|
|
52
|
+
- **Level:** [CEFR Level]
|
|
53
|
+
- **Duration:** 45 minutes
|
|
54
|
+
- **Topic:** [vocabulary theme]
|
|
55
|
+
- **Target Words:** 8-12 items
|
|
56
|
+
|
|
57
|
+
## Warm-up (5 min)
|
|
58
|
+
- Picture discussion
|
|
59
|
+
- Brainstorm related words
|
|
60
|
+
|
|
61
|
+
## Presentation (10 min)
|
|
62
|
+
### New Vocabulary
|
|
63
|
+
| Word | Definition | Example |
|
|
64
|
+
|------|------------|---------|
|
|
65
|
+
| [word] | [meaning] | [sentence] |
|
|
66
|
+
|
|
67
|
+
## Practice (20 min)
|
|
68
|
+
1. Matching exercise
|
|
69
|
+
2. Gap-fill sentences
|
|
70
|
+
3. Categorization activity
|
|
71
|
+
|
|
72
|
+
## Production (8 min)
|
|
73
|
+
- Create sentences using new words
|
|
74
|
+
- Role-play using vocabulary
|
|
75
|
+
|
|
76
|
+
## Review (2 min)
|
|
77
|
+
- Quick vocab check
|
|
78
|
+
- Preview next lesson
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Template 3: Reading Lesson
|
|
84
|
+
|
|
85
|
+
```markdown
|
|
86
|
+
# Reading Lesson: [Title]
|
|
87
|
+
|
|
88
|
+
## Overview
|
|
89
|
+
- **Level:** [CEFR Level]
|
|
90
|
+
- **Duration:** 50 minutes
|
|
91
|
+
- **Text Type:** [article/story/etc.]
|
|
92
|
+
- **Skills:** [skimming/scanning/inference]
|
|
93
|
+
|
|
94
|
+
## Pre-reading (10 min)
|
|
95
|
+
- Vocabulary pre-teach
|
|
96
|
+
- Prediction from title/images
|
|
97
|
+
- Background activation
|
|
98
|
+
|
|
99
|
+
## While-reading (25 min)
|
|
100
|
+
### First Read (Gist)
|
|
101
|
+
- Skim for main idea
|
|
102
|
+
- Check predictions
|
|
103
|
+
|
|
104
|
+
### Second Read (Detail)
|
|
105
|
+
- Comprehension questions
|
|
106
|
+
- Vocabulary in context
|
|
107
|
+
|
|
108
|
+
## Post-reading (12 min)
|
|
109
|
+
- Discussion questions
|
|
110
|
+
- Personal response
|
|
111
|
+
- Extension activity
|
|
112
|
+
|
|
113
|
+
## Wrap-up (3 min)
|
|
114
|
+
- Summary
|
|
115
|
+
- Homework assignment
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Template 4: Speaking Lesson
|
|
121
|
+
|
|
122
|
+
```markdown
|
|
123
|
+
# Speaking Lesson: [Topic]
|
|
124
|
+
|
|
125
|
+
## Overview
|
|
126
|
+
- **Level:** [CEFR Level]
|
|
127
|
+
- **Duration:** 45 minutes
|
|
128
|
+
- **Function:** [asking for directions/giving opinions/etc.]
|
|
129
|
+
- **Objectives:** [fluency/accuracy focus]
|
|
130
|
+
|
|
131
|
+
## Lead-in (5 min)
|
|
132
|
+
- Discussion question
|
|
133
|
+
- Set context
|
|
134
|
+
|
|
135
|
+
## Model Dialogue (10 min)
|
|
136
|
+
- Listen to example
|
|
137
|
+
- Identify key phrases
|
|
138
|
+
- Practice pronunciation
|
|
139
|
+
|
|
140
|
+
## Controlled Practice (10 min)
|
|
141
|
+
- Substitution drills
|
|
142
|
+
- Pair practice with prompts
|
|
143
|
+
|
|
144
|
+
## Freer Practice (15 min)
|
|
145
|
+
- Role-play activities
|
|
146
|
+
- Information gap tasks
|
|
147
|
+
|
|
148
|
+
## Feedback (5 min)
|
|
149
|
+
- Error correction
|
|
150
|
+
- Good language highlighted
|
|
151
|
+
```
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# Quiz Templates
|
|
2
|
+
|
|
3
|
+
## Template 1: Grammar Quiz
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# Grammar Quiz: [Topic]
|
|
7
|
+
|
|
8
|
+
**Level:** [CEFR]
|
|
9
|
+
**Time:** 15 minutes
|
|
10
|
+
**Points:** 20 total
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Part A: Multiple Choice (5 points)
|
|
15
|
+
|
|
16
|
+
1. She ___ to work every day.
|
|
17
|
+
- a) go
|
|
18
|
+
- b) goes ✓
|
|
19
|
+
- c) going
|
|
20
|
+
- d) gone
|
|
21
|
+
|
|
22
|
+
2. They ___ watching TV when I arrived.
|
|
23
|
+
- a) are
|
|
24
|
+
- b) was
|
|
25
|
+
- c) were ✓
|
|
26
|
+
- d) be
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Part B: Fill in the Blank (5 points)
|
|
31
|
+
|
|
32
|
+
Complete with the correct form.
|
|
33
|
+
|
|
34
|
+
1. He ___ (play) tennis every weekend.
|
|
35
|
+
**Answer:** plays
|
|
36
|
+
|
|
37
|
+
2. We ___ (not/see) that movie yet.
|
|
38
|
+
**Answer:** haven't seen
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Part C: Error Correction (5 points)
|
|
43
|
+
|
|
44
|
+
Find and correct the error.
|
|
45
|
+
|
|
46
|
+
1. She don't like coffee.
|
|
47
|
+
**Correction:** She doesn't like coffee.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Part D: Sentence Transformation (5 points)
|
|
52
|
+
|
|
53
|
+
Rewrite using the word given.
|
|
54
|
+
|
|
55
|
+
1. It's not necessary to come early. (HAVE)
|
|
56
|
+
**Answer:** You don't have to come early.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Answer Key
|
|
61
|
+
[Include all answers with explanations]
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Template 2: Vocabulary Quiz
|
|
67
|
+
|
|
68
|
+
```markdown
|
|
69
|
+
# Vocabulary Quiz: [Topic]
|
|
70
|
+
|
|
71
|
+
**Level:** [CEFR]
|
|
72
|
+
**Time:** 10 minutes
|
|
73
|
+
**Points:** 15 total
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Part A: Matching (5 points)
|
|
78
|
+
|
|
79
|
+
Match the words with their definitions.
|
|
80
|
+
|
|
81
|
+
| Word | Definition |
|
|
82
|
+
|------|------------|
|
|
83
|
+
| 1. ambitious | a. wanting to succeed |
|
|
84
|
+
| 2. reliable | b. can be trusted |
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Part B: Fill in the Blank (5 points)
|
|
89
|
+
|
|
90
|
+
Choose the correct word.
|
|
91
|
+
|
|
92
|
+
Word bank: *happy, sad, angry, excited, nervous*
|
|
93
|
+
|
|
94
|
+
1. She felt ___ before her exam.
|
|
95
|
+
**Answer:** nervous
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Part C: Word Formation (5 points)
|
|
100
|
+
|
|
101
|
+
Complete with the correct form.
|
|
102
|
+
|
|
103
|
+
1. He is very ___ (success) in his career.
|
|
104
|
+
**Answer:** successful
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Template 3: Reading Comprehension
|
|
110
|
+
|
|
111
|
+
```markdown
|
|
112
|
+
# Reading Quiz: [Title]
|
|
113
|
+
|
|
114
|
+
**Level:** [CEFR]
|
|
115
|
+
**Time:** 20 minutes
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Text
|
|
120
|
+
[Insert reading passage]
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Questions
|
|
125
|
+
|
|
126
|
+
### True/False (4 points)
|
|
127
|
+
1. [Statement] T / F
|
|
128
|
+
2. [Statement] T / F
|
|
129
|
+
|
|
130
|
+
### Multiple Choice (4 points)
|
|
131
|
+
3. What is the main idea?
|
|
132
|
+
- a) [option]
|
|
133
|
+
- b) [option] ✓
|
|
134
|
+
- c) [option]
|
|
135
|
+
|
|
136
|
+
### Short Answer (4 points)
|
|
137
|
+
5. Why did [character] [action]?
|
|
138
|
+
**Answer:** [Expected response]
|
|
139
|
+
|
|
140
|
+
### Vocabulary in Context (3 points)
|
|
141
|
+
6. The word "X" in paragraph 2 means:
|
|
142
|
+
**Answer:** [definition]
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Template 4: Listening Quiz
|
|
148
|
+
|
|
149
|
+
```markdown
|
|
150
|
+
# Listening Quiz: [Topic]
|
|
151
|
+
|
|
152
|
+
**Level:** [CEFR]
|
|
153
|
+
**Time:** 15 minutes
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Instructions
|
|
158
|
+
Listen to the audio twice. Answer the questions.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Part A: Gist (2 points)
|
|
163
|
+
1. What is the conversation about?
|
|
164
|
+
|
|
165
|
+
## Part B: Detail (6 points)
|
|
166
|
+
2. What time does [X]?
|
|
167
|
+
3. How much does [Y] cost?
|
|
168
|
+
4. Where is [Z] located?
|
|
169
|
+
|
|
170
|
+
## Part C: Inference (2 points)
|
|
171
|
+
5. How does the speaker feel about [topic]?
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Audio Script
|
|
176
|
+
[Include transcript for teacher reference]
|
|
177
|
+
```
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Curriculum Validator - Validate English education content
|
|
4
|
+
Checks lesson plans, quizzes, and curriculum materials.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
python curriculum_validator.py <file_or_folder>
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import sys
|
|
11
|
+
import re
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class CurriculumValidator:
|
|
16
|
+
"""Validate English education content."""
|
|
17
|
+
|
|
18
|
+
CEFR_LEVELS = ["A1", "A2", "B1", "B2", "C1", "C2"]
|
|
19
|
+
|
|
20
|
+
REQUIRED_LESSON_SECTIONS = [
|
|
21
|
+
"Overview",
|
|
22
|
+
"Warm-up",
|
|
23
|
+
"Practice",
|
|
24
|
+
"Wrap-up"
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
REQUIRED_QUIZ_SECTIONS = [
|
|
28
|
+
"Level",
|
|
29
|
+
"Time",
|
|
30
|
+
"Questions"
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
def __init__(self):
|
|
34
|
+
self.errors = []
|
|
35
|
+
self.warnings = []
|
|
36
|
+
|
|
37
|
+
def validate_file(self, file_path: Path) -> bool:
|
|
38
|
+
"""Validate a single file."""
|
|
39
|
+
content = file_path.read_text(encoding="utf-8")
|
|
40
|
+
filename = file_path.name.lower()
|
|
41
|
+
|
|
42
|
+
if "lesson" in filename:
|
|
43
|
+
return self.validate_lesson(content, file_path)
|
|
44
|
+
elif "quiz" in filename:
|
|
45
|
+
return self.validate_quiz(content, file_path)
|
|
46
|
+
else:
|
|
47
|
+
return self.validate_generic(content, file_path)
|
|
48
|
+
|
|
49
|
+
def validate_lesson(self, content: str, file_path: Path) -> bool:
|
|
50
|
+
"""Validate a lesson plan."""
|
|
51
|
+
valid = True
|
|
52
|
+
|
|
53
|
+
# Check for required sections
|
|
54
|
+
for section in self.REQUIRED_LESSON_SECTIONS:
|
|
55
|
+
if section.lower() not in content.lower():
|
|
56
|
+
self.errors.append(f"{file_path}: Missing section '{section}'")
|
|
57
|
+
valid = False
|
|
58
|
+
|
|
59
|
+
# Check for CEFR level
|
|
60
|
+
if not self._has_cefr_level(content):
|
|
61
|
+
self.warnings.append(f"{file_path}: No CEFR level specified")
|
|
62
|
+
|
|
63
|
+
# Check for objectives
|
|
64
|
+
if "objective" not in content.lower():
|
|
65
|
+
self.warnings.append(f"{file_path}: No learning objectives found")
|
|
66
|
+
|
|
67
|
+
# Check for duration
|
|
68
|
+
if not re.search(r"\d+\s*(min|minute|hour)", content, re.I):
|
|
69
|
+
self.warnings.append(f"{file_path}: No duration specified")
|
|
70
|
+
|
|
71
|
+
return valid
|
|
72
|
+
|
|
73
|
+
def validate_quiz(self, content: str, file_path: Path) -> bool:
|
|
74
|
+
"""Validate a quiz."""
|
|
75
|
+
valid = True
|
|
76
|
+
|
|
77
|
+
# Check for level
|
|
78
|
+
if not self._has_cefr_level(content):
|
|
79
|
+
self.errors.append(f"{file_path}: No CEFR level specified")
|
|
80
|
+
valid = False
|
|
81
|
+
|
|
82
|
+
# Check for questions
|
|
83
|
+
if "question" not in content.lower() and "##" not in content:
|
|
84
|
+
self.errors.append(f"{file_path}: No questions found")
|
|
85
|
+
valid = False
|
|
86
|
+
|
|
87
|
+
# Check for answer key
|
|
88
|
+
if "answer" not in content.lower():
|
|
89
|
+
self.warnings.append(f"{file_path}: No answer key found")
|
|
90
|
+
|
|
91
|
+
# Check for point values
|
|
92
|
+
if not re.search(r"\d+\s*point", content, re.I):
|
|
93
|
+
self.warnings.append(f"{file_path}: No point values specified")
|
|
94
|
+
|
|
95
|
+
return valid
|
|
96
|
+
|
|
97
|
+
def validate_generic(self, content: str, file_path: Path) -> bool:
|
|
98
|
+
"""Generic content validation."""
|
|
99
|
+
valid = True
|
|
100
|
+
|
|
101
|
+
# Check minimum content length
|
|
102
|
+
if len(content) < 100:
|
|
103
|
+
self.warnings.append(f"{file_path}: Content seems too short")
|
|
104
|
+
|
|
105
|
+
# Check for proper markdown structure
|
|
106
|
+
if "#" not in content:
|
|
107
|
+
self.warnings.append(f"{file_path}: No markdown headings found")
|
|
108
|
+
|
|
109
|
+
return valid
|
|
110
|
+
|
|
111
|
+
def _has_cefr_level(self, content: str) -> bool:
|
|
112
|
+
"""Check if content has a CEFR level."""
|
|
113
|
+
for level in self.CEFR_LEVELS:
|
|
114
|
+
if level in content.upper():
|
|
115
|
+
return True
|
|
116
|
+
return False
|
|
117
|
+
|
|
118
|
+
def validate_folder(self, folder_path: Path) -> bool:
|
|
119
|
+
"""Validate all markdown files in a folder."""
|
|
120
|
+
valid = True
|
|
121
|
+
|
|
122
|
+
for file_path in folder_path.glob("**/*.md"):
|
|
123
|
+
if not self.validate_file(file_path):
|
|
124
|
+
valid = False
|
|
125
|
+
|
|
126
|
+
return valid
|
|
127
|
+
|
|
128
|
+
def report(self):
|
|
129
|
+
"""Print validation report."""
|
|
130
|
+
print("=" * 60)
|
|
131
|
+
print("CURRICULUM VALIDATION REPORT")
|
|
132
|
+
print("=" * 60)
|
|
133
|
+
|
|
134
|
+
if self.errors:
|
|
135
|
+
print("\n❌ ERRORS:")
|
|
136
|
+
for error in self.errors:
|
|
137
|
+
print(f" - {error}")
|
|
138
|
+
|
|
139
|
+
if self.warnings:
|
|
140
|
+
print("\n⚠️ WARNINGS:")
|
|
141
|
+
for warning in self.warnings:
|
|
142
|
+
print(f" - {warning}")
|
|
143
|
+
|
|
144
|
+
if not self.errors and not self.warnings:
|
|
145
|
+
print("\n✅ All content validated successfully!")
|
|
146
|
+
|
|
147
|
+
print("\n" + "-" * 60)
|
|
148
|
+
print(f"Errors: {len(self.errors)}")
|
|
149
|
+
print(f"Warnings: {len(self.warnings)}")
|
|
150
|
+
|
|
151
|
+
return len(self.errors) == 0
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def main():
|
|
155
|
+
if len(sys.argv) < 2:
|
|
156
|
+
print("Usage: python curriculum_validator.py <file_or_folder>")
|
|
157
|
+
sys.exit(1)
|
|
158
|
+
|
|
159
|
+
target = Path(sys.argv[1])
|
|
160
|
+
validator = CurriculumValidator()
|
|
161
|
+
|
|
162
|
+
if target.is_file():
|
|
163
|
+
validator.validate_file(target)
|
|
164
|
+
elif target.is_dir():
|
|
165
|
+
validator.validate_folder(target)
|
|
166
|
+
else:
|
|
167
|
+
print(f"Error: {target} not found")
|
|
168
|
+
sys.exit(1)
|
|
169
|
+
|
|
170
|
+
success = validator.report()
|
|
171
|
+
sys.exit(0 if success else 1)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
if __name__ == "__main__":
|
|
175
|
+
main()
|