{"id":51780250,"url":"https://github.com/elad12390/group-gh-pr-files","last_synced_at":"2026-07-20T11:02:59.115Z","repository":{"id":370453748,"uuid":"1294904265","full_name":"elad12390/group-gh-pr-files","owner":"elad12390","description":"A Firefox + Chrome extension to filter, group, star, and focus files in GitHub pull request diffs.","archived":false,"fork":false,"pushed_at":"2026-07-09T08:49:58.000Z","size":93,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-09T10:15:10.030Z","etag":null,"topics":["browser-extension","chrome-extension","code-review","firefox-extension","github","manifest-v3","pull-request"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elad12390.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-09T08:32:20.000Z","updated_at":"2026-07-09T08:49:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/elad12390/group-gh-pr-files","commit_stats":null,"previous_names":["elad12390/group-gh-pr-files"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/elad12390/group-gh-pr-files","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elad12390%2Fgroup-gh-pr-files","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elad12390%2Fgroup-gh-pr-files/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elad12390%2Fgroup-gh-pr-files/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elad12390%2Fgroup-gh-pr-files/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elad12390","download_url":"https://codeload.github.com/elad12390/group-gh-pr-files/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elad12390%2Fgroup-gh-pr-files/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35684017,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"ssl_error","status_checked_at":"2026-07-20T02:08:09.736Z","response_time":111,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser-extension","chrome-extension","code-review","firefox-extension","github","manifest-v3","pull-request"],"created_at":"2026-07-20T11:02:57.769Z","updated_at":"2026-07-20T11:02:59.037Z","avatar_url":"https://github.com/elad12390.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PR File Grouper for GitHub (Firefox + Chrome)\n\n[![CI](https://github.com/elad12390/group-gh-pr-files/actions/workflows/ci.yml/badge.svg)](https://github.com/elad12390/group-gh-pr-files/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)\n\nA browser extension (works in **Firefox** and **Chrome**) that makes reviewing\nlarge GitHub pull requests fast. It adds a side panel to a PR's\n**Files changed / changes** view where you can:\n\n- **Folder tree** view with collapsible folders and a folder checkbox that\n  selects every file inside it — or toggle to a flat list any time.\n- **Resizable** — drag the panel's left edge; the width is remembered and the\n  page reflows to fit (it never overlays the diff).\n- **Filter** files by name, `/regex/`, or space-separated terms (OR).\n- **Quick-select by type** with one click — `Tests`, `__init__`, `.d.ts`,\n  `Configs`, `Styles`, `Docs`, plus auto-generated chips per file extension.\n- **Multi-select** with checkboxes, **Shift-click** for ranges, and\n  **Select shown** for everything currently filtered.\n- **Group** a selection under a name and re-apply it later (**focus** = select +\n  show only). Groups are saved per pull request.\n- **Star** important files — they get a gold accent in the diff view and can be\n  isolated with **★ only**.\n- **Show only** the selected files (hides every other diff and trims the file\n  tree) so you can review a subset in isolation.\n- **Mark selected as Viewed / Unviewed** using GitHub's own controls.\n\nWorks on both the classic `Files changed` tab and the new `changes` experience.\n\n## Install (temporary, for development)\n\nThe same folder loads in both browsers (one MV3 manifest; Chrome ignores the\nFirefox-only `browser_specific_settings` key).\n\n**Firefox**\n\n1. Go to `about:debugging#/runtime/this-firefox`.\n2. **Load Temporary Add-on…** → select `manifest.json` in this folder.\n3. (Removed on restart. To keep it, package + sign — see below.)\n\n**Chrome / Edge / Brave**\n\n1. Go to `chrome://extensions` and enable **Developer mode** (top-right).\n2. **Load unpacked** → select this folder.\n\nThen open any GitHub pull request's files view and click the **▤ Files** button\n(bottom-right) or press \u003ckbd\u003eAlt\u003c/kbd\u003e+\u003ckbd\u003eShift\u003c/kbd\u003e+\u003ckbd\u003eG\u003c/kbd\u003e.\n\n## Develop / lint / build / test\n\n```bash\nbun install              # dev tooling (web-ext, selenium-webdriver, playwright)\n\nbun run lint             # web-ext lint  → 0 errors, 0 warnings\nbun run build            # → web-ext-artifacts/pr_file_grouper_for_github-\u003cv\u003e.zip\nbun run icons            # regenerate PNG icons from icons/icon.svg\nbun run test:e2e:firefox # real-Firefox E2E (geckodriver)\nbun run test:e2e:chrome  # real-Chrome E2E (Playwright --load-extension)\n\n# run a scratch Firefox with the extension loaded\nbunx web-ext run --source-dir .\n```\n\n\u003e Icons are PNG (Chrome rejects SVG manifest icons; Firefox accepts PNG too), so\n\u003e one icon set + one manifest serves both browsers.\n\n## Verification (Bulletproof E2E)\n\nBehavior is defined in [`.idd/modules/pr-file-grouper/INTENT.md`](.idd/modules/pr-file-grouper/INTENT.md)\nand specified as Gherkin scenarios in\n[`.bdd/features/pr-file-grouper.feature`](.bdd/features/pr-file-grouper.feature).\n\nThese run against a **real system** — no mocks — driving the **real extension**\nin a **real browser**.\n\n`bun run test:e2e:firefox` ([`.bdd/steps/run.mjs`](.bdd/steps/run.mjs)) launches\n**real Firefox** via `geckodriver` and installs the add-on as a temporary\nextension (exactly like `about:debugging`):\n\n- **Group A — live GitHub (classic view):** a real public PR — detection,\n  filtering, \"Show only\" hide/restore, star surviving a real reload.\n- **Group B — new \"changes\" view:** the live view is login-gated, so its\n  captured DOM is served under a real `github.com` URL and the real content\n  script runs against it — filters, presets, `:has()` focus in the real CSS\n  engine, tree/folders/`pr` root, viewed toggles, groups, resize, persistence.\n\n`bun run test:e2e:chrome` ([`.bdd/steps/run-chrome.mjs`](.bdd/steps/run-chrome.mjs))\nloads the same extension into **real Chrome** with Playwright (`--load-extension`)\nand runs the same feature set, proving cross-browser parity.\n\nRequires Firefox + `geckodriver` (`brew install geckodriver`) for the Firefox\nrun, and Playwright's Chromium (`bunx playwright install chromium`) for Chrome.\n\n## Usage tips\n\n- **Filter syntax**: plain text is a case-insensitive substring. Wrap in slashes\n  for regex, e.g. `/\\.test\\.tsx?$/`. Separate terms with spaces to OR them:\n  `__init__ .test .spec`.\n- **Build a group**: click type chips (they add to the selection), refine with\n  checkboxes, type a name and **Save**. Later, click the group to re-select, or\n  **focus** to select + show only.\n- **Focus review**: select files (or a group) → **Show only**. Toggle again to\n  restore all files.\n- Data (groups + starred files) is stored locally per `owner/repo#PR`.\n\n## Files\n\n| File | Purpose |\n| --- | --- |\n| `manifest.json` | One MV3 manifest for Firefox (140+) and Chrome |\n| `src/content.js` | All logic + the shadow-DOM panel (`browser`/`chrome` shim) |\n| `src/popup.html` / `src/popup.js` | Toolbar button that toggles the panel |\n| `icons/icon.svg` | Icon source; `icons/icon-*.png` are generated (`bun run icons`) |\n| `.idd/` | Intent spec (what the extension must do) |\n| `.bdd/` | Gherkin features + real Firefox/Chrome E2E runners + fixtures |\n| `package.json` | Dev scripts (`lint`, `build`, `icons`, `test:e2e:*`) |\n\n## Notes on robustness\n\n- The panel is rendered in a **shadow root**, so GitHub styles can't leak in and\n  the extension's styles can't leak out.\n- Diff hiding / starring is done with a single page-level `\u003cstyle\u003e` keyed by each\n  file's stable diff id, so it survives GitHub's React re-renders and the new\n  UI's `content-visibility` lazy rendering.\n- The script re-scans on SPA navigation (Turbo/pushState) and on DOM mutations.\n\n## Contributing\n\nContributions are welcome! Please read the [contributing guide](CONTRIBUTING.md)\nfor setup, coding conventions, and the intent-first, real-browser-tested\nworkflow. Good places to start:\n\n- [Report a bug](https://github.com/elad12390/group-gh-pr-files/issues/new?template=bug_report.yml)\n- [Request a feature](https://github.com/elad12390/group-gh-pr-files/issues/new?template=feature_request.yml)\n- Open a pull request using the PR template\n\nThis project follows the [Contributor Covenant](CODE_OF_CONDUCT.md) code of\nconduct.\n\n## Security\n\nFound a vulnerability? Please report it privately — see the\n[security policy](SECURITY.md). Don't open public issues for security reports.\n\n## License\n\nReleased under the [MIT License](LICENSE) © 2026 Elad Ben Haim.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felad12390%2Fgroup-gh-pr-files","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felad12390%2Fgroup-gh-pr-files","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felad12390%2Fgroup-gh-pr-files/lists"}