{"owner":"rowboatlabs","repo":"rowboat","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["CLAUDE.md"],"skills":{"CLAUDE.md":"# CLAUDE.md - AI Coding Agent Context\n\nThis file provides context for AI coding agents working on the Rowboat monorepo.\n\n## Quick Reference Commands\n\n```bash\n# Electron App (apps/x)\ncd apps/x && pnpm install          # Install dependencies\ncd apps/x && npm run deps          # Build workspace packages (shared → core → preload)\ncd apps/x && npm run dev           # Development mode (builds deps, runs app)\ncd apps/x && npm run lint          # Lint check\ncd apps/x/apps/main && npm run package   # Production build (.app)\ncd apps/x/apps/main && npm run make      # Create DMG distributable\n```\n\n## Monorepo Structure\n\n```\nrowboat/\n├── apps/\n│   ├── x/                 # Electron desktop app (focus of this doc)\n│   ├── rowboat/           # Next.js web dashboard\n│   ├── rowboatx/          # Next.js frontend\n│   ├── cli/               # CLI tool\n│   ├── python-sdk/        # Python SDK\n│   └── docs/              # Documentation site\n├── CLAUDE.md              # This file\n└── README.md              # User-facing readme\n```\n\n## Electron App Architecture (`apps/x`)\n\nThe Electron app is a **nested pnpm workspace** with its own package management.\n\n```\napps/x/\n├── package.json           # Workspace root, dev scripts\n├── pnpm-workspace.yaml    # Defines workspace packages\n├── pnpm-lock.yaml         # Lockfile\n├── apps/\n│   ├── main/              # Electron main process\n│   │   ├── src/           # Main process source\n│   │   ├── forge.config.cjs   # Electron Forge config\n│   │   └── bundle.mjs     # esbuild bundler\n│   ├── renderer/          # React UI (Vite)\n│   │   ├── src/           # React components\n│   │   └── vite.config.ts\n│   └── preload/           # Electron preload scripts\n│       └── src/\n└── packages/\n    ├── shared/            # @x/shared - Types, utilities, validators\n    └── core/              # @x/core - Business logic, AI, OAuth, MCP\n```\n\n### Build Order (Dependencies)\n\n```\nshared (no deps)\n   ↓\ncore (depends on shared)\n   ↓\npreload (depends on shared)\n   ↓\nrenderer (depends on shared)\nmain (depends on shared, core)\n```\n\n**The `npm run deps` command builds:** shared → core → preload\n\n### Key Entry Points\n\n| Component | Entry | Output |\n|-----------|-------|--------|\n| main | `apps/main/src/main.ts` | `.package/dist/main.cjs` |\n| renderer | `apps/renderer/src/main.tsx` | `apps/renderer/dist/` |\n| preload | `apps/preload/src/preload.ts` | `apps/preload/dist/preload.js` |\n\n## Build System\n\n- **Package manager:** pnpm (required for `workspace:*` protocol)\n- **Main bundler:** esbuild (bundles to single CommonJS file)\n- **Renderer bundler:** Vite\n- **Packaging:** Electron Forge\n- **TypeScript:** ES2022 target\n\n### Why esbuild bundling?\n\npnpm uses symlinks for workspace packages. Electron Forge's dependency walker can't follow these symlinks. esbuild bundles everything into a single file, eliminating the need for node_modules in the packaged app.\n\n## Key Files Reference\n\n| Purpose | File |\n|---------|------|\n| Electron main entry | `apps/x/apps/main/src/main.ts` |\n| React app entry | `apps/x/apps/renderer/src/main.tsx` |\n| Forge config (packaging) | `apps/x/apps/main/forge.config.cjs` |\n| Main process bundler | `apps/x/apps/main/bundle.mjs` |\n| Vite config | `apps/x/apps/renderer/vite.config.ts` |\n| Shared types | `apps/x/packages/shared/src/` |\n| Core business logic | `apps/x/packages/core/src/` |\n| Workspace config | `apps/x/pnpm-workspace.yaml` |\n| Root scripts | `apps/x/package.json` |\n\n## Feature Deep-Dives\n\nLong-form docs for specific features. Read the relevant file before making changes in that area — it has the full product flow, technical flows, and (where applicable) a catalog of the LLM prompts involved with exact file:line pointers.\n\n| Feature | Doc |\n|---------|-----|\n| Live Notes — single `live:` frontmatter block (one objective + optional cron / windows / eventMatchCriteria) that turns a note into a self-updating artifact, panel UI, Copilot skill, prompts catalog | `apps/x/LIVE_NOTE.md` |\n| Calls (video mode) — one hands-free call engine with four presets (voice / video / share screen / practice coaching), device-derived surfaces (full-screen ⇄ floating popout), frame pipeline, prompts catalog | `apps/x/VIDEO_MODE.md` |\n| Analytics — PostHog event catalog, person properties, use-case taxonomy, how to add a new event | `apps/x/ANALYTICS.md` |\n| Turn/session runtime — event-sourced storage, reference model, the `npm run inspect` debugger | `apps/x/packages/core/docs/turn-runtime-design.md`, `session-design.md` |\n\n## Common Tasks\n\n### LLM configuration\n- Config file: `~/.rowboat/config/models.json` (v2; v1 files are migrated on boot by `core/models/migrate.ts`)\n- Schema: `{ version: 2, providers: { <id>: { flavor, apiKey?, baseURL?, … } }, assistantModel?: { provider, model, effort? }, taskModels?: { knowledgeGraph?, meetingNotes?, liveNoteAgent?, autoPermissionDecision?, chatTitle?, backgroundTask?, subagent? }, deferBackgroundTasks? }`\n- Providers carry credentials only (no model fields) — model lists are always fetched live via the unified catalog (`core/models/catalog.ts`, `models:list` IPC). Model choices live in `assistantModel` (the one primary) and `taskModels` (optional overrides that otherwise inherit the assistant). Every choice is a `{ provider, model, effort? }` pair — `effort` is the reasoning effort picked with the model (`low`/`medium`/`high`; missing, `null`, or `\"auto\"` all mean Auto = provider default).\n- Models catalog cache: `~/.rowboat/config/models.dev.json` (OpenAI/Anthropic/Google only)\n\n### Add a new shared type\n1. Edit `apps/x/packages/shared/src/`\n2. Run `cd apps/x && npm run deps` to rebuild\n\n### Modify main process\n1. Edit `apps/x/apps/main/src/`\n2. Restart dev server (main doesn't hot-reload)\n\n### Modify renderer (React UI)\n1. Edit `apps/x/apps/renderer/src/`\n2. Changes hot-reload automatically in dev mode\n\n### Add a new dependency to main\n1. `cd apps/x/apps/main && pnpm add <package>`\n2. Import in source - esbuild will bundle it\n\n### Verify compilation\n```bash\ncd apps/x && npm run deps && npm run lint\ncd apps/x && npm run typecheck   # dev tsconfigs — the only gate that typechecks *.test.ts\n```\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|------------|\n| Desktop | Electron 39.x |\n| UI | React 19, Vite 7 |\n| Styling | TailwindCSS, Radix UI |\n| State | React hooks |\n| AI | Vercel AI SDK, OpenAI/Anthropic/Google/OpenRouter providers, Vercel AI Gateway, Ollama, models.dev catalog |\n| IPC | Electron contextBridge |\n| Build | TypeScript 5.9, esbuild, Electron Forge |\n\n## Environment Variables (for packaging)\n\nFor production builds with code signing:\n- `APPLE_ID` - Apple Developer ID\n- `APPLE_PASSWORD` - App-specific password\n- `APPLE_TEAM_ID` - Team ID\n\nNot required for local development.\n"},"files":{"CLAUDE.md":"# CLAUDE.md - AI Coding Agent Context\n\nThis file provides context for AI coding agents working on the Rowboat monorepo.\n\n## Quick Reference Commands\n\n```bash\n# Electron App (apps/x)\ncd apps/x && pnpm install          # Install dependencies\ncd apps/x && npm run deps          # Build workspace packages (shared → core → preload)\ncd apps/x && npm run dev           # Development mode (builds deps, runs app)\ncd apps/x && npm run lint          # Lint check\ncd apps/x/apps/main && npm run package   # Production build (.app)\ncd apps/x/apps/main && npm run make      # Create DMG distributable\n```\n\n## Monorepo Structure\n\n```\nrowboat/\n├── apps/\n│   ├── x/                 # Electron desktop app (focus of this doc)\n│   ├── rowboat/           # Next.js web dashboard\n│   ├── rowboatx/          # Next.js frontend\n│   ├── cli/               # CLI tool\n│   ├── python-sdk/        # Python SDK\n│   └── docs/              # Documentation site\n├── CLAUDE.md              # This file\n└── README.md              # User-facing readme\n```\n\n## Electron App Architecture (`apps/x`)\n\nThe Electron app is a **nested pnpm workspace** with its own package management.\n\n```\napps/x/\n├── package.json           # Workspace root, dev scripts\n├── pnpm-workspace.yaml    # Defines workspace packages\n├── pnpm-lock.yaml         # Lockfile\n├── apps/\n│   ├── main/              # Electron main process\n│   │   ├── src/           # Main process source\n│   │   ├── forge.config.cjs   # Electron Forge config\n│   │   └── bundle.mjs     # esbuild bundler\n│   ├── renderer/          # React UI (Vite)\n│   │   ├── src/           # React components\n│   │   └── vite.config.ts\n│   └── preload/           # Electron preload scripts\n│       └── src/\n└── packages/\n    ├── shared/            # @x/shared - Types, utilities, validators\n    └── core/              # @x/core - Business logic, AI, OAuth, MCP\n```\n\n### Build Order (Dependencies)\n\n```\nshared (no deps)\n   ↓\ncore (depends on shared)\n   ↓\npreload (depends on shared)\n   ↓\nrenderer (depends on shared)\nmain (depends on shared, core)\n```\n\n**The `npm run deps` command builds:** shared → core → preload\n\n### Key Entry Points\n\n| Component | Entry | Output |\n|-----------|-------|--------|\n| main | `apps/main/src/main.ts` | `.package/dist/main.cjs` |\n| renderer | `apps/renderer/src/main.tsx` | `apps/renderer/dist/` |\n| preload | `apps/preload/src/preload.ts` | `apps/preload/dist/preload.js` |\n\n## Build System\n\n- **Package manager:** pnpm (required for `workspace:*` protocol)\n- **Main bundler:** esbuild (bundles to single CommonJS file)\n- **Renderer bundler:** Vite\n- **Packaging:** Electron Forge\n- **TypeScript:** ES2022 target\n\n### Why esbuild bundling?\n\npnpm uses symlinks for workspace packages. Electron Forge's dependency walker can't follow these symlinks. esbuild bundles everything into a single file, eliminating the need for node_modules in the packaged app.\n\n## Key Files Reference\n\n| Purpose | File |\n|---------|------|\n| Electron main entry | `apps/x/apps/main/src/main.ts` |\n| React app entry | `apps/x/apps/renderer/src/main.tsx` |\n| Forge config (packaging) | `apps/x/apps/main/forge.config.cjs` |\n| Main process bundler | `apps/x/apps/main/bundle.mjs` |\n| Vite config | `apps/x/apps/renderer/vite.config.ts` |\n| Shared types | `apps/x/packages/shared/src/` |\n| Core business logic | `apps/x/packages/core/src/` |\n| Workspace config | `apps/x/pnpm-workspace.yaml` |\n| Root scripts | `apps/x/package.json` |\n\n## Feature Deep-Dives\n\nLong-form docs for specific features. Read the relevant file before making changes in that area — it has the full product flow, technical flows, and (where applicable) a catalog of the LLM prompts involved with exact file:line pointers.\n\n| Feature | Doc |\n|---------|-----|\n| Live Notes — single `live:` frontmatter block (one objective + optional cron / windows / eventMatchCriteria) that turns a note into a self-updating artifact, panel UI, Copilot skill, prompts catalog | `apps/x/LIVE_NOTE.md` |\n| Calls (video mode) — one hands-free call engine with four presets (voice / video / share screen / practice coaching), device-derived surfaces (full-screen ⇄ floating popout), frame pipeline, prompts catalog | `apps/x/VIDEO_MODE.md` |\n| Analytics — PostHog event catalog, person properties, use-case taxonomy, how to add a new event | `apps/x/ANALYTICS.md` |\n| Turn/session runtime — event-sourced storage, reference model, the `npm run inspect` debugger | `apps/x/packages/core/docs/turn-runtime-design.md`, `session-design.md` |\n\n## Common Tasks\n\n### LLM configuration\n- Config file: `~/.rowboat/config/models.json` (v2; v1 files are migrated on boot by `core/models/migrate.ts`)\n- Schema: `{ version: 2, providers: { <id>: { flavor, apiKey?, baseURL?, … } }, assistantModel?: { provider, model, effort? }, taskModels?: { knowledgeGraph?, meetingNotes?, liveNoteAgent?, autoPermissionDecision?, chatTitle?, backgroundTask?, subagent? }, deferBackgroundTasks? }`\n- Providers carry credentials only (no model fields) — model lists are always fetched live via the unified catalog (`core/models/catalog.ts`, `models:list` IPC). Model choices live in `assistantModel` (the one primary) and `taskModels` (optional overrides that otherwise inherit the assistant). Every choice is a `{ provider, model, effort? }` pair — `effort` is the reasoning effort picked with the model (`low`/`medium`/`high`; missing, `null`, or `\"auto\"` all mean Auto = provider default).\n- Models catalog cache: `~/.rowboat/config/models.dev.json` (OpenAI/Anthropic/Google only)\n\n### Add a new shared type\n1. Edit `apps/x/packages/shared/src/`\n2. Run `cd apps/x && npm run deps` to rebuild\n\n### Modify main process\n1. Edit `apps/x/apps/main/src/`\n2. Restart dev server (main doesn't hot-reload)\n\n### Modify renderer (React UI)\n1. Edit `apps/x/apps/renderer/src/`\n2. Changes hot-reload automatically in dev mode\n\n### Add a new dependency to main\n1. `cd apps/x/apps/main && pnpm add <package>`\n2. Import in source - esbuild will bundle it\n\n### Verify compilation\n```bash\ncd apps/x && npm run deps && npm run lint\ncd apps/x && npm run typecheck   # dev tsconfigs — the only gate that typechecks *.test.ts\n```\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|------------|\n| Desktop | Electron 39.x |\n| UI | React 19, Vite 7 |\n| Styling | TailwindCSS, Radix UI |\n| State | React hooks |\n| AI | Vercel AI SDK, OpenAI/Anthropic/Google/OpenRouter providers, Vercel AI Gateway, Ollama, models.dev catalog |\n| IPC | Electron contextBridge |\n| Build | TypeScript 5.9, esbuild, Electron Forge |\n\n## Environment Variables (for packaging)\n\nFor production builds with code signing:\n- `APPLE_ID` - Apple Developer ID\n- `APPLE_PASSWORD` - App-specific password\n- `APPLE_TEAM_ID` - Team ID\n\nNot required for local development.\n"},"items":[{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"# CLAUDE.md - AI Coding Agent Context\n\nThis file provides context for AI coding agents working on the Rowboat monorepo.\n\n## Quick Reference Commands\n\n```bash\n# Electron App (apps/x)\ncd apps/x && pnpm install          # Install dependencies\ncd apps/x && npm run deps          # Build workspace packages (shared → core → preload)\ncd apps/x && npm run dev           # Development mode (builds deps, runs app)\ncd apps/x && npm run lint          # Lint check\ncd apps/x/apps/main && npm run package   # Production build (.app)\ncd apps/x/apps/main && npm run make      # Create DMG distributable\n```\n\n## Monorepo Structure\n\n```\nrowboat/\n├── apps/\n│   ├── x/                 # Electron desktop app (focus of this doc)\n│   ├── rowboat/           # Next.js web dashboard\n│   ├── rowboatx/          # Next.js frontend\n│   ├── cli/               # CLI tool\n│   ├── python-sdk/        # Python SDK\n│   └── docs/              # Documentation site\n├── CLAUDE.md              # This file\n└── README.md              # User-facing readme\n```\n\n## Electron App Architecture (`apps/x`)\n\nThe Electron app is a **nested pnpm workspace** with its own package management.\n\n```\napps/x/\n├── package.json           # Workspace root, dev scripts\n├── pnpm-workspace.yaml    # Defines workspace packages\n├── pnpm-lock.yaml         # Lockfile\n├── apps/\n│   ├── main/              # Electron main process\n│   │   ├── src/           # Main process source\n│   │   ├── forge.config.cjs   # Electron Forge config\n│   │   └── bundle.mjs     # esbuild bundler\n│   ├── renderer/          # React UI (Vite)\n│   │   ├── src/           # React components\n│   │   └── vite.config.ts\n│   └── preload/           # Electron preload scripts\n│       └── src/\n└── packages/\n    ├── shared/            # @x/shared - Types, utilities, validators\n    └── core/              # @x/core - Business logic, AI, OAuth, MCP\n```\n\n### Build Order (Dependencies)\n\n```\nshared (no deps)\n   ↓\ncore (depends on shared)\n   ↓\npreload (depends on shared)\n   ↓\nrenderer (depends on shared)\nmain (depends on shared, core)\n```\n\n**The `npm run deps` command builds:** shared → core → preload\n\n### Key Entry Points\n\n| Component | Entry | Output |\n|-----------|-------|--------|\n| main | `apps/main/src/main.ts` | `.package/dist/main.cjs` |\n| renderer | `apps/renderer/src/main.tsx` | `apps/renderer/dist/` |\n| preload | `apps/preload/src/preload.ts` | `apps/preload/dist/preload.js` |\n\n## Build System\n\n- **Package manager:** pnpm (required for `workspace:*` protocol)\n- **Main bundler:** esbuild (bundles to single CommonJS file)\n- **Renderer bundler:** Vite\n- **Packaging:** Electron Forge\n- **TypeScript:** ES2022 target\n\n### Why esbuild bundling?\n\npnpm uses symlinks for workspace packages. Electron Forge's dependency walker can't follow these symlinks. esbuild bundles everything into a single file, eliminating the need for node_modules in the packaged app.\n\n## Key Files Reference\n\n| Purpose | File |\n|---------|------|\n| Electron main entry | `apps/x/apps/main/src/main.ts` |\n| React app entry | `apps/x/apps/renderer/src/main.tsx` |\n| Forge config (packaging) | `apps/x/apps/main/forge.config.cjs` |\n| Main process bundler | `apps/x/apps/main/bundle.mjs` |\n| Vite config | `apps/x/apps/renderer/vite.config.ts` |\n| Shared types | `apps/x/packages/shared/src/` |\n| Core business logic | `apps/x/packages/core/src/` |\n| Workspace config | `apps/x/pnpm-workspace.yaml` |\n| Root scripts | `apps/x/package.json` |\n\n## Feature Deep-Dives\n\nLong-form docs for specific features. Read the relevant file before making changes in that area — it has the full product flow, technical flows, and (where applicable) a catalog of the LLM prompts involved with exact file:line pointers.\n\n| Feature | Doc |\n|---------|-----|\n| Live Notes — single `live:` frontmatter block (one objective + optional cron / windows / eventMatchCriteria) that turns a note into a self-updating artifact, panel UI, Copilot skill, prompts catalog | `apps/x/LIVE_NOTE.md` |\n| Calls (video mode) — one hands-free call engine with four presets (voice / video / share screen / practice coaching), device-derived surfaces (full-screen ⇄ floating popout), frame pipeline, prompts catalog | `apps/x/VIDEO_MODE.md` |\n| Analytics — PostHog event catalog, person properties, use-case taxonomy, how to add a new event | `apps/x/ANALYTICS.md` |\n| Turn/session runtime — event-sourced storage, reference model, the `npm run inspect` debugger | `apps/x/packages/core/docs/turn-runtime-design.md`, `session-design.md` |\n\n## Common Tasks\n\n### LLM configuration\n- Config file: `~/.rowboat/config/models.json` (v2; v1 files are migrated on boot by `core/models/migrate.ts`)\n- Schema: `{ version: 2, providers: { <id>: { flavor, apiKey?, baseURL?, … } }, assistantModel?: { provider, model, effort? }, taskModels?: { knowledgeGraph?, meetingNotes?, liveNoteAgent?, autoPermissionDecision?, chatTitle?, backgroundTask?, subagent? }, deferBackgroundTasks? }`\n- Providers carry credentials only (no model fields) — model lists are always fetched live via the unified catalog (`core/models/catalog.ts`, `models:list` IPC). Model choices live in `assistantModel` (the one primary) and `taskModels` (optional overrides that otherwise inherit the assistant). Every choice is a `{ provider, model, effort? }` pair — `effort` is the reasoning effort picked with the model (`low`/`medium`/`high`; missing, `null`, or `\"auto\"` all mean Auto = provider default).\n- Models catalog cache: `~/.rowboat/config/models.dev.json` (OpenAI/Anthropic/Google only)\n\n### Add a new shared type\n1. Edit `apps/x/packages/shared/src/`\n2. Run `cd apps/x && npm run deps` to rebuild\n\n### Modify main process\n1. Edit `apps/x/apps/main/src/`\n2. Restart dev server (main doesn't hot-reload)\n\n### Modify renderer (React UI)\n1. Edit `apps/x/apps/renderer/src/`\n2. Changes hot-reload automatically in dev mode\n\n### Add a new dependency to main\n1. `cd apps/x/apps/main && pnpm add <package>`\n2. Import in source - esbuild will bundle it\n\n### Verify compilation\n```bash\ncd apps/x && npm run deps && npm run lint\ncd apps/x && npm run typecheck   # dev tsconfigs — the only gate that typechecks *.test.ts\n```\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|------------|\n| Desktop | Electron 39.x |\n| UI | React 19, Vite 7 |\n| Styling | TailwindCSS, Radix UI |\n| State | React hooks |\n| AI | Vercel AI SDK, OpenAI/Anthropic/Google/OpenRouter providers, Vercel AI Gateway, Ollama, models.dev catalog |\n| IPC | Electron contextBridge |\n| Build | TypeScript 5.9, esbuild, Electron Forge |\n\n## Environment Variables (for packaging)\n\nFor production builds with code signing:\n- `APPLE_ID` - Apple Developer ID\n- `APPLE_PASSWORD` - App-specific password\n- `APPLE_TEAM_ID` - Team ID\n\nNot required for local development.\n","category":"root","tokens":1688}]}