# 需求工单:并发代码生成 name: 并发代码生成 description: | 当前工具在初始化项目时,按照 design.json 中列出的文件顺序逐个生成代码,即只有前一个文件生成完成后才开始下一个文件的生成。 这种串行方式在文件数量较多或网络延迟较高时效率低下。我们希望改为基于依赖关系的并发生成:在解析 design.json 获得文件列表和依赖关系后,构建一个有向无环图(DAG),当某个文件的所有依赖文件都已生成完毕(即前置条件满足)时,立即启动该文件的生成任务(调用 LLM),多个文件可以并行生成。 特别要求:`utils.py` 文件应被视为所有其他 Python 文件的隐式依赖项。这意味着在依赖图中,每个非 `utils.py` 的文件都自动依赖于 `utils.py`,因此 `utils.py` 必须先生成,然后其他文件才能开始并发生成。这样可确保公共工具函数在依赖它的模块生成时已可用。 需要实现以下功能: - 解析 design.json 中的 files 数组,提取每个文件的 path 和 dependencies(依赖的文件路径列表)。 - 构建依赖图时,自动为所有非 `utils.py` 的文件添加对 `utils.py` 的依赖(如果 `utils.py` 存在于文件列表中且不是自身)。 - 计算每个文件的入度(依赖数),并考虑上述隐式依赖。 - 使用一个任务队列(如 asyncio 或 concurrent.futures)并发执行生成任务,初始时入度为0的文件(即无依赖的文件,其中 `utils.py` 通常入度为0)可以立即开始生成。 - 每当一个文件生成完成(成功或失败),更新依赖它的其他文件的入度,当入度变为0时将其加入待执行队列。 - 生成任务应使用独立的 LLM 客户端实例(或复用连接池)进行并发请求,需注意 API 并发限制(可配置)。 - 支持限制最大并发数(例如通过 --max-concurrency 参数或配置文件中的 max_concurrent_requests)。 - 生成过程中仍需保存断点续写状态(.llm_generator_state.json),记录每个文件的生成状态(pending、generating、success、failed)。 - 错误处理:某个文件生成失败不应影响其他文件的生成(除非是依赖失败导致下游无法生成),最终汇总失败信息。 - 命令行输出需展示并发进度(如 rich 进度条),显示已完成/总数。 acceptance_criteria: - 当 design.json 中包含多个无相互依赖的文件时,它们应同时开始生成。 - **必须确保 `utils.py` 在所有其他 Python 文件之前生成,确保`utils.py` 是其他所有文件的上下文**。 - 当存在其他依赖链时,依赖项必须先生成完成,然后才能开始生成依赖它们的文件。 - 并发数可通过配置或命令行参数控制,默认值为 5。 - 生成过程中中断后重新运行,能根据状态文件恢复未完成的任务,并继续并发执行。 - 所有生成的代码内容与串行方式生成的代码一致(即并发不影响生成逻辑)。 - 日志中记录每个文件的生成开始时间、结束时间及所用 LLM 调用时长。 - 如果某个文件生成失败(例如 LLM 返回错误),在最终汇总中显示,并允许用户选择是否重试或跳过。 affected_files: - src/llm_codegen/core.py # CodeGenerator 类和生成核心逻辑 - src/llm_codegen/cli.py # init 命令的主流程 - src/llm_codegen/models.py # 可能需要定义任务状态枚举 - src/llm_codegen/utils.py # 可能添加图构建、并发控制辅助函数 - pyproject.toml # 可能新增配置项 max_concurrent_requests