@hupan56/wlkj 3.1.23 → 3.1.25
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/bin/cli.js
CHANGED
|
@@ -1464,10 +1464,17 @@ switch (cmd) {
|
|
|
1464
1464
|
console.log(" wlkj selftest — 全套件自检 (验证跨环境 + 第一宿主)");
|
|
1465
1465
|
console.log("=".repeat(56));
|
|
1466
1466
|
let totalFail = 0;
|
|
1467
|
+
// 找 packages/wlkj/tests/ 目录:可能在 cwd 下(项目根),也可能在 npx 缓存里
|
|
1468
|
+
// 用 __dirname (cli.js 所在目录) 往上找
|
|
1469
|
+
let testsDir = path.join(__dirname, "..", "tests");
|
|
1470
|
+
if (!fs.existsSync(testsDir)) {
|
|
1471
|
+
// fallback: cwd 下找
|
|
1472
|
+
testsDir = path.join(cwd, "packages", "wlkj", "tests");
|
|
1473
|
+
}
|
|
1467
1474
|
const suites = [
|
|
1468
|
-
["1. 跨环境模拟验证", ["
|
|
1469
|
-
["2. QoderWork 工具协议 (真实 MCP JSON-RPC)", ["
|
|
1470
|
-
["3. 命令底层脚本 smoke", ["-c", "import sys;
|
|
1475
|
+
["1. 跨环境模拟验证", [path.join(testsDir, "test_cross_env.py")]],
|
|
1476
|
+
["2. QoderWork 工具协议 (真实 MCP JSON-RPC)", [path.join(testsDir, "test_qoderwork_tools.py")]],
|
|
1477
|
+
["3. 命令底层脚本 smoke", ["-c", "import sys, os; p=os.path.join(os.getcwd(), '.qoder', 'scripts', 'validation', 'test', 'smoke_all_commands.py'); sys.path.insert(0, os.path.join(os.getcwd(), '.qoder', 'scripts')); exec(open(p).read()) if os.path.isfile(p) else print('[SKIP] smoke_all_commands.py 不存在 (init 后才有)')"]],
|
|
1471
1478
|
["4. 环境体检 (doctor)", [path.join(cwd, ".qoder", "scripts", "orchestration", "wlkj.py"), "doctor"]],
|
|
1472
1479
|
["5. MCP 实测 (mcp_doctor)", [path.join(cwd, ".qoder", "scripts", "protocol", "mcp", "mcp_doctor.py")]],
|
|
1473
1480
|
];
|
|
@@ -1478,7 +1485,7 @@ switch (cmd) {
|
|
|
1478
1485
|
const isTestFile = args[0] && args[0].endsWith(".py") && !args[0].startsWith(path.sep) && !args[0].includes(":");
|
|
1479
1486
|
const fullArgs = isTestFile ? [path.join(cwd, args[0])] : args;
|
|
1480
1487
|
try {
|
|
1481
|
-
const r = _ss(pyCmd, fullArgs, { cwd, stdio: "inherit", timeout:
|
|
1488
|
+
const r = _ss(pyCmd, fullArgs, { cwd, stdio: "inherit", timeout: 300000, env });
|
|
1482
1489
|
if (r.status !== 0) { console.log(" [FAIL] exit " + r.status); totalFail++; }
|
|
1483
1490
|
} catch (e) { console.log(" [FAIL] " + (e.message || "").slice(0, 80)); totalFail++; }
|
|
1484
1491
|
}
|
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 仍为准。
|