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.
- {workflow_loop-0.2.0/src/workflow_loop.egg-info → workflow_loop-0.3.2}/PKG-INFO +32 -11
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/README.md +30 -10
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/pyproject.toml +2 -2
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/__init__.py +2 -2
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/acceptance_records.py +15 -11
- workflow_loop-0.3.2/src/workflow_loop/artifact_validation.py +2554 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/cli.py +2341 -322
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/acceptance/acceptance.md +7 -5
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/acceptance/acceptance_plan.md +13 -7
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/code_design/code_design.md +18 -26
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/code_design/project_design_init.md +34 -4
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/code_design/update_code_design.md +5 -5
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/global/workflow_lifecycle.md +31 -7
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/impl/code_implementation.md +13 -14
- workflow_loop-0.3.2/src/workflow_loop/data/Standardized_Repository/impl/impl.md +160 -0
- workflow_loop-0.3.2/src/workflow_loop/data/Standardized_Repository/qa/test.md +170 -0
- workflow_loop-0.3.2/src/workflow_loop/data/Standardized_Repository/qa/test_code.md +107 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/qa/test_code_implementation.md +13 -12
- workflow_loop-0.3.2/src/workflow_loop/data/Standardized_Repository/qa/test_plan.md +185 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/spec/spec.md +15 -3
- workflow_loop-0.3.2/src/workflow_loop/data/Standardized_Repository/spike/spike.md +208 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/acceptance/acceptance_plan.md +24 -14
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/acceptance/acceptance_result.md +1 -1
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/code_design/code_design.md +8 -9
- workflow_loop-0.3.2/src/workflow_loop/data/Template_Repository/code_design/project_design_init_evidence.md +72 -0
- workflow_loop-0.3.2/src/workflow_loop/data/Template_Repository/impl/impl.md +143 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/qa/test.md +16 -7
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/qa/test_plan.md +26 -24
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/spec/spec.md +9 -5
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/spike/spike.md +27 -10
- workflow_loop-0.3.2/src/workflow_loop/diagnostics.py +459 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/installer.py +1 -1
- workflow_loop-0.3.2/src/workflow_loop/markdown_links.py +611 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/path_composer.py +23 -37
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/project.py +3 -3
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/role_doc.py +9 -28
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/rollback.py +704 -38
- workflow_loop-0.3.2/src/workflow_loop/snapshots.py +207 -0
- workflow_loop-0.3.2/src/workflow_loop/spike_reuse.py +666 -0
- workflow_loop-0.3.2/src/workflow_loop/spike_validation.py +827 -0
- workflow_loop-0.3.2/src/workflow_loop/stages/base.py +322 -0
- workflow_loop-0.3.2/src/workflow_loop/stages/stages.py +1560 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/state.py +256 -3
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/test_execution.py +369 -85
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/test_mapping.py +375 -42
- workflow_loop-0.3.2/src/workflow_loop/test_report.py +371 -0
- workflow_loop-0.3.2/src/workflow_loop/topic_relations.py +329 -0
- workflow_loop-0.3.2/src/workflow_loop/traceability.py +945 -0
- workflow_loop-0.3.2/src/workflow_loop/verification.py +2569 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2/src/workflow_loop.egg-info}/PKG-INFO +32 -11
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop.egg-info/SOURCES.txt +16 -2
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop.egg-info/requires.txt +1 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_acceptance_records.py +154 -18
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_architecture_validation.py +93 -1
- workflow_loop-0.3.2/tests/test_commands.py +1078 -0
- workflow_loop-0.3.2/tests/test_current_workflow_contracts.py +636 -0
- workflow_loop-0.3.2/tests/test_current_workflow_qa.py +819 -0
- workflow_loop-0.3.2/tests/test_diagnostics.py +216 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_installer.py +1 -1
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_light_task.py +4 -7
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_maintenance.py +19 -14
- workflow_loop-0.3.2/tests/test_markdown_links.py +245 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_path_composer.py +20 -20
- workflow_loop-0.3.2/tests/test_project_design_init.py +201 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_public_project.py +11 -7
- workflow_loop-0.3.2/tests/test_release_script.py +256 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_release_workflow.py +22 -26
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_rollback.py +298 -9
- workflow_loop-0.3.2/tests/test_snapshots.py +108 -0
- workflow_loop-0.3.2/tests/test_spike_assets.py +995 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_spike_validation.py +14 -12
- workflow_loop-0.3.2/tests/test_stages.py +572 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_state.py +97 -3
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_test_execution.py +254 -38
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_test_mapping.py +157 -21
- workflow_loop-0.3.2/tests/test_test_report.py +255 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_topic_relations.py +82 -1
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_traceability.py +137 -12
- workflow_loop-0.3.2/tests/test_verification.py +1450 -0
- workflow_loop-0.3.2/tests/test_workflow_acceptance.py +284 -0
- workflow_loop-0.2.0/src/workflow_loop/artifact_validation.py +0 -1738
- workflow_loop-0.2.0/src/workflow_loop/data/Standardized_Repository/code_design/revise_code_design.md +0 -32
- workflow_loop-0.2.0/src/workflow_loop/data/Standardized_Repository/impl/impl.md +0 -164
- workflow_loop-0.2.0/src/workflow_loop/data/Standardized_Repository/qa/test.md +0 -167
- workflow_loop-0.2.0/src/workflow_loop/data/Standardized_Repository/qa/test_code.md +0 -121
- workflow_loop-0.2.0/src/workflow_loop/data/Standardized_Repository/qa/test_plan.md +0 -160
- workflow_loop-0.2.0/src/workflow_loop/data/Standardized_Repository/spike/spike.md +0 -236
- workflow_loop-0.2.0/src/workflow_loop/data/Template_Repository/code_design/project_design_init_evidence.md +0 -39
- workflow_loop-0.2.0/src/workflow_loop/data/Template_Repository/impl/impl.md +0 -112
- workflow_loop-0.2.0/src/workflow_loop/spike_validation.py +0 -379
- workflow_loop-0.2.0/src/workflow_loop/stages/base.py +0 -164
- workflow_loop-0.2.0/src/workflow_loop/stages/stages.py +0 -1191
- workflow_loop-0.2.0/src/workflow_loop/topic_relations.py +0 -202
- workflow_loop-0.2.0/src/workflow_loop/traceability.py +0 -533
- workflow_loop-0.2.0/src/workflow_loop/verification.py +0 -971
- workflow_loop-0.2.0/tests/test_commands.py +0 -391
- workflow_loop-0.2.0/tests/test_stages.py +0 -314
- workflow_loop-0.2.0/tests/test_verification.py +0 -586
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/LICENSE +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/setup.cfg +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/artifact_paths.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/bug_record.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/global/document_writing.md +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Standardized_Repository/reproduce/reproduce.md +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/data/Template_Repository/reproduce/reproduce.md +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/journal.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/process_runner.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/stage_materials.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/stages/__init__.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/test_entry.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/test_runner.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop/topic.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop.egg-info/dependency_links.txt +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop.egg-info/entry_points.txt +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/src/workflow_loop.egg-info/top_level.txt +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_artifact_paths.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_bug_record.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_bug_validation.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_maintenance_scripts.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_process_runner.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_project.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_stage_materials.py +0 -0
- {workflow_loop-0.2.0 → workflow_loop-0.3.2}/tests/test_test_entry.py +0 -0
- {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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
- [
|
|
253
|
-
- [
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
- [
|
|
235
|
-
- [
|
|
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
|
|
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
|
|
2
|
+
__version__ = "0.3.2"
|
|
3
3
|
# 产品身份标识:workflow --version 输出、安装脚本身份核对和安装事务校验共用同一组常量
|
|
4
|
-
# 本次发布版本为 0.2
|
|
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
|
-
|
|
82
|
-
|
|
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
|
|
91
|
-
or task.current_record
|
|
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
|
|
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
|
|
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
|
-
|
|
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)
|