@aiyiran/myclaw 1.1.26 → 1.1.34
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/assets/myclaw-artifacts.js +55 -15
- package/package.json +1 -1
- package/skills/yiran-course-template-pipeline/README.md +5 -0
- package/skills/yiran-course-template-pipeline/SKILL.md +8 -4
- package/skills/yiran-course-template-pipeline/cdn-convention.md +77 -0
- package/skills/yiran-course-template-pipeline/prompts//350/257/204/344/273/267/347/202/271/345/255/220.md +107 -0
- package/skills/yiran-course-template-pipeline/prompts//351/230/266/346/256/2651-demo/347/224/237/346/210/220.md +36 -0
- package/skills/yiran-course-template-pipeline/prompts//351/230/266/346/256/2652-student/347/224/237/346/210/220.md +2 -0
- package/skills/yiran-course-template-pipeline/prompts//351/230/266/346/256/2653-teacher/347/224/237/346/210/220.md +2 -0
- package/skills/yiran-course-template-pipeline/prompts//351/230/266/346/256/2654-/346/211/223/345/214/205/350/220/275/347/233/230.md +32 -2
- package/skills/yiran-course-template-pipeline/scripts/build_template_index.py +103 -0
- package/skills/yiran-course-template-pipeline/scripts/move_template_task.py +2 -3
- package/skills/yiran-course-template-pipeline/scripts/publish_template.py +193 -0
- package/skills/yiran-course-template-pipeline//344/270/232/345/212/241/350/203/214/346/231/257.md +81 -0
- package/.claude/settings.local.json +0 -51
- package/agent-list/workspace-danci/AGENTS.md +0 -13
- package/agent-list/workspace-danci/BOOTSTRAP.md +0 -5
- package/agent-list/workspace-danci/HEARTBEAT.md +0 -3
- package/agent-list/workspace-danci/IDENTITY.md +0 -5
- package/agent-list/workspace-danci/SOUL.md +0 -6
- package/agent-list/workspace-danci/TOOLS.md +0 -40
- package/agent-list/workspace-danci/USER.md +0 -7
- package/agent-list/workspace-danci/memory/birthday.md +0 -9
- package/agent-list/workspace-danci/memory/english-words-20260401.md +0 -225
- package/agent-list/workspace-fashe1/.openclaw/workspace-state.json +0 -4
- package/agent-list/workspace-fashe1/AGENTS.md +0 -212
- package/agent-list/workspace-fashe1/BOOTSTRAP.md +0 -55
- package/agent-list/workspace-fashe1/HEARTBEAT.md +0 -7
- package/agent-list/workspace-fashe1/IDENTITY.md +0 -23
- package/agent-list/workspace-fashe1/MEMORY.md +0 -5
- package/agent-list/workspace-fashe1/SOUL.md +0 -110
- package/agent-list/workspace-fashe1/TOOLS.md +0 -40
- package/agent-list/workspace-fashe1/USER.md +0 -17
- package/agent-list/workspace-fashe1/chaos-button/bg_music.mp3 +0 -0
- package/agent-list/workspace-fashe1/chaos-button/index.html +0 -1371
- package/agent-list/workspace-fashe1/chaos-button/tmpsz_k5dxa.png +0 -0
- package/agent-list/workspace-fashe1/chaos-button//347/202/253/351/205/267/346/234/272/347/224/262_1024x1024_20260416_125127.png +0 -0
- package/agent-list/workspace-fashe1/memory/2026-04-16.md +0 -5
- package/agent-list/workspace-fashe1//345/212/252/345/212/233/345/255/246/344/271/240/347/232/204/345/260/217/346/234/213/345/217/213.png +0 -0
- package/agent-list/workspace-fashe1//345/217/257/347/210/261/346/234/272/347/224/262.png +0 -0
- package/agent-list/workspace-fashe1//346/220/236/347/254/221/345/260/217/346/234/213/345/217/213.png +0 -0
- package/agent-list/workspace-fashe1//346/220/236/347/254/221/345/260/217/346/234/213/345/217/213_/345/215/263/346/242/246.png +0 -0
- package/agent-list/workspace-kakaxi/.openclaw/workspace-state.json +0 -4
- package/agent-list/workspace-kakaxi/AGENTS.md +0 -13
- package/agent-list/workspace-kakaxi/BOOTSTRAP.md +0 -5
- package/agent-list/workspace-kakaxi/HEARTBEAT.md +0 -3
- package/agent-list/workspace-kakaxi/IDENTITY.md +0 -7
- package/agent-list/workspace-kakaxi/MEMORY.md +0 -24
- package/agent-list/workspace-kakaxi/SOUL.md +0 -6
- package/agent-list/workspace-kakaxi/TOOLS.md +0 -44
- package/agent-list/workspace-kakaxi/USER.md +0 -7
- package/agent-list/workspace-kakaxi/cards/README.md +0 -31
- package/agent-list/workspace-kakaxi/cards/build.js +0 -210
- package/agent-list/workspace-kakaxi/cards/index.html +0 -370
- package/agent-list/workspace-kakaxi/cards/workflow-new-card.md +0 -70
- package/agent-list/workspace-kakaxi/cards//346/231/272/350/203/275/344/275/223/345/205/245/351/227/250_2026-04-02_/344/275/234/345/223/201/346/233/264/346/234/211/347/224/250_v1.md +0 -163
- package/agent-list/workspace-kakaxi/cards//346/231/272/350/203/275/344/275/223/345/205/245/351/227/250_2026-04-02_/345/210/233/345/273/272/347/254/254/344/270/200/344/270/252/346/231/272/350/203/275/344/275/223_v1.md +0 -168
- package/agent-list/workspace-kakaxi/cards//346/231/272/350/203/275/344/275/223/345/205/245/351/227/250_2026-04-02_/345/277/253/346/215/267/350/264/246/345/217/267/344/277/241/346/201/257.md +0 -32
- package/agent-list/workspace-kakaxi/cards//346/231/272/350/203/275/344/275/223/345/205/245/351/227/250_2026-04-02_/346/210/220/350/257/255/345/212/251/346/211/213_v2.md +0 -145
- package/agent-list/workspace-kakaxi/cards//346/231/272/350/203/275/344/275/223/345/205/245/351/227/250_2026-04-02_/346/226/207/344/273/266/344/277/235/345/255/230_v1.md +0 -147
- package/agent-list/workspace-kakaxi/cards//346/231/272/350/203/275/344/275/223/345/205/245/351/227/250_2026-04-02_/346/226/207/344/273/266/350/265/204/344/272/247/345/217/230/344/275/234/345/223/201_v1.md +0 -148
- package/agent-list/workspace-kakaxi/cards//346/231/272/350/203/275/344/275/223/345/205/245/351/227/250_2026-04-02_/346/230/216/346/227/245/344/273/273/345/212/241_v1.md +0 -50
- package/agent-list/workspace-kakaxi/cards//346/231/272/350/203/275/344/275/223/345/205/245/351/227/250_2026-04-02_/346/250/241/345/236/213/350/267/221/350/265/267/346/235/245_v2.md +0 -190
- package/agent-list/workspace-kakaxi/teaching-task-standard.md +0 -177
- package/skills/yiran-playground-template-use/templates/a100_/347/273/231/344/276/235/347/204/266/350/200/201/345/270/210/350/256/276/350/256/241/344/270/200/344/270/252AI/347/224/273/345/203/217/__demo__.html +0 -140
- package/skills/yiran-playground-template-use/templates/a100_/347/273/231/344/276/235/347/204/266/350/200/201/345/270/210/350/256/276/350/256/241/344/270/200/344/270/252AI/347/224/273/345/203/217/__student-view__.html +0 -64
- package/skills/yiran-playground-template-use/templates/a100_/347/273/231/344/276/235/347/204/266/350/200/201/345/270/210/350/256/276/350/256/241/344/270/200/344/270/252AI/347/224/273/345/203/217/__student__.json +0 -38
- package/skills/yiran-playground-template-use/templates/a100_/347/273/231/344/276/235/347/204/266/350/200/201/345/270/210/350/256/276/350/256/241/344/270/200/344/270/252AI/347/224/273/345/203/217/__teacher-view__.html +0 -52
- package/skills/yiran-playground-template-use/templates/a100_/347/273/231/344/276/235/347/204/266/350/200/201/345/270/210/350/256/276/350/256/241/344/270/200/344/270/252AI/347/224/273/345/203/217/__teacher__.json +0 -36
- package/skills/yiran-playground-template-use/templates/a100_/347/273/231/344/276/235/347/204/266/350/200/201/345/270/210/350/256/276/350/256/241/344/270/200/344/270/252AI/347/224/273/345/203/217/index.html +0 -61
- package/skills/yiran-playground-template-use/templates/a101_/345/201/2323/345/274/240/345/220/214/344/270/273/351/242/230/345/233/276/347/211/207/__demo__.html +0 -131
- package/skills/yiran-playground-template-use/templates/a101_/345/201/2323/345/274/240/345/220/214/344/270/273/351/242/230/345/233/276/347/211/207/__student-view__.html +0 -64
- package/skills/yiran-playground-template-use/templates/a101_/345/201/2323/345/274/240/345/220/214/344/270/273/351/242/230/345/233/276/347/211/207/__student__.json +0 -34
- package/skills/yiran-playground-template-use/templates/a101_/345/201/2323/345/274/240/345/220/214/344/270/273/351/242/230/345/233/276/347/211/207/__teacher-view__.html +0 -52
- package/skills/yiran-playground-template-use/templates/a101_/345/201/2323/345/274/240/345/220/214/344/270/273/351/242/230/345/233/276/347/211/207/__teacher__.json +0 -34
- package/skills/yiran-playground-template-use/templates/a103_/345/201/232/344/270/200/344/270/252/344/273/213/347/273/215/351/241/265/351/235/242/__demo__.html +0 -77
- package/skills/yiran-playground-template-use/templates/a103_/345/201/232/344/270/200/344/270/252/344/273/213/347/273/215/351/241/265/351/235/242/__student-view__.html +0 -64
- package/skills/yiran-playground-template-use/templates/a103_/345/201/232/344/270/200/344/270/252/344/273/213/347/273/215/351/241/265/351/235/242/__student__.json +0 -38
- package/skills/yiran-playground-template-use/templates/a103_/345/201/232/344/270/200/344/270/252/344/273/213/347/273/215/351/241/265/351/235/242/__teacher-view__.html +0 -52
- package/skills/yiran-playground-template-use/templates/a103_/345/201/232/344/270/200/344/270/252/344/273/213/347/273/215/351/241/265/351/235/242/__teacher__.json +0 -34
- package/skills/yiran-playground-template-use/templates/b100_/345/201/232/344/270/200/344/270/252/346/214/211/351/222/256/351/241/265/351/235/242/__demo__.html +0 -162
- package/skills/yiran-playground-template-use/templates/b100_/345/201/232/344/270/200/344/270/252/346/214/211/351/222/256/351/241/265/351/235/242/__student-view__.html +0 -64
- package/skills/yiran-playground-template-use/templates/b100_/345/201/232/344/270/200/344/270/252/346/214/211/351/222/256/351/241/265/351/235/242/__student__.json +0 -34
- package/skills/yiran-playground-template-use/templates/b100_/345/201/232/344/270/200/344/270/252/346/214/211/351/222/256/351/241/265/351/235/242/__teacher-view__.html +0 -52
- package/skills/yiran-playground-template-use/templates/b100_/345/201/232/344/270/200/344/270/252/346/214/211/351/222/256/351/241/265/351/235/242/__teacher__.json +0 -34
- package/skills/yiran-playground-template-use/templates/c100_/347/273/231/345/260/217/347/273/204/344/275/234/345/223/201/345/201/232/344/270/200/346/254/241/345/260/217/344/277/256/346/224/271/__demo__.html +0 -180
- package/skills/yiran-playground-template-use/templates/c100_/347/273/231/345/260/217/347/273/204/344/275/234/345/223/201/345/201/232/344/270/200/346/254/241/345/260/217/344/277/256/346/224/271/__student-view__.html +0 -64
- package/skills/yiran-playground-template-use/templates/c100_/347/273/231/345/260/217/347/273/204/344/275/234/345/223/201/345/201/232/344/270/200/346/254/241/345/260/217/344/277/256/346/224/271/__student__.json +0 -38
- package/skills/yiran-playground-template-use/templates/c100_/347/273/231/345/260/217/347/273/204/344/275/234/345/223/201/345/201/232/344/270/200/346/254/241/345/260/217/344/277/256/346/224/271/__teacher-view__.html +0 -52
- package/skills/yiran-playground-template-use/templates/c100_/347/273/231/345/260/217/347/273/204/344/275/234/345/223/201/345/201/232/344/270/200/346/254/241/345/260/217/344/277/256/346/224/271/__teacher__.json +0 -41
- package/skills/yiran-playground-template-use/templates/c100_/347/273/231/345/260/217/347/273/204/344/275/234/345/223/201/345/201/232/344/270/200/346/254/241/345/260/217/344/277/256/346/224/271/demo.html +0 -180
- package/skills/yiran-playground-template-use/templates/c100_/347/273/231/345/260/217/347/273/204/344/275/234/345/223/201/345/201/232/344/270/200/346/254/241/345/260/217/344/277/256/346/224/271/index.html +0 -121
- package/skills/yiran-playground-template-use/templates/c100_/347/273/231/345/260/217/347/273/204/344/275/234/345/223/201/345/201/232/344/270/200/346/254/241/345/260/217/344/277/256/346/224/271//345/260/217/347/273/204/345/220/211/347/245/245/347/211/251_26.png +0 -0
- package/skills/yiran-playground-template-use/templates/c100_/347/273/231/345/260/217/347/273/204/344/275/234/345/223/201/345/201/232/344/270/200/346/254/241/345/260/217/344/277/256/346/224/271//345/260/217/347/273/204/345/233/276/345/275/242/346/240/207/345/277/227_83.png +0 -0
- package/skills/yiran-playground-template-use/templates/c100_/347/273/231/345/260/217/347/273/204/344/275/234/345/223/201/345/201/232/344/270/200/346/254/241/345/260/217/344/277/256/346/224/271//347/217/255/347/272/247/345/260/217/347/273/204/345/276/275/347/253/240_47.png +0 -0
- package/skills/yiran-skill-media/scripts/__pycache__/generate.cpython-311.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/__init__.cpython-311.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/__init__.cpython-37.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/jimeng_image.cpython-37.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/jimeng_video.cpython-311.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/jimeng_video.cpython-37.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_image.cpython-311.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_image.cpython-37.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_music.cpython-311.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_music.cpython-37.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_video.cpython-311.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_video.cpython-37.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/vapi_image.cpython-311.pyc +0 -0
- package/skills/yiran-skill-media/scripts/providers/__pycache__/vapi_image.cpython-37.pyc +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
publish_template.py
|
|
4
|
+
|
|
5
|
+
发布模板文件夹到七牛 CDN,完成后重建并上传 template-index.json。
|
|
6
|
+
|
|
7
|
+
流程:
|
|
8
|
+
1. 扫描文件夹内所有 HTML 文件的资源引用(src / href / url())
|
|
9
|
+
2. 对每个引用,找到本地对应文件(相对路径 or 同名本地文件)
|
|
10
|
+
3. 上传本地文件到七牛,key = myclaw/live/yiran/skills/yiran-playground-template-use/templates/{文件夹名}/{文件名}
|
|
11
|
+
4. 重写 HTML 中的原引用为新 CDN URL
|
|
12
|
+
5. 上传修改后的 HTML
|
|
13
|
+
6. 重建 template-index.json 并上传到 CDN
|
|
14
|
+
|
|
15
|
+
用法:
|
|
16
|
+
python3 scripts/publish_template.py <模板文件夹路径>
|
|
17
|
+
|
|
18
|
+
例:
|
|
19
|
+
python3 scripts/publish_template.py templates/a103_做一个介绍页面
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import re
|
|
23
|
+
import subprocess
|
|
24
|
+
import sys
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from urllib.parse import urlparse, unquote
|
|
27
|
+
|
|
28
|
+
from qiniu import Auth, put_file_v2, CdnManager
|
|
29
|
+
|
|
30
|
+
# ── 七牛配置(与 server 保持一致)──────────────────────────────────────────
|
|
31
|
+
QINIU_KEY = "T3tgxM7EMx1j4VESw4m4PIfFXoOvBo-wQEOQewXX"
|
|
32
|
+
QINIU_SECRET = "PVZvlKVOjX2RqlV2ILMg-QwpNMssOlpVbaEzypz0"
|
|
33
|
+
QINIU_BUCKET = "yiran1"
|
|
34
|
+
CDN_DOMAIN = "https://cdn.yiranlaoshi.com"
|
|
35
|
+
CDN_PREFIX = "myclaw/live/yiran/skills/yiran-playground-template-use/templates"
|
|
36
|
+
|
|
37
|
+
q = Auth(QINIU_KEY, QINIU_SECRET)
|
|
38
|
+
cdn_manager = CdnManager(q)
|
|
39
|
+
|
|
40
|
+
# ── 资源引用正则 ────────────────────────────────────────────────────────────
|
|
41
|
+
# 匹配 src="..." href="..." url(...) 三种形式
|
|
42
|
+
ATTR_RE = re.compile(r'(src|href)=["\']([^"\']+)["\']', re.IGNORECASE)
|
|
43
|
+
URL_RE = re.compile(r'url\(["\']?([^)"\']+)["\']?\)', re.IGNORECASE)
|
|
44
|
+
|
|
45
|
+
# 不处理的协议前缀
|
|
46
|
+
SKIP_PREFIXES = ('data:', '#', 'mailto:', 'javascript:')
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def is_external(url: str) -> bool:
|
|
50
|
+
return url.startswith('http://') or url.startswith('https://') or url.startswith('//')
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def find_local_file(ref: str, base_dir: Path) -> Path | None:
|
|
54
|
+
"""
|
|
55
|
+
给定一个资源引用,尝试在 base_dir 中找到对应的本地文件。
|
|
56
|
+
- 相对路径 → 直接拼接
|
|
57
|
+
- 外部 URL → 取 path 最后一段文件名,在 base_dir 中查找
|
|
58
|
+
"""
|
|
59
|
+
if any(ref.startswith(p) for p in SKIP_PREFIXES):
|
|
60
|
+
return None
|
|
61
|
+
|
|
62
|
+
if is_external(ref):
|
|
63
|
+
filename = Path(unquote(urlparse(ref).path)).name
|
|
64
|
+
candidate = base_dir / filename
|
|
65
|
+
return candidate if candidate.is_file() else None
|
|
66
|
+
else:
|
|
67
|
+
candidate = (base_dir / ref).resolve()
|
|
68
|
+
# 必须在 base_dir 内,防止路径穿越
|
|
69
|
+
if candidate.is_file() and str(candidate).startswith(str(base_dir.resolve())):
|
|
70
|
+
return candidate
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def upload_file(local_path: Path, folder_name: str) -> str:
|
|
75
|
+
"""上传单个文件到七牛,返回 CDN URL。"""
|
|
76
|
+
key = f"{CDN_PREFIX}/{folder_name}/{local_path.name}"
|
|
77
|
+
token = q.upload_token(QINIU_BUCKET, key, 3600)
|
|
78
|
+
ret, info = put_file_v2(token, key, str(local_path))
|
|
79
|
+
if info.status_code not in (200, 614): # 614 = 已存在
|
|
80
|
+
raise RuntimeError(f"上传失败 {local_path.name}: {info}")
|
|
81
|
+
cdn_url = f"{CDN_DOMAIN}/{key}"
|
|
82
|
+
cdn_manager.refresh_urls([cdn_url])
|
|
83
|
+
return cdn_url
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def rewrite_html(html: str, ref_map: dict[str, str]) -> str:
|
|
87
|
+
"""将 HTML 中的旧引用替换为新 CDN URL。"""
|
|
88
|
+
def replace_attr(m):
|
|
89
|
+
attr, val = m.group(1), m.group(2)
|
|
90
|
+
new_val = ref_map.get(val, val)
|
|
91
|
+
return f'{attr}="{new_val}"'
|
|
92
|
+
|
|
93
|
+
def replace_url(m):
|
|
94
|
+
val = m.group(1)
|
|
95
|
+
new_val = ref_map.get(val, val)
|
|
96
|
+
return f'url("{new_val}")'
|
|
97
|
+
|
|
98
|
+
html = ATTR_RE.sub(replace_attr, html)
|
|
99
|
+
html = URL_RE.sub(replace_url, html)
|
|
100
|
+
return html
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def collect_refs(html: str) -> set[str]:
|
|
104
|
+
refs = set()
|
|
105
|
+
for m in ATTR_RE.finditer(html):
|
|
106
|
+
refs.add(m.group(2))
|
|
107
|
+
for m in URL_RE.finditer(html):
|
|
108
|
+
refs.add(m.group(1))
|
|
109
|
+
return refs
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def publish(folder_path: Path):
|
|
113
|
+
folder_name = folder_path.name
|
|
114
|
+
html_files = list(folder_path.glob('*.html'))
|
|
115
|
+
|
|
116
|
+
if not html_files:
|
|
117
|
+
print(f"⚠️ 未找到 HTML 文件:{folder_path}")
|
|
118
|
+
return
|
|
119
|
+
|
|
120
|
+
print(f"📂 发布文件夹:{folder_name}")
|
|
121
|
+
|
|
122
|
+
# ── 收集所有 HTML 中的资源引用 ──────────────────────────────────────────
|
|
123
|
+
all_refs: dict[str, str] = {} # 原始引用 → 新 CDN URL
|
|
124
|
+
|
|
125
|
+
for html_file in html_files:
|
|
126
|
+
html = html_file.read_text(encoding='utf-8')
|
|
127
|
+
for ref in collect_refs(html):
|
|
128
|
+
if ref in all_refs:
|
|
129
|
+
continue
|
|
130
|
+
local = find_local_file(ref, folder_path)
|
|
131
|
+
if local:
|
|
132
|
+
print(f" ⬆️ 上传资源: {local.name} ← {ref[:60]}")
|
|
133
|
+
cdn_url = upload_file(local, folder_name)
|
|
134
|
+
all_refs[ref] = cdn_url
|
|
135
|
+
print(f" → {cdn_url}")
|
|
136
|
+
else:
|
|
137
|
+
if not any(ref.startswith(p) for p in SKIP_PREFIXES):
|
|
138
|
+
print(f" ⏭️ 跳过(本地未找到): {ref[:80]}")
|
|
139
|
+
|
|
140
|
+
# ── 重写并上传 HTML 文件 ─────────────────────────────────────────────────
|
|
141
|
+
for html_file in html_files:
|
|
142
|
+
html = html_file.read_text(encoding='utf-8')
|
|
143
|
+
new_html = rewrite_html(html, all_refs)
|
|
144
|
+
|
|
145
|
+
# 写回本地(覆盖)
|
|
146
|
+
html_file.write_text(new_html, encoding='utf-8')
|
|
147
|
+
|
|
148
|
+
print(f" ⬆️ 上传 HTML: {html_file.name}")
|
|
149
|
+
cdn_url = upload_file(html_file, folder_name)
|
|
150
|
+
print(f" → {cdn_url}")
|
|
151
|
+
|
|
152
|
+
print(f"\n✅ 发布完成:{folder_name}")
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def publish_index(pipeline_root: Path):
|
|
156
|
+
"""重建 template-index.json 并上传到 CDN。"""
|
|
157
|
+
index_script = pipeline_root / 'scripts' / 'build_template_index.py'
|
|
158
|
+
print("\n🔄 重建 template-index.json ...")
|
|
159
|
+
subprocess.run(['python3', str(index_script)], check=True)
|
|
160
|
+
|
|
161
|
+
index_file = pipeline_root / 'template-index.json'
|
|
162
|
+
if not index_file.is_file():
|
|
163
|
+
print("⚠️ template-index.json 未生成,跳过上传")
|
|
164
|
+
return
|
|
165
|
+
|
|
166
|
+
key = f"{CDN_PREFIX.rsplit('/templates', 1)[0]}/template-index.json"
|
|
167
|
+
token = q.upload_token(QINIU_BUCKET, key, 3600)
|
|
168
|
+
ret, info = put_file_v2(token, key, str(index_file))
|
|
169
|
+
if info.status_code not in (200, 614):
|
|
170
|
+
raise RuntimeError(f"index 上传失败: {info}")
|
|
171
|
+
cdn_url = f"{CDN_DOMAIN}/{key}"
|
|
172
|
+
cdn_manager.refresh_urls([cdn_url])
|
|
173
|
+
print(f" ⬆️ 已上传索引 → {cdn_url}")
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def main():
|
|
177
|
+
if len(sys.argv) < 2:
|
|
178
|
+
print("用法: python3 publish_template.py <模板文件夹路径>")
|
|
179
|
+
sys.exit(1)
|
|
180
|
+
|
|
181
|
+
folder = Path(sys.argv[1]).expanduser().resolve()
|
|
182
|
+
if not folder.is_dir():
|
|
183
|
+
print(f"❌ 路径不存在或不是文件夹: {folder}")
|
|
184
|
+
sys.exit(1)
|
|
185
|
+
|
|
186
|
+
publish(folder)
|
|
187
|
+
|
|
188
|
+
pipeline_root = Path(__file__).resolve().parent.parent
|
|
189
|
+
publish_index(pipeline_root)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
if __name__ == '__main__':
|
|
193
|
+
main()
|
package/skills/yiran-course-template-pipeline//344/270/232/345/212/241/350/203/214/346/231/257.md
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# 业务背景
|
|
2
|
+
|
|
3
|
+
这份 skill 不是一个通用课程生成器。
|
|
4
|
+
|
|
5
|
+
它当前服务的是一类非常具体的课程:
|
|
6
|
+
**AI 智能体项目课**。
|
|
7
|
+
|
|
8
|
+
## 我们到底在做什么
|
|
9
|
+
|
|
10
|
+
我们不是先讲很多概念,再让学生慢慢想。
|
|
11
|
+
|
|
12
|
+
我们更像是在设计一类“先开始做,再在改进中学习”的项目课。
|
|
13
|
+
|
|
14
|
+
学生面对的通常不是一段抽象知识,
|
|
15
|
+
而是一个可以直接看到、直接操作、可以继续修改的作品原型。
|
|
16
|
+
|
|
17
|
+
这个作品原型,大多数时候会是:
|
|
18
|
+
- 一个网页
|
|
19
|
+
- 一个丰富、多媒体、可交互的网页片段
|
|
20
|
+
- 一个可以继续调整、继续扩展的小项目
|
|
21
|
+
|
|
22
|
+
AI 智能体在这里,不只是工具,
|
|
23
|
+
而是学生一起做项目、一起修改、一起推进作品的搭档。
|
|
24
|
+
|
|
25
|
+
## 这类课的核心目标
|
|
26
|
+
|
|
27
|
+
这类课最重要的,不是先把知识讲复杂,
|
|
28
|
+
也不是先把技术点拆得很细。
|
|
29
|
+
|
|
30
|
+
核心目标是:
|
|
31
|
+
|
|
32
|
+
**让学生快速动手。**
|
|
33
|
+
|
|
34
|
+
也就是说:
|
|
35
|
+
- 学生不用复杂思考,就可以先开始做
|
|
36
|
+
- 先做出一点东西
|
|
37
|
+
- 做出来之后,再开始观察、比较、修改、表达
|
|
38
|
+
- 在一次次改进中,获得训练和能力
|
|
39
|
+
|
|
40
|
+
所以这里的“学习”,不是停留在听懂,
|
|
41
|
+
而是发生在:
|
|
42
|
+
- 动手
|
|
43
|
+
- 调整
|
|
44
|
+
- 比较
|
|
45
|
+
- 再修改
|
|
46
|
+
|
|
47
|
+
## 这会影响整个 pipeline 的写法
|
|
48
|
+
|
|
49
|
+
因为业务背景已经固定,
|
|
50
|
+
所以后续智能体在工作时,不应该反复回到“大方向还没定”的状态。
|
|
51
|
+
|
|
52
|
+
例如,不需要再频繁追问:
|
|
53
|
+
- 这是 Scratch 课吗?
|
|
54
|
+
- 这是 HTML 入门课吗?
|
|
55
|
+
- 这是兴趣课吗?
|
|
56
|
+
- 核心目标是 JS 事件、创意设计还是 Debug?
|
|
57
|
+
- 是不是要把很多效果全上?
|
|
58
|
+
|
|
59
|
+
这些问题在这个 skill 里,不是每次都重新讨论的前提。
|
|
60
|
+
|
|
61
|
+
默认前提已经成立:
|
|
62
|
+
我们就是在为 **AI 智能体项目课** 生产课程模板。
|
|
63
|
+
|
|
64
|
+
## pipeline 在这个背景下要做什么
|
|
65
|
+
|
|
66
|
+
这条流水线的工作,不是先讨论“课是什么”,
|
|
67
|
+
而是把一个具体项目题目逐步收成可用模板。
|
|
68
|
+
|
|
69
|
+
也就是:
|
|
70
|
+
1. 先做 demo,让任务方向可见
|
|
71
|
+
2. 再整理 student 侧,让学生知道怎么开始做
|
|
72
|
+
3. 再整理 teacher 侧,让老师知道训练重点和卡点
|
|
73
|
+
4. 最后把内容落成页面和模板资产
|
|
74
|
+
|
|
75
|
+
## 一句话总结
|
|
76
|
+
|
|
77
|
+
这个 skill 服务的是:
|
|
78
|
+
**AI 智能体项目课的课程模板生产。**
|
|
79
|
+
|
|
80
|
+
它强调的是:
|
|
81
|
+
**先动手,再思考;先产出,再改进;在反复微调中获得能力。**
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"WebSearch",
|
|
5
|
-
"Bash(python3 -c \"import json,sys; d=json.load\\(sys.stdin\\); agents=d.get\\('agents',{}\\).get\\('list',[]\\); [print\\(a.get\\('id'\\), '|', a.get\\('workspace',''\\)\\) for a in agents if a]\")",
|
|
6
|
-
"Bash(node *)",
|
|
7
|
-
"Bash(curl -s \"https://cdn.bootcdn.net/ajax/libs/qrcodejs/1.0.0/qrcode.min.js\" -o /Users/yiran/.openclaw/workspace-yiranclaw/myclaw/assets/qrcode.min.js)",
|
|
8
|
-
"Bash(python3 *)",
|
|
9
|
-
"Bash(crontab -l)",
|
|
10
|
-
"Bash(launchctl list *)",
|
|
11
|
-
"Bash(claude config *)",
|
|
12
|
-
"Bash(defaults read *)",
|
|
13
|
-
"Bash(chmod +x *)",
|
|
14
|
-
"Bash(/usr/local/bin/claude config *)",
|
|
15
|
-
"Bash(claude --version)",
|
|
16
|
-
"Bash(mc --version)",
|
|
17
|
-
"Bash(mc server *)",
|
|
18
|
-
"Bash(kill %1)",
|
|
19
|
-
"Bash(wait)",
|
|
20
|
-
"Bash(CLAW_NAME=yiran timeout 6 python3 server/sync_workspace.py)",
|
|
21
|
-
"Bash(curl -s http://127.0.0.1:18800/api/artifacts?workspace=workspace)",
|
|
22
|
-
"Bash(curl *)",
|
|
23
|
-
"Bash(find /Users/yiran/.openclaw/workspace/ -not -path '*/.git/*' -not -path '*/.myclaw/*' -not -path '*/node_modules/*' -not -path '*/__pycache__/*' -type f -exec du -ch {} +)",
|
|
24
|
-
"Bash(find *)",
|
|
25
|
-
"Bash(mc tui *)",
|
|
26
|
-
"Bash(mc --help)",
|
|
27
|
-
"Bash(openclaw --help)",
|
|
28
|
-
"Bash(openclaw agents *)",
|
|
29
|
-
"Read(//Users/yiran/.openclaw/workspace-yiranclaw/**)",
|
|
30
|
-
"Read(//Users/yiran/.openclaw/agents/yiranclaw/**)",
|
|
31
|
-
"Read(//Users/yiran/.openclaw/agents/yiranclaw/agent/**)",
|
|
32
|
-
"Bash(openclaw tui *)",
|
|
33
|
-
"Bash(echo \"exit: $?\")",
|
|
34
|
-
"Bash(ls *)",
|
|
35
|
-
"Bash(mc list-agents *)",
|
|
36
|
-
"Bash(mc patch *)",
|
|
37
|
-
"Bash(mc restart *)",
|
|
38
|
-
"Bash(ps *)",
|
|
39
|
-
"Bash(time /Library/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python *)",
|
|
40
|
-
"Bash(/Library/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python *)",
|
|
41
|
-
"Bash(pkill -f \"prepare_playgrounds.py\")",
|
|
42
|
-
"Bash(pkill -f \"run_playgrounds_flow.py\")",
|
|
43
|
-
"Bash(pkill -f \"deploy_to_workspace.py\")",
|
|
44
|
-
"Bash(pkill -f \"prepare_playgrounds.py\" pkill -f \"run_playgrounds_flow.py\" pkill -f \"mc new playgrounds\" sleep 1 ps aux)",
|
|
45
|
-
"Bash(mc new *)",
|
|
46
|
-
"Bash(echo \"exit code: $?\")",
|
|
47
|
-
"Bash(grep -r \"api/history/file\\\\|api/history\" /Users/yiran/.openclaw/workspace-yiranclaw/myclaw --include=\"*.js\" --include=\"*.py\" 2>/dev/null | head -20)",
|
|
48
|
-
"Bash(cp -r ~/.openclaw/skills/yiran-playground-template-use /Users/yiran/.openclaw/workspace-yiranclaw/myclaw/skills/ && cp -r ~/.openclaw/skills/yiran-course-template-pipeline /Users/yiran/.openclaw/workspace-yiranclaw/myclaw/skills/ && ls /Users/yiran/.openclaw/workspace-yiranclaw/myclaw/skills/)"
|
|
49
|
-
]
|
|
50
|
-
}
|
|
51
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# AGENTS.md - danci
|
|
2
|
-
|
|
3
|
-
This workspace belongs to the `danci` agent.
|
|
4
|
-
|
|
5
|
-
## Startup
|
|
6
|
-
- Read `SOUL.md`
|
|
7
|
-
- Read `USER.md`
|
|
8
|
-
- Read recent memory if available
|
|
9
|
-
|
|
10
|
-
## Rules
|
|
11
|
-
- Be helpful, careful, and concise.
|
|
12
|
-
- Prefer using the existing workspace and defaults.
|
|
13
|
-
- Ask before destructive or external actions.
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# TOOLS.md - Local Notes
|
|
2
|
-
|
|
3
|
-
Skills define _how_ tools work. This file is for _your_ specifics — the stuff that's unique to your setup.
|
|
4
|
-
|
|
5
|
-
## What Goes Here
|
|
6
|
-
|
|
7
|
-
Things like:
|
|
8
|
-
|
|
9
|
-
- Camera names and locations
|
|
10
|
-
- SSH hosts and aliases
|
|
11
|
-
- Preferred voices for TTS
|
|
12
|
-
- Speaker/room names
|
|
13
|
-
- Device nicknames
|
|
14
|
-
- Anything environment-specific
|
|
15
|
-
|
|
16
|
-
## Examples
|
|
17
|
-
|
|
18
|
-
```markdown
|
|
19
|
-
### Cameras
|
|
20
|
-
|
|
21
|
-
- living-room → Main area, 180° wide angle
|
|
22
|
-
- front-door → Entrance, motion-triggered
|
|
23
|
-
|
|
24
|
-
### SSH
|
|
25
|
-
|
|
26
|
-
- home-server → 192.168.1.100, user: admin
|
|
27
|
-
|
|
28
|
-
### TTS
|
|
29
|
-
|
|
30
|
-
- Preferred voice: "Nova" (warm, slightly British)
|
|
31
|
-
- Default speaker: Kitchen HomePod
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Why Separate?
|
|
35
|
-
|
|
36
|
-
Skills are shared. Your setup is yours. Keeping them apart means you can update skills without losing your notes, and share skills without leaking your infrastructure.
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
Add whatever helps you do your job. This is your cheat sheet.
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
# 英语单词学习记录
|
|
2
|
-
## 日期:2026年4月1日
|
|
3
|
-
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
## 学习目标
|
|
7
|
-
- 20个英语单词
|
|
8
|
-
- 对象:初中生
|
|
9
|
-
- 要求:记得快、记得好
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## 单词列表
|
|
14
|
-
|
|
15
|
-
### 1. espionage [ɪˈspaɪənɪdʒ]
|
|
16
|
-
- 词性:名词
|
|
17
|
-
- 含义:间谍活动
|
|
18
|
-
- 例句:The government has several agents involved in espionage.
|
|
19
|
-
(政府有好几个特工参与间谍活动。)
|
|
20
|
-
|
|
21
|
-
### 2. mission [ˈmɪʃn]
|
|
22
|
-
- 词性:名词
|
|
23
|
-
- 含义:任务
|
|
24
|
-
- 例句:The mission brief was sent to your computer.
|
|
25
|
-
(任务简报已经发到你的电脑里了。)
|
|
26
|
-
|
|
27
|
-
### 3. brief [briːf]
|
|
28
|
-
- 词性:名词/形容词
|
|
29
|
-
- 含义:简报(n.)/ 简短的(adj.)
|
|
30
|
-
- 例句:The mission brief was sent to your computer.
|
|
31
|
-
(任务简报已经发到你的电脑里了。)
|
|
32
|
-
|
|
33
|
-
### 4. agent [ˈeɪdʒənt]
|
|
34
|
-
- 词性:名词
|
|
35
|
-
- 含义:特工、代理人
|
|
36
|
-
- 例句:The secret agent went into the building alone.
|
|
37
|
-
(那名秘密特工独自走进了那栋大楼。)
|
|
38
|
-
- 简化例句:He is an undercover cop.(他是一名卧底警察。)
|
|
39
|
-
|
|
40
|
-
### 5. undercover [ˌʌndəˈkʌvə(r)]
|
|
41
|
-
- 词性:形容词
|
|
42
|
-
- 含义:卧底的、秘密执行的
|
|
43
|
-
- 例句:He is an undercover cop.(他是一名卧底警察。)
|
|
44
|
-
- 记忆技巧:under(在…下面)+ cover(覆盖)= 在覆盖之下 = 卧底的
|
|
45
|
-
|
|
46
|
-
### 6. surveillance [səˈveɪləns]
|
|
47
|
-
- 词性:名词
|
|
48
|
-
- 含义:监视、监控
|
|
49
|
-
- 例句:The police kept the building under surveillance.
|
|
50
|
-
(警察对那栋大楼进行了监视。)
|
|
51
|
-
- 记忆技巧:谐音"司马在外"(Sima Fu)= 司马孚在外面监视 = surveillance
|
|
52
|
-
|
|
53
|
-
### 7. gadget [ˈɡædʒɪt]
|
|
54
|
-
- 词性:名词
|
|
55
|
-
- 含义:小玩意儿、小装置
|
|
56
|
-
- 例句:The spy used a cool gadget to open the door.
|
|
57
|
-
(特工用一个酷炫的小装置打开了门。)
|
|
58
|
-
- 词源:19世纪英国水手的俚语,用来称呼各种不知道叫什么的小零件
|
|
59
|
-
|
|
60
|
-
### 8. intel [ˈɪntl]
|
|
61
|
-
- 词性:名词
|
|
62
|
-
- 含义:情报(intelligence的缩写)
|
|
63
|
-
- 例句:The agent got some important intel.
|
|
64
|
-
(特工收到了一条重要情报。)
|
|
65
|
-
- 记忆技巧:in + tel(telephone)= 从电话里得到的情报
|
|
66
|
-
|
|
67
|
-
### 9. extraction [ɪkˈstrækʃn]
|
|
68
|
-
- 词性:名词
|
|
69
|
-
- 含义:撤离、营救
|
|
70
|
-
- 例句:The team made a quick extraction.(小队快速撤离。)
|
|
71
|
-
- 记忆技巧:ex(出来)+ tract(拉)= 拉出来 = 撤离
|
|
72
|
-
- 5个例句:
|
|
73
|
-
1. The rescue team did a fast extraction.
|
|
74
|
-
2. The spy was in trouble, so they ordered an extraction.
|
|
75
|
-
3. The extraction point is near the old building.
|
|
76
|
-
4. He finished the extraction mission successfully.
|
|
77
|
-
5. The helicopter came for the extraction.
|
|
78
|
-
|
|
79
|
-
### 10. code [kəʊd]
|
|
80
|
-
- 词性:名词
|
|
81
|
-
- 含义:密码、代码
|
|
82
|
-
- 例句:The spy used a secret code to send messages.
|
|
83
|
-
(特工用密码发送信息。)
|
|
84
|
-
- 5个例句:
|
|
85
|
-
1. Don't tell anyone the secret code.
|
|
86
|
-
2. The password is a four-digit code.
|
|
87
|
-
3. He broke the code and saved the day.
|
|
88
|
-
4. What is the secret code?
|
|
89
|
-
5. She sent a message in code.
|
|
90
|
-
|
|
91
|
-
### 11. cipher [ˈsaɪfə(r)]
|
|
92
|
-
- 词性:名词
|
|
93
|
-
- 含义:密码、密文(更专业的加密术语)
|
|
94
|
-
- 例句:Can you read this cipher?(你能读懂这个密码吗?)
|
|
95
|
-
- 与code的区别:code是把整个词换成另一个词,cipher是把每个字母换成另一个字母
|
|
96
|
-
- 5个例句:
|
|
97
|
-
1. This text looks like a cipher.
|
|
98
|
-
2. She wrote the message in cipher.
|
|
99
|
-
3. He tried to solve the cipher.
|
|
100
|
-
4. The cipher was very hard to break.
|
|
101
|
-
5. Can you read this cipher?
|
|
102
|
-
|
|
103
|
-
### 12. double agent
|
|
104
|
-
- 词性:名词短语
|
|
105
|
-
- 含义:双面间谍
|
|
106
|
-
- 例句:He is a double agent, working for both sides.
|
|
107
|
-
(他是双面间谍,同时为两边工作。)
|
|
108
|
-
|
|
109
|
-
### 13. coming of age
|
|
110
|
-
- 词性:短语/习语
|
|
111
|
-
- 含义:长大成人、成年
|
|
112
|
-
- 例句:The movie is about a boy's coming of age.
|
|
113
|
-
(这部电影是关于一个男孩的成长故事。)
|
|
114
|
-
- 说明:coming of age = 来到成年,最早是法律术语,后延伸指心理成熟
|
|
115
|
-
- 5个例句:
|
|
116
|
-
1. His coming of age was very difficult.
|
|
117
|
-
2. The book is about coming of age.
|
|
118
|
-
3. She had a coming of age experience.
|
|
119
|
-
4. Coming of age is an important time in life.
|
|
120
|
-
5. This book is a story about a young man's coming of age in a small town.
|
|
121
|
-
|
|
122
|
-
### 14. adolescence [ˌædəˈlesns]
|
|
123
|
-
- 词性:名词
|
|
124
|
-
- 含义:青春期
|
|
125
|
-
- 例句:Many changes happen during adolescence.
|
|
126
|
-
(青春期会发生很多变化。)
|
|
127
|
-
- 5个例句:
|
|
128
|
-
1. He spent his adolescence in Paris.
|
|
129
|
-
2. Adolescence is a time of big changes.
|
|
130
|
-
3. Many teenagers feel confused during adolescence.
|
|
131
|
-
4. She wrote a diary during her adolescence.
|
|
132
|
-
5. Adolescence usually starts around age 12.
|
|
133
|
-
|
|
134
|
-
### 15. identity [aɪˈdentəti]
|
|
135
|
-
- 词性:名词
|
|
136
|
-
- 含义:身份
|
|
137
|
-
- 例句:He hid his true identity.(他隐藏了自己的真实身份。)
|
|
138
|
-
- 注意:identity和Identity是同一个词,只是大小写不同(首字母大写只是因为出现在句首)
|
|
139
|
-
|
|
140
|
-
### 16. independence [ˌɪndɪˈpendəns]
|
|
141
|
-
- 词性:名词
|
|
142
|
-
- 含义:独立、自立
|
|
143
|
-
- 例句:The country got its independence in 1949.
|
|
144
|
-
(这个国家在1949年获得了独立。)
|
|
145
|
-
- 记忆技巧:in(不)+ depend(依赖)+ ence = 不依赖别人 = 独立
|
|
146
|
-
|
|
147
|
-
### 17. peer pressure
|
|
148
|
-
- 词性:名词短语
|
|
149
|
-
- 含义:同伴压力
|
|
150
|
-
- 例句:He started smoking because of peer pressure.
|
|
151
|
-
(他因为同伴压力开始抽烟。)
|
|
152
|
-
- 记忆技巧:peer(同龄人)+ pressure(压力)= 来自同龄人的压力
|
|
153
|
-
- 5个例句:
|
|
154
|
-
1. She didn't want to cheat, but peer pressure was too strong.
|
|
155
|
-
2. Peer pressure can make you do bad things.
|
|
156
|
-
3. He resisted peer pressure and said no.
|
|
157
|
-
4. Teens often face peer pressure at school.
|
|
158
|
-
5. Good friends won't give you bad peer pressure.
|
|
159
|
-
|
|
160
|
-
### 18. belonging [bɪˈlɒŋɪŋ]
|
|
161
|
-
- 词性:名词
|
|
162
|
-
- 含义:归属感、归属
|
|
163
|
-
- 例句:She felt a sense of belonging in her new school.
|
|
164
|
-
(她在新学校找到了归属感。)
|
|
165
|
-
|
|
166
|
-
### 19. self-discovery
|
|
167
|
-
- 词性:名词
|
|
168
|
-
- 含义:自我发现、认识自我
|
|
169
|
-
- 例句:Her trip to Tibet was a journey of self-discovery.
|
|
170
|
-
(她去西藏的旅行是一次自我发现的旅程。)
|
|
171
|
-
- 记忆技巧:self(自己)+ discovery(发现)= 发现你自己
|
|
172
|
-
|
|
173
|
-
### 20. relationships
|
|
174
|
-
- 词性:名词
|
|
175
|
-
- 含义:人际关系、关系
|
|
176
|
-
- 例句:Teenagers often have problems with peer relationships.
|
|
177
|
-
(青少年经常在人际关系方面有问题。)
|
|
178
|
-
|
|
179
|
-
### 21. internal conflict
|
|
180
|
-
- 词性:名词短语
|
|
181
|
-
- 含义:内心矛盾、内心冲突
|
|
182
|
-
- 例句:He had an internal conflict about telling the truth.
|
|
183
|
-
(他内心很矛盾,不知道该不该说实话。)
|
|
184
|
-
- 记忆技巧:internal(内心的)+ conflict(冲突)= 内心冲突
|
|
185
|
-
|
|
186
|
-
### 22. personal growth
|
|
187
|
-
- 词性:名词短语
|
|
188
|
-
- 含义:个人成长
|
|
189
|
-
- 例句:Reading books helps with personal growth.
|
|
190
|
-
(阅读有助于个人成长。)
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
## 故事串联
|
|
195
|
-
所有间谍主题词汇串联:
|
|
196
|
-
|
|
197
|
-
**The Mission(任务)**
|
|
198
|
-
|
|
199
|
-
A secret **agent** got a **mission brief** on his computer.
|
|
200
|
-
|
|
201
|
-
The **brief** said: go **undercover** and do some **espionage**.
|
|
202
|
-
|
|
203
|
-
But the bad guys had the whole building under **surveillance**!
|
|
204
|
-
|
|
205
|
-
He used a cool **gadget** to get inside...
|
|
206
|
-
|
|
207
|
-
---
|
|
208
|
-
|
|
209
|
-
## 初中生相关词汇整理
|
|
210
|
-
|
|
211
|
-
### 青春期主题词汇:
|
|
212
|
-
- adolescence 青春期
|
|
213
|
-
- coming of age 长大成人
|
|
214
|
-
- identity 身份
|
|
215
|
-
- independence 独立
|
|
216
|
-
- peer pressure 同伴压力
|
|
217
|
-
- belonging 归属感
|
|
218
|
-
- self-discovery 自我发现
|
|
219
|
-
- relationships 人际关系
|
|
220
|
-
- internal conflict 内心矛盾
|
|
221
|
-
- personal growth 个人成长
|
|
222
|
-
|
|
223
|
-
---
|
|
224
|
-
|
|
225
|
-
备注:学习者是初中生,英语水平一般。采用联想记忆、谐音记忆、词源解释等多种方法帮助记忆。
|