gpu-compute-provider 0.4.2__tar.gz
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.
- gpu_compute_provider-0.4.2/CHANGELOG.md +452 -0
- gpu_compute_provider-0.4.2/CONTRIBUTING.md +37 -0
- gpu_compute_provider-0.4.2/LICENSE +202 -0
- gpu_compute_provider-0.4.2/MANIFEST.in +8 -0
- gpu_compute_provider-0.4.2/NOTICE +4 -0
- gpu_compute_provider-0.4.2/PKG-INFO +310 -0
- gpu_compute_provider-0.4.2/README.md +274 -0
- gpu_compute_provider-0.4.2/SKILL.md +1565 -0
- gpu_compute_provider-0.4.2/pyproject.toml +77 -0
- gpu_compute_provider-0.4.2/setup.cfg +4 -0
- gpu_compute_provider-0.4.2/src/gpu_compute_provider.egg-info/PKG-INFO +310 -0
- gpu_compute_provider-0.4.2/src/gpu_compute_provider.egg-info/SOURCES.txt +185 -0
- gpu_compute_provider-0.4.2/src/gpu_compute_provider.egg-info/dependency_links.txt +1 -0
- gpu_compute_provider-0.4.2/src/gpu_compute_provider.egg-info/entry_points.txt +2 -0
- gpu_compute_provider-0.4.2/src/gpu_compute_provider.egg-info/requires.txt +9 -0
- gpu_compute_provider-0.4.2/src/gpu_compute_provider.egg-info/top_level.txt +1 -0
- gpu_compute_provider-0.4.2/src/supercomputer/SKILL.md +1565 -0
- gpu_compute_provider-0.4.2/src/supercomputer/__init__.py +110 -0
- gpu_compute_provider-0.4.2/src/supercomputer/__main__.py +153 -0
- gpu_compute_provider-0.4.2/src/supercomputer/_direct_bridge.py +1882 -0
- gpu_compute_provider-0.4.2/src/supercomputer/_modal_runner.py +101 -0
- gpu_compute_provider-0.4.2/src/supercomputer/_quiet.py +9 -0
- gpu_compute_provider-0.4.2/src/supercomputer/autoresearch/SETUP.md +67 -0
- gpu_compute_provider-0.4.2/src/supercomputer/autoresearch/program.template.md +159 -0
- gpu_compute_provider-0.4.2/src/supercomputer/billing_types.py +298 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/__init__.py +27 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/attach.py +251 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/autoresearch.py +36 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/common.py +499 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/config_cmd.py +131 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/console.py +226 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/context.py +251 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/credits.py +283 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/credits_buy.py +115 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/credits_render.py +133 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/exec_cmd.py +100 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/files.py +321 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/hardware.py +94 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/help.py +163 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/interactive.py +148 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/job.py +235 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/job_wait.py +170 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/main.py +237 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/migration.py +590 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/mount.py +150 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/output.py +45 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/processes.py +602 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/registry.py +28 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/run.py +542 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/sessions.py +829 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/setup.py +100 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/ssh.py +257 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/stop_outcome.py +158 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/sweep.py +1059 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/sweep_harvest.py +206 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/sweep_watch.py +175 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/usage.py +69 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/volume.py +323 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli/wait.py +325 -0
- gpu_compute_provider-0.4.2/src/supercomputer/cli_args.py +369 -0
- gpu_compute_provider-0.4.2/src/supercomputer/client.py +718 -0
- gpu_compute_provider-0.4.2/src/supercomputer/client_billing.py +112 -0
- gpu_compute_provider-0.4.2/src/supercomputer/client_projects.py +52 -0
- gpu_compute_provider-0.4.2/src/supercomputer/client_sessions.py +111 -0
- gpu_compute_provider-0.4.2/src/supercomputer/client_volumes.py +80 -0
- gpu_compute_provider-0.4.2/src/supercomputer/config.py +553 -0
- gpu_compute_provider-0.4.2/src/supercomputer/direct.py +576 -0
- gpu_compute_provider-0.4.2/src/supercomputer/errors.py +153 -0
- gpu_compute_provider-0.4.2/src/supercomputer/fileset.py +170 -0
- gpu_compute_provider-0.4.2/src/supercomputer/image.py +532 -0
- gpu_compute_provider-0.4.2/src/supercomputer/job.py +260 -0
- gpu_compute_provider-0.4.2/src/supercomputer/log_cursor.py +66 -0
- gpu_compute_provider-0.4.2/src/supercomputer/login.py +236 -0
- gpu_compute_provider-0.4.2/src/supercomputer/modal_compat.py +307 -0
- gpu_compute_provider-0.4.2/src/supercomputer/modal_objects.py +156 -0
- gpu_compute_provider-0.4.2/src/supercomputer/modal_run.py +93 -0
- gpu_compute_provider-0.4.2/src/supercomputer/process_input.py +67 -0
- gpu_compute_provider-0.4.2/src/supercomputer/providers/__init__.py +5 -0
- gpu_compute_provider-0.4.2/src/supercomputer/providers/requests_http.py +68 -0
- gpu_compute_provider-0.4.2/src/supercomputer/py.typed +0 -0
- gpu_compute_provider-0.4.2/src/supercomputer/session.py +474 -0
- gpu_compute_provider-0.4.2/src/supercomputer/setup_cmd.py +255 -0
- gpu_compute_provider-0.4.2/src/supercomputer/shell.py +569 -0
- gpu_compute_provider-0.4.2/src/supercomputer/sku_names.py +110 -0
- gpu_compute_provider-0.4.2/src/supercomputer/sweeps.py +608 -0
- gpu_compute_provider-0.4.2/src/supercomputer/tunnel.py +198 -0
- gpu_compute_provider-0.4.2/src/supercomputer/tunnel_relay.py +42 -0
- gpu_compute_provider-0.4.2/src/supercomputer/types.py +362 -0
- gpu_compute_provider-0.4.2/src/supercomputer/v2_connect.py +1117 -0
- gpu_compute_provider-0.4.2/src/supercomputer/verified_fetch.py +126 -0
- gpu_compute_provider-0.4.2/src/supercomputer/version.py +33 -0
- gpu_compute_provider-0.4.2/src/supercomputer/volume_wait.py +131 -0
- gpu_compute_provider-0.4.2/src/supercomputer/volumes.py +224 -0
- gpu_compute_provider-0.4.2/tests/conftest.py +86 -0
- gpu_compute_provider-0.4.2/tests/test_autoresearch.py +21 -0
- gpu_compute_provider-0.4.2/tests/test_billing_types.py +93 -0
- gpu_compute_provider-0.4.2/tests/test_blob_put_retry.py +91 -0
- gpu_compute_provider-0.4.2/tests/test_checkpoint_option.py +405 -0
- gpu_compute_provider-0.4.2/tests/test_cli_args.py +237 -0
- gpu_compute_provider-0.4.2/tests/test_cli_dispatch.py +131 -0
- gpu_compute_provider-0.4.2/tests/test_cli_guards.py +60 -0
- gpu_compute_provider-0.4.2/tests/test_cli_help.py +166 -0
- gpu_compute_provider-0.4.2/tests/test_cli_sync.py +49 -0
- gpu_compute_provider-0.4.2/tests/test_client.py +800 -0
- gpu_compute_provider-0.4.2/tests/test_client_contracts_c.py +301 -0
- gpu_compute_provider-0.4.2/tests/test_client_host_frames_contract.py +46 -0
- gpu_compute_provider-0.4.2/tests/test_client_http_contract.py +128 -0
- gpu_compute_provider-0.4.2/tests/test_client_telemetry.py +150 -0
- gpu_compute_provider-0.4.2/tests/test_config.py +229 -0
- gpu_compute_provider-0.4.2/tests/test_config_cmd.py +80 -0
- gpu_compute_provider-0.4.2/tests/test_credit_preflight.py +103 -0
- gpu_compute_provider-0.4.2/tests/test_credits_cli.py +450 -0
- gpu_compute_provider-0.4.2/tests/test_credits_errors.py +106 -0
- gpu_compute_provider-0.4.2/tests/test_default_image.py +260 -0
- gpu_compute_provider-0.4.2/tests/test_direct_bridge.py +1322 -0
- gpu_compute_provider-0.4.2/tests/test_direct_fake_host.py +332 -0
- gpu_compute_provider-0.4.2/tests/test_dotenv_precedence.py +324 -0
- gpu_compute_provider-0.4.2/tests/test_download_directory.py +84 -0
- gpu_compute_provider-0.4.2/tests/test_download_integrity.py +198 -0
- gpu_compute_provider-0.4.2/tests/test_download_promotion_retry.py +95 -0
- gpu_compute_provider-0.4.2/tests/test_download_volume_hint.py +59 -0
- gpu_compute_provider-0.4.2/tests/test_emit_pid.py +44 -0
- gpu_compute_provider-0.4.2/tests/test_exec_attach_retry.py +204 -0
- gpu_compute_provider-0.4.2/tests/test_fileset.py +109 -0
- gpu_compute_provider-0.4.2/tests/test_first_run_login.py +80 -0
- gpu_compute_provider-0.4.2/tests/test_job.py +248 -0
- gpu_compute_provider-0.4.2/tests/test_job_ls.py +99 -0
- gpu_compute_provider-0.4.2/tests/test_job_run_retry_workspace.py +172 -0
- gpu_compute_provider-0.4.2/tests/test_job_wait_exit_code.py +207 -0
- gpu_compute_provider-0.4.2/tests/test_kill_records_first.py +236 -0
- gpu_compute_provider-0.4.2/tests/test_log_cursor.py +75 -0
- gpu_compute_provider-0.4.2/tests/test_login.py +203 -0
- gpu_compute_provider-0.4.2/tests/test_logs_unknown_pid.py +84 -0
- gpu_compute_provider-0.4.2/tests/test_map_bake_flag.py +26 -0
- gpu_compute_provider-0.4.2/tests/test_map_dag.py +40 -0
- gpu_compute_provider-0.4.2/tests/test_map_default_image.py +52 -0
- gpu_compute_provider-0.4.2/tests/test_map_window_flags.py +40 -0
- gpu_compute_provider-0.4.2/tests/test_modal_compat.py +189 -0
- gpu_compute_provider-0.4.2/tests/test_no_resume_gate.py +48 -0
- gpu_compute_provider-0.4.2/tests/test_placement_pin_forbidden.py +35 -0
- gpu_compute_provider-0.4.2/tests/test_process_input.py +146 -0
- gpu_compute_provider-0.4.2/tests/test_progress_narration.py +253 -0
- gpu_compute_provider-0.4.2/tests/test_provider_env_default.py +116 -0
- gpu_compute_provider-0.4.2/tests/test_queue_restart_wait.py +38 -0
- gpu_compute_provider-0.4.2/tests/test_queue_timeout_message.py +56 -0
- gpu_compute_provider-0.4.2/tests/test_queued_reason_render.py +196 -0
- gpu_compute_provider-0.4.2/tests/test_rate_limit_ride.py +88 -0
- gpu_compute_provider-0.4.2/tests/test_ready_wait_host_loss.py +266 -0
- gpu_compute_provider-0.4.2/tests/test_rebuild_respawn.py +96 -0
- gpu_compute_provider-0.4.2/tests/test_resume_volume_validation.py +86 -0
- gpu_compute_provider-0.4.2/tests/test_ride_cap.py +94 -0
- gpu_compute_provider-0.4.2/tests/test_run_migration.py +250 -0
- gpu_compute_provider-0.4.2/tests/test_run_retries.py +53 -0
- gpu_compute_provider-0.4.2/tests/test_run_retry_policy.py +118 -0
- gpu_compute_provider-0.4.2/tests/test_run_volume_collision.py +74 -0
- gpu_compute_provider-0.4.2/tests/test_run_wait_flags.py +70 -0
- gpu_compute_provider-0.4.2/tests/test_secret_resolution.py +95 -0
- gpu_compute_provider-0.4.2/tests/test_session_truth.py +242 -0
- gpu_compute_provider-0.4.2/tests/test_sessions_live_statuses.py +178 -0
- gpu_compute_provider-0.4.2/tests/test_sessions_point_lookup.py +74 -0
- gpu_compute_provider-0.4.2/tests/test_setup_cmd.py +79 -0
- gpu_compute_provider-0.4.2/tests/test_shell_env.py +15 -0
- gpu_compute_provider-0.4.2/tests/test_shell_interrupt.py +33 -0
- gpu_compute_provider-0.4.2/tests/test_shell_volumes.py +147 -0
- gpu_compute_provider-0.4.2/tests/test_sku_names.py +129 -0
- gpu_compute_provider-0.4.2/tests/test_skus.py +174 -0
- gpu_compute_provider-0.4.2/tests/test_spend.py +203 -0
- gpu_compute_provider-0.4.2/tests/test_stop_refused_classification.py +97 -0
- gpu_compute_provider-0.4.2/tests/test_stop_truth.py +277 -0
- gpu_compute_provider-0.4.2/tests/test_sweep_boost.py +53 -0
- gpu_compute_provider-0.4.2/tests/test_sweep_cost_optin.py +39 -0
- gpu_compute_provider-0.4.2/tests/test_sweep_harvest.py +243 -0
- gpu_compute_provider-0.4.2/tests/test_sweep_lifecycle_ux.py +526 -0
- gpu_compute_provider-0.4.2/tests/test_sweep_retry_and_kill_truth.py +126 -0
- gpu_compute_provider-0.4.2/tests/test_sweep_status_view.py +91 -0
- gpu_compute_provider-0.4.2/tests/test_sweeps_binding.py +133 -0
- gpu_compute_provider-0.4.2/tests/test_tunnel.py +176 -0
- gpu_compute_provider-0.4.2/tests/test_types.py +168 -0
- gpu_compute_provider-0.4.2/tests/test_upload_blob_path.py +266 -0
- gpu_compute_provider-0.4.2/tests/test_v2_connect.py +652 -0
- gpu_compute_provider-0.4.2/tests/test_v2_connect_billing.py +52 -0
- gpu_compute_provider-0.4.2/tests/test_volume_cli_hardening.py +240 -0
- gpu_compute_provider-0.4.2/tests/test_volume_download_delete.py +212 -0
- gpu_compute_provider-0.4.2/tests/test_volume_preflight.py +61 -0
- gpu_compute_provider-0.4.2/tests/test_volume_resolution.py +51 -0
- gpu_compute_provider-0.4.2/tests/test_volume_wait.py +138 -0
- gpu_compute_provider-0.4.2/tests/test_wait.py +440 -0
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to the `supercomputer` Python SDK and CLI are recorded here.
|
|
4
|
+
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
|
|
5
|
+
versions follow [Semantic Versioning](https://semver.org/).
|
|
6
|
+
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
- The PyPI distribution is now **gpu-compute-provider**: `pip install gpu-compute-provider`.
|
|
11
|
+
The import path (`import supercomputer`) and the `super` CLI are unchanged.
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
- `super sweep status --cost` now prints the spend rollup in human output
|
|
15
|
+
(`cost: $X.XX across N session(s) (all attempts)`). It was fetched and
|
|
16
|
+
then dropped, so only `--json` showed what a sweep had cost (#91).
|
|
17
|
+
- A host that dies while it builds a session no longer parks the client for the
|
|
18
|
+
30-minute ready wait: the lost connection wakes the wait, and `create`/attach
|
|
19
|
+
go back to the dispatcher for the requeued session (up to twice).
|
|
20
|
+
- `super job wait <id>` on an ephemeral job exits with the exit code of the
|
|
21
|
+
job's own command — its first spawn, not a later `super exec --on <id>` —
|
|
22
|
+
(`69` host lost, `75` still running at `--timeout`, `1` when nothing recorded
|
|
23
|
+
says it succeeded) instead of `0` for any closed session. `--json` adds
|
|
24
|
+
`termination`.
|
|
25
|
+
- `super job wait <id>` right after `super job run --detach` (or a `job kill`)
|
|
26
|
+
waits up to 15s for the host to record the job's process instead of exiting
|
|
27
|
+
`1` with "no process to wait for". If none ever shows up, `--json` now prints
|
|
28
|
+
a `job_no_process` error object; before, it printed nothing.
|
|
29
|
+
- `super stop` no longer says "files kept" before teardown has run, and says
|
|
30
|
+
billing stopped when the stop was accepted. `super stop --wait` reports a
|
|
31
|
+
failed final save when the server records one for this stop: it compares the
|
|
32
|
+
session's `state_loss_reason`/`state_loss_at` before and after, and exits `1`
|
|
33
|
+
naming `close_flush_incomplete` (the final sync did not finish) or
|
|
34
|
+
`volume_commit_failed` only when that stamp is new. A state loss recorded
|
|
35
|
+
earlier is mentioned, not failed; `--json` adds `state_loss_reason` and
|
|
36
|
+
`state_loss_at`. A session that ends failed/dead during the stop also exits
|
|
37
|
+
`1`; one that had already ended that way does not.
|
|
38
|
+
`super job kill` follows the same rule.
|
|
39
|
+
- `super sessions` no longer counts a `stopping` session in "Spending now", and
|
|
40
|
+
never shows a non-billable interval's price as a rate.
|
|
41
|
+
- `super job run --retries`: a retry after a lost box re-attaches to a cold
|
|
42
|
+
(closed) session and its `/workspace` instead of starting a new, empty one.
|
|
43
|
+
When the session failed or died the retry still needs a new session, and
|
|
44
|
+
stderr now says its `/workspace` starts empty. A session closed on request
|
|
45
|
+
(`super job kill`, `super stop`) is never resumed or re-run by a retry.
|
|
46
|
+
- Downloads are checked against the file's SHA-256 (live-session blob reference,
|
|
47
|
+
session manifest) and a failed or corrupt GET is fetched once more. The
|
|
48
|
+
manifest hash is re-read once on a mismatch, since a live session's manifest
|
|
49
|
+
moves; `super sweep harvest` checks each file against its listing's hash.
|
|
50
|
+
- After a host loss during attach, the session reports the host it is on now,
|
|
51
|
+
so a reconnect is no longer announced as "same host" for a session that moved.
|
|
52
|
+
- A large upload's pre-signed PUT is retried (three attempts) on a dropped
|
|
53
|
+
connection or a store 5xx.
|
|
54
|
+
- `super --help`: a `super job run` saves `/workspace`; several sessions may
|
|
55
|
+
attach one volume at once (last writer wins per file).
|
|
56
|
+
- `super sweep retry` after a canary failure reports that the canary runs first
|
|
57
|
+
(the dispatcher now re-queues the fan-out behind it).
|
|
58
|
+
- `super upload` (and `session.upload`) now preserves file permission bits:
|
|
59
|
+
an uploaded `0755` script lands executable instead of `0644`, so `./run.sh`
|
|
60
|
+
works without `chmod +x` or `bash run.sh` (#45). Both the inline and the
|
|
61
|
+
large-file blob route send the local mode; hosts that predate the field
|
|
62
|
+
still write `0644`.
|
|
63
|
+
|
|
64
|
+
### Added
|
|
65
|
+
- `super skus` shows a `$/HR` column and `super skus --json` fills `cost_per_hr`
|
|
66
|
+
with the rate each SKU was most recently billed at, stamped by `cost_as_of`.
|
|
67
|
+
It is an observed spot rate, not a list price; a SKU not billed in the last
|
|
68
|
+
7 days stays `null` / `-`. (#44)
|
|
69
|
+
|
|
70
|
+
### Changed
|
|
71
|
+
- `super run --retries N` pauses before each re-run (2s, 4s, … capped at 30s)
|
|
72
|
+
and skips re-runs that cannot change the outcome: exit `126`/`127` and an
|
|
73
|
+
OOM kill. Other non-zero exits are re-run as before.
|
|
74
|
+
- Installed agent skill files (`~/.claude|.cursor|.codex/skills/supercomputer/SKILL.md`)
|
|
75
|
+
are refreshed on every `super` invocation when the packaged copy changes, so
|
|
76
|
+
upgrading the package also upgrades the skill. Only files `super` wrote are
|
|
77
|
+
touched; the file now carries a "managed by super" note since edits are overwritten.
|
|
78
|
+
- Reads short SKU names, which the dispatcher serves once `SUPERCOMPUTER_PUBLIC_SKU_NAMES=short` is set for this release: the GPU model for one GPU (`l4`, `h100`,
|
|
79
|
+
`rtx_pro_6000`), `<N>x_<model>` for several (`8x_h100`, `4x_l40s`), `cpu` for
|
|
80
|
+
the default CPU-only box and `<N>x_cpu` for larger ones. The API, `super skus`,
|
|
81
|
+
session listings and progress lines show the short names. The long names
|
|
82
|
+
(`gpu_1x_l4`, `gpu_8x_h100`, `cpu_2x_epyc`, `cpu_generic`) are still accepted
|
|
83
|
+
everywhere a SKU is given (`--sku`, `supercomputer.json`, `project.session(sku=)`),
|
|
84
|
+
and the SDK treats both spellings alike when choosing the default image and the
|
|
85
|
+
torch wheel index. CLI help, examples and the agent skill use the short names.
|
|
86
|
+
- Session and provisioning output no longer names where a host runs. Progress
|
|
87
|
+
lines read `⟳ provisioning l4 …` (no provider or region), `super shell`
|
|
88
|
+
prints only state, age and detail, and the API no longer returns
|
|
89
|
+
provider, region, instance id, availability zone or host domain fields in
|
|
90
|
+
provisioning payloads and session records.
|
|
91
|
+
- `super skus` and `Client.list_skus()` no longer list a `clouds` field per SKU.
|
|
92
|
+
- Placement pinning (`--provider`/`--region`, `SUPERCOMPUTER_PROVIDER`/
|
|
93
|
+
`SUPERCOMPUTER_REGION`, `"provider"`/`"region"` in `supercomputer.json`) is
|
|
94
|
+
internal-only. The API refuses it from other accounts with 403
|
|
95
|
+
`placement_pin_forbidden`, and the CLI explains which setting to remove.
|
|
96
|
+
- `Session.upload()` reports large files as `blob_files` and the cutoff as
|
|
97
|
+
`blob_threshold_bytes`. Upload and download errors on that path read
|
|
98
|
+
`blob upload failed` / `blob download failed`.
|
|
99
|
+
- The Modal-compat `gpu=` mapping is an explicit table onto the short SKU names:
|
|
100
|
+
`"H100"` gives `h100`, `"H100:8"` gives `8x_h100`, `A10G`/`A10` give `a10g`
|
|
101
|
+
(was the unservable `gpu_Nx_a10`), `L40S` and `RTX-PRO-6000` are supported,
|
|
102
|
+
`H100!` maps to `h100`, and CPU-only functions get `cpu`.
|
|
103
|
+
|
|
104
|
+
### Deprecated
|
|
105
|
+
- The `s3_files` and `s3_threshold_bytes` keys of `Session.upload()`'s result.
|
|
106
|
+
They still carry the same values as `blob_files` / `blob_threshold_bytes`;
|
|
107
|
+
read the `blob_*` keys instead.
|
|
108
|
+
|
|
109
|
+
## [0.4.2] - 2026-09-24
|
|
110
|
+
|
|
111
|
+
### Fixed
|
|
112
|
+
- Older installs that saved `api.supercomputer.sh` or `supercomputer-dispatcher.fly.dev`
|
|
113
|
+
(in `~/.supercomputer/url`, `~/.supercomputer/url` or a `SUPERCOMPUTER_URL` / `SUPERCOMPUTER_URL` export) now
|
|
114
|
+
resolve to `https://api.supercomputer.sh`. Same backend, new hostname; dev and
|
|
115
|
+
staging hosts are untouched.
|
|
116
|
+
|
|
117
|
+
## [0.4.1] - 2026-09-24
|
|
118
|
+
|
|
119
|
+
### Changed
|
|
120
|
+
- The base exception is `SupercomputerError` (`SupercomputerRuntimeError` for
|
|
121
|
+
SDK-side failures). `SupercomputerError`, `SupercomputerRuntimeError` and `SupercomputerError` are
|
|
122
|
+
the same classes under their old names, so existing `except` clauses keep
|
|
123
|
+
working.
|
|
124
|
+
- New API keys are minted as `super_sk_…`; `super_sk_` / `super_sk_` keys stay
|
|
125
|
+
valid. Prompts and docs show the new prefix.
|
|
126
|
+
- `pip install supercomputer` now installs an empty shim that depends on
|
|
127
|
+
`supercomputer`, published alongside this release.
|
|
128
|
+
|
|
129
|
+
## [0.4.0] - 2026-09-24
|
|
130
|
+
|
|
131
|
+
### Changed
|
|
132
|
+
- Renamed to **supercomputer**. `pip install supercomputer`; the CLI is `super`
|
|
133
|
+
and the Python package is `import supercomputer`. `supercomputer` / `supercomputer` remain as
|
|
134
|
+
CLI and import aliases, `SUPERCOMPUTER_*` / `SUPERCOMPUTER_*` env vars still work,
|
|
135
|
+
`~/.supercomputer` and `supercomputer.json` are still read. New names: `SUPERCOMPUTER_*`,
|
|
136
|
+
`~/.supercomputer`, `supercomputer.json`.
|
|
137
|
+
- Job tasks now receive `SUPERCOMPUTER_TASK_ID` / `SUPERCOMPUTER_WORLD_SIZE` /
|
|
138
|
+
`SUPERCOMPUTER_JOB` instead of the `SUPERCOMPUTER_*` names (no alias: update scripts
|
|
139
|
+
that self-shard).
|
|
140
|
+
|
|
141
|
+
## [0.3.1] - 2026-09-22
|
|
142
|
+
|
|
143
|
+
### Fixed
|
|
144
|
+
- `super credits buy` no longer turns auto-refill on by default. It used to
|
|
145
|
+
consent on behalf of anyone who had never consented before, so buying less
|
|
146
|
+
than the auto-refill threshold enrolled the account and then charged the
|
|
147
|
+
saved card for the full top-up seconds later — `buy 10` against the default
|
|
148
|
+
$25 threshold cost $110. Consent is now opt-in via `--autorefill`, and
|
|
149
|
+
`--autorefill` also turns the setting back on for an account that had it
|
|
150
|
+
off, which consent alone cannot do. `--no-autorefill` is still accepted and
|
|
151
|
+
is now the default; passing both is an error.
|
|
152
|
+
- Before a purchase that will trigger a top-up, the CLI now says so and names
|
|
153
|
+
the amount. What triggers one is the balance a purchase *leaves behind*,
|
|
154
|
+
not its size, and the refill is sized to clear the threshold — so $10
|
|
155
|
+
against a $200 threshold charges the card a further $195, not the $50 the
|
|
156
|
+
setting says. Both numbers are worked out and printed before anything is
|
|
157
|
+
charged, including under `--yes`, and including for an account that was
|
|
158
|
+
already armed.
|
|
159
|
+
- `super credits` no longer claims auto-refill "turns on with your first
|
|
160
|
+
purchase". It turns on with a purchase made with `--autorefill`, and the
|
|
161
|
+
status line now says so and names that command.
|
|
162
|
+
- `super credits buy` no longer sends buyers to a dead address after paying.
|
|
163
|
+
The return URL was built from a domain baked in at release time, which
|
|
164
|
+
outlived its DNS record: the charge succeeded and the browser landed on a
|
|
165
|
+
404. The CLI now names no return address and the dispatcher supplies one
|
|
166
|
+
from its own allowlist, which redeploys with the web app instead of going
|
|
167
|
+
stale in a published wheel. Setting `SUPERCOMPUTER_WEB_URL` returns you to
|
|
168
|
+
`/dashboard`, the page that reads the result, rather than to
|
|
169
|
+
`/dashboard/billing`, which ignores it.
|
|
170
|
+
|
|
171
|
+
### Changed
|
|
172
|
+
- `resolve_web_url()` returns `None` when no web URL is configured, and
|
|
173
|
+
`DEFAULT_WEB_URL` is gone. `Client.start_credit_checkout()` takes
|
|
174
|
+
`success_url` and `cancel_url` as optional and omits them from the request
|
|
175
|
+
when unset. Set `SUPERCOMPUTER_WEB_URL` only to override where a buyer is returned
|
|
176
|
+
to. **Needs a dispatcher carrying the matching server change**; against an
|
|
177
|
+
older one, set `SUPERCOMPUTER_WEB_URL` or buy from the dashboard.
|
|
178
|
+
|
|
179
|
+
### Added
|
|
180
|
+
- `supercomputer.billing_types.predicted_topup_micros()` — what auto-refill would
|
|
181
|
+
charge once a given purchase has posted. Mirrors the dispatcher's own
|
|
182
|
+
`topUpAmount` and daily-cap clamp so a confirmation can name the second
|
|
183
|
+
charge before the card is saved.
|
|
184
|
+
|
|
185
|
+
## [0.3.0] - 2026-09-16
|
|
186
|
+
|
|
187
|
+
### Fixed
|
|
188
|
+
- `exec` no longer returns empty output for a command whose last write lands
|
|
189
|
+
at process exit. The host mirrors a process's durable log on a background
|
|
190
|
+
goroutine, so a read issued the instant the process reports "exited" can
|
|
191
|
+
beat that write and come back empty; the client was answering with that
|
|
192
|
+
empty read even though it had already drained the output off the live
|
|
193
|
+
stream. It now keeps whichever of the two saw more bytes. The symptom was
|
|
194
|
+
`stdout: ""` alongside `returncode: 0` — most often for a block-buffered
|
|
195
|
+
program, which flushes everything during interpreter teardown
|
|
196
|
+
microseconds before it dies. A training run's final `print(metrics)` is
|
|
197
|
+
exactly that shape.
|
|
198
|
+
|
|
199
|
+
### Added
|
|
200
|
+
- `super map --no-bake` opts a sweep out of canary auto-bake. By default,
|
|
201
|
+
packages the canary pip-installs are baked into the sweep's image before
|
|
202
|
+
the fan-out; the canary pass line now names them and points at
|
|
203
|
+
`image.pip` in `supercomputer.json` as the permanent home.
|
|
204
|
+
- `super credits`: the prepaid wallet from the terminal. `super credits`
|
|
205
|
+
shows the posted balance, what is available after unbilled usage,
|
|
206
|
+
auto-refill state and the saved card; `super credits buy <usd>` opens a
|
|
207
|
+
hosted checkout and waits for the purchase to post; `super credits
|
|
208
|
+
autorefill on|off|set` changes the top-up rule (turning it off warns that
|
|
209
|
+
work stops at $0 and needs a confirmation); `super credits statement`
|
|
210
|
+
lists ledger rows with a running balance.
|
|
211
|
+
- `InsufficientCreditError` (HTTP 402, `code: insufficient_credit`) — raised
|
|
212
|
+
when the prepaid balance is exhausted, and mapped to **exit code 4** in
|
|
213
|
+
the CLI with the top-up command named. It is a sibling of `SupercomputerError`,
|
|
214
|
+
not of `PaymentOverdueError`: nothing is owed, so the remedy is to add
|
|
215
|
+
credit, not to settle a bill. Code that catches `PaymentOverdueError`
|
|
216
|
+
alone will not catch it.
|
|
217
|
+
- `Client.credit_balance()`, `credit_ledger()`, `set_autorefill()` and
|
|
218
|
+
`start_credit_checkout()`, with typed payloads in `supercomputer.billing_types`.
|
|
219
|
+
- A low-balance warning before `exec`/`run`/`shell`/`create`/`job run`/`map`
|
|
220
|
+
provision anything, shown once per process and only when nothing will top
|
|
221
|
+
the account up. Best-effort: a failed billing read never blocks a run.
|
|
222
|
+
|
|
223
|
+
### Changed
|
|
224
|
+
- An out-of-credit refusal is no longer reported as a missed payment. Both
|
|
225
|
+
error paths now branch on the dispatcher's `code` before falling back on
|
|
226
|
+
the bare 402 status, so `payment_overdue`, `insufficient_credit` and an
|
|
227
|
+
older dispatcher's codeless 402 are told apart.
|
|
228
|
+
- A session closed for want of credit says so ("stopped: out of credits")
|
|
229
|
+
and exits 4, instead of exiting 75 as if it were briefly unreachable.
|
|
230
|
+
- `super sweep` offers the fast lane only for waits more capacity can fix.
|
|
231
|
+
Tasks blocked on billing get a top-up hint — boosting past that block
|
|
232
|
+
buys nothing.
|
|
233
|
+
- Python 3.9 is now supported (`requires-python >= 3.9`), and 3.14 is
|
|
234
|
+
tested. The README has a support grid; CI runs the suite on 3.9 through
|
|
235
|
+
3.14. The installer script falls back to `uv` instead of `pipx`/`pip`
|
|
236
|
+
when the system Python is older than 3.9.
|
|
237
|
+
- The CLI no longer prints urllib3's LibreSSL warning on macOS's bundled
|
|
238
|
+
Python.
|
|
239
|
+
|
|
240
|
+
## [0.2.1] - 2026-09-14
|
|
241
|
+
|
|
242
|
+
### Added
|
|
243
|
+
- `super login`: sign in through the browser (device authorization). Shows a
|
|
244
|
+
short code, opens the approval page, and saves a key minted for this
|
|
245
|
+
machine (named `cli:<hostname>`); then installs the supercomputer skill for the
|
|
246
|
+
coding agents present on the machine (`--agents auto`, the default; also
|
|
247
|
+
`all`, a list, or `none`). `--no-browser` prints the URL and code instead
|
|
248
|
+
of opening a browser. A fresh install's first command starts the same
|
|
249
|
+
login, and `super setup` with no key delegates to it.
|
|
250
|
+
- Spend visibility: `super sessions` shows `$/HR` (the rate billed on the
|
|
251
|
+
session's open usage interval while a host is held, 0 when cold), `SPENT`
|
|
252
|
+
(compute charged so far) and `AGE` (time on its current host) per row plus
|
|
253
|
+
a "Spending now" footer; `--json` rows carry `usd_per_hour`, `spent_usd`
|
|
254
|
+
and `host_age_seconds` (SDK: `Client.session_cost`). New `super usage [--since DUR|TS] [--until TS]`
|
|
255
|
+
reports what the account was charged over a window (default 30 days) by
|
|
256
|
+
resource and session (SDK: `Client.billing_usage`).
|
|
257
|
+
|
|
258
|
+
### Changed
|
|
259
|
+
- `super job ls` shows each job's COMMAND and EXIT code (from its process
|
|
260
|
+
index; `--json` rows carry `command` and `exit_code`), so rows are
|
|
261
|
+
tellable apart and failures visible without opening each job.
|
|
262
|
+
|
|
263
|
+
### Fixed
|
|
264
|
+
- `super logs <sid> <pid>` with a pid the dispatcher has no record of now
|
|
265
|
+
exits 1 (`process_not_found`) like `wait` and `kill`, instead of printing
|
|
266
|
+
an empty stream with exit 0 (and `status: ""` in `--json`) that a poller
|
|
267
|
+
read as a finished, silent process. A just-spawned pid gets a few seconds
|
|
268
|
+
to reach the durable index before it is called unknown.
|
|
269
|
+
- `super wait` with a `--timeout` shorter than the unknown-pid grace window
|
|
270
|
+
exits 1 for an unknown pid, not 75 (retry), so scripted callers stop
|
|
271
|
+
retrying a typo forever.
|
|
272
|
+
- Cold starts of `run`/`exec`/`job run` no longer dump every host status
|
|
273
|
+
frame (`⟵ session_status: building (phase_change) setup_timing ...`);
|
|
274
|
+
the fresh-allocation and reconnect paths now use the same quiet printer
|
|
275
|
+
as warm attaches.
|
|
276
|
+
- `super sweep harvest` no longer pulls the session's virtual `_logs/`
|
|
277
|
+
directory (`_logs/processes.json`) for a results glob like `*.json`; name
|
|
278
|
+
`_logs/` in the glob to fetch logs.
|
|
279
|
+
- `super sessions` sizes the HOST and SKU columns to the data (long host ids
|
|
280
|
+
overflowed the fixed width on every row).
|
|
281
|
+
- `super volume list` shows each volume's last update time.
|
|
282
|
+
- SKILL.md documents `super sessions --limit N`.
|
|
283
|
+
|
|
284
|
+
## [0.2.0] - 2026-09-08
|
|
285
|
+
|
|
286
|
+
### Added
|
|
287
|
+
- Per-session checkpoint/restore opt-out: `--no-checkpoint` on
|
|
288
|
+
`create`/`exec`/`run`/`shell` (SDK: `checkpoint=False` on
|
|
289
|
+
`Project.session`/`cold_session`, `Client.create_session`/
|
|
290
|
+
`create_cold_session`). A preempted opt-out session is rebuilt cold on any
|
|
291
|
+
available host (`/workspace` kept, running processes lost) instead of being
|
|
292
|
+
checkpointed and restored pinned to the region its checkpoint lives in.
|
|
293
|
+
Defaults resolve `--checkpoint`/`--no-checkpoint` → `SUPERCOMPUTER_CHECKPOINT` →
|
|
294
|
+
`supercomputer.json` `"checkpoint"` → the new `super config set checkpoint on|off`
|
|
295
|
+
user default (`~/.supercomputer/config.json`) → server default (on).
|
|
296
|
+
`SessionInfo.checkpoint` and `super sessions --json` expose the policy; the
|
|
297
|
+
create fails loudly against a dispatcher too old to honour the opt-out.
|
|
298
|
+
- `--no-resume` on `exec`/`run`/`shell`: refuse to wake a cold (stopped)
|
|
299
|
+
session instead of transparently re-provisioning its hardware. The refusal
|
|
300
|
+
exits 1 with a typed `session_cold` error naming the session and the SKU a
|
|
301
|
+
resume would have provisioned. SDK: `Client.attach_session(...,
|
|
302
|
+
resume=False)` raises the new `supercomputer.SessionColdError`.
|
|
303
|
+
- Pipelines: `super map --after SWEEP[,SWEEP]` (SDK: `client.map(...,
|
|
304
|
+
after=handle_or_name, after_strict=…)`) holds a sweep in the new
|
|
305
|
+
`waiting` state until the named sweeps finish, then launches it — the
|
|
306
|
+
barrier is durable server-side, so a generate → train → eval chain
|
|
307
|
+
submits up front and the client can disconnect. An upstream failure
|
|
308
|
+
fails the downstream sweep (`upstream_failed:<name>`; re-arm with
|
|
309
|
+
`super sweep retry <name> --all`); a partially-succeeded upstream
|
|
310
|
+
counts as finished unless `--after-strict`.
|
|
311
|
+
- `--volume NAME[:MOUNT][:ro]` (also supercomputer.json `"read_only": true` or
|
|
312
|
+
the `name:/mount:ro` string form) attaches a volume read-only: the
|
|
313
|
+
session sees it, but its writes are discarded at close (no commit).
|
|
314
|
+
- `super autoresearch init`: scaffolds a karpathy/autoresearch-style keep/discard
|
|
315
|
+
research loop (agent setup guide + `program.md` template) that runs experiments
|
|
316
|
+
on a persistent supercomputer session.
|
|
317
|
+
The loop uploads `results.tsv` to the session each experiment; the dashboard's
|
|
318
|
+
session page then shows an Autoresearch tab (metric chart + results table).
|
|
319
|
+
- Skip-the-line boost: `super sweep boost <name>` / pressing `s` in
|
|
320
|
+
`super sweep status --watch` (offered while blocked on capacity) moves a
|
|
321
|
+
sweep to the fast claim lane; queued tasks re-lane immediately
|
|
322
|
+
(`SweepHandle.boost()` in the SDK). Freed machines alternate fast/free.
|
|
323
|
+
- `super sweep status` explains WHY a sweep is waiting: a `why:` line under
|
|
324
|
+
`blocked on capacity` names the line (`3 session(s) ahead in the gpu_1x_l4
|
|
325
|
+
queue (1 fast-lane)`) and/or the platform (`a new machine is being
|
|
326
|
+
provisioned`, `no capacity ... (stockout)`, `cloud quota exhausted`, ...),
|
|
327
|
+
from the new `blocked.sku/queued_reason/queued_ahead/fast_ahead` status
|
|
328
|
+
fields; a `state: waiting` (pipeline) sweep names the upstream sweeps it
|
|
329
|
+
holds for. Older dispatchers omit the fields and status reads as before.
|
|
330
|
+
- Async sweep scheduling: `super map --not-before WHEN` (park until), `--by WHEN`
|
|
331
|
+
(deadline; opportunistic idle-fill until `deadline - --runtime - pad`, then
|
|
332
|
+
normal launch) and `--runtime DUR` (per-task estimate, default 1h).
|
|
333
|
+
`super sweep status` shows the window phase; a missed deadline marks the
|
|
334
|
+
sweep `deadline_missed` (webhook `job.deadline_missed`) but never cancels it.
|
|
335
|
+
- First-run login prompt: with no API key configured, the CLI offers to open
|
|
336
|
+
the dashboard login and store the key instead of failing with a bare error.
|
|
337
|
+
- CLI errors carry typed error codes and the request id; the client never
|
|
338
|
+
provisions hardware for a request the server would reject.
|
|
339
|
+
|
|
340
|
+
### Changed
|
|
341
|
+
- Resuming a cold session now always prints one stderr line (`session <sid>
|
|
342
|
+
is cold — resuming (provisions <sku>); pass --no-resume to refuse`), even
|
|
343
|
+
when stderr is not a TTY or `SUPERCOMPUTER_QUIET` is set — waking billed hardware
|
|
344
|
+
is a spend event, and non-TTY runs used to do it silently.
|
|
345
|
+
- Failed map task attempts now retry with a growing delay (45s × attempt,
|
|
346
|
+
capped at 10m) instead of relaunching immediately; preemption requeues
|
|
347
|
+
remain immediate and still don't consume the retry budget.
|
|
348
|
+
|
|
349
|
+
### Fixed
|
|
350
|
+
- `super map --volume name:/path` sent the custom mount path under a key
|
|
351
|
+
the server ignores, silently mounting the volume at its default path.
|
|
352
|
+
Custom mount paths now apply to sweep task sessions.
|
|
353
|
+
|
|
354
|
+
## [0.1.3] - 2026-08-27
|
|
355
|
+
|
|
356
|
+
### Changed
|
|
357
|
+
- `super setup` installs the agent skill for all agents by default (Enter or
|
|
358
|
+
non-interactive stdin = `all`); `--agents none` opts out.
|
|
359
|
+
|
|
360
|
+
## [0.1.2] - 2026-08-27
|
|
361
|
+
|
|
362
|
+
### Changed
|
|
363
|
+
- README wording.
|
|
364
|
+
|
|
365
|
+
## [0.1.1] - 2026-08-27
|
|
366
|
+
|
|
367
|
+
### Changed
|
|
368
|
+
- README: sign up on the website and paste your API key; the editable
|
|
369
|
+
checkout install instructions are gone.
|
|
370
|
+
|
|
371
|
+
## [0.1.0] - 2026-08-27
|
|
372
|
+
|
|
373
|
+
### Changed
|
|
374
|
+
- Renamed: the package is `supercomputer`, the import is `supercomputer`, the CLI is
|
|
375
|
+
`supercomputer`, env vars are `SUPERCOMPUTER_*`, config lives in `~/.supercomputer`, project
|
|
376
|
+
files are `supercomputer.json`, new keys are `super_sk_…`, and the client sends
|
|
377
|
+
`X-Supercomputer-Client*` headers. Everything old keeps working: `import supercomputer`,
|
|
378
|
+
the `super` command, `SUPERCOMPUTER_*`, `~/.supercomputer`, `supercomputer.json`, `super_sk_` keys and
|
|
379
|
+
`supercomputer.SupercomputerError`. Map tasks now receive `SUPERCOMPUTER_TASK_ID` /
|
|
380
|
+
`SUPERCOMPUTER_WORLD_SIZE` / `SUPERCOMPUTER_JOB` (the `SUPERCOMPUTER_*` names are gone).
|
|
381
|
+
|
|
382
|
+
### Added
|
|
383
|
+
- `super sweep harvest <name> <remote-glob> <local-dir>` — download every
|
|
384
|
+
task's matching outputs in one command. Sessions are resolved from the
|
|
385
|
+
sweep and local paths are task-keyed (`<local-dir>/task-<index>/<path>`,
|
|
386
|
+
or `--flat`), replacing the per-sweep script that parsed status JSON for
|
|
387
|
+
session ids and ran N `super download` calls. `--all-states` includes
|
|
388
|
+
failed and canceled tasks.
|
|
389
|
+
- `super sweep status --watch [--interval S]` — the human live view,
|
|
390
|
+
repainted in place until the sweep is terminal. Appends instead of
|
|
391
|
+
repainting when stdout is not a terminal.
|
|
392
|
+
- `super stop --wait [--timeout SECONDS]` — block until the workspace
|
|
393
|
+
manifest is durable, instead of polling `super sessions` for `state=cold`.
|
|
394
|
+
`super map --from <sid>` needs that manifest; the default timeout is 300s
|
|
395
|
+
and the command exits 1 if the wait expires (the stop itself stands).
|
|
396
|
+
- The `super sweep status --json` document is now a documented, versioned
|
|
397
|
+
contract (`schema_version: 1`) — see `docs/sweep-status-schema.md`.
|
|
398
|
+
Additive changes keep the version; a removal or rename bumps it.
|
|
399
|
+
- Every request now carries `X-Supercomputer-Client` / `X-Supercomputer-Client-Version`, and a
|
|
400
|
+
client below the deployment's supported floor is rejected with HTTP 426 and
|
|
401
|
+
the new `supercomputer.ClientTooOldError`, which names the upgrade command. This
|
|
402
|
+
replaces the previous failure mode for a stale client, a signature-mismatch
|
|
403
|
+
error on every >5 MiB upload that read as a credential problem.
|
|
404
|
+
|
|
405
|
+
### Changed
|
|
406
|
+
- `super upload` now names the files that take the pre-signed cloud-storage
|
|
407
|
+
path (>5 MiB) rather than only the total, and names them again in the error
|
|
408
|
+
when that path fails — so a broken large-file upload is attributable to a
|
|
409
|
+
file, not to the command. `Session.upload()` returns them as `s3_files`
|
|
410
|
+
alongside `inline_files` and `s3_threshold_bytes`.
|
|
411
|
+
|
|
412
|
+
## [0.1.0] — first public release
|
|
413
|
+
|
|
414
|
+
### Added
|
|
415
|
+
- `super` CLI: sessions, exec/run/shell/ssh/tunnel, background processes
|
|
416
|
+
(spawn/wait/logs/kill), file transfer (upload/download/ls/mount), volumes,
|
|
417
|
+
run-to-completion jobs, and `super map` sweeps.
|
|
418
|
+
- Python SDK: `Client`, `Project`, `Session`, `Job`, `SweepHandle`, `Image`.
|
|
419
|
+
- `super setup` installs the agent skill (`SKILL.md`) for Cursor, Claude Code
|
|
420
|
+
and Codex.
|
|
421
|
+
- `super --version` and `supercomputer.__version__`.
|
|
422
|
+
- Directory uploads skip hidden entries, dependency/cache directories and
|
|
423
|
+
symlinked files by default; `--include-hidden` / `--follow-symlinks` (CLI)
|
|
424
|
+
and `include_hidden=` / `follow_symlinks=` (SDK) opt back in.
|
|
425
|
+
- `SUPERCOMPUTER_TELEMETRY=0` disables the best-effort CLI crash report.
|
|
426
|
+
|
|
427
|
+
### Removed
|
|
428
|
+
Relative to the pre-release internal SDK (nothing here was ever on PyPI):
|
|
429
|
+
- Public names `MigrationInfo`, `MigrationStatus`, `SyncProgress`, the
|
|
430
|
+
`SupercomputerError` and `JobHandle` aliases (`SupercomputerError` / `SweepHandle` remain),
|
|
431
|
+
and the `Session.migrate()` / `Client.watch()` / `Client.list_session_files()`
|
|
432
|
+
/ `Client.download_file()` helpers — the operator-initiated migration
|
|
433
|
+
surface is not part of the public client.
|
|
434
|
+
- `Image.add_local_file()`, `Image.add_local_dir()`, `Image.copy()`,
|
|
435
|
+
`Image.workdir()` — use `Session.upload()` / `super upload` for local files
|
|
436
|
+
and the `workdir=` argument on exec.
|
|
437
|
+
- Legacy `~/.supercomputer/token`, `~/.supercomputer/url` and `supercomputer.json` lookups
|
|
438
|
+
(`~/.supercomputer/*` and `supercomputer.json` are the supported forms). `SUPERCOMPUTER_API_KEY` /
|
|
439
|
+
`SUPERCOMPUTER_URL` are still accepted as aliases of `SUPERCOMPUTER_API_KEY` / `SUPERCOMPUTER_URL`.
|
|
440
|
+
- Internal modules `supercomputer.upload`, `supercomputer.stream`, `supercomputer.jobs`, `supercomputer.client_ext`
|
|
441
|
+
and the `s3_uploader` / `websockets_transport` providers, with the
|
|
442
|
+
`websockets` dependency they pulled in.
|
|
443
|
+
- `DirectClient.run_streaming()` (no callers). `DirectClient.execute()` is
|
|
444
|
+
kept — internal harnesses use it.
|
|
445
|
+
|
|
446
|
+
### Security
|
|
447
|
+
- Only `SUPERCOMPUTER_*` keys from a project `.env` are imported into the process
|
|
448
|
+
environment; other keys stay reachable by name via `--secret KEY`.
|
|
449
|
+
- A plaintext (`ws://`) host address is refused when the API was reached over
|
|
450
|
+
`https://`; a plaintext API URL to a non-local host warns.
|
|
451
|
+
- `super ssh` quotes its ProxyCommand and validates the session id before using
|
|
452
|
+
it in filesystem paths.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in `supercomputer`.
|
|
4
|
+
|
|
5
|
+
## Development setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
cd packages/supercomputer
|
|
9
|
+
python3 -m venv .venv && source .venv/bin/activate
|
|
10
|
+
pip install -e ".[dev]"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Before you open a pull request
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
ruff check src tests # lint (rule set in pyproject.toml)
|
|
17
|
+
mypy # type-check src/supercomputer (config in pyproject.toml)
|
|
18
|
+
pytest # ~640 hermetic tests, no network or credentials needed
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- Keep changes focused; one topic per PR.
|
|
22
|
+
- New behaviour comes with a test — the tests are the spec.
|
|
23
|
+
- Comments explain *why*, not *what*. Please don't reference internal ticket
|
|
24
|
+
numbers, incidents or environments in code comments.
|
|
25
|
+
- Public functions and classes have docstrings.
|
|
26
|
+
- Line length is 100.
|
|
27
|
+
|
|
28
|
+
## Reporting bugs
|
|
29
|
+
|
|
30
|
+
Open a GitHub issue with the `super --version` output, the command or code you
|
|
31
|
+
ran, and what you expected. For anything security-related, see
|
|
32
|
+
[SECURITY.md](SECURITY.md) instead.
|
|
33
|
+
|
|
34
|
+
## License
|
|
35
|
+
|
|
36
|
+
By contributing you agree that your contributions are licensed under the
|
|
37
|
+
Apache License 2.0 (see [LICENSE](LICENSE)).
|