feat: ship v1.0.0 with character graph and writing analytics
Add P7 Cytoscape relationship graph with setting CRUD, P9 cockpit analytics driven by writing_sessions, chapter POV selection, and full test coverage. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -9,6 +9,8 @@ import { VolumeRepository } from '../../src/main/db/repositories/volume.repo'
|
||||
import { WritingLogRepository } from '../../src/main/db/repositories/writing-log.repo'
|
||||
import { GlobalSettingsService } from '../../src/main/services/global-settings'
|
||||
import { WritingLogService } from '../../src/main/services/writing-log.service'
|
||||
import { WritingSessionRepository } from '../../src/main/db/repositories/writing-session.repo'
|
||||
import { WritingSessionService } from '../../src/main/services/writing-session.service'
|
||||
import { ChapterWritingTracker } from '../../src/main/services/chapter-writing-tracker.service'
|
||||
import { addDays, localDateString } from '../../src/main/services/writing-date.util'
|
||||
import type { SqliteDb } from '../../src/main/db/types'
|
||||
@@ -84,10 +86,12 @@ describe('ChapterWritingTracker', () => {
|
||||
settings = new GlobalSettingsService(settingsDir)
|
||||
repo = new WritingLogRepository(userDir)
|
||||
writingLogs = new WritingLogService(repo, settings)
|
||||
const sessionRepo = new WritingSessionRepository(repo.getDb())
|
||||
const sessions = new WritingSessionService(sessionRepo)
|
||||
const bookId = 'book-1'
|
||||
const volId = new VolumeRepository(db).create('卷一', 0).id
|
||||
const chapter = new ChapterRepository(db).create(volId, '第一章', 0, '<p>一二三四五六七八九十</p>')
|
||||
const tracker = new ChapterWritingTracker(db, bookId, writingLogs)
|
||||
const tracker = new ChapterWritingTracker(db, bookId, writingLogs, sessions)
|
||||
tracker.recordDelta(chapter.id, 5)
|
||||
tracker.supplementOnFinish(chapter.id, chapter.wordCount)
|
||||
expect(writingLogs.getStats(bookId).todayWords).toBe(chapter.wordCount)
|
||||
@@ -101,11 +105,13 @@ describe('ChapterWritingTracker', () => {
|
||||
settings = new GlobalSettingsService(settingsDir)
|
||||
repo = new WritingLogRepository(userDir)
|
||||
writingLogs = new WritingLogService(repo, settings)
|
||||
const sessionRepo = new WritingSessionRepository(repo.getDb())
|
||||
const sessions = new WritingSessionService(sessionRepo)
|
||||
const bookId = 'book-1'
|
||||
const volId = new VolumeRepository(db).create('卷一', 0).id
|
||||
const chapterRepo = new ChapterRepository(db)
|
||||
const ch = chapterRepo.create(volId, 'A', 0, '<p>ab</p>')
|
||||
const tracker = new ChapterWritingTracker(db, bookId, writingLogs)
|
||||
const tracker = new ChapterWritingTracker(db, bookId, writingLogs, sessions)
|
||||
const updated = chapterRepo.update(ch.id, { content: '<p>abcd</p>' })
|
||||
tracker.recordDelta(ch.id, updated.wordCount)
|
||||
const updated2 = chapterRepo.update(ch.id, { content: '<p>abcdef</p>' })
|
||||
|
||||
Reference in New Issue
Block a user