from pathlib import Path
import json,shutil,hashlib,tarfile,subprocess
r=Path(__file__).resolve().parents[1];p=r/'private/dm-package';old=r/'private/invalid-encoding/dm-package'
for n in ['bind_probe.py','capture_role_evidence.cjs','capture_roles.py','finalize_identity.py','identity_clones.cjs','import_dm.cjs','payload_contract.cjs','prepare_target.py','probe_target.cjs','session_guard.cjs','verify_dm_metadata.cjs']:shutil.copy(r/'scripts'/n,p/n)
shutil.copy(r/'private/identity-source-profile.json',p/'identity-source-profile.json');shutil.copytree(old/'node_modules',p/'node_modules')
(p/'verification/scripts').mkdir(parents=True);(p/'verification/private').mkdir()
for n in ['export_dm_verify.cjs','dm_verify_contract.py']:shutil.copy(r/'scripts'/n,p/'verification/scripts'/n)
for n in ['mysql-upgraded-baseline.json','expected-normalized-manifest.json']:shutil.copy(r/'private'/n,p/'verification/private'/n)
shutil.copy(old/'INSTALL.md',p/'INSTALL.md')
s=(p/'INSTALL.md').read_text().replace('源验证已完成：','源导出使用显式utf8mb4并逐会话验证中文、emoji、重音字符与服务器HEX一致。早期非UTF8候选包已撤回，本包以最终SHA为准。\n\n源验证已完成：');(p/'INSTALL.md').write_text(s)
subprocess.run(['python3',str(r/'scripts/render_manual.py')],check=True)
m=json.load(open(p/'manifest.json'));m['files']={}
for f in sorted(p.rglob('*')):
 if f.is_file() and f.name not in ['manifest.json','PAYLOAD.sha256']:m['files'][str(f.relative_to(p))]={'bytes':f.stat().st_size,'sha256':hashlib.sha256(f.read_bytes()).hexdigest()}
(p/'manifest.json').write_text(json.dumps(m,indent=2));(p/'PAYLOAD.sha256').write_text(''.join(hashlib.sha256(f.read_bytes()).hexdigest()+'  '+str(f.relative_to(p))+'\n'for f in sorted(p.rglob('*')) if f.is_file()and f.name!='PAYLOAD.sha256'))
(r/'private/final-release').mkdir();a=r/'private/final-release/foodsafe2-dm-c4070071-20261023.tar.gz'
with tarfile.open(a,'w:gz',compresslevel=2)as t:t.add(p,arcname='foodsafe2-dm-c4070071-20261023')
a.chmod(0o600);x={'archive':a.name,'archive_bytes':a.stat().st_size,'sha256':hashlib.sha256(a.read_bytes()).hexdigest(),'manifest_sha256':hashlib.sha256((p/'manifest.json').read_bytes()).hexdigest()};(r/'evidence/final-freeze.json').write_text(json.dumps(x,indent=2));print(json.dumps(x))
