compmodels-patch 2026.9.29.183230__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ """The pip route for a patch bundle (platform/portable/README.md "Updating: patch bundles" -> "Through PyPI").
2
+
3
+ The platform container reaches nothing but PyPI, so export_patch.sh wraps the patch tarball into this package
4
+ (``compmodels_patch/bundle/``) and publish_patch.sh uploads the wheel by hand. Inside the container:
5
+
6
+ pip install --no-cache-dir compmodels-patch==<version> && compmodels-patch apply
7
+
8
+ ``apply`` extracts the tarball into the workspace and runs the bundle's own patch.sh (the same guards, backup and
9
+ console restart as the tarball route). Nothing else of the platform code lives here.
10
+ """
@@ -0,0 +1,3 @@
1
+ from .cli import main
2
+
3
+ raise SystemExit(main())
@@ -0,0 +1 @@
1
+ 20260929T003841Z
@@ -0,0 +1,236 @@
1
+ M code/competition_models/README.md
2
+ A code/competition_models/configs-harness/track1.yaml
3
+ A code/competition_models/configs-harness/track3.yaml
4
+ A code/competition_models/configs-harness/track4.yaml
5
+ A code/competition_models/configs-harness/track5.yaml
6
+ A code/competition_models/configs-harness/track6.yaml
7
+ A code/competition_models/configs-harness/track7.yaml
8
+ A code/competition_models/configs-harness/track8.yaml
9
+ A code/competition_models/configs/track1.yaml
10
+ A code/competition_models/configs/track3.yaml
11
+ A code/competition_models/configs/track4.yaml
12
+ A code/competition_models/configs/track5.yaml
13
+ A code/competition_models/configs/track6.yaml
14
+ A code/competition_models/configs/track7.yaml
15
+ A code/competition_models/configs/track8.yaml
16
+ M code/competition_models/docs/04-output-contract.md
17
+ M code/competition_models/docs/06-platform-workflow.md
18
+ M code/competition_models/docs/07-open-questions.md
19
+ M code/competition_models/docs/08-build-order.md
20
+ M code/competition_models/docs/09-howto.md
21
+ M code/competition_models/docs/10-training-on-platform-data.md
22
+ M code/competition_models/docs/13-pretrained-model-inventory.md
23
+ M code/competition_models/docs/15-console-track-page.md
24
+ M code/competition_models/docs/17-track2-single-shot-training-plan.md
25
+ M code/competition_models/docs/18-track2-safety-pipeline.md
26
+ A code/competition_models/docs/19-track5-single-shot-training-plan.md
27
+ A code/competition_models/docs/20-track4-single-shot-training-plan.md
28
+ A code/competition_models/docs/21-track2-platform-runbook.md
29
+ A code/competition_models/docs/22-safety-all-tracks.md
30
+ A code/competition_models/docs/23-evaluation-rehearsal.md
31
+ A code/competition_models/docs/24-track8-single-shot-training-plan.md
32
+ A code/competition_models/docs/25-track7-single-shot-training-plan.md
33
+ M code/competition_models/docs/tracks/track1-ct-lung.md
34
+ M code/competition_models/docs/tracks/track3-cta-aneurysm.md
35
+ M code/competition_models/docs/tracks/track4-mri-glioma.md
36
+ M code/competition_models/docs/tracks/track5-mri-prostate.md
37
+ M code/competition_models/docs/tracks/track6-mammography.md
38
+ M code/competition_models/docs/tracks/track7-thyroid-ultrasound.md
39
+ M code/competition_models/docs/tracks/track8-chest-xray.md
40
+ A code/competition_models/mockdata/make_rehearsal.py
41
+ A code/competition_models/mockdata/make_t4_rehearsal.py
42
+ A code/competition_models/mockdata/make_t5_rehearsal.py
43
+ A code/competition_models/mockdata/make_t7_rehearsal.py
44
+ A code/competition_models/mockdata/make_t8_rehearsal.py
45
+ A code/competition_models/mockdata/rehearsal_specials.py
46
+ M code/competition_models/platform/Dockerfile.harness
47
+ M code/competition_models/platform/Dockerfile.train
48
+ M code/competition_models/platform/README.md
49
+ M code/competition_models/platform/console_start.sh
50
+ M code/competition_models/platform/h100/export_patch.sh
51
+ M code/competition_models/platform/h100/export_portable_bundle.sh
52
+ M code/competition_models/platform/h100/export_weights_bundle.sh
53
+ A code/competition_models/platform/h100/publish_patch.sh
54
+ M code/competition_models/platform/h100/run_console_h100.sh
55
+ A code/competition_models/platform/h100/run_finetune_track5_h100.sh
56
+ A code/competition_models/platform/h100/run_finetune_track7_h100.sh
57
+ A code/competition_models/platform/h100/run_finetune_track8_h100.sh
58
+ A code/competition_models/platform/h100/run_post_track5_h100.sh
59
+ A code/competition_models/platform/h100/run_post_track7_h100.sh
60
+ A code/competition_models/platform/h100/run_post_track8_h100.sh
61
+ M code/competition_models/platform/h100/run_prepare_track2_h100.sh
62
+ A code/competition_models/platform/h100/run_prepare_track4_h100.sh
63
+ A code/competition_models/platform/h100/run_prepare_track5_h100.sh
64
+ A code/competition_models/platform/h100/run_prepare_track7_h100.sh
65
+ A code/competition_models/platform/h100/run_prepare_track8_h100.sh
66
+ A code/competition_models/platform/h100/run_pretrain_track5_h100.sh
67
+ A code/competition_models/platform/h100/run_pretrain_track7_h100.sh
68
+ A code/competition_models/platform/h100/run_pretrain_track8_h100.sh
69
+ A code/competition_models/platform/h100/run_rehearsal_data_track4_h100.sh
70
+ A code/competition_models/platform/h100/run_rehearsal_data_track7_h100.sh
71
+ A code/competition_models/platform/h100/run_rehearsal_h100.sh
72
+ A code/competition_models/platform/h100/run_safety_h100.sh
73
+ A code/competition_models/platform/h100/run_safety_rehearsal_h100.sh
74
+ A code/competition_models/platform/h100/run_safety_track5_h100.sh
75
+ A code/competition_models/platform/h100/run_train_track4_h100.sh
76
+ A code/competition_models/platform/h100/t5dev.sh
77
+ A code/competition_models/platform/h100/t7dev.sh
78
+ A code/competition_models/platform/h100/t8dev.sh
79
+ M code/competition_models/platform/h100/weights_mounts.sh
80
+ M code/competition_models/platform/portable/README.md
81
+ A code/competition_models/platform/portable/compmodels_patch/__init__.py
82
+ A code/competition_models/platform/portable/compmodels_patch/__main__.py
83
+ A code/competition_models/platform/portable/compmodels_patch/cli.py
84
+ M code/competition_models/platform/portable/env.sh
85
+ M code/competition_models/platform/portable/install.sh
86
+ M code/competition_models/platform/portable/start.sh
87
+ A code/competition_models/platform/survey_public_models.py
88
+ M code/competition_models/pyproject.toml
89
+ M code/competition_models/src/compmodels/baselines/track4.py
90
+ M code/competition_models/src/compmodels/baselines/track5.py
91
+ M code/competition_models/src/compmodels/baselines/track7.py
92
+ M code/competition_models/src/compmodels/baselines/track8.py
93
+ M code/competition_models/src/compmodels/data/series_loader.py
94
+ A code/competition_models/src/compmodels/data/track4_table.py
95
+ A code/competition_models/src/compmodels/data/track5_table.py
96
+ A code/competition_models/src/compmodels/data/track7_table.py
97
+ A code/competition_models/src/compmodels/data/track8_table.py
98
+ M code/competition_models/src/compmodels/harness/anatomy_case.py
99
+ M code/competition_models/src/compmodels/harness/heads.py
100
+ M code/competition_models/src/compmodels/metrics/clinical/track4.py
101
+ M code/competition_models/src/compmodels/metrics/clinical/track5.py
102
+ M code/competition_models/src/compmodels/metrics/clinical/track7.py
103
+ M code/competition_models/src/compmodels/paths.py
104
+ A code/competition_models/src/compmodels/platform/rehearsal.py
105
+ M code/competition_models/src/compmodels/predict.py
106
+ A code/competition_models/src/compmodels/safety/anatomy_likelihood.py
107
+ A code/competition_models/src/compmodels/safety/brain.py
108
+ A code/competition_models/src/compmodels/safety/ct.py
109
+ M code/competition_models/src/compmodels/safety/fit.py
110
+ A code/competition_models/src/compmodels/safety/fit_profile.py
111
+ A code/competition_models/src/compmodels/safety/mr.py
112
+ A code/competition_models/src/compmodels/safety/planar.py
113
+ A code/competition_models/src/compmodels/safety/prepass.py
114
+ A code/competition_models/src/compmodels/safety/profiles.py
115
+ M code/competition_models/src/compmodels/schema/track7.py
116
+ M code/competition_models/src/compmodels/scoring/__main__.py
117
+ M code/competition_models/src/compmodels/scoring/split.py
118
+ M code/competition_models/src/compmodels/scoring/truth.py
119
+ A code/competition_models/src/compmodels/scoring/truth4.py
120
+ A code/competition_models/src/compmodels/scoring/truth_track5.py
121
+ A code/competition_models/src/compmodels/scoring/truth_track7.py
122
+ A code/competition_models/src/compmodels/scoring/truth_track8.py
123
+ A code/competition_models/src/compmodels/training/_t7prof.py
124
+ A code/competition_models/src/compmodels/training/anatomy_mr.py
125
+ M code/competition_models/src/compmodels/training/competition_data.py
126
+ M code/competition_models/src/compmodels/training/phases.py
127
+ M code/competition_models/src/compmodels/training/register.py
128
+ A code/competition_models/src/compmodels/training/safety_pipeline.py
129
+ A code/competition_models/src/compmodels/training/safety_summary.py
130
+ A code/competition_models/src/compmodels/training/sequences.py
131
+ M code/competition_models/src/compmodels/training/spacing.py
132
+ M code/competition_models/src/compmodels/training/track2_platform.py
133
+ M code/competition_models/src/compmodels/training/track2_prepare.py
134
+ M code/competition_models/src/compmodels/training/track2_safety.py
135
+ A code/competition_models/src/compmodels/training/track4_export.py
136
+ A code/competition_models/src/compmodels/training/track4_features.py
137
+ A code/competition_models/src/compmodels/training/track4_heads.py
138
+ A code/competition_models/src/compmodels/training/track4_platform.py
139
+ A code/competition_models/src/compmodels/training/track4_post.py
140
+ A code/competition_models/src/compmodels/training/track4_prepare.py
141
+ A code/competition_models/src/compmodels/training/track4_register.py
142
+ A code/competition_models/src/compmodels/training/track4_sequences.py
143
+ A code/competition_models/src/compmodels/training/track4_weights.py
144
+ A code/competition_models/src/compmodels/training/track5_bone.py
145
+ A code/competition_models/src/compmodels/training/track5_export.py
146
+ A code/competition_models/src/compmodels/training/track5_geometry.py
147
+ A code/competition_models/src/compmodels/training/track5_headb.py
148
+ A code/competition_models/src/compmodels/training/track5_heads.py
149
+ A code/competition_models/src/compmodels/training/track5_labels.py
150
+ A code/competition_models/src/compmodels/training/track5_oof.py
151
+ A code/competition_models/src/compmodels/training/track5_platform.py
152
+ A code/competition_models/src/compmodels/training/track5_post.py
153
+ A code/competition_models/src/compmodels/training/track5_predict.py
154
+ A code/competition_models/src/compmodels/training/track5_prepare.py
155
+ A code/competition_models/src/compmodels/training/track5_pretrain.py
156
+ A code/competition_models/src/compmodels/training/track5_trainer.py
157
+ A code/competition_models/src/compmodels/training/track7_cine.py
158
+ A code/competition_models/src/compmodels/training/track7_export.py
159
+ A code/competition_models/src/compmodels/training/track7_features.py
160
+ A code/competition_models/src/compmodels/training/track7_headb.py
161
+ A code/competition_models/src/compmodels/training/track7_heads.py
162
+ A code/competition_models/src/compmodels/training/track7_labels.py
163
+ A code/competition_models/src/compmodels/training/track7_oof.py
164
+ A code/competition_models/src/compmodels/training/track7_platform.py
165
+ A code/competition_models/src/compmodels/training/track7_post.py
166
+ A code/competition_models/src/compmodels/training/track7_predict.py
167
+ A code/competition_models/src/compmodels/training/track7_prepare.py
168
+ A code/competition_models/src/compmodels/training/track7_pretrain.py
169
+ A code/competition_models/src/compmodels/training/track7_seg.py
170
+ A code/competition_models/src/compmodels/training/track8_detector.py
171
+ A code/competition_models/src/compmodels/training/track8_export.py
172
+ A code/competition_models/src/compmodels/training/track8_features.py
173
+ A code/competition_models/src/compmodels/training/track8_heads.py
174
+ A code/competition_models/src/compmodels/training/track8_labels.py
175
+ A code/competition_models/src/compmodels/training/track8_oof.py
176
+ A code/competition_models/src/compmodels/training/track8_platform.py
177
+ A code/competition_models/src/compmodels/training/track8_post.py
178
+ A code/competition_models/src/compmodels/training/track8_predict.py
179
+ A code/competition_models/src/compmodels/training/track8_prepare.py
180
+ A code/competition_models/src/compmodels/training/track8_pretrain.py
181
+ M console/apps/server/src/competition/browse.ts
182
+ M console/apps/server/src/competition/extractArchive.ts
183
+ A console/apps/server/src/competition/fixtures/track4_prepare_report.json
184
+ M console/apps/server/src/competition/harness.ts
185
+ M console/apps/server/src/competition/jobProcess.ts
186
+ M console/apps/server/src/competition/jobs.ts
187
+ M console/apps/server/src/competition/localJobs.ts
188
+ M console/apps/server/src/competition/modelPaths.ts
189
+ M console/apps/server/src/competition/outputs.ts
190
+ M console/apps/server/src/competition/pipeline.ts
191
+ M console/apps/server/src/competition/prepare.ts
192
+ A console/apps/server/src/competition/prepared.ts
193
+ M console/apps/server/src/competition/probeProgress.ts
194
+ M console/apps/server/src/competition/probeReport.ts
195
+ M console/apps/server/src/competition/progress.ts
196
+ A console/apps/server/src/competition/rehearsals.ts
197
+ M console/apps/server/src/competition/safety.ts
198
+ M console/apps/server/src/competition/scores.ts
199
+ M console/apps/server/src/competition/specialCases.ts
200
+ A console/apps/server/src/competition/trackDriverPipeline.ts
201
+ M console/apps/server/src/competition/training.ts
202
+ M console/apps/server/src/routes/competition.ts
203
+ A console/apps/server/src/routes/competitionPrepared.ts
204
+ M console/apps/server/src/routes/competitionViewer.ts
205
+ A console/apps/web/dist/assets/Texture-BDBiyj7t.js
206
+ D console/apps/web/dist/assets/Texture-CenTc2Bu.js
207
+ A console/apps/web/dist/assets/imageRetrievalPoolManager-C-uhZnDB.js
208
+ D console/apps/web/dist/assets/imageRetrievalPoolManager-CmISnr5d.js
209
+ D console/apps/web/dist/assets/index-9gf4Kb5W.js
210
+ D console/apps/web/dist/assets/index-B2OHvcio.css
211
+ D console/apps/web/dist/assets/index-B8gysun8.js
212
+ D console/apps/web/dist/assets/index-BMej_LUd.js
213
+ A console/apps/web/dist/assets/index-BvooWC8_.js
214
+ D console/apps/web/dist/assets/index-BznelDSM.js
215
+ A console/apps/web/dist/assets/index-CA2Bnay2.js
216
+ A console/apps/web/dist/assets/index-CR9Lt3gX.js
217
+ D console/apps/web/dist/assets/index-Co51RzS_.js
218
+ A console/apps/web/dist/assets/index-DGZ2rzpT.css
219
+ A console/apps/web/dist/assets/index-DO7mCZzg.js
220
+ D console/apps/web/dist/assets/index-GTZbUmPy.js
221
+ D console/apps/web/dist/assets/index-PrsPYhBy.js
222
+ A console/apps/web/dist/assets/index-ShI32SvU.js
223
+ A console/apps/web/dist/assets/index-boZNwP3m.js
224
+ A console/apps/web/dist/assets/index-iVKjLIhr.js
225
+ M console/apps/web/dist/index.html
226
+ M console/docs/API.md
227
+ M console/notebooks/.mie/context.json
228
+ M console/packages/shared/src/competition.ts
229
+ M console/packages/shared/src/competitionPrepare.ts
230
+ A console/packages/shared/src/competitionPrepared.ts
231
+ A console/packages/shared/src/competitionRehearsal.ts
232
+ M console/packages/shared/src/competitionSafety.ts
233
+ A console/packages/shared/src/competitionTrackDrivers.ts
234
+ A console/packages/shared/src/competitionTrackJobs.ts
235
+ M console/packages/shared/src/index.ts
236
+ M start.sh
@@ -0,0 +1 @@
1
+ 20260929T183230Z
@@ -0,0 +1,167 @@
1
+ """``compmodels-patch`` (also ``python -m compmodels_patch``): info | extract | apply | rollback.
2
+
3
+ The wheel carries, under ``compmodels_patch/bundle/``: ``compmodels-track2-patch-<stamp>.tar.gz`` (the very tarball
4
+ export_patch.sh makes), ``PATCH_STAMP``, ``BASE_STAMP`` and ``CHANGED.txt`` (copies, so ``info`` needs no extraction).
5
+ The workspace defaults to $COMP_WORKSPACE, else /2026aicompetition/workspace, else the current directory.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ import os
11
+ import re
12
+ import subprocess
13
+ import sys
14
+ import tarfile
15
+ from importlib import resources
16
+ from pathlib import Path
17
+
18
+ DEFAULT_WORKSPACE = "/2026aicompetition/workspace"
19
+ STAMP_RE = re.compile(r"^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z$")
20
+
21
+
22
+ def stamp_to_version(stamp: str) -> str:
23
+ """UTC bundle stamp -> PEP 440 version that sorts like the stamp: 20260929T093040Z -> 2026.9.29.93040."""
24
+ m = STAMP_RE.match(stamp.strip())
25
+ if not m:
26
+ raise ValueError(f"not a bundle stamp: {stamp!r}")
27
+ y, mo, d, hh, mm, ss = m.groups()
28
+ return f"{int(y)}.{int(mo)}.{int(d)}.{int(hh + mm + ss)}"
29
+
30
+
31
+ def version_to_stamp(version: str) -> str:
32
+ """Inverse of stamp_to_version: 2026.9.29.93040 -> 20260929T093040Z."""
33
+ parts = version.strip().split(".")
34
+ if len(parts) != 4 or not all(p.isdigit() for p in parts):
35
+ raise ValueError(f"not a patch version: {version!r}")
36
+ y, mo, d, t = (int(p) for p in parts)
37
+ return f"{y:04d}{mo:02d}{d:02d}T{t:06d}Z"
38
+
39
+
40
+ def bundle_dir(root: Path | None = None) -> Path:
41
+ if root is not None:
42
+ return root
43
+ return Path(str(resources.files(__package__) / "bundle"))
44
+
45
+
46
+ def read(root: Path, name: str, default: str = "") -> str:
47
+ p = root / name
48
+ return p.read_text().strip() if p.exists() else default
49
+
50
+
51
+ def tarball(root: Path) -> Path:
52
+ tars = sorted(root.glob("*.tar.gz"))
53
+ if len(tars) != 1:
54
+ raise SystemExit(f"[compmodels-patch] expected one tarball in {root}, found {len(tars)}")
55
+ return tars[0]
56
+
57
+
58
+ def workspace(arg: str | None) -> Path:
59
+ if arg:
60
+ return Path(arg)
61
+ env = os.environ.get("COMP_WORKSPACE")
62
+ if env:
63
+ return Path(env)
64
+ return Path(DEFAULT_WORKSPACE) if Path(DEFAULT_WORKSPACE).is_dir() else Path.cwd()
65
+
66
+
67
+ def say(*a: object) -> None:
68
+ print("[compmodels-patch]", *a, flush=True)
69
+
70
+
71
+ def cmd_info(args: argparse.Namespace, root: Path) -> int:
72
+ stamp, base = read(root, "PATCH_STAMP", "unknown"), read(root, "BASE_STAMP", "unknown")
73
+ tar = tarball(root)
74
+ changed = [l for l in read(root, "CHANGED.txt").splitlines() if l.strip()]
75
+ print(f"patch {stamp} (version {stamp_to_version(stamp) if STAMP_RE.match(stamp) else '?'}) made against full bundle {base}")
76
+ print(f"tarball {tar.name}: {tar.stat().st_size} bytes")
77
+ n = {k: sum(1 for l in changed if l.startswith(k + " ")) for k in "AMD"}
78
+ print(f"CHANGED.txt: {len(changed)} files ({n['A']} added, {n['M']} modified, {n['D']} removed)")
79
+ if args.changed:
80
+ for l in changed:
81
+ print(" ", l)
82
+ else:
83
+ for l in changed[:20]:
84
+ print(" ", l)
85
+ if len(changed) > 20:
86
+ print(f" ... ({len(changed) - 20} more: compmodels-patch info --changed)")
87
+ return 0
88
+
89
+
90
+ def extract(root: Path, into: Path) -> Path:
91
+ stamp = read(root, "PATCH_STAMP", "unknown")
92
+ tar = tarball(root)
93
+ into.mkdir(parents=True, exist_ok=True)
94
+ with tarfile.open(tar) as t:
95
+ top = {m.name.split("/", 1)[0] for m in t.getmembers()}
96
+ if len(top) != 1 or any(".." in m.name or m.name.startswith("/") for m in t.getmembers()):
97
+ raise SystemExit(f"[compmodels-patch] refusing {tar.name}: not a single-folder bundle")
98
+ (folder,) = top
99
+ if hasattr(tarfile, "data_filter"):
100
+ t.extractall(into, filter="data")
101
+ else: # Python < 3.12
102
+ t.extractall(into)
103
+ out = into / folder
104
+ if not (out / "patch.sh").exists():
105
+ raise SystemExit(f"[compmodels-patch] {out} has no patch.sh: not a patch bundle")
106
+ say(f"extracted patch {stamp} -> {out}")
107
+ return out
108
+
109
+
110
+ def cmd_extract(args: argparse.Namespace, root: Path) -> int:
111
+ print(extract(root, workspace(args.into)))
112
+ return 0
113
+
114
+
115
+ def cmd_apply(args: argparse.Namespace, root: Path) -> int:
116
+ folder = extract(root, workspace(args.into))
117
+ cmd = ["bash", str(folder / "patch.sh")] + (["--force"] if args.force else []) + (["--no-restart"] if args.no_restart else [])
118
+ say("running", " ".join(cmd))
119
+ return subprocess.call(cmd)
120
+
121
+
122
+ def cmd_rollback(args: argparse.Namespace, root: Path) -> int:
123
+ code = Path(os.environ.get("COMP_CODE_DIR", "/opt/compmodels"))
124
+ script = code / "platform" / "portable" / "patch.sh"
125
+ if not script.exists():
126
+ script = extract(root, workspace(args.into)) / "patch.sh"
127
+ cmd = ["bash", str(script), "--rollback"] + (["--force"] if args.force else []) + (["--no-restart"] if args.no_restart else [])
128
+ say("running", " ".join(cmd))
129
+ return subprocess.call(cmd)
130
+
131
+
132
+ def build_parser() -> argparse.ArgumentParser:
133
+ p = argparse.ArgumentParser(prog="compmodels-patch", description=__doc__.split("\n\n")[0])
134
+ p.add_argument("--bundle-dir", help=argparse.SUPPRESS) # tests: a directory instead of the packaged bundle/
135
+ sub = p.add_subparsers(dest="cmd", required=True)
136
+ s = sub.add_parser("info", help="stamp, base bundle, size and CHANGED.txt of the packaged patch")
137
+ s.add_argument("--changed", action="store_true", help="list every changed file")
138
+ s.set_defaults(fn=cmd_info)
139
+ for name, fn, h in (
140
+ ("extract", cmd_extract, "extract the tarball into the workspace (prints the folder), nothing applied"),
141
+ ("apply", cmd_apply, "extract and run the bundle's patch.sh (guards, backup, console restart as usual)"),
142
+ ("rollback", cmd_rollback, "run patch.sh --rollback (the installed one, else the bundle's)"),
143
+ ):
144
+ s = sub.add_parser(name, help=h)
145
+ s.add_argument("--into", help=f"workspace directory (default $COMP_WORKSPACE, else {DEFAULT_WORKSPACE}, else .)")
146
+ if name != "extract":
147
+ s.add_argument("--force", action="store_true", help="passed to patch.sh")
148
+ s.add_argument("--no-restart", action="store_true", help="passed to patch.sh")
149
+ s.set_defaults(fn=fn)
150
+ return p
151
+
152
+
153
+ def main(argv: list[str] | None = None) -> int:
154
+ args = build_parser().parse_args(argv)
155
+ root = bundle_dir(Path(args.bundle_dir) if args.bundle_dir else None)
156
+ if not root.is_dir():
157
+ say(f"no bundle directory {root}: this wheel was not built by export_patch.sh")
158
+ return 2
159
+ try:
160
+ return int(args.fn(args, root) or 0)
161
+ except BrokenPipeError: # `compmodels-patch info | head`
162
+ os.dup2(os.open(os.devnull, os.O_WRONLY), sys.stdout.fileno())
163
+ return 0
164
+
165
+
166
+ if __name__ == "__main__":
167
+ sys.exit(main())
@@ -0,0 +1,12 @@
1
+ Metadata-Version: 2.4
2
+ Name: compmodels-patch
3
+ Version: 2026.9.29.183230
4
+ Summary: compmodels platform patch 20260929T183230Z against bundle 20260929T003841Z: pip install, then compmodels-patch apply
5
+ Requires-Python: >=3.10
6
+ Description-Content-Type: text/markdown
7
+
8
+ # compmodels-patch 2026.9.29.183230
9
+
10
+ Patch 20260929T183230Z of the compmodels platform bundle, made against the full bundle 20260929T003841Z (236 changed files). Inside the
11
+ platform container: `compmodels-patch info` lists the changed files, `compmodels-patch apply` extracts the bundle
12
+ into the workspace and runs its patch.sh, `compmodels-patch rollback` undoes the newest patch.
@@ -0,0 +1,12 @@
1
+ compmodels_patch/__init__.py,sha256=awtnBGqeb8xyOP6FiOzlMdVIZhY3Vixa0TRZ2IG_Jwg,613
2
+ compmodels_patch/__main__.py,sha256=k1ocEWawweo1qCJWNFAAvyxz3tcY13dzvCenHszij30,48
3
+ compmodels_patch/cli.py,sha256=W_4kOPPvUwOBw5YGK5AiEWFMSSukgxznEysI69F5JU4,6843
4
+ compmodels_patch/bundle/BASE_STAMP,sha256=bUz2VAx5sWHIycDIBrwBG-UlEXgI3lEpFNpsMvEJJCI,17
5
+ compmodels_patch/bundle/CHANGED.txt,sha256=at4hjMQuLUQAOI-0riG2rvoHFx6laFU9TnERHeallbI,13885
6
+ compmodels_patch/bundle/PATCH_STAMP,sha256=DbwrkRXS5oXawTL849NOjGmvP0_eGiJtPmmEZdlzKKo,17
7
+ compmodels_patch/bundle/compmodels-track2-patch-20260929T183230Z.tar.gz,sha256=rkWEPlGXHEQJ_zNs06-dZuGN75_EAD1SgA1rXROKL6Y,13643367
8
+ compmodels_patch-2026.9.29.183230.dist-info/METADATA,sha256=iZu-iJEcTZLwrRmd35djG2IpW--SZyBfCl6XP3jPwVY,644
9
+ compmodels_patch-2026.9.29.183230.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
10
+ compmodels_patch-2026.9.29.183230.dist-info/entry_points.txt,sha256=3gHE36rxSEJfi15c2GE3L6_vDXc_RhPr4TWCaO9Nlco,63
11
+ compmodels_patch-2026.9.29.183230.dist-info/top_level.txt,sha256=Jq7wctPwDYMQcRywMQqixv0UFxXdvdZAfmnkOOAFzKw,17
12
+ compmodels_patch-2026.9.29.183230.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (79.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ compmodels-patch = compmodels_patch.cli:main
@@ -0,0 +1 @@
1
+ compmodels_patch