v0.26.0
·
19 commits
to main
since this release
Minor Changes
- Source authority is inferred from use, never registered, and the 0.25.0 AX-pass defects are fixed. Nothing is declared "at the beginning": the
source_unclaimeddeploy refusal is gone — an unclaimed app whose checkout has a GitHub remote deploys as GitHub automatically (no git gates, no credential probe;github_credentials_requiredno longer exists), and each release records the observed repository. The firstdeepspace push(or an unclaimed app's deploy sync) claims DeepSpace source at the git receive path, once, permanently — and now says so on stderr at the moment it happens. The claim fires on the pack POST rather than the ref advert, so agit push --dry-runor an abandoned push never pins the app — and an admin-tier push to an unclaimed app refuses (admin_cannot_claim): support must neither claim an app nor create history on an unclaimed one.deepspace app sourceis now read-only (source_inferredrefuses the old setter, and reporting an unregistered checkout never mints); the server'sPOST /sourceroute and the transfer protocol (ref/release proofs,github_push_required, the transfer-preparationsource_changedchecks — deploy's ownsource_changedrace check remains — the owner-only import receive path and itsX-DeepSpace-Source-Revisionheader) are removed. A claimed GitHub app's stalespacegit remote is now removed bydeploy(the old claim command did this). Releases also record the dirty flag on commit-bearing--no-pushdeploys (commit abc123 (dirty worktree)), and a rollback carries its TARGET release's source evidence and dirty flag instead of losing them. App registration is also no longer an upfront step: apps register on FIRST USE. Any verb that USES the app —secrets set/upload/pullbefore the first deploy,dev start,test run,deploy, andpushonce the repo has commits — mints and stamps its id through the one resolver chokepoint when wrangler.toml has none (same registrationapp initperforms, announced on stderr with the plane and account; the initial scaffold commit is made byapp initanddeployonly). A wrangler.toml whose COMMITTED content still carries the__APP_ID__placeholder refuses (a shared repo must not mint one app per clone), a typo'd--envname still refuses (no_app_id_for_env) — minting only fills a declared env block or the top level — and a malformed existing id still refuses (invalid_app_id), never minted over. Healing is scoped twice: only a wrangler.toml that DECLARESDEEPSPACE_APP_ID(the scaffold's placeholder) can mint — an unrelated Cloudflare Workers repo refuses as before — and only the verbs whose purpose is building or using the app register (deploy,dev,test,push, and thesecretsWRITE verbs); read and ownership verbs (secrets list/get/download,logs,releases,collaborators,transfer, …) keep theapp_not_initializedrefusal rather than consuming a quota slot as a side effect. Onlyapp init/deploycreate the initial scaffold commit (the resolver never authors git commits). Dependencies also install on first use: a fresh clone'sdev/test/deploy/addruns the detected package manager itself (streamed to.deepspace/install.log, bounded at 5 minutes, retried on the next command after a failure,DEEPSPACE_NO_INSTALL=1restores the olddeps_missingrefusal — note this includes workspace worktrees, which get their own install). Collaborator pushes now claim DeepSpace source like the owner's (the old owner-only claim would have left collaborator-built apps unclaimed — with claiming and pushing at the same receive path, an app with cloud history is always claimed), and inferred-GitHub evidence travels as its own field so a 0.25.0 worker's stale-base guard is never skipped by it; the retiredPOST /sourceanswers 410source_inferredinstead of a misleading 404.npm create→ any command works with no intermediate step; a logged-out scaffold exits 0;app initremains the explicit spelling and the only path that can replace an id (--new-id).app undeployautomation must pass--yes(the repo's own reaper and harness scripts updated). Consent:app undeployunder--jsonor a non-TTY stdin now refusesconfirmation_requiredwithout--yesinstead of treating the command as consent. Releases: a deploy recordssourceDirty— whether the shipped working tree carried uncommitted changes — andreleases/statuslabel a dirty GitHub-source release (GitHub · owner/repo, dirty worktree), so a rollback no longer picks between clean and dirty releases blind.pushover a dirty worktree now warns and carriesuncommittedin--json(push publishes committed history only).test accounts createaccepts--password-stdin(argv passwords discouraged).test runrefuses a zombie dev server (port_in_use, bounded wait) instead of letting Playwright adopt a dying one mid-run.not_app_ownerrefusals name the recoveries (ask the owner,app transfer offer,app init --new-id). An unknown subcommand that exactly names a command elsewhere in the tree is suggested there (auth status→status, notauth logout).