{"owner":"czy0729","repo":"Bangumi","hasSkills":true,"totalSkillsCount":5,"totalTokensCount":6010,"categories":["anthropic-skill","claude-rule"],"hasMcp":false,"mcpConfig":null,"found":["packages/android/package.json","CLAUDE.md","packages/web/package.json","packages/ios/package.json","web/tools/package.json"],"skills":{"packages/android/package.json":"{\n  \"name\": \"android\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"expo run:android\",\n    \"metro\": \"expo start --no-dev\",\n    \"postinstall\": \"patch-package\",\n    \"r\": \"sudo shutdown -r now\",\n    \"env\": \"node ./packages/env.js\",\n    \"k\": \"sudo purge\",\n    \"clean\": \"cd android && ./gradlew clean\",\n    \"build\": \"cd android && ./gradlew assembleRelease && cd .. && node web/rename.js\",\n    \"open\": \"start .\\\\android\\\\app\\\\build\\\\outputs\\\\apk\\\\release\\\\\",\n    \"open:mac\": \"open ./android/app/build/outputs/apk/release/\",\n    \"test\": \"jest\",\n    \"test:watch\": \"jest --watch\",\n    \"build:rust\": \"bash android/rust/build-android.sh\",\n    \"lint:styles\": \"npx eslint 'src/**/styles.ts'\",\n    \"lint:imports\": \"npx eslint 'src/**/*.{ts,tsx}' --quiet --config eslint-rules/.eslintrc.check-imports.js\",\n    \"lint:hooks\": \"node scripts/lint-hooks.cjs\",\n    \"fixed:chown\": \"sudo chown -R $(whoami):staff node_modules metro-cache dist android ios\"\n  },\n  \"resolutions\": {\n    \"define-properties\": \"1.2.1\",\n    \"react-native-reanimated\": \"3.6.0\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"1.18.2\",\n    \"@react-native-community/blur\": \"4.3.2\",\n    \"@react-native-community/cameraroll\": \"4.1.2\",\n    \"@react-native-community/slider\": \"4.4.2\",\n    \"@react-native-masked-view/masked-view\": \"0.2.9\",\n    \"@react-navigation/bottom-tabs\": \"6.5.8\",\n    \"@react-navigation/native\": \"6.1.7\",\n    \"@react-navigation/native-stack\": \"6.9.13\",\n    \"@sdcx/nested-scroll\": \"0.14.0\",\n    \"expo\": \"49.0.0-alpha.9\",\n    \"expo-blur\": \"12.4.1\",\n    \"expo-calendar\": \"~11.3.2\",\n    \"expo-constants\": \"14.4.2\",\n    \"expo-device\": \"5.4.0\",\n    \"expo-file-system\": \"~15.4.5\",\n    \"expo-font\": \"11.4.0\",\n    \"expo-haptics\": \"12.4.0\",\n    \"expo-keep-awake\": \"12.3.0\",\n    \"expo-linear-gradient\": \"12.3.0\",\n    \"expo-screen-orientation\": \"~6.0.6\",\n    \"expo-speech\": \"~11.3.0\",\n    \"expo-splash-screen\": \"0.20.4\",\n    \"expo-status-bar\": \"1.6.0\",\n    \"expo-web-browser\": \"12.3.2\",\n    \"mobx\": \"6.12.3\",\n    \"mobx-react\": \"9.1.1\",\n    \"patch-package\": \"7.0.2\",\n    \"postinstall-postinstall\": \"2.1.0\",\n    \"react\": \"18.2.0\",\n    \"react-native\": \"0.72.10\",\n    \"react-native-android-widget\": \"0.5.2\",\n    \"react-native-exception-handler\": \"2.10.10\",\n    \"react-native-fast-image\": \"8.6.3\",\n    \"react-native-fs\": \"2.20.0\",\n    \"react-native-gesture-handler\": \"~2.12.0\",\n    \"react-native-mmkv\": \"2.12.2\",\n    \"react-native-pager-view\": \"6.2.0\",\n    \"react-native-realtimeblurview\": \"1.1.3\",\n    \"react-native-reanimated\": \"3.6.0\",\n    \"react-native-render-html\": \"4.1.1\",\n    \"react-native-restart\": \"0.0.27\",\n    \"react-native-safe-area-context\": \"4.6.3\",\n    \"react-native-screens\": \"3.22.1\",\n    \"react-native-smb\": \"0.2.4\",\n    \"react-native-svg\": \"13.9.0\",\n    \"react-native-tab-view\": \"3.5.2\",\n    \"react-native-webview\": \"13.2.2\",\n    \"rn-fetch-blob\": \"0.12.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.20.0\",\n    \"@babel/plugin-transform-modules-commonjs\": \"^7.22.15\",\n    \"@babel/preset-react\": \"^7.22.15\",\n    \"@babel/preset-typescript\": \"^7.22.15\",\n    \"@react-native-community/eslint-config\": \"3.0.1\",\n    \"@types/jest\": \"^29.5.12\",\n    \"@types/react\": \"~18.2.14\",\n    \"@types/react-native\": \"0.67.6\",\n    \"@typescript-eslint/eslint-plugin\": \"6.2.1\",\n    \"@typescript-eslint/parser\": \"6.2.1\",\n    \"babel-plugin-jest-hoist\": \"^29.6.3\",\n    \"cheerio\": \"1.0.0\",\n    \"cheerio-without-node-native\": \"0.20.2\",\n    \"crypto-js\": \"^4.2.0\",\n    \"dayjs\": \"1.11.9\",\n    \"eslint\": \"8.46.0\",\n    \"eslint-config-prettier\": \"8.3.0\",\n    \"eslint-plugin-bangumi\": \"file:./eslint-rules\",\n    \"eslint-plugin-prettier\": \"4.0.0\",\n    \"eslint-plugin-react\": \"7.33.2\",\n    \"eslint-plugin-react-native\": \"4.0.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"2.6.2\",\n    \"protobufjs\": \"^8.8.0\",\n    \"stream-browserify\": \"3.0.0\",\n    \"typescript\": \"^5.1.3\"\n  },\n  \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n","CLAUDE.md":"# Bangumi32\n\nbgm.tv (Bangumi) 第三方客户端，React Native (Expo SDK 54) 项目。作者: czy0729\n\n## ⛔ 最高优先级：只改不动暂存区\n\n未经用户**当次明确要求**，绝对禁止执行任何修改暂存区或版本历史的操作：\n\n- 禁止 `git add`、`git commit`、`git push`\n- 禁止 `git stash`、`git restore --staged`、`git rm --cached` 等一切触碰索引的命令\n- 所有改动只停留在工作区（unstaged），暂存与否完全由用户自己决定\n- 用户要求\"审查暂存代码\"时，只读 diff 并给结论，不得顺手把修正并入暂存区\n\n违反此条比代码写得差更严重。\n\n## ⛔ 依赖迭代：不碰 *.lock\n\n- 任何情况下禁止修改 `*.lock`（yarn.lock、package-lock.json、Podfile.lock 等）：不编辑、不生成、不删除\n- 禁止运行 `yarn install` / `npm install` / `pod install` 等会改动 lock 或 node_modules 的命令；依赖增删只改 `package.json`（含 `resolutions`）与源码\n- lock 刷新、原生工程同步（pod install / gradle sync）、真机回归由用户执行；AI 须在方案中显式列出这些\"待用户自理项\"\n\n## 通用\n\n- 优先选择编辑而非重写整个文件\n- 除非文件被编辑过，否则不要重复阅读已读过的文件\n- 输出追求简洁，但推理过程必须详尽\n\n\n## 详细规范（按需读取）\n\n> 触发对应业务时读取对应文件，不要一次性全部加载。\n\n| 场景                                       | 文档                                                         |\n| ------------------------------------------ | ------------------------------------------------------------ |\n| 了解项目结构、技术栈、路径别名、导航、构建 | [.claude/docs/architecture.md](.claude/docs/architecture.md) |\n| 新建/修改页面（Screen）                    | [.claude/docs/screen.md](.claude/docs/screen.md)             |\n| 查找/定位某个页面                          | [.claude/docs/screens.md](.claude/docs/screens.md)           |\n| 新建/修改可复用组件（components/）         | [.claude/docs/component.md](.claude/docs/component.md)       |\n| 新建/修改 MobX Store                       | [.claude/docs/store.md](.claude/docs/store.md)               |\n| API 请求相关                               | [.claude/docs/api.md](.claude/docs/api.md)                   |\n| 测试规范                                   | [.claude/docs/testing.md](.claude/docs/testing.md)           |\n| Token 预算规则                             | [.claude/docs/token-budget.md](.claude/docs/token-budget.md) |\n| 代码规范与风格                             | [.claude/docs/code-style.md](.claude/docs/code-style.md)     |\n\n## 文档维护\n\n当以下情况发生时，主动更新 `.claude/docs/` 中对应的文档：\n\n- 新增或重构了页面模板/约定 → 更新 `screen.md`\n- 新增/删除/重命名了页面 → 更新 `screens.md`\n- 新增或重构了可复用组件模式 → 更新 `component.md`\n- Store 继承链或文件结构变化 → 更新 `store.md`\n- API 请求方式或常量位置变化 → 更新 `api.md`\n- 新增路径别名、导航结构变化、技术栈升级 → 更新 `architecture.md`\n- 发现代码风格约定与文档不符 → 更新 `code-style.md`\n- 测试规范变化 → 更新 `testing.md`\n\n原则：改了什么就更新什么，不要等用户提醒。\n","packages/web/package.json":"{\n  \"name\": \"web\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"sudo STORYBOOK=true start-storybook -p 6006\",\n    \"build\": \"sudo STORYBOOK=true build-storybook\",\n    \"postinstall\": \"patch-package\",\n    \"env\": \"node ./packages/env.js\",\n    \"proxy\": \"cd ./web/tools && node proxy-api.js\",\n    \"proxy:webdav\": \"cd ./web/tools && node proxy-webdav.js\",\n    \"k\": \"sudo purge\",\n    \"r\": \"sudo shutdown -r now\"\n  },\n  \"resolutions\": {\n    \"@types/react\": \"17.0.2\",\n    \"define-properties\": \"1.2.0\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"~1.17.3\",\n    \"@react-native-community/async-storage\": \"1.12.1\",\n    \"@react-native-community/blur\": \"4.2.0\",\n    \"@react-native-community/cameraroll\": \"4.0.4\",\n    \"@react-native-community/slider\": \"^4.5.0\",\n    \"@react-native-community/viewpager\": \"5.0.11\",\n    \"@react-native-masked-view/masked-view\": \"0.2.8\",\n    \"@react-navigation/bottom-tabs\": \"~6.5.8\",\n    \"@react-navigation/native\": \"^6.1.7\",\n    \"@react-navigation/native-stack\": \"^6.9.13\",\n    \"@react-navigation/stack\": \"^6.3.17\",\n    \"@sdcx/nested-scroll\": \"^0.14.0\",\n    \"bangumi-data\": \"^0.3.118\",\n    \"devtools-detector\": \"^2.0.14\",\n    \"expo\": \"^47.0.0\",\n    \"expo-blur\": \"~12.0.1\",\n    \"expo-calendar\": \"~11.0.1\",\n    \"expo-constants\": \"~14.0.2\",\n    \"expo-device\": \"~5.0.0\",\n    \"expo-file-system\": \"~15.1.1\",\n    \"expo-font\": \"~11.0.1\",\n    \"expo-haptics\": \"~12.0.1\",\n    \"expo-linear-gradient\": \"~12.0.1\",\n    \"expo-modules-core\": \"~1.0.4 || ~1.1.1\",\n    \"expo-screen-orientation\": \"~5.0.1\",\n    \"expo-splash-screen\": \"~0.17.5\",\n    \"expo-updates\": \"~0.15.6\",\n    \"expo-web-browser\": \"~12.0.0\",\n    \"htmlparser2\": \"^3.9.0\",\n    \"idb\": \"^7.1.1\",\n    \"lodash\": \"^4.17.4\",\n    \"mobx\": \"6.8.0\",\n    \"mobx-react\": \"7.6.0\",\n    \"patch-package\": \"6.4.7\",\n    \"postinstall-postinstall\": \"2.1.0\",\n    \"rc-dropdown\": \"^4.1.0\",\n    \"react\": \"18.3.1\",\n    \"react-dom\": \"18.3.1\",\n    \"react-ios-corners\": \"^1.0.0\",\n    \"react-native\": \"0.70.5\",\n    \"react-native-draggable-grid\": \"^2.1.4\",\n    \"react-native-exception-handler\": \"^2.10.8\",\n    \"react-native-fast-image\": \"8.5.11\",\n    \"react-native-fs\": \"2.18.0\",\n    \"react-native-gesture-handler\": \"~2.8.0\",\n    \"react-native-pager-view\": \"^6.2.3\",\n    \"react-native-realtimeblurview\": \"^1.1.3\",\n    \"react-native-reanimated\": \"~2.12.0\",\n    \"react-native-render-html\": \"4.1.1\",\n    \"react-native-restart\": \"0.0.14\",\n    \"react-native-safe-area-context\": \"4.4.1\",\n    \"react-native-screens\": \"~3.18.0\",\n    \"react-native-smb\": \"^0.2.4\",\n    \"react-native-tab-view\": \"2.14.3\",\n    \"react-native-web\": \"~0.18.7\",\n    \"react-native-webview\": \"11.23.1\",\n    \"recyclerlistview\": \"^4.0.1\",\n    \"rn-fetch-blob\": \"^0.12.0\",\n    \"workbox-webpack-plugin\": \"^7.0.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.19.3\",\n    \"@babel/plugin-proposal-class-properties\": \"^7.18.6\",\n    \"@babel/plugin-proposal-decorators\": \"^7.21.0\",\n    \"@babel/plugin-transform-export-namespace-from\": \"^7.22.11\",\n    \"@react-native-community/eslint-config\": \"^3.0.1\",\n    \"@storybook/addon-actions\": \"~6.5\",\n    \"@storybook/addon-controls\": \"~6.5\",\n    \"@storybook/addon-essentials\": \"~6.5\",\n    \"@storybook/addon-links\": \"~6.5\",\n    \"@storybook/addon-ondevice-actions\": \"~6.5\",\n    \"@storybook/addon-ondevice-backgrounds\": \"~6.5\",\n    \"@storybook/addon-ondevice-controls\": \"~6.5\",\n    \"@storybook/addon-ondevice-notes\": \"~6.5\",\n    \"@storybook/addon-react-native-web\": \"^0.0.19\",\n    \"@storybook/builder-webpack5\": \"~6.5\",\n    \"@storybook/manager-webpack5\": \"~6.5\",\n    \"@storybook/preview-web\": \"~6.5\",\n    \"@storybook/react\": \"~6.5\",\n    \"@storybook/react-native\": \"~6.5\",\n    \"@types/react\": \"~17.0.21\",\n    \"@types/react-native\": \"~0.67.6\",\n    \"@typescript-eslint/eslint-plugin\": \"^5.0.0\",\n    \"@typescript-eslint/parser\": \"^4.33.0\",\n    \"babel-loader\": \"^8.2.3\",\n    \"babel-plugin-react-docgen-typescript\": \"^1.5.1\",\n    \"babel-plugin-react-native-web\": \"^0.18.10\",\n    \"cheerio\": \"1.0.0\",\n    \"cheerio-without-node-native\": \"0.20.2\",\n    \"copy-webpack-plugin\": \"^11.0.0\",\n    \"crypto-js\": \"^4.2.0\",\n    \"css-loader\": \"^6.8.1\",\n    \"dayjs\": \"1.10.8\",\n    \"eslint\": \"^7.32.0\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"eslint-plugin-jest\": \"^24.5.2\",\n    \"eslint-plugin-prettier\": \"^4.0.0\",\n    \"eslint-plugin-react\": \"^7.26.1\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"ignore-loader\": \"^0.1.2\",\n    \"isomorphic-unfetch\": \"^3.1.0\",\n    \"node-sass\": \"^9.0.0\",\n    \"prettier\": \"^2.6.2\",\n    \"protobufjs\": \"^8.8.0\",\n    \"sass-loader\": \"^13.3.2\",\n    \"storybook-dark-mode\": \"3.0.0\",\n    \"stream-browserify\": \"^3.0.0\",\n    \"style-loader\": \"^3.3.3\",\n    \"terser-webpack-plugin\": \"^5.3.10\",\n    \"thread-loader\": \"^4.0.2\",\n    \"ts-node\": \"^10.8.1\",\n    \"typescript\": \"~4.3.5\",\n    \"webpack-bundle-analyzer\": \"^4.10.2\"\n  }\n}\n","packages/ios/package.json":"{\n  \"name\": \"bangumi-pro\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"expo start --max-workers 4\",\n    \"dev:offline\": \"expo start --offline --max-workers 4\",\n    \"dev:tee\": \"yarn dev | tee -a output.txt\",\n    \"postinstall\": \"patch-package\",\n    \"env\": \"node ./packages/env.js\",\n    \"k\": \"sudo purge\",\n    \"kj\": \"ps -ef | grep java | awk 'NR==1 {print $2}' | xargs kill -15\",\n    \"kp\": \"lsof -i :8081 | awk 'NR>1 {print $2}' | xargs kill\",\n    \"r\": \"sudo shutdown -r now\",\n    \"top\": \"top -s 4 -o rsize\",\n    \"mv\": \"yarn k && mv ios ios_ && mv android android_\",\n    \"pub\": \"eas update --channel production --platform ios --message \\\"release\\\"\",\n    \"re\": \"mv ios_ ios && mv android_ android && yarn k\",\n    \"open:win\": \"start .\\\\android\\\\app\\\\build\\\\outputs\\\\apk\\\\release\\\\\",\n    \"build:ipa\": \"cd ios && xcodebuild -workspace Bangumi.xcworkspace -scheme Bangumi -configuration Release -sdk iphoneos CODE_SIGN_IDENTITY=\\\"\\\" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO -derivedDataPath build\",\n    \"make:ipa\": \"node web/ipa.js\",\n    \"test\": \"jest --detectOpenHandles\",\n    \"test:watch\": \"jest --watch --forceExit\",\n    \"pb:verify\": \"node scripts/pb-verify.js\",\n    \"tag:verify\": \"node scripts/tag-verify.js\",\n    \"lint:styles\": \"npx eslint 'src/**/styles.ts'\",\n    \"lint:imports\": \"npx eslint 'src/**/*.{ts,tsx}' --quiet --config eslint-rules/.eslintrc.check-imports.js\",\n    \"fixed:chown\": \"sudo chown -R $(whoami):staff node_modules metro-cache dist android ios\"\n  },\n  \"resolutions\": {\n    \"define-properties\": \"1.2.0\",\n    \"use-latest-callback\": \"0.1.9\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"2.2.0\",\n    \"@react-native-community/blur\": \"4.4.1\",\n    \"@react-native-community/cameraroll\": \"4.0.4\",\n    \"@react-native-community/slider\": \"5.2.0\",\n    \"@react-native-masked-view/masked-view\": \"0.3.2\",\n    \"@react-navigation/bottom-tabs\": \"6.5.8\",\n    \"@react-navigation/native\": \"6.1.7\",\n    \"@react-navigation/native-stack\": \"6.9.13\",\n    \"@sdcx/nested-scroll\": \"^0.14.0\",\n    \"@types/react\": \"~19.2.2\",\n    \"expo\": \"~57.0.21\",\n    \"expo-asset\": \"~57.0.16\",\n    \"expo-blur\": \"~57.0.2\",\n    \"expo-calendar\": \"~57.0.2\",\n    \"expo-constants\": \"~57.0.17\",\n    \"expo-device\": \"~57.0.1\",\n    \"expo-file-system\": \"~57.0.6\",\n    \"expo-font\": \"~57.0.3\",\n    \"expo-haptics\": \"~57.0.2\",\n    \"expo-image\": \"~57.0.4\",\n    \"expo-linear-gradient\": \"~57.0.1\",\n    \"expo-screen-orientation\": \"~57.0.2\",\n    \"expo-speech\": \"~57.0.2\",\n    \"expo-splash-screen\": \"~57.0.8\",\n    \"expo-updates\": \"~57.0.21\",\n    \"expo-web-browser\": \"~57.0.2\",\n    \"htmlparser2\": \"^3.9.0\",\n    \"mobx\": \"6.12.3\",\n    \"mobx-react\": \"9.1.1\",\n    \"patch-package\": \"6.4.7\",\n    \"postinstall-postinstall\": \"2.1.0\",\n    \"react\": \"19.2.3\",\n    \"react-native\": \"0.86.3\",\n    \"react-native-exception-handler\": \"^2.10.8\",\n    \"react-native-fast-image\": \"8.5.11\",\n    \"react-native-fs\": \"2.18.0\",\n    \"react-native-gesture-handler\": \"~2.32.0\",\n    \"react-native-pager-view\": \"8.0.2\",\n    \"react-native-realtimeblurview\": \"1.1.3\",\n    \"react-native-reanimated\": \"4.5.1\",\n    \"react-native-render-html\": \"4.1.1\",\n    \"react-native-restart\": \"0.0.14\",\n    \"react-native-safe-area-context\": \"~5.7.0\",\n    \"react-native-screens\": \"~4.26.0\",\n    \"react-native-smb\": \"^0.2.4\",\n    \"react-native-svg\": \"15.15.4\",\n    \"react-native-tab-view\": \"3.5.2\",\n    \"react-native-webview\": \"13.16.1\",\n    \"react-native-worklets\": \"0.10.1\",\n    \"rn-fetch-blob\": \"^0.12.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.25.2\",\n    \"@babel/preset-react\": \"^7.27.1\",\n    \"@react-native-community/eslint-config\": \"^3.0.1\",\n    \"@react-native/jest-preset\": \"~0.86.3\",\n    \"@testing-library/jest-native\": \"^5.4.3\",\n    \"@testing-library/react-native\": \"^13.3.3\",\n    \"@types/jest\": \"29.5.14\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.59.0\",\n    \"@typescript-eslint/parser\": \"^8.59.0\",\n    \"babel-plugin-module-resolver\": \"^5.0.2\",\n    \"cheerio\": \"1.0.0\",\n    \"cheerio-without-node-native\": \"0.20.2\",\n    \"crypto-js\": \"^4.2.0\",\n    \"dayjs\": \"1.10.8\",\n    \"eslint\": \"^8.57.1\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"eslint-plugin-bangumi\": \"file:./eslint-rules\",\n    \"eslint-plugin-prettier\": \"^4.0.0\",\n    \"eslint-plugin-react\": \"^7.26.1\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"eslint-plugin-react-native\": \"^4.0.0\",\n    \"jest\": \"^29.7.0\",\n    \"jest-expo\": \"57.0.5\",\n    \"prettier\": \"^2.6.2\",\n    \"protobufjs\": \"^8.8.0\",\n    \"stream-browserify\": \"^3.0.0\",\n    \"typescript\": \"^6.0.3\"\n  },\n  \"expo\": {\n    \"autolinking\": {\n      \"ios\": {\n        \"exclude\": [\n          \"react-native-realtimeblurview\",\n          \"@sdcx/nested-scroll\"\n        ]\n      }\n    }\n  },\n  \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n","web/tools/package.json":"{\n  \"name\": \"tools\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"cors\": \"^2.8.5\",\n    \"http-proxy\": \"^1.18.1\",\n    \"http-proxy-middleware\": \"^2.0.6\"\n  }\n}\n"},"files":{"packages/android/package.json":"{\n  \"name\": \"android\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"expo run:android\",\n    \"metro\": \"expo start --no-dev\",\n    \"postinstall\": \"patch-package\",\n    \"r\": \"sudo shutdown -r now\",\n    \"env\": \"node ./packages/env.js\",\n    \"k\": \"sudo purge\",\n    \"clean\": \"cd android && ./gradlew clean\",\n    \"build\": \"cd android && ./gradlew assembleRelease && cd .. && node web/rename.js\",\n    \"open\": \"start .\\\\android\\\\app\\\\build\\\\outputs\\\\apk\\\\release\\\\\",\n    \"open:mac\": \"open ./android/app/build/outputs/apk/release/\",\n    \"test\": \"jest\",\n    \"test:watch\": \"jest --watch\",\n    \"build:rust\": \"bash android/rust/build-android.sh\",\n    \"lint:styles\": \"npx eslint 'src/**/styles.ts'\",\n    \"lint:imports\": \"npx eslint 'src/**/*.{ts,tsx}' --quiet --config eslint-rules/.eslintrc.check-imports.js\",\n    \"lint:hooks\": \"node scripts/lint-hooks.cjs\",\n    \"fixed:chown\": \"sudo chown -R $(whoami):staff node_modules metro-cache dist android ios\"\n  },\n  \"resolutions\": {\n    \"define-properties\": \"1.2.1\",\n    \"react-native-reanimated\": \"3.6.0\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"1.18.2\",\n    \"@react-native-community/blur\": \"4.3.2\",\n    \"@react-native-community/cameraroll\": \"4.1.2\",\n    \"@react-native-community/slider\": \"4.4.2\",\n    \"@react-native-masked-view/masked-view\": \"0.2.9\",\n    \"@react-navigation/bottom-tabs\": \"6.5.8\",\n    \"@react-navigation/native\": \"6.1.7\",\n    \"@react-navigation/native-stack\": \"6.9.13\",\n    \"@sdcx/nested-scroll\": \"0.14.0\",\n    \"expo\": \"49.0.0-alpha.9\",\n    \"expo-blur\": \"12.4.1\",\n    \"expo-calendar\": \"~11.3.2\",\n    \"expo-constants\": \"14.4.2\",\n    \"expo-device\": \"5.4.0\",\n    \"expo-file-system\": \"~15.4.5\",\n    \"expo-font\": \"11.4.0\",\n    \"expo-haptics\": \"12.4.0\",\n    \"expo-keep-awake\": \"12.3.0\",\n    \"expo-linear-gradient\": \"12.3.0\",\n    \"expo-screen-orientation\": \"~6.0.6\",\n    \"expo-speech\": \"~11.3.0\",\n    \"expo-splash-screen\": \"0.20.4\",\n    \"expo-status-bar\": \"1.6.0\",\n    \"expo-web-browser\": \"12.3.2\",\n    \"mobx\": \"6.12.3\",\n    \"mobx-react\": \"9.1.1\",\n    \"patch-package\": \"7.0.2\",\n    \"postinstall-postinstall\": \"2.1.0\",\n    \"react\": \"18.2.0\",\n    \"react-native\": \"0.72.10\",\n    \"react-native-android-widget\": \"0.5.2\",\n    \"react-native-exception-handler\": \"2.10.10\",\n    \"react-native-fast-image\": \"8.6.3\",\n    \"react-native-fs\": \"2.20.0\",\n    \"react-native-gesture-handler\": \"~2.12.0\",\n    \"react-native-mmkv\": \"2.12.2\",\n    \"react-native-pager-view\": \"6.2.0\",\n    \"react-native-realtimeblurview\": \"1.1.3\",\n    \"react-native-reanimated\": \"3.6.0\",\n    \"react-native-render-html\": \"4.1.1\",\n    \"react-native-restart\": \"0.0.27\",\n    \"react-native-safe-area-context\": \"4.6.3\",\n    \"react-native-screens\": \"3.22.1\",\n    \"react-native-smb\": \"0.2.4\",\n    \"react-native-svg\": \"13.9.0\",\n    \"react-native-tab-view\": \"3.5.2\",\n    \"react-native-webview\": \"13.2.2\",\n    \"rn-fetch-blob\": \"0.12.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.20.0\",\n    \"@babel/plugin-transform-modules-commonjs\": \"^7.22.15\",\n    \"@babel/preset-react\": \"^7.22.15\",\n    \"@babel/preset-typescript\": \"^7.22.15\",\n    \"@react-native-community/eslint-config\": \"3.0.1\",\n    \"@types/jest\": \"^29.5.12\",\n    \"@types/react\": \"~18.2.14\",\n    \"@types/react-native\": \"0.67.6\",\n    \"@typescript-eslint/eslint-plugin\": \"6.2.1\",\n    \"@typescript-eslint/parser\": \"6.2.1\",\n    \"babel-plugin-jest-hoist\": \"^29.6.3\",\n    \"cheerio\": \"1.0.0\",\n    \"cheerio-without-node-native\": \"0.20.2\",\n    \"crypto-js\": \"^4.2.0\",\n    \"dayjs\": \"1.11.9\",\n    \"eslint\": \"8.46.0\",\n    \"eslint-config-prettier\": \"8.3.0\",\n    \"eslint-plugin-bangumi\": \"file:./eslint-rules\",\n    \"eslint-plugin-prettier\": \"4.0.0\",\n    \"eslint-plugin-react\": \"7.33.2\",\n    \"eslint-plugin-react-native\": \"4.0.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"2.6.2\",\n    \"protobufjs\": \"^8.8.0\",\n    \"stream-browserify\": \"3.0.0\",\n    \"typescript\": \"^5.1.3\"\n  },\n  \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n","CLAUDE.md":"# Bangumi32\n\nbgm.tv (Bangumi) 第三方客户端，React Native (Expo SDK 54) 项目。作者: czy0729\n\n## ⛔ 最高优先级：只改不动暂存区\n\n未经用户**当次明确要求**，绝对禁止执行任何修改暂存区或版本历史的操作：\n\n- 禁止 `git add`、`git commit`、`git push`\n- 禁止 `git stash`、`git restore --staged`、`git rm --cached` 等一切触碰索引的命令\n- 所有改动只停留在工作区（unstaged），暂存与否完全由用户自己决定\n- 用户要求\"审查暂存代码\"时，只读 diff 并给结论，不得顺手把修正并入暂存区\n\n违反此条比代码写得差更严重。\n\n## ⛔ 依赖迭代：不碰 *.lock\n\n- 任何情况下禁止修改 `*.lock`（yarn.lock、package-lock.json、Podfile.lock 等）：不编辑、不生成、不删除\n- 禁止运行 `yarn install` / `npm install` / `pod install` 等会改动 lock 或 node_modules 的命令；依赖增删只改 `package.json`（含 `resolutions`）与源码\n- lock 刷新、原生工程同步（pod install / gradle sync）、真机回归由用户执行；AI 须在方案中显式列出这些\"待用户自理项\"\n\n## 通用\n\n- 优先选择编辑而非重写整个文件\n- 除非文件被编辑过，否则不要重复阅读已读过的文件\n- 输出追求简洁，但推理过程必须详尽\n\n\n## 详细规范（按需读取）\n\n> 触发对应业务时读取对应文件，不要一次性全部加载。\n\n| 场景                                       | 文档                                                         |\n| ------------------------------------------ | ------------------------------------------------------------ |\n| 了解项目结构、技术栈、路径别名、导航、构建 | [.claude/docs/architecture.md](.claude/docs/architecture.md) |\n| 新建/修改页面（Screen）                    | [.claude/docs/screen.md](.claude/docs/screen.md)             |\n| 查找/定位某个页面                          | [.claude/docs/screens.md](.claude/docs/screens.md)           |\n| 新建/修改可复用组件（components/）         | [.claude/docs/component.md](.claude/docs/component.md)       |\n| 新建/修改 MobX Store                       | [.claude/docs/store.md](.claude/docs/store.md)               |\n| API 请求相关                               | [.claude/docs/api.md](.claude/docs/api.md)                   |\n| 测试规范                                   | [.claude/docs/testing.md](.claude/docs/testing.md)           |\n| Token 预算规则                             | [.claude/docs/token-budget.md](.claude/docs/token-budget.md) |\n| 代码规范与风格                             | [.claude/docs/code-style.md](.claude/docs/code-style.md)     |\n\n## 文档维护\n\n当以下情况发生时，主动更新 `.claude/docs/` 中对应的文档：\n\n- 新增或重构了页面模板/约定 → 更新 `screen.md`\n- 新增/删除/重命名了页面 → 更新 `screens.md`\n- 新增或重构了可复用组件模式 → 更新 `component.md`\n- Store 继承链或文件结构变化 → 更新 `store.md`\n- API 请求方式或常量位置变化 → 更新 `api.md`\n- 新增路径别名、导航结构变化、技术栈升级 → 更新 `architecture.md`\n- 发现代码风格约定与文档不符 → 更新 `code-style.md`\n- 测试规范变化 → 更新 `testing.md`\n\n原则：改了什么就更新什么，不要等用户提醒。\n","packages/web/package.json":"{\n  \"name\": \"web\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"sudo STORYBOOK=true start-storybook -p 6006\",\n    \"build\": \"sudo STORYBOOK=true build-storybook\",\n    \"postinstall\": \"patch-package\",\n    \"env\": \"node ./packages/env.js\",\n    \"proxy\": \"cd ./web/tools && node proxy-api.js\",\n    \"proxy:webdav\": \"cd ./web/tools && node proxy-webdav.js\",\n    \"k\": \"sudo purge\",\n    \"r\": \"sudo shutdown -r now\"\n  },\n  \"resolutions\": {\n    \"@types/react\": \"17.0.2\",\n    \"define-properties\": \"1.2.0\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"~1.17.3\",\n    \"@react-native-community/async-storage\": \"1.12.1\",\n    \"@react-native-community/blur\": \"4.2.0\",\n    \"@react-native-community/cameraroll\": \"4.0.4\",\n    \"@react-native-community/slider\": \"^4.5.0\",\n    \"@react-native-community/viewpager\": \"5.0.11\",\n    \"@react-native-masked-view/masked-view\": \"0.2.8\",\n    \"@react-navigation/bottom-tabs\": \"~6.5.8\",\n    \"@react-navigation/native\": \"^6.1.7\",\n    \"@react-navigation/native-stack\": \"^6.9.13\",\n    \"@react-navigation/stack\": \"^6.3.17\",\n    \"@sdcx/nested-scroll\": \"^0.14.0\",\n    \"bangumi-data\": \"^0.3.118\",\n    \"devtools-detector\": \"^2.0.14\",\n    \"expo\": \"^47.0.0\",\n    \"expo-blur\": \"~12.0.1\",\n    \"expo-calendar\": \"~11.0.1\",\n    \"expo-constants\": \"~14.0.2\",\n    \"expo-device\": \"~5.0.0\",\n    \"expo-file-system\": \"~15.1.1\",\n    \"expo-font\": \"~11.0.1\",\n    \"expo-haptics\": \"~12.0.1\",\n    \"expo-linear-gradient\": \"~12.0.1\",\n    \"expo-modules-core\": \"~1.0.4 || ~1.1.1\",\n    \"expo-screen-orientation\": \"~5.0.1\",\n    \"expo-splash-screen\": \"~0.17.5\",\n    \"expo-updates\": \"~0.15.6\",\n    \"expo-web-browser\": \"~12.0.0\",\n    \"htmlparser2\": \"^3.9.0\",\n    \"idb\": \"^7.1.1\",\n    \"lodash\": \"^4.17.4\",\n    \"mobx\": \"6.8.0\",\n    \"mobx-react\": \"7.6.0\",\n    \"patch-package\": \"6.4.7\",\n    \"postinstall-postinstall\": \"2.1.0\",\n    \"rc-dropdown\": \"^4.1.0\",\n    \"react\": \"18.3.1\",\n    \"react-dom\": \"18.3.1\",\n    \"react-ios-corners\": \"^1.0.0\",\n    \"react-native\": \"0.70.5\",\n    \"react-native-draggable-grid\": \"^2.1.4\",\n    \"react-native-exception-handler\": \"^2.10.8\",\n    \"react-native-fast-image\": \"8.5.11\",\n    \"react-native-fs\": \"2.18.0\",\n    \"react-native-gesture-handler\": \"~2.8.0\",\n    \"react-native-pager-view\": \"^6.2.3\",\n    \"react-native-realtimeblurview\": \"^1.1.3\",\n    \"react-native-reanimated\": \"~2.12.0\",\n    \"react-native-render-html\": \"4.1.1\",\n    \"react-native-restart\": \"0.0.14\",\n    \"react-native-safe-area-context\": \"4.4.1\",\n    \"react-native-screens\": \"~3.18.0\",\n    \"react-native-smb\": \"^0.2.4\",\n    \"react-native-tab-view\": \"2.14.3\",\n    \"react-native-web\": \"~0.18.7\",\n    \"react-native-webview\": \"11.23.1\",\n    \"recyclerlistview\": \"^4.0.1\",\n    \"rn-fetch-blob\": \"^0.12.0\",\n    \"workbox-webpack-plugin\": \"^7.0.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.19.3\",\n    \"@babel/plugin-proposal-class-properties\": \"^7.18.6\",\n    \"@babel/plugin-proposal-decorators\": \"^7.21.0\",\n    \"@babel/plugin-transform-export-namespace-from\": \"^7.22.11\",\n    \"@react-native-community/eslint-config\": \"^3.0.1\",\n    \"@storybook/addon-actions\": \"~6.5\",\n    \"@storybook/addon-controls\": \"~6.5\",\n    \"@storybook/addon-essentials\": \"~6.5\",\n    \"@storybook/addon-links\": \"~6.5\",\n    \"@storybook/addon-ondevice-actions\": \"~6.5\",\n    \"@storybook/addon-ondevice-backgrounds\": \"~6.5\",\n    \"@storybook/addon-ondevice-controls\": \"~6.5\",\n    \"@storybook/addon-ondevice-notes\": \"~6.5\",\n    \"@storybook/addon-react-native-web\": \"^0.0.19\",\n    \"@storybook/builder-webpack5\": \"~6.5\",\n    \"@storybook/manager-webpack5\": \"~6.5\",\n    \"@storybook/preview-web\": \"~6.5\",\n    \"@storybook/react\": \"~6.5\",\n    \"@storybook/react-native\": \"~6.5\",\n    \"@types/react\": \"~17.0.21\",\n    \"@types/react-native\": \"~0.67.6\",\n    \"@typescript-eslint/eslint-plugin\": \"^5.0.0\",\n    \"@typescript-eslint/parser\": \"^4.33.0\",\n    \"babel-loader\": \"^8.2.3\",\n    \"babel-plugin-react-docgen-typescript\": \"^1.5.1\",\n    \"babel-plugin-react-native-web\": \"^0.18.10\",\n    \"cheerio\": \"1.0.0\",\n    \"cheerio-without-node-native\": \"0.20.2\",\n    \"copy-webpack-plugin\": \"^11.0.0\",\n    \"crypto-js\": \"^4.2.0\",\n    \"css-loader\": \"^6.8.1\",\n    \"dayjs\": \"1.10.8\",\n    \"eslint\": \"^7.32.0\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"eslint-plugin-jest\": \"^24.5.2\",\n    \"eslint-plugin-prettier\": \"^4.0.0\",\n    \"eslint-plugin-react\": \"^7.26.1\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"ignore-loader\": \"^0.1.2\",\n    \"isomorphic-unfetch\": \"^3.1.0\",\n    \"node-sass\": \"^9.0.0\",\n    \"prettier\": \"^2.6.2\",\n    \"protobufjs\": \"^8.8.0\",\n    \"sass-loader\": \"^13.3.2\",\n    \"storybook-dark-mode\": \"3.0.0\",\n    \"stream-browserify\": \"^3.0.0\",\n    \"style-loader\": \"^3.3.3\",\n    \"terser-webpack-plugin\": \"^5.3.10\",\n    \"thread-loader\": \"^4.0.2\",\n    \"ts-node\": \"^10.8.1\",\n    \"typescript\": \"~4.3.5\",\n    \"webpack-bundle-analyzer\": \"^4.10.2\"\n  }\n}\n","packages/ios/package.json":"{\n  \"name\": \"bangumi-pro\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"expo start --max-workers 4\",\n    \"dev:offline\": \"expo start --offline --max-workers 4\",\n    \"dev:tee\": \"yarn dev | tee -a output.txt\",\n    \"postinstall\": \"patch-package\",\n    \"env\": \"node ./packages/env.js\",\n    \"k\": \"sudo purge\",\n    \"kj\": \"ps -ef | grep java | awk 'NR==1 {print $2}' | xargs kill -15\",\n    \"kp\": \"lsof -i :8081 | awk 'NR>1 {print $2}' | xargs kill\",\n    \"r\": \"sudo shutdown -r now\",\n    \"top\": \"top -s 4 -o rsize\",\n    \"mv\": \"yarn k && mv ios ios_ && mv android android_\",\n    \"pub\": \"eas update --channel production --platform ios --message \\\"release\\\"\",\n    \"re\": \"mv ios_ ios && mv android_ android && yarn k\",\n    \"open:win\": \"start .\\\\android\\\\app\\\\build\\\\outputs\\\\apk\\\\release\\\\\",\n    \"build:ipa\": \"cd ios && xcodebuild -workspace Bangumi.xcworkspace -scheme Bangumi -configuration Release -sdk iphoneos CODE_SIGN_IDENTITY=\\\"\\\" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO -derivedDataPath build\",\n    \"make:ipa\": \"node web/ipa.js\",\n    \"test\": \"jest --detectOpenHandles\",\n    \"test:watch\": \"jest --watch --forceExit\",\n    \"pb:verify\": \"node scripts/pb-verify.js\",\n    \"tag:verify\": \"node scripts/tag-verify.js\",\n    \"lint:styles\": \"npx eslint 'src/**/styles.ts'\",\n    \"lint:imports\": \"npx eslint 'src/**/*.{ts,tsx}' --quiet --config eslint-rules/.eslintrc.check-imports.js\",\n    \"fixed:chown\": \"sudo chown -R $(whoami):staff node_modules metro-cache dist android ios\"\n  },\n  \"resolutions\": {\n    \"define-properties\": \"1.2.0\",\n    \"use-latest-callback\": \"0.1.9\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"2.2.0\",\n    \"@react-native-community/blur\": \"4.4.1\",\n    \"@react-native-community/cameraroll\": \"4.0.4\",\n    \"@react-native-community/slider\": \"5.2.0\",\n    \"@react-native-masked-view/masked-view\": \"0.3.2\",\n    \"@react-navigation/bottom-tabs\": \"6.5.8\",\n    \"@react-navigation/native\": \"6.1.7\",\n    \"@react-navigation/native-stack\": \"6.9.13\",\n    \"@sdcx/nested-scroll\": \"^0.14.0\",\n    \"@types/react\": \"~19.2.2\",\n    \"expo\": \"~57.0.21\",\n    \"expo-asset\": \"~57.0.16\",\n    \"expo-blur\": \"~57.0.2\",\n    \"expo-calendar\": \"~57.0.2\",\n    \"expo-constants\": \"~57.0.17\",\n    \"expo-device\": \"~57.0.1\",\n    \"expo-file-system\": \"~57.0.6\",\n    \"expo-font\": \"~57.0.3\",\n    \"expo-haptics\": \"~57.0.2\",\n    \"expo-image\": \"~57.0.4\",\n    \"expo-linear-gradient\": \"~57.0.1\",\n    \"expo-screen-orientation\": \"~57.0.2\",\n    \"expo-speech\": \"~57.0.2\",\n    \"expo-splash-screen\": \"~57.0.8\",\n    \"expo-updates\": \"~57.0.21\",\n    \"expo-web-browser\": \"~57.0.2\",\n    \"htmlparser2\": \"^3.9.0\",\n    \"mobx\": \"6.12.3\",\n    \"mobx-react\": \"9.1.1\",\n    \"patch-package\": \"6.4.7\",\n    \"postinstall-postinstall\": \"2.1.0\",\n    \"react\": \"19.2.3\",\n    \"react-native\": \"0.86.3\",\n    \"react-native-exception-handler\": \"^2.10.8\",\n    \"react-native-fast-image\": \"8.5.11\",\n    \"react-native-fs\": \"2.18.0\",\n    \"react-native-gesture-handler\": \"~2.32.0\",\n    \"react-native-pager-view\": \"8.0.2\",\n    \"react-native-realtimeblurview\": \"1.1.3\",\n    \"react-native-reanimated\": \"4.5.1\",\n    \"react-native-render-html\": \"4.1.1\",\n    \"react-native-restart\": \"0.0.14\",\n    \"react-native-safe-area-context\": \"~5.7.0\",\n    \"react-native-screens\": \"~4.26.0\",\n    \"react-native-smb\": \"^0.2.4\",\n    \"react-native-svg\": \"15.15.4\",\n    \"react-native-tab-view\": \"3.5.2\",\n    \"react-native-webview\": \"13.16.1\",\n    \"react-native-worklets\": \"0.10.1\",\n    \"rn-fetch-blob\": \"^0.12.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.25.2\",\n    \"@babel/preset-react\": \"^7.27.1\",\n    \"@react-native-community/eslint-config\": \"^3.0.1\",\n    \"@react-native/jest-preset\": \"~0.86.3\",\n    \"@testing-library/jest-native\": \"^5.4.3\",\n    \"@testing-library/react-native\": \"^13.3.3\",\n    \"@types/jest\": \"29.5.14\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.59.0\",\n    \"@typescript-eslint/parser\": \"^8.59.0\",\n    \"babel-plugin-module-resolver\": \"^5.0.2\",\n    \"cheerio\": \"1.0.0\",\n    \"cheerio-without-node-native\": \"0.20.2\",\n    \"crypto-js\": \"^4.2.0\",\n    \"dayjs\": \"1.10.8\",\n    \"eslint\": \"^8.57.1\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"eslint-plugin-bangumi\": \"file:./eslint-rules\",\n    \"eslint-plugin-prettier\": \"^4.0.0\",\n    \"eslint-plugin-react\": \"^7.26.1\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"eslint-plugin-react-native\": \"^4.0.0\",\n    \"jest\": \"^29.7.0\",\n    \"jest-expo\": \"57.0.5\",\n    \"prettier\": \"^2.6.2\",\n    \"protobufjs\": \"^8.8.0\",\n    \"stream-browserify\": \"^3.0.0\",\n    \"typescript\": \"^6.0.3\"\n  },\n  \"expo\": {\n    \"autolinking\": {\n      \"ios\": {\n        \"exclude\": [\n          \"react-native-realtimeblurview\",\n          \"@sdcx/nested-scroll\"\n        ]\n      }\n    }\n  },\n  \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n","web/tools/package.json":"{\n  \"name\": \"tools\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"cors\": \"^2.8.5\",\n    \"http-proxy\": \"^1.18.1\",\n    \"http-proxy-middleware\": \"^2.0.6\"\n  }\n}\n"},"items":[{"name":"package.json","path":"packages/android/package.json","rawUrl":"https://raw.githubusercontent.com/czy0729/Bangumi/HEAD/packages/android/package.json","title":"android","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"android\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"expo run:android\",\n    \"metro\": \"expo start --no-dev\",\n    \"postinstall\": \"patch-package\",\n    \"r\": \"sudo shutdown -r now\",\n    \"env\": \"node ./packages/env.js\",\n    \"k\": \"sudo purge\",\n    \"clean\": \"cd android && ./gradlew clean\",\n    \"build\": \"cd android && ./gradlew assembleRelease && cd .. && node web/rename.js\",\n    \"open\": \"start .\\\\android\\\\app\\\\build\\\\outputs\\\\apk\\\\release\\\\\",\n    \"open:mac\": \"open ./android/app/build/outputs/apk/release/\",\n    \"test\": \"jest\",\n    \"test:watch\": \"jest --watch\",\n    \"build:rust\": \"bash android/rust/build-android.sh\",\n    \"lint:styles\": \"npx eslint 'src/**/styles.ts'\",\n    \"lint:imports\": \"npx eslint 'src/**/*.{ts,tsx}' --quiet --config eslint-rules/.eslintrc.check-imports.js\",\n    \"lint:hooks\": \"node scripts/lint-hooks.cjs\",\n    \"fixed:chown\": \"sudo chown -R $(whoami):staff node_modules metro-cache dist android ios\"\n  },\n  \"resolutions\": {\n    \"define-properties\": \"1.2.1\",\n    \"react-native-reanimated\": \"3.6.0\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"1.18.2\",\n    \"@react-native-community/blur\": \"4.3.2\",\n    \"@react-native-community/cameraroll\": \"4.1.2\",\n    \"@react-native-community/slider\": \"4.4.2\",\n    \"@react-native-masked-view/masked-view\": \"0.2.9\",\n    \"@react-navigation/bottom-tabs\": \"6.5.8\",\n    \"@react-navigation/native\": \"6.1.7\",\n    \"@react-navigation/native-stack\": \"6.9.13\",\n    \"@sdcx/nested-scroll\": \"0.14.0\",\n    \"expo\": \"49.0.0-alpha.9\",\n    \"expo-blur\": \"12.4.1\",\n    \"expo-calendar\": \"~11.3.2\",\n    \"expo-constants\": \"14.4.2\",\n    \"expo-device\": \"5.4.0\",\n    \"expo-file-system\": \"~15.4.5\",\n    \"expo-font\": \"11.4.0\",\n    \"expo-haptics\": \"12.4.0\",\n    \"expo-keep-awake\": \"12.3.0\",\n    \"expo-linear-gradient\": \"12.3.0\",\n    \"expo-screen-orientation\": \"~6.0.6\",\n    \"expo-speech\": \"~11.3.0\",\n    \"expo-splash-screen\": \"0.20.4\",\n    \"expo-status-bar\": \"1.6.0\",\n    \"expo-web-browser\": \"12.3.2\",\n    \"mobx\": \"6.12.3\",\n    \"mobx-react\": \"9.1.1\",\n    \"patch-package\": \"7.0.2\",\n    \"postinstall-postinstall\": \"2.1.0\",\n    \"react\": \"18.2.0\",\n    \"react-native\": \"0.72.10\",\n    \"react-native-android-widget\": \"0.5.2\",\n    \"react-native-exception-handler\": \"2.10.10\",\n    \"react-native-fast-image\": \"8.6.3\",\n    \"react-native-fs\": \"2.20.0\",\n    \"react-native-gesture-handler\": \"~2.12.0\",\n    \"react-native-mmkv\": \"2.12.2\",\n    \"react-native-pager-view\": \"6.2.0\",\n    \"react-native-realtimeblurview\": \"1.1.3\",\n    \"react-native-reanimated\": \"3.6.0\",\n    \"react-native-render-html\": \"4.1.1\",\n    \"react-native-restart\": \"0.0.27\",\n    \"react-native-safe-area-context\": \"4.6.3\",\n    \"react-native-screens\": \"3.22.1\",\n    \"react-native-smb\": \"0.2.4\",\n    \"react-native-svg\": \"13.9.0\",\n    \"react-native-tab-view\": \"3.5.2\",\n    \"react-native-webview\": \"13.2.2\",\n    \"rn-fetch-blob\": \"0.12.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.20.0\",\n    \"@babel/plugin-transform-modules-commonjs\": \"^7.22.15\",\n    \"@babel/preset-react\": \"^7.22.15\",\n    \"@babel/preset-typescript\": \"^7.22.15\",\n    \"@react-native-community/eslint-config\": \"3.0.1\",\n    \"@types/jest\": \"^29.5.12\",\n    \"@types/react\": \"~18.2.14\",\n    \"@types/react-native\": \"0.67.6\",\n    \"@typescript-eslint/eslint-plugin\": \"6.2.1\",\n    \"@typescript-eslint/parser\": \"6.2.1\",\n    \"babel-plugin-jest-hoist\": \"^29.6.3\",\n    \"cheerio\": \"1.0.0\",\n    \"cheerio-without-node-native\": \"0.20.2\",\n    \"crypto-js\": \"^4.2.0\",\n    \"dayjs\": \"1.11.9\",\n    \"eslint\": \"8.46.0\",\n    \"eslint-config-prettier\": \"8.3.0\",\n    \"eslint-plugin-bangumi\": \"file:./eslint-rules\",\n    \"eslint-plugin-prettier\": \"4.0.0\",\n    \"eslint-plugin-react\": \"7.33.2\",\n    \"eslint-plugin-react-native\": \"4.0.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"2.6.2\",\n    \"protobufjs\": \"^8.8.0\",\n    \"stream-browserify\": \"3.0.0\",\n    \"typescript\": \"^5.1.3\"\n  },\n  \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n","frontmatter":{"name":"android","version":"1.0.0","main":"index.js","private":true,"scripts":{"dev":"expo run:android","metro":"expo start --no-dev","postinstall":"patch-package","r":"sudo shutdown -r now","env":"node ./packages/env.js","k":"sudo purge","clean":"cd android && ./gradlew clean","build":"cd android && ./gradlew assembleRelease && cd .. && node web/rename.js","open":"start .\\android\\app\\build\\outputs\\apk\\release\\","open:mac":"open ./android/app/build/outputs/apk/release/","test":"jest","test:watch":"jest --watch","build:rust":"bash android/rust/build-android.sh","lint:styles":"npx eslint 'src/**/styles.ts'","lint:imports":"npx eslint 'src/**/*.{ts,tsx}' --quiet --config eslint-rules/.eslintrc.check-imports.js","lint:hooks":"node scripts/lint-hooks.cjs","fixed:chown":"sudo chown -R $(whoami):staff node_modules metro-cache dist android ios"},"resolutions":{"define-properties":"1.2.1","react-native-reanimated":"3.6.0"},"dependencies":{"@react-native-async-storage/async-storage":"1.18.2","@react-native-community/blur":"4.3.2","@react-native-community/cameraroll":"4.1.2","@react-native-community/slider":"4.4.2","@react-native-masked-view/masked-view":"0.2.9","@react-navigation/bottom-tabs":"6.5.8","@react-navigation/native":"6.1.7","@react-navigation/native-stack":"6.9.13","@sdcx/nested-scroll":"0.14.0","expo":"49.0.0-alpha.9","expo-blur":"12.4.1","expo-calendar":"~11.3.2","expo-constants":"14.4.2","expo-device":"5.4.0","expo-file-system":"~15.4.5","expo-font":"11.4.0","expo-haptics":"12.4.0","expo-keep-awake":"12.3.0","expo-linear-gradient":"12.3.0","expo-screen-orientation":"~6.0.6","expo-speech":"~11.3.0","expo-splash-screen":"0.20.4","expo-status-bar":"1.6.0","expo-web-browser":"12.3.2","mobx":"6.12.3","mobx-react":"9.1.1","patch-package":"7.0.2","postinstall-postinstall":"2.1.0","react":"18.2.0","react-native":"0.72.10","react-native-android-widget":"0.5.2","react-native-exception-handler":"2.10.10","react-native-fast-image":"8.6.3","react-native-fs":"2.20.0","react-native-gesture-handler":"~2.12.0","react-native-mmkv":"2.12.2","react-native-pager-view":"6.2.0","react-native-realtimeblurview":"1.1.3","react-native-reanimated":"3.6.0","react-native-render-html":"4.1.1","react-native-restart":"0.0.27","react-native-safe-area-context":"4.6.3","react-native-screens":"3.22.1","react-native-smb":"0.2.4","react-native-svg":"13.9.0","react-native-tab-view":"3.5.2","react-native-webview":"13.2.2","rn-fetch-blob":"0.12.0"},"devDependencies":{"@babel/core":"^7.20.0","@babel/plugin-transform-modules-commonjs":"^7.22.15","@babel/preset-react":"^7.22.15","@babel/preset-typescript":"^7.22.15","@react-native-community/eslint-config":"3.0.1","@types/jest":"^29.5.12","@types/react":"~18.2.14","@types/react-native":"0.67.6","@typescript-eslint/eslint-plugin":"6.2.1","@typescript-eslint/parser":"6.2.1","babel-plugin-jest-hoist":"^29.6.3","cheerio":"1.0.0","cheerio-without-node-native":"0.20.2","crypto-js":"^4.2.0","dayjs":"1.11.9","eslint":"8.46.0","eslint-config-prettier":"8.3.0","eslint-plugin-bangumi":"file:./eslint-rules","eslint-plugin-prettier":"4.0.0","eslint-plugin-react":"7.33.2","eslint-plugin-react-native":"4.0.0","jest":"^29.7.0","prettier":"2.6.2","protobufjs":"^8.8.0","stream-browserify":"3.0.0","typescript":"^5.1.3"},"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"},"isInternal":false,"tokens":1463,"sizeBytes":4054},{"name":"package.json","path":"packages/ios/package.json","rawUrl":"https://raw.githubusercontent.com/czy0729/Bangumi/HEAD/packages/ios/package.json","title":"bangumi-pro","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"bangumi-pro\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"expo start --max-workers 4\",\n    \"dev:offline\": \"expo start --offline --max-workers 4\",\n    \"dev:tee\": \"yarn dev | tee -a output.txt\",\n    \"postinstall\": \"patch-package\",\n    \"env\": \"node ./packages/env.js\",\n    \"k\": \"sudo purge\",\n    \"kj\": \"ps -ef | grep java | awk 'NR==1 {print $2}' | xargs kill -15\",\n    \"kp\": \"lsof -i :8081 | awk 'NR>1 {print $2}' | xargs kill\",\n    \"r\": \"sudo shutdown -r now\",\n    \"top\": \"top -s 4 -o rsize\",\n    \"mv\": \"yarn k && mv ios ios_ && mv android android_\",\n    \"pub\": \"eas update --channel production --platform ios --message \\\"release\\\"\",\n    \"re\": \"mv ios_ ios && mv android_ android && yarn k\",\n    \"open:win\": \"start .\\\\android\\\\app\\\\build\\\\outputs\\\\apk\\\\release\\\\\",\n    \"build:ipa\": \"cd ios && xcodebuild -workspace Bangumi.xcworkspace -scheme Bangumi -configuration Release -sdk iphoneos CODE_SIGN_IDENTITY=\\\"\\\" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO -derivedDataPath build\",\n    \"make:ipa\": \"node web/ipa.js\",\n    \"test\": \"jest --detectOpenHandles\",\n    \"test:watch\": \"jest --watch --forceExit\",\n    \"pb:verify\": \"node scripts/pb-verify.js\",\n    \"tag:verify\": \"node scripts/tag-verify.js\",\n    \"lint:styles\": \"npx eslint 'src/**/styles.ts'\",\n    \"lint:imports\": \"npx eslint 'src/**/*.{ts,tsx}' --quiet --config eslint-rules/.eslintrc.check-imports.js\",\n    \"fixed:chown\": \"sudo chown -R $(whoami):staff node_modules metro-cache dist android ios\"\n  },\n  \"resolutions\": {\n    \"define-properties\": \"1.2.0\",\n    \"use-latest-callback\": \"0.1.9\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"2.2.0\",\n    \"@react-native-community/blur\": \"4.4.1\",\n    \"@react-native-community/cameraroll\": \"4.0.4\",\n    \"@react-native-community/slider\": \"5.2.0\",\n    \"@react-native-masked-view/masked-view\": \"0.3.2\",\n    \"@react-navigation/bottom-tabs\": \"6.5.8\",\n    \"@react-navigation/native\": \"6.1.7\",\n    \"@react-navigation/native-stack\": \"6.9.13\",\n    \"@sdcx/nested-scroll\": \"^0.14.0\",\n    \"@types/react\": \"~19.2.2\",\n    \"expo\": \"~57.0.21\",\n    \"expo-asset\": \"~57.0.16\",\n    \"expo-blur\": \"~57.0.2\",\n    \"expo-calendar\": \"~57.0.2\",\n    \"expo-constants\": \"~57.0.17\",\n    \"expo-device\": \"~57.0.1\",\n    \"expo-file-system\": \"~57.0.6\",\n    \"expo-font\": \"~57.0.3\",\n    \"expo-haptics\": \"~57.0.2\",\n    \"expo-image\": \"~57.0.4\",\n    \"expo-linear-gradient\": \"~57.0.1\",\n    \"expo-screen-orientation\": \"~57.0.2\",\n    \"expo-speech\": \"~57.0.2\",\n    \"expo-splash-screen\": \"~57.0.8\",\n    \"expo-updates\": \"~57.0.21\",\n    \"expo-web-browser\": \"~57.0.2\",\n    \"htmlparser2\": \"^3.9.0\",\n    \"mobx\": \"6.12.3\",\n    \"mobx-react\": \"9.1.1\",\n    \"patch-package\": \"6.4.7\",\n    \"postinstall-postinstall\": \"2.1.0\",\n    \"react\": \"19.2.3\",\n    \"react-native\": \"0.86.3\",\n    \"react-native-exception-handler\": \"^2.10.8\",\n    \"react-native-fast-image\": \"8.5.11\",\n    \"react-native-fs\": \"2.18.0\",\n    \"react-native-gesture-handler\": \"~2.32.0\",\n    \"react-native-pager-view\": \"8.0.2\",\n    \"react-native-realtimeblurview\": \"1.1.3\",\n    \"react-native-reanimated\": \"4.5.1\",\n    \"react-native-render-html\": \"4.1.1\",\n    \"react-native-restart\": \"0.0.14\",\n    \"react-native-safe-area-context\": \"~5.7.0\",\n    \"react-native-screens\": \"~4.26.0\",\n    \"react-native-smb\": \"^0.2.4\",\n    \"react-native-svg\": \"15.15.4\",\n    \"react-native-tab-view\": \"3.5.2\",\n    \"react-native-webview\": \"13.16.1\",\n    \"react-native-worklets\": \"0.10.1\",\n    \"rn-fetch-blob\": \"^0.12.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.25.2\",\n    \"@babel/preset-react\": \"^7.27.1\",\n    \"@react-native-community/eslint-config\": \"^3.0.1\",\n    \"@react-native/jest-preset\": \"~0.86.3\",\n    \"@testing-library/jest-native\": \"^5.4.3\",\n    \"@testing-library/react-native\": \"^13.3.3\",\n    \"@types/jest\": \"29.5.14\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.59.0\",\n    \"@typescript-eslint/parser\": \"^8.59.0\",\n    \"babel-plugin-module-resolver\": \"^5.0.2\",\n    \"cheerio\": \"1.0.0\",\n    \"cheerio-without-node-native\": \"0.20.2\",\n    \"crypto-js\": \"^4.2.0\",\n    \"dayjs\": \"1.10.8\",\n    \"eslint\": \"^8.57.1\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"eslint-plugin-bangumi\": \"file:./eslint-rules\",\n    \"eslint-plugin-prettier\": \"^4.0.0\",\n    \"eslint-plugin-react\": \"^7.26.1\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"eslint-plugin-react-native\": \"^4.0.0\",\n    \"jest\": \"^29.7.0\",\n    \"jest-expo\": \"57.0.5\",\n    \"prettier\": \"^2.6.2\",\n    \"protobufjs\": \"^8.8.0\",\n    \"stream-browserify\": \"^3.0.0\",\n    \"typescript\": \"^6.0.3\"\n  },\n  \"expo\": {\n    \"autolinking\": {\n      \"ios\": {\n        \"exclude\": [\n          \"react-native-realtimeblurview\",\n          \"@sdcx/nested-scroll\"\n        ]\n      }\n    }\n  },\n  \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n","frontmatter":{"name":"bangumi-pro","version":"1.0.0","main":"index.js","private":true,"scripts":{"dev":"expo start --max-workers 4","dev:offline":"expo start --offline --max-workers 4","dev:tee":"yarn dev | tee -a output.txt","postinstall":"patch-package","env":"node ./packages/env.js","k":"sudo purge","kj":"ps -ef | grep java | awk 'NR==1 {print $2}' | xargs kill -15","kp":"lsof -i :8081 | awk 'NR>1 {print $2}' | xargs kill","r":"sudo shutdown -r now","top":"top -s 4 -o rsize","mv":"yarn k && mv ios ios_ && mv android android_","pub":"eas update --channel production --platform ios --message \"release\"","re":"mv ios_ ios && mv android_ android && yarn k","open:win":"start .\\android\\app\\build\\outputs\\apk\\release\\","build:ipa":"cd ios && xcodebuild -workspace Bangumi.xcworkspace -scheme Bangumi -configuration Release -sdk iphoneos CODE_SIGN_IDENTITY=\"\" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO -derivedDataPath build","make:ipa":"node web/ipa.js","test":"jest --detectOpenHandles","test:watch":"jest --watch --forceExit","pb:verify":"node scripts/pb-verify.js","tag:verify":"node scripts/tag-verify.js","lint:styles":"npx eslint 'src/**/styles.ts'","lint:imports":"npx eslint 'src/**/*.{ts,tsx}' --quiet --config eslint-rules/.eslintrc.check-imports.js","fixed:chown":"sudo chown -R $(whoami):staff node_modules metro-cache dist android ios"},"resolutions":{"define-properties":"1.2.0","use-latest-callback":"0.1.9"},"dependencies":{"@react-native-async-storage/async-storage":"2.2.0","@react-native-community/blur":"4.4.1","@react-native-community/cameraroll":"4.0.4","@react-native-community/slider":"5.2.0","@react-native-masked-view/masked-view":"0.3.2","@react-navigation/bottom-tabs":"6.5.8","@react-navigation/native":"6.1.7","@react-navigation/native-stack":"6.9.13","@sdcx/nested-scroll":"^0.14.0","@types/react":"~19.2.2","expo":"~57.0.21","expo-asset":"~57.0.16","expo-blur":"~57.0.2","expo-calendar":"~57.0.2","expo-constants":"~57.0.17","expo-device":"~57.0.1","expo-file-system":"~57.0.6","expo-font":"~57.0.3","expo-haptics":"~57.0.2","expo-image":"~57.0.4","expo-linear-gradient":"~57.0.1","expo-screen-orientation":"~57.0.2","expo-speech":"~57.0.2","expo-splash-screen":"~57.0.8","expo-updates":"~57.0.21","expo-web-browser":"~57.0.2","htmlparser2":"^3.9.0","mobx":"6.12.3","mobx-react":"9.1.1","patch-package":"6.4.7","postinstall-postinstall":"2.1.0","react":"19.2.3","react-native":"0.86.3","react-native-exception-handler":"^2.10.8","react-native-fast-image":"8.5.11","react-native-fs":"2.18.0","react-native-gesture-handler":"~2.32.0","react-native-pager-view":"8.0.2","react-native-realtimeblurview":"1.1.3","react-native-reanimated":"4.5.1","react-native-render-html":"4.1.1","react-native-restart":"0.0.14","react-native-safe-area-context":"~5.7.0","react-native-screens":"~4.26.0","react-native-smb":"^0.2.4","react-native-svg":"15.15.4","react-native-tab-view":"3.5.2","react-native-webview":"13.16.1","react-native-worklets":"0.10.1","rn-fetch-blob":"^0.12.0"},"devDependencies":{"@babel/core":"^7.25.2","@babel/preset-react":"^7.27.1","@react-native-community/eslint-config":"^3.0.1","@react-native/jest-preset":"~0.86.3","@testing-library/jest-native":"^5.4.3","@testing-library/react-native":"^13.3.3","@types/jest":"29.5.14","@typescript-eslint/eslint-plugin":"^8.59.0","@typescript-eslint/parser":"^8.59.0","babel-plugin-module-resolver":"^5.0.2","cheerio":"1.0.0","cheerio-without-node-native":"0.20.2","crypto-js":"^4.2.0","dayjs":"1.10.8","eslint":"^8.57.1","eslint-config-prettier":"^8.3.0","eslint-plugin-bangumi":"file:./eslint-rules","eslint-plugin-prettier":"^4.0.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.6.0","eslint-plugin-react-native":"^4.0.0","jest":"^29.7.0","jest-expo":"57.0.5","prettier":"^2.6.2","protobufjs":"^8.8.0","stream-browserify":"^3.0.0","typescript":"^6.0.3"},"expo":{"autolinking":{"ios":{"exclude":["react-native-realtimeblurview","@sdcx/nested-scroll"]}}},"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"},"isInternal":false,"tokens":1721,"sizeBytes":4865},{"name":"package.json","path":"packages/web/package.json","rawUrl":"https://raw.githubusercontent.com/czy0729/Bangumi/HEAD/packages/web/package.json","title":"web","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"web\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"sudo STORYBOOK=true start-storybook -p 6006\",\n    \"build\": \"sudo STORYBOOK=true build-storybook\",\n    \"postinstall\": \"patch-package\",\n    \"env\": \"node ./packages/env.js\",\n    \"proxy\": \"cd ./web/tools && node proxy-api.js\",\n    \"proxy:webdav\": \"cd ./web/tools && node proxy-webdav.js\",\n    \"k\": \"sudo purge\",\n    \"r\": \"sudo shutdown -r now\"\n  },\n  \"resolutions\": {\n    \"@types/react\": \"17.0.2\",\n    \"define-properties\": \"1.2.0\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"~1.17.3\",\n    \"@react-native-community/async-storage\": \"1.12.1\",\n    \"@react-native-community/blur\": \"4.2.0\",\n    \"@react-native-community/cameraroll\": \"4.0.4\",\n    \"@react-native-community/slider\": \"^4.5.0\",\n    \"@react-native-community/viewpager\": \"5.0.11\",\n    \"@react-native-masked-view/masked-view\": \"0.2.8\",\n    \"@react-navigation/bottom-tabs\": \"~6.5.8\",\n    \"@react-navigation/native\": \"^6.1.7\",\n    \"@react-navigation/native-stack\": \"^6.9.13\",\n    \"@react-navigation/stack\": \"^6.3.17\",\n    \"@sdcx/nested-scroll\": \"^0.14.0\",\n    \"bangumi-data\": \"^0.3.118\",\n    \"devtools-detector\": \"^2.0.14\",\n    \"expo\": \"^47.0.0\",\n    \"expo-blur\": \"~12.0.1\",\n    \"expo-calendar\": \"~11.0.1\",\n    \"expo-constants\": \"~14.0.2\",\n    \"expo-device\": \"~5.0.0\",\n    \"expo-file-system\": \"~15.1.1\",\n    \"expo-font\": \"~11.0.1\",\n    \"expo-haptics\": \"~12.0.1\",\n    \"expo-linear-gradient\": \"~12.0.1\",\n    \"expo-modules-core\": \"~1.0.4 || ~1.1.1\",\n    \"expo-screen-orientation\": \"~5.0.1\",\n    \"expo-splash-screen\": \"~0.17.5\",\n    \"expo-updates\": \"~0.15.6\",\n    \"expo-web-browser\": \"~12.0.0\",\n    \"htmlparser2\": \"^3.9.0\",\n    \"idb\": \"^7.1.1\",\n    \"lodash\": \"^4.17.4\",\n    \"mobx\": \"6.8.0\",\n    \"mobx-react\": \"7.6.0\",\n    \"patch-package\": \"6.4.7\",\n    \"postinstall-postinstall\": \"2.1.0\",\n    \"rc-dropdown\": \"^4.1.0\",\n    \"react\": \"18.3.1\",\n    \"react-dom\": \"18.3.1\",\n    \"react-ios-corners\": \"^1.0.0\",\n    \"react-native\": \"0.70.5\",\n    \"react-native-draggable-grid\": \"^2.1.4\",\n    \"react-native-exception-handler\": \"^2.10.8\",\n    \"react-native-fast-image\": \"8.5.11\",\n    \"react-native-fs\": \"2.18.0\",\n    \"react-native-gesture-handler\": \"~2.8.0\",\n    \"react-native-pager-view\": \"^6.2.3\",\n    \"react-native-realtimeblurview\": \"^1.1.3\",\n    \"react-native-reanimated\": \"~2.12.0\",\n    \"react-native-render-html\": \"4.1.1\",\n    \"react-native-restart\": \"0.0.14\",\n    \"react-native-safe-area-context\": \"4.4.1\",\n    \"react-native-screens\": \"~3.18.0\",\n    \"react-native-smb\": \"^0.2.4\",\n    \"react-native-tab-view\": \"2.14.3\",\n    \"react-native-web\": \"~0.18.7\",\n    \"react-native-webview\": \"11.23.1\",\n    \"recyclerlistview\": \"^4.0.1\",\n    \"rn-fetch-blob\": \"^0.12.0\",\n    \"workbox-webpack-plugin\": \"^7.0.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.19.3\",\n    \"@babel/plugin-proposal-class-properties\": \"^7.18.6\",\n    \"@babel/plugin-proposal-decorators\": \"^7.21.0\",\n    \"@babel/plugin-transform-export-namespace-from\": \"^7.22.11\",\n    \"@react-native-community/eslint-config\": \"^3.0.1\",\n    \"@storybook/addon-actions\": \"~6.5\",\n    \"@storybook/addon-controls\": \"~6.5\",\n    \"@storybook/addon-essentials\": \"~6.5\",\n    \"@storybook/addon-links\": \"~6.5\",\n    \"@storybook/addon-ondevice-actions\": \"~6.5\",\n    \"@storybook/addon-ondevice-backgrounds\": \"~6.5\",\n    \"@storybook/addon-ondevice-controls\": \"~6.5\",\n    \"@storybook/addon-ondevice-notes\": \"~6.5\",\n    \"@storybook/addon-react-native-web\": \"^0.0.19\",\n    \"@storybook/builder-webpack5\": \"~6.5\",\n    \"@storybook/manager-webpack5\": \"~6.5\",\n    \"@storybook/preview-web\": \"~6.5\",\n    \"@storybook/react\": \"~6.5\",\n    \"@storybook/react-native\": \"~6.5\",\n    \"@types/react\": \"~17.0.21\",\n    \"@types/react-native\": \"~0.67.6\",\n    \"@typescript-eslint/eslint-plugin\": \"^5.0.0\",\n    \"@typescript-eslint/parser\": \"^4.33.0\",\n    \"babel-loader\": \"^8.2.3\",\n    \"babel-plugin-react-docgen-typescript\": \"^1.5.1\",\n    \"babel-plugin-react-native-web\": \"^0.18.10\",\n    \"cheerio\": \"1.0.0\",\n    \"cheerio-without-node-native\": \"0.20.2\",\n    \"copy-webpack-plugin\": \"^11.0.0\",\n    \"crypto-js\": \"^4.2.0\",\n    \"css-loader\": \"^6.8.1\",\n    \"dayjs\": \"1.10.8\",\n    \"eslint\": \"^7.32.0\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"eslint-plugin-jest\": \"^24.5.2\",\n    \"eslint-plugin-prettier\": \"^4.0.0\",\n    \"eslint-plugin-react\": \"^7.26.1\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"ignore-loader\": \"^0.1.2\",\n    \"isomorphic-unfetch\": \"^3.1.0\",\n    \"node-sass\": \"^9.0.0\",\n    \"prettier\": \"^2.6.2\",\n    \"protobufjs\": \"^8.8.0\",\n    \"sass-loader\": \"^13.3.2\",\n    \"storybook-dark-mode\": \"3.0.0\",\n    \"stream-browserify\": \"^3.0.0\",\n    \"style-loader\": \"^3.3.3\",\n    \"terser-webpack-plugin\": \"^5.3.10\",\n    \"thread-loader\": \"^4.0.2\",\n    \"ts-node\": \"^10.8.1\",\n    \"typescript\": \"~4.3.5\",\n    \"webpack-bundle-analyzer\": \"^4.10.2\"\n  }\n}\n","frontmatter":{"name":"web","version":"1.0.0","main":"index.js","private":true,"scripts":{"dev":"sudo STORYBOOK=true start-storybook -p 6006","build":"sudo STORYBOOK=true build-storybook","postinstall":"patch-package","env":"node ./packages/env.js","proxy":"cd ./web/tools && node proxy-api.js","proxy:webdav":"cd ./web/tools && node proxy-webdav.js","k":"sudo purge","r":"sudo shutdown -r now"},"resolutions":{"@types/react":"17.0.2","define-properties":"1.2.0"},"dependencies":{"@react-native-async-storage/async-storage":"~1.17.3","@react-native-community/async-storage":"1.12.1","@react-native-community/blur":"4.2.0","@react-native-community/cameraroll":"4.0.4","@react-native-community/slider":"^4.5.0","@react-native-community/viewpager":"5.0.11","@react-native-masked-view/masked-view":"0.2.8","@react-navigation/bottom-tabs":"~6.5.8","@react-navigation/native":"^6.1.7","@react-navigation/native-stack":"^6.9.13","@react-navigation/stack":"^6.3.17","@sdcx/nested-scroll":"^0.14.0","bangumi-data":"^0.3.118","devtools-detector":"^2.0.14","expo":"^47.0.0","expo-blur":"~12.0.1","expo-calendar":"~11.0.1","expo-constants":"~14.0.2","expo-device":"~5.0.0","expo-file-system":"~15.1.1","expo-font":"~11.0.1","expo-haptics":"~12.0.1","expo-linear-gradient":"~12.0.1","expo-modules-core":"~1.0.4 || ~1.1.1","expo-screen-orientation":"~5.0.1","expo-splash-screen":"~0.17.5","expo-updates":"~0.15.6","expo-web-browser":"~12.0.0","htmlparser2":"^3.9.0","idb":"^7.1.1","lodash":"^4.17.4","mobx":"6.8.0","mobx-react":"7.6.0","patch-package":"6.4.7","postinstall-postinstall":"2.1.0","rc-dropdown":"^4.1.0","react":"18.3.1","react-dom":"18.3.1","react-ios-corners":"^1.0.0","react-native":"0.70.5","react-native-draggable-grid":"^2.1.4","react-native-exception-handler":"^2.10.8","react-native-fast-image":"8.5.11","react-native-fs":"2.18.0","react-native-gesture-handler":"~2.8.0","react-native-pager-view":"^6.2.3","react-native-realtimeblurview":"^1.1.3","react-native-reanimated":"~2.12.0","react-native-render-html":"4.1.1","react-native-restart":"0.0.14","react-native-safe-area-context":"4.4.1","react-native-screens":"~3.18.0","react-native-smb":"^0.2.4","react-native-tab-view":"2.14.3","react-native-web":"~0.18.7","react-native-webview":"11.23.1","recyclerlistview":"^4.0.1","rn-fetch-blob":"^0.12.0","workbox-webpack-plugin":"^7.0.0"},"devDependencies":{"@babel/core":"^7.19.3","@babel/plugin-proposal-class-properties":"^7.18.6","@babel/plugin-proposal-decorators":"^7.21.0","@babel/plugin-transform-export-namespace-from":"^7.22.11","@react-native-community/eslint-config":"^3.0.1","@storybook/addon-actions":"~6.5","@storybook/addon-controls":"~6.5","@storybook/addon-essentials":"~6.5","@storybook/addon-links":"~6.5","@storybook/addon-ondevice-actions":"~6.5","@storybook/addon-ondevice-backgrounds":"~6.5","@storybook/addon-ondevice-controls":"~6.5","@storybook/addon-ondevice-notes":"~6.5","@storybook/addon-react-native-web":"^0.0.19","@storybook/builder-webpack5":"~6.5","@storybook/manager-webpack5":"~6.5","@storybook/preview-web":"~6.5","@storybook/react":"~6.5","@storybook/react-native":"~6.5","@types/react":"~17.0.21","@types/react-native":"~0.67.6","@typescript-eslint/eslint-plugin":"^5.0.0","@typescript-eslint/parser":"^4.33.0","babel-loader":"^8.2.3","babel-plugin-react-docgen-typescript":"^1.5.1","babel-plugin-react-native-web":"^0.18.10","cheerio":"1.0.0","cheerio-without-node-native":"0.20.2","copy-webpack-plugin":"^11.0.0","crypto-js":"^4.2.0","css-loader":"^6.8.1","dayjs":"1.10.8","eslint":"^7.32.0","eslint-config-prettier":"^8.3.0","eslint-plugin-jest":"^24.5.2","eslint-plugin-prettier":"^4.0.0","eslint-plugin-react":"^7.26.1","eslint-plugin-react-hooks":"^4.6.0","ignore-loader":"^0.1.2","isomorphic-unfetch":"^3.1.0","node-sass":"^9.0.0","prettier":"^2.6.2","protobufjs":"^8.8.0","sass-loader":"^13.3.2","storybook-dark-mode":"3.0.0","stream-browserify":"^3.0.0","style-loader":"^3.3.3","terser-webpack-plugin":"^5.3.10","thread-loader":"^4.0.2","ts-node":"^10.8.1","typescript":"~4.3.5","webpack-bundle-analyzer":"^4.10.2"}},"isInternal":false,"tokens":1709,"sizeBytes":4828},{"name":"package.json","path":"web/tools/package.json","rawUrl":"https://raw.githubusercontent.com/czy0729/Bangumi/HEAD/web/tools/package.json","title":"tools","category":"anthropic-skill","format":"json","content":"{\n  \"name\": \"tools\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"cors\": \"^2.8.5\",\n    \"http-proxy\": \"^1.18.1\",\n    \"http-proxy-middleware\": \"^2.0.6\"\n  }\n}\n","frontmatter":{"name":"tools","version":"1.0.0","description":"","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":"","license":"ISC","dependencies":{"cors":"^2.8.5","http-proxy":"^1.18.1","http-proxy-middleware":"^2.0.6"}},"isInternal":false,"tokens":114,"sizeBytes":315},{"name":"CLAUDE.md","path":"CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/czy0729/Bangumi/HEAD/CLAUDE.md","title":"Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# Bangumi32\n\nbgm.tv (Bangumi) 第三方客户端，React Native (Expo SDK 54) 项目。作者: czy0729\n\n## ⛔ 最高优先级：只改不动暂存区\n\n未经用户**当次明确要求**，绝对禁止执行任何修改暂存区或版本历史的操作：\n\n- 禁止 `git add`、`git commit`、`git push`\n- 禁止 `git stash`、`git restore --staged`、`git rm --cached` 等一切触碰索引的命令\n- 所有改动只停留在工作区（unstaged），暂存与否完全由用户自己决定\n- 用户要求\"审查暂存代码\"时，只读 diff 并给结论，不得顺手把修正并入暂存区\n\n违反此条比代码写得差更严重。\n\n## ⛔ 依赖迭代：不碰 *.lock\n\n- 任何情况下禁止修改 `*.lock`（yarn.lock、package-lock.json、Podfile.lock 等）：不编辑、不生成、不删除\n- 禁止运行 `yarn install` / `npm install` / `pod install` 等会改动 lock 或 node_modules 的命令；依赖增删只改 `package.json`（含 `resolutions`）与源码\n- lock 刷新、原生工程同步（pod install / gradle sync）、真机回归由用户执行；AI 须在方案中显式列出这些\"待用户自理项\"\n\n## 通用\n\n- 优先选择编辑而非重写整个文件\n- 除非文件被编辑过，否则不要重复阅读已读过的文件\n- 输出追求简洁，但推理过程必须详尽\n\n\n## 详细规范（按需读取）\n\n> 触发对应业务时读取对应文件，不要一次性全部加载。\n\n| 场景                                       | 文档                                                         |\n| ------------------------------------------ | ------------------------------------------------------------ |\n| 了解项目结构、技术栈、路径别名、导航、构建 | [.claude/docs/architecture.md](.claude/docs/architecture.md) |\n| 新建/修改页面（Screen）                    | [.claude/docs/screen.md](.claude/docs/screen.md)             |\n| 查找/定位某个页面                          | [.claude/docs/screens.md](.claude/docs/screens.md)           |\n| 新建/修改可复用组件（components/）         | [.claude/docs/component.md](.claude/docs/component.md)       |\n| 新建/修改 MobX Store                       | [.claude/docs/store.md](.claude/docs/store.md)               |\n| API 请求相关                               | [.claude/docs/api.md](.claude/docs/api.md)                   |\n| 测试规范                                   | [.claude/docs/testing.md](.claude/docs/testing.md)           |\n| Token 预算规则                             | [.claude/docs/token-budget.md](.claude/docs/token-budget.md) |\n| 代码规范与风格                             | [.claude/docs/code-style.md](.claude/docs/code-style.md)     |\n\n## 文档维护\n\n当以下情况发生时，主动更新 `.claude/docs/` 中对应的文档：\n\n- 新增或重构了页面模板/约定 → 更新 `screen.md`\n- 新增/删除/重命名了页面 → 更新 `screens.md`\n- 新增或重构了可复用组件模式 → 更新 `component.md`\n- Store 继承链或文件结构变化 → 更新 `store.md`\n- API 请求方式或常量位置变化 → 更新 `api.md`\n- 新增路径别名、导航结构变化、技术栈升级 → 更新 `architecture.md`\n- 发现代码风格约定与文档不符 → 更新 `code-style.md`\n- 测试规范变化 → 更新 `testing.md`\n\n原则：改了什么就更新什么，不要等用户提醒。\n","isInternal":false,"tokens":1003,"sizeBytes":3392}],"systemPromptSnippet":"<yakaai_skills repo=\"czy0729/Bangumi\">\n<!-- File: packages/android/package.json (Tokens: ~1463 | Category: anthropic-skill) -->\n{\n  \"name\": \"android\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"expo run:android\",\n    \"metro\": \"expo start --no-dev\",\n    \"postinstall\": \"patch-package\",\n    \"r\": \"sudo shutdown -r now\",\n    \"env\": \"node ./packages/env.js\",\n    \"k\": \"sudo purge\",\n    \"clean\": \"cd android && ./gradlew clean\",\n    \"build\": \"cd android && ./gradlew assembleRelease && cd .. && node web/rename.js\",\n    \"open\": \"start .\\\\android\\\\app\\\\build\\\\outputs\\\\apk\\\\release\\\\\",\n    \"open:mac\": \"open ./android/app/build/outputs/apk/release/\",\n    \"test\": \"jest\",\n    \"test:watch\": \"jest --watch\",\n    \"build:rust\": \"bash android/rust/build-android.sh\",\n    \"lint:styles\": \"npx eslint 'src/**/styles.ts'\",\n    \"lint:imports\": \"npx eslint 'src/**/*.{ts,tsx}' --quiet --config eslint-rules/.eslintrc.check-imports.js\",\n    \"lint:hooks\": \"node scripts/lint-hooks.cjs\",\n    \"fixed:chown\": \"sudo chown -R $(whoami):staff node_modules metro-cache dist android ios\"\n  },\n  \"resolutions\": {\n    \"define-properties\": \"1.2.1\",\n    \"react-native-reanimated\": \"3.6.0\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"1.18.2\",\n    \"@react-native-community/blur\": \"4.3.2\",\n    \"@react-native-community/cameraroll\": \"4.1.2\",\n    \"@react-native-community/slider\": \"4.4.2\",\n    \"@react-native-masked-view/masked-view\": \"0.2.9\",\n    \"@react-navigation/bottom-tabs\": \"6.5.8\",\n    \"@react-navigation/native\": \"6.1.7\",\n    \"@react-navigation/native-stack\": \"6.9.13\",\n    \"@sdcx/nested-scroll\": \"0.14.0\",\n    \"expo\": \"49.0.0-alpha.9\",\n    \"expo-blur\": \"12.4.1\",\n    \"expo-calendar\": \"~11.3.2\",\n    \"expo-constants\": \"14.4.2\",\n    \"expo-device\": \"5.4.0\",\n    \"expo-file-system\": \"~15.4.5\",\n    \"expo-font\": \"11.4.0\",\n    \"expo-haptics\": \"12.4.0\",\n    \"expo-keep-awake\": \"12.3.0\",\n    \"expo-linear-gradient\": \"12.3.0\",\n    \"expo-screen-orientation\": \"~6.0.6\",\n    \"expo-speech\": \"~11.3.0\",\n    \"expo-splash-screen\": \"0.20.4\",\n    \"expo-status-bar\": \"1.6.0\",\n    \"expo-web-browser\": \"12.3.2\",\n    \"mobx\": \"6.12.3\",\n    \"mobx-react\": \"9.1.1\",\n    \"patch-package\": \"7.0.2\",\n    \"postinstall-postinstall\": \"2.1.0\",\n    \"react\": \"18.2.0\",\n    \"react-native\": \"0.72.10\",\n    \"react-native-android-widget\": \"0.5.2\",\n    \"react-native-exception-handler\": \"2.10.10\",\n    \"react-native-fast-image\": \"8.6.3\",\n    \"react-native-fs\": \"2.20.0\",\n    \"react-native-gesture-handler\": \"~2.12.0\",\n    \"react-native-mmkv\": \"2.12.2\",\n    \"react-native-pager-view\": \"6.2.0\",\n    \"react-native-realtimeblurview\": \"1.1.3\",\n    \"react-native-reanimated\": \"3.6.0\",\n    \"react-native-render-html\": \"4.1.1\",\n    \"react-native-restart\": \"0.0.27\",\n    \"react-native-safe-area-context\": \"4.6.3\",\n    \"react-native-screens\": \"3.22.1\",\n    \"react-native-smb\": \"0.2.4\",\n    \"react-native-svg\": \"13.9.0\",\n    \"react-native-tab-view\": \"3.5.2\",\n    \"react-native-webview\": \"13.2.2\",\n    \"rn-fetch-blob\": \"0.12.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.20.0\",\n    \"@babel/plugin-transform-modules-commonjs\": \"^7.22.15\",\n    \"@babel/preset-react\": \"^7.22.15\",\n    \"@babel/preset-typescript\": \"^7.22.15\",\n    \"@react-native-community/eslint-config\": \"3.0.1\",\n    \"@types/jest\": \"^29.5.12\",\n    \"@types/react\": \"~18.2.14\",\n    \"@types/react-native\": \"0.67.6\",\n    \"@typescript-eslint/eslint-plugin\": \"6.2.1\",\n    \"@typescript-eslint/parser\": \"6.2.1\",\n    \"babel-plugin-jest-hoist\": \"^29.6.3\",\n    \"cheerio\": \"1.0.0\",\n    \"cheerio-without-node-native\": \"0.20.2\",\n    \"crypto-js\": \"^4.2.0\",\n    \"dayjs\": \"1.11.9\",\n    \"eslint\": \"8.46.0\",\n    \"eslint-config-prettier\": \"8.3.0\",\n    \"eslint-plugin-bangumi\": \"file:./eslint-rules\",\n    \"eslint-plugin-prettier\": \"4.0.0\",\n    \"eslint-plugin-react\": \"7.33.2\",\n    \"eslint-plugin-react-native\": \"4.0.0\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"2.6.2\",\n    \"protobufjs\": \"^8.8.0\",\n    \"stream-browserify\": \"3.0.0\",\n    \"typescript\": \"^5.1.3\"\n  },\n  \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n\n<!-- File: packages/ios/package.json (Tokens: ~1721 | Category: anthropic-skill) -->\n{\n  \"name\": \"bangumi-pro\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"expo start --max-workers 4\",\n    \"dev:offline\": \"expo start --offline --max-workers 4\",\n    \"dev:tee\": \"yarn dev | tee -a output.txt\",\n    \"postinstall\": \"patch-package\",\n    \"env\": \"node ./packages/env.js\",\n    \"k\": \"sudo purge\",\n    \"kj\": \"ps -ef | grep java | awk 'NR==1 {print $2}' | xargs kill -15\",\n    \"kp\": \"lsof -i :8081 | awk 'NR>1 {print $2}' | xargs kill\",\n    \"r\": \"sudo shutdown -r now\",\n    \"top\": \"top -s 4 -o rsize\",\n    \"mv\": \"yarn k && mv ios ios_ && mv android android_\",\n    \"pub\": \"eas update --channel production --platform ios --message \\\"release\\\"\",\n    \"re\": \"mv ios_ ios && mv android_ android && yarn k\",\n    \"open:win\": \"start .\\\\android\\\\app\\\\build\\\\outputs\\\\apk\\\\release\\\\\",\n    \"build:ipa\": \"cd ios && xcodebuild -workspace Bangumi.xcworkspace -scheme Bangumi -configuration Release -sdk iphoneos CODE_SIGN_IDENTITY=\\\"\\\" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO -derivedDataPath build\",\n    \"make:ipa\": \"node web/ipa.js\",\n    \"test\": \"jest --detectOpenHandles\",\n    \"test:watch\": \"jest --watch --forceExit\",\n    \"pb:verify\": \"node scripts/pb-verify.js\",\n    \"tag:verify\": \"node scripts/tag-verify.js\",\n    \"lint:styles\": \"npx eslint 'src/**/styles.ts'\",\n    \"lint:imports\": \"npx eslint 'src/**/*.{ts,tsx}' --quiet --config eslint-rules/.eslintrc.check-imports.js\",\n    \"fixed:chown\": \"sudo chown -R $(whoami):staff node_modules metro-cache dist android ios\"\n  },\n  \"resolutions\": {\n    \"define-properties\": \"1.2.0\",\n    \"use-latest-callback\": \"0.1.9\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"2.2.0\",\n    \"@react-native-community/blur\": \"4.4.1\",\n    \"@react-native-community/cameraroll\": \"4.0.4\",\n    \"@react-native-community/slider\": \"5.2.0\",\n    \"@react-native-masked-view/masked-view\": \"0.3.2\",\n    \"@react-navigation/bottom-tabs\": \"6.5.8\",\n    \"@react-navigation/native\": \"6.1.7\",\n    \"@react-navigation/native-stack\": \"6.9.13\",\n    \"@sdcx/nested-scroll\": \"^0.14.0\",\n    \"@types/react\": \"~19.2.2\",\n    \"expo\": \"~57.0.21\",\n    \"expo-asset\": \"~57.0.16\",\n    \"expo-blur\": \"~57.0.2\",\n    \"expo-calendar\": \"~57.0.2\",\n    \"expo-constants\": \"~57.0.17\",\n    \"expo-device\": \"~57.0.1\",\n    \"expo-file-system\": \"~57.0.6\",\n    \"expo-font\": \"~57.0.3\",\n    \"expo-haptics\": \"~57.0.2\",\n    \"expo-image\": \"~57.0.4\",\n    \"expo-linear-gradient\": \"~57.0.1\",\n    \"expo-screen-orientation\": \"~57.0.2\",\n    \"expo-speech\": \"~57.0.2\",\n    \"expo-splash-screen\": \"~57.0.8\",\n    \"expo-updates\": \"~57.0.21\",\n    \"expo-web-browser\": \"~57.0.2\",\n    \"htmlparser2\": \"^3.9.0\",\n    \"mobx\": \"6.12.3\",\n    \"mobx-react\": \"9.1.1\",\n    \"patch-package\": \"6.4.7\",\n    \"postinstall-postinstall\": \"2.1.0\",\n    \"react\": \"19.2.3\",\n    \"react-native\": \"0.86.3\",\n    \"react-native-exception-handler\": \"^2.10.8\",\n    \"react-native-fast-image\": \"8.5.11\",\n    \"react-native-fs\": \"2.18.0\",\n    \"react-native-gesture-handler\": \"~2.32.0\",\n    \"react-native-pager-view\": \"8.0.2\",\n    \"react-native-realtimeblurview\": \"1.1.3\",\n    \"react-native-reanimated\": \"4.5.1\",\n    \"react-native-render-html\": \"4.1.1\",\n    \"react-native-restart\": \"0.0.14\",\n    \"react-native-safe-area-context\": \"~5.7.0\",\n    \"react-native-screens\": \"~4.26.0\",\n    \"react-native-smb\": \"^0.2.4\",\n    \"react-native-svg\": \"15.15.4\",\n    \"react-native-tab-view\": \"3.5.2\",\n    \"react-native-webview\": \"13.16.1\",\n    \"react-native-worklets\": \"0.10.1\",\n    \"rn-fetch-blob\": \"^0.12.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.25.2\",\n    \"@babel/preset-react\": \"^7.27.1\",\n    \"@react-native-community/eslint-config\": \"^3.0.1\",\n    \"@react-native/jest-preset\": \"~0.86.3\",\n    \"@testing-library/jest-native\": \"^5.4.3\",\n    \"@testing-library/react-native\": \"^13.3.3\",\n    \"@types/jest\": \"29.5.14\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.59.0\",\n    \"@typescript-eslint/parser\": \"^8.59.0\",\n    \"babel-plugin-module-resolver\": \"^5.0.2\",\n    \"cheerio\": \"1.0.0\",\n    \"cheerio-without-node-native\": \"0.20.2\",\n    \"crypto-js\": \"^4.2.0\",\n    \"dayjs\": \"1.10.8\",\n    \"eslint\": \"^8.57.1\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"eslint-plugin-bangumi\": \"file:./eslint-rules\",\n    \"eslint-plugin-prettier\": \"^4.0.0\",\n    \"eslint-plugin-react\": \"^7.26.1\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"eslint-plugin-react-native\": \"^4.0.0\",\n    \"jest\": \"^29.7.0\",\n    \"jest-expo\": \"57.0.5\",\n    \"prettier\": \"^2.6.2\",\n    \"protobufjs\": \"^8.8.0\",\n    \"stream-browserify\": \"^3.0.0\",\n    \"typescript\": \"^6.0.3\"\n  },\n  \"expo\": {\n    \"autolinking\": {\n      \"ios\": {\n        \"exclude\": [\n          \"react-native-realtimeblurview\",\n          \"@sdcx/nested-scroll\"\n        ]\n      }\n    }\n  },\n  \"packageManager\": \"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e\"\n}\n\n<!-- File: packages/web/package.json (Tokens: ~1709 | Category: anthropic-skill) -->\n{\n  \"name\": \"web\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"sudo STORYBOOK=true start-storybook -p 6006\",\n    \"build\": \"sudo STORYBOOK=true build-storybook\",\n    \"postinstall\": \"patch-package\",\n    \"env\": \"node ./packages/env.js\",\n    \"proxy\": \"cd ./web/tools && node proxy-api.js\",\n    \"proxy:webdav\": \"cd ./web/tools && node proxy-webdav.js\",\n    \"k\": \"sudo purge\",\n    \"r\": \"sudo shutdown -r now\"\n  },\n  \"resolutions\": {\n    \"@types/react\": \"17.0.2\",\n    \"define-properties\": \"1.2.0\"\n  },\n  \"dependencies\": {\n    \"@react-native-async-storage/async-storage\": \"~1.17.3\",\n    \"@react-native-community/async-storage\": \"1.12.1\",\n    \"@react-native-community/blur\": \"4.2.0\",\n    \"@react-native-community/cameraroll\": \"4.0.4\",\n    \"@react-native-community/slider\": \"^4.5.0\",\n    \"@react-native-community/viewpager\": \"5.0.11\",\n    \"@react-native-masked-view/masked-view\": \"0.2.8\",\n    \"@react-navigation/bottom-tabs\": \"~6.5.8\",\n    \"@react-navigation/native\": \"^6.1.7\",\n    \"@react-navigation/native-stack\": \"^6.9.13\",\n    \"@react-navigation/stack\": \"^6.3.17\",\n    \"@sdcx/nested-scroll\": \"^0.14.0\",\n    \"bangumi-data\": \"^0.3.118\",\n    \"devtools-detector\": \"^2.0.14\",\n    \"expo\": \"^47.0.0\",\n    \"expo-blur\": \"~12.0.1\",\n    \"expo-calendar\": \"~11.0.1\",\n    \"expo-constants\": \"~14.0.2\",\n    \"expo-device\": \"~5.0.0\",\n    \"expo-file-system\": \"~15.1.1\",\n    \"expo-font\": \"~11.0.1\",\n    \"expo-haptics\": \"~12.0.1\",\n    \"expo-linear-gradient\": \"~12.0.1\",\n    \"expo-modules-core\": \"~1.0.4 || ~1.1.1\",\n    \"expo-screen-orientation\": \"~5.0.1\",\n    \"expo-splash-screen\": \"~0.17.5\",\n    \"expo-updates\": \"~0.15.6\",\n    \"expo-web-browser\": \"~12.0.0\",\n    \"htmlparser2\": \"^3.9.0\",\n    \"idb\": \"^7.1.1\",\n    \"lodash\": \"^4.17.4\",\n    \"mobx\": \"6.8.0\",\n    \"mobx-react\": \"7.6.0\",\n    \"patch-package\": \"6.4.7\",\n    \"postinstall-postinstall\": \"2.1.0\",\n    \"rc-dropdown\": \"^4.1.0\",\n    \"react\": \"18.3.1\",\n    \"react-dom\": \"18.3.1\",\n    \"react-ios-corners\": \"^1.0.0\",\n    \"react-native\": \"0.70.5\",\n    \"react-native-draggable-grid\": \"^2.1.4\",\n    \"react-native-exception-handler\": \"^2.10.8\",\n    \"react-native-fast-image\": \"8.5.11\",\n    \"react-native-fs\": \"2.18.0\",\n    \"react-native-gesture-handler\": \"~2.8.0\",\n    \"react-native-pager-view\": \"^6.2.3\",\n    \"react-native-realtimeblurview\": \"^1.1.3\",\n    \"react-native-reanimated\": \"~2.12.0\",\n    \"react-native-render-html\": \"4.1.1\",\n    \"react-native-restart\": \"0.0.14\",\n    \"react-native-safe-area-context\": \"4.4.1\",\n    \"react-native-screens\": \"~3.18.0\",\n    \"react-native-smb\": \"^0.2.4\",\n    \"react-native-tab-view\": \"2.14.3\",\n    \"react-native-web\": \"~0.18.7\",\n    \"react-native-webview\": \"11.23.1\",\n    \"recyclerlistview\": \"^4.0.1\",\n    \"rn-fetch-blob\": \"^0.12.0\",\n    \"workbox-webpack-plugin\": \"^7.0.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.19.3\",\n    \"@babel/plugin-proposal-class-properties\": \"^7.18.6\",\n    \"@babel/plugin-proposal-decorators\": \"^7.21.0\",\n    \"@babel/plugin-transform-export-namespace-from\": \"^7.22.11\",\n    \"@react-native-community/eslint-config\": \"^3.0.1\",\n    \"@storybook/addon-actions\": \"~6.5\",\n    \"@storybook/addon-controls\": \"~6.5\",\n    \"@storybook/addon-essentials\": \"~6.5\",\n    \"@storybook/addon-links\": \"~6.5\",\n    \"@storybook/addon-ondevice-actions\": \"~6.5\",\n    \"@storybook/addon-ondevice-backgrounds\": \"~6.5\",\n    \"@storybook/addon-ondevice-controls\": \"~6.5\",\n    \"@storybook/addon-ondevice-notes\": \"~6.5\",\n    \"@storybook/addon-react-native-web\": \"^0.0.19\",\n    \"@storybook/builder-webpack5\": \"~6.5\",\n    \"@storybook/manager-webpack5\": \"~6.5\",\n    \"@storybook/preview-web\": \"~6.5\",\n    \"@storybook/react\": \"~6.5\",\n    \"@storybook/react-native\": \"~6.5\",\n    \"@types/react\": \"~17.0.21\",\n    \"@types/react-native\": \"~0.67.6\",\n    \"@typescript-eslint/eslint-plugin\": \"^5.0.0\",\n    \"@typescript-eslint/parser\": \"^4.33.0\",\n    \"babel-loader\": \"^8.2.3\",\n    \"babel-plugin-react-docgen-typescript\": \"^1.5.1\",\n    \"babel-plugin-react-native-web\": \"^0.18.10\",\n    \"cheerio\": \"1.0.0\",\n    \"cheerio-without-node-native\": \"0.20.2\",\n    \"copy-webpack-plugin\": \"^11.0.0\",\n    \"crypto-js\": \"^4.2.0\",\n    \"css-loader\": \"^6.8.1\",\n    \"dayjs\": \"1.10.8\",\n    \"eslint\": \"^7.32.0\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"eslint-plugin-jest\": \"^24.5.2\",\n    \"eslint-plugin-prettier\": \"^4.0.0\",\n    \"eslint-plugin-react\": \"^7.26.1\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"ignore-loader\": \"^0.1.2\",\n    \"isomorphic-unfetch\": \"^3.1.0\",\n    \"node-sass\": \"^9.0.0\",\n    \"prettier\": \"^2.6.2\",\n    \"protobufjs\": \"^8.8.0\",\n    \"sass-loader\": \"^13.3.2\",\n    \"storybook-dark-mode\": \"3.0.0\",\n    \"stream-browserify\": \"^3.0.0\",\n    \"style-loader\": \"^3.3.3\",\n    \"terser-webpack-plugin\": \"^5.3.10\",\n    \"thread-loader\": \"^4.0.2\",\n    \"ts-node\": \"^10.8.1\",\n    \"typescript\": \"~4.3.5\",\n    \"webpack-bundle-analyzer\": \"^4.10.2\"\n  }\n}\n\n<!-- File: web/tools/package.json (Tokens: ~114 | Category: anthropic-skill) -->\n{\n  \"name\": \"tools\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"cors\": \"^2.8.5\",\n    \"http-proxy\": \"^1.18.1\",\n    \"http-proxy-middleware\": \"^2.0.6\"\n  }\n}\n\n<!-- File: CLAUDE.md (Tokens: ~1003 | Category: claude-rule) -->\n# Bangumi32\n\nbgm.tv (Bangumi) 第三方客户端，React Native (Expo SDK 54) 项目。作者: czy0729\n\n## ⛔ 最高优先级：只改不动暂存区\n\n未经用户**当次明确要求**，绝对禁止执行任何修改暂存区或版本历史的操作：\n\n- 禁止 `git add`、`git commit`、`git push`\n- 禁止 `git stash`、`git restore --staged`、`git rm --cached` 等一切触碰索引的命令\n- 所有改动只停留在工作区（unstaged），暂存与否完全由用户自己决定\n- 用户要求\"审查暂存代码\"时，只读 diff 并给结论，不得顺手把修正并入暂存区\n\n违反此条比代码写得差更严重。\n\n## ⛔ 依赖迭代：不碰 *.lock\n\n- 任何情况下禁止修改 `*.lock`（yarn.lock、package-lock.json、Podfile.lock 等）：不编辑、不生成、不删除\n- 禁止运行 `yarn install` / `npm install` / `pod install` 等会改动 lock 或 node_modules 的命令；依赖增删只改 `package.json`（含 `resolutions`）与源码\n- lock 刷新、原生工程同步（pod install / gradle sync）、真机回归由用户执行；AI 须在方案中显式列出这些\"待用户自理项\"\n\n## 通用\n\n- 优先选择编辑而非重写整个文件\n- 除非文件被编辑过，否则不要重复阅读已读过的文件\n- 输出追求简洁，但推理过程必须详尽\n\n\n## 详细规范（按需读取）\n\n> 触发对应业务时读取对应文件，不要一次性全部加载。\n\n| 场景                                       | 文档                                                         |\n| ------------------------------------------ | ------------------------------------------------------------ |\n| 了解项目结构、技术栈、路径别名、导航、构建 | [.claude/docs/architecture.md](.claude/docs/architecture.md) |\n| 新建/修改页面（Screen）                    | [.claude/docs/screen.md](.claude/docs/screen.md)             |\n| 查找/定位某个页面                          | [.claude/docs/screens.md](.claude/docs/screens.md)           |\n| 新建/修改可复用组件（components/）         | [.claude/docs/component.md](.claude/docs/component.md)       |\n| 新建/修改 MobX Store                       | [.claude/docs/store.md](.claude/docs/store.md)               |\n| API 请求相关                               | [.claude/docs/api.md](.claude/docs/api.md)                   |\n| 测试规范                                   | [.claude/docs/testing.md](.claude/docs/testing.md)           |\n| Token 预算规则                             | [.claude/docs/token-budget.md](.claude/docs/token-budget.md) |\n| 代码规范与风格                             | [.claude/docs/code-style.md](.claude/docs/code-style.md)     |\n\n## 文档维护\n\n当以下情况发生时，主动更新 `.claude/docs/` 中对应的文档：\n\n- 新增或重构了页面模板/约定 → 更新 `screen.md`\n- 新增/删除/重命名了页面 → 更新 `screens.md`\n- 新增或重构了可复用组件模式 → 更新 `component.md`\n- Store 继承链或文件结构变化 → 更新 `store.md`\n- API 请求方式或常量位置变化 → 更新 `api.md`\n- 新增路径别名、导航结构变化、技术栈升级 → 更新 `architecture.md`\n- 发现代码风格约定与文档不符 → 更新 `code-style.md`\n- 测试规范变化 → 更新 `testing.md`\n\n原则：改了什么就更新什么，不要等用户提醒。\n</yakaai_skills>"}