@rookiestar/eng-lang-tutor 1.0.2 → 1.0.4

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.

Potentially problematic release.


This version of @rookiestar/eng-lang-tutor might be problematic. Click here for more details.

Files changed (37) hide show
  1. package/CLAUDE.md +5 -4
  2. package/README.md +16 -1
  3. package/README_EN.md +16 -1
  4. package/SKILL.md +113 -92
  5. package/docs/OPENCLAW_DEPLOYMENT.md +7 -4
  6. package/package.json +1 -1
  7. package/requirements.txt +2 -0
  8. package/scripts/__pycache__/audio_composer.cpython-313.pyc +0 -0
  9. package/scripts/__pycache__/audio_converter.cpython-313.pyc +0 -0
  10. package/scripts/__pycache__/audio_enhancer.cpython-313.pyc +0 -0
  11. package/scripts/__pycache__/state_manager.cpython-313.pyc +0 -0
  12. package/scripts/__pycache__/utils.cpython-313.pyc +0 -0
  13. package/scripts/audio_composer.py +389 -0
  14. package/scripts/audio_converter.py +245 -0
  15. package/scripts/cli.py +223 -0
  16. package/scripts/constants.py +56 -0
  17. package/scripts/feishu_voice.py +421 -0
  18. package/scripts/gamification.py +48 -34
  19. package/scripts/scorer.py +14 -32
  20. package/scripts/state_manager.py +131 -207
  21. package/scripts/tts/__pycache__/__init__.cpython-313.pyc +0 -0
  22. package/scripts/tts/__pycache__/base.cpython-313.pyc +0 -0
  23. package/scripts/tts/__pycache__/manager.cpython-313.pyc +0 -0
  24. package/scripts/tts/manager.py +14 -4
  25. package/scripts/tts/providers/__pycache__/__init__.cpython-313.pyc +0 -0
  26. package/scripts/tts/providers/__pycache__/xunfei.cpython-313.pyc +0 -0
  27. package/scripts/tts/providers/xunfei.py +10 -1
  28. package/scripts/utils.py +78 -0
  29. package/templates/prompt_templates.md +47 -1235
  30. package/templates/prompts/display_guide.md +106 -0
  31. package/templates/prompts/initialization.md +213 -0
  32. package/templates/prompts/keypoint_generation.md +268 -0
  33. package/templates/prompts/output_rules.md +106 -0
  34. package/templates/prompts/quiz_generation.md +187 -0
  35. package/templates/prompts/responses.md +291 -0
  36. package/templates/prompts/shared_enums.md +97 -0
  37. package/templates/state_schema.json +1 -6
@@ -1,1261 +1,73 @@
1
- # LLM Prompt Templates
1
+ # LLM Prompt Templates Index
2
2
 
3
3
  > Templates for generating English learning content.
4
4
  > Use these templates with state.json data to generate personalized content.
5
5
 
6
6
  ---
7
7
 
8
- ## 1. Knowledge Point Generation Template
8
+ ## Template Files
9
9
 
