OXYGENHUB

Write the forge's name as OxygenHub in everything people read 092b8bf9f2ac

Author
Andy McCall @andymccall <[email protected]>
When
· 2026-09-28 11:16 UTC
Signature
✔ signed by Andy McCall
Hash
092b8bf9f2acaf35cfa9afe209d25235f9ad08b4f3a7e3471fb7263e174f521e
Depends on
1cc0ff44e5ca 486c15b00314 52cef00143db 6e249bbf7777 95f69b4a3ac2 b2dd082c57e4 bf73998c5198 f0b06deac4b9
Depended on by
991516a107fa d21a85954a34 85a87a2d7d5b d41ae0fdfae6 d8ac8f93fd34 b03ac49048d6 d8c9bdc51ee0 bd69712343d2 b1047516e064 263de209e5ba 5888949525ec e04950748142 426ddc5039b5
In bookmarks
main
In tags
v0.10.0 v0.10.1 v0.10.2 v0.11.0 v0.11.1 v0.11.2 v0.13.0
Edits
88 atoms, 0 tree operations, 14 files

Browse the tree at this change

modified CHANGELOG.md +6 −2
1 1
# Changelog
2 2
3 +
## 0.6.1
4 +
5 +
- The name is written OxygenHub throughout.
6 +
3 7
## 0.6.0
4 8
5 9
- A **Releases** view: each repository's releases with their assets and source archives, to open or download.
…
13 unchanged lines
19 23
20 24
- A bell in the status bar with your unread notifications across every hub you are signed in to, and a message when new ones arrive (`oxygenhub.announceNotifications`).
21 25
- **Open Inbox**: your notifications, unread first; pick one to mark it read and open it, in the editor for proposals and issues of your workspace's repositories. Mark all as read from the top of the list.
22 -
- Needs Oxygenhub with the notifications API (2026-09-28) and a token with `user:read`.
26 +
- Needs OxygenHub with the notifications API (2026-09-28) and a token with `user:read`.
23 27
24 28
## 0.2.0
25 29
26 30
- Proposals expand to their changed files. Click one to open it in VS Code's diff editor: the target's state against the projected state, straight from the hub, no checkout needed.
27 31
- **View Changes** on a proposal (inline button, or in the detail) opens every file in one multi-file diff editor.
28 32
- Review threads appear in those diff editors on the projected side, and new comments there are anchored to the line's atom on the hub.
29 -
- Needs Oxygenhub with the proposal files and content API (2026-09-28).
33 +
- Needs OxygenHub with the proposal files and content API (2026-09-28).
30 34
31 35
## 0.1.2
32 36
…
17 unchanged lines
modified README.md +2 −2
1 -
# Oxygenhub for Visual Studio Code
1 +
# OxygenHub for Visual Studio Code
2 2
3 -
Proposals, reviews, issues and checks from an Oxygenhub in
3 +
Proposals, reviews, issues and checks from an OxygenHub in
4 4
the editor, built on the Oxygen extension the way the
5 5
GitHub Pull Requests extension builds on the built-in Git extension. The
6 6
specification is docs/spec.md in the repository.
…
14 unchanged lines
modified docs/spec.md +6 −6
1 -
# Oxygenhub for Visual Studio Code
1 +
# OxygenHub for Visual Studio Code
2 2
3 3
| | |
4 4
|---|---|
5 5
| **Status** | Draft 0.1 |
6 -
| **Scope** | The forge in the editor: sign in to an Oxygenhub, see and review proposals with comments anchored to atoms, approve with a seal, land, work with issues, watch checks, and open anything on the hub. The counterpart of the GitHub Pull Requests and Issues extension. |
7 -
| **Depends on** | `oxygen-vscode` ≥ 0.7.0 (its exported API and remote providers), Oxygenhub ≥ 0.5 (`/api/v1`), `oxy` with `seal --proposal` and `proposal land` |
6 +
| **Scope** | The forge in the editor: sign in to an OxygenHub, see and review proposals with comments anchored to atoms, approve with a seal, land, work with issues, watch checks, and open anything on the hub. The counterpart of the GitHub Pull Requests and Issues extension. |
7 +
| **Depends on** | `oxygen-vscode` ≥ 0.7.0 (its exported API and remote providers), OxygenHub ≥ 0.5 (`/api/v1`), `oxy` with `seal --proposal` and `proposal land` |
8 8
| **Date** | 2026-09-27 |
9 9
10 10
## 1. Goals
…
7 unchanged lines
18 18
19 19
## 2. How it compares
20 20
21 -
| GitHub Pull Requests and Issues | Oxygenhub for VS Code |
21 +
| GitHub Pull Requests and Issues | OxygenHub for VS Code |
22 22
|---|---|
23 23
| Sign in with GitHub (OAuth) | Sign in with a personal access token; an authentication provider `oxygenhub` other extensions can request |
24 24
| Pull Requests view: waiting for my review, created by me, all | Proposals view: **Assigned to me** (review requested or approval needed), **Mine**, **Open**, per repository |
…
28 unchanged lines
53 53
54 54
## 5. Proposals
55 55
56 -
The **Oxygenhub: Proposals** view lists, per repository that has a hub remote, proposals in three groups: needing me (open, not mine, where I have not approved or where my approval is pending a seal), mine, and other open ones. Each row shows number, title, author, target, state chips (draft, conflicted, landable) and the check summary. Actions: open detail, open on hub, check out, review (comment / request changes / approve), seal approval, land, close.
56 +
The **OxygenHub: Proposals** view lists, per repository that has a hub remote, proposals in three groups: needing me (open, not mine, where I have not approved or where my approval is pending a seal), mine, and other open ones. Each row shows number, title, author, target, state chips (draft, conflicted, landable) and the check summary. Actions: open detail, open on hub, check out, review (comment / request changes / approve), seal approval, land, close.
57 57
58 58
**Detail** is a webview: description, blockers, approvals (sealed or pending), checks, the changes list with signatures, and buttons for the actions. **Check out** fetches from the hub remote and sets a local bookmark `proposal/N` to the projected heads, then switches to it, so the files in the editor are the projected state; review threads then appear in place.
59 59
…
17 unchanged lines
77 77
78 78
## 8. Issues
79 79
80 -
The **Oxygenhub: Issues** view lists open issues per repository (assigned to me first). Actions: open detail (webview with the timeline and a comment box), open on hub, create issue (title and body inputs), close, reopen, assign to me.
80 +
The **OxygenHub: Issues** view lists open issues per repository (assigned to me first). Actions: open detail (webview with the timeline and a comment box), open on hub, create issue (title and body inputs), close, reopen, assign to me.
81 81
82 82
### 8.1 Issues from the editor
83 83
…
33 unchanged lines
modified package.json +32 −32
1 1
{
2 2
  "name": "oxygenhub-vscode",
3 -
  "displayName": "Oxygenhub",
4 -
  "description": "Proposals, reviews, issues and checks from an Oxygenhub, in the editor. Builds on the Oxygen extension.",
5 -
  "version": "0.6.0",
3 +
  "displayName": "OxygenHub",
4 +
  "description": "Proposals, reviews, issues and checks from an OxygenHub, in the editor. Builds on the Oxygen extension.",
5 +
  "version": "0.6.1",
6 6
  "publisher": "andymccall",
7 7
  "license": "MIT OR Apache-2.0",
8 8
  "icon": "assets/images/oxygenhub.png",
…
24 unchanged lines
33 33
    "authentication": [
34 34
      {
35 35
        "id": "oxygenhub",
36 -
        "label": "Oxygenhub"
36 +
        "label": "OxygenHub"
37 37
      }
38 38
    ],
39 39
    "configuration": {
40 -
      "title": "Oxygenhub",
40 +
      "title": "OxygenHub",
41 41
      "properties": {
42 42
        "oxygenhub.hubs": {
43 43
          "type": "array",
…
24 unchanged lines
68 68
      "activitybar": [
69 69
        {
70 70
          "id": "oxygenhub",
71 -
          "title": "Oxygenhub",
71 +
          "title": "OxygenHub",
72 72
          "icon": "assets/images/oxygenhub-activity.svg"
73 73
        }
74 74
      ]
…
17 unchanged lines
92 92
    "viewsWelcome": [
93 93
      {
94 94
        "view": "oxygenhub.proposals",
95 -
        "contents": "Sign in to an Oxygenhub to see proposals.\n[Sign in](command:oxygenhub.signIn)"
95 +
        "contents": "Sign in to an OxygenHub to see proposals.\n[Sign in](command:oxygenhub.signIn)"
96 96
      }
97 97
    ],
98 98
    "commands": [
99 99
      {
100 100
        "command": "oxygenhub.signIn",
101 101
        "title": "Sign in",
102 -
        "category": "Oxygenhub"
102 +
        "category": "OxygenHub"
103 103
      },
104 104
      {
105 105
        "command": "oxygenhub.signOut",
106 106
        "title": "Sign out",
107 -
        "category": "Oxygenhub"
107 +
        "category": "OxygenHub"
108 108
      },
109 109
      {
110 110
        "command": "oxygenhub.refresh",
111 111
        "title": "Refresh",
112 -
        "category": "Oxygenhub",
112 +
        "category": "OxygenHub",
113 113
        "icon": "$(refresh)"
114 114
      },
115 115
      {
116 116
        "command": "oxygenhub.inbox",
117 117
        "title": "Open Inbox",
118 -
        "category": "Oxygenhub",
118 +
        "category": "OxygenHub",
119 119
        "icon": "$(bell)"
120 120
      },
121 121
      {
122 122
        "command": "oxygenhub.openProposal",
123 123
        "title": "Open Proposal",
124 -
        "category": "Oxygenhub"
124 +
        "category": "OxygenHub"
125 125
      },
126 126
      {
127 127
        "command": "oxygenhub.openOnHub",
128 128
        "title": "Open on Hub",
129 -
        "category": "Oxygenhub",
129 +
        "category": "OxygenHub",
130 130
        "icon": "$(link-external)"
131 131
      },
132 132
      {
133 133
        "command": "oxygenhub.openProposalFile",
134 134
        "title": "Open Proposal File Diff",
135 -
        "category": "Oxygenhub"
135 +
        "category": "OxygenHub"
136 136
      },
137 137
      {
138 138
        "command": "oxygenhub.openProposalChanges",
139 139
        "title": "View Changes",
140 -
        "category": "Oxygenhub",
140 +
        "category": "OxygenHub",
141 141
        "icon": "$(diff-multiple)"
142 142
      },
143 143
      {
144 144
        "command": "oxygenhub.checkoutProposal",
145 145
        "title": "Check Out Proposal",
146 -
        "category": "Oxygenhub",
146 +
        "category": "OxygenHub",
147 147
        "icon": "$(git-branch)"
148 148
      },
149 149
      {
150 150
        "command": "oxygenhub.review",
151 151
        "title": "Review\u2026",
152 -
        "category": "Oxygenhub",
152 +
        "category": "OxygenHub",
153 153
        "icon": "$(comment-discussion)"
154 154
      },
155 155
      {
156 156
        "command": "oxygenhub.sealApproval",
157 157
        "title": "Seal My Approval (oxy seal --proposal)",
158 -
        "category": "Oxygenhub"
158 +
        "category": "OxygenHub"
159 159
      },
160 160
      {
161 161
        "command": "oxygenhub.land",
162 162
        "title": "Land Proposal",
163 -
        "category": "Oxygenhub"
163 +
        "category": "OxygenHub"
164 164
      },
165 165
      {
166 166
        "command": "oxygenhub.closeProposal",
167 167
        "title": "Close Proposal",
168 -
        "category": "Oxygenhub"
168 +
        "category": "OxygenHub"
169 169
      },
170 170
      {
171 171
        "command": "oxygenhub.createProposal",
172 172
        "title": "Propose Current Bookmark\u2026",
173 -
        "category": "Oxygenhub"
173 +
        "category": "OxygenHub"
174 174
      },
175 175
      {
176 176
        "command": "oxygenhub.newIssue",
177 177
        "title": "New Issue\u2026",
178 -
        "category": "Oxygenhub",
178 +
        "category": "OxygenHub",
179 179
        "icon": "$(add)"
180 180
      },
181 181
      {
182 182
        "command": "oxygenhub.draftRelease",
183 183
        "title": "Draft Release\u2026",
184 -
        "category": "Oxygenhub",
184 +
        "category": "OxygenHub",
185 185
        "icon": "$(tag)"
186 186
      },
187 187
      {
188 188
        "command": "oxygenhub.issueFromSelection",
189 189
        "title": "New Issue from Selection\u2026",
190 -
        "category": "Oxygenhub"
190 +
        "category": "OxygenHub"
191 191
      },
192 192
      {
193 193
        "command": "oxygenhub.openIssue",
194 194
        "title": "Open Issue",
195 -
        "category": "Oxygenhub"
195 +
        "category": "OxygenHub"
196 196
      },
197 197
      {
198 198
        "command": "oxygenhub.commentIssue",
199 199
        "title": "Comment on Issue\u2026",
200 -
        "category": "Oxygenhub"
200 +
        "category": "OxygenHub"
201 201
      },
202 202
      {
203 203
        "command": "oxygenhub.closeIssue",
204 204
        "title": "Close Issue",
205 -
        "category": "Oxygenhub"
205 +
        "category": "OxygenHub"
206 206
      },
207 207
      {
208 208
        "command": "oxygenhub.reopenIssue",
209 209
        "title": "Reopen Issue",
210 -
        "category": "Oxygenhub"
210 +
        "category": "OxygenHub"
211 211
      },
212 212
      {
213 213
        "command": "oxygenhub.assignMe",
214 214
        "title": "Assign to Me",
215 -
        "category": "Oxygenhub"
215 +
        "category": "OxygenHub"
216 216
      },
217 217
      {
218 218
        "command": "oxygenhub.newThread",
219 219
        "title": "Start Review Thread",
220 -
        "category": "Oxygenhub"
220 +
        "category": "OxygenHub"
221 221
      },
222 222
      {
223 223
        "command": "oxygenhub.reply",
224 224
        "title": "Reply",
225 -
        "category": "Oxygenhub"
225 +
        "category": "OxygenHub"
226 226
      },
227 227
      {
228 228
        "command": "oxygenhub.resolveThread",
229 229
        "title": "Resolve",
230 -
        "category": "Oxygenhub"
230 +
        "category": "OxygenHub"
231 231
      }
232 232
    ],
233 233
    "menus": {
…
141 unchanged lines
modified src/auth.ts +2 −2
…
15 unchanged lines
16 16
  private readonly disposables: vscode.Disposable[] = [];
17 17
18 18
  constructor(private readonly secrets: vscode.SecretStorage) {
19 -
    this.disposables.push(vscode.authentication.registerAuthenticationProvider("oxygenhub", "Oxygenhub", this, { supportsMultipleAccounts: true }));
19 +
    this.disposables.push(vscode.authentication.registerAuthenticationProvider("oxygenhub", "OxygenHub", this, { supportsMultipleAccounts: true }));
20 20
  }
21 21
22 22
  async load(): Promise<void> {
…
64 unchanged lines
87 87
    try {
88 88
      username = (await client.me()).username;
89 89
    } catch (e) {
90 -
      const pick = await vscode.window.showWarningMessage(`Oxygenhub: could not read your account (${(e as Error).message}); the token may lack user:read. Keep it anyway?`, "Keep", "Cancel");
90 +
      const pick = await vscode.window.showWarningMessage(`OxygenHub: could not read your account (${(e as Error).message}); the token may lack user:read. Keep it anyway?`, "Keep", "Cancel");
91 91
      if (pick !== "Keep") {
92 92
        return undefined;
93 93
      }
…
12 unchanged lines
modified src/diff.ts +2 −2
…
37 unchanged lines
38 38
    try {
39 39
      return (await this.auth.clientFor(r.base).proposalContent(r.owner, r.name, r.number, r.side, r.path)) ?? "";
40 40
    } catch (e) {
41 -
      void vscode.window.showWarningMessage(`Oxygenhub: could not load ${r.path}: ${(e as Error).message}`);
41 +
      void vscode.window.showWarningMessage(`OxygenHub: could not load ${r.path}: ${(e as Error).message}`);
42 42
      return "";
43 43
    }
44 44
  }
…
27 unchanged lines
72 72
/** Every file of a proposal in one multi-file diff editor. */
73 73
export async function openAllChanges(repo: RepoRef, p: api.Proposal, files: api.ProposalFile[]): Promise<void> {
74 74
  if (!files.length) {
75 -
    void vscode.window.showInformationMessage(`Oxygenhub: #${p.number} changes no files.`);
75 +
    void vscode.window.showInformationMessage(`OxygenHub: #${p.number} changes no files.`);
76 76
    return;
77 77
  }
78 78
  const resources = files.map((f) => {
…
5 unchanged lines
modified src/extension.ts +17 −17
…
34 unchanged lines
35 35
  const ext = vscode.extensions.getExtension<OxygenAPI>("oxygen.oxygen-vscode");
36 36
  oxygen = ext ? ((await ext.activate()) as OxygenAPI | undefined) : undefined;
37 37
  if (!oxygen) {
38 -
    void vscode.window.showWarningMessage("Oxygenhub: the Oxygen extension is not available; install oxygen.oxygen-vscode 0.7.0 or later.");
38 +
    void vscode.window.showWarningMessage("OxygenHub: the Oxygen extension is not available; install oxygen.oxygen-vscode 0.7.0 or later.");
39 39
  } else {
40 40
    context.subscriptions.push(oxygen.registerRemoteProvider(makeProvider({ bases: () => auth.bases() })));
41 41
    context.subscriptions.push(oxygen.onDidChangeRepositories(() => refreshAll()));
…
55 unchanged lines
97 97
        const r = await draftRelease(auth, repo);
98 98
        if (r) {
99 99
          releases.refresh();
100 -
          const open = await vscode.window.showInformationMessage(`Oxygenhub: released ${r.tag}.`, "Open on Hub");
100 +
          const open = await vscode.window.showInformationMessage(`OxygenHub: released ${r.tag}.`, "Open on Hub");
101 101
          if (open) {
102 102
            void vscode.env.openExternal(vscode.Uri.parse(r.url));
103 103
          }
104 104
        }
105 105
      } catch (e) {
106 -
        void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`);
106 +
        void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`);
107 107
      }
108 108
    }),
109 109
    vscode.commands.registerCommand("oxygenhub.openProposal", async (node?: ProposalNode) => {
…
23 unchanged lines
133 133
          await openAllChanges(repo, p, files);
134 134
          await review.loadDiff(repo, number);
135 135
        } catch (e) {
136 -
          void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`);
136 +
          void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`);
137 137
        }
138 138
      }),
139 139
    ),
…
23 unchanged lines
163 163
    vscode.commands.registerCommand("oxygenhub.reopenIssue", (...args: unknown[]) => withIssue(args, async (repo, number) => (await auth.clientFor(repo.base).setIssueState(repo.owner, repo.name, number, "open"), issues.refresh()))),
164 164
    vscode.commands.registerCommand("oxygenhub.assignMe", (...args: unknown[]) =>
165 165
      withIssue(args, async (repo, number) => {
166 -
        void vscode.window.showInformationMessage(`Oxygenhub: assigning is on the hub for now: ${hubUrl(repo.base, repo.owner, repo.name, { kind: "issue", number })}`);
166 +
        void vscode.window.showInformationMessage(`OxygenHub: assigning is on the hub for now: ${hubUrl(repo.base, repo.owner, repo.name, { kind: "issue", number })}`);
167 167
      }),
168 168
    ),
169 169
    vscode.commands.registerCommand("oxygenhub.reply", (reply: vscode.CommentReply) => review.reply(reply)),
…
88 unchanged lines
258 258
}
259 259
260 260
function runInTerminal(repo: HubRepo, command: string): Promise<void> {
261 -
  const t = vscode.window.createTerminal({ name: "Oxygenhub", cwd: repo.handle.root });
261 +
  const t = vscode.window.createTerminal({ name: "OxygenHub", cwd: repo.handle.root });
262 262
  t.show();
263 263
  t.sendText(command);
264 264
  return Promise.resolve();
…
14 unchanged lines
279 279
    await repo.handle.json(["bookmark", "switch", bookmark, "--json"]);
280 280
    await repo.handle.refresh();
281 281
    await review.load(repo, number);
282 -
    void vscode.window.showInformationMessage(`Oxygenhub: checked out #${number} as ${bookmark}; review threads are in place.`);
282 +
    void vscode.window.showInformationMessage(`OxygenHub: checked out #${number} as ${bookmark}; review threads are in place.`);
283 283
  } catch (e) {
284 -
    void vscode.window.showErrorMessage(`Oxygenhub: could not check out #${number}: ${(e as Error).message}`);
284 +
    void vscode.window.showErrorMessage(`OxygenHub: could not check out #${number}: ${(e as Error).message}`);
285 285
  }
286 286
}
287 287
…
13 unchanged lines
301 301
  try {
302 302
    await auth.clientFor(repo.base).review(repo.owner, repo.name, number, verdict.value, body);
303 303
  } catch (e) {
304 -
    void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`);
304 +
    void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`);
305 305
    return;
306 306
  }
