Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
bc48afc
docs: map existing codebase
justcarlson Jan 25, 2026
386006e
docs: initialize project
justcarlson Jan 25, 2026
aedd791
chore: add project config
justcarlson Jan 25, 2026
64dc5b8
docs: complete project research
justcarlson Jan 25, 2026
051227c
docs: define v1 requirements
justcarlson Jan 25, 2026
9ec2f5f
docs: create roadmap (6 phases)
justcarlson Jan 25, 2026
479f10f
docs(01): capture phase context
justcarlson Jan 25, 2026
b30daef
docs(01): research phase domain
justcarlson Jan 25, 2026
b7cb5b7
docs(01): create phase plan
justcarlson Jan 25, 2026
97c64ef
chore(01-01): initialize WXT project with TypeScript
justcarlson Jan 25, 2026
401b8fc
chore(01-01): configure TypeScript with strict mode
justcarlson Jan 25, 2026
158357e
chore(01-02): configure Biome linter and formatter
justcarlson Jan 25, 2026
e078d45
feat(01-01): create minimal entrypoint scaffolds
justcarlson Jan 25, 2026
ee7384f
chore(01-02): set up Husky and lint-staged pre-commit hooks
justcarlson Jan 25, 2026
69beeed
chore(01-02): configure Biome linter and formatter
justcarlson Jan 25, 2026
09f71fb
docs(01-02): complete Biome and pre-commit hooks plan
justcarlson Jan 25, 2026
18109e0
chore(01-03): move static assets to WXT public directory
justcarlson Jan 25, 2026
8c2220b
feat(01-03): add bundle visualizer for size analysis
justcarlson Jan 25, 2026
b80f804
docs(01-03): complete static assets and bundle analysis plan
justcarlson Jan 25, 2026
a0d999b
docs(01-04): complete build infrastructure verification plan
justcarlson Jan 25, 2026
3971c17
docs(01): complete Build Foundation phase
justcarlson Jan 25, 2026
4081f1c
docs(02): capture phase context
justcarlson Jan 25, 2026
fe5c282
docs(02): research phase domain
justcarlson Jan 25, 2026
e447f09
docs(02): create phase 2 core migration plans
justcarlson Jan 25, 2026
3958898
feat(02-01): add shared type definitions for URL matching
justcarlson Jan 25, 2026
9256d28
feat(02-02): create type-safe storage wrapper
justcarlson Jan 25, 2026
7c0b74b
feat(02-01): port URL matching logic to TypeScript
justcarlson Jan 25, 2026
700be6e
feat(02-02): create type-safe tabs wrapper
justcarlson Jan 25, 2026
2270d0b
docs(02-01): complete URL types & matching plan
justcarlson Jan 25, 2026
b0ae0af
docs(02-02): complete chrome API wrappers plan
justcarlson Jan 25, 2026
1641e8b
feat(02-03): implement service worker with navigation interception
justcarlson Jan 25, 2026
dbfe8c6
feat(02-03): add action icon state management and message handler
justcarlson Jan 25, 2026
e4c8b36
docs(02-03): complete service worker plan
justcarlson Jan 25, 2026
12c392d
docs(02-04): complete core migration verification plan
justcarlson Jan 25, 2026
19a11cb
docs(02): complete Core Migration phase
justcarlson Jan 25, 2026
b09f7b8
docs(03): capture phase context
justcarlson Jan 25, 2026
4e941ed
docs(03): research phase domain
justcarlson Jan 25, 2026
a6defb6
docs(03): create phase plan
justcarlson Jan 25, 2026
fe46e56
feat(03-01): create CSS design tokens with dark mode support
justcarlson Jan 25, 2026
6541d6e
feat(03-01): copy hero images to public folder
justcarlson Jan 25, 2026
f07a997
docs(03-01): complete design tokens and assets plan
justcarlson Jan 25, 2026
c789125
feat(03-03): create welcome page HTML structure
justcarlson Jan 25, 2026
42596e1
feat(03-02): create popup HTML structure
justcarlson Jan 25, 2026
de6d755
feat(03-02): implement popup TypeScript logic
justcarlson Jan 25, 2026
5145527
feat(03-03): create welcome page styles with dark mode
justcarlson Jan 25, 2026
0004e1d
feat(03-03): implement welcome page i18n population
justcarlson Jan 25, 2026
31e214b
docs(03-02): complete popup implementation plan
justcarlson Jan 25, 2026
631d745
docs(03-03): complete welcome page plan
justcarlson Jan 25, 2026
8ec8c37
fix(03-04): improve CTA button contrast in dark mode
justcarlson Jan 25, 2026
2a99f75
docs(03-04): complete UI migration verification plan
justcarlson Jan 25, 2026
94129aa
docs(03): complete UI Migration phase
justcarlson Jan 25, 2026
e27b3ef
docs(04): capture phase context
justcarlson Jan 25, 2026
e51461d
docs(04): research phase domain
justcarlson Jan 25, 2026
7b05c58
docs(04): create phase plan
justcarlson Jan 25, 2026
1c04203
fix(04): revise plans based on checker feedback
justcarlson Jan 25, 2026
45de8ba
chore(04-01): install test dependencies
justcarlson Jan 25, 2026
37a9a57
feat(04-01): create Vitest configuration with WXT plugin
justcarlson Jan 25, 2026
12c75bd
test(04-01): create test setup with mock reset and smoke test
justcarlson Jan 25, 2026
1c128b5
docs(04-01): complete test infrastructure plan
justcarlson Jan 25, 2026
d79ab3f
feat(04-05): add Playwright configuration for E2E tests
justcarlson Jan 25, 2026
7437ba7
test(04-03): add comprehensive storage module unit tests
justcarlson Jan 25, 2026
5c8d38f
feat(04-05): add extension fixtures for E2E testing
justcarlson Jan 25, 2026
068fbaa
test(04-04): add background service worker unit tests
justcarlson Jan 25, 2026
b2a3732
test(04-02): add comprehensive URL matching tests
justcarlson Jan 25, 2026
feaaff8
test(04-03): add comprehensive tabs module unit tests
justcarlson Jan 25, 2026
8468bea
test(04-04): add explicit TEST-08 service worker termination tests
justcarlson Jan 25, 2026
81ab184
docs(04-02): complete URL matching tests plan
justcarlson Jan 25, 2026
342b078
docs(04-03): complete storage and tabs tests plan
justcarlson Jan 25, 2026
98eccb8
docs(04-04): complete background service worker tests plan
justcarlson Jan 25, 2026
29df8e7
feat(04-05): add popup E2E tests and mock pages
justcarlson Jan 25, 2026
24a0242
docs(04-05): complete E2E testing infrastructure plan
justcarlson Jan 25, 2026
98f28bd
feat(04-06): create GitHub Actions CI workflow
justcarlson Jan 25, 2026
519726b
fix(04-06): exclude test artifacts from lint and coverage
justcarlson Jan 25, 2026
408f17d
chore(04-06): gitignore test artifacts
justcarlson Jan 25, 2026
83540c6
docs(04-06): complete CI workflow setup plan
justcarlson Jan 25, 2026
ae34878
docs(04): add phase verification report
justcarlson Jan 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 109 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
name: CI