10
- ```markdown
11
- You are an authentic American English tutor. Generate a daily knowledge point.
10
+ This documentation has been split into focused modules for easier navigation:
12
11
 
13
- ## USER CONTEXT
14
- - CEFR Level: {cefr_level} (A1=Beginner to C2=Proficient)
15
- - Topic Focus: {topic} (movies/news/gaming/sports/workplace/social/daily_life)
16
- - Tutor Style: {tutor_style} (humorous/rigorous/casual/professional)
17
- - Expression Type: {oral_written_ratio}% oral expressions, {written_ratio}% written
12
+ ### Shared Files (Reference First)
13
+ | File | Purpose |
14
+ |------|---------|
15
+ | [prompts/shared_enums.md](prompts/shared_enums.md) | **Shared enums** - Topics, CEFR levels, tutor styles, quiz types, badges |
16
+ | [prompts/output_rules.md](prompts/output_rules.md) | **Output rules** - JSON format, markdown syntax, platform compatibility |
18
17
 
19
- ## RESOURCE REFERENCES
20
- {topic_resources}
18
+ ### Generation Templates
19
+ | File | Purpose |
20
+ |------|---------|
21
+ | [prompts/keypoint_generation.md](prompts/keypoint_generation.md) | Knowledge point generation template, topic resources |
22
+ | [prompts/quiz_generation.md](prompts/quiz_generation.md) | Quiz generation template with question types |
23
+ | [prompts/initialization.md](prompts/initialization.md) | 6-step onboarding flow templates |
21
24
 
22
- ## STRICT RULES
23
- 1. Output ONLY valid JSON - no markdown, no code blocks, no extra text
24
- 2. Focus on "How Americans say it" - NOT Chinese translations
25
- 3. Must include: scene context, alternatives, Chinglish trap + correction
26
- 4. Use authentic expressions from the resource references above
27
- 5. Include pronunciation tips for casual speech (gonna, gotta, wanna, etc.)
28
- 6. AVOID these recent topics (14-day dedup): {excluded_topics}
29
- 7. **End sentences with proper punctuation** - periods for statements, question marks for questions
30
- 8. **Include reference links** - provide authoritative sources for verification
31
- 9. **Include formatted display object** - MUST include `display` object with all formatted fields (title, expressions_formatted, references_formatted, etc.) using `**text**` for bold
32
- 10. **Never use strikethrough** - Use ❌ emoji for wrong answers instead of `~~text~~`
33
-
34
- ## REFERENCE SOURCES
35
-
36
- When generating knowledge points, include links to these authoritative sources:
37
-
38
- | Type | Source | URL Pattern | Description |
39
- |------|--------|-------------|-------------|
40
- | **Dictionary** | Merriam-Webster | `https://www.merriam-webster.com/dictionary/{phrase}` | Most authoritative American English dictionary |
41
- | **Usage** | YouGlish | `https://youglish.com/pronounce/{phrase}/english/us` | Real YouTube videos with the phrase |
42
- | **Etymology** | Etymonline | `https://www.etymonline.com/word/{word}` | Word origin and history |
43
- | **Frequency** | Google Ngram | `https://books.google.com/ngrams/graph?content={phrase}` | Usage frequency over time |
44
-
45
- **URL Encoding:** Replace spaces with `%20` in URLs.
46
-
47
- **Reference Requirements:**
48
- - `dictionary` is REQUIRED - always include Merriam-Webster link
49
- - `usage_context` is REQUIRED - YouGlish helps users hear real usage
50
- - `etymology` is OPTIONAL - include for interesting origin stories
51
- - `frequency` is OPTIONAL - include for frequency comparison
52
-
53
- **Example:**
54
- ```json
55
- {
56
- "references": {
57
- "dictionary": {
58
- "source": "merriam-webster",
59
- "url": "https://www.merriam-webster.com/dictionary/touch%20base",
60
- "note": "Official definition and usage examples"
61
- },
62
- "usage_context": {
63
- "source": "youglish",
64
- "url": "https://youglish.com/pronounce/touch%20base/english/us",
65
- "note": "Hear it in 1000+ real YouTube videos"
66
- }
67
- }
68
- }
69
- ```
70
-
71
- ## CONTENT GUIDELINES
72
-
73
- ### Scene
74
- - Describe a realistic situation where this expression is used
75
- - Include formality level (casual/neutral/formal)
76
- - Make it relatable to the CEFR level
77
-
78
- ### Expressions
79
- - Primary expression + 1-2 alternatives
80
- - Include pronunciation tips for natural speech
81
- - Usage notes explaining when to use
82
-
83
- ### Chinglish Trap
84
- - Show what Chinese speakers TYPICALLY say (the wrong version)
85
- - Provide the correct American expression
86
- - Explain WHY the wrong version sounds unnatural
87
-
88
- ### Examples
89
- - Use dialogue format with 2-3 exchanges
90
- - Make conversations feel natural and authentic
91
- - Include context for each dialogue
92
-
93
- ## OUTPUT SCHEMA (JSON only)
94
- {
95
- "date": "{today_date}",
96
- "topic_fingerprint": "unique_lowercase_with_underscores",
97
- "category": "oral|written",
98
- "topic": "{topic}",
99
- "scene": {
100
- "context": "Brief description of the situation",
101
- "formality": "casual|neutral|formal"
102
- },
103
- "expressions": [
104
- {
105
- "phrase": "The American expression",
106
- "pronunciation_tip": "How to say it naturally",
107
- "usage_note": "When and how to use this"
108
- }
109
- ],
110
- "alternatives": [
111
- "Another way to say it 1",
112
- "Another way to say it 2"
113
- ],
114
- "chinglish_trap": {
115
- "wrong": "What Chinese speakers typically say",
116
- "correct": "The natural American way",
117
- "explanation": "Why the wrong version sounds off"
118
- },
119
- "examples": [
120
- {
121
- "situation": "Context for example",
122
- "dialogue": ["Speaker A: ...", "Speaker B: ..."]
123
- }
124
- ],
125
- "extended_learning": {
126
- "related_phrases": ["phrase1", "phrase2"],
127
- "cultural_note": "Brief cultural context",
128
- "common_mistakes": ["mistake1"]
129
- },
130
- "references": {
131
- "dictionary": {
132
- "source": "merriam-webster",
133
- "url": "https://www.merriam-webster.com/dictionary/{phrase}",
134
- "note": "Definition and usage examples"
135
- },
136
- "usage_context": {
137
- "source": "youglish",
138
- "url": "https://youglish.com/pronounce/{phrase}/english/us",
139
- "note": "Hear it in real YouTube videos"
140
- }
141
- },
142
- "display": {
143
- "title": "🏢 今日知识点 | Today's Knowledge Point",
144
- "topic_tag": "🏷️ 主题: **{topic_name}** | {topic_name_en}",
145
- "formality_tag": "📊 正式度: **{formality}**",
146
- "scene_intro": "🎬 场景 | Scene",
147
- "scene_text": "{scene_context}",
148
- "expressions_title": "💬 核心表达 | Key Expressions",
149
- "expressions_formatted": [
150
- {
151
- "emoji": "✨",
152
- "phrase": "**{phrase}**",
153
- "phrase_plain": "{phrase}",
154
- "pronunciation": "🔊 {pronunciation_tip}",
155
- "usage": "💡 {usage_note}"
156
- }
157
- ],
158
- "alternatives_title": "🔄 其他说法 | Alternatives",
159
- "alternatives_formatted": "• **{alt_1}**\n• **{alt_2}**",
160
- "chinglish_title": "⚠️ Chinglish 陷阱 | Chinglish Trap",
161
- "chinglish_formatted": "❌ Wrong: \"{wrong}\"\n✅ Correct: **{correct}**\n\n📝 {explanation}",
162
- "examples_title": "🗣️ 对话示例 | Example Dialogues",
163
- "examples_formatted": [
164
- {
165
- "situation_emoji": "☕",
166
- "situation": "{situation_name}",
167
- "dialogue": "💬 A: {line_1}\n💬 B: {line_2}",
168
- "key_phrase_highlight": "**{key_phrase}**"
169
- }
170
- ],
171
- "extended_title": "📚 延伸学习 | Extended Learning",
172
- "extended_formatted": "🔗 Related: **{related_1}** | **{related_2}**\n\n🌎 {cultural_note}",
173
- "references_title": "📖 权威参考 | References",
174
- "references_formatted": "📚 [Merriam-Webster]({dict_url}) - {dict_note}\n🎬 [YouGlish]({usage_url}) - {usage_note}",
175
- "footer": "───────────────────\n📅 {date} | 📝 Take the quiz to earn XP!"
176
- }
177
- }
178
- ```
25
+ ### Display Templates
26
+ | File | Purpose |
27
+ |------|---------|
28
+ | [prompts/display_guide.md](prompts/display_guide.md) | Emoji usage and text formatting guidelines |
29
+ | [prompts/responses.md](prompts/responses.md) | Response templates for stats, config, errors, quiz results |
179
30
 
180
31
  ---
181
32
 
182
- ## 2. Quiz Generation Template
33
+ ## Quick Reference
183
34
 
184
- ```markdown
185
- Based on today's knowledge point, generate a light 3-question quiz.
35
+ ### Generation Flow
186
36
 
187
- ## KNOWLEDGE POINT
188
- {keypoint_json}
37
+ 1. **Keypoint Generation** → Use [keypoint_generation.md](prompts/keypoint_generation.md)
38
+ - Inject user context (CEFR, topic, style)
39
+ - Inject topic resources
40
+ - Apply dedup rules
189
41
 
190
- ## QUESTION TYPE REQUIREMENTS (3 questions total)
191
- 1. **multiple_choice** (required): Test expression recognition - 10 XP
192
- 2. **chinglish_fix** (required): Identify and correct Chinglish - 15 XP
193
- 3. **fill_blank OR dialogue_completion** (random): Pick one randomly - 12 XP
42
+ 2. **Quiz Generation** Use [quiz_generation.md](prompts/quiz_generation.md)
43
+ - Based on today's keypoint
44
+ - 3 questions: multiple_choice + chinglish_fix + fill_blank/dialogue
194
45
 
195
- ## QUESTION GUIDELINES
46
+ 3. **Display Formatting** → Use [display_guide.md](prompts/display_guide.md)
47
+ - Apply emojis consistently
48
+ - Bold key phrases
49
+ - Never use strikethrough
196
50
 
197
- ### Multiple Choice (10 XP)
198
- - 4 options (A, B, C, D)
199
- - Only 1 correct answer
200
- - Distractors should be plausible but clearly wrong
201
- - Test understanding of meaning or usage
51
+ ### Key Rules
202
52
 
203
- ### Chinglish Fix (15 XP)
204
- - Show a sentence with Chinglish expressions
205
- - Ask to identify the issue and provide correct version
206
- - Include explanation in the answer
53
+ > See [prompts/output_rules.md](prompts/output_rules.md) for complete formatting rules.
207
54
 
208
- ### Fill in the Blank (12 XP)
209
- - Use "___" for the blank
210
- - Provide word bank with 3 options
211
- - Test the main expression from the knowledge point
55
+ 1. **Output ONLY valid JSON** - no markdown blocks, no extra text
56
+ 2. **Focus on "How Americans say it"** - NOT Chinese translations
57
+ 3. **Include display object** - formatted strings for IM display
58
+ 4. **Use `**text**` for bold** - never use `~~strikethrough~~`
212
59
 
