@aiyiran/myclaw 1.1.24 → 1.1.26

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.
Files changed (83) hide show
  1. package/.claude/settings.local.json +25 -1
  2. package/assets/myclaw-artifacts.js +1070 -126
  3. package/assets/myclaw-inject.js +913 -121
  4. package/delete_agents.js +268 -0
  5. package/index.js +361 -20
  6. package/package.json +1 -1
  7. package/patches/patch-manifest.json +10 -0
  8. package/server/sync_workspace.py +444 -14
  9. package/skills/yiran-course-template-pipeline/README.md +127 -0
  10. package/skills/yiran-course-template-pipeline/SKILL.md +65 -0
  11. package/skills/yiran-course-template-pipeline/assets/a100-teacher.example.html +66 -0
  12. package/skills/yiran-course-template-pipeline/assets/student-template.html +64 -0
  13. package/skills/yiran-course-template-pipeline/assets/teacher-portrait-demo.html +105 -0
  14. package/skills/yiran-course-template-pipeline/assets/teacher-task-view.html +110 -0
  15. package/skills/yiran-course-template-pipeline/prompts//351/230/266/346/256/2651-demo/347/224/237/346/210/220.md +92 -0
  16. package/skills/yiran-course-template-pipeline/prompts//351/230/266/346/256/2652-student/347/224/237/346/210/220.md +115 -0
  17. package/skills/yiran-course-template-pipeline/prompts//351/230/266/346/256/2653-teacher/347/224/237/346/210/220.md +131 -0
  18. 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 +77 -0
  19. package/skills/yiran-course-template-pipeline/references/student-example.json +38 -0
  20. package/skills/yiran-course-template-pipeline/references/student-fields.md +195 -0
  21. package/skills/yiran-course-template-pipeline/references/student-scaffold.json +34 -0
  22. package/skills/yiran-course-template-pipeline/references/teacher-fields.md +265 -0
  23. package/skills/yiran-course-template-pipeline/references/teacher-scaffold.json +25 -0
  24. package/skills/yiran-course-template-pipeline/scripts/build_template_views.py +125 -0
  25. package/skills/yiran-course-template-pipeline/scripts/move_template_task.py +59 -0
  26. package/skills/yiran-course-template-pipeline/scripts/render_student_page.py +52 -0
  27. package/skills/yiran-course-template-pipeline/scripts/render_teacher_view.py +108 -0
  28. package/skills/yiran-playground-template-use/SKILL.md +105 -0
  29. package/skills/yiran-playground-template-use/prompts/remix-handoff.txt +11 -0
  30. package/skills/yiran-playground-template-use/scripts/build_template_index.py +103 -0
  31. package/skills/yiran-playground-template-use/scripts/deploy_template.py +34 -0
  32. package/skills/yiran-playground-template-use/scripts/deploy_to_workspace.py +211 -0
  33. package/skills/yiran-playground-template-use/scripts/prepare_playgrounds.py +39 -0
  34. package/skills/yiran-playground-template-use/scripts/query_template.py +171 -0
  35. package/skills/yiran-playground-template-use/scripts/run_playgrounds_flow.py +44 -0
  36. package/skills/yiran-playground-template-use/scripts/start_tui_handoff.py +77 -0
  37. package/skills/yiran-playground-template-use/search-agent-prompt.md +39 -0
  38. package/skills/yiran-playground-template-use/template-index.json +136 -0
  39. package/skills/yiran-playground-template-use/template-index.md +38 -0
  40. 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 +140 -0
  41. 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 +64 -0
  42. 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 +38 -0
  43. 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 +52 -0
  44. 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 +36 -0
  45. 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 +61 -0
  46. 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 +131 -0
  47. 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 +64 -0
  48. 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 +34 -0
  49. 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 +52 -0
  50. 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 +34 -0
  51. 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 +77 -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/__student-view__.html +64 -0
  53. 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 +38 -0
  54. 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 +52 -0
  55. 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 +34 -0
  56. 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 +162 -0
  57. 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 +64 -0
  58. 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 +34 -0
  59. 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 +52 -0
  60. 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 +34 -0
  61. 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 +180 -0
  62. 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 +64 -0
  63. 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 +38 -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/__teacher-view__.html +52 -0
  65. 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 +41 -0
  66. 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 +180 -0
  67. 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 +121 -0
  68. 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
  69. 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
  70. 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
  71. package/skills/yiran-skill-media/SKILL.md +6 -15
  72. package/skills/yiran-skill-media/scripts/generate.py +47 -18
  73. package/skills/yiran-skill-media/scripts/generation_log.json +1 -56
  74. package/skills/yiran-skill-media/scripts/providers/__pycache__/__init__.cpython-311.pyc +0 -0
  75. package/skills/yiran-skill-media/scripts/providers/__pycache__/__init__.cpython-37.pyc +0 -0
  76. package/skills/yiran-skill-media/scripts/providers/__pycache__/jimeng_image.cpython-37.pyc +0 -0
  77. package/skills/yiran-skill-media/scripts/providers/__pycache__/jimeng_video.cpython-311.pyc +0 -0
  78. package/skills/yiran-skill-media/scripts/providers/__pycache__/jimeng_video.cpython-37.pyc +0 -0
  79. package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_image.cpython-37.pyc +0 -0
  80. package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_music.cpython-37.pyc +0 -0
  81. package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_video.cpython-311.pyc +0 -0
  82. package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_video.cpython-37.pyc +0 -0
  83. package/skills/yiran-skill-media/scripts/providers/__pycache__/vapi_image.cpython-37.pyc +0 -0
