@aiyiran/myclaw 1.1.26 → 1.1.33

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 (109) hide show
  1. package/assets/myclaw-artifacts.js +51 -15
  2. package/package.json +1 -1
  3. package/skills/yiran-course-template-pipeline/README.md +5 -0
  4. package/skills/yiran-course-template-pipeline/SKILL.md +8 -4
  5. package/skills/yiran-course-template-pipeline/cdn-convention.md +77 -0
  6. package/skills/yiran-course-template-pipeline/prompts//350/257/204/344/273/267/347/202/271/345/255/220.md +107 -0
  7. package/skills/yiran-course-template-pipeline/prompts//351/230/266/346/256/2651-demo/347/224/237/346/210/220.md +36 -0
  8. package/skills/yiran-course-template-pipeline/prompts//351/230/266/346/256/2652-student/347/224/237/346/210/220.md +2 -0
  9. package/skills/yiran-course-template-pipeline/prompts//351/230/266/346/256/2653-teacher/347/224/237/346/210/220.md +2 -0
  10. 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
  11. package/skills/yiran-course-template-pipeline/scripts/build_template_index.py +103 -0
  12. package/skills/yiran-course-template-pipeline/scripts/move_template_task.py +2 -3
  13. package/skills/yiran-course-template-pipeline/scripts/publish_template.py +193 -0
  14. package/skills/yiran-course-template-pipeline//344/270/232/345/212/241/350/203/214/346/231/257.md +81 -0
  15. package/.claude/settings.local.json +0 -51
  16. package/agent-list/workspace-danci/AGENTS.md +0 -13
  17. package/agent-list/workspace-danci/BOOTSTRAP.md +0 -5
  18. package/agent-list/workspace-danci/HEARTBEAT.md +0 -3
  19. package/agent-list/workspace-danci/IDENTITY.md +0 -5
  20. package/agent-list/workspace-danci/SOUL.md +0 -6
  21. package/agent-list/workspace-danci/TOOLS.md +0 -40
  22. package/agent-list/workspace-danci/USER.md +0 -7
  23. package/agent-list/workspace-danci/memory/birthday.md +0 -9
  24. package/agent-list/workspace-danci/memory/english-words-20260401.md +0 -225
  25. package/agent-list/workspace-fashe1/.openclaw/workspace-state.json +0 -4
  26. package/agent-list/workspace-fashe1/AGENTS.md +0 -212
  27. package/agent-list/workspace-fashe1/BOOTSTRAP.md +0 -55
  28. package/agent-list/workspace-fashe1/HEARTBEAT.md +0 -7
  29. package/agent-list/workspace-fashe1/IDENTITY.md +0 -23
  30. package/agent-list/workspace-fashe1/MEMORY.md +0 -5
  31. package/agent-list/workspace-fashe1/SOUL.md +0 -110
  32. package/agent-list/workspace-fashe1/TOOLS.md +0 -40
  33. package/agent-list/workspace-fashe1/USER.md +0 -17
  34. package/agent-list/workspace-fashe1/chaos-button/bg_music.mp3 +0 -0
  35. package/agent-list/workspace-fashe1/chaos-button/index.html +0 -1371
  36. package/agent-list/workspace-fashe1/chaos-button/tmpsz_k5dxa.png +0 -0
  37. 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
  38. package/agent-list/workspace-fashe1/memory/2026-04-16.md +0 -5
  39. 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
  40. package/agent-list/workspace-fashe1//345/217/257/347/210/261/346/234/272/347/224/262.png +0 -0
  41. package/agent-list/workspace-fashe1//346/220/236/347/254/221/345/260/217/346/234/213/345/217/213.png +0 -0
  42. 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
  43. package/agent-list/workspace-kakaxi/.openclaw/workspace-state.json +0 -4
  44. package/agent-list/workspace-kakaxi/AGENTS.md +0 -13
  45. package/agent-list/workspace-kakaxi/BOOTSTRAP.md +0 -5
  46. package/agent-list/workspace-kakaxi/HEARTBEAT.md +0 -3
  47. package/agent-list/workspace-kakaxi/IDENTITY.md +0 -7
  48. package/agent-list/workspace-kakaxi/MEMORY.md +0 -24
  49. package/agent-list/workspace-kakaxi/SOUL.md +0 -6
  50. package/agent-list/workspace-kakaxi/TOOLS.md +0 -44
  51. package/agent-list/workspace-kakaxi/USER.md +0 -7
  52. package/agent-list/workspace-kakaxi/cards/README.md +0 -31
  53. package/agent-list/workspace-kakaxi/cards/build.js +0 -210
  54. package/agent-list/workspace-kakaxi/cards/index.html +0 -370
  55. package/agent-list/workspace-kakaxi/cards/workflow-new-card.md +0 -70
  56. 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
  57. 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
  58. 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
  59. 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
  60. 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
  61. 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
  62. 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
  63. 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
  64. package/agent-list/workspace-kakaxi/teaching-task-standard.md +0 -177
  65. 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
  66. 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
  67. 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
  68. 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
  69. 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
  70. 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
  71. 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
  72. 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
  73. 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
  74. 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
  75. 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
  76. 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
  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
  78. 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
  79. 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
  80. 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
  81. 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
  82. 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
  83. 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
  84. 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
  85. 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
  86. 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
  87. 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
  88. 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
  89. 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
  90. 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
  91. 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
  92. 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
  93. 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
  94. 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
  95. 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
  96. package/skills/yiran-skill-media/scripts/__pycache__/generate.cpython-311.pyc +0 -0
  97. package/skills/yiran-skill-media/scripts/providers/__pycache__/__init__.cpython-311.pyc +0 -0
  98. package/skills/yiran-skill-media/scripts/providers/__pycache__/__init__.cpython-37.pyc +0 -0
  99. package/skills/yiran-skill-media/scripts/providers/__pycache__/jimeng_image.cpython-37.pyc +0 -0
  100. package/skills/yiran-skill-media/scripts/providers/__pycache__/jimeng_video.cpython-311.pyc +0 -0
  101. package/skills/yiran-skill-media/scripts/providers/__pycache__/jimeng_video.cpython-37.pyc +0 -0
  102. package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_image.cpython-311.pyc +0 -0
  103. package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_image.cpython-37.pyc +0 -0
  104. package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_music.cpython-311.pyc +0 -0
  105. package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_music.cpython-37.pyc +0 -0
  106. package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_video.cpython-311.pyc +0 -0
  107. package/skills/yiran-skill-media/scripts/providers/__pycache__/minimax_video.cpython-37.pyc +0 -0
  108. package/skills/yiran-skill-media/scripts/providers/__pycache__/vapi_image.cpython-311.pyc +0 -0
  109. package/skills/yiran-skill-media/scripts/providers/__pycache__/vapi_image.cpython-37.pyc +0 -0