on:
pull_request:
branches: [master, main]
push:
branches: [master, main]

jobs:
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Run Biome checks
run: npm run lint

test:
name: Unit Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Run unit tests with coverage
run: npm run test:coverage -- --run

- name: Upload coverage report
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/
retention-days: 7

build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Build extension
run: npm run build

- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: extension-build
path: .output/chrome-mv3/
retention-days: 7

e2e:
name: E2E Tests
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Install Playwright browsers
run: npx playwright install chromium --with-deps

- name: Build extension
run: npm run build

- name: Run E2E tests
run: npm run test:e2e

- name: Upload Playwright report
uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report
path: playwright-report/
retention-days: 7
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,14 @@ node_modules
npm-debug.log
.DS_Store
.opencode

# WXT
.wxt/
.output/

# Test coverage
coverage/

# Playwright
playwright-report/
test-results/
1 change: 1 addition & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
npx lint-staged
89 changes: 89 additions & 0 deletions .planning/PROJECT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# QuickTab

## What This Is

A Chrome extension for Zendesk users that intercepts zendesk.com navigation and routes it to existing agent tabs instead of opening new ones. Originally abandoned by maintainers and removed from Chrome Web Store — now being modernized for security, maintainability, and republishing.

## Core Value

Zendesk links open in existing agent tabs, not new ones. This single behavior must work reliably across all supported URL patterns.

