@aiyiran/myclaw 1.1.80 → 1.1.81

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiyiran/myclaw",
3
- "version": "1.1.80",
3
+ "version": "1.1.81",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -25,8 +25,15 @@
25
25
  .sample-frame-wrap { background: #f8faff; border: 1px solid #e7eefc; border-radius: 20px; padding: 14px; min-width: 0; }
26
26
  .sample-frame-head { display: flex; justify-content: flex-start; align-items: center; gap: 10px; margin-bottom: 12px; }
27
27
  .sample-frame-head h3 { margin: 0; color: #334d98; font-size: 17px; }
28
+ .tips-block { margin-top: 16px; background: #fff; border-radius: 24px; padding: 22px; box-shadow: 0 10px 28px rgba(100,122,166,.12); }
29
+ .tips-block h3 { margin: 0 0 14px; color: #334d98; font-size: 18px; }
30
+ .tips-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }
31
+ .tip-item { background: #f8faff; border: 1px solid #e7eefc; border-radius: 16px; padding: 14px; }
32
+ .tip-title { font-size: 14px; font-weight: 700; color: #334d98; margin-bottom: 8px; }
33
+ .tip-desc { font-size: 13px; color: #60708b; line-height: 1.7; margin-bottom: 8px; }
34
+ .tip-prompt { font-size: 12px; color: #4f5f7c; line-height: 1.8; background: #fff; border: 1px dashed #d6e2ff; border-radius: 12px; padding: 10px 12px; }
28
35
  iframe { width: 100%; height: 560px; border: 1px solid #dfe7fb; border-radius: 16px; background: #fff; display: block; }
29
- @media (max-width: 960px) { .page { padding: 14px 12px 32px; } .header-bar { padding: 16px 18px; } .header-left h1 { font-size: 22px; } .header-left .subtitle { font-size: 12px; } .content-layout { grid-template-columns: 1fr; } .task-panel, .goal-panel, .sample-frame-wrap { padding: 14px; } iframe { height: 360px; } }
36
+ @media (max-width: 960px) { .page { padding: 14px 12px 32px; } .header-bar { padding: 16px 18px; } .header-left h1 { font-size: 22px; } .header-left .subtitle { font-size: 12px; } .content-layout { grid-template-columns: 1fr; } .task-panel, .goal-panel, .sample-frame-wrap, .tips-block { padding: 14px; } .tips-list { grid-template-columns: 1fr; } iframe { height: 360px; } }
30
37
  </style>
31
38
  </head>
32
39
  <body>
@@ -58,6 +65,12 @@
58
65
  </div>
59
66
  </div>
60
67
  </section>
68
+ <section class="tips-block">
69
+ <h3>小提示</h3>
70
+ <div class="tips-list">
71
+ {{小提示区域}}
72
+ </div>
73
+ </section>
61
74
  </div>
62
75
  </div>
63
76
  </body>
@@ -3,8 +3,6 @@
3
3
  用途:
4
4
  在题目灵感已经比较清楚、或者 demo 方向已经大致确定时,先把学生侧任务结构定下来。
5
5
 
6
- 业务背景统一参考:`业务背景.md`
7
-
8
6
  注意:
9
7
  **这个阶段不要求一定已经有 __teacher__.json。**
10
8
  **这个阶段甚至不要求一定已经有完整作品。**
@@ -78,41 +76,6 @@
78
76
  - 每一步都包含:
79
77
  - 标题
80
78
  - 说明
81
- - 默认优先从学生动作出发来写步骤,例如:先试一试、先看一看、先改一点、再加一个
82
- - 但不要把动作顺序写死,不同任务按实际内容调整
83
- - 文案要短,读完就能做,优先使用孩子能直接执行的动作词
84
- - 少写抽象提问,少写老师视角的分析话术
85
-
86
- 补充判断规则:
87
- - 步骤标题要像“要去做的事”,不要像“要去理解的概念”
88
- - 说明句尽量一句话说清,避免解释过长
89
- - 默认优先写“小改动”,再写“自主新增”;不要一上来就要求学生从零设计完整新内容
90
- - 如果一句步骤说明读完以后,学生还不知道手上下一步该做什么,这句就还不够好
91
-
92
- 常见不推荐写法:
93
- - 想一想,它影响了什么
94
- - 分析这个功能作用于哪里
95
- - 理解页面结构变化逻辑
96
- - 总结这个页面的设计特点
97
-
98
- 这些问题常见的坏处是:
99
- - 太抽象
100
- - 不贴近孩子动作
101
- - 有时和页面真实任务也不完全对应
102
-
103
- 因此 student 步骤里优先写这些动作词:
104
- - 点
105
- - 看
106
- - 挑
107
- - 改
108
- - 加
109
-
110
- 尽量少写这些老师视角词:
111
- - 分析
112
- - 理解
113
- - 总结
114
- - 归纳
115
- - 识别
116
79
 
117
80
  ### 4)评价目标
118
81
  也是本阶段核心。
@@ -130,7 +93,7 @@
130
93
  控制 iframe 加载哪个页面文件。
131
94
  默认可写:
132
95
  ```json
133
- "示例页面文件": "__demo__.html"
96
+ "示例页面文件": "example.html"
134
97
  ```
135
98
 
136
99
  ---
@@ -73,14 +73,23 @@
73
73
  注意:ABC 不是按难度分,而是按任务在学习过程中的作用分。
74
74
 
75
75
  ### 2)任务编号
76
- 用于编号和自动命名。
76
+ 这个字段用于已存在模板的编号和自动命名。
77
77
 
78
- 要求:
79
- - 固定三位字符串
78
+ 要求调整为:
79
+ - **如果当前是在新增一个全新模板,默认不填写任务编号,保留空字符串即可**
80
+ - **只有在修改、补全、续改一个已经存在的模板时,才填写已有任务编号**
81
+ - 已有编号时,使用固定三位字符串
80
82
  - 范围固定为 `100 ~ 999`
81
- - 每个类别单独编号,并且按顺序往后排
82
- - A 类从 `100` 开始,B 类从 `100` 开始,C 类也从 `100` 开始
83
- - 同一类别新增模板时,按 `100、101、102 ...` 这样继续往后加
83
+
84
+ 也就是说:
85
+ - 新增模板:
86
+ ```json
87
+ "任务编号": ""
88
+ ```
89
+ - 修改已有模板时,才可能是:
90
+ ```json
91
+ "任务编号": "203"
92
+ ```
84
93
 
85
94
  ### 3)任务名称
86
95
  任务显示名称,应和 __student__.json 的任务标题保持一致或高度一致。
@@ -132,3 +141,4 @@
132
141
  - 不补充 markdown 说明
133
142
  - 不输出 HTML
134
143
  - 字段名称必须保持中文
144
+ - 如果是新增模板,`任务编号` 默认留空,不要擅自补编号
@@ -39,6 +39,11 @@
39
39
  - 也就是说:A 类从 `a100` 开始,B 类从 `b100` 开始,C 类从 `c100` 开始
40
40
  - 同一类别新增模板时,按 `100、101、102 ...` 这样继续往后加
41
41
 
42
+ 补充约定:
43
+ - 上面这套命名规则用于**已经正式入库、已经分配编号**的模板
44
+ - 如果当前还在新增模板阶段,还没有正式分配编号,那么 `__teacher__.json` 里的 `任务编号` 可以先留空
45
+ - 只有在修改、补全、续改一个已有模板时,才直接沿用原编号
46
+
42
47
  ---
43
48
 
44
49
  ## 三、任务类别(ABC)
@@ -234,7 +239,8 @@ __teacher__.json 中有两组固定标签:
234
239
  只能填写:`A`、`B`、`C`
235
240
 
236
241
  ### 2)任务编号
237
- - 使用三位数字字符串
242
+ - 如果是新增模板,默认留空字符串:`""`
243
+ - 如果是修改已有模板,填写原有三位编号字符串
238
244
  - 范围固定为:`100 ~ 999`
239
245
  - 例如:`100`、`203`、`305`
240
246
 
@@ -6,7 +6,7 @@ import sys
6
6
  from pathlib import Path
7
7
 
8
8
  REQUIRED_BASE_FILES = ['__demo__.html', '__student__.json', '__teacher__.json']
9
- REQUIRED_STUDENT_KEYS = ['任务标题', '一句话说明', '步骤', '评价目标', '示例区标题', '示例页面文件']
9
+ REQUIRED_STUDENT_KEYS = ['任务标题', '一句话说明', '步骤', '评价目标', '示例区标题', '示例页面文件', '小提示']
10
10
  REQUIRED_TEACHER_KEYS = ['任务类别', '任务编号', '任务名称', '主能力标签', '任务类型标签', '适合学生类型', '训练重点', '卡点和解决方案', '可拓展方向', '课后作业']
11
11
  ROOT = Path(__file__).resolve().parent
12
12
 
@@ -23,6 +23,13 @@ def render_goals(goals):
23
23
  return ''.join(blocks)
24
24
 
25
25
 
26
+ def render_tips(tips):
27
+ blocks = []
28
+ for item in tips:
29
+ blocks.append(f'''<div class="tip-item"><div class="tip-title">{esc(item.get('标题', '小提示'))}</div><div class="tip-desc">{esc(item.get('说明', ''))}</div><div class="tip-prompt">参考提示词:{esc(item.get('参考提示词', ''))}</div></div>''')
30
+ return ''.join(blocks)
31
+
32
+
26
33
  def main():
27
34
  if len(sys.argv) < 2:
28
35
  print('用法: python3 render_student_page.py <__student__.json> [输出html] [模板html]')
@@ -42,6 +49,7 @@ def main():
42
49
  .replace('{{评价目标区域}}', render_goals(data.get('评价目标', [])))
43
50
  .replace('{{示例区标题}}', esc(data.get('示例区标题', '示范样例')))
44
51
  .replace('{{示例页面文件}}', esc(data.get('示例页面文件', 'example.html')))
52
+ .replace('{{小提示区域}}', render_tips(data.get('小提示', [])))
45
53
  )
46
54
 
47
55
  output_path.write_text(rendered, encoding='utf-8')
@@ -1,5 +1,5 @@
1
1
  {
2
- "index_updated_at": "2026-04-23T09:17:55Z",
2
+ "index_updated_at": "2026-04-24T06:55:01Z",
3
3
  "templates": {
4
4
  "696de592": {
5
5
  "id": "696de592",
@@ -167,9 +167,9 @@
167
167
  "编号": "106",
168
168
  "名称": "火箭拦截:发现规则 & 提出改进",
169
169
  "文件夹名": "a106_火箭拦截:发现规则_&_提出改进",
170
- "version": "v1",
171
- "路径": "templates/a106_火箭拦截:发现规则_&_提出改进/v1",
172
- "入口文件": "templates/a106_火箭拦截:发现规则_&_提出改进/v1/index.html",
170
+ "version": "v3",
171
+ "路径": "templates/a106_火箭拦截:发现规则_&_提出改进/v3",
172
+ "入口文件": "templates/a106_火箭拦截:发现规则_&_提出改进/v3/index.html",
173
173
  "一句话说明": "先玩10秒找到游戏规则,再提出一个改进点,最后验证改进有没有用。",
174
174
  "主能力标签": "第三能力:问题判断",
175
175
  "任务类型标签": "游戏机制",
@@ -185,7 +185,7 @@
185
185
  "第三能力:问题判断",
186
186
  "游戏机制"
187
187
  ],
188
- "updated_at": "2026-04-23T09:17:54Z"
188
+ "updated_at": "2026-04-24T06:54:59Z"
189
189
  },
190
190
  "c360e192": {
191
191
  "id": "c360e192",
@@ -241,6 +241,33 @@
241
241
  ],
242
242
  "updated_at": "2026-04-22T16:52:16Z"
243
243
  },
244
+ "a49b70ab": {
245
+ "id": "a49b70ab",
246
+ "系列": "B",
247
+ "编号": "102",
248
+ "名称": "做一个故事绘本小程序",
249
+ "文件夹名": "b102_做一个故事绘本小程序",
250
+ "version": "v4",
251
+ "路径": "templates/b102_做一个故事绘本小程序/v4",
252
+ "入口文件": "templates/b102_做一个故事绘本小程序/v4/index.html",
253
+ "一句话说明": "先写一个很小的故事开头,再看图续写下一步,最后把这些内容收成一个连贯的网页绘本。",
254
+ "主能力标签": "第四能力:迭代推进",
255
+ "任务类型标签": "视听表达",
256
+ "关键词": [
257
+ "b102_做一个故事绘本小程序",
258
+ "先写一个很小的故事开头,再看图续写下一步,最后把这些内容收成一个连贯的网页绘本。",
259
+ "已经能写一句提示词,但还不太会把故事往下推进的学生",
260
+ "更适合先做一点、再根据结果继续往下写的学生",
261
+ "从很小的故事开头起步,先把第一步做出来",
262
+ "根据上一张图的结果继续写下一步提示词",
263
+ "用小循环方式推动故事,而不是一开始就写完整大故事",
264
+ "在故事基本完成后,把多张图和多段内容整理成连贯的网页绘本",
265
+ "做一个故事绘本小程序",
266
+ "第四能力:迭代推进",
267
+ "视听表达"
268
+ ],
269
+ "updated_at": "2026-04-24T06:50:36Z"
270
+ },
244
271
  "6490af0a": {
245
272
  "id": "6490af0a",
246
273
  "系列": "C",
@@ -58,9 +58,9 @@
58
58
 
59
59
  ## A106 火箭拦截:发现规则 & 提出改进
60
60
  - ID:ad24a76c
61
- - 版本:v1
62
- - 路径:templates/a106_火箭拦截:发现规则_&_提出改进/v1
63
- - 入口文件:templates/a106_火箭拦截:发现规则_&_提出改进/v1/index.html
61
+ - 版本:v3
62
+ - 路径:templates/a106_火箭拦截:发现规则_&_提出改进/v3
63
+ - 入口文件:templates/a106_火箭拦截:发现规则_&_提出改进/v3/index.html
64
64
  - 主能力标签:第三能力:问题判断
65
65
  - 任务类型标签:游戏机制
66
66
  - 关键词:a106_火箭拦截:发现规则_&_提出改进, 先玩10秒找到游戏规则,再提出一个改进点,最后验证改进有没有用。, 初次接触游戏设计的学生, 会玩游戏但没分析过游戏规则的学生, 通过10秒时间盒,训练学生快速聚焦核心规则, 用「前10秒」作为判断标准,培养学生自我感受的游戏评价能力, 三关结构:发现→提出→验证,形成完整的「判断-改进-验证」闭环, 火箭拦截:发现规则 & 提出改进, 第三能力:问题判断, 游戏机制
@@ -83,6 +83,15 @@
83
83
  - 任务类型标签:视听表达
84
84
  - 关键词:b101_会跳舞的机器人, 先把机器人视频放到网页上,再配上音乐,最后调一调播放效果,让机器人更像在跳舞。, 已经能开始动手,但还不太会把多种素材组织到一起的学生, 会做简单网页,但还不太会处理视频、音乐和动画配合的学生, 想从静态页面进入多媒体网页表达的学生, 把机器人视频放进网页中, 让视频和音乐形成基本配合, 尝试处理循环播放和播放节奏, 让网页从静态展示变成更有动态感的作品, 会跳舞的机器人, 表达构建, 视听表达
85
85
 
86
+ ## B102 做一个故事绘本小程序
87
+ - ID:a49b70ab
88
+ - 版本:v4
89
+ - 路径:templates/b102_做一个故事绘本小程序/v4
90
+ - 入口文件:templates/b102_做一个故事绘本小程序/v4/index.html
91
+ - 主能力标签:第四能力:迭代推进
92
+ - 任务类型标签:视听表达
93
+ - 关键词:b102_做一个故事绘本小程序, 先写一个很小的故事开头,再看图续写下一步,最后把这些内容收成一个连贯的网页绘本。, 已经能写一句提示词,但还不太会把故事往下推进的学生, 更适合先做一点、再根据结果继续往下写的学生, 从很小的故事开头起步,先把第一步做出来, 根据上一张图的结果继续写下一步提示词, 用小循环方式推动故事,而不是一开始就写完整大故事, 在故事基本完成后,把多张图和多段内容整理成连贯的网页绘本, 做一个故事绘本小程序, 第四能力:迭代推进, 视听表达
94
+
86
95
  ## C100 给小组作品做一次小修改
87
96
  - ID:6490af0a
88
97
  - 版本:v2