307 307
  proposals.refresh();
…
13 unchanged lines
321 321
  }
322 322
  const source = repo.handle.currentBookmark;
323 323
  if (!source) {
324 -
    void vscode.window.showWarningMessage("Oxygenhub: no current bookmark.");
324 +
    void vscode.window.showWarningMessage("OxygenHub: no current bookmark.");
325 325
    return;
326 326
  }
327 327
  const remoteBookmarks = await auth.clientFor(repo.base).bookmarks(repo.owner, repo.name).catch(() => []);
…
11 unchanged lines
339 339
    proposals.refresh();
340 340
    void vscode.env.openExternal(vscode.Uri.parse(p.url));
341 341
  } catch (e) {
342 -
    void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`);
342 +
    void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`);
343 343
  }
344 344
}
345 345
…
11 unchanged lines
357 357
  try {
358 358
    const i = await auth.clientFor(repo.base).createIssue(repo.owner, repo.name, title, body);
359 359
    issues.refresh();
360 -
    void vscode.window.showInformationMessage(`Oxygenhub: opened #${i.number}.`);
360 +
    void vscode.window.showInformationMessage(`OxygenHub: opened #${i.number}.`);
361 361
  } catch (e) {
362 -
    void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`);
362 +
    void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`);
363 363
  }