@@ -32,6 +32,7 @@
32
32
  var pollTimer = null;
33
33
  var lastKnownClawName = null; // 本地环境下从 API 获取,remote 环境每次从 hostname 实时派生
34
34
  var _preloadCache = {}; // url → Image 对象,防止重复预加载
35
+ var showHiddenArtifacts = false; // 是否显示被过滤掉的系统/模板内部文件
35
36
  var MYCLAW_API_PORT = 18800;
36
37
  // 远程环境(公网域名):nginx 已将 /sync 反代到 127.0.0.1:8080,直接同域访问
37
38
  // 本地环境:直接访问 127.0.0.1:18800
@@ -199,14 +200,47 @@
199
200
  'user-select: none',
200
201
  'flex-shrink: 0',
201
202
  ].join(';');
203
+ var leftGroup = document.createElement('div');
204
+ leftGroup.style.cssText = 'display:flex;align-items:center;gap:6px;';
205
+
202
206
  var titleSpan = document.createElement('span');
203
- titleSpan.textContent = '🎨 学生作品';
204
- titleSpan.style.cssText = 'cursor:pointer;border-radius:3px;padding:1px 4px;transition:background 0.15s;';
207
+ titleSpan.textContent = '⚙️';
208
+ titleSpan.style.cssText = 'cursor:pointer;border-radius:3px;padding:2px 4px;transition:background 0.15s;font-size:14px;';
205
209
  titleSpan.title = '查看统计信息';
206
210
  titleSpan.onmouseenter = function () { titleSpan.style.background = 'rgba(255,255,255,0.1)'; };
207
211
  titleSpan.onmouseleave = function () { titleSpan.style.background = 'none'; };
208
212
  titleSpan.onclick = function () { openStatsModal(); };
