From 5b70d6ccd511a840a5c901e537d2bcc0ea933003 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Tue, 27 Oct 2026 14:54:28 +0800 Subject: [PATCH] Publish a saved initial design ID for each of the 27 layout tutorials --- scripts/publish-layout-studio-tutorial.mjs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scripts/publish-layout-studio-tutorial.mjs b/scripts/publish-layout-studio-tutorial.mjs index 5ed4454..261a8dd 100644 --- a/scripts/publish-layout-studio-tutorial.mjs +++ b/scripts/publish-layout-studio-tutorial.mjs @@ -2,11 +2,13 @@ import {readFile,writeFile} from 'node:fs/promises'; const base='http://127.0.0.1:3000',id='8eb8c76500580f7a4b56ba3c',dir='/tmp/prompt-layout-studio'; const layouts=JSON.parse(await readFile(dir+'/catalog.json','utf8')); +const stateFile='/tmp/prompt-layout-studio-state.json';let state;try{state=JSON.parse(await readFile(stateFile,'utf8'))}catch{state={designs:{}}} +for(const l of layouts){if(state.designs[l.id])continue;const r=await fetch(base+'/api/studio/designs',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({layoutId:l.id,name:l.id+' · 初始排版',parameters:{}})});if(!r.ok)throw Error('Design save failed: '+r.status);state.designs[l.id]=(await r.json()).design;await writeFile(stateFile,JSON.stringify(state),{mode:0o600});} let markdown=await readFile(dir+'/tutorial.md','utf8'); -markdown=markdown.replace('{{LAYOUTS}}',layouts.map(l=>`- **[${l.id} · ${l.name}](/studio/layouts/${l.id})** · [构件文档](${l.tutorialUrl}) · [API 参数](/studio/api/layouts/${l.id}?agent_mode=True)`).join('\n')); +markdown=markdown.replace('{{LAYOUTS}}',layouts.map(l=>`- **[${l.id} · ${l.name}](/studio/layouts/${l.id})** · [已保存初始效果](${state.designs[l.id].url}) · [构件文档](${l.tutorialUrl}) · [API 参数](/studio/api/layouts/${l.id}?agent_mode=True)`).join('\n')); const response=await fetch(base+'/api/notes/'+id);if(!response.ok)throw Error('Router unavailable');const {entry}=await response.json(); -await writeFile('/tmp/prompt-layout-router-before.json',JSON.stringify(entry),{mode:0o600}); +try{await readFile('/tmp/prompt-layout-router-before.json')}catch{await writeFile('/tmp/prompt-layout-router-before.json',JSON.stringify(entry),{mode:0o600})} const tags=await fetch(base+'/api/tags').then(r=>r.json()),selected=tags.filter(t=>entry.categories.includes(t.name)||(entry.systemTags||[]).some(s=>s.id===t.id)).map(t=>t.id); const result=await fetch(base+'/api/notes/'+id,{method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify({title:'27 套排版 · Studio 参数 API 与保存教程',description:'27 个原图对应效果页,按 T/I/D 构件调整参数;API 渲染、保存独立 ID 与再次编辑,和 Wiki 共用数据库。',markdown,tags:selected,assets:entry.assets,coverAssetId:entry.coverAssetId,revision:entry.revision})}); if(!result.ok)throw Error('Router update failed: '+result.status); -console.log(JSON.stringify({routerUpdated:true,studioPages:layouts.length,contentExported:false})); +console.log(JSON.stringify({routerUpdated:true,studioPages:layouts.length,savedDesigns:Object.keys(state.designs).length,contentExported:false}));