364 364
}
365 365
…
5 unchanged lines
371 371
async function issueFromSelection(): Promise<void> {
372 372
  const editor = vscode.window.activeTextEditor;
373 373
  if (!editor || editor.document.uri.scheme !== "file") {
374 -
    void vscode.window.showWarningMessage("Oxygenhub: open a file of the repository first.");
374 +
    void vscode.window.showWarningMessage("OxygenHub: open a file of the repository first.");
375 375
    return;
376 376
  }
377 377
  const doc = editor.document;
378 378
  const file = doc.uri.fsPath;
379 379
  const repo = (await proposals.repos()).filter((r) => file.startsWith(r.handle.root + "/") || file.startsWith(r.handle.root + "\\")).sort((a, b) => b.handle.root.length - a.handle.root.length)[0];
380 380
  if (!repo) {
381 -
    void vscode.window.showWarningMessage("Oxygenhub: this file is not in a repository with a hub remote.");
381 +
    void vscode.window.showWarningMessage("OxygenHub: this file is not in a repository with a hub remote.");
382 382
    return;
383 383
  }
384 384
  const sel = editor.selection;
…
21 unchanged lines
406 406
      const line = doc.lineAt(todoLine);
407 407
      const annotated = annotateTodo(line.text, issue.number);
408 408
      if (annotated !== line.text) {
409 -
        const pick = await vscode.window.showInformationMessage(`Oxygenhub: opened #${issue.number}. Record it in the TODO?`, "Add (#" + issue.number + ")");
409 +
        const pick = await vscode.window.showInformationMessage(`OxygenHub: opened #${issue.number}. Record it in the TODO?`, "Add (#" + issue.number + ")");
410 410
        if (pick) {
411 411
          await editor.edit((e) => e.replace(line.range, annotated));
412 412
        }
…
1 unchanged lines
414 414
    }
415 415
    await showIssue(auth, repo, issue);
416 416
  } catch (e) {
417 -
    void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`);
417 +
    void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`);