209
- header.appendChild(titleSpan);
213
+ leftGroup.appendChild(titleSpan);
214
+
215
+ var eyeBtn = document.createElement('span');
216
+ var updateEyeUI = function() {
217
+ if (showHiddenArtifacts) {
218
+ eyeBtn.textContent = '👁';
219
+ eyeBtn.style.opacity = '1';
220
+ eyeBtn.style.textDecoration = 'none';
221
+ eyeBtn.title = '隐藏内部模板文件';
222
+ } else {
223
+ eyeBtn.textContent = '👁';
224
+ eyeBtn.style.opacity = '0.5';
225
+ eyeBtn.style.textDecoration = 'line-through';
226
+ eyeBtn.title = '显示内部模板文件';
227
+ }
228
+ };
229
+ eyeBtn.style.cssText = 'cursor:pointer;border-radius:3px;padding:2px 4px;transition:all 0.15s;font-size:13px;';
230
+ updateEyeUI();
231
+ eyeBtn.onmouseenter = function() { eyeBtn.style.background = 'rgba(255,255,255,0.1)'; };
232
+ eyeBtn.onmouseleave = function() { eyeBtn.style.background = 'none'; };
233
+ eyeBtn.onclick = function() {
234
+ showHiddenArtifacts = !showHiddenArtifacts;
235
+ updateEyeUI();
236
+ var contentEl = document.querySelector('#myclaw-artifacts-content');
237
+ if (cachedData && contentEl) {
238
+ renderArtifactsList(contentEl, cachedData);
239
+ }
240
+ };
241
+ leftGroup.appendChild(eyeBtn);
242
+
243
+ header.appendChild(leftGroup);
210
244
 
211
245
  // 搜索框(或获取已存在的搜索框)
212
246
  var searchBoxHeader = document.querySelector('#myclaw-search-box');
@@ -243,7 +277,7 @@
243
277
  var _scWs = getWorkspaceId();
244
278
  showcaseLink.href = 'https://www.yiranlaoshi.com/showcase?claw=' + _scClaw + '&workspace=' + _scWs;
245
279
  showcaseLink.target = '_blank';
246
- showcaseLink.textContent = '\uD83D\uDC41 \u9879\u76EE\u96C6';
280
+ showcaseLink.textContent = '我的项目';
247
281
  showcaseLink.style.cssText = 'cursor:pointer;padding:2px 10px;border-radius:3px;font-size:12px;background:rgba(255,255,255,0.08);transition:background 0.15s;color:#cdd6f4;text-decoration:none;';
248
282
  showcaseLink.onmouseenter = function () { showcaseLink.style.background = 'rgba(255,255,255,0.18)'; };
249
283
  showcaseLink.onmouseleave = function () { showcaseLink.style.background = 'rgba(255,255,255,0.08)'; };
@@ -457,10 +491,12 @@
457
491
  '__teacher__.json',
458
492
  '__teacher-view__.html',
459
493
  ];
460
- sorted = sorted.filter(function (asset) {
461
- var basename = (asset.path || asset.name || '').split('/').pop();
462
- return ARTIFACT_BLACKLIST.indexOf(basename) === -1;
463
- });
494
+ if (!showHiddenArtifacts) {
495
+ sorted = sorted.filter(function (asset) {
496
+ var basename = (asset.path || asset.name || '').split('/').pop();
497
+ return ARTIFACT_BLACKLIST.indexOf(basename) === -1;
498
+ });
499
+ }
464
500
 
