{"owner":"imsyy","repo":"SPlayer","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md","CLAUDE.md"],"skills":{"AGENTS.md":"# AI 开发助手行为准则\n\n## 项目技术栈与环境\n\n- **核心框架**: Vue 3 + Electron\n- **UI 组件库**: **Naive UI** (严禁混用其他 UI 库)\n- **包管理器**: **严格使用 `pnpm`** (严禁使用 npm/yarn)\n- **开发命令**: `pnpm dev` (预览代码)\n- **代码质量**: 每次任务结束前，必须自动运行 `pnpm lint` 并修复所有问题，确保 0 错误、0 警告后方可交付。\n- **提交之前**: 必须运行 `pnpm build` 和 `pnpm format` 并修复所有问题，确保 0 错误、0 警告后方可提交。\n\n## 代码风格与规范\n\n### 1. 注释规范\n\n- **语言**: 必须使用**中文**。\n- **格式**: 保持简洁，禁止长句、英文长文或带序号的注释。\n  - 正确: `// 监听主进程消息`\n  - 错误: `// 1. listen to main process`, `// this function handles ipc...`\n\n### 2. UI 组件使用 Naive UI\n\n- **原则**: 严禁重复造轮子。所有通用交互必须优先使用 Naive UI 组件。\n- **处理方式**: 如果未找到合适组件，必须先询问用户，禁止擅自手写原生 CSS/HTML 组件。\n  - 正确: 使用 `<n-button type=\"primary\">`, `<n-modal>`, `<n-message-provider>`\n  - 错误: 手写 `<div class=\"my-btn\">` 或引入 Element Plus 等其他库。\n\n### 3. 图标\n\n- **原则**: 优先复用项目 `src/assets/icons` 或现有图标方案。\n- **具体实现**: 严格遵循项目现有的图标组件用法。\n  - 正确: `<SvgIcon :name=\"isLikeAlbum ? 'Favorite' : 'FavoriteBorder'\" />`\n  - 错误: 擅自引入 `xicons` (除非用户明确允许) 或手写 SVG 代码。\n\n### 4. Electron 特性规范\n\n- **进程安全**: 明确代码运行环境（Main vs Renderer）。不要在渲染进程中直接调用不安全的 Node.js API，应优先使用 IPC 通信或 Preload 脚本暴露的 API。\n- **通信规范**: 涉及 IPC 通信时，保持频道命名清晰且常量化。\n\n### 5. 测试与清理\n\n- **临时文件**: 任务过程中生成的临时测试文件（如 `test_lrc.ts`），必须在任务结束前自动删除，严禁推送到代码库。\n\n## 交互与思维链\n\n### 1. 遇到困难多确认\n\n- **原则**: 禁止假设。当遇到不理解的概念（特别是 Electron 的通信逻辑或原生能力调用）时，**必须**暂停并向用户提问。\n  - 禁止: “我猜用户是想在渲染进程直接读文件...” -> 导致安全报错。\n  - 建议: “此处涉及文件系统操作，请确认是通过 IPC 调用主进程处理，还是使用现有的工具函数？”\n\n### 2. 复杂任务先规划\n\n- **文档驱动开发**: 遇到复杂功能（如窗口管理、系统托盘、复杂逻辑重构）时，**必须**先创建一个临时的 Markdown 文档（如 `name_of_task.md`）。\n- **流程**: 在文档中梳理思路 -> 展示给用户 -> 用户同意 -> 开始写代码。\n\n### 3. 复用优先DRY原则\n\n- **原则**: 在编写新功能前，强制检索项目现存代码。\n- **自检**: “项目中是否已经有类似的 IPC 封装或 UI 组件？”如果是，直接复用。\n\n### 4. 聊天方式\n\n- **原则**: 与用户保持中文对话，禁止使用英文或其他语言。\n- **具体实现**: 所有与用户的交互（包括问题、指令、代码展示等）都必须用中文进行。\n\n## 严格合规声明\n\n- **指令等级**: Critical。\n- **违规后果**: 违反以上任何一条规则将被定义为**任务失败**，代码将被直接拒绝。请务必严格执行上述标准。\n","CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nSPlayer is a desktop music player built with **Electron + Vue 3 + TypeScript**. It uses Naive UI for components, Pinia for state management, and integrates with NetEase Cloud Music API, Last.fm, and Subsonic/Navidrome streaming services. Native Rust modules provide OS-level features (taskbar lyrics on Windows, MPRIS on Linux, SMTC on Windows, Discord RPC).\n\n## Commands\n\n```bash\npnpm dev                # Start dev environment (builds native modules + launches Electron)\npnpm build              # Full production build (typecheck + electron-vite build)\npnpm build:win          # Package for Windows\npnpm build:mac          # Package for macOS\npnpm build:linux        # Package for Linux\npnpm lint               # ESLint (--max-warnings=0, zero tolerance)\npnpm format             # Prettier\npnpm typecheck          # Full TypeScript check (node + web)\npnpm typecheck:node     # Main process + preload TypeScript check\npnpm typecheck:web      # Renderer process TypeScript check\n```\n\nSet `SKIP_NATIVE_BUILD=true` to skip Rust native module compilation during dev.\n\n## Architecture\n\n### Process Model (Electron)\n\n- **Main process** (`electron/main/`): Window management, IPC handlers, SQLite database, system tray, global shortcuts, Fastify API server, native module integration\n- **Preload** (`electron/preload/`): Context bridge exposing `window.api.store` and `window.logger` to renderer\n- **Renderer** (`src/`): Vue 3 SPA — the UI\n\n### IPC Layer\n\n18 IPC modules in `electron/main/ipc/` handle all main↔renderer communication: `ipc-cache`, `ipc-file`, `ipc-lyric`, `ipc-media`, `ipc-mpv`, `ipc-socket`, `ipc-store`, `ipc-taskbar`, `ipc-tray`, `ipc-window`, `ipc-system`, `ipc-shortcut`, `ipc-update`, `ipc-protocol`, `ipc-mac-statusbar`, `ipc-thumbar`, `ipc-renderer-log`.\n\n### Renderer Architecture (`src/`)\n\n- **Stores** (`stores/`): Pinia with persistedstate — `data` (songs/user), `status` (playback), `setting` (config), `local` (local music), `music`, `streaming`, `shortcut`\n- **Core** (`core/`): `audio-player/` (playback engine), `automix/`, `player/` (state), `resource/` (caching)\n- **API** (`api/`): Axios-based, organized by domain (song, playlist, login, streaming, lastfm)\n- **Composables** (`composables/`): `useInit`, `useSongMenu`, `useQualityControl`, etc.\n- **Components** (`components/`): AMLL (lyrics), Card, Common, Global, Layout, List, Menu, Modal, Player, Search, Setting, UI\n\n### Native Modules (`native/`)\n\nRust-based, built via `scripts/build-native.ts`:\n\n- `taskbar-lyric` — Windows taskbar lyrics display\n- `external-media-integration` — OS media integration\n- `smtc-for-splayer` — Windows System Media Transport Controls\n- `mpris-for-splayer` — Linux MPRIS support\n- `discord-rpc-for-splayer` — Discord Rich Presence\n- `ferrous-opencc-wasm` — Chinese character conversion (WASM)\n\n### Embedded Server\n\n`electron/server/` runs a Fastify instance (port 25884 default) wrapping NetEase Cloud Music API, proxied via `/api` in dev.\n\n## Path Aliases\n\n```\n@/       → src/\n@emi/    → native/external-media-integration\n@shared/ → src/types/shared\n@opencc/ → native/ferrous-opencc-wasm/pkg\n@native/ → native/\n```\n\n## Code Conventions\n\n- **Language**: Comments and commit messages in Chinese\n- **Vue**: Composition API with `<script setup>`, TypeScript throughout\n- **Auto-imports**: Vue, vue-router, @vueuse/core, and naive-ui composables are auto-imported (no explicit imports needed)\n- **Naive UI components**: Auto-resolved via `unplugin-vue-components`\n- **Unused variables**: Prefix with `_` to suppress lint warnings\n- **Prettier**: Double quotes, trailing commas, 2-space indent, 100 char width\n- **Workers**: Heavy computation (audio analysis) runs in worker threads (`electron/main/workers/`)\n- **TypeScript**: Composite project — `tsconfig.node.json` (main/preload/scripts) and `tsconfig.web.json` (renderer)\n"},"files":{"AGENTS.md":"# AI 开发助手行为准则\n\n## 项目技术栈与环境\n\n- **核心框架**: Vue 3 + Electron\n- **UI 组件库**: **Naive UI** (严禁混用其他 UI 库)\n- **包管理器**: **严格使用 `pnpm`** (严禁使用 npm/yarn)\n- **开发命令**: `pnpm dev` (预览代码)\n- **代码质量**: 每次任务结束前，必须自动运行 `pnpm lint` 并修复所有问题，确保 0 错误、0 警告后方可交付。\n- **提交之前**: 必须运行 `pnpm build` 和 `pnpm format` 并修复所有问题，确保 0 错误、0 警告后方可提交。\n\n## 代码风格与规范\n\n### 1. 注释规范\n\n- **语言**: 必须使用**中文**。\n- **格式**: 保持简洁，禁止长句、英文长文或带序号的注释。\n  - 正确: `// 监听主进程消息`\n  - 错误: `// 1. listen to main process`, `// this function handles ipc...`\n\n### 2. UI 组件使用 Naive UI\n\n- **原则**: 严禁重复造轮子。所有通用交互必须优先使用 Naive UI 组件。\n- **处理方式**: 如果未找到合适组件，必须先询问用户，禁止擅自手写原生 CSS/HTML 组件。\n  - 正确: 使用 `<n-button type=\"primary\">`, `<n-modal>`, `<n-message-provider>`\n  - 错误: 手写 `<div class=\"my-btn\">` 或引入 Element Plus 等其他库。\n\n### 3. 图标\n\n- **原则**: 优先复用项目 `src/assets/icons` 或现有图标方案。\n- **具体实现**: 严格遵循项目现有的图标组件用法。\n  - 正确: `<SvgIcon :name=\"isLikeAlbum ? 'Favorite' : 'FavoriteBorder'\" />`\n  - 错误: 擅自引入 `xicons` (除非用户明确允许) 或手写 SVG 代码。\n\n### 4. Electron 特性规范\n\n- **进程安全**: 明确代码运行环境（Main vs Renderer）。不要在渲染进程中直接调用不安全的 Node.js API，应优先使用 IPC 通信或 Preload 脚本暴露的 API。\n- **通信规范**: 涉及 IPC 通信时，保持频道命名清晰且常量化。\n\n### 5. 测试与清理\n\n- **临时文件**: 任务过程中生成的临时测试文件（如 `test_lrc.ts`），必须在任务结束前自动删除，严禁推送到代码库。\n\n## 交互与思维链\n\n### 1. 遇到困难多确认\n\n- **原则**: 禁止假设。当遇到不理解的概念（特别是 Electron 的通信逻辑或原生能力调用）时，**必须**暂停并向用户提问。\n  - 禁止: “我猜用户是想在渲染进程直接读文件...” -> 导致安全报错。\n  - 建议: “此处涉及文件系统操作，请确认是通过 IPC 调用主进程处理，还是使用现有的工具函数？”\n\n### 2. 复杂任务先规划\n\n- **文档驱动开发**: 遇到复杂功能（如窗口管理、系统托盘、复杂逻辑重构）时，**必须**先创建一个临时的 Markdown 文档（如 `name_of_task.md`）。\n- **流程**: 在文档中梳理思路 -> 展示给用户 -> 用户同意 -> 开始写代码。\n\n### 3. 复用优先DRY原则\n\n- **原则**: 在编写新功能前，强制检索项目现存代码。\n- **自检**: “项目中是否已经有类似的 IPC 封装或 UI 组件？”如果是，直接复用。\n\n### 4. 聊天方式\n\n- **原则**: 与用户保持中文对话，禁止使用英文或其他语言。\n- **具体实现**: 所有与用户的交互（包括问题、指令、代码展示等）都必须用中文进行。\n\n## 严格合规声明\n\n- **指令等级**: Critical。\n- **违规后果**: 违反以上任何一条规则将被定义为**任务失败**，代码将被直接拒绝。请务必严格执行上述标准。\n","CLAUDE.md":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nSPlayer is a desktop music player built with **Electron + Vue 3 + TypeScript**. It uses Naive UI for components, Pinia for state management, and integrates with NetEase Cloud Music API, Last.fm, and Subsonic/Navidrome streaming services. Native Rust modules provide OS-level features (taskbar lyrics on Windows, MPRIS on Linux, SMTC on Windows, Discord RPC).\n\n## Commands\n\n```bash\npnpm dev                # Start dev environment (builds native modules + launches Electron)\npnpm build              # Full production build (typecheck + electron-vite build)\npnpm build:win          # Package for Windows\npnpm build:mac          # Package for macOS\npnpm build:linux        # Package for Linux\npnpm lint               # ESLint (--max-warnings=0, zero tolerance)\npnpm format             # Prettier\npnpm typecheck          # Full TypeScript check (node + web)\npnpm typecheck:node     # Main process + preload TypeScript check\npnpm typecheck:web      # Renderer process TypeScript check\n```\n\nSet `SKIP_NATIVE_BUILD=true` to skip Rust native module compilation during dev.\n\n## Architecture\n\n### Process Model (Electron)\n\n- **Main process** (`electron/main/`): Window management, IPC handlers, SQLite database, system tray, global shortcuts, Fastify API server, native module integration\n- **Preload** (`electron/preload/`): Context bridge exposing `window.api.store` and `window.logger` to renderer\n- **Renderer** (`src/`): Vue 3 SPA — the UI\n\n### IPC Layer\n\n18 IPC modules in `electron/main/ipc/` handle all main↔renderer communication: `ipc-cache`, `ipc-file`, `ipc-lyric`, `ipc-media`, `ipc-mpv`, `ipc-socket`, `ipc-store`, `ipc-taskbar`, `ipc-tray`, `ipc-window`, `ipc-system`, `ipc-shortcut`, `ipc-update`, `ipc-protocol`, `ipc-mac-statusbar`, `ipc-thumbar`, `ipc-renderer-log`.\n\n### Renderer Architecture (`src/`)\n\n- **Stores** (`stores/`): Pinia with persistedstate — `data` (songs/user), `status` (playback), `setting` (config), `local` (local music), `music`, `streaming`, `shortcut`\n- **Core** (`core/`): `audio-player/` (playback engine), `automix/`, `player/` (state), `resource/` (caching)\n- **API** (`api/`): Axios-based, organized by domain (song, playlist, login, streaming, lastfm)\n- **Composables** (`composables/`): `useInit`, `useSongMenu`, `useQualityControl`, etc.\n- **Components** (`components/`): AMLL (lyrics), Card, Common, Global, Layout, List, Menu, Modal, Player, Search, Setting, UI\n\n### Native Modules (`native/`)\n\nRust-based, built via `scripts/build-native.ts`:\n\n- `taskbar-lyric` — Windows taskbar lyrics display\n- `external-media-integration` — OS media integration\n- `smtc-for-splayer` — Windows System Media Transport Controls\n- `mpris-for-splayer` — Linux MPRIS support\n- `discord-rpc-for-splayer` — Discord Rich Presence\n- `ferrous-opencc-wasm` — Chinese character conversion (WASM)\n\n### Embedded Server\n\n`electron/server/` runs a Fastify instance (port 25884 default) wrapping NetEase Cloud Music API, proxied via `/api` in dev.\n\n## Path Aliases\n\n```\n@/       → src/\n@emi/    → native/external-media-integration\n@shared/ → src/types/shared\n@opencc/ → native/ferrous-opencc-wasm/pkg\n@native/ → native/\n```\n\n## Code Conventions\n\n- **Language**: Comments and commit messages in Chinese\n- **Vue**: Composition API with `<script setup>`, TypeScript throughout\n- **Auto-imports**: Vue, vue-router, @vueuse/core, and naive-ui composables are auto-imported (no explicit imports needed)\n- **Naive UI components**: Auto-resolved via `unplugin-vue-components`\n- **Unused variables**: Prefix with `_` to suppress lint warnings\n- **Prettier**: Double quotes, trailing commas, 2-space indent, 100 char width\n- **Workers**: Heavy computation (audio analysis) runs in worker threads (`electron/main/workers/`)\n- **TypeScript**: Composite project — `tsconfig.node.json` (main/preload/scripts) and `tsconfig.web.json` (renderer)\n"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# AI 开发助手行为准则\n\n## 项目技术栈与环境\n\n- **核心框架**: Vue 3 + Electron\n- **UI 组件库**: **Naive UI** (严禁混用其他 UI 库)\n- **包管理器**: **严格使用 `pnpm`** (严禁使用 npm/yarn)\n- **开发命令**: `pnpm dev` (预览代码)\n- **代码质量**: 每次任务结束前，必须自动运行 `pnpm lint` 并修复所有问题，确保 0 错误、0 警告后方可交付。\n- **提交之前**: 必须运行 `pnpm build` 和 `pnpm format` 并修复所有问题，确保 0 错误、0 警告后方可提交。\n\n## 代码风格与规范\n\n### 1. 注释规范\n\n- **语言**: 必须使用**中文**。\n- **格式**: 保持简洁，禁止长句、英文长文或带序号的注释。\n  - 正确: `// 监听主进程消息`\n  - 错误: `// 1. listen to main process`, `// this function handles ipc...`\n\n### 2. UI 组件使用 Naive UI\n\n- **原则**: 严禁重复造轮子。所有通用交互必须优先使用 Naive UI 组件。\n- **处理方式**: 如果未找到合适组件，必须先询问用户，禁止擅自手写原生 CSS/HTML 组件。\n  - 正确: 使用 `<n-button type=\"primary\">`, `<n-modal>`, `<n-message-provider>`\n  - 错误: 手写 `<div class=\"my-btn\">` 或引入 Element Plus 等其他库。\n\n### 3. 图标\n\n- **原则**: 优先复用项目 `src/assets/icons` 或现有图标方案。\n- **具体实现**: 严格遵循项目现有的图标组件用法。\n  - 正确: `<SvgIcon :name=\"isLikeAlbum ? 'Favorite' : 'FavoriteBorder'\" />`\n  - 错误: 擅自引入 `xicons` (除非用户明确允许) 或手写 SVG 代码。\n\n### 4. Electron 特性规范\n\n- **进程安全**: 明确代码运行环境（Main vs Renderer）。不要在渲染进程中直接调用不安全的 Node.js API，应优先使用 IPC 通信或 Preload 脚本暴露的 API。\n- **通信规范**: 涉及 IPC 通信时，保持频道命名清晰且常量化。\n\n### 5. 测试与清理\n\n- **临时文件**: 任务过程中生成的临时测试文件（如 `test_lrc.ts`），必须在任务结束前自动删除，严禁推送到代码库。\n\n## 交互与思维链\n\n### 1. 遇到困难多确认\n\n- **原则**: 禁止假设。当遇到不理解的概念（特别是 Electron 的通信逻辑或原生能力调用）时，**必须**暂停并向用户提问。\n  - 禁止: “我猜用户是想在渲染进程直接读文件...” -> 导致安全报错。\n  - 建议: “此处涉及文件系统操作，请确认是通过 IPC 调用主进程处理，还是使用现有的工具函数？”\n\n### 2. 复杂任务先规划\n\n- **文档驱动开发**: 遇到复杂功能（如窗口管理、系统托盘、复杂逻辑重构）时，**必须**先创建一个临时的 Markdown 文档（如 `name_of_task.md`）。\n- **流程**: 在文档中梳理思路 -> 展示给用户 -> 用户同意 -> 开始写代码。\n\n### 3. 复用优先DRY原则\n\n- **原则**: 在编写新功能前，强制检索项目现存代码。\n- **自检**: “项目中是否已经有类似的 IPC 封装或 UI 组件？”如果是，直接复用。\n\n### 4. 聊天方式\n\n- **原则**: 与用户保持中文对话，禁止使用英文或其他语言。\n- **具体实现**: 所有与用户的交互（包括问题、指令、代码展示等）都必须用中文进行。\n\n## 严格合规声明\n\n- **指令等级**: Critical。\n- **违规后果**: 违反以上任何一条规则将被定义为**任务失败**，代码将被直接拒绝。请务必严格执行上述标准。\n","category":"root","tokens":454},{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Project Overview\n\nSPlayer is a desktop music player built with **Electron + Vue 3 + TypeScript**. It uses Naive UI for components, Pinia for state management, and integrates with NetEase Cloud Music API, Last.fm, and Subsonic/Navidrome streaming services. Native Rust modules provide OS-level features (taskbar lyrics on Windows, MPRIS on Linux, SMTC on Windows, Discord RPC).\n\n## Commands\n\n```bash\npnpm dev                # Start dev environment (builds native modules + launches Electron)\npnpm build              # Full production build (typecheck + electron-vite build)\npnpm build:win          # Package for Windows\npnpm build:mac          # Package for macOS\npnpm build:linux        # Package for Linux\npnpm lint               # ESLint (--max-warnings=0, zero tolerance)\npnpm format             # Prettier\npnpm typecheck          # Full TypeScript check (node + web)\npnpm typecheck:node     # Main process + preload TypeScript check\npnpm typecheck:web      # Renderer process TypeScript check\n```\n\nSet `SKIP_NATIVE_BUILD=true` to skip Rust native module compilation during dev.\n\n## Architecture\n\n### Process Model (Electron)\n\n- **Main process** (`electron/main/`): Window management, IPC handlers, SQLite database, system tray, global shortcuts, Fastify API server, native module integration\n- **Preload** (`electron/preload/`): Context bridge exposing `window.api.store` and `window.logger` to renderer\n- **Renderer** (`src/`): Vue 3 SPA — the UI\n\n### IPC Layer\n\n18 IPC modules in `electron/main/ipc/` handle all main↔renderer communication: `ipc-cache`, `ipc-file`, `ipc-lyric`, `ipc-media`, `ipc-mpv`, `ipc-socket`, `ipc-store`, `ipc-taskbar`, `ipc-tray`, `ipc-window`, `ipc-system`, `ipc-shortcut`, `ipc-update`, `ipc-protocol`, `ipc-mac-statusbar`, `ipc-thumbar`, `ipc-renderer-log`.\n\n### Renderer Architecture (`src/`)\n\n- **Stores** (`stores/`): Pinia with persistedstate — `data` (songs/user), `status` (playback), `setting` (config), `local` (local music), `music`, `streaming`, `shortcut`\n- **Core** (`core/`): `audio-player/` (playback engine), `automix/`, `player/` (state), `resource/` (caching)\n- **API** (`api/`): Axios-based, organized by domain (song, playlist, login, streaming, lastfm)\n- **Composables** (`composables/`): `useInit`, `useSongMenu`, `useQualityControl`, etc.\n- **Components** (`components/`): AMLL (lyrics), Card, Common, Global, Layout, List, Menu, Modal, Player, Search, Setting, UI\n\n### Native Modules (`native/`)\n\nRust-based, built via `scripts/build-native.ts`:\n\n- `taskbar-lyric` — Windows taskbar lyrics display\n- `external-media-integration` — OS media integration\n- `smtc-for-splayer` — Windows System Media Transport Controls\n- `mpris-for-splayer` — Linux MPRIS support\n- `discord-rpc-for-splayer` — Discord Rich Presence\n- `ferrous-opencc-wasm` — Chinese character conversion (WASM)\n\n### Embedded Server\n\n`electron/server/` runs a Fastify instance (port 25884 default) wrapping NetEase Cloud Music API, proxied via `/api` in dev.\n\n## Path Aliases\n\n```\n@/       → src/\n@emi/    → native/external-media-integration\n@shared/ → src/types/shared\n@opencc/ → native/ferrous-opencc-wasm/pkg\n@native/ → native/\n```\n\n## Code Conventions\n\n- **Language**: Comments and commit messages in Chinese\n- **Vue**: Composition API with `<script setup>`, TypeScript throughout\n- **Auto-imports**: Vue, vue-router, @vueuse/core, and naive-ui composables are auto-imported (no explicit imports needed)\n- **Naive UI components**: Auto-resolved via `unplugin-vue-components`\n- **Unused variables**: Prefix with `_` to suppress lint warnings\n- **Prettier**: Double quotes, trailing commas, 2-space indent, 100 char width\n- **Workers**: Heavy computation (audio analysis) runs in worker threads (`electron/main/workers/`)\n- **TypeScript**: Composite project — `tsconfig.node.json` (main/preload/scripts) and `tsconfig.web.json` (renderer)\n","category":"root","tokens":995}]}