@@ -0,0 +1,65 @@
1
+ ---
2
+ name: yiran-course-template-pipeline
3
+ description: 面向中文课堂的小专题课程模板流水线。适用于把一个题目灵感或设计角度,先生成 demo 页面,再先后整理成 __student__.json 和 __teacher__.json,最后通过脚本生成页面、整理目录、沉淀模板资产并构建模板索引。
4
+ ---
5
+
6
+ # 课程模板流水线
7
+
8
+ 这个 skill 支持的是一条完整工作流,而不是单点产出。
9
+
10
+ ## 四阶段流程
11
+
12
+ ### 1)灵感 -> demo 页面
13
+ 当用户先给出题目灵感、设计角度或课堂切入点时,优先生成 demo 页面。
14
+
15
+ 这一阶段优先使用:
16
+ - `prompts/阶段1-demo生成.md`
17
+
18
+ ### 2)生成 __student__.json
19
+ 这个阶段最重要的目标是:
20
+ 先把学生任务的步骤和评价结构 JSON 确立下来。
21
+
22
+ 这一阶段优先使用:
23
+ - `prompts/阶段2-student生成.md`
24
+ - `references/student-fields.md`
25
+ - `references/student-example.json`
26
+ - `references/student-scaffold.json`
27
+
28
+ ### 3)生成 __teacher__.json
29
+ 在 __student__.json 已经明确后,再整理教师侧信息。
30
+
31
+ 这一阶段优先使用:
32
+ - `prompts/阶段3-teacher生成.md`
33
+ - `references/teacher-fields.md`
34
+ - `references/teacher-scaffold.json`
35
+
36
+ ### 阶段一到三的工作目录规则
37
+ 阶段一到阶段三产出的文件,统一放在:
38
+ **当前工作目录下新建的 `任务名称/` 文件夹里。**
39
+
40
+ 也就是说,这几个中间产物先写在当前工作目录的任务文件夹内:
41
+ - `__demo__.html`
42
+ - `__student__.json`
43
+ - `__teacher__.json`
44
+
45
+ ### 4)JSON -> HTML,并按目录打包
46
+ 第4阶段拆成两个独立脚本:
47
+ - `scripts/build_template_views.py`
48
+ - `scripts/move_template_task.py`
49
+
50
+ 其中:
51
+ - build 负责在原目录生成 `__student-view__.html`、`__teacher-view__.html` 和 `index.html`
52
+ - `index.html` 采用固定脚本规则:左边展示“评价目标”,右边展示“步骤”,不显示任务标题和一句话说明
53
+ - move 负责把任务文件夹移动到 `yiran-playground-template-use` skill 的 `templates/`,并自动触发索引重建
54
+
55
+ ## 原则
56
+
57
+ - 先做 demo
58
+ - 再定 __student__.json
59
+ - 再定 __teacher__.json
60
+ - 阶段一到三先在当前工作目录的任务文件夹里完成
61
+ - demo 中的媒体资源优先使用 CDN 链接,不使用本地相对路径;当前固定前缀为 `https://cdn.yiranlaoshi.com/yiran/workspace-ai-demo`,后面拼接资源相对路径
62
+ - 第4阶段拆成 build 和 move 两个独立脚本
63
+ - templates 作为 skill 的资产目录统一维护
64
+ - 模板有变化后,要重新构建索引
65
+ - 全部内容优先中文
@@ -0,0 +1,66 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>A100 · 给依然老师设计一个AI画像</title>
7
+ <style>
8
+ * { box-sizing: border-box; }
9
+ body { margin: 0; font-family: "PingFang SC", "Microsoft YaHei", sans-serif; background: #f4f7fb; color: #24324a; }
10
+ .page { max-width: 1200px; margin: 0 auto; padding: 20px; }
11
+ .hero { background: linear-gradient(135deg,#5f82ff 0%,#8c74ff 100%); color: #fff; border-radius: 24px; padding: 22px 24px; box-shadow: 0 16px 36px rgba(92,108,192,.22); }
12
+ .hero h1 { margin: 0; font-size: 28px; }
13
+ .hero p { margin: 8px 0 0; opacity: .92; font-size: 14px; }
14
+ .view { margin-top: 18px; display: grid; gap: 16px; }
15
+ .top { display: grid; grid-template-columns: 1.1fr .9fr; gap: 16px; }
16
+ .card { background: #fff; border: 1px solid #e7eefc; border-radius: 20px; padding: 18px; box-shadow: 0 10px 24px rgba(100,122,166,.08); }
17
+ .card h2 { margin: 0 0 12px; font-size: 18px; color: #314a96; }
18
+ .meta-grid { display: grid; grid-template-columns: repeat(2,1fr); gap: 10px; }
19
+ .meta-item { background: #f8faff; border: 1px solid #e7eefc; border-radius: 14px; padding: 12px; }
20
+ .meta-item .label { font-size: 12px; color: #7a89ad; margin-bottom: 6px; }
21
+ .meta-item .value { font-size: 14px; color: #24324a; font-weight: 700; }
22
+ .tags { display: flex; flex-wrap: wrap; gap: 8px; }
23
+ .tag { display: inline-flex; align-items: center; padding: 7px 12px; border-radius: 999px; background: #edf2ff; color: #4c65c3; font-size: 13px; font-weight: 700; }
24
+ .section-grid { display: grid; grid-template-columns: repeat(2,1fr); gap: 16px; }
25
+ .list { display: grid; gap: 10px; }
26
+ .list-item { background: #f8faff; border: 1px solid #e7eefc; border-radius: 14px; padding: 12px; line-height: 1.7; font-size: 14px; color: #60708b; }
27
+ .issue { border-left: 4px solid #8c74ff; background: #faf8ff; }
28
+ .issue strong { color: #314a96; display: block; margin: 6px 0; }
29
+ @media (max-width: 900px) { .top, .section-grid, .meta-grid { grid-template-columns: 1fr; } }
30
+ </style>
31
+ </head>
32
+ <body>
33
+ <div class="page">
34
+ <section class="hero">
35
+ <h1>A100 · 给依然老师设计一个AI画像</h1>
36
+ <p>这是根据教师 JSON 自动生成的可视化查看页,方便老师快速扫读与判断。</p>
37
+ </section>
38
+
39
+ <section class="view">
40
+ <div class="top">
41
+ <div class="card">
42
+ <h2>基础信息</h2>
43
+ <div class="meta-grid">
44
+ <div class="meta-item"><div class="label">主能力标签</div><div class="value">表达构建</div></div>
45
+ <div class="meta-item"><div class="label">任务类型标签</div><div class="value">视听表达</div></div>
46
+ </div>
47
+ </div>
48
+ <div class="card">
49
+ <h2>适合学生类型</h2>
50
+ <div class="tags"><span class="tag">初次接触</span><span class="tag">需要明确目标</span><span class="tag">持续迭代</span></div>
51
+ </div>
52
+ </div>
53
+
54
+ <div class="section-grid">
55
+ <div class="card"><h2>训练重点</h2><div class="list"><div class="list-item">围绕明确对象生成形象</div><div class="list-item">把人物图片放进网页中完成展示</div><div class="list-item">通过小幅修改让作品逐步变好</div></div></div>
56
+ <div class="card"><h2>可拓展方向</h2><div class="list"><div class="list-item">给画像加背景音乐</div><div class="list-item">加入点击切换不同版本画像</div><div class="list-item">给人物加一句语音介绍</div></div></div>
57
+ </div>
58
+
59
+ <div class="section-grid">
60
+ <div class="card"><h2>卡点和解决方案</h2><div class="list"><div class="list-item issue"><strong>卡点</strong>学生不知道要画谁,描述很泛<strong>解决方案</strong>先让学生说清楚对象是谁,再从发型、衣服、表情这些具体点开始描述</div><div class="list-item issue"><strong>卡点</strong>学生一次改太多,看不出变化<strong>解决方案</strong>提醒学生每次只改一个地方,比如先改头发,再改表情</div></div></div>
61
+ <div class="card"><h2>课后作业</h2><div class="list"><div class="list-item">回家把老师画像再优化一版,至少改一个地方,并说明你改了什么</div><div class="list-item">给网页再加入一张新版本图片,展示前后变化</div></div></div>
62
+ </div>
63
+ </section>
64
+ </div>
65
+ </body>
66
+ </html>
@@ -0,0 +1,64 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>{{任务标题}}</title>
7
+ <style>
8
+ * { box-sizing: border-box; }
9
+ body { margin: 0; font-family: "PingFang SC", "Microsoft YaHei", sans-serif; background: #f4f7fb; color: #24324a; }
10
+ .page { max-width: 1440px; margin: 0 auto; padding: 20px 20px 48px; }
11
+ .header-bar { background: linear-gradient(135deg,#5f82ff 0%,#8c74ff 100%); border-radius: 24px; padding: 20px 24px; box-shadow: 0 16px 36px rgba(92,108,192,.24); }
12
+ .header-left h1 { margin: 0; font-size: 26px; line-height: 1.3; color: #fff; font-weight: 800; }
13
+ .header-left .subtitle { margin: 8px 0 0; font-size: 13px; line-height: 1.8; color: rgba(255,255,255,.88); }
14
+ .main-section { margin-top: 18px; }
15
+ .block { background: #fff; border-radius: 24px; padding: 22px; box-shadow: 0 10px 28px rgba(100,122,166,.12); }
16
+ .content-layout { display: grid; grid-template-columns: 220px minmax(0,1fr) 220px; gap: 14px; align-items: stretch; }
17
+ .task-panel, .goal-panel { background: #f8faff; border: 1px solid #e7eefc; border-radius: 20px; padding: 16px; display: flex; flex-direction: column; gap: 14px; }
18
+ .panel-group h3 { margin: 0 0 10px; color: #334d98; font-size: 17px; }
19
+ .task-item { margin-bottom: 10px; }
20
+ .task-item:last-child { margin-bottom: 0; }
21
+ .item-top { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; font-size: 12px; font-weight: 600; color: #7a89ad; }
22
+ .item-body { background: #fff; border: 1px solid #e7eefc; border-radius: 12px; padding: 10px 12px; font-size: 13px; color: #60708b; line-height: 1.7; }
23
+ .task-item .num { min-width: 22px; height: 22px; padding: 0 7px; border-radius: 999px; background: #edf2ff; color: #7a89ad; font-size: 10px; font-weight: 700; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; }
24
+ .star-item .num { background: #fff7dc; color: #b89a4f; }
25
+ .sample-frame-wrap { background: #f8faff; border: 1px solid #e7eefc; border-radius: 20px; padding: 14px; min-width: 0; }
26
+ .sample-frame-head { display: flex; justify-content: flex-start; align-items: center; gap: 10px; margin-bottom: 12px; }
27
+ .sample-frame-head h3 { margin: 0; color: #334d98; font-size: 17px; }
28
+ 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; } }
30
+ </style>
31
+ </head>
32
+ <body>
33
+ <div class="page">
34
+ <header class="header-bar">
35
+ <div class="header-left">
36
+ <h1>{{任务标题}}</h1>
37
+ <p class="subtitle">{{一句话说明}}</p>
38
+ </div>
39
+ </header>
40
+ <div class="main-section">
41
+ <section class="block">
42
+ <div class="content-layout">
43
+ <div class="task-panel">
44
+ <div class="panel-group">
45
+ <h3>步骤</h3>
46
+ {{步骤区域}}
47
+ </div>
48
+ </div>
49
+ <div class="sample-frame-wrap">
50
+ <div class="sample-frame-head"><h3>{{示例区标题}}</h3></div>
51
+ <iframe src="{{示例页面文件}}" title="{{示例区标题}}"></iframe>
52
+ </div>
53
+ <div class="goal-panel">
54
+ <div class="panel-group">
55
+ <h3>评价目标</h3>
56
+ {{评价目标区域}}
57
+ </div>
58
+ </div>
59
+ </div>
60
+ </section>
61
+ </div>
62
+ </div>
63
+ </body>
64
+ </html>
@@ -0,0 +1,105 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>小专题模板 Demo</title>
7
+ <style>
8
+ * { box-sizing: border-box; }
9
+ body { margin: 0; font-family: "PingFang SC", "Microsoft YaHei", sans-serif; background: #f4f7fb; color: #24324a; }
10
+ .page { max-width: 1440px; margin: 0 auto; padding: 20px 20px 48px; }
11
+ .header-bar { background: linear-gradient(135deg, #5f82ff 0%, #8c74ff 100%); border-radius: 24px; padding: 20px 24px; box-shadow: 0 16px 36px rgba(92, 108, 192, 0.24); }
12
+ .header-left h1 { margin: 0; font-size: 26px; line-height: 1.3; color: #fff; font-weight: 800; }
13
+ .header-left .subtitle { margin: 8px 0 0; font-size: 13px; line-height: 1.8; color: rgba(255,255,255,0.88); }
14
+ .main-section { margin-top: 18px; display: grid; gap: 18px; }
15
+ .block, .teacher-section { background: #fff; border-radius: 24px; padding: 22px; box-shadow: 0 10px 28px rgba(100, 122, 166, 0.12); }
16
+ .content-layout { display: grid; grid-template-columns: 220px minmax(0, 1fr) 220px; gap: 14px; align-items: stretch; }
17
+ .task-panel, .goal-panel { background: #f8faff; border: 1px solid #e7eefc; border-radius: 20px; padding: 16px; display: flex; flex-direction: column; gap: 14px; }
18
+ .panel-group h3 { margin: 0 0 10px; color: #334d98; font-size: 17px; }
19
+ .task-item { margin-bottom: 10px; }
20
+ .task-item:last-child { margin-bottom: 0; }
21
+ .item-top { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; font-size: 12px; font-weight: 600; color: #7a89ad; }
22
+ .item-body { background: #fff; border: 1px solid #e7eefc; border-radius: 12px; padding: 10px 12px; font-size: 13px; color: #60708b; line-height: 1.7; }
23
+ .task-item .num { min-width: 22px; height: 22px; padding: 0 7px; border-radius: 999px; background: #edf2ff; color: #7a89ad; font-size: 10px; font-weight: 700; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; }
24
+ .star-item .num { background: #fff7dc; color: #b89a4f; }
25
+ .sample-frame-wrap { background: #f8faff; border: 1px solid #e7eefc; border-radius: 20px; padding: 14px; min-width: 0; }
26
+ .sample-frame-head { display: flex; justify-content: flex-start; align-items: center; gap: 10px; margin-bottom: 12px; }
27
+ .sample-frame-head h3 { margin: 0; color: #334d98; font-size: 17px; }
28
+ iframe { width: 100%; height: 560px; border: 1px solid #dfe7fb; border-radius: 16px; background: #fff; display: block; }
29
+ .block-title { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
30
+ .block-title h2 { margin: 0; font-size: 24px; color: #2d438c; }
31
+ .badge { padding: 4px 10px; border-radius: 999px; font-size: 12px; font-weight: 800; }
32
+ .badge-teacher { background: #f1edff; color: #7156c8; }
33
+ .teacher-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; }
34
+ .teacher-card { background: #f8faff; border: 1px solid #e7eefc; border-radius: 18px; padding: 16px; }
35
+ .teacher-card h3 { margin: 0 0 8px; color: #334d98; font-size: 16px; }
36
+ .teacher-card p, .teacher-card li { margin: 0; color: #60708b; line-height: 1.85; font-size: 13px; }
37
+ .teacher-card ul { padding-left: 18px; margin: 0; }
38
+ .teacher-note { margin-top: 14px; background: #f6f8ff; border: 1px dashed #cfdcff; border-radius: 18px; padding: 14px 16px; }
39
+ .teacher-note h3 { margin: 0 0 7px; color: #334d98; font-size: 16px; }
40
+ .teacher-note p { margin: 0; color: #60708b; line-height: 1.85; font-size: 13px; }
41
+ .footer-note { margin-top: 12px; text-align: center; font-size: 13px; color: #7a879f; }
42
+ @media (max-width: 960px) {
43
+ .page { padding: 14px 12px 32px; }
44
+ .header-bar { padding: 16px 18px; }
45
+ .header-left h1 { font-size: 22px; }
46
+ .header-left .subtitle { font-size: 12px; white-space: normal; }
47
+ .content-layout, .teacher-grid { grid-template-columns: 1fr; }
48
+ .task-panel, .goal-panel, .sample-frame-wrap, .teacher-section { padding: 14px; }
49
+ iframe { height: 360px; }
50
+ }
51
+ </style>
52
+ </head>
53
+ <body>
54
+ <div class="page">
55
+ <header class="header-bar">
56
+ <div class="header-left">
57
+ <h1>【任务标题】</h1>
58
+ <p class="subtitle">【一句话任务说明:先做什么,再放到网页里,重点练什么】</p>
59
+ </div>
60
+ </header>
61
+
62
+ <div class="main-section">
63
+ <section class="block">
64
+ <div class="content-layout">
65
+ <div class="task-panel">
66
+ <div class="panel-group">
67
+ <h3>步骤</h3>
68
+ <div class="task-item"><div class="item-top"><span class="num">1</span><span>【步骤短标题】</span></div><div class="item-body">【学生真正要读的简短说明】</div></div>
69
+ <div class="task-item"><div class="item-top"><span class="num">2</span><span>【步骤短标题】</span></div><div class="item-body">【学生真正要读的简短说明】</div></div>
70
+ <div class="task-item"><div class="item-top"><span class="num">3</span><span>【步骤短标题】</span></div><div class="item-body">【学生真正要读的简短说明】</div></div>
71
+ <div class="task-item"><div class="item-top"><span class="num">4</span><span>【步骤短标题】</span></div><div class="item-body">【学生真正要读的简短说明】</div></div>
72
+ </div>
73
+ </div>
74
+
75
+ <div class="sample-frame-wrap">
76
+ <div class="sample-frame-head"><h3>示范样例</h3></div>
77
+ <iframe src="./example.html" title="示范样例"></iframe>
78
+ </div>
79
+
80
+ <div class="goal-panel">
81
+ <div class="panel-group">
82
+ <h3>评价目标</h3>
83
+ <div class="task-item star-item"><div class="item-top"><span class="num">★</span><span>一星</span></div><div class="item-body">【完成最基础的一步】</div></div>
84
+ <div class="task-item star-item"><div class="item-top"><span class="num">★★</span><span>二星</span></div><div class="item-body">【比基础要求再多完成一点】</div></div>
85
+ <div class="task-item star-item"><div class="item-top"><span class="num">★★★</span><span>三星</span></div><div class="item-body">【完成进阶挑战,展示更多变化】</div></div>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ </section>
90
+ </div>
91
+
92
+ <section class="teacher-section">
93
+ <div class="block-title"><h2>下半区:给老师看</h2><span class="badge badge-teacher">教师区</span></div>
94
+ <div class="teacher-grid">
95
+ <div class="teacher-card"><h3>为什么这样设计</h3><p>上半区直接给学生使用,文字短,结构清楚,中间样例突出。</p></div>
96
+ <div class="teacher-card"><h3>模板使用原则</h3><p>只把学生真正需要阅读的内容放到白卡片里,编号和星级放在卡片外面,做出主次关系。</p></div>
97
+ <div class="teacher-card"><h3>上半区写法</h3><p>步骤和评价目标都要短句化,面向小学生,避免长句和抽象词。</p></div>
98
+ <div class="teacher-card"><h3>示例区原则</h3><p>中间 iframe 永远是视觉中心,具体项目案例放在 example.html 或外部链接里。</p></div>
99
+ </div>
100
+ <div class="teacher-note"><h3>模板提示</h3><p>后续换专题时,优先替换任务标题、一句话说明、步骤、评价目标和 iframe 地址,不要先改结构。</p></div>
101
+ <div class="footer-note">这个文件已经同步了新的上半区结构,可作为后续模板继续复用。</div>
102
+ </section>
103
+ </div>
104
+ </body>
105
+ </html>
@@ -0,0 +1,110 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>教师任务查看页</title>
7
+ <style>
8
+ * { box-sizing: border-box; }
9
+ body { margin: 0; font-family: "PingFang SC", "Microsoft YaHei", sans-serif; background: #f4f7fb; color: #24324a; }
10
+ .page { max-width: 1200px; margin: 0 auto; padding: 20px; }
11
+ .hero { background: linear-gradient(135deg,#5f82ff 0%,#8c74ff 100%); color: #fff; border-radius: 24px; padding: 22px 24px; box-shadow: 0 16px 36px rgba(92,108,192,.22); }
12
+ .hero h1 { margin: 0; font-size: 28px; }
13
+ .hero p { margin: 8px 0 0; opacity: .92; font-size: 14px; }
14
+ .toolbar { margin-top: 16px; display: grid; gap: 12px; }
15
+ textarea { width: 100%; min-height: 240px; border: 1px solid #d9e2fb; border-radius: 16px; padding: 14px; font-size: 13px; line-height: 1.7; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; background: #fff; color: #24324a; }
16
+ button { width: fit-content; border: none; border-radius: 999px; background: #5f82ff; color: #fff; padding: 10px 18px; font-size: 14px; font-weight: 700; cursor: pointer; }
17
+ .view { margin-top: 18px; display: grid; gap: 16px; }
18
+ .top { display: grid; grid-template-columns: 1.1fr .9fr; gap: 16px; }
19
+ .card { background: #fff; border: 1px solid #e7eefc; border-radius: 20px; padding: 18px; box-shadow: 0 10px 24px rgba(100,122,166,.08); }
20
+ .card h2 { margin: 0 0 12px; font-size: 18px; color: #314a96; }
21
+ .meta-grid { display: grid; grid-template-columns: repeat(2,1fr); gap: 10px; }
22
+ .meta-item { background: #f8faff; border: 1px solid #e7eefc; border-radius: 14px; padding: 12px; }
23
+ .meta-item .label { font-size: 12px; color: #7a89ad; margin-bottom: 6px; }
24
+ .meta-item .value { font-size: 14px; color: #24324a; font-weight: 700; }
25
+ .tags { display: flex; flex-wrap: wrap; gap: 8px; }
26
+ .tag { display: inline-flex; align-items: center; padding: 7px 12px; border-radius: 999px; background: #edf2ff; color: #4c65c3; font-size: 13px; font-weight: 700; }
27
+ .section-grid { display: grid; grid-template-columns: repeat(2,1fr); gap: 16px; }
28
+ .list { display: grid; gap: 10px; }
29
+ .list-item { background: #f8faff; border: 1px solid #e7eefc; border-radius: 14px; padding: 12px; line-height: 1.7; font-size: 14px; color: #60708b; }
30
+ .issue { border-left: 4px solid #8c74ff; background: #faf8ff; }
31
+ .issue strong { color: #314a96; display: block; margin-bottom: 6px; }
32
+ @media (max-width: 900px) {
33
+ .top, .section-grid, .meta-grid { grid-template-columns: 1fr; }
34
+ }
35
+ </style>
36
+ </head>
37
+ <body>
38
+ <div class="page">
39
+ <section class="hero">
40
+ <h1>教师任务查看页</h1>
41
+ <p>把结构化 JSON 粘贴进来,就能渲染成给老师快速扫读的可视化页面。</p>
42
+ </section>
43
+
44
+ <section class="toolbar">
45
+ <textarea id="jsonInput">{
46
+ "任务类别": "A",
47
+ "任务编号": "100",
48
+ "任务名称": "给依然老师设计一个AI画像",
49
+ "主能力标签": "表达构建",
50
+ "任务类型标签": "视听表达",
51
+ "适合学生类型": ["初次接触", "需要明确目标", "持续迭代"],
52
+ "训练重点": ["围绕明确对象生成形象", "把人物图片放进网页中完成展示", "通过小幅修改让作品逐步变好"],
53
+ "卡点和解决方案": [
54
+ {"卡点": "学生不知道要画谁,描述很泛", "解决方案": "先说清楚对象是谁,再从发型、衣服、表情这些具体点开始描述"},
55
+ {"卡点": "学生一次改太多,看不出变化", "解决方案": "提醒学生每次只改一个地方,比如先改头发,再改表情"}
56
+ ],
57
+ "可拓展方向": ["给画像加背景音乐", "加入点击切换不同版本画像", "给人物加一句语音介绍"],
58
+ "课后作业": ["回家把老师画像再优化一版,至少改一个地方,并说明你改了什么", "给网页再加入一张新版本图片,展示前后变化"]
59
+ }</textarea>
60
+ <button onclick="renderView()">渲染教师页</button>
61
+ </section>
62
+
63
+ <section class="view" id="view"></section>
64
+ </div>
65
+
66
+ <script>
67
+ function renderList(arr = []) {
68
+ return `<div class="list">${arr.map(item => `<div class="list-item">${item}</div>`).join('')}</div>`;
69
+ }
70
+ function renderIssues(arr = []) {
71
+ return `<div class="list">${arr.map(item => `<div class="list-item issue"><strong>卡点</strong>${item.卡点 || ''}<strong>解决方案</strong>${item.解决方案 || ''}</div>`).join('')}</div>`;
72
+ }
73
+ function renderTags(arr = []) {
74
+ return `<div class="tags">${arr.map(item => `<span class="tag">${item}</span>`).join('')}</div>`;
75
+ }
76
+ function renderView() {
77
+ const view = document.getElementById('view');
78
+ try {
79
+ const data = JSON.parse(document.getElementById('jsonInput').value);
80
+ view.innerHTML = `
81
+ <div class="top">
82
+ <div class="card">
83
+ <h2>${data.任务类别 || ''}${data.任务编号 || ''} · ${data.任务名称 || ''}</h2>
84
+ <div class="meta-grid">
85
+ <div class="meta-item"><div class="label">主能力标签</div><div class="value">${data.主能力标签 || '—'}</div></div>
86
+ <div class="meta-item"><div class="label">任务类型标签</div><div class="value">${data.任务类型标签 || '—'}</div></div>
87
+ </div>
88
+ </div>
89
+ <div class="card">
90
+ <h2>适合学生类型</h2>
91
+ ${renderTags(data.适合学生类型 || [])}
92
+ </div>
93
+ </div>
94
+ <div class="section-grid">
95
+ <div class="card"><h2>训练重点</h2>${renderList(data.训练重点 || [])}</div>
96
+ <div class="card"><h2>可拓展方向</h2>${renderList(data.可拓展方向 || [])}</div>
97
+ </div>
98
+ <div class="section-grid">
99
+ <div class="card"><h2>卡点和解决方案</h2>${renderIssues(data['卡点和解决方案'] || [])}</div>
100
+ <div class="card"><h2>课后作业</h2>${renderList(data.课后作业 || [])}</div>
101
+ </div>
102
+ `;
103
+ } catch (err) {
104
+ view.innerHTML = `<div class="card"><h2>JSON 解析失败</h2><div class="list-item">${err.message}</div></div>`;
105
+ }
106
+ }
107
+ renderView();
108
+ </script>
109
+ </body>
110
+ </html>
@@ -0,0 +1,92 @@
1
+ # demo 生成提示词
2
+
3
+ 用途:
4
+ 把一个题目灵感、设计角度或课堂切入点,先变成一个适合演示的 demo 页面。
5
+
6
+ ## 目标
7
+
8
+ 你现在不是在先整理 JSON。
9
+ 你要做的是:
10
+ **先把灵感做成一个看得见的 __demo__.html 页面。**
11
+
12
+ ## 为什么先做 demo
13
+
14
+ 因为 demo 是后续流程的起点:
15
+ - demo 出来后,学生页内容更容易整理
16
+ - demo 出来后,教师 JSON 也更容易提炼
17
+ - demo 能帮助快速判断这个题目有没有意思、能不能继续发展
18
+
19
+ ## 输出要求
20
+
21
+ 生成的 demo 页面要满足:
22
+ - 适合演示
23
+ - 页面不要太复杂
24
+ - 一眼能看出这个任务大概是什么
25
+ - 能作为后续 __student__.json 和 __teacher__.json 的上游参考
26
+
27
+ ## 写 demo 时要注意
28
+
29
+ ### 1)先突出核心效果
30
+ 不要一开始把所有功能都做满。
31
+ 先做出最能说明这个题目价值的那一个效果。
32
+
33
+ ### 2)适合课堂抛砖引玉
34
+ 这个 demo 不一定是完整作品,
35
+ 但它必须足够清楚,能让人一眼看懂方向。
36
+
37
+ ### 3)优先做“能看见”的页面
38
+ 优先让页面可看、可点、可感受,
39
+ 而不是先写很多结构化说明。
40
+
41
+ ### 4)为后续 JSON 留出空间
42
+ 做 demo 时,心里要有这些问题:
43
+ - 这个任务学生到底要做什么?
44
+ - 步骤会是什么?
45
+ - 评价目标会是什么?
46
+ - 老师侧会怎么看这个任务?
47
+
48
+ ## 如果 demo 是多图对比练习页,要遵守这些规则
49
+
50
+ ### 页面结构
51
+ - 首屏基本看完
52
+ - 尽量一屏展示核心内容
53
+ - 如果是三张图对比,必须三栏横排同时展示
54
+
55
+ ### 每一栏的结构
56
+ - 上面放图片
57
+ - 下面放观察和思考提示
58
+ - 不直接写改进建议
59
+ - 不直接告诉学生答案
60
+
61
+ ### 文字控制
62
+ - demo 页面优先短句
63
+ - 顶部说明必须很短
64
+ - 每张图下面只放 2 到 3 个短问题
65
+ - 不要长段落
66
+ - 不要把老师说明塞进学生首屏
67
+
68
+ ### 目标
69
+ - 让学生一打开就能同时看到几张图
70
+ - 能马上开始比较
71
+ - 能先发现一个问题
72
+ - 能想一个最小修改点
73
+
74
+ ### 资源命名方式
75
+ - demo 中使用的图片、音频等资源文件名,不要只用简单固定名
76
+ - 统一使用:`中文学生友好名_2位数字随机戳`
77
+ - 例如:`班级小组徽章_47.png`
78
+ - 这样可以减少浏览器缓存带来的旧图问题
79
+
80
+ ### 资源路径方式
81
+ - demo 网页中的所有媒体资源,不要使用本地相对路径
82
+ - 必须使用 CDN 链接
83
+ - CDN 固定前缀写死为:`https://cdn.yiranlaoshi.com/yiran/workspace-ai-demo`
84
+ - 后面再拼接资源相对路径
85
+ - 例如:`https://cdn.yiranlaoshi.com/yiran/workspace-ai-demo/c102_给小组作品做微调训练/班级小组徽章_47.png`
86
+
87
+ ## demo 生成后的下一步
88
+
89
+ 生成 demo 页面后,不要立刻结束。
90
+ 下一步要继续:
91
+ 1. 从 demo 中提炼 __student__.json
92
+ 2. 再提炼 __teacher__.json
@@ -0,0 +1,115 @@
1
+ # 阶段2:生成 __student__.json
2
+
3
+ 用途:
4
+ 在题目灵感已经比较清楚、或者 demo 方向已经大致确定时,先把学生侧任务结构定下来。
5
+
6
+ 注意:
7
+ **这个阶段不要求一定已经有 __teacher__.json。**
8
+ **这个阶段甚至不要求一定已经有完整作品。**
9
+
10
+ 这个阶段最重要的目标只有一个:
11
+ **先把学生任务的步骤和评价结构 JSON 确立下来。**
12
+
13
+ ---
14
+
15
+ ## 本阶段输出对象
16
+
17
+ 必须输出:`__student__.json`
18
+
19
+ 结构如下:
20
+
21
+ ```json
22
+ {
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
+ 不是去做能力标签。
48
+ 不是去解释教学意义。
49
+
50
+ 而是先确定:
51
+ - 学生要做什么
52
+ - 这个任务怎么拆成步骤
53
+ - 评价目标怎么分一星、二星、三星
54
+ - 学生页中间示例区叫什么、加载什么文件
55
+
56
+ ---
57
+
58
+ ## 字段逐项对应
59
+
60
+ ### 1)任务标题
61
+ 学生页最上方的大标题。
62
+ 必须短、清楚、一眼看懂。
63
+
64
+ ### 2)一句话说明
65
+ 用一句话告诉学生:
66
+ - 先做什么
67
+ - 再做什么
68
+ - 重点练什么
69
+
70
+ ### 3)步骤
71
+ 这是本阶段最重要的部分。
72
+ 先把学生完成任务的路径定下来。
73
+
74
+ 要求:
75
+ - 一般 3 到 4 步
76
+ - 每一步都包含:
77
+ - 标题
78
+ - 说明
79
+
80
+ ### 4)评价目标
81
+ 也是本阶段核心。
82
+ 告诉学生做到什么程度算完成、做到更好是什么样。
83
+
84
+ 要求:
85
+ - 默认固定三档:一星、二星、三星
86
+ - 每一档都要有一句清楚说明
87
+
88
+ ### 5)示例区标题
89
+ 控制学生页中间示例区标题。
90
+ 默认可写“示范样例”。
91
+
92
+ ### 6)示例页面文件
93
+ 控制 iframe 加载哪个页面文件。
94
+ 默认可写:
95
+ ```json
96
+ "示例页面文件": "example.html"
97
+ ```
98
+
99
+ ---
100
+
101
+ ## 原则
102
+
103
+ 1. 全部使用中文
104
+ 2. 只写学生真正需要读的内容
105
+ 3. 不把老师看的信息混进来
106
+ 4. 标题要短
107
+ 5. 一句话说明只保留一句
108
+ 6. 步骤比解释更重要
109
+ 7. 评价目标必须清楚可执行
110
+
111
+ ---
112
+
113
+ ## 结果要求
114
+
115
+ 输出的 __student__.json 应该可以直接喂给学生页模板,不需要再大改。