Connect all 27 source layouts to parameterized Studio pages and shared design storage
studio CI and deployment / verify-and-deploy (push) Successful in 5m55s
waterfall-wiki CI and deployment / verify-and-deploy (push) Failing after 18m23s

This commit is contained in:
2026-10-27 14:51:17 +08:00
parent 00e1b70398
commit 94932418ca
28 changed files with 374 additions and 4 deletions
+10
View File
@@ -0,0 +1,10 @@
/** Package the 27 audited layers; no new Wiki document routes or copied DB. */
import {readFile,writeFile} from 'node:fs/promises';
const root=new URL('../',import.meta.url),read=p=>readFile(new URL(p,root)),raw=JSON.parse(await read('content/layout-reference/manifest.json')),ids=JSON.parse(await read('content/layout-reference/post-ids.json'));
const image=async p=>'data:image/png;base64,'+(await read('content/layout-reference/assets/'+p.replace(/^asset:/,''))).toString('base64');
const layouts=[];
for(const m of raw){const elements=[];for(const e of m.elements)elements.push({...e,raster:await image(e.asset),...(e.mask?{shape:await image(e.mask)}:{})});layouts.push({id:m.id,name:m.name,width:m.width,height:m.height,tutorialUrl:'/explore/'+ids[m.id],sourceSha256:m.source.sha256,source:await image(m.reference),background:await image(m.background),elements});}
await writeFile(new URL('apps/studio/src/content/templates/layouts.json',root),JSON.stringify(layouts));
await writeFile(new URL('apps/waterfall-wiki/src/content/studio-layouts.json',root),JSON.stringify(layouts.map(({source,background,elements,...l})=>({...l,elements:elements.map(({id,kind,role,box,direction,text,reading})=>({id,kind,role,box,direction,text,reading}))}))));
await writeFile(new URL('apps/waterfall-wiki/src/lib/layout-parameters.ts',root),await read('apps/studio/src/lib/layout-parameters.ts'));
console.log('Packaged '+layouts.length+' corresponding layouts');
@@ -0,0 +1,12 @@
/** Run only inside the Wiki container via auth-cli.cjs run. API-only editorial update. */
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'));
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'));
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});
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}));