import fs from 'node:fs'; import crypto from 'node:crypto'; const base='work/trilium', snapshot=process.env.TRILIUM_PHASE3_INPUT||'work/trilium-gitea/updates/2026-09-05/phase3-input'; const out=base+'/phase3';fs.mkdirSync(out,{recursive:true}); fs.cpSync(base+'/scoped/doc_notes/en',out+'/doc_notes/en',{recursive:true}); fs.cpSync(base+'/release/doc_notes/en',out+'/doc_notes/en',{recursive:true}); let main=fs.readFileSync(snapshot+'/main.cjs','utf8'); const original=main; const replace=(from,to)=>{if(main.split(from).length!==2)throw Error('Patch point mismatch: '+from);main=main.replace(from,to);}; replace('jg=`assets/v${CR.version}-ko-20260905-r2`','jg=`assets/v${CR.version}-ko-20260913-r3`'); // Only shipped help titles are refreshed. Other customized hidden note names stay intact. replace('r.restoreNames&&n.title!==t.title','(r.restoreNames||n.noteId.startsWith("_help_"))&&n.title!==t.title'); const ko={name:'ko',weekdays:['일요일','월요일','화요일','수요일','목요일','금요일','토요일'],weekdaysShort:['일','월','화','수','목','금','토'],weekdaysMin:['일','월','화','수','목','금','토'],months:Array.from({length:12},(_,i)=>(i+1)+'월'),monthsShort:Array.from({length:12},(_,i)=>(i+1)+'월'),formats:{LT:'A h:mm',LTS:'A h:mm:ss',L:'YYYY.MM.DD.',LL:'YYYY년 M월 D일',LLL:'YYYY년 M월 D일 A h:mm',LLLL:'YYYY년 M월 D일 dddd A h:mm'},relativeTime:{future:'%s 후',past:'%s 전',s:'몇 초',m:'1분',mm:'%d분',h:'1시간',hh:'%d시간',d:'하루',dd:'%d일',M:'한 달',MM:'%d개월',y:'일 년',yy:'%d년'}}; replace('ko:()=>Promise.resolve().then(()=>Xe(xvr()))','ko:()=>Promise.resolve().then(()=>({...'+JSON.stringify(ko)+',ordinal:n=>n+"일",meridiem:h=>h<12?"오전":"오후"}))'); for(const [en,kr]of [['SQL Console - ','SQL 콘솔 - '],['Script Launcher','스크립트 실행 도구'],['Note Launcher','노트 실행 도구'],['Widget Launcher','위젯 실행 도구'],['Spacer','간격']]){ const from='title:"'+en+'"';if(main.includes(from))replace(from,'title:"'+kr+'"'); } fs.writeFileSync(out+'/main.cjs',main); let calendar=fs.readFileSync(snapshot+'/ko.js','utf8'); for(const [from,to]of [['이전달','이전'],['다음달','다음'],['년도','연도'],['일정목록','일정 목록'],['더보기','더 보기'],['이벤트','일정']])calendar=calendar.replaceAll(from,to); fs.writeFileSync(out+'/ko.js',calendar); const hash=s=>crypto.createHash('sha256').update(s).digest('hex'); const manifest={previousMainSha256:hash(original),previousCalendarSha256:hash(fs.readFileSync(snapshot+'/ko.js')),files:{}}; function walk(dir,rel=''){for(const e of fs.readdirSync(dir,{withFileTypes:true})){const name=rel+e.name;if(e.isDirectory())walk(dir+'/'+e.name,name+'/');else manifest.files[name]=hash(fs.readFileSync(dir+'/'+e.name));}} walk(out);delete manifest.files['manifest.json'];fs.writeFileSync(out+'/manifest.json',JSON.stringify(manifest,null,2)); console.log({packagedFiles:Object.keys(manifest.files).length,helpHtml:173,helpTitles:181});