chore: release v0.9.0#155
Conversation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Notebooks now sync before notes in syncNow() to ensure note-notebook dependencies are satisfied. Adds pullNotebooks/pushNotebooks methods and applyRemoteNotebookChange for bidirectional notebook sync. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move validateNotebookTree from inline test definition to a shared module so it can be reused by the API route and other consumers. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add conflict state to SyncStatusIndicator with amber warning icon and count. Conflicts now take priority over idle state so users discover them without navigating to Settings. Also export ConflictResolver from sync components barrel. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DatabaseConnection.transaction() already calls the inner fn — no need for extra () at call site. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix pullNotebooks() to only advance cursor to last successfully applied change (prevents skipping failed changes on retry) - Fix tree validation snapshot to properly exclude deleted notebooks (prevents ghost parent references in validation) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: add bidirectional notebook sync
test: add sync-core unit tests (62 tests)
feat: surface sync conflicts in status indicator
# Conflicts: # apps/desktop/src/main/services/apiClient.ts # apps/desktop/src/main/services/syncService.ts # packages/api/src/db/schema.ts # packages/api/src/routes/sync.ts # packages/storage-sqlite/src/migrations/index.ts
feat: add bidirectional tag sync
Configure automated code review with path-specific instructions for core, storage, desktop, and API packages. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ration Add optional metadata (name, version, priority) to registerRemarkPlugin and registerRehypePlugin signatures for debugging and execution ordering. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
## Summary - Fix `wrangler-action@v3` failing with `ERR_PNPM_ADDING_TO_ROOT` in pnpm workspaces - Add `packageManager: pnpm` and `workingDirectory: apps/web` to the deploy step ## Context The Deploy Web workflow has been failing on every push to main because wrangler-action tries `pnpm add wrangler` at the workspace root without `-w`. ## Test plan - [ ] Merge to develop, then main, verify deploy workflow passes 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Updated deployment automation configuration to enhance build and release processes with improved package manager specification and working directory handling. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary - Add step to create `readied-web` project on Cloudflare Pages before deploying - Uses `continue-on-error: true` so it doesn't fail when project already exists - Add `--commit-dirty=true` to suppress wrangler git warning ## Context The Deploy Web workflow has never succeeded — project `readied-web` doesn't exist on Cloudflare Pages (error code 8000007). ## Test plan - [ ] Merge to develop → main, verify deploy succeeds 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Mirror of #138 Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Mirror of #140 Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary Full rebuild of the marketing site with a modern, minimal design system: - **Design System**: Violet accent (#8b5cf6) on dark zinc base, Inter + JetBrains Mono fonts, dark-mode only - **shadcn/ui**: Button, Card, Badge, Separator, Accordion, Sheet components (new-york style) - **Magic UI**: AnimatedShinyText, BorderBeam, DotPattern, Marquee, NumberTicker, ShimmerButton, TextReveal effects - **Rebuilt components**: Navbar (Sheet mobile nav), Footer (DotPattern bg), Hero (ShimmerButton + BorderBeam), SocialProof (Marquee), Features (BorderBeam hover), WhyLocal (TextReveal), Audience, Pricing (NumberTicker + Accordion), Download (AnimatedShinyText) - **Cleanup**: Removed @headlessui/react, migrated FaqAccordion to shadcn Accordion - **Design tokens**: All pages updated from hardcoded colors to Tailwind v4 CSS custom properties ### New Dependencies - framer-motion, class-variance-authority, clsx, tailwind-merge, tailwindcss-animate - @fontsource/inter, @fontsource-variable/jetbrains-mono - @radix-ui/react-slot, @radix-ui/react-accordion, @radix-ui/react-dialog, @radix-ui/react-separator ### Removed - @headlessui/react ## Test plan - [x] `pnpm build` passes (37+ static pages generated) - [x] No TypeScript errors in modified files - [x] No @headlessui/react imports remain - [ ] Visual verification of all pages in dev mode - [ ] Fumadocs docs render correctly with dark theme - [ ] Mobile nav (Sheet) opens/closes correctly 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Major marketing site redesign: new hero, video guides, testimonials, creator story, and animated landing sections. * New UI primitives: cards, accordions, sheet-based mobile menu, animated beams, marquees, shiny text, number ticker, and modal video viewer. * Pricing page: live animated pricing display and accordion FAQs; download page unified per-platform cards. * **Style** * Unified semantic color tokens, violet-focused palette, updated fonts (Inter + JetBrains Mono), and new animations (marquee, shimmer, grid). <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary - **Website redesign**: Rebuilt all marketing pages with Magic UI components (shimmer, border beam, text reveal, marquee, number ticker), shadcn/ui base components, and a new violet accent design system with Inter + JetBrains Mono fonts - **CodeRabbit fixes**: Accessibility improvements (aria labels, semantic HTML, reduced-motion), stable React keys, design token alignment - **Auth UX rethink**: Replaced buried Settings > Account login with direct "Enable Sync" flow from sidebar — value proposition modal, resend timer, auto-detect deep link verification - **Auth bug fixes**: Fixed API returning 500 instead of 401 for invalid JWTs, fixed deep link race condition when app cold-starts from magic link - **Sync onboarding**: Shows prompt after 3+ notes created, dismissible - **Web auth fallback**: Improved verify page for wrong-device and app-not-installed scenarios ## Changes by area ### Website (`apps/web/`) - New design system: violet accent, Inter + JetBrains Mono - shadcn/ui: Button, Card, Badge, Separator, Accordion, Sheet - Rebuilt: Navbar, Hero, Footer, SocialProof, Features, WhyLocal, Audience, Pricing, Download, Philosophy - Magic UI: AnimatedGridPattern, BorderBeam, Marquee, NumberTicker, ShimmerButton, TextReveal, AnimatedShinyText - Migrated FaqAccordion from @headlessui/react to shadcn - Improved auth/verify fallback page ### Desktop (`apps/desktop/`) - New `EnableSyncModal` with 5-step wizard (value prop → email → sent → success) - `SidebarFooter`: "Sign In" → "Enable Sync" (opens modal directly) - `useSyncOnboarding` hook: prompt after 3+ notes - Sync prompt banner in sidebar (dismissible) - Deep link race condition fix (queues token if window not ready) ### API (`packages/api/`) - Fixed `onError` handler swallowing `HTTPException` (401s returned as 500) - Fixed auth middleware catch block losing specific error messages ### Config (`packages/product-config/`) - Fixed extensionless imports for cross-package compatibility ## Test plan - [x] `pnpm typecheck` — 18/18 packages pass - [x] `pnpm test` — all tests pass (pre-push hook) - [ ] Visual review of all marketing pages - [ ] Test Enable Sync flow: sidebar → modal → email → magic link → verify - [ ] Test deep link cold-start (kill app → click magic link) - [ ] Verify CodeRabbit has no new comments 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Desktop: prominent sync onboarding prompt and multi-step "Enable Sync" modal. * **Improvements** * Clearer auth verification flow with fallback actions. * Accessibility enhancements across web and desktop (semantic dialogs, reduced-motion support, better aria attributes). * Locale-aware number formatting and improved video modal semantics. * **Bug Fixes** * More reliable deep-link token delivery and safer rendering in animated components. * **Documentation** * Added roadmap for Auth, Sync, and AI work. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
# Conflicts: # apps/desktop/src/renderer/components/sync/index.ts # apps/web/app/(marketing)/auth/verify/AuthVerifyContent.tsx # apps/web/app/(marketing)/changelog/page.tsx # apps/web/app/(marketing)/download/page.tsx # apps/web/app/(marketing)/faq/page.tsx # apps/web/app/(marketing)/page.tsx # apps/web/app/(marketing)/philosophy/page.tsx # apps/web/app/(marketing)/plugins/page.tsx # apps/web/app/(marketing)/pricing/page.tsx # apps/web/app/(marketing)/privacy/page.tsx # apps/web/app/(marketing)/terms/page.tsx # apps/web/app/docs/[[...slug]]/page.tsx # apps/web/app/docs/layout.tsx # apps/web/app/globals.css # apps/web/app/layout.tsx # apps/web/components/FaqAccordion.tsx # apps/web/components/Footer.tsx # apps/web/components/MobileNav.tsx # apps/web/components/Navbar.tsx # apps/web/components/landing/Audience.tsx # apps/web/components/landing/ComparisonTable.tsx # apps/web/components/landing/Features.tsx # apps/web/components/landing/Hero.tsx # apps/web/components/landing/SocialProof.tsx # apps/web/components/landing/WhyLocal.tsx # apps/web/content/docs/architecture/overview.mdx # apps/web/content/docs/guide/principles.mdx # apps/web/content/docs/index.mdx # apps/web/content/docs/plugins/getting-started.mdx # apps/web/mdx-components.tsx # apps/web/package.json # pnpm-lock.yaml
Phase 1 — Backend fixes: - Fix auth middleware: all jose error types return 401 JSON (not 500) - Document all 24 API endpoints in api-reference.md Phase 2 — Sync stability: - Add sync error propagation to renderer via IPC status events - Add exponential backoff on auto-sync failures (cap 5min) - Auto-stop sync on 401 with auth-expired event - Abort in-flight sync operations on logout via AbortController - Token refresh returns typed errors (expired/network/device_limit) - Sync onboarding prompt after 5 notes (session-dismissable) - Offline queue visibility in sidebar footer (pending count) Phase 3 — AI Commands (Cmd+K v1): - Add 'ai' command category with toggle-panel, summarize, rewrite, tweet - Remap Cmd+K to AI panel, insert-link to Cmd+Shift+K - Integrate AiPanel into App layout as right-side panel - Add AI Settings section (API key, model selector, context notes) - Settings schema v2 with v1→v2 migration - Wire existing ai-assistant package (Claude client, RAG, prompts) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 4 — AI Knowledge (Cmd+K v2):
- Add RAG context fetching: queries search relevant notes automatically
- Add ai:ask-notes command (Cmd+Shift+K) with dedicated system prompt
- Auto-include related notes as context when a note is selected
- Mode toggle in AI panel (Chat vs Ask Notes)
- Context badge showing number of notes used as RAG context
- ASK_NOTES_SYSTEM_PROMPT instructs AI to cite note titles
Phase 5 — AI Extensibility:
- Add AiCommandDefinition type with prompt templates ({{selection}}, {{note}}, {{title}})
- Add AiCommandPreset type for shareable command collections
- Add resolveTemplate(), validateAiCommandDefinition(), validateAiCommandPreset()
- Add aiCommandStore (Zustand vanilla) for plugin-registered AI commands
- Add registerAiCommand() to PluginContext API
- Add IPC handlers for preset import/export (file dialog)
- Add preset management UI in Settings > AI Assistant
- 28 tests for command types, validation, and serialization
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…150) ## Summary - **Phase 4 (AI Knowledge)**: Wire `ai:summarize`, `ai:rewrite`, `ai:tweet` commands with real Claude prompts and output routing (replace selection, insert at cursor, or show in panel) - **Phase 5 (Extensibility)**: Bridge plugin AI command store → command palette so plugin-registered AI commands are discoverable and executable ## Changes ### Phase 4 - Add built-in prompt templates (SUMMARIZE, REWRITE, TWEET) to `packages/ai-assistant` - AiPanel supports `initialCommand` prop for auto-execution - Output target routing: `replace` swaps editor selection, `insert` adds at cursor, `panel` shows in chat - Handler wiring in App.tsx → useRegisterAiCommands ### Phase 5 - New `useRegisterPluginAiCommands` hook subscribes to `aiCommandStore` and syncs to `CommandRegistry` - Plugin AI commands auto-appear in command palette with `AI:` prefix - Template resolution with editor context (`{{selection}}`, `{{note}}`, `{{title}}`) - Automatic cleanup on plugin unload ## Test plan - [ ] Open command palette → verify Summarize/Rewrite/Tweet commands appear - [ ] Select text → invoke Summarize → AI panel shows summary - [ ] Select text → invoke Rewrite → selection replaced in editor - [ ] Select text → invoke Tweet → AI panel shows tweet version - [ ] Cmd+K opens AI panel in chat mode - [ ] Cmd+Shift+K opens AI panel in ask-notes mode 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Release Notes * **New Features** * Added AI command suite: summarize, rewrite, and tweet built-in AI commands with panel integration. * Introduced violet-centric design system with new color tokens and theme consistency. * Enabled automated release workflow via GitHub Actions with semantic versioning. * **Bug Fixes** * Enhanced token encoding for secure authentication flows. * Improved sync error handling with better retry logic and abort handling. * **Documentation** * Added comprehensive roadmap and changelog documentation. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary - Migrated all Tailwind CSS classes to v4 canonical names (`bg-gradient-to-*` → `bg-linear-to-*`, opacity fractions simplified) - Removed deprecated `baseUrl` and unused `paths` from `ai-assistant` and `command-registry` tsconfigs ## Changes - **24 files** across `apps/web` components and 2 package tsconfigs - No logic changes — purely class name modernization and config cleanup ## Test plan - [x] `pnpm typecheck` passes 18/18 - [x] `pnpm test` passes - [ ] Visual check of web app (Tailwind classes should render identically) 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Style** * Standardized border opacity values and color styling across the application for improved visual consistency. * Updated gradient utilities to use a unified styling approach throughout UI components. * Refined background and border color tokens with shorter opacity syntax for cleaner styling declarations. * Applied consistent opacity values to buttons, dividers, badges, and decorative elements across marketing pages and navigation. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
) ## Summary - **License-gated auto-sync**: Prevents 403 errors for free/expired users by checking license state before starting sync - **Smart EnableSyncModal**: License-aware step routing — computes initial step based on auth × license state (skips pricing for trial users, skips auth for already-signed-in users) - **Stripe checkout integration**: Monthly (€2/mo) and annual (€20/year) plan selection with real Stripe checkout flow - **Sidebar drag-and-drop fixes**: Grip handle for intentional drags, circular reference prevention, recursive child depth update on move - **SyncStatusIndicator**: Replaced hardcoded hex colors with design token CSS classes - **Product-config pricing alignment**: Updated from USD placeholders to actual EUR Stripe prices - **CI/CD**: Auto-deploy API to Cloudflare Workers on push to main ## Files changed | Area | Files | |------|-------| | Auth/Sync | `authStore.ts`, `useSyncOnboarding.ts`, `EnableSyncModal.tsx` | | UI | `LoginModal.module.css`, `SyncStatusIndicator.tsx/.module.css`, `global.css` | | Sidebar | `NotebookItem.tsx`, `index.ts` (main process) | | Config | `product-config/facade.ts` | | CI/CD | `.github/workflows/deploy-api.yml` | ## Test plan - [ ] New user (trial active, not auth'd) → Enable Sync → value-prop → email → success - [ ] Trial expired, not auth'd → Enable Sync → value-prop → email → pricing → checkout → success - [ ] Authenticated + free → Enable Sync → pricing → checkout → success - [ ] Authenticated + pro → Enable Sync → shows "already syncing" success - [ ] Drag notebooks via grip handle only — text selection still works - [ ] Move parent folder with children — all children depths update correctly - [ ] `pnpm typecheck` passes - [ ] `pnpm test` passes 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added drag-and-drop support for organizing notebooks with visual feedback. * Enhanced sync onboarding with license-aware capability checks and subscription options. * Improved magic link authentication with real-time verification feedback. * **Bug Fixes** * Fixed circular reference issues when reorganizing notebook hierarchies. * Enhanced auto-sync activation with license state validation. * **Style** * Unified design token system with dark/light theme support. * Updated error messaging UI in authentication flow. * **Chores** * Updated pricing to EUR. * Consolidated design system infrastructure. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
📝 WalkthroughWalkthroughThis pull request refactors package ownership from design-system to plugin-api, removes design-system components and exports, consolidates design tokens to a centralized location, implements AI command features (summarize, rewrite, tweet) with plugin integration, adds license-gated sync onboarding, introduces notebook drag-and-drop with circular-reference protection, and improves GitHub Actions workflows for automated testing and release validation. Changes
Sequence Diagram(s)sequenceDiagram
participant Plugin as Plugin Store
participant Bridge as useRegisterPluginAiCommands
participant Registry as CommandRegistry
participant App as App.tsx
participant Panel as AiPanel
participant API as Claude API
Plugin->>Bridge: AI command registered (onExecute)
activate Bridge
Bridge->>Registry: register(id: plugin-ai:*, execute)
deactivate Bridge
App->>App: User triggers summarize/rewrite/tweet
App->>App: dispatchAiCommand (prepare prompts)
App->>Panel: set initialCommand
App->>Panel: open panel
activate Panel
Panel->>Panel: useEffect: auto-execute initialCommand
Panel->>API: invoke Claude with systemPrompt + userPrompt
deactivate Panel
API-->>Panel: response
Panel->>Panel: handle outputTarget (replace/insert/panel)
Panel->>App: onCommandExecuted callback
sequenceDiagram
participant UI as Sidebar
participant Modal as EnableSyncModal
participant License as License Context
participant Auth as Auth Flow
participant Checkout as Checkout Service
participant Sync as Sync Service
UI->>Modal: open (isSyncModalOpen)
activate Modal
Modal->>License: check license status
alt Already has sync capability
Modal->>Modal: route to success
else Needs purchase
Modal->>UI: show pricing step
UI->>Modal: select plan
Modal->>Checkout: initiate checkout
Modal->>Modal: set waiting-payment
activate Checkout
Checkout-->>Modal: checkout complete
deactivate Checkout
Modal->>License: poll/await license update
License-->>Modal: license updated
end
alt License allows sync
Modal->>Auth: proceed to email entry
Auth->>Auth: send magic link
Auth->>Auth: await verification
Auth-->>Modal: authenticated
Modal->>Sync: auto-start sync
end
Modal->>Modal: transition to success
deactivate Modal
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
📝 Coding Plan
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Release v0.9.0
Highlights
Changes since v0.8.0
Checklist
pnpm typecheckpassespnpm testpassespackage.jsonversion is0.9.0🤖 Generated with Claude Code
Summary by CodeRabbit
Release Notes
New Features
Bug Fixes
Improvements
Refactor
Chores