guito 0.6.1 → 1.0.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 +59 -0
- package/README.md +2 -0
- package/bin/avatars.js +35 -0
- package/bin/guito-server.js +1149 -78
- package/bin/repository-state.js +25 -0
- package/bin/ui/3rdpartylicenses.txt +256 -0
- package/bin/ui/browser/index.html +1 -1
- package/bin/ui/browser/main-MPHQHWT5.js +64 -0
- package/package.json +5 -1
- package/bin/ui/browser/main-SN64JYAQ.js +0 -6
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,65 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to Guito are documented in this file. The project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html), and this changelog is structured around [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
4
4
|
|
|
5
|
+
## [1.0.0] - 2026-09-13
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- Keep Azure DevOps Windows single sign-on working with curl builds that do not support `--ntlm`, using Negotiate with the current Windows session credentials.
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- Replace the toolbar settings dropdown with a full repository settings dialog in standalone Guito. Inside the VS Code extension, the same gear opens VS Code's Settings editor filtered to Guito, including graph, stash, and changed-file layout settings that update open panels immediately.
|
|
14
|
+
- Remove the Guito title bar; a compact "Guito" title remains in the toolbar next to the repository panel toggle, the app icon and name stay in the browser or VS Code tab, and the commit search moved into the toolbar, right before the Fetch button.
|
|
15
|
+
- Replace the branches dropdown with a hamburger button on the left of the toolbar that opens a repository side panel.
|
|
16
|
+
- Restyle error banners across the app with softer colors, rounded borders, an error icon, improved text wrapping, and accessible close buttons. Keep retry actions available and preserve staging and commit safeguards when status errors are dismissed.
|
|
17
|
+
- Speed up navigation to unloaded search results by calculating their history indexes and loading all missing pages through the selected result in one request.
|
|
18
|
+
- Keep the toolbar usable on narrow windows: below 720px the commit search shrinks, and below 640px the Fetch, Pull, Push, Refresh, and Settings buttons collapse into a three-dots "More actions" menu that keeps every entry, including the pull request and settings actions.
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- Create worktrees from the repository side panel with a folder path, a native VS Code folder picker, and an available local-branch selector. Right-click a linked worktree to remove it after confirmation; the current worktree and dirty worktrees remain protected.
|
|
23
|
+
- Add an Azure DevOps Pull Requests section to the repository side panel for active pull requests created by or assigned to the signed-in user. A full review dialog provides Overview, Files, and Comments tabs with sanitized Markdown, title and description editing, reviewer and vote management, draft publishing, completion and auto-complete options, comment threads, lazy per-file diffs, and inline line comments.
|
|
24
|
+
- List every repository tag in a collapsible Tags section of the side panel, below the branches. Clicking a tag opens the commit it points to in the history, loading older pages until that commit becomes visible, the tag whose commit is open in the details pane is highlighted, and right-clicking a tag keeps the existing tag actions: view details, delete tag, push tag, create archive, and copy tag name. Tags load together with the rest of the panel and refresh with the repository.
|
|
25
|
+
- Expand standalone repository settings with Show Tags and Show Remote Branches controls — the latter shows or hides remote branches in both the repository side panel and the branch pills on commits — plus editable/removable Git user details, add/edit/remove remote configuration with separate fetch and push URLs, and local or global issue-linking rules that turn matching issue references in commit subjects and bodies into hyperlinks. The VS Code extension also contributes tag, remote-branch, and issue-linking preferences to its native Settings page.
|
|
26
|
+
- Configure the automatic branch name used when creating a pull request from a new remote-only branch. The template supports computer user name, random text, current and target branches, pull request title, repository, UTC date/time, and timestamp variables, and defaults to `pr/${randomstring}`.
|
|
27
|
+
- View stashes in the commit table. Each stash appears as a pinned row above the history, newest first, with a `stash@{n}` pill (styled like the tag pills), the stash message, date, author, and short hash; clicking a row opens its diff in the details pane, and right-clicking keeps the Apply, Pop, Drop, and Copy Name actions. The new "Hide Stashes" / "Show Stashes" toggle in the toolbar Settings menu turns the rows off and on, persisted per repository in the server-side settings file like the graph setting; stashes also load without opening the repository side panel.
|
|
28
|
+
- Turn the Fetch button into a menu with "Fetch" and "Fetch (prune)" entries; pruning runs `git fetch --prune`, which also deletes remote-tracking branches that no longer exist on the remote.
|
|
29
|
+
- View changed files (staged, unstaged, and commit changes) as a directory tree or a flat list. The new "View Files as Tree" / "View Files as Flat List" toggle in the toolbar Settings menu switches both the uncommitted-changes panel and commit details; folders can be collapsed (hiding the files inside), nest by depth, sort before files, and show the additions and deletions summed below them. The choice is persisted per repository in the server-side settings file, and collapsed folders stay collapsed while the working tree refreshes.
|
|
30
|
+
- Add a repository side panel with collapsible tree views for branches, tags, stashes, and worktrees. Branches are grouped into local and remote sections, clicking a branch filters the history like the old dropdown, and right-clicking keeps the branch context menu. Stashes offer apply, pop, drop, and copy-name actions from their context menu, and worktrees are listed with their branch and the served worktree marked as current; tags, stashes, and worktrees load when the panel opens and refresh together with the repository.
|
|
31
|
+
- Add a Settings menu behind the toolbar gear icon with a "Hide Git Graph" toggle. The choice is persisted per repository in the server-side settings file (like the Azure DevOps URL) and survives reloads; hiding the graph also skips its layout computation.
|
|
32
|
+
- Make commit search more compact by placing its navigation arrows inside the input and showing a top-right count badge (`2/10` for a focused match, or a total capped at `99+`). Move the Navigate/Filter choice into the persisted Search mode setting, defaulting to Navigate and also exposed as `guito.searchMode` in VS Code; filtering shows only matching commits and hides the Git graph.
|
|
33
|
+
- Add a persisted case-sensitive commit-search setting, also exposed as `guito.searchCaseSensitive` in VS Code. Searches remain case insensitive by default.
|
|
34
|
+
- Open file diffs in the native VS Code diff tab. The new `guito.diffViewer` setting chooses between Guito's own diff dialog (the default) and a VS Code diff tab, which shows the file at both refs (commit, HEAD, index, or working tree) with VS Code's own diff editor. The setting takes effect immediately in open Guito panels; binary files and the standalone browser app keep using Guito's dialog.
|
|
35
|
+
- Show server error responses in the Guito output channel of the VS Code extension. Failed API requests (HTTP status 400 and above, including unhandled server errors) are logged with their method, path, status, and error body, prefixed with the repository name so that several open Guito panels do not mix their entries.
|
|
36
|
+
- Show the Guito logo on the VS Code webview editor tab.
|
|
37
|
+
|
|
38
|
+
## [0.6.2] - 2026-09-09
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- Show author avatars in the commit table and the commit detail pane. Avatars are looked up by the author email on Gravatar, cached for a day, and fall back to initials when no image is available.
|
|
43
|
+
- Refresh Guito automatically when the repository changes. A lightweight probe runs every few seconds and whenever the window regains focus, detects commits, branches, tags, configuration, mailmap, and working tree changes made outside Guito (for example from a terminal or another tool), and then refreshes the history and the Uncommitted changes panel. History pages that were already loaded are kept, and the selected branch and commit stay valid after the refresh.
|
|
44
|
+
- Resize the Description column of the commit table by dragging, like the other columns. The chosen width is persisted across sessions together with the other column widths.
|
|
45
|
+
- Create draft pull requests with a "Create as draft" option in the Create Pull Request dialog.
|
|
46
|
+
- Move the commit search to the far right of the Guito title bar. The search box with its clear button, match counter, and previous/next navigation now sits next to the title instead of in the toolbar.
|
|
47
|
+
- Add the guito.autoReload setting (enabled by default) that controls whether Guito refreshes automatically as described above; it can also be set per repository in the server-side settings file.
|
|
48
|
+
|
|
49
|
+
### Changed
|
|
50
|
+
|
|
51
|
+
- Fill the window width with the commit table on load and when the window is resized: the Description column widens to absorb spare room, while resizing a column changes only that column and may leave the table narrower until the window is resized again. The saved widths act as minimums on narrow windows.
|
|
52
|
+
- The Uncommitted changes row shows your configured Git user name instead of "You", and commits display the author name from your Git configuration when the commit email matches it, while other authors and mailmap-rewritten names are left untouched.
|
|
53
|
+
- Tag suggestions in the Create Pull Request dialog now list labels already used by the repository's pull requests instead of Azure Boards work item tags.
|
|
54
|
+
- Reviewer, work item, and tag lookups in the Create Pull Request dialog show their own loading state and error message, cancel outdated requests while typing, and show a "No matches" hint instead of an empty list.
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
|
|
58
|
+
- Build pull request and pull request label URLs through the Azure DevOps repositories API so they resolve on Azure DevOps Server.
|
|
59
|
+
- Link work items to pull requests using the refs format Azure DevOps expects, and scope work item search to the current team project, accepting `#id` queries and returning at most 20 results.
|
|
60
|
+
- Strip `origin/` and `refs/heads/` prefixes from the pull request target branch before creating the pull request.
|
|
61
|
+
- Build Azure DevOps base URLs without duplicating collection path segments when the server URL path overlaps the remote repository path.
|
|
62
|
+
- Search reviewers through the collection identities API so the returned identities can be used directly as pull request reviewers.
|
|
63
|
+
|
|
5
64
|
## [0.6.1] - 2026-09-08
|
|
6
65
|
|
|
7
66
|
### Added
|
package/README.md
CHANGED
|
@@ -9,6 +9,7 @@ The name combines **GUI** and **Git**: **G**u**IT**o. It is also a [Portuguese w
|
|
|
9
9
|
## Features
|
|
10
10
|
|
|
11
11
|
- Visual commit graph with branch and tag references.
|
|
12
|
+
- Stashes listed in the commit table with apply, pop, and drop actions.
|
|
12
13
|
- Commit search by subject, body, author, or hash, with loading feedback and retries.
|
|
13
14
|
- Local and remote branch filtering.
|
|
14
15
|
- Commit and working-tree diffs powered by the Monaco editor, with inline and side-by-side layouts.
|
|
@@ -16,6 +17,7 @@ The name combines **GUI** and **Git**: **G**u**IT**o. It is also a [Portuguese w
|
|
|
16
17
|
- Context actions for creating branches and tags, checking out commits, cherry-picking, reverting, merging, rebasing, resetting, and exporting archives.
|
|
17
18
|
- Working-tree actions for stashing changes, resetting tracked changes, and cleaning untracked files.
|
|
18
19
|
- Stage and unstage files with multi-selection, preview staged and unstaged diffs, and commit staged changes.
|
|
20
|
+
- Review your active Azure DevOps pull requests from the repository side panel: edit details, manage reviewers and votes, complete or auto-complete, discuss comment threads, and add inline comments on file diffs.
|
|
19
21
|
- Browser-based CLI and a VS Code extension with local, Remote SSH, Dev Container, and Codespaces support.
|
|
20
22
|
|
|
21
23
|
> [!CAUTION]
|
package/bin/avatars.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
export function avatarCache(fetchImage = fetch) {
|
|
3
|
+
const entries = new Map();
|
|
4
|
+
return (email) => {
|
|
5
|
+
const hash = createHash('sha256').update(email.trim().toLowerCase()).digest('hex');
|
|
6
|
+
const cached = entries.get(hash);
|
|
7
|
+
if (cached && cached.expires > Date.now())
|
|
8
|
+
return cached.image;
|
|
9
|
+
if (entries.size >= 500)
|
|
10
|
+
entries.delete(entries.keys().next().value);
|
|
11
|
+
const entry = { expires: Date.now() + 86400000, image: Promise.resolve(null) };
|
|
12
|
+
entry.image = (async () => {
|
|
13
|
+
try {
|
|
14
|
+
const response = await fetchImage(`https://www.gravatar.com/avatar/${hash}?s=64&d=404`, {
|
|
15
|
+
signal: AbortSignal.timeout(5000),
|
|
16
|
+
});
|
|
17
|
+
if (response.status === 404)
|
|
18
|
+
return null;
|
|
19
|
+
if (!response.ok || !/^image\/(png|jpeg|gif|webp)/i.test(response.headers.get('content-type') ?? '')) {
|
|
20
|
+
throw new Error('Avatar unavailable');
|
|
21
|
+
}
|
|
22
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
23
|
+
if (buffer.length > 256000)
|
|
24
|
+
throw new Error('Avatar too large');
|
|
25
|
+
return { data: buffer, contentType: response.headers.get('content-type').split(';')[0] };
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
entry.expires = Date.now() + 60000;
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
})();
|
|
32
|
+
entries.set(hash, entry);
|
|
33
|
+
return entry.image;
|
|
34
|
+
};
|
|
35
|
+
}
|