workflow-loop 0.3.2__tar.gz → 0.3.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. {workflow_loop-0.3.2/src/workflow_loop.egg-info → workflow_loop-0.3.4}/PKG-INFO +18 -14
  2. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/README.md +17 -13
  3. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/pyproject.toml +1 -1
  4. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/__init__.py +2 -2
  5. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/artifact_validation.py +40 -2
  6. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/bug_record.py +3 -2
  7. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/cli.py +366 -68
  8. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/acceptance/acceptance_plan.md +8 -0
  9. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/impl/code_implementation.md +4 -1
  10. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/impl/impl.md +11 -3
  11. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/acceptance/acceptance_plan.md +7 -0
  12. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/impl/impl.md +16 -7
  13. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/qa/test.md +2 -0
  14. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/qa/test_plan.md +2 -0
  15. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/reproduce/reproduce.md +2 -0
  16. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/rollback.py +1246 -156
  17. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/stages/stages.py +256 -24
  18. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/topic.py +19 -10
  19. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/verification.py +183 -27
  20. {workflow_loop-0.3.2 → workflow_loop-0.3.4/src/workflow_loop.egg-info}/PKG-INFO +18 -14
  21. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_bug_validation.py +34 -0
  22. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_commands.py +367 -2
  23. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_current_workflow_qa.py +1 -1
  24. workflow_loop-0.3.4/tests/test_diagnostics.py +391 -0
  25. workflow_loop-0.3.4/tests/test_rollback.py +1280 -0
  26. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_spike_assets.py +7 -2
  27. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_stages.py +330 -1
  28. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_verification.py +71 -3
  29. workflow_loop-0.3.2/tests/test_diagnostics.py +0 -216
  30. workflow_loop-0.3.2/tests/test_rollback.py +0 -610
  31. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/LICENSE +0 -0
  32. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/setup.cfg +0 -0
  33. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/acceptance_records.py +0 -0
  34. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/artifact_paths.py +0 -0
  35. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/acceptance/acceptance.md +0 -0
  36. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/code_design/code_design.md +0 -0
  37. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/code_design/project_design_init.md +0 -0
  38. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/code_design/update_code_design.md +0 -0
  39. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/global/document_writing.md +0 -0
  40. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/global/workflow_lifecycle.md +0 -0
  41. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/qa/test.md +0 -0
  42. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/qa/test_code.md +0 -0
  43. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/qa/test_code_implementation.md +0 -0
  44. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/qa/test_plan.md +0 -0
  45. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/reproduce/reproduce.md +0 -0
  46. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/spec/spec.md +0 -0
  47. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/spike/spike.md +0 -0
  48. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/acceptance/acceptance_result.md +0 -0
  49. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/code_design/code_design.md +0 -0
  50. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/code_design/project_design_init_evidence.md +0 -0
  51. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/spec/spec.md +0 -0
  52. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/spike/spike.md +0 -0
  53. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/diagnostics.py +0 -0
  54. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/installer.py +0 -0
  55. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/journal.py +0 -0
  56. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/markdown_links.py +0 -0
  57. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/path_composer.py +0 -0
  58. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/process_runner.py +0 -0
  59. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/project.py +0 -0
  60. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/role_doc.py +0 -0
  61. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/snapshots.py +0 -0
  62. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/spike_reuse.py +0 -0
  63. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/spike_validation.py +0 -0
  64. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/stage_materials.py +0 -0
  65. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/stages/__init__.py +0 -0
  66. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/stages/base.py +0 -0
  67. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/state.py +0 -0
  68. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/test_entry.py +0 -0
  69. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/test_execution.py +0 -0
  70. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/test_mapping.py +0 -0
  71. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/test_report.py +0 -0
  72. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/test_runner.py +0 -0
  73. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/topic_relations.py +0 -0
  74. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/traceability.py +0 -0
  75. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop.egg-info/SOURCES.txt +0 -0
  76. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop.egg-info/dependency_links.txt +0 -0
  77. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop.egg-info/entry_points.txt +0 -0
  78. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop.egg-info/requires.txt +0 -0
  79. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop.egg-info/top_level.txt +0 -0
  80. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_acceptance_records.py +0 -0
  81. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_architecture_validation.py +0 -0
  82. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_artifact_paths.py +0 -0
  83. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_bug_record.py +0 -0
  84. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_current_workflow_contracts.py +0 -0
  85. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_installer.py +0 -0
  86. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_light_task.py +0 -0
  87. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_maintenance.py +0 -0
  88. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_maintenance_scripts.py +0 -0
  89. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_markdown_links.py +0 -0
  90. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_path_composer.py +0 -0
  91. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_process_runner.py +0 -0
  92. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_project.py +0 -0
  93. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_project_design_init.py +0 -0
  94. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_public_project.py +0 -0
  95. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_release_script.py +0 -0
  96. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_release_workflow.py +0 -0
  97. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_snapshots.py +0 -0
  98. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_spike_validation.py +0 -0
  99. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_stage_materials.py +0 -0
  100. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_state.py +0 -0
  101. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_test_entry.py +0 -0
  102. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_test_execution.py +0 -0
  103. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_test_mapping.py +0 -0
  104. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_test_report.py +0 -0
  105. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_test_runner.py +0 -0
  106. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_topic_relations.py +0 -0
  107. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_traceability.py +0 -0
  108. {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_workflow_acceptance.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: workflow-loop
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: 为 AI 驱动的软件开发提供有状态、可验证、可回退的工作流管理。
5
5
  Author: yuzyf
6
6
  License-Expression: MIT
@@ -34,8 +34,10 @@ Workflow Loop 把一次软件修改拆成有顺序的工作环节,并用程序
34
34
 
35
35
  - **保存进度**:在项目的 `.workflow_loop/` 目录保存当前工作环节、确认状态和机器执行记录,下一次对话可以从真实状态继续。
36
36
  - **控制推进**:完整研发任务的每个环节依次经过讨论完成、程序检查和用户确认三道门;无需开发任务走独立的讨论、执行、结果确认简单流程。
37
+ - **一次说明门禁问题**:完整研发门禁失败时,一次列出当前能够独立确认的全部问题;每项写明位置、预期、实际、证据、影响和下一动作,无法可靠判断的项目标为“未检查”并说明依赖。同一状态重复检查时,问题清单和顺序保持一致,要求先修改后再检查。
38
+ - **给出唯一下一步**:每条命令结束时只给出一条完整有效的下一命令,并说明执行者、是否会自动执行测试或其它实际动作、以及成功条件。AI 必须原样执行,不能追加管道、截断、重定向或命令串联。
37
39
  - **连接交付证据**:把产品设计、验收条件、测试项、实施记录和最终结果放进同一条可追踪链路。
38
- - **保护项目修改**:实施前保存计划修改文件的原内容;需要退回上游或作废整轮时,按工作流规则使旧结果失效或恢复受管内容。
40
+ - **保护项目修改**:实施前保存计划修改文件的原内容,并记录代码、测试、脚本和项目配置的实施观察基线;发现未登记变化时明确报告。需要退回上游或作废整轮时,按工作流规则使旧结果失效或恢复受管内容。
39
41
  - **管理四种工作**:分别处理从零创建、修改现有产品、修复缺陷和无需开发任务;只有前三种生成研发环节路径。
40
42
 
41
43
  ### 不做什么
@@ -77,9 +79,11 @@ flowchart TD
77
79
  完整研发路线的三道门分别解决不同问题:
78
80
 
79
81
  1. **讨论完成**:需求、限制和实施计划已经与用户逐项达成共识,允许开始写正式产物。
80
- 2. **程序检查**:程序核对必需文件、结构、关联、代码变化或测试记录等可机械判断的事实。
82
+ 2. **程序检查**:程序核对必需文件、结构、关联、代码变化或测试记录等可机械判断的事实;失败时一次列出全部能够独立确认的问题,不把依赖未满足的检查猜成失败。
81
83
  3. **用户确认**:用户确认实际内容符合意图,程序记录确认后才进入下一环节。
82
84
 
85
+ 门禁失败的每项问题都会给出具体位置、预期、实际、证据、影响和下一动作;同一状态不会逐次隐藏问题,也不会要求 AI 原样重试。命令末尾只保留一条完整下一命令,AI 应直接照此执行。
86
+
83
87
  `light_task`(无需开发任务)是一类任务,不是“改文档、提交、发布”三个固定选项。它也要求先调查和讨论:AI 用第一性原理梳理需求,每次只问一个问题并给出建议,用户确认讨论完毕后才执行。执行 `commit`(本地 Git 提交)、`push`(推送远端)、发布、删除等难撤销操作前,要按准确操作单独确认;“提交代码”必须先问清是只 `commit`,还是还要 `push`。完成后,AI 按约定方法展示真实结果,用户确认后收工。简单流程不创建研发阶段、三道门、固定全量测试或回退副本;失败或作废时保留真实现场并说明结果,不自动回滚。
84
88
 
85
89
  ## 环境要求
@@ -90,29 +94,29 @@ flowchart TD
90
94
  - 安装时能够访问 GitHub 和 PyPI(Python 公共软件包仓库)。
91
95
  - 执行安装命令前,先进入要由 Workflow Loop 管理的项目根目录。
92
96
 
93
- ## 安装 0.3.2
97
+ ## 安装 0.3.4
94
98
 
95
99
  安装器先进行只读检查并列出项目侧和电脑侧可能发生的全部持久修改。用户确认一次后,安装器才安装或复用全局 `workflow` 命令,并把智能体契约、产物模板和工作规范写入当前项目;用户取消或安装失败时不会留下只完成一部分的安装。
96
100
 
97
101
  ### macOS
98
102
 
99
103
  ```bash
100
- curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.3.2/install.sh | bash
104
+ curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.3.4/install.sh | bash
101
105
  ```
102
106
 
103
107
  ### Linux
104
108
 
105
109
  ```bash
106
- curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.3.2/install.sh | bash
110
+ curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.3.4/install.sh | bash
107
111
  ```
108
112
 
109
113
  ### 原生 Windows
110
114
 
111
115
  ```powershell
112
- powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/yuzyf/workflow_loop/releases/download/v0.3.2/install.ps1 | iex"
116
+ powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/yuzyf/workflow_loop/releases/download/v0.3.4/install.ps1 | iex"
113
117
  ```
114
118
 
115
- 安装命令固定读取 `v0.3.2` 正式发布中的脚本;不会跟随内容可能变化的 `latest`(最新版本)地址。
119
+ 安装命令固定读取 `v0.3.4` 正式发布中的脚本;不会跟随内容可能变化的 `latest`(最新版本)地址。
116
120
 
117
121
  ## 更新与卸载
118
122
 
@@ -120,7 +124,7 @@ powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/y
120
124
 
121
125
  ```bash
122
126
  workflow update
123
- workflow update --version 0.3.2
127
+ workflow update --version 0.3.4
124
128
  ```
125
129
 
126
130
  更新按需补齐电脑全局命令和当前项目,只直接覆盖项目根 `AGENTS.md`、`.workflow_loop/Template_Repository/`、`.workflow_loop/Standardized_Repository/`,以及 `.workflow_loop/project.json` 中的安装版本字段。更新不创建备份,不回滚已经完成的步骤;当前轮次状态、历史、回退资料、业务代码和正式产物保持不变。失败后重新执行同一命令即可继续补齐。
@@ -166,18 +170,18 @@ powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/y
166
170
  安装完成后,在当前项目中启动支持读取 `AGENTS.md`(智能体契约文件)的 AI 编码助手,直接用自然语言提出需求:
167
171
 
168
172
  ```text
169
- 用户:给当前项目增加 CSV 导出功能,并保证原有导出格式不受影响。
173
+ 用户:给当前项目增加 CSV(逗号分隔值)导出功能,并保证原有导出格式不受影响。
170
174
  ```
171
175
 
172
176
  之后由 AI 编码助手执行日常流程:
173
177
 
174
178
  1. 自动运行 `workflow start` 检查当前状态,并根据事实与用户确认本轮工作意图。
175
179
  2. 调查现状并推荐四种路线之一,用户确认进入该任务后才启动轮次。
176
- 3. 严格执行每条命令输出的“下一步”,讨论时每次只问用户一个问题。
180
+ 3. 严格执行每条命令输出的“下一步”,讨论时每次只问用户一个问题;门禁失败先按完整问题清单修改,不能原样重试,也不能自行拼接或截断命令输出。
177
181
  4. 完整研发路线在写代码前完成需求、验收、测试和实施计划;无需开发任务在用户确认讨论完毕后直接执行约定内容。
178
182
  5. 把真实结果交给用户核对并确认,再正式收工。
179
183
 
180
- 用户不需要手工执行日常 `workflow` 命令;用户只负责描述需求、回答讨论问题、确认安装范围和确认各环节结果。
184
+ 用户不需要手工执行日常 `workflow` 命令,但仍需确认工作路线、回答讨论问题、作出产品和验收决定、批准难撤销操作、确认安装范围及确认各环节结果。
181
185
 
182
186
  ## 命令概览
183
187
 
@@ -223,10 +227,10 @@ uv run python -m build
223
227
 
224
228
  ## 发布正式版本
225
229
 
226
- 项目维护者确认当前仓库内容可以直接发布后,在仓库根目录执行下面的命令,并把 `0.3.2` 替换成要发布的新版本号:
230
+ 项目维护者确认当前仓库内容可以直接发布后,在仓库根目录执行下面的命令,并把 `0.3.4` 替换成要发布的新版本号:
227
231
 
228
232
  ```bash
229
- uv run python scripts/release.py 0.3.2
233
+ uv run python scripts/release.py 0.3.4
230
234
  ```
231
235
 
232
236
  运行这条命令本身就表示维护者接受当前仓库状态并承担跳过本地发布检查的风险。脚本不会再次确认,也不会在本地运行测试、构建或远程版本查询。它依次执行:
@@ -15,8 +15,10 @@ Workflow Loop 把一次软件修改拆成有顺序的工作环节,并用程序
15
15
 
16
16
  - **保存进度**:在项目的 `.workflow_loop/` 目录保存当前工作环节、确认状态和机器执行记录,下一次对话可以从真实状态继续。
17
17
  - **控制推进**:完整研发任务的每个环节依次经过讨论完成、程序检查和用户确认三道门;无需开发任务走独立的讨论、执行、结果确认简单流程。
18
+ - **一次说明门禁问题**:完整研发门禁失败时,一次列出当前能够独立确认的全部问题;每项写明位置、预期、实际、证据、影响和下一动作,无法可靠判断的项目标为“未检查”并说明依赖。同一状态重复检查时,问题清单和顺序保持一致,要求先修改后再检查。
19
+ - **给出唯一下一步**:每条命令结束时只给出一条完整有效的下一命令,并说明执行者、是否会自动执行测试或其它实际动作、以及成功条件。AI 必须原样执行,不能追加管道、截断、重定向或命令串联。
18
20
  - **连接交付证据**:把产品设计、验收条件、测试项、实施记录和最终结果放进同一条可追踪链路。
19
- - **保护项目修改**:实施前保存计划修改文件的原内容;需要退回上游或作废整轮时,按工作流规则使旧结果失效或恢复受管内容。
21
+ - **保护项目修改**:实施前保存计划修改文件的原内容,并记录代码、测试、脚本和项目配置的实施观察基线;发现未登记变化时明确报告。需要退回上游或作废整轮时,按工作流规则使旧结果失效或恢复受管内容。
20
22
  - **管理四种工作**:分别处理从零创建、修改现有产品、修复缺陷和无需开发任务;只有前三种生成研发环节路径。
21
23
 
22
24
  ### 不做什么
@@ -58,9 +60,11 @@ flowchart TD
58
60
  完整研发路线的三道门分别解决不同问题:
59
61
 
60
62
  1. **讨论完成**:需求、限制和实施计划已经与用户逐项达成共识,允许开始写正式产物。
61
- 2. **程序检查**:程序核对必需文件、结构、关联、代码变化或测试记录等可机械判断的事实。
63
+ 2. **程序检查**:程序核对必需文件、结构、关联、代码变化或测试记录等可机械判断的事实;失败时一次列出全部能够独立确认的问题,不把依赖未满足的检查猜成失败。
62
64
  3. **用户确认**:用户确认实际内容符合意图,程序记录确认后才进入下一环节。
63
65
 
66
+ 门禁失败的每项问题都会给出具体位置、预期、实际、证据、影响和下一动作;同一状态不会逐次隐藏问题,也不会要求 AI 原样重试。命令末尾只保留一条完整下一命令,AI 应直接照此执行。
67
+
64
68
  `light_task`(无需开发任务)是一类任务,不是“改文档、提交、发布”三个固定选项。它也要求先调查和讨论:AI 用第一性原理梳理需求,每次只问一个问题并给出建议,用户确认讨论完毕后才执行。执行 `commit`(本地 Git 提交)、`push`(推送远端)、发布、删除等难撤销操作前,要按准确操作单独确认;“提交代码”必须先问清是只 `commit`,还是还要 `push`。完成后,AI 按约定方法展示真实结果,用户确认后收工。简单流程不创建研发阶段、三道门、固定全量测试或回退副本;失败或作废时保留真实现场并说明结果,不自动回滚。
65
69
 
66
70
  ## 环境要求
@@ -71,29 +75,29 @@ flowchart TD
71
75
  - 安装时能够访问 GitHub 和 PyPI(Python 公共软件包仓库)。
72
76
  - 执行安装命令前,先进入要由 Workflow Loop 管理的项目根目录。
73
77
 
74
- ## 安装 0.3.2
78
+ ## 安装 0.3.4
75
79
 
76
80
  安装器先进行只读检查并列出项目侧和电脑侧可能发生的全部持久修改。用户确认一次后,安装器才安装或复用全局 `workflow` 命令,并把智能体契约、产物模板和工作规范写入当前项目;用户取消或安装失败时不会留下只完成一部分的安装。
77
81
 
78
82
  ### macOS
79
83
 
80
84
  ```bash
81
- curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.3.2/install.sh | bash
85
+ curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.3.4/install.sh | bash
82
86
  ```
83
87
 
84
88
  ### Linux
85
89
 
86
90
  ```bash
87
- curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.3.2/install.sh | bash
91
+ curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.3.4/install.sh | bash
88
92
  ```
89
93
 
90
94
  ### 原生 Windows
91
95
 
92
96
  ```powershell
93
- powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/yuzyf/workflow_loop/releases/download/v0.3.2/install.ps1 | iex"
97
+ powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/yuzyf/workflow_loop/releases/download/v0.3.4/install.ps1 | iex"
94
98
  ```
95
99
 
96
- 安装命令固定读取 `v0.3.2` 正式发布中的脚本;不会跟随内容可能变化的 `latest`(最新版本)地址。
100
+ 安装命令固定读取 `v0.3.4` 正式发布中的脚本;不会跟随内容可能变化的 `latest`(最新版本)地址。
97
101
 
98
102
  ## 更新与卸载
99
103
 
@@ -101,7 +105,7 @@ powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/y
101
105
 
102
106
  ```bash
103
107
  workflow update
104
- workflow update --version 0.3.2
108
+ workflow update --version 0.3.4
105
109
  ```
106
110
 
107
111
  更新按需补齐电脑全局命令和当前项目,只直接覆盖项目根 `AGENTS.md`、`.workflow_loop/Template_Repository/`、`.workflow_loop/Standardized_Repository/`,以及 `.workflow_loop/project.json` 中的安装版本字段。更新不创建备份,不回滚已经完成的步骤;当前轮次状态、历史、回退资料、业务代码和正式产物保持不变。失败后重新执行同一命令即可继续补齐。
@@ -147,18 +151,18 @@ powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/y
147
151
  安装完成后,在当前项目中启动支持读取 `AGENTS.md`(智能体契约文件)的 AI 编码助手,直接用自然语言提出需求:
148
152
 
149
153
  ```text
150
- 用户:给当前项目增加 CSV 导出功能,并保证原有导出格式不受影响。
154
+ 用户:给当前项目增加 CSV(逗号分隔值)导出功能,并保证原有导出格式不受影响。
151
155
  ```
152
156
 
153
157
  之后由 AI 编码助手执行日常流程:
154
158
 
155
159
  1. 自动运行 `workflow start` 检查当前状态,并根据事实与用户确认本轮工作意图。
156
160
  2. 调查现状并推荐四种路线之一,用户确认进入该任务后才启动轮次。
157
- 3. 严格执行每条命令输出的“下一步”,讨论时每次只问用户一个问题。
161
+ 3. 严格执行每条命令输出的“下一步”,讨论时每次只问用户一个问题;门禁失败先按完整问题清单修改,不能原样重试,也不能自行拼接或截断命令输出。
158
162
  4. 完整研发路线在写代码前完成需求、验收、测试和实施计划;无需开发任务在用户确认讨论完毕后直接执行约定内容。
159
163
  5. 把真实结果交给用户核对并确认,再正式收工。
160
164
 
161
- 用户不需要手工执行日常 `workflow` 命令;用户只负责描述需求、回答讨论问题、确认安装范围和确认各环节结果。
165
+ 用户不需要手工执行日常 `workflow` 命令,但仍需确认工作路线、回答讨论问题、作出产品和验收决定、批准难撤销操作、确认安装范围及确认各环节结果。
162
166
 
163
167
  ## 命令概览
164
168
 
@@ -204,10 +208,10 @@ uv run python -m build
204
208
 
205
209
  ## 发布正式版本
206
210
 
207
- 项目维护者确认当前仓库内容可以直接发布后,在仓库根目录执行下面的命令,并把 `0.3.2` 替换成要发布的新版本号:
211
+ 项目维护者确认当前仓库内容可以直接发布后,在仓库根目录执行下面的命令,并把 `0.3.4` 替换成要发布的新版本号:
208
212
 
209
213
  ```bash
210
- uv run python scripts/release.py 0.3.2
214
+ uv run python scripts/release.py 0.3.4
211
215
  ```
212
216
 
213
217
  运行这条命令本身就表示维护者接受当前仓库状态并承担跳过本地发布检查的风险。脚本不会再次确认,也不会在本地运行测试、构建或远程版本查询。它依次执行:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "workflow-loop"
3
- version = "0.3.2"
3
+ version = "0.3.4"
4
4
  description = "为 AI 驱动的软件开发提供有状态、可验证、可回退的工作流管理。"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -1,6 +1,6 @@
1
1
  # 包版本号,用于 pip/uv 安装时版本匹配
2
- __version__ = "0.3.2"
2
+ __version__ = "0.3.4"
3
3
  # 产品身份标识:workflow --version 输出、安装脚本身份核对和安装事务校验共用同一组常量
4
- # 本次发布版本为 0.3.2;后续发布使用尚未被 PyPI 占用的新版本号
4
+ # 本次发布版本为 0.3.4;后续发布使用尚未被 PyPI 占用的新版本号
5
5
  PRODUCT_NAME = "workflow-loop"
6
6
  PRODUCT_IDENTITY = f"{PRODUCT_NAME} {__version__}"
@@ -86,6 +86,33 @@ def _field(content: str, label: str) -> str | None:
86
86
  return match.group(1).strip() if match else None
87
87
 
88
88
 
89
+ def _missing_fixed_field_reason(
90
+ content: str,
91
+ label: str,
92
+ *,
93
+ next_field_means_misplaced_value: bool = False,
94
+ ) -> str:
95
+ """说明固定字段缺值的真实格式原因,不把换行误说成普通空值。"""
96
+ field_line = re.search(
97
+ rf"^-[ \t]*{re.escape(label)}:[ \t]*(?P<value>[^\r\n]*)$",
98
+ content,
99
+ re.MULTILINE,
100
+ )
101
+ if field_line is None:
102
+ return "缺少具体内容;原因:缺少标签"
103
+ if field_line.group("value").strip():
104
+ return "缺少具体内容"
105
+
106
+ following = content[field_line.end() :].splitlines()
107
+ next_content = next((line.strip() for line in following if line.strip()), "")
108
+ if next_content and (
109
+ next_field_means_misplaced_value
110
+ or not re.match(r"^-[ \t]*[^:]+:", next_content)
111
+ ):
112
+ return "值必须写在标签同一行,下一行内容不会被读取"
113
+ return "标签同一行没有值,缺少具体内容"
114
+
115
+
89
116
  def _argv_text(argv: list[str]) -> str:
90
117
  """把参数数组编码成可读且可精确比对的单行 JSON。"""
91
118
  return json.dumps(argv, ensure_ascii=False, separators=(",", ":"))
@@ -1444,7 +1471,15 @@ def validate_reproduce_documents(
1444
1471
  failures.append(f"{filename} 必须写“根因状态:已确认”")
1445
1472
  topic = _field(content, "验收主题")
1446
1473
  if not _is_safe_topic_name(topic):
1447
- failures.append(f"{filename} 必须写清唯一验收主题")
1474
+ reason = _missing_fixed_field_reason(
1475
+ content,
1476
+ "验收主题",
1477
+ next_field_means_misplaced_value=True,
1478
+ )
1479
+ if topic is None:
1480
+ failures.append(f"{filename}“验收主题”字段:{reason}")
1481
+ else:
1482
+ failures.append(f"{filename} 必须写清唯一验收主题")
1448
1483
  else:
1449
1484
  topics.append(topic or "")
1450
1485
 
@@ -1573,7 +1608,10 @@ def validate_acceptance_plan_documents(
1573
1608
  for label in required_fields:
1574
1609
  value = _field(criterion_content, label)
1575
1610
  if value is None or not value.strip():
1576
- issues.append(f"{rel_path} {criterion_id}“{label}”字段:缺少具体内容")
1611
+ issues.append(
1612
+ f"{rel_path} {criterion_id}“{label}”字段:"
1613
+ f"{_missing_fixed_field_reason(criterion_content, label)}"
1614
+ )
1577
1615
  continue
1578
1616
  normalized = re.sub(r"[\s`*_.。,,::;;!?!?()()\[\]{}]", "", value or "").lower()
1579
1617
  if normalized in placeholder_values or not _has_real_text(value):
@@ -12,8 +12,9 @@ from .topic import topic_paths
12
12
 
13
13
  BUG_DIR = "bug"
14
14
  BUG_INDEX = artifact_paths_mod.BUG_INDEX_DOC
15
- WORKFLOW_RE = re.compile(r"^-\s*工作流编号:\s*(.+?)\s*$", re.MULTILINE)
16
- TOPIC_RE = re.compile(r"^-\s*验收主题:\s*(.+?)\s*$", re.MULTILINE)
15
+ # 固定字段的空白只允许在同一行;``\s*`` 会吞掉换行,导致下一字段被误读。
16
+ WORKFLOW_RE = re.compile(r"^-[ \t]*工作流编号:[ \t]*([^\r\n]+?)[ \t]*$", re.MULTILINE)
17
+ TOPIC_RE = re.compile(r"^-[ \t]*验收主题:[ \t]*([^\r\n]+?)[ \t]*$", re.MULTILINE)
17
18
  RESULT_SECTION_RE = re.compile(
18
19
  r"^##\s+8\.\s*修复与验收结果\s*$\n(.*?)(?=^##\s+|\Z)",
19
20
  re.MULTILINE | re.DOTALL,