## Requirements

### Validated

- ✓ Intercept zendesk.com/agent navigation events — existing
- ✓ Route intercepted URLs to existing Zendesk agent tabs — existing
- ✓ URL pattern matching (Lotus routes, ticket routes, restricted routes) — existing
- ✓ User-configurable detection modes (all URLs, ticket URLs, disabled) — existing
- ✓ Popup UI for settings and status display — existing
- ✓ Welcome page on first install — existing
- ✓ Icon state reflects current detection mode — existing
- ✓ Settings persist via Chrome storage — existing
- ✓ i18n support with localized strings — existing

### Active

- [ ] Migrate from jQuery 1.6.1 to vanilla JavaScript
- [ ] Replace Handlebars templates with plain HTML + JS
- [ ] Convert ES5 codebase to TypeScript
- [ ] Replace Grunt + Webpack 1.x with Vite
- [ ] Add unit test coverage with Vitest
- [ ] Add E2E browser tests with Playwright
- [ ] Set up GitHub Actions CI pipeline (lint, test, build, security scan)
- [ ] Ensure full Chrome Web Store policy compliance
- [ ] Create release workflow with versioning and artifacts
- [ ] Document codebase for maintainer handoff

### Out of Scope

- New features beyond bug fixes — this is a technical modernization
- Rebrand or visual refresh — keeping QuickTab identity
- Automated Chrome Web Store publishing — manual upload for now
- Support for non-Chrome browsers — Chrome/Chromium only

## Context

**Origin:** Forked from abandoned extension removed from Chrome Web Store. Original functionality intact but built on outdated dependencies with known vulnerabilities.

**Current State:**
- jQuery 1.6.1 (2011, multiple CVEs)
- Handlebars 2.0.0
- ES5 JavaScript throughout
- Grunt 1.6.1 + Webpack 1.x build system
- No tests, no CI/CD, no security scanning
- Already partially migrated to Manifest V3

**Target State:**
- Zero jQuery — vanilla TypeScript
- No templating runtime — plain HTML
- Modern ES2022+ TypeScript
- Vite build system
- Vitest + Playwright test coverage
- GitHub Actions CI with security scanning
- Chrome Web Store compliant and published

**Publishing:** Chrome developer account ready. Manual upload workflow until automation needs justify investment.

## Constraints

- **Manifest Version**: Must be Manifest V3 compliant — V2 deprecated
- **Browser Support**: Chrome/Chromium only — no Firefox/Safari/Edge
- **Scope**: Technical modernization — no new end-user features
- **Dependencies**: Minimize runtime dependencies — prefer vanilla implementations
- **Testing**: Must have CI gates before merging — no untested code to main

## Key Decisions

| Decision | Rationale | Outcome |
|----------|-----------|---------|
| Remove jQuery entirely | Minimal DOM manipulation, security vulnerabilities, unnecessary weight | — Pending |
| Remove Handlebars | Simple UI doesn't justify templating runtime, reduces dependencies | — Pending |
| TypeScript over JavaScript | Type safety, better maintainability, IDE support, catches bugs early | — Pending |
| Vite over alternatives | Fast, modern, excellent Chrome extension ecosystem support | — Pending |
| Vitest + Playwright | Modern test stack, fast unit tests, real browser E2E | — Pending |
| GitHub Actions | Free for public repos, good ecosystem, team familiarity | — Pending |
| Manual Web Store publishing | Focus on codebase quality first, automation later if needed | — Pending |

