| """ |
| Build a distributable release bundle zip from manifest-defined assets. |
| """ |
| from pathlib import Path |
| from datetime import datetime, timezone |
| import zipfile |
|
|
| FILES = [ |
| 'README.md', |
| 'README.zh-CN.md', |
| 'CITATION.cff', |
| 'docs/ONE_PAGER.md', |
| 'docs/TECHNICAL_REPORT.md', |
| 'docs/RESULTS.md', |
| 'docs/REVIEWER_PACK.md', |
| 'docs/FINAL_RELEASE_CANDIDATE.md', |
| 'docs/RELEASE_DASHBOARD.md', |
| 'docs/V1_RELEASE_NOTES.md', |
| 'docs/RELEASE_SUMMARY.json', |
| 'docs/RELEASE_SUMMARY_VALIDATION.md', |
| 'assets/readme_banner.svg', |
| 'assets/cross_dataset_matrix.svg', |
| 'assets/cross_subject_loso.svg', |
| 'assets/all_model_comparison.svg', |
| 'assets/calibration_curve.svg', |
| ] |
|
|
|
|
| def main(): |
| ts = datetime.now(timezone.utc).strftime('%Y%m%d-%H%M%S') |
| dist = Path('dist') |
| dist.mkdir(exist_ok=True) |
| out = dist / f'bci-mvp-v1-bundle-{ts}.zip' |
|
|
| with zipfile.ZipFile(out, 'w', compression=zipfile.ZIP_DEFLATED) as zf: |
| for f in FILES: |
| p = Path(f) |
| if p.exists(): |
| zf.write(p, arcname=f) |
|
|
| latest = dist / 'latest-bundle.txt' |
| latest.write_text(str(out.name) + '\n', encoding='utf-8') |
|
|
| report = Path('docs/RELEASE_BUNDLE_BUILD.md') |
| report.write_text( |
| '\n'.join([ |
| '# Release Bundle Build', |
| '', |
| f'- Output: `{out}`', |
| f'- Latest pointer: `dist/latest-bundle.txt`', |
| ]) + '\n', |
| encoding='utf-8' |
| ) |
|
|
| print(f'Built {out}') |
|
|
|
|
| if __name__ == '__main__': |
| main() |
|
|