/* V8.27: pure journey model. Display only server-observed milestones as complete. */ (function(root,factory){ const api=factory(); if(typeof module==='object'&&module.exports)module.exports=api; else root.SiteForgeJourney=api; })(typeof window!=='undefined'?window:this,function(){ 'use strict'; const successful=new Set(['complete','completed','done','success']); const active=new Set(['queued','running','retrying']); function parse(t){const d=Date.parse(t||'');return Number.isFinite(d)?d:null} function plan(input){ const site=input?.site||null, entries=input?.entries||[], builds=input?.builds||[], jobs=input?.jobs||[], history=input?.delivery?.history||[]; if(!site)return {ready:false,steps:[],next:null,completed:0,hasBuild:false,live:false}; const userEntries=entries.filter(e=>e.source!=='starter' && e.status!=='draft'); const manuallyEditedHome=entries.some(e=>e.route==='/'&&e.status!=='draft'&&e.source==='starter'&&parse(e.updated_at)!==null&&parse(e.created_at)!==null&&parse(e.updated_at)>parse(e.created_at)+1000); const hasContent=userEntries.length>0||manuallyEditedHome; const lastBuild=builds.filter(x=>successful.has(x.status)).sort((a,b)=>(parse(b.created_at)||0)-(parse(a.created_at)||0))[0]||null; const anyRunning=jobs.some(x=>active.has(x.state)); const changeTimes=[site.updated_at,...entries.filter(e=>e.status!=='draft').map(e=>e.updated_at)].map(parse).filter(x=>x!==null); const changedAfterBuild=!!lastBuild&&changeTimes.some(x=>{const built=parse(lastBuild.created_at);return built!==null&&x>built+1000}); const hasBuild=!!lastBuild; const live=history.some(x=>x.target==='production' && !!x.release_id && !x.is_rollback); const domain=Boolean((site.domain||'').trim()); const steps=[ {id:'site',label:'创建网站',hint:'网站已经建立,基础资料可以随时修改。',view:'settings',done:true,optional:false}, {id:'content',label:'准备网站内容',hint:hasContent?'已有人工添加的正式内容。':'添加页面、产品或导入旧站内容。新建时自带的示例首页不代表内容已准备好。',view:site.mode==='migration'?'import':'content',done:hasContent,optional:false}, {id:'design',label:'调整网站样式',hint:'可视化修改页面、页眉、导航和手机布局;设计需人工确认。',view:'design',done:false,optional:true}, {id:'build',label:'生成并预览网站',hint:anyRunning?'后台正在生成,请在构建页面查看结果。':!hasBuild?'生成静态页面后,再检查预览与质量报告。':changedAfterBuild?'已有构建版本,但内容可能已更新,请检查是否需要重新构建。':'已有构建版本;仍需人工检查预览、图片和 SEO。',view:'build',done:hasBuild&&!changedAfterBuild,optional:false}, {id:'review',label:'审核并正式上线',hint:live?'存在正式发布记录,请核对目标网址是否正确显示。':'正式上线前需要发布条件检查、独立审批与服务器部署。',view:'launch',done:live,optional:false} ]; const next=steps.find(s=>!s.optional&&!s.done)||steps[4]; return {ready:true,steps,next,completed:steps.filter(s=>!s.optional&&s.done).length,hasBuild,changedAfterBuild,live,domain,anyRunning}; } return {plan}; });