{"owner":"gitify-app","repo":"gitify","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":[".github/copilot-instructions.md"],"skills":{".github/copilot-instructions.md":"# Gitify Development Instructions\n\nGitify is a multi-forge notification client — an Electron desktop app that surfaces GitHub, Gitea, and Bitbucket Cloud notifications in the system tray. Built with React, TypeScript, Vite, and pnpm.\n\n**ALWAYS follow these instructions first and only fallback to additional search and context gathering if the information in the instructions is incomplete or found to be in error.**\n\n## Prerequisites and Setup\n\n- **Node.js**: `>=24` (`.nvmrc` pins `24.18.0`). Use `nvm use` to activate the right version.\n- **Install pnpm globally**: `npm install -g pnpm`\n- **Bootstrap the repository**: `pnpm install` — takes up to a minute on a clean install. NEVER CANCEL. Set timeout to 5+ minutes.\n\n## Key Commands\n\n| Command             | What it does                                                                | Timing        |\n| ------------------- | --------------------------------------------------------------------------- | ------------- |\n| `pnpm dev`          | Vite dev server + GraphQL codegen watch (main development loop)             | ~10s to start |\n| `pnpm build`        | Production build for all Electron targets (main, preload, renderer, shared) | ~30s clean    |\n| `pnpm test`         | Run full Vitest suite with coverage                                         | ~15s          |\n| `pnpm check`        | oxlint + oxfmt + type-check (unified via vite-plus)                         | <5s           |\n| `pnpm check:fix`    | Same as check but auto-fixes formatting and lint                            | <5s           |\n| `pnpm tsc --noEmit` | TypeScript-only type-check                                                  | ~5s           |\n\n**NEVER CANCEL long-running commands** (`pnpm install`, `pnpm build`). Set terminal timeouts to 5+ minutes.\n\n## Development Workflow\n\n- **Day-to-day development**: `pnpm dev` — starts both the Vite dev server and GraphQL codegen watcher concurrently. Leave running while developing.\n- **Full build**: `pnpm build` — builds all targets via `vp build`. Output goes to `build/` (subdirectories: `main/`, `preload/`, `renderer/`, `shared/`).\n- **Run the Electron app**: `pnpm start` — runs `pnpm build` then `pnpm dev`. Will fail in headless/container environments due to Electron sandbox restrictions (this is expected and normal).\n\n## Validation\n\nAfter making changes, validate in this order:\n\n1. **Type-check**: `pnpm tsc --noEmit` — must complete with no errors\n2. **Lint + format**: `pnpm check` — warnings are acceptable, errors are not\n3. **Tests**: `pnpm test` — focus on no NEW failures; existing snapshots may differ on timezone-mismatched machines\n4. **Build**: `pnpm build` — look for `✓ built in [time]` for each target (main, preload, renderer, shared)\n\n**Snapshot test failures**: Run `pnpm test -u` to regenerate after legitimate UI changes.\n\n**Pre-commit**: Husky runs `vp staged` automatically on `git commit`. Manual equivalent: `pnpm check && pnpm test`.\n\n## File Map\n\n### Source\n\n- `src/main/` — Electron main process (Node.js)\n- `src/preload/` — Electron preload scripts\n- `src/renderer/` — React UI (the visible app)\n- `src/shared/` — Code shared across all processes\n\n### Key renderer paths\n\n- `src/renderer/utils/forges/` — Per-forge adapters (github/, gitea/, bitbucket/) and registry\n- `src/renderer/utils/auth/` — Authentication utilities\n- `src/renderer/hooks/useNotifications.ts` — Core notification polling logic\n- `src/renderer/components/` — UI components\n- `src/renderer/routes/` — Page-level route components\n- `src/renderer/stores/` — Zustand stores\n\n### Configuration\n\n- `vite.config.ts` — Primary build config; also hosts `lint`, `fmt`, and `staged` blocks used by `pnpm check` and Husky\n- `vitest.config.ts` — Test configuration (Vitest projects: happy-dom for renderer/preload, node for main/shared)\n- `tsconfig.json` — TypeScript configuration\n- `tailwind.config.mts` — Tailwind CSS configuration\n- `package.json` — Scripts and dependency versions\n\n### Assets\n\n- `assets/` — Icons, sounds, and static resources\n\n## Local Packaging\n\nRequires a prior `pnpm build` and platform-specific tooling:\n\n- **macOS**: `pnpm package:macos --publish=never`\n- **Windows**: `pnpm package:win --publish=never`\n- **Linux**: `pnpm package:linux --publish=never`\n\n## Constraints and Gotchas\n\n- **Electron won't start in CI/containers**: Sandbox restrictions make `pnpm start` / `pnpm dev` fail headlessly. This is expected — test logic; don't try to fix the launch.\n- **Node version is strict**: `>=24` required. Check `.nvmrc` and run `nvm use` if commands behave oddly.\n- **Snapshot drift on non-UTC machines**: Some snapshot tests encode relative dates. Tests may fail locally if your timezone differs from UTC. The test setup stubs `TZ=UTC` via `vi.stubEnv`.\n- **Lint warnings are OK**: The codebase has pre-existing lint warnings. Only new errors block CI.\n- **GraphQL codegen**: Running `pnpm dev` auto-watches for schema changes. If you edit `.graphql` files manually, re-run `pnpm codegen` to regenerate `graphql/generated/graphql.ts`.\n\n## Development Philosophy\n\nThis is a notification _viewer_, not a full forge client. Keep changes:\n\n- **Focused** on the notification surface — don't expand scope into full forge feature parity\n- **Forge-agnostic** at the orchestration layer — new forge behaviour belongs in the forge adapter (`src/renderer/utils/forges/<forge>/adapter.ts`), not in shared hooks or components\n- **Minimal** — avoid adding complexity for edge cases\n- **Cross-platform** (macOS, Windows, Linux)\n\n## Technology Stack\n\n- **Electron 43+** — desktop app host\n- **React 19+** — UI\n- **TypeScript 5+** — language\n- **pnpm 10+** — package manager\n- **Vite + vite-plus** — unified build, dev, lint (`oxlint`), format (`oxfmt`), and test toolchain. The `vp` CLI drives all tooling.\n- **Vitest** — test runner (via `vp test`); `@testing-library/jest-dom` provides DOM matchers\n- **Tailwind CSS v4** — styling\n- **Zustand** — client state management\n- **TanStack Query** — server state / notification fetching\n- **electron-menubar** — system tray integration\n- **electron-updater** — auto-update\n- **@primer/react** — GitHub's component library (UI primitives)\n- **@primer/octicons-react** — icon library\n- **octokit** — GitHub API HTTP client (GitHub forge only)\n- **date-fns** — date utilities\n"},"files":{".github/copilot-instructions.md":"# Gitify Development Instructions\n\nGitify is a multi-forge notification client — an Electron desktop app that surfaces GitHub, Gitea, and Bitbucket Cloud notifications in the system tray. Built with React, TypeScript, Vite, and pnpm.\n\n**ALWAYS follow these instructions first and only fallback to additional search and context gathering if the information in the instructions is incomplete or found to be in error.**\n\n## Prerequisites and Setup\n\n- **Node.js**: `>=24` (`.nvmrc` pins `24.18.0`). Use `nvm use` to activate the right version.\n- **Install pnpm globally**: `npm install -g pnpm`\n- **Bootstrap the repository**: `pnpm install` — takes up to a minute on a clean install. NEVER CANCEL. Set timeout to 5+ minutes.\n\n## Key Commands\n\n| Command             | What it does                                                                | Timing        |\n| ------------------- | --------------------------------------------------------------------------- | ------------- |\n| `pnpm dev`          | Vite dev server + GraphQL codegen watch (main development loop)             | ~10s to start |\n| `pnpm build`        | Production build for all Electron targets (main, preload, renderer, shared) | ~30s clean    |\n| `pnpm test`         | Run full Vitest suite with coverage                                         | ~15s          |\n| `pnpm check`        | oxlint + oxfmt + type-check (unified via vite-plus)                         | <5s           |\n| `pnpm check:fix`    | Same as check but auto-fixes formatting and lint                            | <5s           |\n| `pnpm tsc --noEmit` | TypeScript-only type-check                                                  | ~5s           |\n\n**NEVER CANCEL long-running commands** (`pnpm install`, `pnpm build`). Set terminal timeouts to 5+ minutes.\n\n## Development Workflow\n\n- **Day-to-day development**: `pnpm dev` — starts both the Vite dev server and GraphQL codegen watcher concurrently. Leave running while developing.\n- **Full build**: `pnpm build` — builds all targets via `vp build`. Output goes to `build/` (subdirectories: `main/`, `preload/`, `renderer/`, `shared/`).\n- **Run the Electron app**: `pnpm start` — runs `pnpm build` then `pnpm dev`. Will fail in headless/container environments due to Electron sandbox restrictions (this is expected and normal).\n\n## Validation\n\nAfter making changes, validate in this order:\n\n1. **Type-check**: `pnpm tsc --noEmit` — must complete with no errors\n2. **Lint + format**: `pnpm check` — warnings are acceptable, errors are not\n3. **Tests**: `pnpm test` — focus on no NEW failures; existing snapshots may differ on timezone-mismatched machines\n4. **Build**: `pnpm build` — look for `✓ built in [time]` for each target (main, preload, renderer, shared)\n\n**Snapshot test failures**: Run `pnpm test -u` to regenerate after legitimate UI changes.\n\n**Pre-commit**: Husky runs `vp staged` automatically on `git commit`. Manual equivalent: `pnpm check && pnpm test`.\n\n## File Map\n\n### Source\n\n- `src/main/` — Electron main process (Node.js)\n- `src/preload/` — Electron preload scripts\n- `src/renderer/` — React UI (the visible app)\n- `src/shared/` — Code shared across all processes\n\n### Key renderer paths\n\n- `src/renderer/utils/forges/` — Per-forge adapters (github/, gitea/, bitbucket/) and registry\n- `src/renderer/utils/auth/` — Authentication utilities\n- `src/renderer/hooks/useNotifications.ts` — Core notification polling logic\n- `src/renderer/components/` — UI components\n- `src/renderer/routes/` — Page-level route components\n- `src/renderer/stores/` — Zustand stores\n\n### Configuration\n\n- `vite.config.ts` — Primary build config; also hosts `lint`, `fmt`, and `staged` blocks used by `pnpm check` and Husky\n- `vitest.config.ts` — Test configuration (Vitest projects: happy-dom for renderer/preload, node for main/shared)\n- `tsconfig.json` — TypeScript configuration\n- `tailwind.config.mts` — Tailwind CSS configuration\n- `package.json` — Scripts and dependency versions\n\n### Assets\n\n- `assets/` — Icons, sounds, and static resources\n\n## Local Packaging\n\nRequires a prior `pnpm build` and platform-specific tooling:\n\n- **macOS**: `pnpm package:macos --publish=never`\n- **Windows**: `pnpm package:win --publish=never`\n- **Linux**: `pnpm package:linux --publish=never`\n\n## Constraints and Gotchas\n\n- **Electron won't start in CI/containers**: Sandbox restrictions make `pnpm start` / `pnpm dev` fail headlessly. This is expected — test logic; don't try to fix the launch.\n- **Node version is strict**: `>=24` required. Check `.nvmrc` and run `nvm use` if commands behave oddly.\n- **Snapshot drift on non-UTC machines**: Some snapshot tests encode relative dates. Tests may fail locally if your timezone differs from UTC. The test setup stubs `TZ=UTC` via `vi.stubEnv`.\n- **Lint warnings are OK**: The codebase has pre-existing lint warnings. Only new errors block CI.\n- **GraphQL codegen**: Running `pnpm dev` auto-watches for schema changes. If you edit `.graphql` files manually, re-run `pnpm codegen` to regenerate `graphql/generated/graphql.ts`.\n\n## Development Philosophy\n\nThis is a notification _viewer_, not a full forge client. Keep changes:\n\n- **Focused** on the notification surface — don't expand scope into full forge feature parity\n- **Forge-agnostic** at the orchestration layer — new forge behaviour belongs in the forge adapter (`src/renderer/utils/forges/<forge>/adapter.ts`), not in shared hooks or components\n- **Minimal** — avoid adding complexity for edge cases\n- **Cross-platform** (macOS, Windows, Linux)\n\n## Technology Stack\n\n- **Electron 43+** — desktop app host\n- **React 19+** — UI\n- **TypeScript 5+** — language\n- **pnpm 10+** — package manager\n- **Vite + vite-plus** — unified build, dev, lint (`oxlint`), format (`oxfmt`), and test toolchain. The `vp` CLI drives all tooling.\n- **Vitest** — test runner (via `vp test`); `@testing-library/jest-dom` provides DOM matchers\n- **Tailwind CSS v4** — styling\n- **Zustand** — client state management\n- **TanStack Query** — server state / notification fetching\n- **electron-menubar** — system tray integration\n- **electron-updater** — auto-update\n- **@primer/react** — GitHub's component library (UI primitives)\n- **@primer/octicons-react** — icon library\n- **octokit** — GitHub API HTTP client (GitHub forge only)\n- **date-fns** — date utilities\n"},"items":[{"name":"copilot-instructions.md","path":".github/copilot-instructions.md","title":"copilot-instructions.md","content":"# Gitify Development Instructions\n\nGitify is a multi-forge notification client — an Electron desktop app that surfaces GitHub, Gitea, and Bitbucket Cloud notifications in the system tray. Built with React, TypeScript, Vite, and pnpm.\n\n**ALWAYS follow these instructions first and only fallback to additional search and context gathering if the information in the instructions is incomplete or found to be in error.**\n\n## Prerequisites and Setup\n\n- **Node.js**: `>=24` (`.nvmrc` pins `24.18.0`). Use `nvm use` to activate the right version.\n- **Install pnpm globally**: `npm install -g pnpm`\n- **Bootstrap the repository**: `pnpm install` — takes up to a minute on a clean install. NEVER CANCEL. Set timeout to 5+ minutes.\n\n## Key Commands\n\n| Command             | What it does                                                                | Timing        |\n| ------------------- | --------------------------------------------------------------------------- | ------------- |\n| `pnpm dev`          | Vite dev server + GraphQL codegen watch (main development loop)             | ~10s to start |\n| `pnpm build`        | Production build for all Electron targets (main, preload, renderer, shared) | ~30s clean    |\n| `pnpm test`         | Run full Vitest suite with coverage                                         | ~15s          |\n| `pnpm check`        | oxlint + oxfmt + type-check (unified via vite-plus)                         | <5s           |\n| `pnpm check:fix`    | Same as check but auto-fixes formatting and lint                            | <5s           |\n| `pnpm tsc --noEmit` | TypeScript-only type-check                                                  | ~5s           |\n\n**NEVER CANCEL long-running commands** (`pnpm install`, `pnpm build`). Set terminal timeouts to 5+ minutes.\n\n## Development Workflow\n\n- **Day-to-day development**: `pnpm dev` — starts both the Vite dev server and GraphQL codegen watcher concurrently. Leave running while developing.\n- **Full build**: `pnpm build` — builds all targets via `vp build`. Output goes to `build/` (subdirectories: `main/`, `preload/`, `renderer/`, `shared/`).\n- **Run the Electron app**: `pnpm start` — runs `pnpm build` then `pnpm dev`. Will fail in headless/container environments due to Electron sandbox restrictions (this is expected and normal).\n\n## Validation\n\nAfter making changes, validate in this order:\n\n1. **Type-check**: `pnpm tsc --noEmit` — must complete with no errors\n2. **Lint + format**: `pnpm check` — warnings are acceptable, errors are not\n3. **Tests**: `pnpm test` — focus on no NEW failures; existing snapshots may differ on timezone-mismatched machines\n4. **Build**: `pnpm build` — look for `✓ built in [time]` for each target (main, preload, renderer, shared)\n\n**Snapshot test failures**: Run `pnpm test -u` to regenerate after legitimate UI changes.\n\n**Pre-commit**: Husky runs `vp staged` automatically on `git commit`. Manual equivalent: `pnpm check && pnpm test`.\n\n## File Map\n\n### Source\n\n- `src/main/` — Electron main process (Node.js)\n- `src/preload/` — Electron preload scripts\n- `src/renderer/` — React UI (the visible app)\n- `src/shared/` — Code shared across all processes\n\n### Key renderer paths\n\n- `src/renderer/utils/forges/` — Per-forge adapters (github/, gitea/, bitbucket/) and registry\n- `src/renderer/utils/auth/` — Authentication utilities\n- `src/renderer/hooks/useNotifications.ts` — Core notification polling logic\n- `src/renderer/components/` — UI components\n- `src/renderer/routes/` — Page-level route components\n- `src/renderer/stores/` — Zustand stores\n\n### Configuration\n\n- `vite.config.ts` — Primary build config; also hosts `lint`, `fmt`, and `staged` blocks used by `pnpm check` and Husky\n- `vitest.config.ts` — Test configuration (Vitest projects: happy-dom for renderer/preload, node for main/shared)\n- `tsconfig.json` — TypeScript configuration\n- `tailwind.config.mts` — Tailwind CSS configuration\n- `package.json` — Scripts and dependency versions\n\n### Assets\n\n- `assets/` — Icons, sounds, and static resources\n\n## Local Packaging\n\nRequires a prior `pnpm build` and platform-specific tooling:\n\n- **macOS**: `pnpm package:macos --publish=never`\n- **Windows**: `pnpm package:win --publish=never`\n- **Linux**: `pnpm package:linux --publish=never`\n\n## Constraints and Gotchas\n\n- **Electron won't start in CI/containers**: Sandbox restrictions make `pnpm start` / `pnpm dev` fail headlessly. This is expected — test logic; don't try to fix the launch.\n- **Node version is strict**: `>=24` required. Check `.nvmrc` and run `nvm use` if commands behave oddly.\n- **Snapshot drift on non-UTC machines**: Some snapshot tests encode relative dates. Tests may fail locally if your timezone differs from UTC. The test setup stubs `TZ=UTC` via `vi.stubEnv`.\n- **Lint warnings are OK**: The codebase has pre-existing lint warnings. Only new errors block CI.\n- **GraphQL codegen**: Running `pnpm dev` auto-watches for schema changes. If you edit `.graphql` files manually, re-run `pnpm codegen` to regenerate `graphql/generated/graphql.ts`.\n\n## Development Philosophy\n\nThis is a notification _viewer_, not a full forge client. Keep changes:\n\n- **Focused** on the notification surface — don't expand scope into full forge feature parity\n- **Forge-agnostic** at the orchestration layer — new forge behaviour belongs in the forge adapter (`src/renderer/utils/forges/<forge>/adapter.ts`), not in shared hooks or components\n- **Minimal** — avoid adding complexity for edge cases\n- **Cross-platform** (macOS, Windows, Linux)\n\n## Technology Stack\n\n- **Electron 43+** — desktop app host\n- **React 19+** — UI\n- **TypeScript 5+** — language\n- **pnpm 10+** — package manager\n- **Vite + vite-plus** — unified build, dev, lint (`oxlint`), format (`oxfmt`), and test toolchain. The `vp` CLI drives all tooling.\n- **Vitest** — test runner (via `vp test`); `@testing-library/jest-dom` provides DOM matchers\n- **Tailwind CSS v4** — styling\n- **Zustand** — client state management\n- **TanStack Query** — server state / notification fetching\n- **electron-menubar** — system tray integration\n- **electron-updater** — auto-update\n- **@primer/react** — GitHub's component library (UI primitives)\n- **@primer/octicons-react** — icon library\n- **octokit** — GitHub API HTTP client (GitHub forge only)\n- **date-fns** — date utilities\n","category":".github","tokens":1579}]}