OXYGENHUB

VS Code links name oxygenhub.oxygen-vscode again c96b32865000

The Marketplace lists Oxygen VCS under that id.
Author
Andy McCall @andymccall <[email protected]>
When
· 2026-09-30 19:06 UTC
Signature
✔ signed by Andy McCall
Hash
c96b32865000b248ff1a38c6fd459d2f7e2bf4171f29e0e2cb3a9b988f0abbc1
Depends on
129c23effb73 145306044896 16cb2b3aa947 2bfe5ef66b0c 92574625ee9a 93be9ce4653e b64e2537d702 c5f3bde466d1 d23464c0ac60
Depended on by
33d98147511b
In bookmarks
api-unknown-fields cancel-landed-runs clear-waiting close-proposal-140 diffusion-pin-bookmark draft-ready image-check job-waits main oh-comment-body-file proposal-list-fast run-one-job wiki-says-so
In tags
v0.2.0 v0.3.0 v0.3.1 v0.4.0 v0.4.1 v0.4.2 v0.5.0 v0.5.1 v0.5.2 v0.6.0 v0.6.1 v0.7.0 v0.8.0 v0.9.0 v0.9.1 v0.9.11 v0.9.15 v0.9.16 v0.9.19 v0.9.2 v0.9.20 v0.9.21 v0.9.22 v0.9.23 v0.9.24 v0.9.3 v0.9.4 v0.9.5 v0.9.6 v0.9.7 v0.9.8 v0.9.9
Edits
11 atoms, 0 tree operations, 5 files

Browse the tree at this change

modified crates/hub/src/web/history.rs +1 −1
…
297 unchanged lines
298 298
                ),
299 299
            };
300 300
            let vscode = format!(
301 -
                "vscode://oxygenhub.oxygen/plan?url={}&bookmark={}&kind={kind}&change={}&target={}",
301 +
                "vscode://oxygenhub.oxygen-vscode/plan?url={}&bookmark={}&kind={kind}&change={}&target={}",
302 302
                enc(&base),
303 303
                enc(&r),
304 304
                c.to_hex(),
…
210 unchanged lines
modified crates/hub/src/web/resolve.rs +1 −1
…
21 unchanged lines
22 22
pub fn vscode_link(app: &Shared, owner: &str, name: &str, bookmark: &str, path: &str) -> String {
23 23
    use super::settings::urlencode;
24 24
    let url = format!("{}/{owner}/{name}", app.config.base_url().trim_end_matches('/'));
25 -
    format!("vscode://oxygenhub.oxygen/resolve?url={}&bookmark={}&path={}", urlencode(&url), urlencode(bookmark), urlencode(path))
25 +
    format!("vscode://oxygenhub.oxygen-vscode/resolve?url={}&bookmark={}&path={}", urlencode(&url), urlencode(bookmark), urlencode(path))
26 26
}
27 27
28 28
/// A piece of a file rendered with `oxy` conflict markers (spec §9.5).
…
662 unchanged lines
modified crates/hub/tests/api.rs +1 −1
…
1035 unchanged lines
1036 1036
    let v = plan(&second, &first).await;
1037 1037
    assert_eq!(kinds(&v), ["squash"], "{v}");
1038 1038
    assert!(v["options"][0]["command"].as_str().unwrap().contains(&format!("oxy squash #{second} --into #{first}")));
1039 -
    assert!(v["options"][0]["vscode"].as_str().unwrap().starts_with("vscode://oxygenhub.oxygen/plan?"));
1039 +
    assert!(v["options"][0]["vscode"].as_str().unwrap().starts_with("vscode://oxygenhub.oxygen-vscode/plan?"));
1040 1040
    // apart is independent of second: either.
1041 1041
    assert_eq!(kinds(&plan(&apart, &second).await), ["squash", "rebase"]);
1042 1042
    // first under second: nothing (second depends on first).
…
4 unchanged lines
modified crates/hub/tests/edits.rs +1 −1
…
286 unchanged lines
287 287
        page.body
288 288
    );
289 289
    assert!(
290 -
        page.body.contains("vscode://oxygenhub.oxygen/resolve?url=") && page.body.contains("&#38;bookmark=main&#38;path=a.txt"),
290 +
        page.body.contains("vscode://oxygenhub.oxygen-vscode/resolve?url=") && page.body.contains("&#38;bookmark=main&#38;path=a.txt"),
291 291
        "{}",
292 292
        page.body
293 293
    );