465
501
  sorted.forEach(function (asset, idx) {
466
502
  // 状态判断:基于 last_open 时间戳
@@ -792,13 +828,13 @@
792
828
  'background: #fff',
793
829
  ].join(';');
794
830
 
795
- // 文本类文件走本地 server(已有 charset=utf-8),避免 CDN 无 charset 导致中文乱码
831
+ // 大文件(音频/视频)走 CDN,其余走本地 server(避免 CDN 无 charset 导致乱码)
796
832
  var assetExt = (asset.path || '').split('.').pop().toLowerCase();
797
- var TEXT_EXTS = ['md', 'txt', 'py', 'js', 'ts', 'jsx', 'tsx', 'css', 'json', 'yaml', 'yml', 'sh', 'xml', 'ini', 'toml', 'env', 'vue', 'csv'];
798
- if (TEXT_EXTS.indexOf(assetExt) !== -1) {
799
- iframe.src = MYCLAW_API_BASE + '/api/file?path=' + encodeURIComponent(getWorkspaceId() + '/' + asset.path) + '&t=' + Date.now();
800
- } else {
833
+ var CDN_EXTS = ['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a', 'mp4', 'webm', 'mov', 'avi', 'mkv'];
834
+ if (CDN_EXTS.indexOf(assetExt) !== -1) {
801
835
  iframe.src = previewUrl + '?t=' + Date.now();
836
+ } else {
837
+ iframe.src = MYCLAW_API_BASE + '/api/file?path=' + encodeURIComponent(getWorkspaceId() + '/' + asset.path) + '&t=' + Date.now();
802
838
  }
803
839
 
804
840
  box.appendChild(iframe);
@@ -2114,7 +2150,7 @@
2114
2150
 
2115
2151
  // ═══ 作品模板列表弹框 ═══
2116
2152
  // 使用通用文件接口 GET /api/file?path=(路径相对 .openclaw 根)
2117
- var TEMPLATE_ROOT = 'workspace-ai-demo/skills/yiran-playground-template-use';
2153
+ var TEMPLATE_ROOT = 'skills/yiran-playground-template-use';
2118
2154
 
2119
2155
  function openTemplateModal() {
2120
2156
  if (document.querySelector('#myclaw-template-modal')) return;
@@ -2336,7 +2372,7 @@
2336
2372
 
2337
2373
  // 加载 demo.html(text/html,server 直接返回,iframe 可正常渲染)
2338
2374
  previewIframe.src = MYCLAW_API_BASE + '/api/file?path='
2339
- + encodeURIComponent(TEMPLATE_ROOT + '/templates/' + tpl['文件夹名'] + '/demo.html');
2375
+ + encodeURIComponent(TEMPLATE_ROOT + '/templates/' + tpl['文件夹名'] + '/__student-view__.html');
2340
2376
  }
2341
2377
 
2342
2378
  row.onclick = setActive;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiyiran/myclaw",
3
- "version": "1.1.26",
3
+ "version": "1.1.33",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -6,6 +6,11 @@
6
6
 
7
7
  ---
8
8
 
9
+ 业务背景请统一参考:
10
+ `业务背景.md`
11
+
12
+ ---
13
+
9
14
  # 当前工作流
10
15
 
11
16
  ## 阶段一:灵感 -> demo 页面
@@ -7,6 +7,7 @@ description: 面向中文课堂的小专题课程模板流水线。适用于把
7
7
 
8
8
  这个 skill 支持的是一条完整工作流,而不是单点产出。
9
9
 
10
+
10
11
  ## 四阶段流程
11
12
 
12
13
  ### 1)灵感 -> demo 页面
@@ -43,14 +44,16 @@ description: 面向中文课堂的小专题课程模板流水线。适用于把
43
44
  - `__teacher__.json`
44
45
 
45
46
  ### 4)JSON -> HTML,并按目录打包
46
- 第4阶段拆成两个独立脚本:
47
+ 第4阶段拆成三个独立脚本:
47
48
  - `scripts/build_template_views.py`
48
49
  - `scripts/move_template_task.py`
50
+ - `scripts/publish_template.py`
49
51
 
50
52
  其中:
51
53
  - build 负责在原目录生成 `__student-view__.html`、`__teacher-view__.html` 和 `index.html`
52
- - `index.html` 采用固定脚本规则:左边展示“评价目标”,右边展示“步骤”,不显示任务标题和一句话说明
54
+ - `index.html` 采用固定脚本规则:左边展示”评价目标”,右边展示”步骤”,不显示任务标题和一句话说明
53
55
  - move 负责把任务文件夹移动到 `yiran-playground-template-use` skill 的 `templates/`,并自动触发索引重建
56
+ - publish 负责把模板文件夹内所有资源上传到七牛 CDN,并重写 HTML 中的资源引用为 CDN 绝对地址(见 `cdn-convention.md`)
54
57
 
55
58
  ## 原则
56
59
 
@@ -58,8 +61,9 @@ description: 面向中文课堂的小专题课程模板流水线。适用于把
58
61
  - 再定 __student__.json
59
62
  - 再定 __teacher__.json
60
63
  - 阶段一到三先在当前工作目录的任务文件夹里完成
61
- - demo 中的媒体资源优先使用 CDN 链接,不使用本地相对路径;当前固定前缀为 `https://cdn.yiranlaoshi.com/yiran/workspace-ai-demo`,后面拼接资源相对路径
62
- - 第4阶段拆成 build move 两个独立脚本
64
+ - 所有 HTML 中的外部资源(图片、字体、JS 库等)必须使用 CDN 链接,禁止本地相对路径;使用哪个 CDN 不限
65
+ - publish 脚本会统一重新打包:无论原引用是相对路径还是其他 CDN,只要本地能找到对应文件,都会上传到指定 CDN 并重写引用(见 `cdn-convention.md`)
66
+ - 第4阶段拆成 build、move、publish 三个独立脚本
63
67
  - templates 作为 skill 的资产目录统一维护
64
68
  - 模板有变化后,要重新构建索引
65
69
  - 全部内容优先中文
@@ -0,0 +1,77 @@
1
+ # CDN 约定
2
+
3
+ ## 七牛云配置
4
+
5
+ | 项 | 值 |
6
+ |---|---|
7
+ | Bucket | `yiran1` |
8
+ | CDN 域名 | `https://cdn.yiranlaoshi.com` |
9
+
10
+ ---
11
+
12
+ ## 模板文件 CDN 路径规则
13
+
14
+ ```
15
+ https://cdn.yiranlaoshi.com/myclaw/live/yiran/skills/yiran-playground-template-use/templates/{文件夹名}/{文件名}
16
+ ```
17
+
18
+ 示例:
19
+ ```
20
+ https://cdn.yiranlaoshi.com/myclaw/live/yiran/skills/yiran-playground-template-use/templates/a103_做一个介绍页面/__demo__.html
21
+ https://cdn.yiranlaoshi.com/myclaw/live/yiran/skills/yiran-playground-template-use/templates/a103_做一个介绍页面/__student-view__.html
22
+ https://cdn.yiranlaoshi.com/myclaw/live/yiran/skills/yiran-playground-template-use/templates/a103_做一个介绍页面/banner.png
23
+ ```
24
+
25
+ 七牛 key(去掉域名后的部分):
26
+ ```
27
+ myclaw/live/yiran/skills/yiran-playground-template-use/templates/{文件夹名}/{文件名}
28
+ ```
29
+
30
+ ---
31
+
32
+ ## 两阶段分工
33
+
34
+ ### 阶段一:创作阶段(yiran-course-template-pipeline)
35
+
36
+ **只关心内容质量,不关心具体 CDN 地址。**
37
+
38
+ - 所有外部资源(图片、字体、JS 库)**必须使用 CDN 链接**,禁止本地相对路径
39
+ - 使用哪个 CDN 不限,可以是 unpkg、jsDelivr、任意公开图床,也可以是 `cdn.yiranlaoshi.com`
40
+ - 模板文件之间的引用(如 `<iframe src="__demo__.html">`)**视为相对路径,不允许**,需在创作时避免或由 publish 脚本修复
41
+
42
+ ### 阶段二:发布阶段(publish_template.py)
43
+
44
+ **统一接管资源,重新打包到指定 CDN。**
45
+
46
+ 发布脚本会:
47
+ 1. 扫描模板文件夹内所有 HTML 文件的资源引用(`src`、`href`、`url()`)
48
+ 2. 对每个引用,判断本地是否存在对应文件(相对路径 → 直接找;其他 CDN 链接 → 尝试匹配本地同名文件)
49
+ 3. 将本地能找到的文件上传到七牛,路径规则见上方
50
+ 4. 将 HTML 中的原引用替换为新 CDN URL
51
+ 5. 最后上传修改后的 HTML 文件本身
52
+
53
+ 发布完成后,模板文件夹内的所有资源在 CDN 上完全自包含,不依赖任何外部路径。
54
+
55
+ ---
56
+
57
+ ## 调用方式
58
+
59
+ ```bash
60
+ # 在 move 之后执行
61
+ python3 scripts/publish_template.py <templates 下的目标文件夹>
62
+ ```
63
+
64
+ 例:
65
+ ```bash
66
+ python3 scripts/publish_template.py /path/to/.openclaw/skills/yiran-playground-template-use/templates/a103_做一个介绍页面
67
+ ```
68
+
69
+ ---
70
+
71
+ ## 完整流程
72
+
73
+ ```
74
+ 1. build_template_views.py 创作文件夹 → 生成 __student-view__.html 等
75
+ 2. move_template_task.py 创作文件夹 → 移动改名到 templates/,重建索引
76
+ 3. publish_template.py templates/xxx → 上传资源到七牛,重写 HTML 引用
77
+ ```
@@ -0,0 +1,107 @@
1
+ # 评价点子
2
+
3
+ 用途:
4
+ 没有点子时,用"任务生成器"快速产出候选;有了点子之后,再用评价标准过滤。
5
+
6
+ ---
7
+
8
+ ## 第一步:没有点子?用这个模板生成
9
+
10
+ ### 🧩 万能句式
11
+
12
+ > 做一个「东西」,它要「效果」
13
+
14
+ 填进去就是一个可用的点子,不需要想太多。
15
+
16
+ ### 参考例子(可以直接用)
17
+
18
+ **🎨 图片类**
19
+ - 做一个角色,它要"看起来很生气"
20
+ - 做一张图,它要"让人觉得很奇怪"
21
+
22
+ **🌐 网页类**
23
+ - 做一个页面,它点一下会发生变化
24
+ - 做一个展示页,它有3个不同内容
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
+ 判断方式:是否存在至少两种以上合理的实现路径?
61
+
62
+ ### ③ 可以在10分钟内完成第一版
63
+ 这是关键。第一版不需要完美,但必须能做出来。
64
+
65
+ 如果第一版就需要学很多新东西、搭复杂结构,这个点子就不合适。
66
+
67
+ 判断方式:一个普通学生,10分钟内能不能交出一个"虽然简陋但能看"的版本?
68
+
69
+ ### ④ 可以自然进入迭代
70
+ 做完第一版后,学生有明显的下一步可以走,不会卡住。
71
+
72
+ 好的迭代路径例子:
73
+ - 不像 → 可以改风格
74
+ - 不动 → 可以加动画
75
+ - 不好玩 → 可以加互动
76
+
77
+ 判断方式:做完之后,学生自己能不能发现"我还可以改这个"?
78
+
79
+ ## 输出格式
80
+
81
+ ```
82
+ 【点子评价】
83
+
84
+ ① 目标清晰(但很小):✅/⚠️
85
+ 说明:...
86
+
87
+ ② 不限制实现方式:✅/⚠️
88
+ 说明:...
89
+
90
+ ③ 10分钟能完成第一版:✅/⚠️
91
+ 说明:...
92
+
93
+ ④ 可以自然迭代:✅/⚠️
94
+ 说明:...
95
+
96
+ 【结论】
97
+ 适合 / 有风险 / 不建议继续
98
+
99
+ 【建议】
100
+ (如果有 ⚠️,逐条说明怎么改)
101
+ ```
102
+
103
+ ## 判断规则
104
+
105
+ - 4条全 ✅ → 告知用户这个点子可以继续,建议进入 demo 生成
106
+ - 有 1-2 条 ⚠️ → 给出具体改进建议,等用户调整后再继续
107
+ - ③ 是 ⚠️ → 重点提示,复杂度是最容易让课堂崩掉的因素
@@ -3,6 +3,42 @@
3
3
  用途:
4
4
  把一个题目灵感、设计角度或课堂切入点,先变成一个适合演示的 demo 页面。
5
5
 
6
+ ## 第0步:先做选题评价(必须做,不能跳过)
7
+
8
+ 在开始生成 demo 之前,先对用户给出的选题做一次快速评估。
9
+
10
+ 对照以下4个标准,逐条给出评价:
11
+
12
+ | # | 标准 | 判断 | 说明 |
13
+ |---|------|------|------|
14
+ | 1 | **目标明确** — 学生打开就知道自己要做什么,没有歧义 | ✅ / ⚠️ | 一句话说明 |
15
+ | 2 | **复杂度合适** — 不会一上来就需要做复杂系统,学生能在课堂内完成 | ✅ / ⚠️ | 一句话说明 |
16
+ | 3 | **有一点点意义** — 不是纯练习,有对象、有情境、有用武之地 | ✅ / ⚠️ | 一句话说明 |
17
+ | 4 | **有发挥空间** — 不是死题,不同学生可以有不同风格和表现 | ✅ / ⚠️ | 一句话说明 |
18
+
19
+ 评价完成后,输出以下结构:
20
+
21
+ ```
22
+ 【选题评价】
23
+
24
+ ✅/⚠️ 目标明确:...
25
+ ✅/⚠️ 复杂度合适:...
26
+ ✅/⚠️ 有一点意义:...
27
+ ✅/⚠️ 有发挥空间:...
28
+
29
+ 【总结】
30
+ 这个选题整体是否适合继续做 demo?一句话概括。
31
+
32
+ 【不足与建议】
33
+ 如果有 ⚠️,逐条列出:
34
+ - 问题是什么
35
+ - 建议怎么改
36
+ ```
37
+
38
+ **判断规则:**
39
+ - 4条全是 ✅ → 直接告知用户可以继续,然后开始生成 demo
40
+ - 有 ⚠️ → 先输出评价和改进建议,等用户确认或调整后,再继续生成 demo
41
+
6
42
  ## 目标
7
43
 
8
44
  你现在不是在先整理 JSON。
@@ -3,6 +3,8 @@
3
3
  用途:
4
4
  在题目灵感已经比较清楚、或者 demo 方向已经大致确定时,先把学生侧任务结构定下来。
5
5
 
6
+ 业务背景统一参考:`业务背景.md`
7
+
6
8
  注意:
7
9
  **这个阶段不要求一定已经有 __teacher__.json。**
8
10
  **这个阶段甚至不要求一定已经有完整作品。**
@@ -3,6 +3,8 @@
3
3
  用途:
4
4
  在 __student__.json 已经明确之后,再整理教师侧的题目设计目的与教学判断信息。
5
5
 
6
+ 业务背景统一参考:`业务背景.md`
7
+
6
8
  这个阶段的目标不是生成学生页内容,
7
9
  而是:
8
10
  **把这个题目为什么这样设计、主要解决什么问题、老师上课时该怎么看,整理成 __teacher__.json。**
@@ -68,10 +68,40 @@ python3 scripts/move_template_task.py 任务文件夹
68
68
 
69
69
  ---
70
70
 
71
+ ---
72
+
73
+ ## 脚本3:publish_template.py
74
+
75
+ 目标:
76
+ 把模板文件夹内所有资源上传到七牛 CDN,并重写 HTML 中的资源引用为 CDN 绝对地址。
77
+
78
+ 处理逻辑:
79
+ - 扫描文件夹内所有 HTML 文件的资源引用(`src`、`href`、`url()`)
80
+ - 对每个引用,尝试在本地找到对应文件(相对路径直接拼接,外部 URL 按文件名查找)
81
+ - 本地能找到的文件:上传到七牛 → 重写引用为新 CDN URL
82
+ - 本地找不到的引用:保持原样不动
83
+
84
+ CDN 路径规则(见 `cdn-convention.md`):
85
+ ```
86
+ https://cdn.yiranlaoshi.com/myclaw/live/yiran/skills/yiran-playground-template-use/templates/{文件夹名}/{文件名}
87
+ ```
88
+
89
+ 调用方式:
90
+ ```bash
91
+ python3 scripts/publish_template.py templates下的目标文件夹路径
92
+ ```
93
+
94
+ 适用场景:
95
+ - move 完成后,准备正式对外使用模板
96
+ - 需要保证所有资源链接在任意环境下均可访问
97
+
98
+ ---
99
+
71
100
  ## 原则
72
101
 
73
102
  1. 先在当前工作目录完成中间产物
74
- 2. 先 build,再 move
103
+ 2. 先 build,再 move,再 publish
75
104
  3. build 只在原目录生成页面,不移动
76
105
  4. move 只负责移动和改名,并自动触发索引构建
77
- 5. 文件命名固定,不临时改名
106
+ 5. publish 负责资源上传和链接重写,是最终对外发布的步骤
107
+ 6. 文件命名固定,不临时改名
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env python3
2
+ import json
3
+ import re
4
+ from pathlib import Path
5
+
6
+ ROOT = Path(__file__).resolve().parent.parent
7
+ TEMPLATES_DIR = ROOT / 'templates'
8
+ OUTPUT_JSON = ROOT / 'template-index.json'
9
+ OUTPUT_MD = ROOT / 'template-index.md'
10
+
11
+
12
+ def read_json(path: Path):
13
+ try:
14
+ return json.loads(path.read_text(encoding='utf-8'))
15
+ except Exception:
16
+ return {}
17
+
18
+
19
+ def parse_folder_name(name: str):
20
+ m = re.match(r'^([a-zA-Z]+)(\d+)_(.+)$', name)
21
+ if m:
22
+ return m.group(1).upper(), str(int(m.group(2))), m.group(3)
23
+ return None, None, None
24
+
25
+
26
+ def get_entry_file(folder: Path) -> Path | None:
27
+ for name in ['index.html', '__demo__.html', '__student-view__.html']:
28
+ if (folder / name).exists():
29
+ return folder / name
30
+ return None
31
+
32
+
33
+ def main():
34
+ index = {}
35
+ items_for_md = []
36
+
37
+ for folder in sorted(TEMPLATES_DIR.iterdir() if TEMPLATES_DIR.exists() else []):
38
+ if not folder.is_dir():
39
+ continue
40
+
41
+ series, number, _ = parse_folder_name(folder.name)
42
+ if not series:
43
+ continue
44
+
45
+ teacher = read_json(folder / '__teacher__.json')
46
+ student = read_json(folder / '__student__.json')
47
+
48
+ name = teacher.get('任务名称') or student.get('任务标题', '')
49
+ 一句话 = student.get('一句话说明', '')
50
+ 能力标签 = teacher.get('主能力标签', '')
51
+ 类型标签 = teacher.get('任务类型标签', '')
52
+
53
+ keywords = list(dict.fromkeys(filter(None, [
54
+ folder.name,
55
+ 一句话,
56
+ *teacher.get('适合学生类型', []),
57
+ *teacher.get('训练重点', []),
58
+ name,
59
+ 能力标签,
60
+ 类型标签,
61
+ ])))
62
+
63
+ entry = get_entry_file(folder)
64
+ record = {
65
+ '系列': series,
66
+ '编号': number,
67
+ '名称': name,
68
+ '文件夹名': folder.name,
69
+ '路径': str(folder.relative_to(ROOT)),
70
+ 'student_json': str((folder / '__student__.json').relative_to(ROOT)) if (folder / '__student__.json').exists() else '',
71
+ 'teacher_json': str((folder / '__teacher__.json').relative_to(ROOT)) if (folder / '__teacher__.json').exists() else '',
72
+ '入口文件': str(entry.relative_to(ROOT)) if entry else '',
73
+ '一句话说明': 一句话,
74
+ '主能力标签': 能力标签,
75
+ '任务类型标签': 类型标签,
76
+ '关键词': keywords,
77
+ }
78
+
79
+ if series not in index:
80
+ index[series] = {}
81
+ index[series][number] = record
82
+ items_for_md.append(record)
83
+
84
+ OUTPUT_JSON.write_text(json.dumps(index, ensure_ascii=False, indent=2), encoding='utf-8')
85
+
86
+ lines = ['# 模板索引', '', '每次 templates 内模板有变化后,都应重新运行本脚本。', '']
87
+ for item in items_for_md:
88
+ lines.append(f"## {item['系列']}{item['编号']} {item['名称']}")
89
+ lines.append(f"- 路径:{item['路径']}")
90
+ lines.append(f"- 入口文件:{item['入口文件']}")
91
+ lines.append(f"- 主能力标签:{item['主能力标签']}")
92
+ lines.append(f"- 任务类型标签:{item['任务类型标签']}")
93
+ if item['关键词']:
94
+ lines.append(f"- 关键词:{', '.join(item['关键词'])}")
95
+ lines.append('')
96
+
97
+ OUTPUT_MD.write_text('\n'.join(lines), encoding='utf-8')
98
+ print(f'已生成: {OUTPUT_JSON}')
99
+ print(f'已生成: {OUTPUT_MD}')
100
+
101
+
102
+ if __name__ == '__main__':
103
+ main()
@@ -6,9 +6,8 @@ import sys
6
6
  from pathlib import Path
7
7
 
8
8
  ROOT = Path(__file__).resolve().parent.parent
9
- SEARCH_SKILL = ROOT.parent / 'yiran-playground-template-use'
10
- DEFAULT_TARGET = SEARCH_SKILL / 'templates'
11
- INDEX_SCRIPT = SEARCH_SKILL / 'scripts' / 'build_template_index.py'
9
+ DEFAULT_TARGET = ROOT / 'templates'
10
+ INDEX_SCRIPT = ROOT / 'scripts' / 'build_template_index.py'
12
11
  REQUIRED_FILES = ['__demo__.html', '__student__.json', '__teacher__.json', '__student-view__.html', '__teacher-view__.html']
13
12
 
14
13