{"owner":"srizzon","repo":"git-city","hasSkills":true,"totalSkillsCount":5,"totalTokensCount":3490,"categories":["plugin-manifest","anthropic-skill","claude-rule"],"hasMcp":false,"mcpConfig":null,"found":["packages/vscode-extension/README.md","packages/vscode-extension/tsconfig.json","packages/vscode-extension/package.json","packages/vscode-extension/CHANGELOG.md","CLAUDE.md"],"skills":{"packages/vscode-extension/README.md":"# Git City: Pulse\n\nYour building's transmitter. When you code, it pulses. The city lights up.\n\n## How it works\n\n1. Generate your API key at [thegitcity.com](https://www.thegitcity.com) (click \"coding now\" in the top bar)\n2. Install this extension\n3. Run `Cmd+Shift+P` > \"Pulse: Connect\" and paste your key\n4. Start coding. Your building starts transmitting in ~30 seconds.\n\nWhen you're coding, your building glows in the city and you appear in the live feed. Stop coding and it fades after a few minutes.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `Pulse: Connect` | Link your building to the city |\n| `Pulse: Disconnect` | Unlink your building |\n| `Pulse: Toggle` | Pause/resume your transmitter |\n| `Pulse: Open City` | Open Git City in your browser |\n\n## Status bar\n\nThe status bar shows your transmitter state:\n\n- `$(broadcast) Pulse: Transmitting` - Your building is live in the city\n- `$(circle-outline) Pulse: Standby` - Waiting for you to code\n- `$(circle-slash) Pulse: Off` - Transmitter paused\n- `$(plug) Pulse: Disconnected` - No API key set\n\nClick the status bar item to toggle your transmitter on/off.\n\n## Privacy\n\n**You control what gets transmitted.**\n\n| Data | Public? | Can disable? |\n|------|---------|-------------|\n| Username | Yes (your GitHub login) | No (identifies your building) |\n| Language | Yes (e.g. \"TypeScript\") | Yes, via `gitCity.privacy.shareLanguage` |\n| Project name | **No, never public** | Yes, via `gitCity.privacy.shareProject` |\n| Branch name | **No, never public** | Excluded with project |\n| File paths | **Never sent** | N/A |\n| Code contents | **Never sent** | N/A |\n\n**What is never collected:** file contents, code, diffs, clipboard, terminal output, file paths, or any intellectual property.\n\n**Project names** are stored server-side for your personal analytics only. They are never shown to other users, never included in any public API, and never broadcast. You can disable sending them entirely.\n\n### Privacy settings\n\nOpen VS Code Settings (`Cmd+,`) and search for \"Git City\":\n\n- `gitCity.privacy.shareLanguage` - Share the programming language (default: on)\n- `gitCity.privacy.shareProject` - Send project name for personal analytics (default: on)\n- `gitCity.privacy.excludeProjects` - List of project names to never track (e.g. `[\"secret-project\", \"client-work\"]`)\n- `gitCity.enabled` - Disable all transmission entirely\n- `gitCity.idleTimeout` - Seconds of inactivity before standby (default: 300)\n","packages/vscode-extension/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"target\": \"ES2022\",\n    \"lib\": [\"ES2022\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"declaration\": false,\n    \"sourceMap\": true\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","packages/vscode-extension/package.json":"{\n  \"name\": \"gitcity\",\n  \"displayName\": \"Git City: Pulse\",\n  \"description\": \"Keep your city alive. When you code, your building glows and powers the signal. Privacy-first: you control what gets shared.\",\n  \"version\": \"0.3.0\",\n  \"publisher\": \"git-city\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/srizzon/git-city\"\n  },\n  \"homepage\": \"https://www.thegitcity.com\",\n  \"bugs\": {\n    \"url\": \"https://github.com/srizzon/git-city/issues\"\n  },\n  \"engines\": {\n    \"vscode\": \"^1.93.0\"\n  },\n  \"categories\": [\"Other\"],\n  \"activationEvents\": [\"onStartupFinished\"],\n  \"main\": \"./dist/extension.js\",\n  \"icon\": \"icon.png\",\n  \"contributes\": {\n    \"commands\": [\n      {\n        \"command\": \"gitCity.login\",\n        \"title\": \"Pulse: Connect\"\n      },\n      {\n        \"command\": \"gitCity.logout\",\n        \"title\": \"Pulse: Disconnect\"\n      },\n      {\n        \"command\": \"gitCity.togglePause\",\n        \"title\": \"Pulse: Toggle\"\n      },\n      {\n        \"command\": \"gitCity.showDashboard\",\n        \"title\": \"Pulse: Open City\"\n      }\n    ],\n    \"configuration\": {\n      \"title\": \"Git City\",\n      \"properties\": {\n        \"gitCity.enabled\": {\n          \"type\": \"boolean\",\n          \"default\": true,\n          \"description\": \"Enable/disable activity tracking\"\n        },\n        \"gitCity.apiUrl\": {\n          \"type\": \"string\",\n          \"default\": \"https://www.thegitcity.com\",\n          \"description\": \"Git City API URL (changing this sends your API key to a different server)\",\n          \"scope\": \"application\"\n        },\n        \"gitCity.privacy.shareLanguage\": {\n          \"type\": \"boolean\",\n          \"default\": true,\n          \"description\": \"Share the programming language you're using (shown publicly on your building)\"\n        },\n        \"gitCity.privacy.shareProject\": {\n          \"type\": \"boolean\",\n          \"default\": true,\n          \"description\": \"Send project name for your personal analytics (never shown publicly to other users)\"\n        },\n        \"gitCity.privacy.excludeProjects\": {\n          \"type\": \"array\",\n          \"default\": [],\n          \"items\": { \"type\": \"string\" },\n          \"description\": \"Project names to never track at all (e.g. secret-project, client-work)\"\n        },\n        \"gitCity.idleTimeout\": {\n          \"type\": \"number\",\n          \"default\": 300,\n          \"minimum\": 60,\n          \"maximum\": 3600,\n          \"description\": \"Seconds of inactivity before marking as idle\"\n        }\n      }\n    }\n  },\n  \"scripts\": {\n    \"build\": \"node esbuild.mjs\",\n    \"watch\": \"node esbuild.mjs --watch\",\n    \"package\": \"vsce package\"\n  },\n  \"devDependencies\": {\n    \"@types/vscode\": \"^1.93.0\",\n    \"esbuild\": \"^0.20.0\",\n    \"typescript\": \"^5.3.0\"\n  }\n}\n","packages/vscode-extension/CHANGELOG.md":"# Changelog\n\n## 0.3.0\n\n- Track terminal activity (Claude Code, Cursor agent, manual commands)\n- Track debug sessions, task runner, file operations, and notebook edits\n- Your building now stays lit when coding via AI agents or terminal\n- Minimum VS Code version bumped to 1.93\n\n## 0.2.0\n\n- Rebranded to **Git City: Pulse**\n- New status bar states: Transmitting, Standby, Off, Disconnected\n- Updated commands: Pulse: Connect, Disconnect, Toggle, Open City\n- Fixed API URL to use www subdomain\n\n## 0.1.0\n\n- Initial release\n- Live presence: your building glows when you code\n- Privacy controls: choose what data to share\n- Status bar integration\n- Idle detection with configurable timeout\n","CLAUDE.md":"# Git City\n\n3D pixel art city built from real GitHub data. Buildings represent developers: height = contributions, width = repos, lit windows = recent activity.\n\n## Tech stack\n\n- **Frontend:** Next.js App Router, Three.js (instanced rendering), TypeScript\n- **Backend:** Supabase (Postgres + Auth + Realtime)\n- **Payments:** none. Git City takes no money; PX is earned in-game, and GITC burned for PX is the only token flow\n- **Deployment:** Vercel\n\n## Project structure\n\n```\nsrc/\n  app/              Next.js pages and API routes\n  components/       React + Three.js components\n  lib/              Core game logic (raids, dailies, XP, items, etc.)\nsupabase/\n  migrations/       Sequential SQL migrations (001_, 002_, ...)\n```\n\n## Code conventions\n\n- TypeScript everywhere, no `any`\n- `getSupabaseAdmin()` for server-side writes (bypasses RLS)\n- `createServerSupabase()` for auth in API routes (cookie-based)\n- API routes validate auth, then use admin client for DB operations\n- Items use a zone system: crown, roof, aura, faces\n- Loadout stored in `developer_customizations` table with `item_id = \"loadout\"`\n\n## Database\n\n- Migrations in `supabase/migrations/`, numbered sequentially\n- Never modify existing migrations, always create new ones\n- Every foreign key to `developers` (or `auth.users`) is `ON DELETE CASCADE`, or `SET NULL` when the row belongs to someone else, so `delete_developer_account()` (migration 183) can erase an account in one go\n- Run locally with `npx supabase db push`\n- **NEVER run UPDATE or DELETE on production data without explicit user approval**\n- **NEVER NULL out, drop, or modify columns that contain user data (emails, API keys, etc)**\n- When fixing security/permissions issues, ONLY change grants/policies — never touch the data itself\n- Always propose SQL as code for the user to review, never execute destructive SQL directly\n\n## Environments\n\n- Three environments, one-directional flow: local → staging → prod (see `ENVIRONMENTS.md`)\n- `main` = production. Any other pushed branch = Vercel preview + staging Supabase\n- No migration CI: migrations are applied by hand, to staging first, then to prod with the user's explicit OK, and each version is recorded in `supabase_migrations.schema_migrations` so a later `db push` won't re-run it\n- Vercel Preview-scoped env vars point at the staging Supabase project; Production-scoped at prod\n- Staging is disposable: reset with `supabase db reset --linked` while linked to staging. Never copy prod data into it\n\n## Git\n\n- Preserve full commit history on merge — NEVER squash PRs (use a merge commit or rebase, keep every commit)\n- Commit message format (ALWAYS follow):\n  - emoji + conventional commit: `✨ feat(scope): ...`, `🐛 fix(scope): ...`, `✏️ docs: ...`, `♻️ refactor: ...`\n  - single line only — no body, no bullet points\n  - all lowercase, written in english\n  - split work into separate commits by logical part / group of changes (never one giant commit)\n- Never skip hooks or force push to main\n\n## Third-party Assets (IMPORTANT)\n\n- **Arcade character sprites (char_0-5)** and Lumon furniture: from [pixel-agents](https://github.com/pablodelucca/pixel-agents) by Pablo De Lucca (MIT) / [MetroCity](https://jik-a-4.itch.io/metrocity-free-topdown-character-pack) (CC0). These ARE in the repo under `public/sprites/arcade/`.\n- **Cozy People Asset Pack** by shubibubi: purchased under commercial license ($3.99+). Used for the layered avatar (body, hair, clothing, accessories) and pet sprites.\n- **Cozy Interior Asset Pack** by shubibubi: purchased under commercial license. Used for arcade room furniture and tilesets.\n- **License terms**: \"Can be used in any commercial or non commercial project, may modify. Can't be resold or redistributed even if modified.\"\n- **NEVER commit Cozy assets to the repo** — they are NOT covered by AGPL. They live in Supabase Storage and are loaded at runtime via `NEXT_PUBLIC_COZY_BASE_URL`.\n- **NEVER include Cozy PNGs in git add** — the `public/cozy/` folder is gitignored.\n- Forkers must buy their own license from shubibubi on itch.io and place files in `public/cozy/`, then seed the `arcade-assets` Supabase bucket from those files. (The maintainer's upload script lives under the gitignored `scripts/` folder and is not shipped — write a small one-off uploader against the `arcade-assets` bucket.)\n- Original purchase links: https://shubibubi.itch.io/cozy-people and https://shubibubi.itch.io/cozy-interior\n- **Kenney models** (`public/models/trees/*.glb`, `public/models/props/*.glb`): from [Kenney](https://kenney.nl) Nature Kit / City Kit (CC0 — public domain). Free to use, modify, and redistribute; attribution appreciated but not required. These ARE in the repo. Raw unpacked kit folders stay local (`kenney/` is gitignored).\n- **Kenney Racing Kit, Nature Kit and City Kit (Industrial)** (`public/models/drift/**`): the drift spots' grandstands, pits, tents, light posts, flags, trees, rocks, containers and tanks, from [Kenney](https://kenney.nl) (CC0). These ARE in the repo; only the models the spots use are copied.\n- **Kenney Car Kit** (`public/models/cars/*.glb`): the sedan body and a wheel from [Kenney](https://kenney.nl/assets/car-kit) Car Kit (CC0). These ARE in the repo.\n- **Drive sounds** (`public/sounds/drive/*.ogg`): `engine`, `skid` and `impact` from [KenneyNL/Starter-Kit-Racing](https://github.com/KenneyNL/Starter-Kit-Racing) (CC0; the skid sound is by Landeplage, also CC0). The horn is synthesized in code, no file.\n- **San Francisco and Bay Area maps** (`public/maps/sf.json`, `public/maps/bay.json`, `src/lib/maps/bay-lots.json`): baked from [OpenStreetMap](https://www.openstreetmap.org/copyright) data (the Bay from a Geofabrik extract). OSM data is **ODbL** — the \"© OpenStreetMap contributors\" credit MUST stay visible on the map (rendered in `home-client.tsx`). The committed files are what ship; the bake scripts live under the gitignored `scripts/` folder and are not in the repo.\n\n- **Brazil's cities** (`src/lib/towns/br-cities.json`): the 5,571 municipalities with their IBGE codes and seats, from [kelvins/municipios-brasileiros](https://github.com/kelvins/municipios-brasileiros) (MIT, compiled from IBGE).\n- **Brazil map** (`src/lib/towns/brasil-geo.json`, `src/lib/towns/brasil-rivers.json`): the outline and states simplified from [IBGE](https://www.ibge.gov.br/geociencias/organizacao-do-territorio/malhas-territoriais.html) meshes (public data, credit IBGE), the rivers from [Natural Earth](https://www.naturalearthdata.com) (public domain). The \"Map data: IBGE · Natural Earth\" credit stays on the Brasil map (`brasil-town.tsx`).\n\n## Key files\n\n| File | What it does |\n|------|-------------|\n| `src/components/InstancedBuildings.tsx` | WebGL instanced rendering for thousands of buildings |\n| `src/components/CityCanvas.tsx` | Main Three.js scene setup |\n| `src/lib/raid.ts` | Raid system (PvP, scoring, limits) |\n| `src/lib/items.ts` | Shop items, equipping, zones |\n| `src/lib/xp.ts` | XP leveling (25 levels, 6 tiers) |\n| `src/lib/pixels.ts` | PX earning (`earn_pixels` rules) and balances |\n"},"files":{"packages/vscode-extension/README.md":"# Git City: Pulse\n\nYour building's transmitter. When you code, it pulses. The city lights up.\n\n## How it works\n\n1. Generate your API key at [thegitcity.com](https://www.thegitcity.com) (click \"coding now\" in the top bar)\n2. Install this extension\n3. Run `Cmd+Shift+P` > \"Pulse: Connect\" and paste your key\n4. Start coding. Your building starts transmitting in ~30 seconds.\n\nWhen you're coding, your building glows in the city and you appear in the live feed. Stop coding and it fades after a few minutes.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `Pulse: Connect` | Link your building to the city |\n| `Pulse: Disconnect` | Unlink your building |\n| `Pulse: Toggle` | Pause/resume your transmitter |\n| `Pulse: Open City` | Open Git City in your browser |\n\n## Status bar\n\nThe status bar shows your transmitter state:\n\n- `$(broadcast) Pulse: Transmitting` - Your building is live in the city\n- `$(circle-outline) Pulse: Standby` - Waiting for you to code\n- `$(circle-slash) Pulse: Off` - Transmitter paused\n- `$(plug) Pulse: Disconnected` - No API key set\n\nClick the status bar item to toggle your transmitter on/off.\n\n## Privacy\n\n**You control what gets transmitted.**\n\n| Data | Public? | Can disable? |\n|------|---------|-------------|\n| Username | Yes (your GitHub login) | No (identifies your building) |\n| Language | Yes (e.g. \"TypeScript\") | Yes, via `gitCity.privacy.shareLanguage` |\n| Project name | **No, never public** | Yes, via `gitCity.privacy.shareProject` |\n| Branch name | **No, never public** | Excluded with project |\n| File paths | **Never sent** | N/A |\n| Code contents | **Never sent** | N/A |\n\n**What is never collected:** file contents, code, diffs, clipboard, terminal output, file paths, or any intellectual property.\n\n**Project names** are stored server-side for your personal analytics only. They are never shown to other users, never included in any public API, and never broadcast. You can disable sending them entirely.\n\n### Privacy settings\n\nOpen VS Code Settings (`Cmd+,`) and search for \"Git City\":\n\n- `gitCity.privacy.shareLanguage` - Share the programming language (default: on)\n- `gitCity.privacy.shareProject` - Send project name for personal analytics (default: on)\n- `gitCity.privacy.excludeProjects` - List of project names to never track (e.g. `[\"secret-project\", \"client-work\"]`)\n- `gitCity.enabled` - Disable all transmission entirely\n- `gitCity.idleTimeout` - Seconds of inactivity before standby (default: 300)\n","packages/vscode-extension/tsconfig.json":"{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"target\": \"ES2022\",\n    \"lib\": [\"ES2022\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"declaration\": false,\n    \"sourceMap\": true\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","packages/vscode-extension/package.json":"{\n  \"name\": \"gitcity\",\n  \"displayName\": \"Git City: Pulse\",\n  \"description\": \"Keep your city alive. When you code, your building glows and powers the signal. Privacy-first: you control what gets shared.\",\n  \"version\": \"0.3.0\",\n  \"publisher\": \"git-city\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/srizzon/git-city\"\n  },\n  \"homepage\": \"https://www.thegitcity.com\",\n  \"bugs\": {\n    \"url\": \"https://github.com/srizzon/git-city/issues\"\n  },\n  \"engines\": {\n    \"vscode\": \"^1.93.0\"\n  },\n  \"categories\": [\"Other\"],\n  \"activationEvents\": [\"onStartupFinished\"],\n  \"main\": \"./dist/extension.js\",\n  \"icon\": \"icon.png\",\n  \"contributes\": {\n    \"commands\": [\n      {\n        \"command\": \"gitCity.login\",\n        \"title\": \"Pulse: Connect\"\n      },\n      {\n        \"command\": \"gitCity.logout\",\n        \"title\": \"Pulse: Disconnect\"\n      },\n      {\n        \"command\": \"gitCity.togglePause\",\n        \"title\": \"Pulse: Toggle\"\n      },\n      {\n        \"command\": \"gitCity.showDashboard\",\n        \"title\": \"Pulse: Open City\"\n      }\n    ],\n    \"configuration\": {\n      \"title\": \"Git City\",\n      \"properties\": {\n        \"gitCity.enabled\": {\n          \"type\": \"boolean\",\n          \"default\": true,\n          \"description\": \"Enable/disable activity tracking\"\n        },\n        \"gitCity.apiUrl\": {\n          \"type\": \"string\",\n          \"default\": \"https://www.thegitcity.com\",\n          \"description\": \"Git City API URL (changing this sends your API key to a different server)\",\n          \"scope\": \"application\"\n        },\n        \"gitCity.privacy.shareLanguage\": {\n          \"type\": \"boolean\",\n          \"default\": true,\n          \"description\": \"Share the programming language you're using (shown publicly on your building)\"\n        },\n        \"gitCity.privacy.shareProject\": {\n          \"type\": \"boolean\",\n          \"default\": true,\n          \"description\": \"Send project name for your personal analytics (never shown publicly to other users)\"\n        },\n        \"gitCity.privacy.excludeProjects\": {\n          \"type\": \"array\",\n          \"default\": [],\n          \"items\": { \"type\": \"string\" },\n          \"description\": \"Project names to never track at all (e.g. secret-project, client-work)\"\n        },\n        \"gitCity.idleTimeout\": {\n          \"type\": \"number\",\n          \"default\": 300,\n          \"minimum\": 60,\n          \"maximum\": 3600,\n          \"description\": \"Seconds of inactivity before marking as idle\"\n        }\n      }\n    }\n  },\n  \"scripts\": {\n    \"build\": \"node esbuild.mjs\",\n    \"watch\": \"node esbuild.mjs --watch\",\n    \"package\": \"vsce package\"\n  },\n  \"devDependencies\": {\n    \"@types/vscode\": \"^1.93.0\",\n    \"esbuild\": \"^0.20.0\",\n    \"typescript\": \"^5.3.0\"\n  }\n}\n","packages/vscode-extension/CHANGELOG.md":"# Changelog\n\n## 0.3.0\n\n- Track terminal activity (Claude Code, Cursor agent, manual commands)\n- Track debug sessions, task runner, file operations, and notebook edits\n- Your building now stays lit when coding via AI agents or terminal\n- Minimum VS Code version bumped to 1.93\n\n## 0.2.0\n\n- Rebranded to **Git City: Pulse**\n- New status bar states: Transmitting, Standby, Off, Disconnected\n- Updated commands: Pulse: Connect, Disconnect, Toggle, Open City\n- Fixed API URL to use www subdomain\n\n## 0.1.0\n\n- Initial release\n- Live presence: your building glows when you code\n- Privacy controls: choose what data to share\n- Status bar integration\n- Idle detection with configurable timeout\n","CLAUDE.md":"# Git City\n\n3D pixel art city built from real GitHub data. Buildings represent developers: height = contributions, width = repos, lit windows = recent activity.\n\n## Tech stack\n\n- **Frontend:** Next.js App Router, Three.js (instanced rendering), TypeScript\n- **Backend:** Supabase (Postgres + Auth + Realtime)\n- **Payments:** none. Git City takes no money; PX is earned in-game, and GITC burned for PX is the only token flow\n- **Deployment:** Vercel\n\n## Project structure\n\n```\nsrc/\n  app/              Next.js pages and API routes\n  components/       React + Three.js components\n  lib/              Core game logic (raids, dailies, XP, items, etc.)\nsupabase/\n  migrations/       Sequential SQL migrations (001_, 002_, ...)\n```\n\n## Code conventions\n\n- TypeScript everywhere, no `any`\n- `getSupabaseAdmin()` for server-side writes (bypasses RLS)\n- `createServerSupabase()` for auth in API routes (cookie-based)\n- API routes validate auth, then use admin client for DB operations\n- Items use a zone system: crown, roof, aura, faces\n- Loadout stored in `developer_customizations` table with `item_id = \"loadout\"`\n\n## Database\n\n- Migrations in `supabase/migrations/`, numbered sequentially\n- Never modify existing migrations, always create new ones\n- Every foreign key to `developers` (or `auth.users`) is `ON DELETE CASCADE`, or `SET NULL` when the row belongs to someone else, so `delete_developer_account()` (migration 183) can erase an account in one go\n- Run locally with `npx supabase db push`\n- **NEVER run UPDATE or DELETE on production data without explicit user approval**\n- **NEVER NULL out, drop, or modify columns that contain user data (emails, API keys, etc)**\n- When fixing security/permissions issues, ONLY change grants/policies — never touch the data itself\n- Always propose SQL as code for the user to review, never execute destructive SQL directly\n\n## Environments\n\n- Three environments, one-directional flow: local → staging → prod (see `ENVIRONMENTS.md`)\n- `main` = production. Any other pushed branch = Vercel preview + staging Supabase\n- No migration CI: migrations are applied by hand, to staging first, then to prod with the user's explicit OK, and each version is recorded in `supabase_migrations.schema_migrations` so a later `db push` won't re-run it\n- Vercel Preview-scoped env vars point at the staging Supabase project; Production-scoped at prod\n- Staging is disposable: reset with `supabase db reset --linked` while linked to staging. Never copy prod data into it\n\n## Git\n\n- Preserve full commit history on merge — NEVER squash PRs (use a merge commit or rebase, keep every commit)\n- Commit message format (ALWAYS follow):\n  - emoji + conventional commit: `✨ feat(scope): ...`, `🐛 fix(scope): ...`, `✏️ docs: ...`, `♻️ refactor: ...`\n  - single line only — no body, no bullet points\n  - all lowercase, written in english\n  - split work into separate commits by logical part / group of changes (never one giant commit)\n- Never skip hooks or force push to main\n\n## Third-party Assets (IMPORTANT)\n\n- **Arcade character sprites (char_0-5)** and Lumon furniture: from [pixel-agents](https://github.com/pablodelucca/pixel-agents) by Pablo De Lucca (MIT) / [MetroCity](https://jik-a-4.itch.io/metrocity-free-topdown-character-pack) (CC0). These ARE in the repo under `public/sprites/arcade/`.\n- **Cozy People Asset Pack** by shubibubi: purchased under commercial license ($3.99+). Used for the layered avatar (body, hair, clothing, accessories) and pet sprites.\n- **Cozy Interior Asset Pack** by shubibubi: purchased under commercial license. Used for arcade room furniture and tilesets.\n- **License terms**: \"Can be used in any commercial or non commercial project, may modify. Can't be resold or redistributed even if modified.\"\n- **NEVER commit Cozy assets to the repo** — they are NOT covered by AGPL. They live in Supabase Storage and are loaded at runtime via `NEXT_PUBLIC_COZY_BASE_URL`.\n- **NEVER include Cozy PNGs in git add** — the `public/cozy/` folder is gitignored.\n- Forkers must buy their own license from shubibubi on itch.io and place files in `public/cozy/`, then seed the `arcade-assets` Supabase bucket from those files. (The maintainer's upload script lives under the gitignored `scripts/` folder and is not shipped — write a small one-off uploader against the `arcade-assets` bucket.)\n- Original purchase links: https://shubibubi.itch.io/cozy-people and https://shubibubi.itch.io/cozy-interior\n- **Kenney models** (`public/models/trees/*.glb`, `public/models/props/*.glb`): from [Kenney](https://kenney.nl) Nature Kit / City Kit (CC0 — public domain). Free to use, modify, and redistribute; attribution appreciated but not required. These ARE in the repo. Raw unpacked kit folders stay local (`kenney/` is gitignored).\n- **Kenney Racing Kit, Nature Kit and City Kit (Industrial)** (`public/models/drift/**`): the drift spots' grandstands, pits, tents, light posts, flags, trees, rocks, containers and tanks, from [Kenney](https://kenney.nl) (CC0). These ARE in the repo; only the models the spots use are copied.\n- **Kenney Car Kit** (`public/models/cars/*.glb`): the sedan body and a wheel from [Kenney](https://kenney.nl/assets/car-kit) Car Kit (CC0). These ARE in the repo.\n- **Drive sounds** (`public/sounds/drive/*.ogg`): `engine`, `skid` and `impact` from [KenneyNL/Starter-Kit-Racing](https://github.com/KenneyNL/Starter-Kit-Racing) (CC0; the skid sound is by Landeplage, also CC0). The horn is synthesized in code, no file.\n- **San Francisco and Bay Area maps** (`public/maps/sf.json`, `public/maps/bay.json`, `src/lib/maps/bay-lots.json`): baked from [OpenStreetMap](https://www.openstreetmap.org/copyright) data (the Bay from a Geofabrik extract). OSM data is **ODbL** — the \"© OpenStreetMap contributors\" credit MUST stay visible on the map (rendered in `home-client.tsx`). The committed files are what ship; the bake scripts live under the gitignored `scripts/` folder and are not in the repo.\n\n- **Brazil's cities** (`src/lib/towns/br-cities.json`): the 5,571 municipalities with their IBGE codes and seats, from [kelvins/municipios-brasileiros](https://github.com/kelvins/municipios-brasileiros) (MIT, compiled from IBGE).\n- **Brazil map** (`src/lib/towns/brasil-geo.json`, `src/lib/towns/brasil-rivers.json`): the outline and states simplified from [IBGE](https://www.ibge.gov.br/geociencias/organizacao-do-territorio/malhas-territoriais.html) meshes (public data, credit IBGE), the rivers from [Natural Earth](https://www.naturalearthdata.com) (public domain). The \"Map data: IBGE · Natural Earth\" credit stays on the Brasil map (`brasil-town.tsx`).\n\n## Key files\n\n| File | What it does |\n|------|-------------|\n| `src/components/InstancedBuildings.tsx` | WebGL instanced rendering for thousands of buildings |\n| `src/components/CityCanvas.tsx` | Main Three.js scene setup |\n| `src/lib/raid.ts` | Raid system (PvP, scoring, limits) |\n| `src/lib/items.ts` | Shop items, equipping, zones |\n| `src/lib/xp.ts` | XP leveling (25 levels, 6 tiers) |\n| `src/lib/pixels.ts` | PX earning (`earn_pixels` rules) and balances |\n"},"items":[{"name":"CHANGELOG.md","path":"packages/vscode-extension/CHANGELOG.md","rawUrl":"https://raw.githubusercontent.com/srizzon/git-city/HEAD/packages/vscode-extension/CHANGELOG.md","title":"Vscode-extension Skill","category":"anthropic-skill","format":"markdown","content":"# Changelog\n\n## 0.3.0\n\n- Track terminal activity (Claude Code, Cursor agent, manual commands)\n- Track debug sessions, task runner, file operations, and notebook edits\n- Your building now stays lit when coding via AI agents or terminal\n- Minimum VS Code version bumped to 1.93\n\n## 0.2.0\n\n- Rebranded to **Git City: Pulse**\n- New status bar states: Transmitting, Standby, Off, Disconnected\n- Updated commands: Pulse: Connect, Disconnect, Toggle, Open City\n- Fixed API URL to use www subdomain\n\n## 0.1.0\n\n- Initial release\n- Live presence: your building glows when you code\n- Privacy controls: choose what data to share\n- Status bar integration\n- Idle detection with configurable timeout\n","isInternal":false,"tokens":175,"sizeBytes":685},{"name":"package.json","path":"packages/vscode-extension/package.json","rawUrl":"https://raw.githubusercontent.com/srizzon/git-city/HEAD/packages/vscode-extension/package.json","title":"gitcity","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"gitcity\",\n  \"displayName\": \"Git City: Pulse\",\n  \"description\": \"Keep your city alive. When you code, your building glows and powers the signal. Privacy-first: you control what gets shared.\",\n  \"version\": \"0.3.0\",\n  \"publisher\": \"git-city\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/srizzon/git-city\"\n  },\n  \"homepage\": \"https://www.thegitcity.com\",\n  \"bugs\": {\n    \"url\": \"https://github.com/srizzon/git-city/issues\"\n  },\n  \"engines\": {\n    \"vscode\": \"^1.93.0\"\n  },\n  \"categories\": [\"Other\"],\n  \"activationEvents\": [\"onStartupFinished\"],\n  \"main\": \"./dist/extension.js\",\n  \"icon\": \"icon.png\",\n  \"contributes\": {\n    \"commands\": [\n      {\n        \"command\": \"gitCity.login\",\n        \"title\": \"Pulse: Connect\"\n      },\n      {\n        \"command\": \"gitCity.logout\",\n        \"title\": \"Pulse: Disconnect\"\n      },\n      {\n        \"command\": \"gitCity.togglePause\",\n        \"title\": \"Pulse: Toggle\"\n      },\n      {\n        \"command\": \"gitCity.showDashboard\",\n        \"title\": \"Pulse: Open City\"\n      }\n    ],\n    \"configuration\": {\n      \"title\": \"Git City\",\n      \"properties\": {\n        \"gitCity.enabled\": {\n          \"type\": \"boolean\",\n          \"default\": true,\n          \"description\": \"Enable/disable activity tracking\"\n        },\n        \"gitCity.apiUrl\": {\n          \"type\": \"string\",\n          \"default\": \"https://www.thegitcity.com\",\n          \"description\": \"Git City API URL (changing this sends your API key to a different server)\",\n          \"scope\": \"application\"\n        },\n        \"gitCity.privacy.shareLanguage\": {\n          \"type\": \"boolean\",\n          \"default\": true,\n          \"description\": \"Share the programming language you're using (shown publicly on your building)\"\n        },\n        \"gitCity.privacy.shareProject\": {\n          \"type\": \"boolean\",\n          \"default\": true,\n          \"description\": \"Send project name for your personal analytics (never shown publicly to other users)\"\n        },\n        \"gitCity.privacy.excludeProjects\": {\n          \"type\": \"array\",\n          \"default\": [],\n          \"items\": { \"type\": \"string\" },\n          \"description\": \"Project names to never track at all (e.g. secret-project, client-work)\"\n        },\n        \"gitCity.idleTimeout\": {\n          \"type\": \"number\",\n          \"default\": 300,\n          \"minimum\": 60,\n          \"maximum\": 3600,\n          \"description\": \"Seconds of inactivity before marking as idle\"\n        }\n      }\n    }\n  },\n  \"scripts\": {\n    \"build\": \"node esbuild.mjs\",\n    \"watch\": \"node esbuild.mjs --watch\",\n    \"package\": \"vsce package\"\n  },\n  \"devDependencies\": {\n    \"@types/vscode\": \"^1.93.0\",\n    \"esbuild\": \"^0.20.0\",\n    \"typescript\": \"^5.3.0\"\n  }\n}\n","frontmatter":{"name":"gitcity","displayName":"Git City: Pulse","description":"Keep your city alive. When you code, your building glows and powers the signal. Privacy-first: you control what gets shared.","version":"0.3.0","publisher":"git-city","license":"AGPL-3.0","repository":{"type":"git","url":"https://github.com/srizzon/git-city"},"homepage":"https://www.thegitcity.com","bugs":{"url":"https://github.com/srizzon/git-city/issues"},"engines":{"vscode":"^1.93.0"},"categories":["Other"],"activationEvents":["onStartupFinished"],"main":"./dist/extension.js","icon":"icon.png","contributes":{"commands":[{"command":"gitCity.login","title":"Pulse: Connect"},{"command":"gitCity.logout","title":"Pulse: Disconnect"},{"command":"gitCity.togglePause","title":"Pulse: Toggle"},{"command":"gitCity.showDashboard","title":"Pulse: Open City"}],"configuration":{"title":"Git City","properties":{"gitCity.enabled":{"type":"boolean","default":true,"description":"Enable/disable activity tracking"},"gitCity.apiUrl":{"type":"string","default":"https://www.thegitcity.com","description":"Git City API URL (changing this sends your API key to a different server)","scope":"application"},"gitCity.privacy.shareLanguage":{"type":"boolean","default":true,"description":"Share the programming language you're using (shown publicly on your building)"},"gitCity.privacy.shareProject":{"type":"boolean","default":true,"description":"Send project name for your personal analytics (never shown publicly to other users)"},"gitCity.privacy.excludeProjects":{"type":"array","default":[],"items":{"type":"string"},"description":"Project names to never track at all (e.g. secret-project, client-work)"},"gitCity.idleTimeout":{"type":"number","default":300,"minimum":60,"maximum":3600,"description":"Seconds of inactivity before marking as idle"}}}},"scripts":{"build":"node esbuild.mjs","watch":"node esbuild.mjs --watch","package":"vsce package"},"devDependencies":{"@types/vscode":"^1.93.0","esbuild":"^0.20.0","typescript":"^5.3.0"}},"isInternal":false,"tokens":714,"sizeBytes":2708},{"name":"tsconfig.json","path":"packages/vscode-extension/tsconfig.json","rawUrl":"https://raw.githubusercontent.com/srizzon/git-city/HEAD/packages/vscode-extension/tsconfig.json","title":"Vscode-extension Skill","category":"anthropic-skill","format":"json","content":"{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"target\": \"ES2022\",\n    \"lib\": [\"ES2022\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"declaration\": false,\n    \"sourceMap\": true\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n","frontmatter":{"compilerOptions":{"module":"commonjs","target":"ES2022","lib":["ES2022"],"outDir":"dist","rootDir":"src","strict":true,"esModuleInterop":true,"skipLibCheck":true,"forceConsistentCasingInFileNames":true,"resolveJsonModule":true,"declaration":false,"sourceMap":true},"include":["src/**/*"],"exclude":["node_modules","dist"]},"isInternal":false,"tokens":127,"sizeBytes":414},{"name":"CLAUDE.md","path":"CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/srizzon/git-city/HEAD/CLAUDE.md","title":"Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# Git City\n\n3D pixel art city built from real GitHub data. Buildings represent developers: height = contributions, width = repos, lit windows = recent activity.\n\n## Tech stack\n\n- **Frontend:** Next.js App Router, Three.js (instanced rendering), TypeScript\n- **Backend:** Supabase (Postgres + Auth + Realtime)\n- **Payments:** none. Git City takes no money; PX is earned in-game, and GITC burned for PX is the only token flow\n- **Deployment:** Vercel\n\n## Project structure\n\n```\nsrc/\n  app/              Next.js pages and API routes\n  components/       React + Three.js components\n  lib/              Core game logic (raids, dailies, XP, items, etc.)\nsupabase/\n  migrations/       Sequential SQL migrations (001_, 002_, ...)\n```\n\n## Code conventions\n\n- TypeScript everywhere, no `any`\n- `getSupabaseAdmin()` for server-side writes (bypasses RLS)\n- `createServerSupabase()` for auth in API routes (cookie-based)\n- API routes validate auth, then use admin client for DB operations\n- Items use a zone system: crown, roof, aura, faces\n- Loadout stored in `developer_customizations` table with `item_id = \"loadout\"`\n\n## Database\n\n- Migrations in `supabase/migrations/`, numbered sequentially\n- Never modify existing migrations, always create new ones\n- Every foreign key to `developers` (or `auth.users`) is `ON DELETE CASCADE`, or `SET NULL` when the row belongs to someone else, so `delete_developer_account()` (migration 183) can erase an account in one go\n- Run locally with `npx supabase db push`\n- **NEVER run UPDATE or DELETE on production data without explicit user approval**\n- **NEVER NULL out, drop, or modify columns that contain user data (emails, API keys, etc)**\n- When fixing security/permissions issues, ONLY change grants/policies — never touch the data itself\n- Always propose SQL as code for the user to review, never execute destructive SQL directly\n\n## Environments\n\n- Three environments, one-directional flow: local → staging → prod (see `ENVIRONMENTS.md`)\n- `main` = production. Any other pushed branch = Vercel preview + staging Supabase\n- No migration CI: migrations are applied by hand, to staging first, then to prod with the user's explicit OK, and each version is recorded in `supabase_migrations.schema_migrations` so a later `db push` won't re-run it\n- Vercel Preview-scoped env vars point at the staging Supabase project; Production-scoped at prod\n- Staging is disposable: reset with `supabase db reset --linked` while linked to staging. Never copy prod data into it\n\n## Git\n\n- Preserve full commit history on merge — NEVER squash PRs (use a merge commit or rebase, keep every commit)\n- Commit message format (ALWAYS follow):\n  - emoji + conventional commit: `✨ feat(scope): ...`, `🐛 fix(scope): ...`, `✏️ docs: ...`, `♻️ refactor: ...`\n  - single line only — no body, no bullet points\n  - all lowercase, written in english\n  - split work into separate commits by logical part / group of changes (never one giant commit)\n- Never skip hooks or force push to main\n\n## Third-party Assets (IMPORTANT)\n\n- **Arcade character sprites (char_0-5)** and Lumon furniture: from [pixel-agents](https://github.com/pablodelucca/pixel-agents) by Pablo De Lucca (MIT) / [MetroCity](https://jik-a-4.itch.io/metrocity-free-topdown-character-pack) (CC0). These ARE in the repo under `public/sprites/arcade/`.\n- **Cozy People Asset Pack** by shubibubi: purchased under commercial license ($3.99+). Used for the layered avatar (body, hair, clothing, accessories) and pet sprites.\n- **Cozy Interior Asset Pack** by shubibubi: purchased under commercial license. Used for arcade room furniture and tilesets.\n- **License terms**: \"Can be used in any commercial or non commercial project, may modify. Can't be resold or redistributed even if modified.\"\n- **NEVER commit Cozy assets to the repo** — they are NOT covered by AGPL. They live in Supabase Storage and are loaded at runtime via `NEXT_PUBLIC_COZY_BASE_URL`.\n- **NEVER include Cozy PNGs in git add** — the `public/cozy/` folder is gitignored.\n- Forkers must buy their own license from shubibubi on itch.io and place files in `public/cozy/`, then seed the `arcade-assets` Supabase bucket from those files. (The maintainer's upload script lives under the gitignored `scripts/` folder and is not shipped — write a small one-off uploader against the `arcade-assets` bucket.)\n- Original purchase links: https://shubibubi.itch.io/cozy-people and https://shubibubi.itch.io/cozy-interior\n- **Kenney models** (`public/models/trees/*.glb`, `public/models/props/*.glb`): from [Kenney](https://kenney.nl) Nature Kit / City Kit (CC0 — public domain). Free to use, modify, and redistribute; attribution appreciated but not required. These ARE in the repo. Raw unpacked kit folders stay local (`kenney/` is gitignored).\n- **Kenney Racing Kit, Nature Kit and City Kit (Industrial)** (`public/models/drift/**`): the drift spots' grandstands, pits, tents, light posts, flags, trees, rocks, containers and tanks, from [Kenney](https://kenney.nl) (CC0). These ARE in the repo; only the models the spots use are copied.\n- **Kenney Car Kit** (`public/models/cars/*.glb`): the sedan body and a wheel from [Kenney](https://kenney.nl/assets/car-kit) Car Kit (CC0). These ARE in the repo.\n- **Drive sounds** (`public/sounds/drive/*.ogg`): `engine`, `skid` and `impact` from [KenneyNL/Starter-Kit-Racing](https://github.com/KenneyNL/Starter-Kit-Racing) (CC0; the skid sound is by Landeplage, also CC0). The horn is synthesized in code, no file.\n- **San Francisco and Bay Area maps** (`public/maps/sf.json`, `public/maps/bay.json`, `src/lib/maps/bay-lots.json`): baked from [OpenStreetMap](https://www.openstreetmap.org/copyright) data (the Bay from a Geofabrik extract). OSM data is **ODbL** — the \"© OpenStreetMap contributors\" credit MUST stay visible on the map (rendered in `home-client.tsx`). The committed files are what ship; the bake scripts live under the gitignored `scripts/` folder and are not in the repo.\n\n- **Brazil's cities** (`src/lib/towns/br-cities.json`): the 5,571 municipalities with their IBGE codes and seats, from [kelvins/municipios-brasileiros](https://github.com/kelvins/municipios-brasileiros) (MIT, compiled from IBGE).\n- **Brazil map** (`src/lib/towns/brasil-geo.json`, `src/lib/towns/brasil-rivers.json`): the outline and states simplified from [IBGE](https://www.ibge.gov.br/geociencias/organizacao-do-territorio/malhas-territoriais.html) meshes (public data, credit IBGE), the rivers from [Natural Earth](https://www.naturalearthdata.com) (public domain). The \"Map data: IBGE · Natural Earth\" credit stays on the Brasil map (`brasil-town.tsx`).\n\n## Key files\n\n| File | What it does |\n|------|-------------|\n| `src/components/InstancedBuildings.tsx` | WebGL instanced rendering for thousands of buildings |\n| `src/components/CityCanvas.tsx` | Main Three.js scene setup |\n| `src/lib/raid.ts` | Raid system (PvP, scoring, limits) |\n| `src/lib/items.ts` | Shop items, equipping, zones |\n| `src/lib/xp.ts` | XP leveling (25 levels, 6 tiers) |\n| `src/lib/pixels.ts` | PX earning (`earn_pixels` rules) and balances |\n","isInternal":false,"tokens":1853,"sizeBytes":7109},{"name":"README.md","path":"packages/vscode-extension/README.md","rawUrl":"https://raw.githubusercontent.com/srizzon/git-city/HEAD/packages/vscode-extension/README.md","title":"vscode-extension Documentation","category":"plugin-manifest","format":"markdown","content":"# Git City: Pulse\n\nYour building's transmitter. When you code, it pulses. The city lights up.\n\n## How it works\n\n1. Generate your API key at [thegitcity.com](https://www.thegitcity.com) (click \"coding now\" in the top bar)\n2. Install this extension\n3. Run `Cmd+Shift+P` > \"Pulse: Connect\" and paste your key\n4. Start coding. Your building starts transmitting in ~30 seconds.\n\nWhen you're coding, your building glows in the city and you appear in the live feed. Stop coding and it fades after a few minutes.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `Pulse: Connect` | Link your building to the city |\n| `Pulse: Disconnect` | Unlink your building |\n| `Pulse: Toggle` | Pause/resume your transmitter |\n| `Pulse: Open City` | Open Git City in your browser |\n\n## Status bar\n\nThe status bar shows your transmitter state:\n\n- `$(broadcast) Pulse: Transmitting` - Your building is live in the city\n- `$(circle-outline) Pulse: Standby` - Waiting for you to code\n- `$(circle-slash) Pulse: Off` - Transmitter paused\n- `$(plug) Pulse: Disconnected` - No API key set\n\nClick the status bar item to toggle your transmitter on/off.\n\n## Privacy\n\n**You control what gets transmitted.**\n\n| Data | Public? | Can disable? |\n|------|---------|-------------|\n| Username | Yes (your GitHub login) | No (identifies your building) |\n| Language | Yes (e.g. \"TypeScript\") | Yes, via `gitCity.privacy.shareLanguage` |\n| Project name | **No, never public** | Yes, via `gitCity.privacy.shareProject` |\n| Branch name | **No, never public** | Excluded with project |\n| File paths | **Never sent** | N/A |\n| Code contents | **Never sent** | N/A |\n\n**What is never collected:** file contents, code, diffs, clipboard, terminal output, file paths, or any intellectual property.\n\n**Project names** are stored server-side for your personal analytics only. They are never shown to other users, never included in any public API, and never broadcast. You can disable sending them entirely.\n\n### Privacy settings\n\nOpen VS Code Settings (`Cmd+,`) and search for \"Git City\":\n\n- `gitCity.privacy.shareLanguage` - Share the programming language (default: on)\n- `gitCity.privacy.shareProject` - Send project name for personal analytics (default: on)\n- `gitCity.privacy.excludeProjects` - List of project names to never track (e.g. `[\"secret-project\", \"client-work\"]`)\n- `gitCity.enabled` - Disable all transmission entirely\n- `gitCity.idleTimeout` - Seconds of inactivity before standby (default: 300)\n","isInternal":false,"tokens":621,"sizeBytes":2478}],"systemPromptSnippet":"<yakaai_skills repo=\"srizzon/git-city\">\n<!-- File: packages/vscode-extension/CHANGELOG.md (Tokens: ~175 | Category: anthropic-skill) -->\n# Changelog\n\n## 0.3.0\n\n- Track terminal activity (Claude Code, Cursor agent, manual commands)\n- Track debug sessions, task runner, file operations, and notebook edits\n- Your building now stays lit when coding via AI agents or terminal\n- Minimum VS Code version bumped to 1.93\n\n## 0.2.0\n\n- Rebranded to **Git City: Pulse**\n- New status bar states: Transmitting, Standby, Off, Disconnected\n- Updated commands: Pulse: Connect, Disconnect, Toggle, Open City\n- Fixed API URL to use www subdomain\n\n## 0.1.0\n\n- Initial release\n- Live presence: your building glows when you code\n- Privacy controls: choose what data to share\n- Status bar integration\n- Idle detection with configurable timeout\n\n<!-- File: packages/vscode-extension/package.json (Tokens: ~714 | Category: anthropic-skill) -->\n{\n  \"name\": \"gitcity\",\n  \"displayName\": \"Git City: Pulse\",\n  \"description\": \"Keep your city alive. When you code, your building glows and powers the signal. Privacy-first: you control what gets shared.\",\n  \"version\": \"0.3.0\",\n  \"publisher\": \"git-city\",\n  \"license\": \"AGPL-3.0\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/srizzon/git-city\"\n  },\n  \"homepage\": \"https://www.thegitcity.com\",\n  \"bugs\": {\n    \"url\": \"https://github.com/srizzon/git-city/issues\"\n  },\n  \"engines\": {\n    \"vscode\": \"^1.93.0\"\n  },\n  \"categories\": [\"Other\"],\n  \"activationEvents\": [\"onStartupFinished\"],\n  \"main\": \"./dist/extension.js\",\n  \"icon\": \"icon.png\",\n  \"contributes\": {\n    \"commands\": [\n      {\n        \"command\": \"gitCity.login\",\n        \"title\": \"Pulse: Connect\"\n      },\n      {\n        \"command\": \"gitCity.logout\",\n        \"title\": \"Pulse: Disconnect\"\n      },\n      {\n        \"command\": \"gitCity.togglePause\",\n        \"title\": \"Pulse: Toggle\"\n      },\n      {\n        \"command\": \"gitCity.showDashboard\",\n        \"title\": \"Pulse: Open City\"\n      }\n    ],\n    \"configuration\": {\n      \"title\": \"Git City\",\n      \"properties\": {\n        \"gitCity.enabled\": {\n          \"type\": \"boolean\",\n          \"default\": true,\n          \"description\": \"Enable/disable activity tracking\"\n        },\n        \"gitCity.apiUrl\": {\n          \"type\": \"string\",\n          \"default\": \"https://www.thegitcity.com\",\n          \"description\": \"Git City API URL (changing this sends your API key to a different server)\",\n          \"scope\": \"application\"\n        },\n        \"gitCity.privacy.shareLanguage\": {\n          \"type\": \"boolean\",\n          \"default\": true,\n          \"description\": \"Share the programming language you're using (shown publicly on your building)\"\n        },\n        \"gitCity.privacy.shareProject\": {\n          \"type\": \"boolean\",\n          \"default\": true,\n          \"description\": \"Send project name for your personal analytics (never shown publicly to other users)\"\n        },\n        \"gitCity.privacy.excludeProjects\": {\n          \"type\": \"array\",\n          \"default\": [],\n          \"items\": { \"type\": \"string\" },\n          \"description\": \"Project names to never track at all (e.g. secret-project, client-work)\"\n        },\n        \"gitCity.idleTimeout\": {\n          \"type\": \"number\",\n          \"default\": 300,\n          \"minimum\": 60,\n          \"maximum\": 3600,\n          \"description\": \"Seconds of inactivity before marking as idle\"\n        }\n      }\n    }\n  },\n  \"scripts\": {\n    \"build\": \"node esbuild.mjs\",\n    \"watch\": \"node esbuild.mjs --watch\",\n    \"package\": \"vsce package\"\n  },\n  \"devDependencies\": {\n    \"@types/vscode\": \"^1.93.0\",\n    \"esbuild\": \"^0.20.0\",\n    \"typescript\": \"^5.3.0\"\n  }\n}\n\n<!-- File: packages/vscode-extension/tsconfig.json (Tokens: ~127 | Category: anthropic-skill) -->\n{\n  \"compilerOptions\": {\n    \"module\": \"commonjs\",\n    \"target\": \"ES2022\",\n    \"lib\": [\"ES2022\"],\n    \"outDir\": \"dist\",\n    \"rootDir\": \"src\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"declaration\": false,\n    \"sourceMap\": true\n  },\n  \"include\": [\"src/**/*\"],\n  \"exclude\": [\"node_modules\", \"dist\"]\n}\n\n<!-- File: CLAUDE.md (Tokens: ~1853 | Category: claude-rule) -->\n# Git City\n\n3D pixel art city built from real GitHub data. Buildings represent developers: height = contributions, width = repos, lit windows = recent activity.\n\n## Tech stack\n\n- **Frontend:** Next.js App Router, Three.js (instanced rendering), TypeScript\n- **Backend:** Supabase (Postgres + Auth + Realtime)\n- **Payments:** none. Git City takes no money; PX is earned in-game, and GITC burned for PX is the only token flow\n- **Deployment:** Vercel\n\n## Project structure\n\n```\nsrc/\n  app/              Next.js pages and API routes\n  components/       React + Three.js components\n  lib/              Core game logic (raids, dailies, XP, items, etc.)\nsupabase/\n  migrations/       Sequential SQL migrations (001_, 002_, ...)\n```\n\n## Code conventions\n\n- TypeScript everywhere, no `any`\n- `getSupabaseAdmin()` for server-side writes (bypasses RLS)\n- `createServerSupabase()` for auth in API routes (cookie-based)\n- API routes validate auth, then use admin client for DB operations\n- Items use a zone system: crown, roof, aura, faces\n- Loadout stored in `developer_customizations` table with `item_id = \"loadout\"`\n\n## Database\n\n- Migrations in `supabase/migrations/`, numbered sequentially\n- Never modify existing migrations, always create new ones\n- Every foreign key to `developers` (or `auth.users`) is `ON DELETE CASCADE`, or `SET NULL` when the row belongs to someone else, so `delete_developer_account()` (migration 183) can erase an account in one go\n- Run locally with `npx supabase db push`\n- **NEVER run UPDATE or DELETE on production data without explicit user approval**\n- **NEVER NULL out, drop, or modify columns that contain user data (emails, API keys, etc)**\n- When fixing security/permissions issues, ONLY change grants/policies — never touch the data itself\n- Always propose SQL as code for the user to review, never execute destructive SQL directly\n\n## Environments\n\n- Three environments, one-directional flow: local → staging → prod (see `ENVIRONMENTS.md`)\n- `main` = production. Any other pushed branch = Vercel preview + staging Supabase\n- No migration CI: migrations are applied by hand, to staging first, then to prod with the user's explicit OK, and each version is recorded in `supabase_migrations.schema_migrations` so a later `db push` won't re-run it\n- Vercel Preview-scoped env vars point at the staging Supabase project; Production-scoped at prod\n- Staging is disposable: reset with `supabase db reset --linked` while linked to staging. Never copy prod data into it\n\n## Git\n\n- Preserve full commit history on merge — NEVER squash PRs (use a merge commit or rebase, keep every commit)\n- Commit message format (ALWAYS follow):\n  - emoji + conventional commit: `✨ feat(scope): ...`, `🐛 fix(scope): ...`, `✏️ docs: ...`, `♻️ refactor: ...`\n  - single line only — no body, no bullet points\n  - all lowercase, written in english\n  - split work into separate commits by logical part / group of changes (never one giant commit)\n- Never skip hooks or force push to main\n\n## Third-party Assets (IMPORTANT)\n\n- **Arcade character sprites (char_0-5)** and Lumon furniture: from [pixel-agents](https://github.com/pablodelucca/pixel-agents) by Pablo De Lucca (MIT) / [MetroCity](https://jik-a-4.itch.io/metrocity-free-topdown-character-pack) (CC0). These ARE in the repo under `public/sprites/arcade/`.\n- **Cozy People Asset Pack** by shubibubi: purchased under commercial license ($3.99+). Used for the layered avatar (body, hair, clothing, accessories) and pet sprites.\n- **Cozy Interior Asset Pack** by shubibubi: purchased under commercial license. Used for arcade room furniture and tilesets.\n- **License terms**: \"Can be used in any commercial or non commercial project, may modify. Can't be resold or redistributed even if modified.\"\n- **NEVER commit Cozy assets to the repo** — they are NOT covered by AGPL. They live in Supabase Storage and are loaded at runtime via `NEXT_PUBLIC_COZY_BASE_URL`.\n- **NEVER include Cozy PNGs in git add** — the `public/cozy/` folder is gitignored.\n- Forkers must buy their own license from shubibubi on itch.io and place files in `public/cozy/`, then seed the `arcade-assets` Supabase bucket from those files. (The maintainer's upload script lives under the gitignored `scripts/` folder and is not shipped — write a small one-off uploader against the `arcade-assets` bucket.)\n- Original purchase links: https://shubibubi.itch.io/cozy-people and https://shubibubi.itch.io/cozy-interior\n- **Kenney models** (`public/models/trees/*.glb`, `public/models/props/*.glb`): from [Kenney](https://kenney.nl) Nature Kit / City Kit (CC0 — public domain). Free to use, modify, and redistribute; attribution appreciated but not required. These ARE in the repo. Raw unpacked kit folders stay local (`kenney/` is gitignored).\n- **Kenney Racing Kit, Nature Kit and City Kit (Industrial)** (`public/models/drift/**`): the drift spots' grandstands, pits, tents, light posts, flags, trees, rocks, containers and tanks, from [Kenney](https://kenney.nl) (CC0). These ARE in the repo; only the models the spots use are copied.\n- **Kenney Car Kit** (`public/models/cars/*.glb`): the sedan body and a wheel from [Kenney](https://kenney.nl/assets/car-kit) Car Kit (CC0). These ARE in the repo.\n- **Drive sounds** (`public/sounds/drive/*.ogg`): `engine`, `skid` and `impact` from [KenneyNL/Starter-Kit-Racing](https://github.com/KenneyNL/Starter-Kit-Racing) (CC0; the skid sound is by Landeplage, also CC0). The horn is synthesized in code, no file.\n- **San Francisco and Bay Area maps** (`public/maps/sf.json`, `public/maps/bay.json`, `src/lib/maps/bay-lots.json`): baked from [OpenStreetMap](https://www.openstreetmap.org/copyright) data (the Bay from a Geofabrik extract). OSM data is **ODbL** — the \"© OpenStreetMap contributors\" credit MUST stay visible on the map (rendered in `home-client.tsx`). The committed files are what ship; the bake scripts live under the gitignored `scripts/` folder and are not in the repo.\n\n- **Brazil's cities** (`src/lib/towns/br-cities.json`): the 5,571 municipalities with their IBGE codes and seats, from [kelvins/municipios-brasileiros](https://github.com/kelvins/municipios-brasileiros) (MIT, compiled from IBGE).\n- **Brazil map** (`src/lib/towns/brasil-geo.json`, `src/lib/towns/brasil-rivers.json`): the outline and states simplified from [IBGE](https://www.ibge.gov.br/geociencias/organizacao-do-territorio/malhas-territoriais.html) meshes (public data, credit IBGE), the rivers from [Natural Earth](https://www.naturalearthdata.com) (public domain). The \"Map data: IBGE · Natural Earth\" credit stays on the Brasil map (`brasil-town.tsx`).\n\n## Key files\n\n| File | What it does |\n|------|-------------|\n| `src/components/InstancedBuildings.tsx` | WebGL instanced rendering for thousands of buildings |\n| `src/components/CityCanvas.tsx` | Main Three.js scene setup |\n| `src/lib/raid.ts` | Raid system (PvP, scoring, limits) |\n| `src/lib/items.ts` | Shop items, equipping, zones |\n| `src/lib/xp.ts` | XP leveling (25 levels, 6 tiers) |\n| `src/lib/pixels.ts` | PX earning (`earn_pixels` rules) and balances |\n\n<!-- File: packages/vscode-extension/README.md (Tokens: ~621 | Category: plugin-manifest) -->\n# Git City: Pulse\n\nYour building's transmitter. When you code, it pulses. The city lights up.\n\n## How it works\n\n1. Generate your API key at [thegitcity.com](https://www.thegitcity.com) (click \"coding now\" in the top bar)\n2. Install this extension\n3. Run `Cmd+Shift+P` > \"Pulse: Connect\" and paste your key\n4. Start coding. Your building starts transmitting in ~30 seconds.\n\nWhen you're coding, your building glows in the city and you appear in the live feed. Stop coding and it fades after a few minutes.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `Pulse: Connect` | Link your building to the city |\n| `Pulse: Disconnect` | Unlink your building |\n| `Pulse: Toggle` | Pause/resume your transmitter |\n| `Pulse: Open City` | Open Git City in your browser |\n\n## Status bar\n\nThe status bar shows your transmitter state:\n\n- `$(broadcast) Pulse: Transmitting` - Your building is live in the city\n- `$(circle-outline) Pulse: Standby` - Waiting for you to code\n- `$(circle-slash) Pulse: Off` - Transmitter paused\n- `$(plug) Pulse: Disconnected` - No API key set\n\nClick the status bar item to toggle your transmitter on/off.\n\n## Privacy\n\n**You control what gets transmitted.**\n\n| Data | Public? | Can disable? |\n|------|---------|-------------|\n| Username | Yes (your GitHub login) | No (identifies your building) |\n| Language | Yes (e.g. \"TypeScript\") | Yes, via `gitCity.privacy.shareLanguage` |\n| Project name | **No, never public** | Yes, via `gitCity.privacy.shareProject` |\n| Branch name | **No, never public** | Excluded with project |\n| File paths | **Never sent** | N/A |\n| Code contents | **Never sent** | N/A |\n\n**What is never collected:** file contents, code, diffs, clipboard, terminal output, file paths, or any intellectual property.\n\n**Project names** are stored server-side for your personal analytics only. They are never shown to other users, never included in any public API, and never broadcast. You can disable sending them entirely.\n\n### Privacy settings\n\nOpen VS Code Settings (`Cmd+,`) and search for \"Git City\":\n\n- `gitCity.privacy.shareLanguage` - Share the programming language (default: on)\n- `gitCity.privacy.shareProject` - Send project name for personal analytics (default: on)\n- `gitCity.privacy.excludeProjects` - List of project names to never track (e.g. `[\"secret-project\", \"client-work\"]`)\n- `gitCity.enabled` - Disable all transmission entirely\n- `gitCity.idleTimeout` - Seconds of inactivity before standby (default: 300)\n</yakaai_skills>"}