213
- ### Dialogue Completion (12 XP)
214
- - Show partial dialogue with context
215
- - Ask what should come next
216
- - Test natural conversation flow
60
+ ### Reference Sources
217
61
 
218
- ## STRICT RULES
219
- 1. Output ONLY valid JSON - no markdown, no extra text
220
- 2. All questions must relate to today's knowledge point
221
- 3. Keep it light and fun - don't make questions too hard
222
- 4. Include encouraging feedback in display fields
223
- 5. Total XP should be around 35-40
224
- 6. **End sentences with proper punctuation** - periods for statements, question marks for questions
225
-
226
- ## OUTPUT SCHEMA (JSON only)
227
- {
228
- "quiz_date": "{today_date}",
229
- "keypoint_fingerprint": "{fingerprint}",
230
- "questions": [
231
- {
232
- "id": 1,
233
- "type": "multiple_choice",
234
- "question": "The question text",
235
- "context": "Optional scenario description",
236
- "options": ["A. ...", "B. ...", "C. ...", "D. ..."],
237
- "correct_answer": "B",
238
- "explanation": "Why this is correct...",
239
- "xp_value": 10,
240
- "display": {
241
- "type_emoji": "🔤",
242
- "type_name": "选择题 | Multiple Choice",
243
- "question_formatted": "💬 {question_with_bold_key_phrase}",
244
- "context_formatted": "📱 {context}",
245
- "options_formatted": ["⬜ A. ...", "⬜ B. ...", "⬜ C. ...", "⬜ D. ..."],
246
- "correct_feedback": "✅ Correct! **{key_phrase}** = {meaning}",
247
- "wrong_feedback": "❌ Not quite. **{key_phrase}** means...",
248
- "key_phrase": "**{key_phrase}**",
249
- "xp_display": "💎 +10 XP"
250
- }
251
- },
252
- {
253
- "id": 2,
254
- "type": "chinglish_fix",
255
- "question": "Identify and fix the Chinglish",
256
- "context": "...",
257
- "correct_answer": "...",
258
- "explanation": "...",
259
- "xp_value": 15,
260
- "display": {
261
- "type_emoji": "🔧",
262
- "type_name": "Chinglish 修正 | Fix the Chinglish",
263
- "question_formatted": "🔧 {question}",
264
- "email_formatted": "📧 {email_content}",
265
- "hint": "💡 Hint: How would an American say this?",
266
- "correct_feedback": "✅ Fixed! **{correct_phrase}** sounds much better!",
267
- "wrong_feedback": "❌ '{wrong}' → **{correct}**",
268
- "answer_formatted": "📝 Better: {corrected_sentence}",
269
- "key_phrase": "**{key_phrase}**",
270
- "xp_display": "💎 +15 XP"
271
- }
272
- },
273
- {
274
- "id": 3,
275
- "type": "fill_blank",
276
- "question": "Complete the sentence",
277
- "context": "...",
278
- "word_bank": ["option1", "option2", "option3"],
279
- "correct_answer": "option1",
280
- "explanation": "...",
281
- "xp_value": 12,
282
- "display": {
283
- "type_emoji": "✏️",
284
- "type_name": "填空题 | Fill in the Blank",
285
- "question_formatted": "✏️ {question}",
286
- "context_formatted": "💼 {context_with_blank}",
287
- "word_bank_formatted": "📦 Word Bank: [ **{opt1}** | {opt2} | {opt3} ]",
288
- "correct_feedback": "✅ Perfect! **{answer}** is correct!",
289
- "wrong_feedback": "❌ Try **{correct_answer}** instead!",
290
- "key_phrase": "**{key_phrase}**",
291
- "xp_display": "💎 +12 XP"
292
- }
293
- }
294
- ],
295
- "total_xp": 37,
296
- "passing_score": 70,
297
- "display": {
298
- "header": "📝 今日测验 | Daily Quiz",
299
- "date": "📅 {quiz_date}",
300
- "topic": "🏷️ Topic: **{keypoint_fingerprint}**",
301
- "instructions": "🎯 3道小题,答对2道就过关!3 questions, get 2 right to pass!",
302
- "progress_bar": "⬜⬜⬜ 0/3 questions",
303
- "key_phrase_summary": "🔑 Key Phrase: **{key_phrase}** = {translation}",
304
- "xp_summary": "💎 Total XP: {total_xp} | 🏆 Pass: 2/3 correct",
305
- "footer": "───────────────────\n💪 Good luck! 加油! 🚀"
306
- }
307
- }
308
- ```
62
+ | Type | Source | URL Pattern |
63
+ |------|--------|-------------|
64
+ | Dictionary | Merriam-Webster | `https://www.merriam-webster.com/dictionary/{phrase}` |
65
+ | Usage | YouGlish | `https://youglish.com/pronounce/{phrase}/english/us` |
309
66
 
310
67
  ---
311
68
 
