@hupan56/wlkj 3.1.22 → 3.1.24
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.
package/package.json
CHANGED
|
@@ -46,7 +46,7 @@ npx @hupan56/wlkj update # 刷新引擎 + 自动补 pip 依赖 + 刷 launcher
|
|
|
46
46
|
- **requirements.txt**: 新建。9 个依赖按用途分组(核心/索引/测试/可选),标清版本+用途。
|
|
47
47
|
- **init_doctor 加 check_dependencies()**: 检查 9 个 pip 包,核心缺失报 problem + 提示 pip install,--fix 自动装。
|
|
48
48
|
- **install-env (cli.js) 加 pip install**: Node/Python/git 装完后自动 `pip install -r requirements.txt`。
|
|
49
|
-
- **mcp_launcher.py 进仓库**: .qoder/scripts/mcp_launcher.py(随引擎分发),install 时复制到 ~/.qoderwork/。
|
|
49
|
+
- **mcp_launcher.py 进仓库**: .qoder/scripts/protocol/mcp/mcp_launcher.py(随引擎分发),install 时复制到 ~/.qoderwork/。
|
|
50
50
|
- **install_qoderwork.py 全新机器兜底**:
|
|
51
51
|
- mcp.json 不存在时创建空骨架(不再 return 跳过)
|
|
52
52
|
- kg/mysql/lanhu 条目不存在时自动创建(不再只改已有的)
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
```
|
|
68
68
|
|
|
69
69
|
起点必须是模板 `.qoder/templates/prototype-{web|app}.html`,
|
|
70
|
-
预填充走 `python .qoder/scripts/
|
|
70
|
+
预填充走 `python .qoder/scripts/orchestration/wlkj.py fill-prototype <关键词> --platform <web|app> [--type table-page|form-page]`。
|
|
71
71
|
|
|
72
72
|
**铁律**:data/style/ 里有同需求的 spec.json → 原型必须锚定它,不许另起炉灶。
|
|
73
73
|
|
|
@@ -1,125 +1,125 @@
|
|
|
1
|
-
# 模块契约:task(任务)
|
|
2
|
-
|
|
3
|
-
> 任务模块。把 PRD 拆成可执行任务 + RICE 排优先级。
|
|
4
|
-
> task.json 是本模块的**唯一事实源**。
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Input(吃什么)
|
|
9
|
-
|
|
10
|
-
| 优先级 | 输入 | 怎么用 |
|
|
11
|
-
|--------|------|--------|
|
|
12
|
-
| **完整** | 一份 PRD(`REQ-*.md`) | 功能清单 → 拆任务 |
|
|
13
|
-
| 降级 1 | PRD 草稿(drafts 里的) | 也能拆,只是还没发布 |
|
|
14
|
-
| 降级 2 | 一句话任务描述 | 直接 `task.py create "XXX"` |
|
|
15
|
-
| 参考 | 已有任务 | `task.py list` 看排期,避免重复 |
|
|
16
|
-
|
|
17
|
-
不强依赖 prd 模块执行——可以直接手动建任务。
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Output(吐什么)
|
|
22
|
-
|
|
23
|
-
### 任务目录
|
|
24
|
-
|
|
25
|
-
```
|
|
26
|
-
路径:workspace/tasks/{MM-DD-slug}/
|
|
27
|
-
内含:
|
|
28
|
-
task.json ← 任务元数据 + 状态 + RICE
|
|
29
|
-
prd.md ← 任务级需求(可空)
|
|
30
|
-
implement.jsonl ← 实现记录
|
|
31
|
-
check.jsonl ← 检查记录
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### task.json 骨架(对齐 task.py 真实输出)
|
|
35
|
-
|
|
36
|
-
```json
|
|
37
|
-
{
|
|
38
|
-
"title": "...",
|
|
39
|
-
"slug": "baodan-piGai",
|
|
40
|
-
"status": "planning", // planning → in_progress → completed(归档时再补 archived_at)
|
|
41
|
-
"priority": "P0|P1|P2|P3",
|
|
42
|
-
"assignee": "{developer}", // ← 注意是 assignee 不是 owner
|
|
43
|
-
"creator": "{developer}",
|
|
44
|
-
"created_at": "...", "updated_at": "...",
|
|
45
|
-
"branch": null, "base_branch": null,
|
|
46
|
-
"scope": null,
|
|
47
|
-
"parent": null, "children": [], // 父子任务
|
|
48
|
-
"tags": ["REQ-2026-0042"], // ← PRD 的 REQ-ID 记这里(双向追溯)
|
|
49
|
-
"rice": 24, // ← RICE 排序时 AI 算好后写入(数值,不是对象)
|
|
50
|
-
// 能力增强字段(可选,旧 task.json 不含时取默认值)
|
|
51
|
-
"due_date": "2026-07-01", // YYYY-MM-DD(set-due 写)
|
|
52
|
-
"start_date": null,
|
|
53
|
-
"estimate_hours": null,
|
|
54
|
-
"blocked_by": [], // 被哪些任务阻塞(block 写,自动维护反向 blocks)
|
|
55
|
-
"blocks": [], // 被哪些任务依赖(自动维护)
|
|
56
|
-
"stage_ts": { "created": "...", "started": null, "completed": null },
|
|
57
|
-
"zentao_id": null // 对应禅道任务 ID(zentao_sync 写)。幂等主键: 已有则跳过 create。
|
|
58
|
-
// 隔离契约见 contracts/isolation.md「禅道同步」。
|
|
59
|
-
}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
> ⚠️ 字段名以 **task.py 实际输出**为准(`assignee`/`planning`/`completed`/`rice` 为数值)。
|
|
63
|
-
> 上面是权威骨架,与 task.py 的 `cmd_create` 逐字段对齐。
|
|
64
|
-
|
|
65
|
-
### 状态流转
|
|
66
|
-
|
|
67
|
-
```
|
|
68
|
-
create(planning) → start → in_progress → finish → completed → archive
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**关键动作都会自动 stage workspace/tasks/ 到 team_sync**(push 后团队可见)。
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## 操作命令
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
# 基础生命周期
|
|
79
|
-
python .qoder/scripts/
|
|
80
|
-
python .qoder/scripts/
|
|
81
|
-
python .qoder/scripts/
|
|
82
|
-
python .qoder/scripts/
|
|
83
|
-
python .qoder/scripts/
|
|
84
|
-
python .qoder/scripts/
|
|
85
|
-
python .qoder/scripts/
|
|
86
|
-
|
|
87
|
-
# 子任务
|
|
88
|
-
python .qoder/scripts/
|
|
89
|
-
python .qoder/scripts/
|
|
90
|
-
|
|
91
|
-
# 排期与依赖(B2 能力)
|
|
92
|
-
python .qoder/scripts/
|
|
93
|
-
python .qoder/scripts/
|
|
94
|
-
python .qoder/scripts/
|
|
95
|
-
python .qoder/scripts/
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
**退出码**:`0`=成功 / `1`=任务不存在/JSON 缺失/循环依赖 / `4`=权限不足(零信任 ACL,仅 creator/assignee/admin 可改)。
|
|
99
|
-
|
|
100
|
-
**RICE** = Reach × Impact × Confidence ÷ Effort(AI 层评估,算好后写入 task.json 的 `rice` 数值字段)
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## 校验
|
|
105
|
-
|
|
106
|
-
- ❌ **无独立校验脚本**。当前靠 task.py 自身的状态机约束。
|
|
107
|
-
- 软契约:task.json 缺 `_contract` / `acceptance` 只警告不拦。
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## 与上下游的接口
|
|
112
|
-
|
|
113
|
-
| 方向 | 接口 |
|
|
114
|
-
|------|------|
|
|
115
|
-
| 上游 prd | 读 PRD 的功能清单 → 拆任务 |
|
|
116
|
-
| 下游 spec/code | 任务目录可放 `spec.md`(spec 模块写到任务目录时) |
|
|
117
|
-
|
|
118
|
-
---
|
|
119
|
-
|
|
120
|
-
## 现状提醒
|
|
121
|
-
|
|
122
|
-
- ✅ task.py 功能完整:CRUD + 依赖图(block/unblock + 循环检测)+ 排期(set-due/gantt)+ 子任务 + 零信任 ACL + 归档孤儿依赖清理。
|
|
123
|
-
- ✅ PRD→task 衔接:create 时把 REQ-ID 记进 `tags`,PRD 验收点贴进 task 的 `prd.md`(命令层引导)。
|
|
124
|
-
- ✅ RICE 排序在 AI 层(task.py 只存数值,不替 AI 算分)。
|
|
125
|
-
- 🧩 QoderWork 增强(可选):待办双向同步。无连接器则回退,task.json 仍为准。
|
|
1
|
+
# 模块契约:task(任务)
|
|
2
|
+
|
|
3
|
+
> 任务模块。把 PRD 拆成可执行任务 + RICE 排优先级。
|
|
4
|
+
> task.json 是本模块的**唯一事实源**。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Input(吃什么)
|
|
9
|
+
|
|
10
|
+
| 优先级 | 输入 | 怎么用 |
|
|
11
|
+
|--------|------|--------|
|
|
12
|
+
| **完整** | 一份 PRD(`REQ-*.md`) | 功能清单 → 拆任务 |
|
|
13
|
+
| 降级 1 | PRD 草稿(drafts 里的) | 也能拆,只是还没发布 |
|
|
14
|
+
| 降级 2 | 一句话任务描述 | 直接 `task.py create "XXX"` |
|
|
15
|
+
| 参考 | 已有任务 | `task.py list` 看排期,避免重复 |
|
|
16
|
+
|
|
17
|
+
不强依赖 prd 模块执行——可以直接手动建任务。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Output(吐什么)
|
|
22
|
+
|
|
23
|
+
### 任务目录
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
路径:workspace/tasks/{MM-DD-slug}/
|
|
27
|
+
内含:
|
|
28
|
+
task.json ← 任务元数据 + 状态 + RICE
|
|
29
|
+
prd.md ← 任务级需求(可空)
|
|
30
|
+
implement.jsonl ← 实现记录
|
|
31
|
+
check.jsonl ← 检查记录
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### task.json 骨架(对齐 task.py 真实输出)
|
|
35
|
+
|
|
36
|
+
```json
|
|
37
|
+
{
|
|
38
|
+
"title": "...",
|
|
39
|
+
"slug": "baodan-piGai",
|
|
40
|
+
"status": "planning", // planning → in_progress → completed(归档时再补 archived_at)
|
|
41
|
+
"priority": "P0|P1|P2|P3",
|
|
42
|
+
"assignee": "{developer}", // ← 注意是 assignee 不是 owner
|
|
43
|
+
"creator": "{developer}",
|
|
44
|
+
"created_at": "...", "updated_at": "...",
|
|
45
|
+
"branch": null, "base_branch": null,
|
|
46
|
+
"scope": null,
|
|
47
|
+
"parent": null, "children": [], // 父子任务
|
|
48
|
+
"tags": ["REQ-2026-0042"], // ← PRD 的 REQ-ID 记这里(双向追溯)
|
|
49
|
+
"rice": 24, // ← RICE 排序时 AI 算好后写入(数值,不是对象)
|
|
50
|
+
// 能力增强字段(可选,旧 task.json 不含时取默认值)
|
|
51
|
+
"due_date": "2026-07-01", // YYYY-MM-DD(set-due 写)
|
|
52
|
+
"start_date": null,
|
|
53
|
+
"estimate_hours": null,
|
|
54
|
+
"blocked_by": [], // 被哪些任务阻塞(block 写,自动维护反向 blocks)
|
|
55
|
+
"blocks": [], // 被哪些任务依赖(自动维护)
|
|
56
|
+
"stage_ts": { "created": "...", "started": null, "completed": null },
|
|
57
|
+
"zentao_id": null // 对应禅道任务 ID(zentao_sync 写)。幂等主键: 已有则跳过 create。
|
|
58
|
+
// 隔离契约见 contracts/isolation.md「禅道同步」。
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
> ⚠️ 字段名以 **task.py 实际输出**为准(`assignee`/`planning`/`completed`/`rice` 为数值)。
|
|
63
|
+
> 上面是权威骨架,与 task.py 的 `cmd_create` 逐字段对齐。
|
|
64
|
+
|
|
65
|
+
### 状态流转
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
create(planning) → start → in_progress → finish → completed → archive
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**关键动作都会自动 stage workspace/tasks/ 到 team_sync**(push 后团队可见)。
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 操作命令
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# 基础生命周期
|
|
79
|
+
python .qoder/scripts/orchestration/wlkj.py task create "XXX" [--slug ...] [--assignee ...] [--priority P0|P1|P2|P3]
|
|
80
|
+
python .qoder/scripts/orchestration/wlkj.py task list [--mine] [--status in_progress] [--ready] [--blocked]
|
|
81
|
+
python .qoder/scripts/orchestration/wlkj.py task show <task-dir>
|
|
82
|
+
python .qoder/scripts/orchestration/wlkj.py task start <task-dir> # planning → in_progress,设为活跃任务
|
|
83
|
+
python .qoder/scripts/orchestration/wlkj.py task current [--source] # 看当前活跃任务
|
|
84
|
+
python .qoder/scripts/orchestration/wlkj.py task finish # 活跃任务 → completed,清活跃指针
|
|
85
|
+
python .qoder/scripts/orchestration/wlkj.py task archive <task-dir> # 移到 .qoder/archive/{YYYY-MM}/,自动清孤儿依赖
|
|
86
|
+
|
|
87
|
+
# 子任务
|
|
88
|
+
python .qoder/scripts/orchestration/wlkj.py task add-subtask <parent> <child>
|
|
89
|
+
python .qoder/scripts/orchestration/wlkj.py task remove-subtask <parent> <child>
|
|
90
|
+
|
|
91
|
+
# 排期与依赖(B2 能力)
|
|
92
|
+
python .qoder/scripts/orchestration/wlkj.py task set-due <task> <YYYY-MM-DD>
|
|
93
|
+
python .qoder/scripts/orchestration/wlkj.py task block <task> <blocker> # 循环依赖自动检测,反向 blocks 自动维护
|
|
94
|
+
python .qoder/scripts/orchestration/wlkj.py task unblock <task> <blocker>
|
|
95
|
+
python .qoder/scripts/orchestration/wlkj.py task gantt [--weeks 4] # 只排有日期的任务,自动标逾期
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**退出码**:`0`=成功 / `1`=任务不存在/JSON 缺失/循环依赖 / `4`=权限不足(零信任 ACL,仅 creator/assignee/admin 可改)。
|
|
99
|
+
|
|
100
|
+
**RICE** = Reach × Impact × Confidence ÷ Effort(AI 层评估,算好后写入 task.json 的 `rice` 数值字段)
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 校验
|
|
105
|
+
|
|
106
|
+
- ❌ **无独立校验脚本**。当前靠 task.py 自身的状态机约束。
|
|
107
|
+
- 软契约:task.json 缺 `_contract` / `acceptance` 只警告不拦。
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 与上下游的接口
|
|
112
|
+
|
|
113
|
+
| 方向 | 接口 |
|
|
114
|
+
|------|------|
|
|
115
|
+
| 上游 prd | 读 PRD 的功能清单 → 拆任务 |
|
|
116
|
+
| 下游 spec/code | 任务目录可放 `spec.md`(spec 模块写到任务目录时) |
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 现状提醒
|
|
121
|
+
|
|
122
|
+
- ✅ task.py 功能完整:CRUD + 依赖图(block/unblock + 循环检测)+ 排期(set-due/gantt)+ 子任务 + 零信任 ACL + 归档孤儿依赖清理。
|
|
123
|
+
- ✅ PRD→task 衔接:create 时把 REQ-ID 记进 `tags`,PRD 验收点贴进 task 的 `prd.md`(命令层引导)。
|
|
124
|
+
- ✅ RICE 排序在 AI 层(task.py 只存数值,不替 AI 算分)。
|
|
125
|
+
- 🧩 QoderWork 增强(可选):待办双向同步。无连接器则回退,task.json 仍为准。
|
|
@@ -46,9 +46,9 @@ trigger: "user invokes /wl-* command explicitly"
|
|
|
46
46
|
**③ 用例 JSON 必须用 `--cases-file` 传文件,禁止内联 `--cases`。**
|
|
47
47
|
```bash
|
|
48
48
|
# ✅ 对: 写文件再传路径(不截断)
|
|
49
|
-
$
|
|
49
|
+
(python "$R 2>/dev/null || python3 "$R)/.qoder/scripts/orchestration/wlkj.py" test quick --cases-file <文件路径> --env test --platform web
|
|
50
50
|
# ❌ 错: 内联(长JSON截断, 多条用例必丢)
|
|
51
|
-
$
|
|
51
|
+
(python "$R 2>/dev/null || python3 "$R)/.qoder/scripts/orchestration/wlkj.py" test quick --cases '[{"case_id"...(超长)...}]'
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
**④ 无锚点时必须先 snapshot 拿真实 anchor 再填,禁止预猜 CSS selector。**
|
|
@@ -67,9 +67,9 @@ $PY "$R/.qoder/scripts/orchestration/wlkj.py" test quick --cases '[{"case_id"...
|
|
|
67
67
|
**⑥ recall 的 `--url` 必须用相对路径(无前导斜杠),避开 Git-bash/MSYS 路径转换坑。**
|
|
68
68
|
```bash
|
|
69
69
|
# ✅ 对: 相对路径 (MSYS 不转换)
|
|
70
|
-
$
|
|
70
|
+
(python "$R 2>/dev/null || python3 "$R)/.qoder/scripts/orchestration/wlkj.py" test recall --url auth/login
|
|
71
71
|
# ❌ 错: 前导斜杠会被 Windows Git-bash 转成 /D:/.../Git/auth/login
|
|
72
|
-
$
|
|
72
|
+
(python "$R 2>/dev/null || python3 "$R)/.qoder/scripts/orchestration/wlkj.py" test recall --url /auth/login
|
|
73
73
|
```
|
|
74
74
|
(脚本已加 normalize 兜底能修这个,但别依赖兜底——直接写相对路径最干净。)
|
|
75
75
|
|
|
@@ -521,4 +521,4 @@ QoderWork 有**两种**浏览器控制方式,遇到问题要在两者间切换
|
|
|
521
521
|
- quick/browser:用例表 + 执行结果(pass/fail),失败列原因 + 建议,全过建议继续
|
|
522
522
|
- 别在 quick 里啰嗦搜代码的过程——用户要的是"测了没、通没通"
|
|
523
523
|
- 验证码/登录:默认 AI 自识别(截图→算→填),连续 2 次失败或短信/扫码类才交人
|
|
524
|
-
- 工具冲突:先 Playwright MCP,挂了再试 QoderWork Browser Use,最后 Computer Use + 浏览器前台,别直接 BLOCKED
|
|
524
|
+
- 工具冲突:先 Playwright MCP,挂了再试 QoderWork Browser Use,最后 Computer Use + 浏览器前台,别直接 BLOCKED
|