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.
- {workflow_loop-0.3.2/src/workflow_loop.egg-info → workflow_loop-0.3.4}/PKG-INFO +18 -14
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/README.md +17 -13
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/pyproject.toml +1 -1
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/__init__.py +2 -2
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/artifact_validation.py +40 -2
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/bug_record.py +3 -2
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/cli.py +366 -68
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/acceptance/acceptance_plan.md +8 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/impl/code_implementation.md +4 -1
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/impl/impl.md +11 -3
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/acceptance/acceptance_plan.md +7 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/impl/impl.md +16 -7
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/qa/test.md +2 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/qa/test_plan.md +2 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/reproduce/reproduce.md +2 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/rollback.py +1246 -156
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/stages/stages.py +256 -24
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/topic.py +19 -10
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/verification.py +183 -27
- {workflow_loop-0.3.2 → workflow_loop-0.3.4/src/workflow_loop.egg-info}/PKG-INFO +18 -14
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_bug_validation.py +34 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_commands.py +367 -2
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_current_workflow_qa.py +1 -1
- workflow_loop-0.3.4/tests/test_diagnostics.py +391 -0
- workflow_loop-0.3.4/tests/test_rollback.py +1280 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_spike_assets.py +7 -2
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_stages.py +330 -1
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_verification.py +71 -3
- workflow_loop-0.3.2/tests/test_diagnostics.py +0 -216
- workflow_loop-0.3.2/tests/test_rollback.py +0 -610
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/LICENSE +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/setup.cfg +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/acceptance_records.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/artifact_paths.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/acceptance/acceptance.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/code_design/code_design.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/code_design/project_design_init.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/code_design/update_code_design.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/global/document_writing.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/global/workflow_lifecycle.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/qa/test.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/qa/test_code.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/qa/test_code_implementation.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/qa/test_plan.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/reproduce/reproduce.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/spec/spec.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Standardized_Repository/spike/spike.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/acceptance/acceptance_result.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/code_design/code_design.md +0 -0
- {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
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/spec/spec.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/data/Template_Repository/spike/spike.md +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/diagnostics.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/installer.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/journal.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/markdown_links.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/path_composer.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/process_runner.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/project.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/role_doc.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/snapshots.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/spike_reuse.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/spike_validation.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/stage_materials.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/stages/__init__.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/stages/base.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/state.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/test_entry.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/test_execution.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/test_mapping.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/test_report.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/test_runner.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/topic_relations.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop/traceability.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop.egg-info/SOURCES.txt +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop.egg-info/dependency_links.txt +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop.egg-info/entry_points.txt +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop.egg-info/requires.txt +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/src/workflow_loop.egg-info/top_level.txt +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_acceptance_records.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_architecture_validation.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_artifact_paths.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_bug_record.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_current_workflow_contracts.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_installer.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_light_task.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_maintenance.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_maintenance_scripts.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_markdown_links.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_path_composer.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_process_runner.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_project.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_project_design_init.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_public_project.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_release_script.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_release_workflow.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_snapshots.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_spike_validation.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_stage_materials.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_state.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_test_entry.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_test_execution.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_test_mapping.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_test_report.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_test_runner.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_topic_relations.py +0 -0
- {workflow_loop-0.3.2 → workflow_loop-0.3.4}/tests/test_traceability.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
230
|
+
项目维护者确认当前仓库内容可以直接发布后,在仓库根目录执行下面的命令,并把 `0.3.4` 替换成要发布的新版本号:
|
|
227
231
|
|
|
228
232
|
```bash
|
|
229
|
-
uv run python scripts/release.py 0.3.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
211
|
+
项目维护者确认当前仓库内容可以直接发布后,在仓库根目录执行下面的命令,并把 `0.3.4` 替换成要发布的新版本号:
|
|
208
212
|
|
|
209
213
|
```bash
|
|
210
|
-
uv run python scripts/release.py 0.3.
|
|
214
|
+
uv run python scripts/release.py 0.3.4
|
|
211
215
|
```
|
|
212
216
|
|
|
213
217
|
运行这条命令本身就表示维护者接受当前仓库状态并承担跳过本地发布检查的风险。脚本不会再次确认,也不会在本地运行测试、构建或远程版本查询。它依次执行:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 包版本号,用于 pip/uv 安装时版本匹配
|
|
2
|
-
__version__ = "0.3.
|
|
2
|
+
__version__ = "0.3.4"
|
|
3
3
|
# 产品身份标识:workflow --version 输出、安装脚本身份核对和安装事务校验共用同一组常量
|
|
4
|
-
# 本次发布版本为 0.3.
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
16
|
-
|
|
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,
|