312
- ## 3. Topic Resource Injection
313
-
314
- When generating content, inject topic-specific resources:
315
-
316
- ```python
317
- TOPIC_RESOURCES = {
318
- "movies": """
319
- Reference expressions from TV shows:
320
- - Friends: "How you doin'?", "Could I BE any more...?"
321
- - The Office: "That's what she said", "Touch base"
322
- - Gossip Girl: "No offense", "None taken", "Done and done"
323
- Focus on: dialogue patterns, humor, sarcasm, casual speech
324
- """,
325
-
326
- "news": """
327
- Reference vocabulary from:
328
- - CNN 10: Current events, clear explanations
329
- - VOA: Simplified news vocabulary
330
- Focus on: formal register, topic-specific vocabulary, clear structure
331
- """,
332
-
333
- "gaming": """
334
- Reference gaming terminology:
335
- - Core: NPC, spawn, loot, grind, level up, buff, nerf
336
- - Multiplayer: party, squad, GG, clutch, carry
337
- - Slang in daily use: "That was clutch", "GG"
338
- Focus on: casual speech, slang, gaming-specific vocabulary
339
- """,
340
-
341
- "sports": """
342
- Reference sports vocabulary:
343
- - Basketball: dunk, buzzer beater, pick and roll
344
- - Sports idioms: "step up to the plate", "ballpark figure"
345
- Focus on: energetic expressions, idioms used in business
346
- """,
347
-
348
- "workplace": """
349
- Reference workplace expressions:
350
- - Office idioms: touch base, circle back, bandwidth
351
- - Meeting phrases: "Let's get the ball rolling", "wrap up"
352
- - Email language: formal yet natural
353
- Focus on: professional communication, formal/informal switching
354
- """,
355
-
356
- "social": """
357
- Reference social expressions:
358
- - Greetings: "What's up?", "How's it going?"
359
- - Making plans: "Let's hang out", "grab coffee"
360
- - Casual responses: "Not much, you?", "Can't complain"
361
- Focus on: casual speech, fillers, natural conversation flow
362
- """,
363
-
364
- "daily_life": """
365
- Reference daily life expressions:
366
- - Shopping: "Just looking", "Can I get a discount?"
367
- - Restaurant: "I'd like the...", "Check, please"
368
- - Services: Asking for help, making requests
369
- Focus on: practical communication, politeness strategies
370
- """
371
- }
372
- ```
373
-
374
- ---
375
-
376
- ## 5. CEFR Level Guidelines
377
-
378
- Adjust content complexity based on CEFR level:
379
-
380
- | Level | Vocabulary | Sentence Length | Topics |
381
- |-------|------------|-----------------|--------|
382
- | A1-A2 | Basic, high-frequency | Short, simple | Daily routines, shopping |
383
- | B1-B2 | Intermediate, some idioms | Medium, some complex | Work, travel, social |
384
- | C1-C2 | Advanced, nuanced | Varied, sophisticated | Abstract, professional |
385
-
386
- ### A1-A2 Guidelines
387
- - Use very common expressions
388
- - Short dialogues (2-3 exchanges)
389
- - Simple Chinglish traps
390
- - Everyday situations
391
-
392
- ### B1-B2 Guidelines
393
- - Include common idioms
394
- - Medium dialogues (3-4 exchanges)
395
- - Nuanced Chinglish traps
396
- - Work and social situations
397
-
398
- ### C1-C2 Guidelines
399
- - Complex expressions and idioms
400
- - Longer dialogues (4+ exchanges)
401
- - Subtle Chinglish traps (tone, formality)
402
- - Professional and abstract topics
403
-
404
- ---
405
-
406
- ## 6. Tutor Style Variations
407
-
408
- Adjust tone based on tutor_style:
409
-
410
- ### Humorous
411
- - Include funny examples
412
- - Light-hearted explanations
413
- - Pop culture references
414
- - Jokes in cultural notes
415
-
416
- ### Rigorous
417
- - Detailed explanations
418
- - Multiple examples
419
- - Grammar focus
420
- - Formal language
421
-
422
- ### Casual
423
- - Conversational tone
424
- - Short, punchy explanations
425
- - Everyday examples
426
- - Slang-friendly
427
-
428
- ### Professional
429
- - Business-appropriate examples
430
- - Formal language focus
431
- - Workplace scenarios
432
- - Email/communication tips
433
-
434
- ---
435
-
436
- ## 7. Emoji Display Guidelines
437
-
438
- > Add emoji decorations to make IM conversations more engaging and scannable.
439
-
440
- ### 7.1 Topic Emojis
441
-
442
- | Topic | Emoji | Chinese Label |
443
- |-------|-------|---------------|
444
- | movies | 🎬 | 影视 |
445
- | news | 📰 | 新闻 |
446
- | gaming | 🎮 | 游戏 |
447
- | sports | ⚽ | 体育 |
448
- | workplace | 🏢 | 职场 |
449
- | social | 💬 | 社交 |
450
- | daily_life | 🏠 | 生活 |
451
-
452
- ### 7.2 Category Emojis
453
-
454
- | Category | Emoji |
455
- |----------|-------|
456
- | oral | 💬 口语 |
457
- | written | ✍️ 书面 |
458
-
459
- ### 7.3 Formality Emojis
460
-
461
- | Formality | Emoji |
462
- |-----------|-------|
463
- | casual | 😎 随意 |
464
- | neutral | 😐 中性 |
465
- | formal | 🤵 正式 |
466
-
467
- ### 7.4 Section Emojis
468
-
469
- | Section | Emoji | Example |
470
- |---------|-------|---------|
471
- | Title | 🏢 | `🏢 今日知识点 \| Today's Knowledge Point` |
472
- | Scene | 🎬 | `🎬 场景 \| Scene` |
473
- | Expressions | ✨💬 | `✨ Let's touch base` |
474
- | Pronunciation | 🔊 | `🔊 Sounds like 'touch base'` |
475
- | Usage | 💡 | `💡 Brief, informal check-in` |
476
- | Alternatives | 🔄 | `🔄 其他说法 \| Alternatives` |
477
- | Chinglish | ⚠️❌✅ | `❌ Wrong ... ✅ Correct` |
478
- | Examples | 🗣️💭 | `🗣️ 对话示例 \| Example Dialogues` |
479
- | Extended | 📚 | `📚 延伸学习 \| Extended Learning` |
480
- | Cultural | 🌎 | `🌎 Cultural Note` |
481
- | Mistakes | 🚫 | `🚫 Common Mistakes` |
482
- | Related | 🔗 | `🔗 Related phrases` |
483
-
484
- ### 7.5 Quiz Type Emojis
485
-
486
- | Question Type | Emoji | Label |
487
- |---------------|-------|-------|
488
- | multiple_choice | 🔤 | 选择题 \| Multiple Choice |
489
- | fill_blank | ✏️ | 填空题 \| Fill in the Blank |
490
- | dialogue_completion | 💬 | 对话补全 \| Dialogue Completion |
491
- | chinglish_fix | 🔧 | Chinglish 修正 \| Fix the Chinglish |
492
-
493
- ### 7.6 Feedback Emojis
494
-
495
- | Feedback | Emoji | Example |
496
- |----------|-------|---------|
497
- | Correct | ✅ | `✅ Correct! 'Touch base' = quick check-in` |
498
- | Wrong | ❌ | `❌ Not quite. Try again!` |
499
- | XP | 💎 | `💎 +10 XP` |
500
- | Progress | ⬜⬜⬜⬜ | `⬜⬜⬜⬜ 0/4 questions` |
501
- | Encourage | 💪🚀 | `💪 Good luck! 加油! 🚀` |
502
-
503
- ### 7.7 Situation Emojis for Examples
504
-
505
- | Situation | Emoji |
506
- |-----------|-------|
507
- | Morning/coffee | ☕ |
508
- | Email/message | 📧 |
509
- | Meeting | 🤝 |
510
- | Phone call | 📱 |
511
- | Office chat | 💬 |
512
- | Lunch break | 🍱 |
513
- | Slack/Teams | 💬 |
514
-
515
- ### 7.8 Display Object Structure
516
-
517
- When generating content, include a `display` object with formatted strings:
518
-
519
- ```json
520
- {
521
- "display": {
522
- "title": "🏢 今日知识点 | Today's Knowledge Point",
523
- "topic_tag": "🏷️ 主题: 职场口语 | Workplace Oral",
524
- "formality_tag": "📊 正式度: 中性 | Neutral",
525
- "scene_intro": "🎬 场景 | Scene",
526
- "expressions_title": "💬 核心表达 | Key Expressions",
527
- "chinglish_title": "⚠️ Chinglish 陷阱 | Chinglish Trap",
528
- "examples_title": "🗣️ 对话示例 | Example Dialogues",
529
- "footer": "───────────────────\n📅 2026-02-20 | 📝 Take the quiz to earn XP!"
530
- }
531
- }
532
- ```
533
-
534
- ### 7.9 Emoji Usage Rules
535
-
536
- 1. **Keep it readable**: Don't overuse emojis; 1-2 per line maximum
537
- 2. **Be consistent**: Use the same emoji for the same concept
538
- 3. **Bilingual labels**: Include both Chinese and English when appropriate
539
- 4. **Visual hierarchy**: Use emojis to create visual sections
540
- 5. **Positive tone**: Use encouraging emojis for feedback
541
- 6. **Cultural sensitivity**: Avoid emojis that might be confusing across cultures
542
-
543
- ---
544
-
545
- ## 8. Text Formatting Guidelines
546
-
547
- > Use Markdown formatting to highlight key phrases and create visual emphasis in IM displays.
548
-
549
- ### 8.1 Bold for Key Phrases
550
-
551
- Use `**phrase**` for the main expressions being taught:
552
-
553
- | Use Case | Format | Example |
554
- |----------|--------|---------|
555
- | Key phrase | `**touch base**` | ✨ **Let's touch base** |
556
- | Correct answer | `**Correct: "touch base"**` | ✅ Correct: **Let's touch base!** |
557
- | Important term | `**first mention**` | The phrase **'touch base'** comes from baseball |
558
-
559
- ### 8.2 Wrong Answers Format (Feishu-Compatible)
560
-
561
- > IMPORTANT: Do NOT use `~~strikethrough~~` - it doesn't work in Feishu cards. Use ❌ emoji + quotes instead.
562
-
563
- | Use Case | Format | Example |
564
- |----------|--------|---------|
565
- | Wrong expression | `❌ "discuss together"` | ❌ "Let's discuss together" |
566
- | Chinglish | `❌ "communicate with you"` | ❌ "I want to communicate with you" |
567
-
568
- ### 8.3 Formatting Combinations
569
-
570
- Combine formatting with emojis for maximum impact:
571
-
572
- ```
573
- ❌ Wrong: "Let's discuss together."
574
- ✅ Correct: **Let's touch base!**
575
-
576
- 💬 A: "Can we **touch base** on those mockups?"
577
- ```
578
-
579
- ### 8.4 Key Phrase Highlighting in Dialogues
580
-
581
- In examples, always highlight the key phrase:
582
-
583
- ```json
584
- {
585
- "dialogue": "💬 A: Hey, can we **touch base** on those mockups?\n💬 B: Sure, I'll swing by after lunch.",
586
- "key_phrase_highlight": "**touch base**"
587
- }
588
- ```
589
-
590
- ### 8.5 Display Object Fields for Formatting
591
-
592
- | Field | Purpose | Example |
593
- |-------|---------|---------|
594
- | `phrase` | Bold key phrase | `**Let's touch base**` |
595
- | `phrase_plain` | Unformatted version | `Let's touch base` |
596
- | `key_phrase` | Question key phrase | `**touch base**` |
597
- | `key_phrase_highlight` | Highlighted in context | `**touch base**` |
598
- | `correct_pattern` | Pattern explanation | `**Agree + suggest time**` |
599
- | `key_phrase_summary` | Quiz summary | `🔑 Key Phrase: **touch base** = 快速沟通` |
600
-
601
- ### 8.6 Formatting Rules
602
-
603
- 1. **Bold all key phrases** in display sections
604
- 2. **Use ❌ emoji for wrong answers** in Chinglish traps and quizzes (NOT strikethrough)
605
- 3. **Keep original text** in data fields (phrase, alternatives, etc.)
606
- 4. **Add formatting only** in display fields
607
- 5. **Be consistent** - always format the same phrase the same way
608
- 6. **Don't over-format** - only highlight the key learning points
609
-
610
- ---
611
-
612
- ## 9. Initialization Flow Templates
613
-
614
- > Templates for the 6-step onboarding process when a new user starts.
615
-
616
- ### 9.1 Welcome Message (Step 0)
617
-
618
- ```json
619
- {
620
- "type": "init_welcome",
621
- "step": 0,
622
- "display": {
623
- "title": "👋 Welcome to American English Tutor!",
624
- "message": "Hi! I'm your personal English tutor. I'll help you learn authentic American expressions that native speakers actually use.\n\nLet me ask you a few questions to personalize your learning experience.",
625
- "prompt": "Ready to get started? Reply with **start** or **开始** to begin.",
626
- "footer": "───────────────────\n🎯 This takes about 2 minutes"
627
- }
628
- }
629
- ```
630
-
631
- ### 9.2 CEFR Level Selection (Step 1)
632
-
633
- ```json
634
- {
635
- "type": "init_cefr",
636
- "step": 1,
637
- "display": {
638
- "title": "📊 Step 1/5: Your English Level",
639
- "message": "What's your current English level?",
640
- "options": [
641
- "**A1-A2**: Beginner - Basic conversations, everyday words",
642
- "**B1-B2**: Intermediate - Work conversations, some idioms",
643
- "**C1-C2**: Advanced - Complex topics, nuanced expressions"
644
- ],
645
- "prompt": "Reply with your level (e.g., **B1**, **B2**, **C1**)",
646
- "hint": "💡 Not sure? Most working professionals are B1-B2. You can change this later."
647
- }
648
- }
649
- ```
650
-
651
- ### 9.3 Topic Preferences (Step 2)
652
-
653
- ```json
654
- {
655
- "type": "init_topics",
656
- "step": 2,
657
- "display": {
658
- "title": "🎯 Step 2/5: Your Interests",
659
- "message": "Which topics interest you most?",
660
- "topics": [
661
- "🎬 movies - TV shows, films",
662
- "📰 news - Current events",
663
- "🎮 gaming - Video games",
664
- "⚽ sports - Sports & fitness",
665
- "🏢 workplace - Office & business",
666
- "💬 social - Friends & parties",
667
- "🏠 daily_life - Shopping, restaurants"
668
- ],
669
- "prompt": "List your interests (e.g., **movies workplace gaming**)",
670
- "example": "Example: **movies workplace gaming**"
671
- }
672
- }
673
- ```
674
-
675
- ### 9.4 Tutor Style (Step 3)
676
-
677
- ```json
678
- {
679
- "type": "init_style",
680
- "step": 3,
681
- "display": {
682
- "title": "🎭 Step 3/5: Tutor Style",
683
- "message": "How should I teach you?",
684
- "options": [
685
- "😄 **humorous** - Fun examples, jokes, pop culture",
686
- "📚 **rigorous** - Detailed explanations, grammar focus",
687
- "😎 **casual** - Short & sweet, everyday language",
688
- "👔 **professional** - Business-focused, formal contexts"
689
- ],
690
- "prompt": "Reply with: **humorous**, **rigorous**, **casual**, or **professional**"
691
- }
692
- }
693
- ```
694
-
695
- ### 9.5 Oral/Written Ratio (Step 4)
696
-
697
- ```json
698
- {
699
- "type": "init_ratio",
700
- "step": 4,
701
- "display": {
702
- "title": "💬 Step 4/5: Speaking vs Writing",
703
- "message": "What do you want to focus on?",
704
- "options": [
705
- "🗣️ **Mostly speaking** - Daily conversations, casual chat",
706
- "⚖️ **Balanced** - Mix of speaking and writing",
707
- "✍️ **Mostly writing** - Emails, formal documents"
708
- ],
709
- "prompt": "Reply with a number 0-100 for speaking focus (e.g., **70** = 70% speaking)"
710
- }
711
- }
712
- ```
713
-
714
- ### 9.6 Schedule Configuration (Step 5)
715
-
716
- ```json
717
- {
718
- "type": "init_schedule",
719
- "step": 5,
720
- "display": {
721
- "title": "⏰ Step 5/5: Schedule Your Learning",
722
- "message": "When should I send you daily content?",
723
- "defaults": {
724
- "keypoint": "☀️ **Keypoint** (morning lesson): Default **06:45**",
725
- "quiz": "🌙 **Quiz** (evening practice): Default **22:45**"
726
- },
727
- "prompt": "Reply with times in 24-hour format (e.g., **07:00 21:30**) or press Enter for defaults.",
728
- "hint": "💡 Quiz time must be later than keypoint time. Example: '07:00 21:30' or just press Enter for defaults."
729
- }
730
- }
731
- ```
732
-
733
- **Validation Rules:**
734
- - Both times must be in HH:MM format (24-hour)
735
- - Quiz time must be later than keypoint time
736
- - If user only provides one time, ask for the second
737
- - If invalid format, show error and re-prompt
738
-
739
- ### 9.7 Confirmation (Step 6)
740
-
741
- ```json
742
- {
743
- "type": "init_confirm",
744
- "step": 6,
745
- "display": {
746
- "title": "✅ All Set! Here's Your Profile:",
747
- "summary": {
748
- "level": "📊 Level: {cefr_level}",
749
- "topics": "🎯 Topics: {top_topics}",
750
- "style": "🎭 Style: {tutor_style}",
751
- "focus": "💬 Focus: {oral_ratio}% speaking",
752
- "schedule": "⏰ Schedule: Keypoint at {keypoint_time}, Quiz at {quiz_time}"
753
- },
754
- "prompt": "Does this look right? Reply **yes** to confirm or **change** to adjust.",
755
- "footer": "───────────────────\n🚀 Your first lesson starts tomorrow!"
756
- }
757
- }
758
- ```
759
-
760
- ### 9.8 Completion
761
-
762
- ```json
763
- {
764
- "type": "init_complete",
765
- "display": {
766
- "title": "🎉 Welcome Aboard!",
767
- "message": "You're all set! Here's what happens next:\n\n"
768
- "☀️ **{keypoint_time}** - Daily knowledge point\n"
769
- "🌙 **{quiz_time}** - Daily quiz",
770
- "cron_setup": "I'll create cron jobs for your schedule now. You can change this anytime with the **schedule** command.",
771
- "first_lesson": "Want your first lesson now? Reply **keypoint** or **知识点**",
772
- "footer": "───────────────────\n💡 Say **help** anytime to see all commands"
773
- }
774
- }
775
- ```
776
-
777
- **Cron Job Creation (after Step 6 confirmation):**
778
-
779
- After user confirms with "yes", MUST execute the following bash commands to create cron jobs:
780
-
781
- ```bash
782
- # Parse times from schedule
783
- KEYPOINT_TIME="06:45" # Default, replace with user's keypoint_time
784
- QUIZ_TIME="22:45" # Default, replace with user's quiz_time
785
-
786
- # Extract hour and minute
787
- KEYPOINT_HOUR=$(echo $KEYPOINT_TIME | cut -d: -f1)
788
- KEYPOINT_MIN=$(echo $KEYPOINT_TIME | cut -d: -f2)
789
- QUIZ_HOUR=$(echo $QUIZ_TIME | cut -d: -f1)
790
- QUIZ_MIN=$(echo $QUIZ_TIME | cut -d: -f2)
791
-
792
- # Create cron jobs using openclaw
793
- # Keypoint job
794
- ${KEYPOINT_MIN} ${KEYPOINT_HOUR} * * * openclaw system event --text "Use eng-lang-tutor skill. Push today's keypoint." --mode now
795
-
796
- # Quiz job
797
- ${QUIZ_MIN} ${QUIZ_HOUR} * * * openclaw system event --text "Use eng-lang-tutor skill. Push today's quiz invitation." --mode now
798
- ```
799
-
800
- **IMPORTANT:** The cron job creation requires:
801
- 1. Parse user's `keypoint_time` and `quiz_time` from state.json schedule
802
- 2. Execute the bash command to register each cron job
803
- 3. Log the event using `state_manager.py append_event`
804
-
805
- ---
806
-
807
- ## 10. Response Templates
808
-
809
- > Templates for various response scenarios.
810
-
811
- ### 10.1 Already Completed Responses
812
-
813
- ```json
814
- {
815
- "quiz_already_done": {
816
- "display": {
817
- "title": "✅ Already Completed!",
818
- "message": "You've already finished today's quiz. Great job! 🎉",
819
- "stats": "Your score: {score}/{total} | XP earned: {xp}",
820
- "next_quiz": "Come back tomorrow at 10:45 PM for a new quiz!",
821
- "alternative": "💡 Want to review? Say **errors** to see your wrong answers."
822
- }
823
- }
824
- }
825
- ```
826
-
827
- ### 10.2 Not Available Responses
828
-
829
- ```json
830
- {
831
- "keypoint_not_found": {
832
- "display": {
833
- "title": "📅 No Keypoint Found",
834
- "message": "No knowledge point exists for {date}.",
835
- "hint": "Try **keypoint today** for today's content.",
836
- "history": "Or say **keypoint history** to see recent keypoints."
837
- }
838
- },
839
- "quiz_not_ready": {
840
- "display": {
841
- "title": "⏰ Quiz Not Ready Yet",
842
- "message": "Today's quiz will be available at 10:45 PM.",
843
- "alternative": "Want to study? Say **keypoint** to review today's content!"
844
- }
845
- }
846
- }
847
- ```
848
-
849
- ### 10.2.1 Keypoint History Response
850
-
851
- **When user says:** `keypoint history`, `知识点 历史`, `昨天`, `yesterday`
852
-
853
- **Logic:**
854
- 1. Scan `data/daily/` directory for all `YYYY-MM-DD/keypoint.json` files
855
- 2. Sort by date descending (most recent first)
856
- 3. Extract `display.title` or `topic` from each keypoint
857
-
858
- **Empty History Response:**
859
- ```markdown
860
- 📚 **知识点历史记录**
861
-
862
- 暂无历史记录。从今天开始学习吧!
863
-
864
- 💡 输入 **keypoint** 或 **知识点** 获取今日内容
865
- ```
866
-
867
- **With History Response:**
868
- ```markdown
869
- 📚 **知识点历史记录**
870
-
871
- | 日期 | 主题 |
872
- |------|------|
873
- | 2026-02-21 | 🏢 Touch Base - 工作沟通 |
874
- | 2026-02-20 | 🎮 GG - 游戏用语 |
875
- | 2026-02-19 | 🗣️ Gonna/Wanna - 口语缩写 |
876
-
877
- 💡 输入 **keypoint 日期** 查看详情,如 `keypoint 2026-02-20`
878
- ```
879
-
880
- **CRITICAL:** The history list is populated from persisted `data/daily/YYYY-MM-DD/keypoint.json` files. If keypoints are not saved to this location, history will be empty.
881
-
882
- ### 10.3 Keypoint Display Template
883
-
884
- > IMPORTANT: Use `**text**` for bold. Never use `~~strikethrough~~`. Output Markdown text directly, NOT JSON.
885
-
886
- **Assembly Flow:**
887
-
888
- When displaying a keypoint, read the `display` object and assemble fields in this order:
889
-
890
- ```markdown
891
- {title}
892
-
893
- | 主题 | **{topic_name}** |
894
- |------|------------------|
895
- | 正式度 | **{formality}** |
896
-
897
- ───────────────────
898
- {scene_intro}
899
-
900
- {scene_text}
901
-
902
- ───────────────────
903
- {expressions_title}
904
-
905
- {for each item in expressions_formatted:
906
- {emoji} {phrase}
907
- {pronunciation}
908
- {usage}
909
-
910
- }
911
-
912
- ───────────────────
913
- {alternatives_title}
914
-
915
- {alternatives_formatted}
916
-
917
- ───────────────────
918
- {chinglish_title}
919
-
920
- {chinglish_formatted}
921
-
922
- ───────────────────
923
- {examples_title}
924
-
925
- {for each item in examples_formatted:
926
- {situation_emoji} {situation}
927
- {dialogue}
928
-
929
- }
930
-
931
- ───────────────────
932
- {extended_title}
933
-
934
- {extended_formatted}
935
-
936
- ───────────────────
937
- {references_title}
938
-
939
- {references_formatted}
940
-
941
- ───────────────────
942
- {footer}
943
- ```
944
-
945
- **Display Object Structure (for generation):**
946
-
947
- ```json
948
- {
949
- "display": {
950
- "title": "🏢 今日知识点 | Today's Knowledge Point",
951
- "topic_tag": "🏷️ 主题: **{topic_name}** | {topic_name_en}",
952
- "formality_tag": "📊 正式度: **{formality}**",
953
- "scene_intro": "🎬 场景 | Scene",
954
- "scene_text": "{scene_context}",
955
- "expressions_title": "💬 核心表达 | Key Expressions",
956
- "expressions_formatted": [
957
- {
958
- "emoji": "✨",
959
- "phrase": "**{phrase}**",
960
- "pronunciation": "🔊 {pronunciation_tip}",
961
- "usage": "💡 {usage_note}"
962
- }
963
- ],
964
- "alternatives_title": "🔄 其他说法 | Alternatives",
965
- "alternatives_formatted": "• **{alt_1}**\n• **{alt_2}**",
966
- "chinglish_title": "⚠️ Chinglish 陷阱 | Chinglish Trap",
967
- "chinglish_formatted": "❌ Wrong: \"{wrong}\"\n✅ Correct: **{correct}**\n\n📝 {explanation}",
968
- "examples_title": "🗣️ 对话示例 | Example Dialogues",
969
- "examples_formatted": [
970
- {
971
- "situation_emoji": "☕",
972
- "situation": "{situation_name}",
973
- "dialogue": "💬 A: {line_1}\n💬 B: {line_2}",
974
- "key_phrase_highlight": "**{key_phrase}**"
975
- }
976
- ],
977
- "extended_title": "📚 延伸学习 | Extended Learning",
978
- "extended_formatted": "🔗 Related: **{related_1}** | **{related_2}**\n\n🌎 {cultural_note}",
979
- "references_title": "📖 权威参考 | References",
980
- "references_formatted": "📚 [{dict_source}]({dict_url}) - {dict_note}\n🎬 [{usage_source}]({usage_url}) - {usage_note}",
981
- "footer": "───────────────────\n📅 {date} | 📝 Take the quiz to earn XP!"
982
- }
983
- }
984
- ```
985
-
986
- **Variables:**
987
- - `{topic_name}`: Chinese topic name (e.g., 职场口语)
988
- - `{topic_name_en}`: English topic name (e.g., Workplace Oral)
989
- - `{formality}`: Formality level (随意/中性/正式)
990
- - `{scene_context}`: Brief scene description
991
- - `{phrase}`: Key expression phrase
992
- - `{pronunciation_tip}`: Pronunciation tips
993
- - `{usage_note}`: Usage notes
994
- - `{alt_N}`: Alternative expressions
995
- - `{wrong}`: The Chinglish/wrong expression
996
- - `{correct}`: The correct American expression
997
- - `{explanation}`: Why the wrong version is wrong
998
- - `{situation_name}`: Example situation
999
- - `{dialogue}`: Dialogue with **bold** key phrases
1000
- - `{related_N}`: Related phrases
1001
- - `{dict_source}`: Dictionary source name (e.g., Merriam-Webster)
1002
- - `{dict_url}`: Dictionary URL
1003
- - `{dict_note}`: Brief note about dictionary entry
1004
- - `{usage_source}`: Usage context source name (e.g., YouGlish)
1005
- - `{usage_url}`: Usage context URL
1006
- - `{usage_note}`: Brief note about usage examples
1007
-
1008
- ### 10.4 Stats Display Template
1009
-
1010
- > IMPORTANT: Output Markdown text directly, NOT JSON. Read from state.json and format as shown.
1011
-
1012
- **Data Source:** `data/state.json`
1013
-
1014
- **Fields to Read:**
1015
- - `user.xp` → current XP
1016
- - `user.streak` → streak days
1017
- - `user.level` → activity level (1-20)
1018
- - `user.gems` → gems count
1019
- - `progress.correct_rate` → accuracy percentage
1020
- - `progress.badges` → earned badges list
1021
-
1022
- **Markdown Output Format:**
1023
-
1024
- ```markdown
1025
- 📊 **Your Learning Progress**
1026
-
1027
- • 等级: **{level}** ({level_name})
1028
- • XP: **{current_xp}** / {next_level_xp} (**{progress}%**)
1029
- • 连胜: **{streak}** 天 (倍数: **{multiplier}x**)
1030
- • 正确率: **{correct_rate}%**
1031
- • 徽章: **{badges_count}**/6
1032
- • 宝石: **{gems}**
1033
-
1034
- ───────────────────
1035
- Keep it up! 💪
1036
- ```
1037
-
1038
- **Level Names:**
1039
- - Level 1-5: Starter (启程者)
1040
- - Level 6-10: Traveler (行路人)
1041
- - Level 11-15: Explorer (探索者)
1042
- - Level 16-20: Pioneer (开拓者)
1043
-
1044
- **Multiplier Calculation:** `1.0 + (streak * 0.05)`, max 2.0x
1045
-
1046
- ### 10.5 Config Display Template
1047
-
1048
- > IMPORTANT: Output Markdown text directly, NOT JSON. Read from state.json and format as shown.
1049
-
1050
- **Data Source:** `data/state.json`
1051
-
1052
- **Fields to Read:**
1053
- - `preferences.cefr_level` → CEFR level (A1-C2)
1054
- - `preferences.topic_weights` → topic preferences with weights
1055
- - `preferences.tutor_style` → tutor style
1056
- - `preferences.oral_ratio` → speaking focus percentage
1057
- - `schedule.keypoint_time` → keypoint push time
1058
- - `schedule.quiz_time` → quiz push time
1059
-
1060
- **Markdown Output Format:**
1061
-
1062
- ```markdown
1063
- ⚙️ **Your Settings**
1064
-
1065
- • CEFR 等级: **{cefr_level}**
1066
- • 主题偏好: **{topics_list}**
1067
- • 导师风格: **{tutor_style}**
1068
- • 口语占比: **{oral_ratio}%**
1069
- • 知识点推送: **{keypoint_time}**
1070
- • Quiz 推送: **{quiz_time}**
1071
-
1072
- ───────────────────
1073
- 💡 Say **set level B2** to change your level
1074
- ```
1075
-
1076
- ### 10.6 Errors Display Template (Paginated)
1077
-
1078
- > IMPORTANT: Output Markdown text directly, NOT JSON. Read from state.json error_notebook and format as shown.
1079
-
1080
- **Data Source:** `data/state.json` → `error_notebook` array
1081
-
1082
- **Fields to Read:**
1083
- - `error_notebook` → array of error records
1084
- - Each error has: `date`, `question`, `user_answer`, `correct_answer`, `reviewed`
1085
-
1086
- **Markdown Output Format:**
1087
-
1088
- ```markdown
1089
- 📓 **Error Notebook**
1090
-
1091
- 📊 统计: **{total}** 条错题 (未复习: **{unreviewed}**)
1092
-
1093
- ❌ 最近 **5** 条:
1094
-
1095
- **{date_1}**
1096
- Q: {question_1}
1097
- Your answer: {user_answer_1}
1098
- ✅ Correct: **{correct_answer_1}**
1099
-
1100
- **{date_2}**
1101
- Q: {question_2}
1102
- Your answer: {user_answer_2}
1103
- ✅ Correct: **{correct_answer_2}**
1104
-
1105
- [显示 5 条,第 1/{total_pages} 页]
1106
-
1107
- ───────────────────
1108
- 📄 输入 **"错题本 更多"** 查看下5条
1109
- 📄 输入 **"错题本 2026-02"** 查看特定月份
1110
- 📄 输入 **"错题本 随机5"** 随机复习5条
1111
- 📄 输入 **"错题本 统计"** 查看完整统计
1112
- 📄 输入 **"错题本 复习"** 开始错题复习
1113
- ```
1114
-
1115
- **Pagination Commands:**
1116
- - `errors` / `错题本` → Show recent 5 errors
1117
- - `errors more` / `错题本 更多` → Next 5 errors
1118
- - `errors page N` → Go to page N
1119
- - `errors 2026-02` → Filter by month
1120
- - `errors random 5` → Random 5 for review
1121
- - `errors stats` → Show statistics only
1122
- - `errors review` → Start interactive review
1123
-
1124
- ### 10.7 Error Review Session Template
1125
-
1126
- > IMPORTANT: Output Markdown text directly, NOT JSON. Error review gives NO XP.
1127
-
1128
- **Question Display:**
1129
- ```markdown
1130
- 📓 **错题复习**
1131
-
1132
- 📊 进度: **{current}/{total}**
1133
-
1134
- **Q:** {question}
1135
- A. {option_a}
1136
- B. {option_b}
1137
- C. {option_c}
1138
- D. {option_d}
1139
-
1140
- ───────────────────
1141
- 💡 输入 **A/B/C/D** 作答
1142
- ```
1143
-
1144
- **Correct Answer Response:**
1145
- ```markdown
1146
- ✅ **正确!**
1147
-
1148
- 🎯 **{correct_answer}** 是地道的表达!
1149
-
1150
- 📊 本题已从错题本中移除 ✓
1151
-
1152
- ───────────────────
1153
- 📝 继续下一题?输入 **继续**
1154
- ```
1155
-
1156
- **Wrong Answer Response:**
1157
- ```markdown
1158
- ❌ **错误!**
1159
-
1160
- ✅ 正确答案: **{correct_answer}**
1161
-
1162
- 📝 {explanation}
1163
-
1164
- 📊 本题错误次数:**{wrong_count}**
1165
-
1166
- ───────────────────
1167
- 📝 继续下一题?输入 **继续**
1168
- ```
1169
-
1170
- **Review Complete Summary:**
1171
- ```markdown
1172
- 📓 **错题复习完成!**
1173
-
1174
- • 本次正确率: **{correct}/{total}**
1175
- • 已清除: **{cleared}** 道错题
1176
- • 仍需复习: **{remaining}** 道错题
1177
- • Error Slayer 进度: **{progress}/30**
1178
-
1179
- ───────────────────
1180
- 💪 继续加油!输入 **错题本 复习** 再次挑战
1181
- ```
1182
-
1183
- **Variables:**
1184
- - `{current}`: Current question number
1185
- - `{total}`: Total questions in session (default 5)
1186
- - `{wrong_count}`: Number of times this question was answered incorrectly
1187
- - `{cleared}`: Number of errors cleared this session
1188
- - `{remaining}`: Number of errors still needing review
1189
- - `{progress}`: Current progress toward Error Slayer badge
1190
-
1191
- ### 10.8 Quiz Result Display Template
1192
-
1193
- > IMPORTANT: Output Markdown text directly, NOT JSON. Calculate XP from quiz answers.
1194
-
1195
- **Markdown Output Format:**
1196
-
1197
- ```markdown
1198
- 📊 **Quiz Results**
1199
-
1200
- • 分数: **{correct}/{total}** (**{accuracy}%**)
1201
- • 状态: {status_emoji} {status_text}
1202
- • XP 获得: **+{total_xp} XP**
1203
- • 连胜: **{old_streak}** → **{new_streak}** 天
1204
- • 总 XP: **{total_xp_earned}**
1205
-
1206
- 💎 XP 明细:
1207
- • Base: **{base_xp} XP**
1208
- • Streak Bonus: **{multiplier}x** ({streak} day streak)
1209
- {perfect_bonus}
1210
-
1211
- ───────────────────
1212
- 📝 Come back tomorrow for a new quiz!
1213
- ```
1214
-
1215
- **Variables:**
1216
- - `{status_emoji}`: ✅ for passed, ❌ for failed
1217
- - `{status_text}`: "Passed! Great job! 🎉" or "Keep trying! 💪"
1218
- - `{perfect_bonus}`: "• Perfect Bonus: **+20 XP**" (only if 100% correct)
1219
-
1220
- ### 10.9 Output Format Rules
1221
-
1222
- > CRITICAL: All responses must use platform-agnostic Markdown. OpenClaw handles platform-specific conversions.
1223
-
1224
- **Universal Markdown Format:**
1225
-
1226
- Output standard Markdown that works across all platforms (Feishu, Discord, Telegram, Slack):
1227
-
1228
- ```markdown
1229
- 🏢 **Title Here**
1230
-
1231
- **Label:** Value
1232
-
1233
- ───────────────────
1234
-
1235
- 📝 **Section Title**
1236
-
1237
- Content with **bold** and [links](url).
1238
-
1239
- ───────────────────
1240
-
1241
- 📅 Footer info
1242
- ```
1243
-
1244
- **Rules:**
1245
-
1246
- 1. **Use standard Markdown** - Compatible with all platforms
1247
- 2. **Bold syntax**: Use `**text**` for bold
1248
- 3. **Never use** `~~strikethrough~~` - use ❌ emoji instead
1249
- 4. **Line breaks**: Use blank lines between sections
1250
- 5. **Bullets**: Use `•` for bullet points
1251
- 6. **Emojis**: Include at the start of each section
1252
- 7. **Punctuation**: End sentences properly (`.` or `?` or `!`)
1253
- 8. **Links**: Use `[text](url)` format
1254
-
1255
- **Platform Compatibility:**
69
+ ## Related Files
1256
70
 
1257
- | Syntax | Feishu | Discord | Telegram | Slack |
1258
- |--------|--------|---------|----------|-------|
1259
- | `**bold**` | | ✅ | ✅ | ✅ |
1260
- | `[link](url)` | ✅ | ✅ | ✅ | ✅ |
1261
- | Emoji | ✅ | ✅ | ✅ | ✅ |
71
+ - [../references/resources.md](../references/resources.md) - Topic-specific learning resources
72
+ - [../examples/sample_keypoint.json](../examples/sample_keypoint.json) - Example keypoint output
73
+ - [../examples/sample_quiz.json](../examples/sample_quiz.json) - Example quiz output