---
*Last updated: 2026-01-25 after initialization*
165 changes: 165 additions & 0 deletions .planning/REQUIREMENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
# Requirements: QuickTab Modernization

**Defined:** 2026-01-25
**Core Value:** Zendesk links open in existing agent tabs, not new ones. This single behavior must work reliably.

## v1 Requirements

Requirements for modernization release. Each maps to roadmap phases.

### Build System

- [ ] **BUILD-01**: Project uses WXT framework with Vite for extension bundling
- [ ] **BUILD-02**: TypeScript 5.9+ with ES2022 target and strict mode enabled
- [ ] **BUILD-03**: Source maps generated for development debugging
- [ ] **BUILD-04**: npm scripts for dev, build, test, and lint workflows
- [ ] **BUILD-05**: Hot module replacement (HMR) works during development
- [ ] **BUILD-06**: Bundle size analysis available via build script

### Code Quality

- [ ] **QUAL-01**: Biome configured for linting and formatting
- [ ] **QUAL-02**: Pre-commit hooks enforce lint and format via Husky + lint-staged
- [ ] **QUAL-03**: @types/chrome provides TypeScript definitions for Chrome APIs
- [ ] **QUAL-04**: CI runs Biome checks on pull requests

### Testing

- [ ] **TEST-01**: Vitest configured for unit testing
- [ ] **TEST-02**: Chrome API mocking via @webext-core/fake-browser
- [ ] **TEST-03**: Unit tests cover URL matching logic
- [ ] **TEST-04**: Unit tests cover storage operations
- [ ] **TEST-05**: Unit tests cover service worker event handlers
- [ ] **TEST-06**: E2E tests with Playwright for navigation flows
- [ ] **TEST-07**: Coverage reporting integrated with test runs
- [ ] **TEST-08**: Service worker termination tests validate state persistence

### CI/CD

- [ ] **CICD-01**: GitHub Actions workflow runs lint, test, build on PR
- [ ] **CICD-02**: GitHub Actions workflow runs on push to main
- [ ] **CICD-03**: Automated version bumping on release
- [ ] **CICD-04**: Changelog generated from conventional commits
- [ ] **CICD-05**: Release workflow creates ZIP artifact on tag

### Web Store Compliance

- [ ] **STORE-01**: Privacy policy document created and linked
- [ ] **STORE-02**: Permission audit completed — unused permissions removed
- [ ] **STORE-03**: All dependencies bundled — no remote code execution
- [ ] **STORE-04**: Code is minified but not obfuscated
- [ ] **STORE-05**: Store metadata updated (description, screenshots)

### Git Workflow

- [ ] **GIT-01**: Each phase developed on dedicated feature branch
- [ ] **GIT-02**: Git worktrees used for parallel development and safe rollback
- [ ] **GIT-03**: Atomic commits per logical change with conventional commit messages
- [ ] **GIT-04**: PRs required for merging to main — no direct commits
- [ ] **GIT-05**: Main branch always deployable — broken code never merged
- [ ] **GIT-06**: Tags mark each phase completion for easy revert points

### Code Migration

- [ ] **MIGR-01**: jQuery 1.6.1 removed — all DOM manipulation uses vanilla TypeScript
- [ ] **MIGR-02**: Handlebars removed — popup uses plain HTML with TypeScript
- [ ] **MIGR-03**: ES5 code converted to ES2022+ TypeScript
- [ ] **MIGR-04**: Service worker uses storage-first architecture (no global state)
- [ ] **MIGR-05**: Event listeners registered synchronously at module scope
- [ ] **MIGR-06**: Type-safe Chrome API wrappers for storage, tabs, webNavigation
- [ ] **MIGR-07**: URL matching logic ported to typed TypeScript module
- [ ] **MIGR-08**: Popup UI ported to vanilla TypeScript
- [ ] **MIGR-09**: Welcome page ported to vanilla TypeScript
- [ ] **MIGR-10**: i18n system preserved and working

