把扁平的 backend/src/backend/*.py(17 个文件)拆成 api/ schemas/ services/ clients/ infrastructure/ 五目录结构,让"路由/业务/外部IO"三层边界清晰。
backend/src/backend/*.py
api/ schemas/ services/ clients/ infrastructure/
/Users/taochen/.claude/plans/structured-layered-tide.md
backend/src/backend/ ├── main.py ├── api/ # FastAPI router(10 个文件) ├── schemas/ # Pydantic 数据契约(7 个文件) ├── services/ # 业务用例(4 个文件) ├── clients/ # 外部 IO 客户端(3 个文件) └── infrastructure/ # 横切关注点(1 个:logging/audit)
api/schedules/
audit.py
infrastructure/logging.py
storage_api.py
api/internal.py
旧路径留 re-export shim:测试 0 改动即可;阶段 4 删 shim。
uv run --package backend pytest backend/tests -q
uv run python -m compileall backend/src
git blame
Task: m7buxy4vue93bfj6gppf27ur
tao.chen commented:
规划完成。已落盘 4 个阶段任务(subtask relation 已建立)。
阶段 1(纯位置迁移)风险最低、收益最大,建议作为第一个 PR 推进。 阶段 2-3 依赖阶段 1 完成。阶段 4 等所有测试切到新 import 后再删 shim。
执行节奏:每阶段独立 PR,每阶段都要 uv run --package backend pytest backend/tests -q 全绿。
整体收尾
Commit 落地
worktree-backend-restructure
bca239e
refactor(backend): split into api/ schemas/ services/ clients/ layers
本地状态
develop
9f64663
清理命令(必须在主 checkout / 退出 Claude session 后执行)
# 退出 Claude session 后,在主 checkout /Users/taochen/llm/model-platform: # 1) 合并到 develop (fast-forward,无冲突) git checkout develop git merge --ff-only worktree-backend-restructure # 2) 验证 uv run --package backend pytest backend/tests -q # 期望 122 passed git log --oneline -1 # 期望 bca239e # 3) 推送 (可选) git push origin develop # 4) 退出 worktree + 删分支 git worktree remove --force /Users/taochen/llm/model-platform/.claude/worktrees/backend-restructure git branch -d worktree-backend-restructure
为什么这里不直接执行 此 session 被锁在 worktree-backend-restructure 工作树(worktree status 显示 locked: claude session backend-restructure)。worktree-isolated session 不允许 git -C <main checkout> 跨 checkout 操作,也无法 self-remove(会终止当前会话)。
locked: claude session backend-restructure
git -C <main checkout>
验收清单
最终结构
backend/src/backend/ main.py, audit.py, __init__.py api/ (10 files: routes + 2 subpackage) schemas/ (7 files: Pydantic contracts) services/ (storage + schedules) clients/ (rclone, runtime, scheduler)
后续下沉候选(待新 PR)
cron_preview
validate_script_content
compute_jupyter_relative_path
resource_directory
can_view
No dependencies set.
The note is not visible to the blocked user.
目标
把扁平的
backend/src/backend/*.py(17 个文件)拆成api/ schemas/ services/ clients/ infrastructure/五目录结构,让"路由/业务/外部IO"三层边界清晰。计划文件
/Users/taochen/.claude/plans/structured-layered-tide.md核心结构
关键决策
api/schedules/子包收纳 schedules + schedule_runs(共享 schema)audit.py→infrastructure/logging.py(不是业务也不是 IO)storage_api.py→api/internal.py(/internal/v1/*)兼容性
旧路径留 re-export shim:测试 0 改动即可;阶段 4 删 shim。
验收(每阶段都要过)
uv run --package backend pytest backend/tests -q全绿uv run python -m compileall backend/src无错误git blame仍指向原作者(git mv 保留历史)Task: m7buxy4vue93bfj6gppf27ur
tao.chen commented:
阶段 1(纯位置迁移)风险最低、收益最大,建议作为第一个 PR 推进。
阶段 2-3 依赖阶段 1 完成。阶段 4 等所有测试切到新 import 后再删 shim。
执行节奏:每阶段独立 PR,每阶段都要
uv run --package backend pytest backend/tests -q全绿。tao.chen commented:
Commit 落地
worktree-backend-restructureHEAD:bca239erefactor(backend): split into api/ schemas/ services/ clients/ layers本地状态
developHEAD:9f64663(落后 1 commit)worktree-backend-restructure比develop超前 1 commit,无冲突,适合 fast-forward清理命令(必须在主 checkout / 退出 Claude session 后执行)
为什么这里不直接执行
此 session 被锁在
worktree-backend-restructure工作树(worktree status 显示locked: claude session backend-restructure)。worktree-isolated session 不允许git -C <main checkout>跨 checkout 操作,也无法 self-remove(会终止当前会话)。验收清单
最终结构
后续下沉候选(待新 PR)
cron_preview(api/schedules/schedules.py) — 纯 cron 迭代validate_script_content(api/scripts.py) — 脚本字节校验compute_jupyter_relative_path/resource_directory(api/resources.py) — 路径解析can_view(api/resources.py) — 资源权限判断