418 418
  }
419 419
}
420 420
…
1 unchanged lines
modified src/hubapi.d.ts +1 −1
1 1
// Generated by `cargo run -p hub-api --bin hub-api-typescript`; do not edit.
2 -
// Types of the Oxygenhub JSON API (hub spec §12.1).
2 +
// Types of the OxygenHub JSON API (hub spec §12.1).
3 3
4 4
export type Visibility = "public" | "internal" | "private";
5 5
…
406 unchanged lines
modified src/inbox.ts +4 −4
…
26 unchanged lines
27 27
    private readonly open: Opener,
28 28
  ) {
29 29
    this.item.command = "oxygenhub.inbox";
30 -
    this.item.name = "Oxygenhub notifications";
30 +
    this.item.name = "OxygenHub notifications";
31 31
  }
32 32
33 33
  /** Every hub's inbox; hubs that fail (offline, token without user:read) are skipped. */
…
28 unchanged lines
62 62
    if (announce && this.lastUnread !== undefined && unread > this.lastUnread) {
63 63
      const newest = entries.find((e) => !e.n.read);
64 64
      const more = unread - this.lastUnread;
65 -
      const text = more === 1 && newest ? `Oxygenhub: ${newest.n.actor ? newest.n.actor + ": " : ""}${newest.n.title}` : `Oxygenhub: ${more} new notifications`;
65 +
      const text = more === 1 && newest ? `OxygenHub: ${newest.n.actor ? newest.n.actor + ": " : ""}${newest.n.title}` : `OxygenHub: ${more} new notifications`;
66 66
      void vscode.window.showInformationMessage(text, "Open Inbox").then((pick) => pick && vscode.commands.executeCommand("oxygenhub.inbox"));
67 67
    }
