| Age | Commit message (Collapse) | Author |
|
Show per-card difficulty (D: X.X) in the card list alongside existing
metrics (reps, lapses). Hidden for unreviewed cards (difficulty = 0).
https://claude.ai/code/session_019XoFbra6drKrZpHASUzKDq
|
|
Add totalCardCount and reviewCardCount to deck API responses and
display a progress bar on the home page for each deck with cards.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Card and StudyCard interfaces used generic number for state, causing
type errors when indexing Record<CardStateType, ...> maps. Also adds
missing FSRS fields to client Card interface to match API response.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
The dynamic import was redundant since the module was already statically
imported in the same file, causing a Vite warning.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Add newCardCount alongside Total and Due stats in the deck detail view,
queried from cards with state=New via a new countNewCards repository method.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
The disabled attribute on the parent button element prevented all child
click events, making the edit button unresponsive on the back side.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Display Learning, Review, and Relearning badges in addition to New,
using consistent color scheme from DeckCardsPage.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Inject package.json version via Vite's define config and display
it in a persistent footer across all pages.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Allow editing note content directly from the study screen via a pen
icon button or the E key shortcut. Keyboard shortcuts are disabled
while the edit modal is open to prevent accidental card flips/ratings.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Navigation links on the session complete screen were fire-and-forget,
causing the last card's review to not be reflected on the deck list.
Replace links with buttons that await the review flush and invalidate
the deck query cache before navigating.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Add my-auto to the deck info container for vertical centering
within the flex row.
|
|
Allow creating notes directly from the deck detail page without
navigating through View Cards first.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
REVIEW_CARDS_LIMIT(復習カード80枚制限)とnewCardsPerDay(1日の新規カード制限)
を削除し、期日が来たすべてのカードを制限なく返すように変更。
削除した主な要素:
- REVIEW_CARDS_LIMIT定数とカード取得時のlimitパラメータ
- newCardsPerDayフィールド(DB schema, 型定義, Zod schema, sync, CRDT)
- countDueNewCards, countDueReviewCards, findDueNewCardsForStudy,
findDueReviewCardsForStudy(CardRepository)
- countTodayNewCardReviews(ReviewLogRepository)
- デッキルートからのReviewLogRepository依存
https://claude.ai/code/session_018hrEJ9vg3RPoeAPyEc17gS
|
|
All cards now use note-based template rendering. The legacy
front/back fallback path is no longer needed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Simplify deck stats to show due card count from server
|
|
Shuffle order is now fixed within a study day by seeding mulberry32
with the study day boundary timestamp (3:00 AM rollover).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
Review card limit is reduced from 100 to 80 across deck list, deck detail,
and study routes. Deck detail page now shows only total card count and due
card count (with budget limits applied), matching the deck list and study
screen numbers.
https://claude.ai/code/session_01NAj4waQhwSSXV9EbgioX2j
|
|
Show a "New" badge in the top-right corner of cards when the card
state is 0 (new), helping users identify cards they haven't seen before.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Show separate counts for New, Learning, and Review cards instead of
a single "Due Today" count. Uses FSRS CardState to categorize cards
with color-coded display (blue/orange/green).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Automatically removes soft-deleted records older than 90 days.
Runs on server startup and every 24 hours thereafter.
Respects foreign key dependencies when deleting.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
The deck list was showing all due cards without applying the
newCardsPerDay limit or review card limit (100), causing a mismatch
with the actual number of cards available in the study screen.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Defer API submission of reviews by storing them as pending. The
previous pending review is flushed when the next card is rated, and
on unmount via fire-and-forget. Undo discards the pending review and
returns to the previous card without any API call.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
countTodayNewCardReviews was using midnight (0:00) as the start of day,
inconsistent with the 3 AM study day boundary used elsewhere. Reviews
between 0:00-3:00 AM were incorrectly counted as the next day's budget.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
findDueNewCardsForStudy and findDueReviewCardsForStudy were still using
lte(cards.due, now) while findDueCards and countDueCards had been updated
to use the study day boundary in d4489f2. This caused inconsistency
between the displayed due count and actual cards returned by the study API.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Update all dependencies to latest patch/minor versions.
Explicitly specify HS256 algorithm in JWT verify to prevent
algorithm confusion attacks.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Replace built-in jotai atomFamily with jotai-family package for better
parameter-based atom family support.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Split due card fetching into new cards and review cards, applying
the deck's newCardsPerDay limit to new cards while leaving review
cards unrestricted. New cards are placed before review cards in
the response.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Reduce layout shift during data loading by using content-shaped
skeleton placeholders instead of generic spinners in DeckDetailPage,
DeckCardsPage, and StudyPage.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Instead of comparing due timestamps exactly (card.due <= now), compare
against the next 3 AM boundary so all cards due within the current
study day appear at once. This prevents new cards from trickling in
throughout the day when FSRS fuzz spreads due times.
https://claude.ai/code/session_01FeDztLcyGofd6nxh8ct7a3
|
|
|
|
Prevent cards with similar intervals from always appearing on the same
day by enabling ts-fsrs built-in fuzz factor.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Allow continuous study flow by pressing Space repeatedly - first to
flip the card, then to rate as Good (3).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Replace custom createReloadableAtom/createReloadableAtomFamily with
atomWithSuspenseQuery from jotai-tanstack-query, leveraging TanStack
Query's built-in caching, invalidation, and Suspense support.
- Add @tanstack/query-core and jotai-tanstack-query dependencies
- Create shared QueryClient instance (src/client/queryClient.ts)
- Migrate all data atoms (decks, cards, study, noteTypes) to atomWithSuspenseQuery
- Update page components to use .data destructuring and queryClient.invalidateQueries()
- Update all test files to use QueryClient for data hydration
- Remove src/client/atoms/utils.ts (no longer needed)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Add a debounced (500ms) search input using use-debounce that filters
note groups by matching card front/back content (case-insensitive).
Pagination resets to page 1 when the search query changes.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Separate the card list view from the deck learning page to prevent users
from seeing cards they are about to study. The deck detail page now shows
only study statistics with a "Study Now" button and a "View Cards" link.
- Add new DeckCardsPage component at /decks/:deckId/cards for managing cards
- Simplify DeckDetailPage to show deck stats and navigation buttons
- Update routing in App.tsx with proper route ordering
- Add comprehensive tests for both pages
|
|
Display a badge with the number of cards due for study today next to
each deck name on the home page. The count is fetched along with deck
data from the API to minimize additional network requests.
|
|
Replace AuthProvider and SyncProvider with Jotai atoms for more granular
state management and better performance. This migration:
- Creates atoms for auth, sync, decks, cards, noteTypes, and study state
- Uses atomFamily for parameterized state (e.g., cards by deckId)
- Introduces StoreInitializer component for subscription initialization
- Updates all components and pages to use useAtomValue/useSetAtom
- Updates all tests to use Jotai Provider with createStore pattern
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Cards are now randomized using Fisher-Yates algorithm to improve
learning by preventing users from memorizing card order.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Show actual note types and their fields in the expected format section
instead of a hardcoded example. Fields are sorted by order.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Since import is initiated from deck context, the deck is already known
via props. Simplifies CSV format to: note_type,Field1,Field2,...
BREAKING CHANGE: CSV format changed from deck,note_type,... to note_type,...
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Replace raw fetch() calls with apiClient.rpc typed client across all
modal and page components. This provides better type safety and
eliminates manual auth header handling.
- Make handleResponse public for component usage
- Update all component tests to mock RPC methods instead of fetch
- Change POSTGRES_HOST default to kioku-db for Docker compatibility
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Add client-side CSV parsing and bulk import API endpoint for importing
notes from CSV files. Supports quoted fields, newlines in values, and
escaped quotes.
- New POST /api/decks/{deckId}/notes/import endpoint for bulk creation
- CSV parser with RFC 4180 compliance
- Multi-phase import modal (upload → validate → preview → import)
- Client-side validation with per-row error reporting
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Change template input fields from single-line <input> to <textarea>
elements to support multiline content in front/back templates.
Fixes #5
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
When the refresh token fails (session expired), the ApiClient now
notifies the AuthProvider via a callback. This triggers a logout
and React state update, causing ProtectedRoute to redirect to /login.
Closes #7
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
The client session was too short because access tokens (15 min) weren't
being automatically refreshed using the refresh token (7 days). Now the
ApiClient intercepts 401 responses, attempts token refresh, and retries
the original request. This extends effective session duration to 7 days.
Closes #6
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
|
Ensures deterministic ordering for all multi-row SELECT queries:
- deck/note/noteType findByUserId/findByDeckId: order by createdAt
- card findByNoteId: order by isReversed (normal card first)
- note field values: order by noteFieldTypeId
- sync pull queries: order by id
This guarantees consistent UI display and sync results regardless
of PostgreSQL's internal row ordering.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|