@hupan56/wlkj 3.3.13 → 3.3.15
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 +0 -7
- package/package.json +29 -29
- package/templates/qoder/commands/optional/wl-spec.md +0 -8
- package/templates/qoder/commands/optional/wl-status.md +0 -8
- package/templates/qoder/commands/wl-code.md +0 -8
- package/templates/qoder/commands/wl-commit.md +0 -8
- package/templates/qoder/commands/wl-init.md +129 -129
- package/templates/qoder/commands/wl-search.md +0 -8
- package/templates/qoder/commands/wl-task.md +0 -8
- package/templates/qoder/commands/wl-test.md +0 -8
- package/templates/qoder/config.yaml +2 -3
- package/templates/qoder/contracts/insight.md +55 -55
- package/templates/qoder/hooks/pre-tool-use-commit.py +124 -124
- package/templates/qoder/hooks/session-start.py +384 -384
- package/templates/qoder/hooks/stop-eval.py +383 -383
- package/templates/qoder/scripts/capability/adapters/mcp.py +322 -322
- package/templates/qoder/scripts/capability/registry.py +245 -245
- package/templates/qoder/scripts/deployment/setup/install_qoderwork.py +14 -0
- package/templates/qoder/scripts/deployment/setup/setup.py +0 -11
- package/templates/qoder/scripts/domain/task/wlkj_panel.py +1503 -1503
- package/templates/qoder/scripts/foundation/bootstrap.py +145 -156
- package/templates/qoder/scripts/foundation/io/context_cache.py +94 -94
- package/templates/qoder/scripts/orchestration/wlkj.py +295 -306
- package/templates/qoder/scripts/tool_guide.md +70 -70
- package/templates/qoder/scripts/validation/eval/alignment_matrix.py +176 -176
- package/templates/qoder/scripts/validation/eval/bf2_content_fidelity.py +110 -110
- package/templates/qoder/scripts/validation/eval/bf2_llmjudge.py +104 -104
- package/templates/qoder/scripts/validation/eval/bf_score.py +218 -218
- package/templates/qoder/scripts/validation/eval/code_flywheel.py +150 -150
- package/templates/qoder/scripts/validation/eval/dispatcher_ab.py +156 -156
- package/templates/qoder/scripts/validation/eval/dispatcher_ab_2026-07-21.json +23 -23
- package/templates/qoder/scripts/validation/eval/feature_fidelity_flywheel.py +143 -143
- package/templates/qoder/scripts/validation/eval/gradient_matrix.py +261 -261
- package/templates/qoder/scripts/validation/eval/gradient_matrix_baseline_2026-07-21.json +33 -33
- package/templates/qoder/scripts/validation/eval/metrics_dashboard.py +105 -105
- package/templates/qoder/scripts/validation/eval/multi_turn_flywheel.py +118 -118
- package/templates/qoder/scripts/validation/eval/prd_fidelity_flywheel.py +128 -128
- package/templates/qoder/scripts/validation/eval/prd_flywheel.py +148 -148
- package/templates/qoder/scripts/validation/eval/prototype_fidelity_flywheel.py +166 -166
- package/templates/qoder/scripts/validation/eval/recall_flywheel.py +148 -148
- package/templates/qoder/scripts/validation/eval/robustness_flywheel.py +139 -139
- package/templates/qoder/scripts/validation/eval/speed_accuracy_flywheel.py +188 -188
- package/templates/qoder/scripts/validation/eval/task_flywheel.py +124 -124
- package/templates/qoder/scripts/validation/eval/token_flywheel.py +88 -88
- package/templates/qoder/scripts/validation/metrics/eval_code_ac.py +177 -177
- package/templates/qoder/scripts/validation/metrics/lint_cases.py +170 -170
- package/templates/qoder/scripts/validation/test/test_context_cache.py +78 -78
- package/templates/qoder/scripts/validation/test/test_lint_cases.py +60 -60
- package/templates/qoder/scripts/validation/test/test_pre_tool_use_commit.py +70 -70
- package/templates/qoder/commands/wl-data.md +0 -46
- package/templates/qoder/commands/wl-fix.md +0 -47
- package/templates/qoder/commands/wl-knowledge.md +0 -41
- package/templates/qoder/commands/wl-review.md +0 -49
- package/templates/workspace/specs/REQ-TEST-CTX/.context-cache.json +0 -1
package/bin/cli.js
CHANGED
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// wlkj - workflow toolkit
|
|
3
3
|
|
|
4
|
-
// Windows 中文乱码修复:cmd/PowerShell 默认 GBK,cli.js 输出 UTF-8 → 乱码
|
|
5
|
-
if (process.platform === "win32") {
|
|
6
|
-
try { execSync("chcp 65001", { stdio: "ignore" }); } catch (e) {}
|
|
7
|
-
process.stdout.setDefaultEncoding("utf-8");
|
|
8
|
-
process.stderr.setDefaultEncoding("utf-8");
|
|
9
|
-
}
|
|
10
|
-
|
|
11
4
|
const path = require("path");
|
|
12
5
|
const fs = require("fs");
|
|
13
6
|
const { execSync } = require("child_process");
|
package/package.json
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@hupan56/wlkj",
|
|
3
|
-
"version": "3.3.
|
|
4
|
-
"description": "AI Product R&D Workflow - PRD/Prototype/Search/Task/Report",
|
|
5
|
-
"bin": {
|
|
6
|
-
"wlkj": "bin/cli.js"
|
|
7
|
-
},
|
|
8
|
-
"files": [
|
|
9
|
-
"bin/",
|
|
10
|
-
"templates/",
|
|
11
|
-
"MAC-VERIFY.md"
|
|
12
|
-
],
|
|
13
|
-
"keywords": [
|
|
14
|
-
"workflow",
|
|
15
|
-
"ai",
|
|
16
|
-
"prd",
|
|
17
|
-
"pipeline",
|
|
18
|
-
"qoder",
|
|
19
|
-
"product",
|
|
20
|
-
"team"
|
|
21
|
-
],
|
|
22
|
-
"license": "MIT",
|
|
23
|
-
"publishConfig": {
|
|
24
|
-
"access": "public"
|
|
25
|
-
},
|
|
26
|
-
"engines": {
|
|
27
|
-
"node": ">=16"
|
|
28
|
-
}
|
|
29
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@hupan56/wlkj",
|
|
3
|
+
"version": "3.3.15",
|
|
4
|
+
"description": "AI Product R&D Workflow - PRD/Prototype/Search/Task/Report",
|
|
5
|
+
"bin": {
|
|
6
|
+
"wlkj": "bin/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"templates/",
|
|
11
|
+
"MAC-VERIFY.md"
|
|
12
|
+
],
|
|
13
|
+
"keywords": [
|
|
14
|
+
"workflow",
|
|
15
|
+
"ai",
|
|
16
|
+
"prd",
|
|
17
|
+
"pipeline",
|
|
18
|
+
"qoder",
|
|
19
|
+
"product",
|
|
20
|
+
"team"
|
|
21
|
+
],
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=16"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -38,11 +38,3 @@ User input:
|
|
|
38
38
|
## 下一步
|
|
39
39
|
- spec 已 confirmed → `/wl-code <REQ-ID>` 按 spec 严格实现(spec gate 放行)
|
|
40
40
|
- 实现完 → `/wl-test` 验证 → `/wl-commit` 提交回流
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
## 🚨 接地铁律(防幻觉/保真,Qoder AI 必须遵守)
|
|
44
|
-
|
|
45
|
-
1. **溯源**:引用代码符号/表名/接口用**真实原名**(如 `CostApplyController`、`base_asset`),非中文描述——只引 MCP 工具(rag_search/schema_link/context_360/get_impact 等)召回的真实符号,提升可溯源性
|
|
46
|
-
2. **禁编**:不编造未在召回里出现的类名/表名/字段/接口;召回不足时标"待确认(知识层未召回)",**诚实优于编造**
|
|
47
|
-
3. **接地(数据表)**:涉及数据表/字段时,先调 MCP `schema_link`/`query_schema` 取真表真列;未召回真表禁编 t_xxx 表名+字段充数
|
|
48
|
-
4. **完整**:产物详尽展开(每节实质内容,不一行带过)
|
|
@@ -89,11 +89,3 @@ $PY "$R/.qoder/scripts/validation/metrics/usability_score.py" --html
|
|
|
89
89
|
- **CLI/IDE**(NoOp 自动降级):落盘 `workspace/members/{dev}/journal/dashboard-{时间戳}.html`,输出路径供打开
|
|
90
90
|
|
|
91
91
|
不用 cap.present 也能跑——上面的 Health Score 维度表本身是纯文本,富展示只是增强可视化(T244 cap.present 接入点)。
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
## 🚨 接地铁律(防幻觉/保真,Qoder AI 必须遵守)
|
|
95
|
-
|
|
96
|
-
1. **溯源**:引用代码符号/表名/接口用**真实原名**(如 `CostApplyController`、`base_asset`),非中文描述——只引 MCP 工具(rag_search/schema_link/context_360/get_impact 等)召回的真实符号,提升可溯源性
|
|
97
|
-
2. **禁编**:不编造未在召回里出现的类名/表名/字段/接口;召回不足时标"待确认(知识层未召回)",**诚实优于编造**
|
|
98
|
-
3. **接地(数据表)**:涉及数据表/字段时,先调 MCP `schema_link`/`query_schema` 取真表真列;未召回真表禁编 t_xxx 表名+字段充数
|
|
99
|
-
4. **完整**:产物详尽展开(每节实质内容,不一行带过)
|
|
@@ -216,11 +216,3 @@ cap.mcp.call("learn", {
|
|
|
216
216
|
})
|
|
217
217
|
```
|
|
218
218
|
- 至少写 1 条最有价值的认知。try/except 不阻塞。
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
## 🚨 接地铁律(防幻觉/保真,Qoder AI 必须遵守)
|
|
222
|
-
|
|
223
|
-
1. **溯源**:引用代码符号/表名/接口用**真实原名**(如 `CostApplyController`、`base_asset`),非中文描述——只引 MCP 工具(rag_search/schema_link/context_360/get_impact 等)召回的真实符号,提升可溯源性
|
|
224
|
-
2. **禁编**:不编造未在召回里出现的类名/表名/字段/接口;召回不足时标"待确认(知识层未召回)",**诚实优于编造**
|
|
225
|
-
3. **接地(数据表)**:涉及数据表/字段时,先调 MCP `schema_link`/`query_schema` 取真表真列;未召回真表禁编 t_xxx 表名+字段充数
|
|
226
|
-
4. **完整**:产物详尽展开(每节实质内容,不一行带过)
|
|
@@ -41,11 +41,3 @@ Before committing, check:
|
|
|
41
41
|
## 下一步
|
|
42
42
|
- 提交回流成功后,更新任务状态:`/wl-task finish <REQ-ID>`(标记开发完成,同步禅道)
|
|
43
43
|
- 查看本次提交在需求链路的位置:平台资产中心 → 需求 → 变更史
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
## 🚨 接地铁律(防幻觉/保真,Qoder AI 必须遵守)
|
|
47
|
-
|
|
48
|
-
1. **溯源**:引用代码符号/表名/接口用**真实原名**(如 `CostApplyController`、`base_asset`),非中文描述——只引 MCP 工具(rag_search/schema_link/context_360/get_impact 等)召回的真实符号,提升可溯源性
|
|
49
|
-
2. **禁编**:不编造未在召回里出现的类名/表名/字段/接口;召回不足时标"待确认(知识层未召回)",**诚实优于编造**
|
|
50
|
-
3. **接地(数据表)**:涉及数据表/字段时,先调 MCP `schema_link`/`query_schema` 取真表真列;未召回真表禁编 t_xxx 表名+字段充数
|
|
51
|
-
4. **完整**:产物详尽展开(每节实质内容,不一行带过)
|
|
@@ -1,129 +1,129 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: wl-init
|
|
3
|
-
description: "初始化/切换开发者身份 + 环境体检。Initialize/switch developer identity + environment health check. "
|
|
4
|
-
argument-hint: "[name] [role]"
|
|
5
|
-
auto-approve: true
|
|
6
|
-
allowed-tools: [Read, Glob, Grep, Bash, Write, Edit]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# /wl-init - One-stop Init (Developer + Environment Doctor)
|
|
10
|
-
|
|
11
|
-
Usage:
|
|
12
|
-
/wl-init - 体检环境 + 显示状态
|
|
13
|
-
/wl-init 小王 - 切换/注册开发者 + 体检 + 自动修复
|
|
14
|
-
/wl-init 小王 pm - 注册新开发者(带角色) + 体检 + 自动修复
|
|
15
|
-
|
|
16
|
-
## 🔧 环境自检(QoderWork 桌面端 vs Qoder IDE/CLI)
|
|
17
|
-
|
|
18
|
-
**先确定仓库根 R**(QoderWork 桌面端工作目录不是仓库根,相对路径会失效):
|
|
19
|
-
```bash
|
|
20
|
-
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null || python3 ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
21
|
-
PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
|
|
22
|
-
```
|
|
23
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。后续脚本统一用 `$PY "$R/.qoder/scripts/orchestration/wlkj.py" <命令>`。
|
|
24
|
-
|
|
25
|
-
## Engine: init_doctor.py (幂等, 增量, 永不重头再来)
|
|
26
|
-
|
|
27
|
-
> **鲁棒性保证**:doctor 每项检查独立,**单项失败不阻塞其它项**;无 git 时优雅降级(团队同步/克隆禁用,但本地 PRD/搜索/任务/报告仍可用)。
|
|
28
|
-
> **退出码**:`0` = 全部健康,`1` = 有未解决问题(`--fix` 能修的已自动修)。AI 据此判断"是否可直接开工"。
|
|
29
|
-
|
|
30
|
-
### Case 1: /wl-init (no arguments)
|
|
31
|
-
```bash
|
|
32
|
-
$PY "$R/.qoder/scripts/orchestration/wlkj.py" doctor 2>/dev/null || python3 "$R/.qoder/scripts/orchestration/wlkj.py" doctor
|
|
33
|
-
```
|
|
34
|
-
Report the doctor's findings to the user in friendly language.
|
|
35
|
-
If it found fixable issues, ask: "发现 N 个问题,要我自动修复吗?"
|
|
36
|
-
then run with --fix.
|
|
37
|
-
|
|
38
|
-
### Case 2/3: /wl-init 小王 [pm]
|
|
39
|
-
```bash
|
|
40
|
-
$PY "$R/.qoder/scripts/orchestration/wlkj.py" doctor 2>/dev/null || python3 "$R/.qoder/scripts/orchestration/wlkj.py" doctor --fix 小王 [pm]
|
|
41
|
-
```
|
|
42
|
-
This single command does ALL of:
|
|
43
|
-
1. 注册/切换开发者 (.qoder/.developer, key=value 格式) + 个人空间目录
|
|
44
|
-
2. 拉取团队最新 (team_sync pull - 拿到别人的 PRD 和最新知识图谱)
|
|
45
|
-
3. 克隆缺失的源码仓库 (按 config.yaml git_sync.projects)
|
|
46
|
-
4. 知识图谱: 7天内新鲜->跳过 / 过期->增量同步 / 缺失->全量构建(仅首次)
|
|
47
|
-
5. 校验风格约束文件 + PRD 模板
|
|
48
|
-
6. 检查周五自动构建状态, 给出本系统的设置命令
|
|
49
|
-
|
|
50
|
-
After doctor finishes:
|
|
51
|
-
- init_developer auto-registers identity (member.json + signing key)
|
|
52
|
-
- No separate "team.py add" needed anymore
|
|
53
|
-
|
|
54
|
-
## Incremental Guarantee (为什么不会重头再来)
|
|
55
|
-
|
|
56
|
-
| 状态 | 行为 |
|
|
57
|
-
|------|------|
|
|
58
|
-
| 本周已 init 过 / 周五任务跑过 | 索引新鲜(≤7天) -> 全部跳过, 秒级完成 |
|
|
59
|
-
| 周五任务没跑/失效 | 索引过期 -> git diff 增量更新, 只处理变更文件 |
|
|
60
|
-
|
|
61
|
-
## 🔗 平台项目绑定(60 人各用各的项目)
|
|
62
|
-
|
|
63
|
-
**每个开发者绑定自己的项目。** `/wl-init` 时选择 → 拉 token → 写 mcp_config.json。
|
|
64
|
-
**切换项目 = 重跑 `/wl-init` 选另一个。** 60 人各自选自己的项目,token 绑定到项目,知识层自动隔离。
|
|
65
|
-
|
|
66
|
-
### 已绑定?(探测多宿主路径)
|
|
67
|
-
```bash
|
|
68
|
-
grep -l WLKJ_PROJECT_ID "$R/.qoder/mcp_config.json" 2>/dev/null && echo "已绑定" || echo "未绑定"
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### 未绑定或要切换?一行命令:
|
|
72
|
-
```bash
|
|
73
|
-
$PY "$R/.qoder/scripts/orchestration/wlkj.py" switch-project
|
|
74
|
-
```
|
|
75
|
-
脚本会:
|
|
76
|
-
1. 问邮箱+密码(或用 --email/--pw 参数)
|
|
77
|
-
2. 连平台 `POST /api/auth/bind` 拉项目列表
|
|
78
|
-
3. 列出你的所有项目,选一个
|
|
79
|
-
4. 自动写 mcp_config.json(含该项目的 token + project_id)
|
|
80
|
-
|
|
81
|
-
非交互模式(CI/自动化):
|
|
82
|
-
```bash
|
|
83
|
-
$PY "$R/.qoder/scripts/orchestration/wlkj.py" switch-project --email a@b.c --pw xxx --project-uuid <UUID>
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
**之后所有命令自动用该项目的知识层、token、回流地址。不同人选不同项目 = 完全隔离。**
|
|
87
|
-
| 全新机器 | 克隆仓库 + 全量构建一次, 之后永远增量 |
|
|
88
|
-
| 团队其他人已更新图谱 | team_sync pull 直接拿到, 本机不用构建 |
|
|
89
|
-
|
|
90
|
-
## .developer File Format (MANDATORY)
|
|
91
|
-
|
|
92
|
-
ALWAYS write `.qoder/.developer` in key=value format:
|
|
93
|
-
```
|
|
94
|
-
name=小王
|
|
95
|
-
role=pm
|
|
96
|
-
initialized_at=2026-06-12T10:00:00
|
|
97
|
-
```
|
|
98
|
-
Do NOT use `name: value` style. (Parsers accept both for legacy files,
|
|
99
|
-
but new writes must use `=`.)
|
|
100
|
-
|
|
101
|
-
## Git Author Check
|
|
102
|
-
|
|
103
|
-
The doctor reports if `git config user.name` differs from the developer
|
|
104
|
-
name (it breaks /wl-report's commit statistics). If the user agrees,
|
|
105
|
-
run: `git config user.name {name}`. Do not change it without confirmation.
|
|
106
|
-
|
|
107
|
-
## Status Display
|
|
108
|
-
After any operation, show:
|
|
109
|
-
```
|
|
110
|
-
Developer: 小王 (pm)
|
|
111
|
-
Team: 3 members (1 PM, 2 Dev)
|
|
112
|
-
Active tasks: 2 (1 in progress, 1 draft)
|
|
113
|
-
知识图谱: 2 天前更新 (新鲜)
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
## Safety Rules
|
|
117
|
-
- NEVER delete workspace/ content
|
|
118
|
-
- NEVER overwrite member.json or task.json
|
|
119
|
-
- Full index build ONLY when index is completely missing (doctor handles this)
|
|
120
|
-
|
|
121
|
-
## 产品常踩的坑(遇到时这样解释,别让产品卡住)
|
|
122
|
-
|
|
123
|
-
| 现象 | 原因 | 怎么说 / 怎么办 |
|
|
124
|
-
|------|------|----------------|
|
|
125
|
-
| `/wl-init --fix` 卡在第 4 项几分钟 | 正在 clone 大源码仓库(fywl-ics 8973 文件) | 告诉用户"首次克隆大仓库要几分钟,属正常,耐心等"。clone 失败(网络/权限)只影响"搜索真实代码",本地 PRD/任务/报告不受影响 |
|
|
126
|
-
| 搜代码总返回 0 结果 / 生成原型字段全空 | `config.yaml` 的 `platforms.{xx}.project` 写的项目名在 `data/code/` 下不存在(管理员改了 git_sync URL 忘改 platforms) | doctor 第 4 项会报 `platforms.X.project = '...' 但无此目录`。让管理员核对 config.yaml 的 platforms 映射 |
|
|
127
|
-
| `git user.name` 与开发者名不一致警告 | 影响后续 /wl-report 统计 + push 门禁 | doctor 已自动用 `--fix` 修正本仓库 git config。用户未带 `--fix` 时提示重跑 |
|
|
128
|
-
| 没装 git | doctor 第 1 项报 WARN | 不阻塞:本地 PRD/搜索/任务/报告仍可用,只有团队同步/克隆禁用 |
|
|
129
|
-
| 搜出来的代码是旧的 | 知识图谱 >7 天未更新 | doctor 第 5 项会增量同步,`--fix` 自动跑 |
|
|
1
|
+
---
|
|
2
|
+
name: wl-init
|
|
3
|
+
description: "初始化/切换开发者身份 + 环境体检。Initialize/switch developer identity + environment health check. "
|
|
4
|
+
argument-hint: "[name] [role]"
|
|
5
|
+
auto-approve: true
|
|
6
|
+
allowed-tools: [Read, Glob, Grep, Bash, Write, Edit]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# /wl-init - One-stop Init (Developer + Environment Doctor)
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
/wl-init - 体检环境 + 显示状态
|
|
13
|
+
/wl-init 小王 - 切换/注册开发者 + 体检 + 自动修复
|
|
14
|
+
/wl-init 小王 pm - 注册新开发者(带角色) + 体检 + 自动修复
|
|
15
|
+
|
|
16
|
+
## 🔧 环境自检(QoderWork 桌面端 vs Qoder IDE/CLI)
|
|
17
|
+
|
|
18
|
+
**先确定仓库根 R**(QoderWork 桌面端工作目录不是仓库根,相对路径会失效):
|
|
19
|
+
```bash
|
|
20
|
+
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null || python3 ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
21
|
+
PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
|
|
22
|
+
```
|
|
23
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。后续脚本统一用 `$PY "$R/.qoder/scripts/orchestration/wlkj.py" <命令>`。
|
|
24
|
+
|
|
25
|
+
## Engine: init_doctor.py (幂等, 增量, 永不重头再来)
|
|
26
|
+
|
|
27
|
+
> **鲁棒性保证**:doctor 每项检查独立,**单项失败不阻塞其它项**;无 git 时优雅降级(团队同步/克隆禁用,但本地 PRD/搜索/任务/报告仍可用)。
|
|
28
|
+
> **退出码**:`0` = 全部健康,`1` = 有未解决问题(`--fix` 能修的已自动修)。AI 据此判断"是否可直接开工"。
|
|
29
|
+
|
|
30
|
+
### Case 1: /wl-init (no arguments)
|
|
31
|
+
```bash
|
|
32
|
+
$PY "$R/.qoder/scripts/orchestration/wlkj.py" doctor 2>/dev/null || python3 "$R/.qoder/scripts/orchestration/wlkj.py" doctor
|
|
33
|
+
```
|
|
34
|
+
Report the doctor's findings to the user in friendly language.
|
|
35
|
+
If it found fixable issues, ask: "发现 N 个问题,要我自动修复吗?"
|
|
36
|
+
then run with --fix.
|
|
37
|
+
|
|
38
|
+
### Case 2/3: /wl-init 小王 [pm]
|
|
39
|
+
```bash
|
|
40
|
+
$PY "$R/.qoder/scripts/orchestration/wlkj.py" doctor 2>/dev/null || python3 "$R/.qoder/scripts/orchestration/wlkj.py" doctor --fix 小王 [pm]
|
|
41
|
+
```
|
|
42
|
+
This single command does ALL of:
|
|
43
|
+
1. 注册/切换开发者 (.qoder/.developer, key=value 格式) + 个人空间目录
|
|
44
|
+
2. 拉取团队最新 (team_sync pull - 拿到别人的 PRD 和最新知识图谱)
|
|
45
|
+
3. 克隆缺失的源码仓库 (按 config.yaml git_sync.projects)
|
|
46
|
+
4. 知识图谱: 7天内新鲜->跳过 / 过期->增量同步 / 缺失->全量构建(仅首次)
|
|
47
|
+
5. 校验风格约束文件 + PRD 模板
|
|
48
|
+
6. 检查周五自动构建状态, 给出本系统的设置命令
|
|
49
|
+
|
|
50
|
+
After doctor finishes:
|
|
51
|
+
- init_developer auto-registers identity (member.json + signing key)
|
|
52
|
+
- No separate "team.py add" needed anymore
|
|
53
|
+
|
|
54
|
+
## Incremental Guarantee (为什么不会重头再来)
|
|
55
|
+
|
|
56
|
+
| 状态 | 行为 |
|
|
57
|
+
|------|------|
|
|
58
|
+
| 本周已 init 过 / 周五任务跑过 | 索引新鲜(≤7天) -> 全部跳过, 秒级完成 |
|
|
59
|
+
| 周五任务没跑/失效 | 索引过期 -> git diff 增量更新, 只处理变更文件 |
|
|
60
|
+
|
|
61
|
+
## 🔗 平台项目绑定(60 人各用各的项目)
|
|
62
|
+
|
|
63
|
+
**每个开发者绑定自己的项目。** `/wl-init` 时选择 → 拉 token → 写 mcp_config.json。
|
|
64
|
+
**切换项目 = 重跑 `/wl-init` 选另一个。** 60 人各自选自己的项目,token 绑定到项目,知识层自动隔离。
|
|
65
|
+
|
|
66
|
+
### 已绑定?(探测多宿主路径)
|
|
67
|
+
```bash
|
|
68
|
+
grep -l WLKJ_PROJECT_ID "$R/.qoder/mcp_config.json" 2>/dev/null && echo "已绑定" || echo "未绑定"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 未绑定或要切换?一行命令:
|
|
72
|
+
```bash
|
|
73
|
+
$PY "$R/.qoder/scripts/orchestration/wlkj.py" switch-project
|
|
74
|
+
```
|
|
75
|
+
脚本会:
|
|
76
|
+
1. 问邮箱+密码(或用 --email/--pw 参数)
|
|
77
|
+
2. 连平台 `POST /api/auth/bind` 拉项目列表
|
|
78
|
+
3. 列出你的所有项目,选一个
|
|
79
|
+
4. 自动写 mcp_config.json(含该项目的 token + project_id)
|
|
80
|
+
|
|
81
|
+
非交互模式(CI/自动化):
|
|
82
|
+
```bash
|
|
83
|
+
$PY "$R/.qoder/scripts/orchestration/wlkj.py" switch-project --email a@b.c --pw xxx --project-uuid <UUID>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**之后所有命令自动用该项目的知识层、token、回流地址。不同人选不同项目 = 完全隔离。**
|
|
87
|
+
| 全新机器 | 克隆仓库 + 全量构建一次, 之后永远增量 |
|
|
88
|
+
| 团队其他人已更新图谱 | team_sync pull 直接拿到, 本机不用构建 |
|
|
89
|
+
|
|
90
|
+
## .developer File Format (MANDATORY)
|
|
91
|
+
|
|
92
|
+
ALWAYS write `.qoder/.developer` in key=value format:
|
|
93
|
+
```
|
|
94
|
+
name=小王
|
|
95
|
+
role=pm
|
|
96
|
+
initialized_at=2026-06-12T10:00:00
|
|
97
|
+
```
|
|
98
|
+
Do NOT use `name: value` style. (Parsers accept both for legacy files,
|
|
99
|
+
but new writes must use `=`.)
|
|
100
|
+
|
|
101
|
+
## Git Author Check
|
|
102
|
+
|
|
103
|
+
The doctor reports if `git config user.name` differs from the developer
|
|
104
|
+
name (it breaks /wl-report's commit statistics). If the user agrees,
|
|
105
|
+
run: `git config user.name {name}`. Do not change it without confirmation.
|
|
106
|
+
|
|
107
|
+
## Status Display
|
|
108
|
+
After any operation, show:
|
|
109
|
+
```
|
|
110
|
+
Developer: 小王 (pm)
|
|
111
|
+
Team: 3 members (1 PM, 2 Dev)
|
|
112
|
+
Active tasks: 2 (1 in progress, 1 draft)
|
|
113
|
+
知识图谱: 2 天前更新 (新鲜)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Safety Rules
|
|
117
|
+
- NEVER delete workspace/ content
|
|
118
|
+
- NEVER overwrite member.json or task.json
|
|
119
|
+
- Full index build ONLY when index is completely missing (doctor handles this)
|
|
120
|
+
|
|
121
|
+
## 产品常踩的坑(遇到时这样解释,别让产品卡住)
|
|
122
|
+
|
|
123
|
+
| 现象 | 原因 | 怎么说 / 怎么办 |
|
|
124
|
+
|------|------|----------------|
|
|
125
|
+
| `/wl-init --fix` 卡在第 4 项几分钟 | 正在 clone 大源码仓库(fywl-ics 8973 文件) | 告诉用户"首次克隆大仓库要几分钟,属正常,耐心等"。clone 失败(网络/权限)只影响"搜索真实代码",本地 PRD/任务/报告不受影响 |
|
|
126
|
+
| 搜代码总返回 0 结果 / 生成原型字段全空 | `config.yaml` 的 `platforms.{xx}.project` 写的项目名在 `data/code/` 下不存在(管理员改了 git_sync URL 忘改 platforms) | doctor 第 4 项会报 `platforms.X.project = '...' 但无此目录`。让管理员核对 config.yaml 的 platforms 映射 |
|
|
127
|
+
| `git user.name` 与开发者名不一致警告 | 影响后续 /wl-report 统计 + push 门禁 | doctor 已自动用 `--fix` 修正本仓库 git config。用户未带 `--fix` 时提示重跑 |
|
|
128
|
+
| 没装 git | doctor 第 1 项报 WARN | 不阻塞:本地 PRD/搜索/任务/报告仍可用,只有团队同步/克隆禁用 |
|
|
129
|
+
| 搜出来的代码是旧的 | 知识图谱 >7 天未更新 | doctor 第 5 项会增量同步,`--fix` 自动跑 |
|
|
@@ -213,11 +213,3 @@ $PY "$R/.qoder/scripts/orchestration/wlkj.py" kg grep-text 车辆不存在 --ext
|
|
|
213
213
|
- `/wl-search t_quality_case 表结构` → 先 `list_envs()` 问环境 → `query_schema`
|
|
214
214
|
- `/wl-search 资产管理功能画像` → `cap.mcp.call("feature_overview", {"feature": "资产管理"})`
|
|
215
215
|
- `/wl-search 车辆不存在报错从哪来` → `wlkj.py kg grep-text 车辆不存在 --ext java`
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
## 🚨 接地铁律(防幻觉/保真,Qoder AI 必须遵守)
|
|
219
|
-
|
|
220
|
-
1. **溯源**:引用代码符号/表名/接口用**真实原名**(如 `CostApplyController`、`base_asset`),非中文描述——只引 MCP 工具(rag_search/schema_link/context_360/get_impact 等)召回的真实符号,提升可溯源性
|
|
221
|
-
2. **禁编**:不编造未在召回里出现的类名/表名/字段/接口;召回不足时标"待确认(知识层未召回)",**诚实优于编造**
|
|
222
|
-
3. **接地(数据表)**:涉及数据表/字段时,先调 MCP `schema_link`/`query_schema` 取真表真列;未召回真表禁编 t_xxx 表名+字段充数
|
|
223
|
-
4. **完整**:产物详尽展开(每节实质内容,不一行带过)
|
|
@@ -617,11 +617,3 @@ prd ──create(带REQ-ID)──→ task ──start──→ code/test ──f
|
|
|
617
617
|
```
|
|
618
618
|
|
|
619
619
|
> 完整执行规则见 `.qoder/skills/wl-task/SKILL.md`(Quest/QoderWork 自然语言入口)。
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
## 🚨 接地铁律(防幻觉/保真,Qoder AI 必须遵守)
|
|
623
|
-
|
|
624
|
-
1. **溯源**:引用代码符号/表名/接口用**真实原名**(如 `CostApplyController`、`base_asset`),非中文描述——只引 MCP 工具(rag_search/schema_link/context_360/get_impact 等)召回的真实符号,提升可溯源性
|
|
625
|
-
2. **禁编**:不编造未在召回里出现的类名/表名/字段/接口;召回不足时标"待确认(知识层未召回)",**诚实优于编造**
|
|
626
|
-
3. **接地(数据表)**:涉及数据表/字段时,先调 MCP `schema_link`/`query_schema` 取真表真列;未召回真表禁编 t_xxx 表名+字段充数
|
|
627
|
-
4. **完整**:产物详尽展开(每节实质内容,不一行带过)
|
|
@@ -154,11 +154,3 @@ JUnit 测试(Mock + MockMvc,Given-When-Then)→ 输出 `tests/{package}/{C
|
|
|
154
154
|
## 报告
|
|
155
155
|
- quick:用例表 + 执行结果(pass/fail),全过建议继续别的,失败列原因
|
|
156
156
|
- browser:同上 + 建议修复重跑或 `/wl-commit`
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
## 🚨 接地铁律(防幻觉/保真,Qoder AI 必须遵守)
|
|
160
|
-
|
|
161
|
-
1. **溯源**:引用代码符号/表名/接口用**真实原名**(如 `CostApplyController`、`base_asset`),非中文描述——只引 MCP 工具(rag_search/schema_link/context_360/get_impact 等)召回的真实符号,提升可溯源性
|
|
162
|
-
2. **禁编**:不编造未在召回里出现的类名/表名/字段/接口;召回不足时标"待确认(知识层未召回)",**诚实优于编造**
|
|
163
|
-
3. **接地(数据表)**:涉及数据表/字段时,先调 MCP `schema_link`/`query_schema` 取真表真列;未召回真表禁编 t_xxx 表名+字段充数
|
|
164
|
-
4. **完整**:产物详尽展开(每节实质内容,不一行带过)
|
|
@@ -122,9 +122,8 @@ autotest:
|
|
|
122
122
|
# setup.py init 时会交互式配置 git remote add origin <url>。
|
|
123
123
|
# 不配也能本地工作, 但 push/同步功能不可用。
|
|
124
124
|
team_remote:
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
branch: master
|
|
125
|
+
url: "" # 留空则 setup.py 会问; 填了团队所有人 init 时自动用这个地址
|
|
126
|
+
branch: master # 团队主分支
|
|
128
127
|
|
|
129
128
|
# ── Git Sync (Weekly) ──
|
|
130
129
|
# 每个项目在 data/code/ 下有自己的 git 仓库
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
# 模块契约:insight(需求探索)
|
|
2
|
-
|
|
3
|
-
> 需求上游探索站。在写 PRD 之前把"该做什么、为什么做"想清楚。
|
|
4
|
-
> 四模式:clarify(默认,产品听不懂时对焦)/ discover(发现机会)/ research(调研竞品)/ plan(规划 roadmap)。
|
|
5
|
-
> 与 prd 的分工:insight 想清楚方向,prd 落地怎么做。
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Input(吃什么)
|
|
10
|
-
|
|
11
|
-
| 优先级 | 输入 | 怎么用 |
|
|
12
|
-
|--------|------|--------|
|
|
13
|
-
| **完整** | 一个模糊需求/产品想法 | 先 clarify 对焦,再按需 discover/research/plan |
|
|
14
|
-
| 参考 | 现状代码/业务 | `context_pack` / `feature_overview` 锚定现状,禁止编造 |
|
|
15
|
-
| 参考 | 竞品/外部信息 | research 模式走 WebSearch + 多 agent 调研 |
|
|
16
|
-
|
|
17
|
-
**第一性原理**:看未来,不编造。结论必须锚定现状(context_pack)。
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## Output(吐什么)
|
|
22
|
-
|
|
23
|
-
### 探索产物
|
|
24
|
-
|
|
25
|
-
```
|
|
26
|
-
路径:data/docs/drafts/
|
|
27
|
-
内含(按模式产出):
|
|
28
|
-
insight-plan-{topic}-{date}.md ← plan 模式:OST/Gap 分析 + MVP + Roadmap
|
|
29
|
-
research-agent-{N}-{视角}.md ← research 模式:多视角调研中间产物
|
|
30
|
-
insight-research-{topic}-{date}.md ← research 模式:汇总报告
|
|
31
|
-
clarify-prototype-*.html ← clarify 模式:帮产品理解的原型(可选)
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### 核心方法
|
|
35
|
-
|
|
36
|
-
- **OST**(Objective-Strategy-Tactic):目标→策略→战术拆解
|
|
37
|
-
- **JTBD**(Jobs-to-be-done):用户要完成的"任务"
|
|
38
|
-
- **Gap 分析**:现状 vs 目标的差距 → 机会
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## 校验(合格标准)
|
|
43
|
-
|
|
44
|
-
- [ ] 结论锚定现状(引用了 context_pack / 真实代码),非空中楼阁
|
|
45
|
-
- [ ] 全中文输出(语言锁)
|
|
46
|
-
- [ ] 有明确"转 PRD"或"放弃"的建议,不悬空
|
|
47
|
-
- [ ] research 模式:调研有来源,不是泛泛而谈
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## 不做(边界)
|
|
52
|
-
|
|
53
|
-
- 不写实现级 PRD(那是 prd 模块的活)
|
|
54
|
-
- 不直接改代码(那是 code 模块的活)
|
|
55
|
-
- discover/research 是辅助决策,**最终是否落地由人决定**
|
|
1
|
+
# 模块契约:insight(需求探索)
|
|
2
|
+
|
|
3
|
+
> 需求上游探索站。在写 PRD 之前把"该做什么、为什么做"想清楚。
|
|
4
|
+
> 四模式:clarify(默认,产品听不懂时对焦)/ discover(发现机会)/ research(调研竞品)/ plan(规划 roadmap)。
|
|
5
|
+
> 与 prd 的分工:insight 想清楚方向,prd 落地怎么做。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Input(吃什么)
|
|
10
|
+
|
|
11
|
+
| 优先级 | 输入 | 怎么用 |
|
|
12
|
+
|--------|------|--------|
|
|
13
|
+
| **完整** | 一个模糊需求/产品想法 | 先 clarify 对焦,再按需 discover/research/plan |
|
|
14
|
+
| 参考 | 现状代码/业务 | `context_pack` / `feature_overview` 锚定现状,禁止编造 |
|
|
15
|
+
| 参考 | 竞品/外部信息 | research 模式走 WebSearch + 多 agent 调研 |
|
|
16
|
+
|
|
17
|
+
**第一性原理**:看未来,不编造。结论必须锚定现状(context_pack)。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Output(吐什么)
|
|
22
|
+
|
|
23
|
+
### 探索产物
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
路径:data/docs/drafts/
|
|
27
|
+
内含(按模式产出):
|
|
28
|
+
insight-plan-{topic}-{date}.md ← plan 模式:OST/Gap 分析 + MVP + Roadmap
|
|
29
|
+
research-agent-{N}-{视角}.md ← research 模式:多视角调研中间产物
|
|
30
|
+
insight-research-{topic}-{date}.md ← research 模式:汇总报告
|
|
31
|
+
clarify-prototype-*.html ← clarify 模式:帮产品理解的原型(可选)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 核心方法
|
|
35
|
+
|
|
36
|
+
- **OST**(Objective-Strategy-Tactic):目标→策略→战术拆解
|
|
37
|
+
- **JTBD**(Jobs-to-be-done):用户要完成的"任务"
|
|
38
|
+
- **Gap 分析**:现状 vs 目标的差距 → 机会
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 校验(合格标准)
|
|
43
|
+
|
|
44
|
+
- [ ] 结论锚定现状(引用了 context_pack / 真实代码),非空中楼阁
|
|
45
|
+
- [ ] 全中文输出(语言锁)
|
|
46
|
+
- [ ] 有明确"转 PRD"或"放弃"的建议,不悬空
|
|
47
|
+
- [ ] research 模式:调研有来源,不是泛泛而谈
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 不做(边界)
|
|
52
|
+
|
|
53
|
+
- 不写实现级 PRD(那是 prd 模块的活)
|
|
54
|
+
- 不直接改代码(那是 code 模块的活)
|
|
55
|
+
- discover/research 是辅助决策,**最终是否落地由人决定**
|