deepspace 0.16.0 → 0.17.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,107 @@
1
1
  # deepspace
2
2
 
3
+ ## 0.17.0
4
+
5
+ ### Minor Changes
6
+
7
+ - **`deepspace deploy --claim-released` lets a platform admin take a name still inside its 30-day cooldown.** Undeploying releases a hostname into a hold reserved for its previous owner, and `released_by` records the app's **owner** — not whoever ran the undeploy. So an admin taking down an abandoned or abusive app could not then put anything on that name for a month: the reservation belongs to the absent owner, and the admin's own app matches neither the releasing-owner nor the releasing-app leg that normally allows a reclaim. The name was stranded by the mechanism meant to protect it.
8
+
9
+ The flag is explicit rather than an implicit admin bypass. The override is absolute — it beats a release made seconds ago and permanently discards the reservation rather than pausing it — so a routine admin deploy must not be able to seize a held name by accident. This is the same reasoning that makes a rename require `--rename`. Non-admin accounts are refused with `admin_required`, and because the tier lookup fails closed, a billing outage refuses rather than grants.
10
+
11
+ Two records are written, because neither side knows the whole story: the deploy worker logs the acting admin (it cannot name the displaced owner, since only released rows carry `released_by` and no by-host lookup returns them), and the registry logs the displaced owner and the app that lost the name at the moment the row is replaced.
12
+
13
+ - **Removed: GameRoom, document mode, and the identity-migration wire.** These
14
+ landed in #240 and #241 without a changeset, so this declares them rather than
15
+ letting a release drop public exports silently.
16
+
17
+ Gone from the public surface:
18
+ - `useGameRoom`, and the `GameRoom` durable object with `GameRoomConfig`,
19
+ `GamePlayer`, `UseGameRoomResult`, `Player`, and `GameInput`. No in-repo app
20
+ used it, and it failed the authorization, hibernation, and scheduling
21
+ invariants every other room holds. Use `RecordRoom` for shared state.
22
+ - `CANONICAL_APP_IDENTITY_MIGRATION_ID` and the `MSG.GAME_*` protocol
23
+ constants, which had no producer or consumer once the room went.
24
+ - The RecordRoom document-mode migrations, verified unused across every repo
25
+ in the org before deletion.
26
+
27
+ An app that imported any of these will fail to build. Nothing in the templates
28
+ or the feature catalog referenced them.
29
+
30
+ ### Patch Changes
31
+
32
+ - Fix a set of version-control lifecycle and honesty defects found by
33
+ black-box agent live-testing of multi-checkout collaboration — cases where
34
+ a verb prescribed recovery that deterministically failed, reported work it
35
+ did not do, or handed out a command that could not run where it pointed.
36
+ - **Recovery actions execute verbatim.** Every `action.argv` that re-invokes
37
+ this CLI is pinned to the running interpreter and entry (resolved through
38
+ the `node_modules/.bin` symlink) instead of the bare word `deepspace`,
39
+ which is not on PATH in a linked worktree, a bare clone, or an `npx`
40
+ invocation. One door (`executableAction`) applies it to refusal actions,
41
+ success-path actions, the unknown-command suggestion, and `deploy`'s own
42
+ exit envelope; consumers must not assume `argv[0] === 'deepspace'`.
43
+ - **A checkout can follow its own advice.** `deepspace clone`, `workspace
44
+ new`, `workspace attach`, `workspace sync`, and `workspace land` fill
45
+ whichever half of the checkout's repo-local git identity is missing from
46
+ the session token — previously the `git pull` a divergence refusal handed
47
+ back (and any first commit) died on `unable to auto-detect email address`
48
+ in a container with no global git config, or with a half-configured one.
49
+ The divergence recovery also pins `git pull --no-rebase` (a fresh clone
50
+ has no reconcile config) and exits 2 from workspace publishes exactly as
51
+ it does from `push`.
52
+ - **A second checkout of a landed workspace is no longer a dead end.**
53
+ `workspace drop` cleans up the stale local worktree and branch of a
54
+ workspace another clone landed or dropped — proving publication against a
55
+ freshly fetched trunk tip when the landed ref is gone — and reports
56
+ whether the remote drop actually happened (`json.remoteDropped`) instead
57
+ of claiming a fresh drop on a replay. `workspace status` states the right
58
+ fact per state (landed/dropped → drop cleans up; behind → fast-forward;
59
+ diverged → integrate first) instead of prescribing a `workspace sync` that
60
+ would refuse, and `--json` gains `syncRelation` so machine callers see the
61
+ same distinction. `workspace land` and `workspace sync` on a finished
62
+ workspace report `workspace_not_active` (with the `workspace drop` cleanup
63
+ action) ahead of a checkout mismatch whose attach advice could not
64
+ succeed; drop's own unsynced refusal stops prescribing the publish path
65
+ once the workspace is finished — nothing can publish those commits, and
66
+ the message says so. The server returns `workspace_not_active` (over the
67
+ generic `conflict`) for sync/land/drop against a finished workspace — a
68
+ worker-side change that reaches existing CLIs on deploy; no released CLI
69
+ branches on the old slug, and this CLI tolerates both.
70
+ - **`workspace attach` is idempotent.** Attaching an already-attached
71
+ workspace points at the existing worktree instead of refusing
72
+ `branch_exists` — reporting the LOCAL tip and, when it differs from the
73
+ published tip, the recovery that relation actually admits (`workspace
74
+ sync` when ahead; `git pull --no-rebase` first when behind or diverged,
75
+ since sync would refuse) — and re-materializes a worktree that `git
76
+ worktree remove` or a failed cleanup deleted.
77
+ - **Land refusals carry their resume action, and a recorded merge is never
78
+ reported as a bare failure.** `merge_conflict`, `conflict_markers` (now
79
+ naming the offending files), `validation_failed`, and
80
+ `validation_mutated_tree` carry the exact re-run action; when the trunk
81
+ push succeeded and only recording the land failed, `land_unrecorded`
82
+ states that the merge IS on trunk and resumes by re-running instead of
83
+ implying nothing happened. When a concurrent land or drop finished the
84
+ workspace mid-merge, land answers `workspace_not_active` at exit 2 with
85
+ `pushed: true` and the `workspace drop` cleanup action — the merge is on
86
+ trunk, and re-running could never record it.
87
+ - **`status` stops labeling a feature branch's sync line "Trunk".** A
88
+ non-default branch renders as `Branch sync`, and `json.trunk` gains
89
+ `branch`/`isTrunk` (`isTrunk: null` when the default branch is unknown —
90
+ GitHub-owned source or an unborn cloud repo — never a guess), so
91
+ `trunk.state: "in_sync"` on a feature branch can no longer read as "local
92
+ trunk matches cloud trunk". `activity` (CLI and dashboard) stops printing
93
+ a fabricated "(0 files vs base)" changed-file count on workspace syncs —
94
+ the event never carried one.
95
+
96
+ - `deepspace workspace drop` and `land` no longer treat the generic `conflict`
97
+ error as "already finished".
98
+
99
+ The server refuses a finished workspace with `workspace_not_active`; `conflict`
100
+ was the pre-rename slug, and the CLI accepted both. Platform workers deploy
101
+ ahead of the CLI release, so nothing still answers with the old slug — and
102
+ `conflict` remains live for workspace-id clashes, which were being re-read as
103
+ "already finished" instead of surfacing. An id clash now raises immediately.
104
+
3
105
  ## 0.16.0
4
106
 
5
107
  ### Minor Changes