Files
awesome-copilot/extensions/git-worktree-explorer/public/index.html
T
ca87445cb2 Add Git Worktree Explorer canvas (#2344)
* Add Git Worktree Explorer canvas

Add an interactive repository, worktree, branch, and commit graph with GitHub PR enrichment, safe inspection actions, and shared lane visualization.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 69dd5824-7094-4b82-8cfa-83c2fbe53307

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* Address review feedback for Git Worktree Explorer

Security
- Quote copied shell commands (git -C / git log) with shell-safe single quoting and --end-of-options via new public/shell-quote.mjs
- Move repository path into the untrusted data block of the commit Ask Copilot prompt

Performance
- Compute branch divergence with a single `git for-each-ref %(ahead-behind:...)` query (Git 2.41+), falling back to rev-list with bounded concurrency (8) instead of one process per branch
- Drop the unused `git show --stat` summary from commit details

Correctness
- Only attach same-repository pull requests to local branches (filter isCrossRepository / headRepositoryOwner)
- Resolve the default branch by full name or upstream instead of a suffix match (server + client)
- Preserve already-loaded commit pages when a load-more request fails; only reset requests show the error state
- Size the lane graph from the widest row (lanes + branch badges + text) and collapse >3 branch tips into a "+N more" badge

Accessibility / UX
- Add aria-pressed to view toggles and graph nodes; replace the unimplemented ARIA tree with group/button semantics
- preventDefault on Space/Enter for branch badges so keyboard activation does not scroll
- Use a lane palette that meets 3:1 contrast in both light and dark themes (tested)
- Mobile inspector no longer auto-opens on snapshot load and gains a close button

Tests: 19 -> 29

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 18350039-5e2b-40f0-b537-bc22cabcbb1b

* Migrate git-worktree-explorer to plugins/ manifest layout

Move the manifest from extensions/git-worktree-explorer/.github/plugin/plugin.json to plugins/git-worktree-explorer/plugin.json with README and copilot-extension.json, matching the extensions-container migration (#2334). Regenerated marketplace.json and docs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 18350039-5e2b-40f0-b537-bc22cabcbb1b

* Address follow-up review: shell-specific quoting and sibling row controls

- quoteShellArg/formatShellCommand take a target shell; PowerShell doubles apostrophes while POSIX uses '\\''. app.js detects the platform and reports which syntax was copied.
- Commit rows no longer nest branch badge buttons inside the row button; the row button and badges are sibling controls.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 18350039-5e2b-40f0-b537-bc22cabcbb1b

* Make the closed mobile inspector inert and restore focus to the graph

When the inspector overlay is dismissed on narrow viewports it is now marked inert/aria-hidden so its controls leave the tab order and accessibility tree, focus returns to the selected graph control, Escape closes it, and viewport changes re-sync the state.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 18350039-5e2b-40f0-b537-bc22cabcbb1b

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Aaron Powell <me@aaron-powell.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Copilot-Session: 69dd5824-7094-4b82-8cfa-83c2fbe53307
Copilot-Session: 18350039-5e2b-40f0-b537-bc22cabcbb1b
2026-08-26 10:25:00 +10:00

59 lines
2.3 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Git Worktree Explorer</title>
<link rel="stylesheet" href="/styles.css" />
</head>
<body>
<header class="app-header">
<div class="title-block">
<span class="mark" aria-hidden="true"></span>
<div>
<h1>Git Worktree Explorer</h1>
<p id="repo-path">Loading repository…</p>
</div>
</div>
<div class="header-actions">
<span id="github-status" class="status-pill">Local Git</span>
<button id="refresh-button" class="icon-button" type="button" title="Refresh repository" aria-label="Refresh repository"></button>
</div>
</header>
<nav id="breadcrumbs" class="breadcrumbs" aria-label="Topology breadcrumbs"></nav>
<main class="workspace">
<section class="graph-panel" aria-label="Git repository topology">
<div class="graph-toolbar" aria-label="Graph controls">
<button id="view-worktrees" class="view-button active" type="button" aria-pressed="true">Worktrees</button>
<button id="view-branches" class="view-button" type="button" aria-pressed="false">Branches</button>
<span class="toolbar-divider" aria-hidden="true"></span>
<button id="zoom-out" type="button" aria-label="Zoom out"></button>
<button id="zoom-reset" type="button">100%</button>
<button id="zoom-in" type="button" aria-label="Zoom in">+</button>
</div>
<div id="loading" class="loading">
<span class="spinner" aria-hidden="true"></span>
<span>Reading worktrees and branches…</span>
</div>
<div id="empty-state" class="empty-state" hidden></div>
<div id="graph-scroll" class="graph-scroll">
<svg id="graph" role="group" aria-label="Git topology graph"></svg>
</div>
</section>
<aside id="inspector" class="inspector" aria-live="polite">
<div class="inspector-empty">
<span class="inspector-icon" aria-hidden="true"></span>
<h2>Select a node</h2>
<p>Details and safe actions appear here.</p>
</div>
</aside>
</main>
<div id="toast" class="toast" role="status" aria-live="polite"></div>
<script type="module" src="/app.js"></script>
</body>
</html>