…
179 unchanged lines
modified docs/spec.md +2 −2
…
293 unchanged lines
294 294
295 295
**Swimlanes.** `/{owner}/{name}/lanes/{ref}` draws a bookmark's newest changes (up to 60) as a board: each lane of the shared lane layout (`oxy_core::lanes`, as `oxy log` and the list view use) is a row, time runs left to right, every change is a card linking to its page, and an edge joins a change to each change of the board it depends on. Independent work stays in separate lanes and there are no merge nodes, since Oxygen has none. The history page links to it.
296 296
297 -
**Planning on the board.** When the bookmark is the source of an open or draft proposal that the viewer wrote or can write to, the board is editable. Dragging a change onto another asks `POST /{owner}/{name}/lanes/{ref}/plan` (form `change`, `target`) what the drop could mean. The answer is JSON: a **squash** (fold the change into the target) when every dependency of the change is the target or already beneath it, and a **rebase** (make the change depend on the target) unless it already does. Nothing is offered when the target depends on the change, or when either is already on the proposal's target bookmark. The hub does not rewrite the changes itself: rewritten changes must be signed by their author, so each option carries the `oxy` commands to run and a `vscode://oxygenhub.oxygen/plan?…` link that does the same in the VS Code extension, then force-pushes the bookmark.
297 +
**Planning on the board.** When the bookmark is the source of an open or draft proposal that the viewer wrote or can write to, the board is editable. Dragging a change onto another asks `POST /{owner}/{name}/lanes/{ref}/plan` (form `change`, `target`) what the drop could mean. The answer is JSON: a **squash** (fold the change into the target) when every dependency of the change is the target or already beneath it, and a **rebase** (make the change depend on the target) unless it already does. Nothing is offered when the target depends on the change, or when either is already on the proposal's target bookmark. The hub does not rewrite the changes itself: rewritten changes must be signed by their author, so each option carries the `oxy` commands to run and a `vscode://oxygenhub.oxygen-vscode/plan?…` link that does the same in the VS Code extension, then force-pushes the bookmark.
298 298
299 299
### 6.8 Change page
300 300
…
11 unchanged lines
312 312
313 313
### 6.10 Conflicts page
314 314
315 -
For each bookmark whose state has conflicts: the file (or tree entry), the conflict kind, and each side with the change that produced it and its content, rendered with the same marker structure `oxy checkout` writes. For a text file, **resolve region by region** (`/{owner}/{name}/resolve/{bookmark}/{path}`, writers) shows the lines no one disagrees on and each conflict region with its sides and the change that wrote each; per region the user keeps one side, every side in order, none, or their own text (a side that records a deletion keeps the deletion). Regions are linkable (`#region-N`). The file is put back together and committed through the delegate as a web edit (§6.9), which makes it a `kind = resolution` change depending on every contributor; the page carries the bookmark's state and refuses to commit if the bookmark moved meanwhile. Malformed markers fall back to the editor, which also stays available: "edit the marked file" opens the markers in it. A name conflict (several files want one name, shown as `NAME.oxy-conflict-N`) resolves on the same URL by keeping one candidate: it takes the name as a move, keeping its identity, and the other candidates are removed. A replace conflict (a binary file replaced two ways) resolves the same way by keeping one version, each labelled with the change that wrote it; the commit replaces every version with it (Oxygen spec §9.3). Conflicts between directories or links are resolved from a client. Both resolver pages offer **Resolve in VS Code**, a `vscode://oxygenhub.oxygen/resolve?url=…&bookmark=…&path=…` link that oxygen-vscode handles: it finds the open checkout of that repository (or offers to clone it), switches to the bookmark after asking, pulls it, and opens the file. Resolving is live: everyone on the same resolver page (a room per repository, bookmark and path, over server-sent events at `/{owner}/{name}/resolve-live/{bookmark}/{path}`) sees who else is there and each other's choices as they are made, region by region, the last choice for a region winning (free text is shared whole, a moment after typing stops); a newcomer gets the choices so far; and when one of them commits, the others are told the resolution landed, with a link to it, and their form is disabled. Rooms are in memory and end when the last viewer leaves. The change page tags resolution changes. Otherwise the page gives the two-line client recipe.
315 +
For each bookmark whose state has conflicts: the file (or tree entry), the conflict kind, and each side with the change that produced it and its content, rendered with the same marker structure `oxy checkout` writes. For a text file, **resolve region by region** (`/{owner}/{name}/resolve/{bookmark}/{path}`, writers) shows the lines no one disagrees on and each conflict region with its sides and the change that wrote each; per region the user keeps one side, every side in order, none, or their own text (a side that records a deletion keeps the deletion). Regions are linkable (`#region-N`). The file is put back together and committed through the delegate as a web edit (§6.9), which makes it a `kind = resolution` change depending on every contributor; the page carries the bookmark's state and refuses to commit if the bookmark moved meanwhile. Malformed markers fall back to the editor, which also stays available: "edit the marked file" opens the markers in it. A name conflict (several files want one name, shown as `NAME.oxy-conflict-N`) resolves on the same URL by keeping one candidate: it takes the name as a move, keeping its identity, and the other candidates are removed. A replace conflict (a binary file replaced two ways) resolves the same way by keeping one version, each labelled with the change that wrote it; the commit replaces every version with it (Oxygen spec §9.3). Conflicts between directories or links are resolved from a client. Both resolver pages offer **Resolve in VS Code**, a `vscode://oxygenhub.oxygen-vscode/resolve?url=…&bookmark=…&path=…` link that oxygen-vscode handles: it finds the open checkout of that repository (or offers to clone it), switches to the bookmark after asking, pulls it, and opens the file. Resolving is live: everyone on the same resolver page (a room per repository, bookmark and path, over server-sent events at `/{owner}/{name}/resolve-live/{bookmark}/{path}`) sees who else is there and each other's choices as they are made, region by region, the last choice for a region winning (free text is shared whole, a moment after typing stops); a newcomer gets the choices so far; and when one of them commits, the others are told the resolution landed, with a link to it, and their form is disabled. Rooms are in memory and end when the last viewer leaves. The change page tags resolution changes. Otherwise the page gives the two-line client recipe.
316 316
317 317
### 6.11 Trust page
318 318
…
272 unchanged lines