## v2 Requirements

Deferred to future release. Not in current roadmap.

### Enhanced Testing

- **TEST-V2-01**: Visual regression testing for popup UI
- **TEST-V2-02**: Performance benchmarking for URL matching

### Automation

- **AUTO-V2-01**: Automated Chrome Web Store publishing via CI
- **AUTO-V2-02**: Automated screenshot generation for store listing

### Features

- **FEAT-V2-01**: Additional locale support beyond English
- **FEAT-V2-02**: User-configurable URL patterns (advanced mode)

## Out of Scope

Explicitly excluded. Documented to prevent scope creep.

| Feature | Reason |
|---------|--------|
| React/Vue for popup | Overkill for simple settings UI — adds bundle size and complexity |
| Analytics/telemetry | Requires privacy policy disclosure and user consent — complexity not worth it |
| Monorepo structure | Single extension doesn't benefit from monorepo overhead |
| Firefox/Safari support | Chrome-only focus for v1 — cross-browser adds significant testing burden |
| Remote configuration | MV3 compliance risk — all code must be bundled |
| New end-user features | This is a technical modernization — feature work is post-v1 |

## Traceability

Which phases cover which requirements. Updated during roadmap creation.

| Requirement | Phase | Status |
|-------------|-------|--------|
| BUILD-01 | Phase 1 | Complete |
| BUILD-02 | Phase 1 | Complete |
| BUILD-03 | Phase 1 | Complete |
| BUILD-04 | Phase 1 | Complete |
| BUILD-05 | Phase 1 | Complete |
| BUILD-06 | Phase 1 | Complete |
| QUAL-01 | Phase 1 | Complete |
| QUAL-02 | Phase 1 | Complete |
| QUAL-03 | Phase 1 | Complete |
| QUAL-04 | Phase 4 | Pending |
| TEST-01 | Phase 4 | Pending |
| TEST-02 | Phase 4 | Pending |
| TEST-03 | Phase 4 | Pending |
| TEST-04 | Phase 4 | Pending |
| TEST-05 | Phase 4 | Pending |
| TEST-06 | Phase 4 | Pending |
| TEST-07 | Phase 4 | Pending |
| TEST-08 | Phase 4 | Pending |
| CICD-01 | Phase 6 | Pending |
| CICD-02 | Phase 6 | Pending |
| CICD-03 | Phase 6 | Pending |
| CICD-04 | Phase 6 | Pending |
| CICD-05 | Phase 6 | Pending |
| STORE-01 | Phase 5 | Pending |
| STORE-02 | Phase 5 | Pending |
| STORE-03 | Phase 2 | Complete |
| STORE-04 | Phase 5 | Pending |
| STORE-05 | Phase 5 | Pending |
| MIGR-01 | Phase 3 | Complete |
| MIGR-02 | Phase 3 | Complete |
| MIGR-03 | Phase 2 | Complete |
| MIGR-04 | Phase 2 | Complete |
| MIGR-05 | Phase 2 | Complete |
| MIGR-06 | Phase 2 | Complete |
| MIGR-07 | Phase 2 | Complete |
| MIGR-08 | Phase 3 | Complete |
| MIGR-09 | Phase 3 | Complete |
| MIGR-10 | Phase 3 | Complete |
| GIT-01 | All Phases | Pending |
| GIT-02 | All Phases | Pending |
| GIT-03 | All Phases | Pending |
| GIT-04 | All Phases | Pending |
| GIT-05 | All Phases | Pending |
| GIT-06 | All Phases | Pending |

**Coverage:**
- v1 requirements: 44 total (38 deliverable + 6 workflow constraints)
- Mapped to phases: 44
- Unmapped: 0

---
*Requirements defined: 2026-01-25*
*Last updated: 2026-01-25 after roadmap creation*
Loading
Loading