workflow-loop 0.2.0__tar.gz → 0.3.2__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 (124) hide show
  1. {workflow_loop-0.2.0/src/workflow_loop.egg-info → workflow_loop-0.3.2}/PKG-INFO +32 -11
  2. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/README.md +30 -10
  3. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/pyproject.toml +2 -2
  4. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/__init__.py +2 -2
  5. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/acceptance_records.py +15 -11
  6. workflow_loop-0.3.2/src/workflow_loop/artifact_validation.py +2554 -0
  7. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/cli.py +2341 -322
  8. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/acceptance/acceptance.md +7 -5
  9. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/acceptance/acceptance_plan.md +13 -7
  10. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/code_design/code_design.md +18 -26
  11. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/code_design/project_design_init.md +34 -4
  12. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/code_design/update_code_design.md +5 -5
  13. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/global/workflow_lifecycle.md +31 -7
  14. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/impl/code_implementation.md +13 -14
  15. workflow_loop-0.3.2/src/workflow_loop/data/Standardized_Repository/impl/impl.md +160 -0
  16. workflow_loop-0.3.2/src/workflow_loop/data/Standardized_Repository/qa/test.md +170 -0
  17. workflow_loop-0.3.2/src/workflow_loop/data/Standardized_Repository/qa/test_code.md +107 -0
  18. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/qa/test_code_implementation.md +13 -12
  19. workflow_loop-0.3.2/src/workflow_loop/data/Standardized_Repository/qa/test_plan.md +185 -0
  20. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/spec/spec.md +15 -3
  21. workflow_loop-0.3.2/src/workflow_loop/data/Standardized_Repository/spike/spike.md +208 -0
  22. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/acceptance/acceptance_plan.md +24 -14
  23. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/acceptance/acceptance_result.md +1 -1
  24. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/code_design/code_design.md +8 -9
  25. workflow_loop-0.3.2/src/workflow_loop/data/Template_Repository/code_design/project_design_init_evidence.md +72 -0
  26. workflow_loop-0.3.2/src/workflow_loop/data/Template_Repository/impl/impl.md +143 -0
  27. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/qa/test.md +16 -7
  28. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/qa/test_plan.md +26 -24
  29. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/spec/spec.md +9 -5
  30. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/spike/spike.md +27 -10
  31. workflow_loop-0.3.2/src/workflow_loop/diagnostics.py +459 -0
  32. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/installer.py +1 -1
  33. workflow_loop-0.3.2/src/workflow_loop/markdown_links.py +611 -0
  34. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/path_composer.py +23 -37
  35. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/project.py +3 -3
  36. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/role_doc.py +9 -28
  37. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/rollback.py +704 -38
  38. workflow_loop-0.3.2/src/workflow_loop/snapshots.py +207 -0
  39. workflow_loop-0.3.2/src/workflow_loop/spike_reuse.py +666 -0
  40. workflow_loop-0.3.2/src/workflow_loop/spike_validation.py +827 -0
  41. workflow_loop-0.3.2/src/workflow_loop/stages/base.py +322 -0
  42. workflow_loop-0.3.2/src/workflow_loop/stages/stages.py +1560 -0
  43. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/state.py +256 -3
  44. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/test_execution.py +369 -85
  45. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/test_mapping.py +375 -42
  46. workflow_loop-0.3.2/src/workflow_loop/test_report.py +371 -0
  47. workflow_loop-0.3.2/src/workflow_loop/topic_relations.py +329 -0
  48. workflow_loop-0.3.2/src/workflow_loop/traceability.py +945 -0
  49. workflow_loop-0.3.2/src/workflow_loop/verification.py +2569 -0
  50. {workflow_loop-0.2.0 → workflow_loop-0.3.2/src/workflow_loop.egg-info}/PKG-INFO +32 -11
  51. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop.egg-info/SOURCES.txt +16 -2
  52. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop.egg-info/requires.txt +1 -0
  53. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_acceptance_records.py +154 -18
  54. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_architecture_validation.py +93 -1
  55. workflow_loop-0.3.2/tests/test_commands.py +1078 -0
  56. workflow_loop-0.3.2/tests/test_current_workflow_contracts.py +636 -0
  57. workflow_loop-0.3.2/tests/test_current_workflow_qa.py +819 -0
  58. workflow_loop-0.3.2/tests/test_diagnostics.py +216 -0
  59. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_installer.py +1 -1
  60. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_light_task.py +4 -7
  61. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_maintenance.py +19 -14
  62. workflow_loop-0.3.2/tests/test_markdown_links.py +245 -0
  63. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_path_composer.py +20 -20
  64. workflow_loop-0.3.2/tests/test_project_design_init.py +201 -0
  65. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_public_project.py +11 -7
  66. workflow_loop-0.3.2/tests/test_release_script.py +256 -0
  67. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_release_workflow.py +22 -26
  68. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_rollback.py +298 -9
  69. workflow_loop-0.3.2/tests/test_snapshots.py +108 -0
  70. workflow_loop-0.3.2/tests/test_spike_assets.py +995 -0
  71. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_spike_validation.py +14 -12
  72. workflow_loop-0.3.2/tests/test_stages.py +572 -0
  73. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_state.py +97 -3
  74. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_test_execution.py +254 -38
  75. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_test_mapping.py +157 -21
  76. workflow_loop-0.3.2/tests/test_test_report.py +255 -0
  77. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_topic_relations.py +82 -1
  78. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_traceability.py +137 -12
  79. workflow_loop-0.3.2/tests/test_verification.py +1450 -0
  80. workflow_loop-0.3.2/tests/test_workflow_acceptance.py +284 -0
  81. workflow_loop-0.2.0/src/workflow_loop/artifact_validation.py +0 -1738
  82. workflow_loop-0.2.0/src/workflow_loop/data/Standardized_Repository/code_design/revise_code_design.md +0 -32
  83. workflow_loop-0.2.0/src/workflow_loop/data/Standardized_Repository/impl/impl.md +0 -164
  84. workflow_loop-0.2.0/src/workflow_loop/data/Standardized_Repository/qa/test.md +0 -167
  85. workflow_loop-0.2.0/src/workflow_loop/data/Standardized_Repository/qa/test_code.md +0 -121
  86. workflow_loop-0.2.0/src/workflow_loop/data/Standardized_Repository/qa/test_plan.md +0 -160
  87. workflow_loop-0.2.0/src/workflow_loop/data/Standardized_Repository/spike/spike.md +0 -236
  88. workflow_loop-0.2.0/src/workflow_loop/data/Template_Repository/code_design/project_design_init_evidence.md +0 -39
  89. workflow_loop-0.2.0/src/workflow_loop/data/Template_Repository/impl/impl.md +0 -112
  90. workflow_loop-0.2.0/src/workflow_loop/spike_validation.py +0 -379
  91. workflow_loop-0.2.0/src/workflow_loop/stages/base.py +0 -164
  92. workflow_loop-0.2.0/src/workflow_loop/stages/stages.py +0 -1191
  93. workflow_loop-0.2.0/src/workflow_loop/topic_relations.py +0 -202
  94. workflow_loop-0.2.0/src/workflow_loop/traceability.py +0 -533
  95. workflow_loop-0.2.0/src/workflow_loop/verification.py +0 -971
  96. workflow_loop-0.2.0/tests/test_commands.py +0 -391
  97. workflow_loop-0.2.0/tests/test_stages.py +0 -314
  98. workflow_loop-0.2.0/tests/test_verification.py +0 -586
  99. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/LICENSE +0 -0
  100. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/setup.cfg +0 -0
  101. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/artifact_paths.py +0 -0
  102. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/bug_record.py +0 -0
  103. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/global/document_writing.md +0 -0
  104. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/reproduce/reproduce.md +0 -0
  105. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/reproduce/reproduce.md +0 -0
  106. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/journal.py +0 -0
  107. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/process_runner.py +0 -0
  108. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/stage_materials.py +0 -0
  109. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/stages/__init__.py +0 -0
  110. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/test_entry.py +0 -0
  111. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/test_runner.py +0 -0
  112. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/topic.py +0 -0
  113. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop.egg-info/dependency_links.txt +0 -0
  114. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop.egg-info/entry_points.txt +0 -0
  115. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop.egg-info/top_level.txt +0 -0
  116. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_artifact_paths.py +0 -0
  117. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_bug_record.py +0 -0
  118. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_bug_validation.py +0 -0
  119. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_maintenance_scripts.py +0 -0
  120. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_process_runner.py +0 -0
  121. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_project.py +0 -0
  122. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_stage_materials.py +0 -0
  123. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_test_entry.py +0 -0
  124. {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_test_runner.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: workflow-loop
3
- Version: 0.2.0
3
+ Version: 0.3.2
4
4
  Summary: 为 AI 驱动的软件开发提供有状态、可验证、可回退的工作流管理。
5
5
  Author: yuzyf
6
6
  License-Expression: MIT
@@ -9,6 +9,7 @@ Project-URL: Repository, https://github.com/yuzyf/workflow_loop
9
9
  Requires-Python: >=3.11
10
10
  Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
+ Requires-Dist: markdown-it-py>=4.0
12
13
  Requires-Dist: packaging>=24.0
13
14
  Provides-Extra: dev
14
15
  Requires-Dist: build>=1.2; extra == "dev"
@@ -89,29 +90,29 @@ flowchart TD
89
90
  - 安装时能够访问 GitHub 和 PyPI(Python 公共软件包仓库)。
90
91
  - 执行安装命令前,先进入要由 Workflow Loop 管理的项目根目录。
91
92
 
92
- ## 安装 0.2.0
93
+ ## 安装 0.3.2
93
94
 
94
95
  安装器先进行只读检查并列出项目侧和电脑侧可能发生的全部持久修改。用户确认一次后,安装器才安装或复用全局 `workflow` 命令,并把智能体契约、产物模板和工作规范写入当前项目;用户取消或安装失败时不会留下只完成一部分的安装。
95
96
 
96
97
  ### macOS
97
98
 
98
99
  ```bash
99
- curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.2.0/install.sh | bash
100
+ curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.3.2/install.sh | bash
100
101
  ```
101
102
 
102
103
  ### Linux
103
104
 
104
105
  ```bash
105
- curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.2.0/install.sh | bash
106
+ curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.3.2/install.sh | bash
106
107
  ```
107
108
 
108
109
  ### 原生 Windows
109
110
 
110
111
  ```powershell
111
- powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/yuzyf/workflow_loop/releases/download/v0.2.0/install.ps1 | iex"
112
+ powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/yuzyf/workflow_loop/releases/download/v0.3.2/install.ps1 | iex"
112
113
  ```
113
114
 
114
- 安装命令固定读取 `v0.2.0` 正式发布中的脚本;不会跟随内容可能变化的 `latest`(最新版本)地址。
115
+ 安装命令固定读取 `v0.3.2` 正式发布中的脚本;不会跟随内容可能变化的 `latest`(最新版本)地址。
115
116
 
116
117
  ## 更新与卸载
117
118
 
@@ -119,7 +120,7 @@ powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/y
119
120
 
120
121
  ```bash
121
122
  workflow update
122
- workflow update --version 0.2.0
123
+ workflow update --version 0.3.2
123
124
  ```
124
125
 
125
126
  更新按需补齐电脑全局命令和当前项目,只直接覆盖项目根 `AGENTS.md`、`.workflow_loop/Template_Repository/`、`.workflow_loop/Standardized_Repository/`,以及 `.workflow_loop/project.json` 中的安装版本字段。更新不创建备份,不回滚已经完成的步骤;当前轮次状态、历史、回退资料、业务代码和正式产物保持不变。失败后重新执行同一命令即可继续补齐。
@@ -220,12 +221,32 @@ uv run python -m build
220
221
 
221
222
  `dev`(开发附加依赖)包含 `pytest`(Python 测试工具)、PyYAML(YAML 配置解析库)和 `build`(Python 分发包构建工具)。
222
223
 
224
+ ## 发布正式版本
225
+
226
+ 项目维护者确认当前仓库内容可以直接发布后,在仓库根目录执行下面的命令,并把 `0.3.2` 替换成要发布的新版本号:
227
+
228
+ ```bash
229
+ uv run python scripts/release.py 0.3.2
230
+ ```
231
+
232
+ 运行这条命令本身就表示维护者接受当前仓库状态并承担跳过本地发布检查的风险。脚本不会再次确认,也不会在本地运行测试、构建或远程版本查询。它依次执行:
233
+
234
+ 1. 更新源码、README、维护脚本和自动发布配置中的当前版本身份,并运行 `uv lock` 更新依赖锁定结果。
235
+ 2. 运行 `git add -A`,把当前全部未忽略的新增、修改和删除纳入发布提交。
236
+ 3. 创建说明为 `release: prepare workflow-loop <新版本号>` 的发布提交。
237
+ 4. 把当前提交推送到远程 `main`(默认分支)。
238
+ 5. 创建带说明的 `v<新版本号>` 标签。
239
+ 6. 推送该标签,触发现有 GitHub Actions(GitHub 自动任务)完成测试、构建和公开发布。
240
+
241
+ 任一步失败时,脚本会显示失败步骤和退出码并立即停止。它不会强推、自动重试或回滚已经完成的文件修改、提交、分支推送和标签操作。标签推送成功只表示远程发布流程已经触发;是否最终发布成功,以 GitHub Actions 的运行结果为准。
242
+
223
243
  ## 仓库结构
224
244
 
225
245
  ```text
226
246
  workflow_loop/
227
247
  ├── src/workflow_loop/ Python 产品代码和随包分发的模板、规范
228
248
  ├── tests/ 自动化测试
249
+ ├── scripts/release.py 维护者直接发布当前仓库的脚本
229
250
  ├── .workflow_loop/ 本仓库自己的工作流状态、模板和规范
230
251
  ├── spec/ 产品设计和代码架构设计
231
252
  ├── acceptance/ 验收计划与验收结果
@@ -237,8 +258,7 @@ workflow_loop/
237
258
  ├── update.ps1 Windows 旧版本更新脚本
238
259
  ├── uninstall.sh macOS 和 Linux 旧版本卸载脚本
239
260
  ├── uninstall.ps1 Windows 旧版本卸载脚本
240
- ├── CONTEXT.md 产品术语、规则和限制
241
- └── DESIGN.md 实现设计文档
261
+ └── docs/adr/ 已经发生的架构决策及其取代关系
242
262
  ```
243
263
 
244
264
  ## 详细文档
@@ -247,10 +267,11 @@ workflow_loop/
247
267
  - [安装到项目](spec/功能_安装到项目.md):支持环境、安装行为、异常处理和公开发布要求。
248
268
  - [更新已安装项目](spec/功能_更新已安装项目.md):目标版本、覆盖范围、保留范围和失败重试规则。
249
269
  - [卸载 Workflow Loop](spec/功能_卸载_Workflow_Loop.md):项目强制卸载和电脑全局卸载的独立边界。
270
+ - [发布正式版本](spec/功能_发布正式版本.md):人工发布命令、版本更新范围、执行顺序和失败边界。
250
271
  - [处理无需开发任务](spec/功能_处理无需开发任务.md):简单流程适用边界、逐项确认、完成和异常处理规则。
251
272
  - [代码架构设计](spec/代码架构设计.md):功能到代码模块、状态和外部依赖的对应关系。
252
- - [实现设计文档](DESIGN.md):命令、数据模型、工作意图、阶段路径和门禁的实现形态。
253
- - [产品事实与约束](CONTEXT.md):当前有效的术语、约束和设计决策。
273
+ - [原生 Windows PowerShell 决策](docs/adr/0001-support-native-windows-powershell.md):为什么正式支持原生 Windows PowerShell。
274
+ - [首版版本策略决策](docs/adr/0002-fix-product-version-at-0-1-0.md):首版版本号决定及其被后续功能取代的状态。
254
275
  - [需求交付追踪表](需求交付追踪表.md):每轮需求从设计到验收的完整追踪入口。
255
276
 
256
277
  ## 许可证
@@ -71,29 +71,29 @@ flowchart TD
71
71
  - 安装时能够访问 GitHub 和 PyPI(Python 公共软件包仓库)。
72
72
  - 执行安装命令前,先进入要由 Workflow Loop 管理的项目根目录。
73
73
 
74
- ## 安装 0.2.0
74
+ ## 安装 0.3.2
75
75
 
76
76
  安装器先进行只读检查并列出项目侧和电脑侧可能发生的全部持久修改。用户确认一次后,安装器才安装或复用全局 `workflow` 命令,并把智能体契约、产物模板和工作规范写入当前项目;用户取消或安装失败时不会留下只完成一部分的安装。
77
77
 
78
78
  ### macOS
79
79
 
80
80
  ```bash
81
- curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.2.0/install.sh | bash
81
+ curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.3.2/install.sh | bash
82
82
  ```
83
83
 
84
84
  ### Linux
85
85
 
86
86
  ```bash
87
- curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.2.0/install.sh | bash
87
+ curl -fsSL https://github.com/yuzyf/workflow_loop/releases/download/v0.3.2/install.sh | bash
88
88
  ```
89
89
 
90
90
  ### 原生 Windows
91
91
 
92
92
  ```powershell
93
- powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/yuzyf/workflow_loop/releases/download/v0.2.0/install.ps1 | iex"
93
+ powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/yuzyf/workflow_loop/releases/download/v0.3.2/install.ps1 | iex"
94
94
  ```
95
95
 
96
- 安装命令固定读取 `v0.2.0` 正式发布中的脚本;不会跟随内容可能变化的 `latest`(最新版本)地址。
96
+ 安装命令固定读取 `v0.3.2` 正式发布中的脚本;不会跟随内容可能变化的 `latest`(最新版本)地址。
97
97
 
98
98
  ## 更新与卸载
99
99
 
@@ -101,7 +101,7 @@ powershell -NoProfile -ExecutionPolicy Bypass -Command "irm https://github.com/y
101
101
 
102
102
  ```bash
103
103
  workflow update
104
- workflow update --version 0.2.0
104
+ workflow update --version 0.3.2
105
105
  ```
106
106
 
107
107
  更新按需补齐电脑全局命令和当前项目,只直接覆盖项目根 `AGENTS.md`、`.workflow_loop/Template_Repository/`、`.workflow_loop/Standardized_Repository/`,以及 `.workflow_loop/project.json` 中的安装版本字段。更新不创建备份,不回滚已经完成的步骤;当前轮次状态、历史、回退资料、业务代码和正式产物保持不变。失败后重新执行同一命令即可继续补齐。
@@ -202,12 +202,32 @@ uv run python -m build
202
202
 
203
203
  `dev`(开发附加依赖)包含 `pytest`(Python 测试工具)、PyYAML(YAML 配置解析库)和 `build`(Python 分发包构建工具)。
204
204
 
205
+ ## 发布正式版本
206
+
207
+ 项目维护者确认当前仓库内容可以直接发布后,在仓库根目录执行下面的命令,并把 `0.3.2` 替换成要发布的新版本号:
208
+
209
+ ```bash
210
+ uv run python scripts/release.py 0.3.2
211
+ ```
212
+
213
+ 运行这条命令本身就表示维护者接受当前仓库状态并承担跳过本地发布检查的风险。脚本不会再次确认,也不会在本地运行测试、构建或远程版本查询。它依次执行:
214
+
215
+ 1. 更新源码、README、维护脚本和自动发布配置中的当前版本身份,并运行 `uv lock` 更新依赖锁定结果。
216
+ 2. 运行 `git add -A`,把当前全部未忽略的新增、修改和删除纳入发布提交。
217
+ 3. 创建说明为 `release: prepare workflow-loop <新版本号>` 的发布提交。
218
+ 4. 把当前提交推送到远程 `main`(默认分支)。
219
+ 5. 创建带说明的 `v<新版本号>` 标签。
220
+ 6. 推送该标签,触发现有 GitHub Actions(GitHub 自动任务)完成测试、构建和公开发布。
221
+
222
+ 任一步失败时,脚本会显示失败步骤和退出码并立即停止。它不会强推、自动重试或回滚已经完成的文件修改、提交、分支推送和标签操作。标签推送成功只表示远程发布流程已经触发;是否最终发布成功,以 GitHub Actions 的运行结果为准。
223
+
205
224
  ## 仓库结构
206
225
 
207
226
  ```text
208
227
  workflow_loop/
209
228
  ├── src/workflow_loop/ Python 产品代码和随包分发的模板、规范
210
229
  ├── tests/ 自动化测试
230
+ ├── scripts/release.py 维护者直接发布当前仓库的脚本
211
231
  ├── .workflow_loop/ 本仓库自己的工作流状态、模板和规范
212
232
  ├── spec/ 产品设计和代码架构设计
213
233
  ├── acceptance/ 验收计划与验收结果
@@ -219,8 +239,7 @@ workflow_loop/
219
239
  ├── update.ps1 Windows 旧版本更新脚本
220
240
  ├── uninstall.sh macOS 和 Linux 旧版本卸载脚本
221
241
  ├── uninstall.ps1 Windows 旧版本卸载脚本
222
- ├── CONTEXT.md 产品术语、规则和限制
223
- └── DESIGN.md 实现设计文档
242
+ └── docs/adr/ 已经发生的架构决策及其取代关系
224
243
  ```
225
244
 
226
245
  ## 详细文档
@@ -229,10 +248,11 @@ workflow_loop/
229
248
  - [安装到项目](spec/功能_安装到项目.md):支持环境、安装行为、异常处理和公开发布要求。
230
249
  - [更新已安装项目](spec/功能_更新已安装项目.md):目标版本、覆盖范围、保留范围和失败重试规则。
231
250
  - [卸载 Workflow Loop](spec/功能_卸载_Workflow_Loop.md):项目强制卸载和电脑全局卸载的独立边界。
251
+ - [发布正式版本](spec/功能_发布正式版本.md):人工发布命令、版本更新范围、执行顺序和失败边界。
232
252
  - [处理无需开发任务](spec/功能_处理无需开发任务.md):简单流程适用边界、逐项确认、完成和异常处理规则。
233
253
  - [代码架构设计](spec/代码架构设计.md):功能到代码模块、状态和外部依赖的对应关系。
234
- - [实现设计文档](DESIGN.md):命令、数据模型、工作意图、阶段路径和门禁的实现形态。
235
- - [产品事实与约束](CONTEXT.md):当前有效的术语、约束和设计决策。
254
+ - [原生 Windows PowerShell 决策](docs/adr/0001-support-native-windows-powershell.md):为什么正式支持原生 Windows PowerShell。
255
+ - [首版版本策略决策](docs/adr/0002-fix-product-version-at-0-1-0.md):首版版本号决定及其被后续功能取代的状态。
236
256
  - [需求交付追踪表](需求交付追踪表.md):每轮需求从设计到验收的完整追踪入口。
237
257
 
238
258
  ## 许可证
@@ -1,13 +1,13 @@
1
1
  [project]
2
2
  name = "workflow-loop"
3
- version = "0.2.0"
3
+ version = "0.3.2"
4
4
  description = "为 AI 驱动的软件开发提供有状态、可验证、可回退的工作流管理。"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
7
7
  license = "MIT"
8
8
  license-files = ["LICENSE"]
9
9
  authors = [{ name = "yuzyf" }]
10
- dependencies = ["packaging>=24.0"]
10
+ dependencies = ["markdown-it-py>=4.0", "packaging>=24.0"]
11
11
 
12
12
  [project.scripts]
13
13
  workflow = "workflow_loop.cli:main"
@@ -1,6 +1,6 @@
1
1
  # 包版本号,用于 pip/uv 安装时版本匹配
2
- __version__ = "0.2.0"
2
+ __version__ = "0.3.2"
3
3
  # 产品身份标识:workflow --version 输出、安装脚本身份核对和安装事务校验共用同一组常量
4
- # 本次发布版本为 0.2.0;后续发布使用尚未被 PyPI 占用的新版本号
4
+ # 本次发布版本为 0.3.2;后续发布使用尚未被 PyPI 占用的新版本号
5
5
  PRODUCT_NAME = "workflow-loop"
6
6
  PRODUCT_IDENTITY = f"{PRODUCT_NAME} {__version__}"
@@ -62,6 +62,13 @@ def automated_test_ids(project_root: str, topic: str, criterion_id: str) -> list
62
62
  ]
