{"owner":"zhanglun","repo":"lettura","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["CLAUDE.md","AGENTS.md"],"skills":{"CLAUDE.md":"# Claude Code 项目配置\n\n## 提交规范\n\n- 使用中文 Conventional Commit 格式：`type(scope): 描述`\n- **不要**在提交信息中添加 `Co-Authored-By` 行\n- 每个主题独立提交，不要合并不相关的变更\n\n## 注意事项\n\n- 不要提交 `.sisyphus/run-continuation/*.json`\n- 生产 SQLite 在 `~/.lettura/lettura.db`，不要执行清库或迁移重建\n- 不要恢复 DnD 订阅树\n- 用中文沟通\n","AGENTS.md":"# AGENTS.md\n\nCompact, repo-specific notes for future OpenCode sessions. Trust executable\nconfig over prose when something conflicts.\n\n## Project shape\n\n- Lettura is a Tauri v2 desktop feed reader: React/Vite frontend plus Rust\n  backend in the `apps/desktop/src-tauri` Cargo workspace member.\n- The backend has two communication paths. `src/helpers/dataAgent.ts` mixes\n  Tauri IPC (`invoke` from `@tauri-apps/api/core`, implemented in\n  `src-tauri/src/cmd.rs`) with localhost HTTP calls (`src/helpers/request.ts`,\n  implemented under `src-tauri/src/server/handlers/`). Check the existing path\n  before adding a new API.\n- Main frontend entrypoints: `src/index.tsx` defines routes and waits for\n  `get_server_port` inside Tauri; `src/App.tsx` is the app shell and Tauri event\n  listener; routes are named in `src/config.ts`.\n- Main Rust entrypoint: `src-tauri/src/main.rs` calls `lettura_lib::run()`\n  defined in `src-tauri/src/lib.rs`, which loads config, opens SQLite, runs\n  embedded Diesel migrations, starts the Actix server, registers Tauri\n  commands, tray/menu handlers, and the scheduler.\n- State is one Zustand store (`useBearStore`) in `src/stores/index.ts`, composed\n  from feed, article, user config, and podcast slices.\n\n## Commands\n\n- Install: `pnpm install` (`.npmrc` sets `auto-install-peers=true`).\n- Frontend dev only: `pnpm dev` (Vite on fixed port 3000).\n- Full desktop dev: `pnpm tauri dev` (runs `pnpm dev` via\n  `src-tauri/tauri.conf.json`).\n- Frontend build/typecheck: `pnpm build` (`tsc && vite build`); Vite outputs to\n  `build/`, not `dist/`.\n- Desktop build: `pnpm tauri build`.\n- Frontend tests: `pnpm test`; focused test: `pnpm test path/to/file.test.ts`.\n- Rust tests: run `cargo test` from repo root (workspace member is\n  `src-tauri`).\n- Lint/format use Rome 11 config, not ESLint/Prettier:\n  `npx rome check src/` and `npx rome format src/`.\n\n## Runtime and storage gotchas\n\n- Vite uses `server.strictPort = true` on port 3000. The Actix API server uses\n  the configured app port, then falls back to 8000-9000 if occupied.\n- Outside Tauri, `src/index.tsx` defaults `localStorage.port` to `3456`; inside\n  Tauri it calls `invoke(\"get_server_port\")` before rendering.\n- Production SQLite DB is `~/.lettura/lettura.db`. With `LETTURA_ENV` set, Rust\n  reads `DATABASE_URL` from env via `dotenv`.\n- User config is TOML (`~/.lettura/lettura.toml` in normal runs; local file in\n  dev mode), not part of the SQLite schema.\n- Podcast data is separate browser-side Dexie/IndexedDB in\n  `src/helpers/podcastDB.ts`.\n- Closing the main window hides it to the system tray instead of quitting.\n\n## Testing notes\n\n- Vitest uses `vitest.config.ts`: globals enabled, jsdom environment, setup file\n  `src/__tests__/setup.ts`.\n- The setup file mocks `localStorage`, `@tauri-apps/api/core` `invoke`,\n  `@tauri-apps/api/event`, `@tauri-apps/api/webviewWindow`,\n  `@tauri-apps/plugin-shell`, `@tauri-apps/plugin-fs`,\n  `@tauri-apps/plugin-dialog`, and global `fetch`; keep that in mind when\n  tests pass without a live Tauri backend.\n- Frontend tests live mainly under `src/stores/__tests__/` and\n  `src/helpers/__tests__/`. Rust tests exist in files such as\n  `src-tauri/src/cmd.rs` and `src-tauri/src/core/scheduler.rs`.\n\n## Styling, PWA, and i18n\n\n- Tailwind v3 + Radix UI theme tokens are configured in `tailwind.config.js`;\n  dark mode is class/data-attribute based and the app toggles `body.dark-theme`.\n- shadcn-style components live in `src/components/ui/`; prefer the existing\n  `cn` helper in `src/helpers/cn.tsx` when composing classes there.\n- PWA is enabled with `vite-plugin-pwa` `injectManifest`; service worker source\n  is `src/worker/sw.ts`.\n- i18n is initialized in `src/i18n.ts`; locale files are\n  `src/locales/en.json` and `src/locales/zh.json`.\n\n## Rust backend notes\n\n- Diesel schema output is `src-tauri/src/schema.rs`; migrations live in\n  `src-tauri/migrations/` and are embedded by `embed_migrations!`.\n- Rust modules are split by concern: `core/` for config/menu/scheduler/tray,\n  `feed/` for article/channel/folder/OPML logic, and `server/` for Actix routes.\n  Tray and menu are built in `setup()` via `TrayIconBuilder`/`MenuBuilder`.\n- Tauri v2 uses a plugin architecture: shell, fs, dialog, http, process,\n  updater, log, and single-instance are separate plugins (both Rust crates and\n  npm packages). Permissions are declared in\n  `src-tauri/capabilities/default.json` instead of v1's allowlist.\n- `LETTURA_ENV` enables debug logging and changes config/database behavior; do\n  not assume dev and production paths are identical.\n\n## CI and release\n\n- `.github/workflows/release.yml` runs on pushes to `release`, creates a draft\n  release, then builds macOS, Ubuntu, and Windows artifacts with Tauri.\n- `.github/workflows/deploy-doc.yml` runs on `master` and deploys the Astro docs\n  app in `docs/` to GitHub Pages.\n- Keep versions synchronized across `package.json`,\n  `src-tauri/tauri.conf.json`, and `src-tauri/Cargo.toml`.\n"},"files":{"CLAUDE.md":"# Claude Code 项目配置\n\n## 提交规范\n\n- 使用中文 Conventional Commit 格式：`type(scope): 描述`\n- **不要**在提交信息中添加 `Co-Authored-By` 行\n- 每个主题独立提交，不要合并不相关的变更\n\n## 注意事项\n\n- 不要提交 `.sisyphus/run-continuation/*.json`\n- 生产 SQLite 在 `~/.lettura/lettura.db`，不要执行清库或迁移重建\n- 不要恢复 DnD 订阅树\n- 用中文沟通\n","AGENTS.md":"# AGENTS.md\n\nCompact, repo-specific notes for future OpenCode sessions. Trust executable\nconfig over prose when something conflicts.\n\n## Project shape\n\n- Lettura is a Tauri v2 desktop feed reader: React/Vite frontend plus Rust\n  backend in the `apps/desktop/src-tauri` Cargo workspace member.\n- The backend has two communication paths. `src/helpers/dataAgent.ts` mixes\n  Tauri IPC (`invoke` from `@tauri-apps/api/core`, implemented in\n  `src-tauri/src/cmd.rs`) with localhost HTTP calls (`src/helpers/request.ts`,\n  implemented under `src-tauri/src/server/handlers/`). Check the existing path\n  before adding a new API.\n- Main frontend entrypoints: `src/index.tsx` defines routes and waits for\n  `get_server_port` inside Tauri; `src/App.tsx` is the app shell and Tauri event\n  listener; routes are named in `src/config.ts`.\n- Main Rust entrypoint: `src-tauri/src/main.rs` calls `lettura_lib::run()`\n  defined in `src-tauri/src/lib.rs`, which loads config, opens SQLite, runs\n  embedded Diesel migrations, starts the Actix server, registers Tauri\n  commands, tray/menu handlers, and the scheduler.\n- State is one Zustand store (`useBearStore`) in `src/stores/index.ts`, composed\n  from feed, article, user config, and podcast slices.\n\n## Commands\n\n- Install: `pnpm install` (`.npmrc` sets `auto-install-peers=true`).\n- Frontend dev only: `pnpm dev` (Vite on fixed port 3000).\n- Full desktop dev: `pnpm tauri dev` (runs `pnpm dev` via\n  `src-tauri/tauri.conf.json`).\n- Frontend build/typecheck: `pnpm build` (`tsc && vite build`); Vite outputs to\n  `build/`, not `dist/`.\n- Desktop build: `pnpm tauri build`.\n- Frontend tests: `pnpm test`; focused test: `pnpm test path/to/file.test.ts`.\n- Rust tests: run `cargo test` from repo root (workspace member is\n  `src-tauri`).\n- Lint/format use Rome 11 config, not ESLint/Prettier:\n  `npx rome check src/` and `npx rome format src/`.\n\n## Runtime and storage gotchas\n\n- Vite uses `server.strictPort = true` on port 3000. The Actix API server uses\n  the configured app port, then falls back to 8000-9000 if occupied.\n- Outside Tauri, `src/index.tsx` defaults `localStorage.port` to `3456`; inside\n  Tauri it calls `invoke(\"get_server_port\")` before rendering.\n- Production SQLite DB is `~/.lettura/lettura.db`. With `LETTURA_ENV` set, Rust\n  reads `DATABASE_URL` from env via `dotenv`.\n- User config is TOML (`~/.lettura/lettura.toml` in normal runs; local file in\n  dev mode), not part of the SQLite schema.\n- Podcast data is separate browser-side Dexie/IndexedDB in\n  `src/helpers/podcastDB.ts`.\n- Closing the main window hides it to the system tray instead of quitting.\n\n## Testing notes\n\n- Vitest uses `vitest.config.ts`: globals enabled, jsdom environment, setup file\n  `src/__tests__/setup.ts`.\n- The setup file mocks `localStorage`, `@tauri-apps/api/core` `invoke`,\n  `@tauri-apps/api/event`, `@tauri-apps/api/webviewWindow`,\n  `@tauri-apps/plugin-shell`, `@tauri-apps/plugin-fs`,\n  `@tauri-apps/plugin-dialog`, and global `fetch`; keep that in mind when\n  tests pass without a live Tauri backend.\n- Frontend tests live mainly under `src/stores/__tests__/` and\n  `src/helpers/__tests__/`. Rust tests exist in files such as\n  `src-tauri/src/cmd.rs` and `src-tauri/src/core/scheduler.rs`.\n\n## Styling, PWA, and i18n\n\n- Tailwind v3 + Radix UI theme tokens are configured in `tailwind.config.js`;\n  dark mode is class/data-attribute based and the app toggles `body.dark-theme`.\n- shadcn-style components live in `src/components/ui/`; prefer the existing\n  `cn` helper in `src/helpers/cn.tsx` when composing classes there.\n- PWA is enabled with `vite-plugin-pwa` `injectManifest`; service worker source\n  is `src/worker/sw.ts`.\n- i18n is initialized in `src/i18n.ts`; locale files are\n  `src/locales/en.json` and `src/locales/zh.json`.\n\n## Rust backend notes\n\n- Diesel schema output is `src-tauri/src/schema.rs`; migrations live in\n  `src-tauri/migrations/` and are embedded by `embed_migrations!`.\n- Rust modules are split by concern: `core/` for config/menu/scheduler/tray,\n  `feed/` for article/channel/folder/OPML logic, and `server/` for Actix routes.\n  Tray and menu are built in `setup()` via `TrayIconBuilder`/`MenuBuilder`.\n- Tauri v2 uses a plugin architecture: shell, fs, dialog, http, process,\n  updater, log, and single-instance are separate plugins (both Rust crates and\n  npm packages). Permissions are declared in\n  `src-tauri/capabilities/default.json` instead of v1's allowlist.\n- `LETTURA_ENV` enables debug logging and changes config/database behavior; do\n  not assume dev and production paths are identical.\n\n## CI and release\n\n- `.github/workflows/release.yml` runs on pushes to `release`, creates a draft\n  release, then builds macOS, Ubuntu, and Windows artifacts with Tauri.\n- `.github/workflows/deploy-doc.yml` runs on `master` and deploys the Astro docs\n  app in `docs/` to GitHub Pages.\n- Keep versions synchronized across `package.json`,\n  `src-tauri/tauri.conf.json`, and `src-tauri/Cargo.toml`.\n"},"items":[{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"# Claude Code 项目配置\n\n## 提交规范\n\n- 使用中文 Conventional Commit 格式：`type(scope): 描述`\n- **不要**在提交信息中添加 `Co-Authored-By` 行\n- 每个主题独立提交，不要合并不相关的变更\n\n## 注意事项\n\n- 不要提交 `.sisyphus/run-continuation/*.json`\n- 生产 SQLite 在 `~/.lettura/lettura.db`，不要执行清库或迁移重建\n- 不要恢复 DnD 订阅树\n- 用中文沟通\n","category":"root","tokens":66},{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# AGENTS.md\n\nCompact, repo-specific notes for future OpenCode sessions. Trust executable\nconfig over prose when something conflicts.\n\n## Project shape\n\n- Lettura is a Tauri v2 desktop feed reader: React/Vite frontend plus Rust\n  backend in the `apps/desktop/src-tauri` Cargo workspace member.\n- The backend has two communication paths. `src/helpers/dataAgent.ts` mixes\n  Tauri IPC (`invoke` from `@tauri-apps/api/core`, implemented in\n  `src-tauri/src/cmd.rs`) with localhost HTTP calls (`src/helpers/request.ts`,\n  implemented under `src-tauri/src/server/handlers/`). Check the existing path\n  before adding a new API.\n- Main frontend entrypoints: `src/index.tsx` defines routes and waits for\n  `get_server_port` inside Tauri; `src/App.tsx` is the app shell and Tauri event\n  listener; routes are named in `src/config.ts`.\n- Main Rust entrypoint: `src-tauri/src/main.rs` calls `lettura_lib::run()`\n  defined in `src-tauri/src/lib.rs`, which loads config, opens SQLite, runs\n  embedded Diesel migrations, starts the Actix server, registers Tauri\n  commands, tray/menu handlers, and the scheduler.\n- State is one Zustand store (`useBearStore`) in `src/stores/index.ts`, composed\n  from feed, article, user config, and podcast slices.\n\n## Commands\n\n- Install: `pnpm install` (`.npmrc` sets `auto-install-peers=true`).\n- Frontend dev only: `pnpm dev` (Vite on fixed port 3000).\n- Full desktop dev: `pnpm tauri dev` (runs `pnpm dev` via\n  `src-tauri/tauri.conf.json`).\n- Frontend build/typecheck: `pnpm build` (`tsc && vite build`); Vite outputs to\n  `build/`, not `dist/`.\n- Desktop build: `pnpm tauri build`.\n- Frontend tests: `pnpm test`; focused test: `pnpm test path/to/file.test.ts`.\n- Rust tests: run `cargo test` from repo root (workspace member is\n  `src-tauri`).\n- Lint/format use Rome 11 config, not ESLint/Prettier:\n  `npx rome check src/` and `npx rome format src/`.\n\n## Runtime and storage gotchas\n\n- Vite uses `server.strictPort = true` on port 3000. The Actix API server uses\n  the configured app port, then falls back to 8000-9000 if occupied.\n- Outside Tauri, `src/index.tsx` defaults `localStorage.port` to `3456`; inside\n  Tauri it calls `invoke(\"get_server_port\")` before rendering.\n- Production SQLite DB is `~/.lettura/lettura.db`. With `LETTURA_ENV` set, Rust\n  reads `DATABASE_URL` from env via `dotenv`.\n- User config is TOML (`~/.lettura/lettura.toml` in normal runs; local file in\n  dev mode), not part of the SQLite schema.\n- Podcast data is separate browser-side Dexie/IndexedDB in\n  `src/helpers/podcastDB.ts`.\n- Closing the main window hides it to the system tray instead of quitting.\n\n## Testing notes\n\n- Vitest uses `vitest.config.ts`: globals enabled, jsdom environment, setup file\n  `src/__tests__/setup.ts`.\n- The setup file mocks `localStorage`, `@tauri-apps/api/core` `invoke`,\n  `@tauri-apps/api/event`, `@tauri-apps/api/webviewWindow`,\n  `@tauri-apps/plugin-shell`, `@tauri-apps/plugin-fs`,\n  `@tauri-apps/plugin-dialog`, and global `fetch`; keep that in mind when\n  tests pass without a live Tauri backend.\n- Frontend tests live mainly under `src/stores/__tests__/` and\n  `src/helpers/__tests__/`. Rust tests exist in files such as\n  `src-tauri/src/cmd.rs` and `src-tauri/src/core/scheduler.rs`.\n\n## Styling, PWA, and i18n\n\n- Tailwind v3 + Radix UI theme tokens are configured in `tailwind.config.js`;\n  dark mode is class/data-attribute based and the app toggles `body.dark-theme`.\n- shadcn-style components live in `src/components/ui/`; prefer the existing\n  `cn` helper in `src/helpers/cn.tsx` when composing classes there.\n- PWA is enabled with `vite-plugin-pwa` `injectManifest`; service worker source\n  is `src/worker/sw.ts`.\n- i18n is initialized in `src/i18n.ts`; locale files are\n  `src/locales/en.json` and `src/locales/zh.json`.\n\n## Rust backend notes\n\n- Diesel schema output is `src-tauri/src/schema.rs`; migrations live in\n  `src-tauri/migrations/` and are embedded by `embed_migrations!`.\n- Rust modules are split by concern: `core/` for config/menu/scheduler/tray,\n  `feed/` for article/channel/folder/OPML logic, and `server/` for Actix routes.\n  Tray and menu are built in `setup()` via `TrayIconBuilder`/`MenuBuilder`.\n- Tauri v2 uses a plugin architecture: shell, fs, dialog, http, process,\n  updater, log, and single-instance are separate plugins (both Rust crates and\n  npm packages). Permissions are declared in\n  `src-tauri/capabilities/default.json` instead of v1's allowlist.\n- `LETTURA_ENV` enables debug logging and changes config/database behavior; do\n  not assume dev and production paths are identical.\n\n## CI and release\n\n- `.github/workflows/release.yml` runs on pushes to `release`, creates a draft\n  release, then builds macOS, Ubuntu, and Windows artifacts with Tauri.\n- `.github/workflows/deploy-doc.yml` runs on `master` and deploys the Astro docs\n  app in `docs/` to GitHub Pages.\n- Keep versions synchronized across `package.json`,\n  `src-tauri/tauri.conf.json`, and `src-tauri/Cargo.toml`.\n","category":"root","tokens":1242}]}