本次 squash merge 将 codex-story-first-image-intent 的整体改动合入 development,核心内容包括: 1. 后端数据与迁移:新增 stories、story_versions、story_image_intents、chapter_cover_intents、assets 等模型与 Alembic 迁移,建立 story-first、markdown-first、asset-first 的主数据链路。 2. 生成与任务链:引入 StoryBuilderOrchestrator、ChapterComposerOrchestrator、story_image_tasks、chapter_cover_tasks,图片生成从正文占位符改为结构化 intent -> asset -> markdown 回填。 3. 并发与一致性:为 story/chapter intent 增加 claim_token、claimed_at、attempt_count,采用数据库原子 claim 为主、Redis 锁为辅,避免重复生成、锁误删和 processing 卡死。 4. Memoir 读写路径:章节 canonical_markdown 成为正文真源,列表/详情接口补齐 markdown、cover_asset、word_count 等字段,PDF 与 asset 解析链路同步升级。 5. Memory / Retrieval:扩展 transcript ingest、chunking、evidence 检索与 story 聚合基础设施,为后续 story-first RAG 与多 agent 编排提供底座。 6. App 端体验:章节页继续走 MarkdownRenderer 阅读链,同时吸收 fix3-19 的跨平台 UI glitch 修复;更新对话页、首页、文案资源与章节列表映射逻辑。 7. 测试与文档:补充 asset resolver、story image task、章节封面派发、markdown 映射等回归测试,并加入图片占位符退役设计文档。
124 lines
4.5 KiB
JSON
124 lines
4.5 KiB
JSON
{
|
|
"name": "app-expo",
|
|
"main": "expo-router/entry",
|
|
"version": "1.0.0",
|
|
"scripts": {
|
|
"use-env": "node scripts/use-env.js",
|
|
"prestart": "npm run use-env -- development",
|
|
"start": "expo start",
|
|
"start:staging": "npm run use-env -- staging && expo start",
|
|
"start:prod": "npm run use-env -- production && expo start",
|
|
"reset-project": "node ./scripts/reset-project.js",
|
|
"android": "npm run use-env -- development && expo run:android",
|
|
"ios": "npm run use-env -- development && expo run:ios",
|
|
"web": "npm run use-env -- development && expo start --web",
|
|
"lint": "expo lint",
|
|
"test": "jest --watch",
|
|
"test:changed": "jest --onlyChanged --coverage=false",
|
|
"test:ci": "jest --ci --runInBand --coverage --forceExit",
|
|
"test:update": "jest -u --coverage=false",
|
|
"format": "prettier . --write",
|
|
"format:check": "prettier . --check",
|
|
"i18n:extract": "npx -y i18next-cli@1.50.1 extract",
|
|
"i18n:extract:ci": "npx -y i18next-cli@1.50.1 extract --ci",
|
|
"i18n:lint": "npx -y i18next-cli@1.50.1 lint",
|
|
"i18n:sync": "npx -y i18next-cli@1.50.1 sync",
|
|
"i18n:types": "npx -y i18next-cli@1.50.1 types",
|
|
"i18n:check": "npm run i18n:extract:ci && npm run i18n:lint && npm run i18n:types"
|
|
},
|
|
"dependencies": {
|
|
"@dev-plugins/react-query": "^0.4.0",
|
|
"@react-navigation/bottom-tabs": "^7.7.3",
|
|
"@react-navigation/elements": "^2.8.1",
|
|
"@react-navigation/native": "^7.1.28",
|
|
"@rn-primitives/accordion": "^1.2.0",
|
|
"@rn-primitives/alert-dialog": "^1.2.0",
|
|
"@rn-primitives/aspect-ratio": "^1.2.0",
|
|
"@rn-primitives/avatar": "^1.2.0",
|
|
"@rn-primitives/checkbox": "^1.2.0",
|
|
"@rn-primitives/collapsible": "^1.2.0",
|
|
"@rn-primitives/context-menu": "^1.2.0",
|
|
"@rn-primitives/dialog": "^1.2.0",
|
|
"@rn-primitives/dropdown-menu": "^1.2.0",
|
|
"@rn-primitives/hover-card": "^1.2.0",
|
|
"@rn-primitives/label": "^1.2.0",
|
|
"@rn-primitives/menubar": "^1.2.0",
|
|
"@rn-primitives/popover": "^1.2.0",
|
|
"@rn-primitives/progress": "^1.2.0",
|
|
"@rn-primitives/radio-group": "^1.2.0",
|
|
"@rn-primitives/select": "^1.2.0",
|
|
"@rn-primitives/separator": "^1.2.0",
|
|
"@rn-primitives/slot": "^1.2.0",
|
|
"@rn-primitives/switch": "^1.2.0",
|
|
"@rn-primitives/tabs": "^1.2.0",
|
|
"@rn-primitives/toggle": "^1.2.0",
|
|
"@rn-primitives/toggle-group": "^1.2.0",
|
|
"@rn-primitives/tooltip": "^1.2.0",
|
|
"@tanstack/react-query": "^5.90.21",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"expo": "~55.0.6",
|
|
"expo-asset": "~55.0.8",
|
|
"expo-audio": "~55.0.8",
|
|
"expo-constants": "~55.0.7",
|
|
"expo-device": "~55.0.9",
|
|
"expo-document-picker": "~55.0.8",
|
|
"expo-file-system": "~55.0.10",
|
|
"expo-font": "~55.0.4",
|
|
"expo-glass-effect": "~55.0.8",
|
|
"expo-image": "~55.0.6",
|
|
"expo-image-manipulator": "~55.0.10",
|
|
"expo-image-picker": "~55.0.12",
|
|
"expo-linear-gradient": "~55.0.9",
|
|
"expo-linking": "~55.0.7",
|
|
"expo-localization": "~55.0.8",
|
|
"expo-media-library": "~55.0.9",
|
|
"expo-router": "~55.0.5",
|
|
"expo-secure-store": "~55.0.8",
|
|
"expo-speech": "~55.0.8",
|
|
"expo-splash-screen": "~55.0.10",
|
|
"expo-sqlite": "~55.0.10",
|
|
"expo-status-bar": "~55.0.4",
|
|
"expo-symbols": "~55.0.5",
|
|
"expo-system-ui": "~55.0.9",
|
|
"expo-task-manager": "~55.0.9",
|
|
"expo-web-browser": "~55.0.9",
|
|
"i18next": "^25.8.18",
|
|
"lucide-react-native": "^0.577.0",
|
|
"nativewind": "^4.2.2",
|
|
"react": "19.2.0",
|
|
"react-dom": "19.2.0",
|
|
"react-i18next": "^16.5.8",
|
|
"react-native": "0.83.2",
|
|
"react-native-gesture-handler": "~2.30.0",
|
|
"react-native-markdown-display": "^7.0.2",
|
|
"react-native-reanimated": "4.2.1",
|
|
"react-native-safe-area-context": "~5.6.2",
|
|
"react-native-screens": "~4.23.0",
|
|
"react-native-svg": "15.15.3",
|
|
"react-native-web": "~0.21.0",
|
|
"react-native-webview": "13.16.0",
|
|
"react-native-worklets": "0.7.2",
|
|
"tailwind-merge": "^3.5.0",
|
|
"tailwindcss-animate": "^1.0.7"
|
|
},
|
|
"devDependencies": {
|
|
"@testing-library/react-native": "^13.3.3",
|
|
"@types/jest": "29.5.14",
|
|
"@types/react": "~19.2.2",
|
|
"babel-preset-expo": "~55.0.8",
|
|
"eslint": "^9.0.0",
|
|
"eslint-config-expo": "~55.0.0",
|
|
"eslint-config-prettier": "^10.1.8",
|
|
"i18next-cli": "^1.50.1",
|
|
"jest": "~29.7.0",
|
|
"jest-expo": "~55.0.9",
|
|
"prettier": "^3.8.1",
|
|
"prettier-plugin-tailwindcss": "^0.5.11",
|
|
"react-test-renderer": "19.2.0",
|
|
"tailwindcss": "^3.4.17",
|
|
"typescript": "~5.9.2"
|
|
},
|
|
"private": true
|
|
}
|