68 68
    this.lastUnread = unread;
…
13 unchanged lines
82 82
      items.unshift({ label: "$(check-all) Mark all as read", all: true, alwaysShow: true });
83 83
    }
84 84
    if (!entries.length) {
85 -
      void vscode.window.showInformationMessage("Oxygenhub: your inbox is empty.");
85 +
      void vscode.window.showInformationMessage("OxygenHub: your inbox is empty.");
86 86
      return;
87 87
    }
88 -
    const pick = await vscode.window.showQuickPick(items, { placeHolder: "Oxygenhub inbox", matchOnDescription: true, matchOnDetail: true });
88 +
    const pick = await vscode.window.showQuickPick(items, { placeHolder: "OxygenHub inbox", matchOnDescription: true, matchOnDetail: true });
89 89
    if (!pick) {
90 90
      return;
91 91
    }
…
37 unchanged lines
modified src/issues.ts +1 −1
…
48 unchanged lines
49 49
        list.sort((a, b) => Number(b.assignees.includes(me ?? "")) - Number(a.assignees.includes(me ?? "")) || b.updated_ms - a.updated_ms);
50 50
        return list.map((i) => ({ kind: "issue", repo: node.repo, i }));
51 51
      } catch (e) {
52 -
        void vscode.window.showWarningMessage(`Oxygenhub: ${(e as Error).message}`);
52 +
        void vscode.window.showWarningMessage(`OxygenHub: ${(e as Error).message}`);
53 53
        return [];
54 54
      }