63
63
 
64
64
 
65
+ def _execution_stage(
66
+ wf_state: state_mod.WorkflowState,
67
+ ) -> state_mod.StageState | None:
68
+ """读取当前测试验证任务,并兼容尚未迁移的旧测试执行状态。"""
69
+ return wf_state.stages.get("qa") or wf_state.stages.get("test_execution")
70
+
71
+
65
72
  def record_is_current(
66
73
  record: state_mod.AcceptanceCriterionRecord,
67
74
  wf_state: state_mod.WorkflowState,
@@ -78,17 +85,15 @@ def record_is_current(
78
85
  if record.result != "passed" or record.record_id != compute_record_id(record):
79
86
  return False
80
87
  if record.method in ("自动化测试", "自动化测试 + 人工验收") and record.test_ids:
81
- tasks = wf_state.stages.get(
82
- "test_execution",
83
- state_mod.StageState(),
84
- ).test_tasks.get(record.topic, {})
88
+ execution_stage = _execution_stage(wf_state) or state_mod.StageState()
89
+ tasks = execution_stage.test_tasks.get(record.topic, {})
85
90
  current_ids: list[str] = []
86
91
  for test_id in record.test_ids:
87
92
  task = tasks.get(test_id)
88
93
  if (
89
94
  task is None
90
- or task.current_record is None
91
- or task.current_record.status != "passed"
95
+ or not state_mod.execution_task_has_current_success(task)
96
+ or not task.current_record
92
97
  or not task.current_record.record_id
93
98
  ):
94
99
  return False
@@ -106,18 +111,17 @@ def _automated_items_are_current(
106
111
  test_ids: list[str],
107
112
  ) -> tuple[bool, str, list[str]]:
108
113
  """核对每个测试项当前机器记录有效,并返回精确记录编号列表。"""
109
- stage_state = wf_state.stages.get("test_execution")
114
+ stage_state = _execution_stage(wf_state)
110
115
  if stage_state is None:
111
- return False, "缺少 test_execution(测试执行阶段)状态", []
116
+ return False, "缺少 qa(测试验证)或 test_execution(旧测试执行阶段)状态", []
112
117
  tasks = stage_state.test_tasks.get(topic, {})
113
118
  record_ids: list[str] = []
114
119
  for test_id in test_ids:
115
120
  task = tasks.get(test_id)
116
- if task is None or task.status != "passed" or task.current_record is None:
121
+ if task is None or not state_mod.execution_task_has_current_success(task):
117
122
  return False, f"{topic} / {test_id} 没有当前有效的通过记录", []
118
123
  record = task.current_record
119
- if record.status != "passed" or record.exit_code != 0:
120
- return False, f"{topic} / {test_id} 当前测试记录不是通过状态", []
124
+ assert record is not None
121
125
  if not record.record_id:
122
126
  return False, f"{topic} / {test_id} 的执行记录缺少机器记录编号,必须重新执行", []
123
127
  record_ids.append(record.record_id)