55 55
    }
…
19 unchanged lines
modified src/proposals.ts +2 −2
…
143 unchanged lines
144 144
      try {
145 145
        list = await this.proposalsOf(node.repo);
146 146
      } catch (e) {
147 -
        void vscode.window.showWarningMessage(`Oxygenhub: ${(e as Error).message}`);
147 +
        void vscode.window.showWarningMessage(`OxygenHub: ${(e as Error).message}`);
148 148
        return [];
149 149
      }
150 150
      const me = this.auth.sessionFor(node.repo.base)?.username;
…
14 unchanged lines
165 165
        const files = await this.filesOf(node.repo, node.p);
166 166
        return files.map((f) => ({ kind: "file", repo: node.repo, p: node.p, f }));
167 167
      } catch (e) {
168 -
        void vscode.window.showWarningMessage(`Oxygenhub: ${(e as Error).message}`);
168 +
        void vscode.window.showWarningMessage(`OxygenHub: ${(e as Error).message}`);
169 169
      }
170 170
    }
171 171
    return [];
…
28 unchanged lines
modified src/provider.ts +1 −1
…
10 unchanged lines
11 11
export function makeProvider(hubs: KnownHubs) {
12 12
  return {
13 13
    id: "oxygenhub",
14 -
    label: "Oxygenhub",
14 +
    label: "OxygenHub",
15 15
    matches(remoteUrl: string): boolean {
16 16
      const p = parseRepoUrl(remoteUrl);
17 17
      return !!p && hubs.bases().some((b) => b.replace(/\/$/, "") === p.base);
…
7 unchanged lines
modified src/releases.ts +2 −2
…
63 unchanged lines
64 64
        const list = await this.auth.clientFor(node.repo.base).releases(node.repo.owner, node.repo.name);
65 65
        return list.map((r) => ({ kind: "release", repo: node.repo, r }));
66 66
      } catch (e) {
67 -
        void vscode.window.showWarningMessage(`Oxygenhub: ${(e as Error).message}`);
67 +
        void vscode.window.showWarningMessage(`OxygenHub: ${(e as Error).message}`);
68 68
        return [];
69 69
      }
70 70
    }
…
17 unchanged lines
88 88
  const released = new Set(releases.map((r) => r.tag));
89 89
  const open = tags.filter((t) => !released.has(t.name));
90 90
  if (!open.length) {
91 -
    void vscode.window.showInformationMessage(`Oxygenhub: every tag of ${repo.owner}/${repo.name} has a release. Tag a state with \`oxy tag create\` and push it first.`);
91 +
    void vscode.window.showInformationMessage(`OxygenHub: every tag of ${repo.owner}/${repo.name} has a release. Tag a state with \`oxy tag create\` and push it first.`);
92 92
    return undefined;
93 93
  }
94 94
  const pick = await vscode.window.showQuickPick(
…
26 unchanged lines
modified src/review.ts +2 −2
…
15 unchanged lines
16 16
17 17
/** The hub's comments as threads on files under the repository root. */
18 18
export class ReviewController implements vscode.Disposable {
19 -
  private readonly controller = vscode.comments.createCommentController("oxygenhub", "Oxygenhub review");
19 +
  private readonly controller = vscode.comments.createCommentController("oxygenhub", "OxygenHub review");
20 20
  private threads: vscode.CommentThread[] = [];
21 21
  private active: { repo: HubRepo; number: number } | undefined;
22 22
  /** Threads in diff editors, per proposal (`base/owner/name#n`). */
…
89 unchanged lines
112 112
      try {
113 113
        await postLineComment(this.auth, repo, r.number, r.path, line, reply.text);
114 114
      } catch (e) {
115 -
        void vscode.window.showErrorMessage(`Oxygenhub: ${(e as Error).message}`);
115 +
        void vscode.window.showErrorMessage(`OxygenHub: ${(e as Error).message}`);
116 116
        return;
117 117
      }
118 118
      // A new thread from the gutter is replaced by the hub's copy.
…
39 unchanged lines